Tôi đã chương trình C sau (đơn giản hóa các trường hợp sử dụng thực tế của tôi trưng bày các hành vi tương tự)Tại sao GCC không tự động vector hóa vòng lặp này?
#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;
}
}
}
Khi tôi biên dịch với
-O3 -g -Wall -ftree-vectorizer-verbose=5 -msse -msse2 -msse3 -march=native -mtune=native --std=c99 -fPIC -ffast-math
tôi nhận được đầu ra
main.c:10: note: not vectorized: unhandled data-ref
trong đó 10 là đường bên trong của vòng lặp. Khi tôi nhìn lên lý do tại sao nó có thể nói điều này, nó dường như nói rằng các con trỏ có thể được đặt bí danh, nhưng chúng không thể có trong mã của tôi, vì tôi có từ khóa __restrict. Họ cũng đề xuất bao gồm các cờ -msse, nhưng họ dường như không làm bất cứ điều gì cả. Bất kỳ giúp đỡ?
Phiên bản gcc nào? Một ví dụ làm việc có thể hữu ích là tốt, như là một phiên bản hacked lên vectorized khi tôi đã thử nó với 4.4.5 – ergosys
bạn có thể gửi mã ví dụ biên dịch? khi tôi điền vào một số giá trị giả, vòng lặp đã được vector hóa ... – Christoph
@ergosys: những gì anh ấy nói;) – Christoph