矢量化平方残差与gcc/clang之和无内在函数

pao*_*osi 1 c performance sse avx

我试图说服gcc(4.8.1)或clang(3.4)在常春藤网桥处理器上矢量化以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

并编译它没有成功

$ gcc -std=c99 -O3 -march=native -mtune=native -ffast-math -S foo.c
Run Code Online (Sandbox Code Playgroud)

有没有办法修改代码而不使用instrinsics或修改gcc调用以获得矢量化代码?

Ker*_* SB 8

pow函数非常通用,它可能对编译器不可见(它记住它可以计算类似的东西pow(1.8, -3.19).所以它可能有助于仅使用内置操作,而不是进行函数调用:

for(size_t i = 0; i < n; i++)
{
    float const x = v[i] - mean;
    ret += x * x;
}
Run Code Online (Sandbox Code Playgroud)