索引和的性能优化

时间:2018-05-02 23:01:44

标签: c clang

给定一个浮点数组,以及另一个将值转换为应该求和的数组的排序数组 - 有没有什么方法可以做得比这更好?自动向量化代码?任何适用的内在函数?

#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 :(得分:0)

解开循环。我认为像

这样的东西
#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足够大,

应该提供改进。我想过使用Duff's device但是并不想通过指针来做一切可能的性能损失。不过,可能是一个有趣的性能比较。

祝你好运。