给定一个浮点数组,以及另一个将值转换为应该求和的数组的排序数组 - 有没有什么方法可以做得比这更好?自动向量化代码?任何适用的内在函数?
#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
进行编译:
答案 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但是并不想通过指针来做一切可能的性能损失。不过,可能是一个有趣的性能比较。
祝你好运。