我试图对包含数学库中“pow”函数的使用的循环进行矢量化。我知道英特尔编译器支持对 sse 指令使用“pow” - 但我似乎无法让它与 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 自动矢量化页面但这并没有多大帮助。如果无法在 gcc 版本中使用 pow,我在哪里可以找到执行 pow 等效函数的资源(我主要处理整数幂)。
Edit所以我只是深入研究其他来源 - 它是如何矢量化的?!:
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 不知道的函数修改了——奇怪吗?也许我需要更彻底地测试这部分,以确保矢量化部分的结果是正确的。仍在寻找矢量化数学库 - 为什么没有开源库?