Оптимизация производительности для индексированной суммы - PullRequest
0 голосов
/ 03 мая 2018

Учитывая массив чисел с плавающей запятой и другой отсортированный массив, который индексирует значения в этот массив, которые должны быть суммированы - есть ли какие-нибудь способы сделать что-то лучше, чем этот и авто-векторизованный код? Любые применимые свойства?

#include "stdint.h"

void IndexedSum(float buf[], uint32_t index[], int len, float *res) {
    float acc = 0;
    for(int i = 0; i < len; i++) {
       acc += buf[index[i]];
    }
    *res = acc;
}

В настоящее время компилируется с clang 6.0 с -O3, -ffast-math и -mllvm -force-vector-width=8:

https://godbolt.org/g/AVhA4L

1 Ответ

0 голосов
/ 03 мая 2018

Размотайте петлю. Я думаю, что-то вроде

#include "stdint.h"

void IndexedSum(float buf[], uint32_t index[], int len, float *res)
  {
  float acc = 0;
  int   i;

  for(i = 0 ; i < len-8 ; i += 8)
    acc += (buf[index[i+0]] + 
            buf[index[i+1]]
            buf[index[i+2]]
            buf[index[i+3]]
            buf[index[i+4]]
            buf[index[i+5]]
            buf[index[i+6]]
            buf[index[i+7]])

  while(i < len)
    acc += buf[index[i++]];

  *res = acc;
  }

должно обеспечить улучшение, если len достаточно велико. Я думал об использовании устройства Даффа , но не хотел вводить потенциальное снижение производительности за выполнение всех действий с помощью указателей. Впрочем, сравнение производительности может быть интересным.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...