数学’pow’函数gcc的SSE向量化

我试图对包含数学库中’pow’函数用法的循环进行矢量化处理.我知道intel编译器支持将’pow’用于sse指令-但我似乎无法使其与gcc一起运行(我认为).我正在处理的情况是:

int main(){
        int i=0;
        float a[256],
        b[256];

        float x= 2.3;


        for  (i =0 ; i<256; i++){
                a[i]=1.5;
        }

        for (i=0; i<256; i++){
                b[i]=pow(a[i],x);
        }

        for (i=0; i<256; i++){
                b[i]=a[i]*a[i];
        }
    return 0;

}

我正在编译以下内容:

gcc -O3 -Wall -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5 code.c -o runthis

这是在OS X 10.5.8上使用gcc版本4.2(我也使用了4.5,并且无法确定它是否已向量化-因为它根本不输出任何东西).似乎没有一个循环矢量化-是否存在我需要使用限制的分配问题或其他问题?如果我将其中一个循环编写为函数,则会得到更详细的输出(代码):

void pow2(float *a, float * b, int n) {
        int i;
        for (i=0; i<n; i++){
                b[i]=a[i]*a[i];
        }
}

输出(使用7级详细输出):

note: not vectorized: can't determine dependence between *D.2878_13 and *D.2877_8
bad data dependence.

我看了gcc auto-vectorization页,但这并没有太大帮助.如果无法在gcc版本中使用pow,我在哪里可以找到做pow等效功能的资源(我主要处理整数幂).

编辑,所以我只是在研究其他来源-它是如何矢量化的?!:

void array_op(double * d,int len,double value,void (*f)(double*,double*) ) { 
    for ( int i = 0; i < len; i++ ){
        f(&d[i],&value);
    }
};

相关的gcc输出:

note: Profitability threshold is 3 loop iterations.

note: LOOP VECTORIZED.

好吧,现在我不知所措-‘d’和’value’被gcc不知道的函数修改了-奇怪吗?也许我需要对此部分进行更彻底的测试,以确保结果对矢量化部分而言是正确的.仍在寻找向量化的数学库-为什么没有开放源代码的数学库?

最佳答案
在写入输出之前使用__restrict或使用输入(分配给本地var)应该会有所帮助.

现在,编译器无法向量化,因为a可能是别名b,因此并行执行4个乘法并写回4个值可能不正确.

(请注意,__restrict不能保证编译器可以向量化,但是现在可以说太多了,它肯定不能).

转载注明原文:数学’pow’函数gcc的SSE向量化 - 代码日志