我试图说服 gcc (4.8.1) 或 clang (3.4) 对以下内容进行矢量化 ivy 桥处理器上的代码:
#include "stdlib.h"
#include "math.h"
float sumsqr(float *v, float mean, size_t n) {
float ret = 0;
for(size_t i = 0; i < n; i++) {
ret += pow((v[i] - mean), 2);
}
return ret;
}
编译失败
$ gcc -std=c99 -O3 -march=native -mtune=native -ffast-math -S foo.c
有没有办法在不使用内部函数或修改 gcc 调用的情况下修改代码以获得矢量化代码?
最佳答案
pow
函数非常通用,编译器可能看不到它的作用(记住它可以计算类似 pow(1.8, -3.19)
的东西. 因此,仅使用内置操作而不进行函数调用可能会有所帮助:
for(size_t i = 0; i < n; i++)
{
float const x = v[i] - mean;
ret += x * x;
}
关于c - 使用没有内在函数的 gcc/clang 向量化残差平方和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22037044/