我有以下的C程序(我的實際使用情況的簡化表現出相同的行爲)GCC爲什麼不自動矢量化這個循環?
#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是內循環的行。當我查詢它爲什麼會這樣說時,它似乎是說指針可能是別名,但它們不能在我的代碼中,因爲我有__restrict關鍵字。他們還建議包括-msse標誌,但他們似乎也沒有做任何事情。任何幫助?
什麼版本的gcc?一個可行的例子也可能是有用的,因爲當我嘗試使用4.4.5 – ergosys 2011-02-16 23:15:16
進行向量化時,你可以發佈編譯的代碼示例嗎?當我填充了一些虛擬值時,循環被矢量化了...... – Christoph 2011-02-16 23:15:39
@ergosys:他說的;) – Christoph 2011-02-16 23:16:00