【发布时间】:2011-10-18 14:08:47
【问题描述】:
我试图对包含数学库中“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 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 不知道的函数修改了——奇怪吗?也许我需要更彻底地测试这部分,以确保矢量化部分的结果是正确的。仍在寻找矢量化数学库 - 为什么没有任何开源的?
【问题讨论】:
-
将
main优化为return 0是正常的:main之外的任何东西都无法观察到结果,因此完全优化循环不会改变程序行为的任何内容。数组是具有自动存储功能的局部变量,因此不会产生副作用,例如调用 malloc/free 以供编译器保留。
标签: c optimization loops sse vectorization