【发布时间】:2011-06-28 17:32:46
【问题描述】:
我有以下 C 程序(我的实际用例的简化,它表现出相同的行为)
#include <stdlib.h>
#include <math.h>
int main(int argc, char ** argv) {
const float * __restrict__ const input = malloc(20000*sizeof(float));
float * __restrict__ const output = malloc(20000*sizeof(float));
unsigned int pos=0;
while(1) {
unsigned int rest=100;
for(unsigned int i=pos;i<pos+rest; i++) {
output[i] = input[i] * 0.1;
}
pos+=rest;
if(pos>10000) {
break;
}
}
}
当我用
编译时 -O3 -g -Wall -ftree-vectorizer-verbose=5 -msse -msse2 -msse3 -march=native -mtune=native --std=c99 -fPIC -ffast-math
我得到了输出
main.c:10: note: not vectorized: unhandled data-ref
其中 10 是内部 for 循环的行。当我查找它为什么会这样说时,它似乎是在说指针可以别名,但它们不能在我的代码中,因为我有 __restrict 关键字。他们还建议包括 -msse 标志,但他们似乎也没有做任何事情。有什么帮助吗?
【问题讨论】:
-
什么版本的gcc?一个工作示例也可能很有用,当我用 4.4.5 尝试它时,它是一个矢量化的破解版本
-
你能发布编译的示例代码吗?当我填写一些虚拟值时,循环被矢量化了......
-
我已将示例更新为可编译。它仍然不会矢量化。我正在使用“gcc(Debian 4.4.5-10)4.4.5”
标签: c gcc vectorization