mam następujący program C (uproszczenia moim konkretnym przypadku zastosowania, który wykazuje takie samo zachowanie)Dlaczego GCC nie będzie automatycznie wektoryzować tej pętli?
#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;
}
}
}
Kiedy skompilować z
-O3 -g -Wall -ftree-vectorizer-verbose=5 -msse -msse2 -msse3 -march=native -mtune=native --std=c99 -fPIC -ffast-math
I wyprowadzał
main.c:10: note: not vectorized: unhandled data-ref
gdzie 10 jest linią wewnętrznej pętli for. Kiedy spojrzałem na to, dlaczego tak się mówi, wydawało się, że można powiedzieć, że wskaźniki mogą być wygładzane, ale nie mogą być w moim kodzie, ponieważ mam słowo kluczowe __restrict. Zasugerowali także włączenie flag -msse, ale i oni nie robią nic. Jakaś pomoc?
Jaką wersję gcc? Działający przykład może być również użyteczny, ponieważ wersja zhakowana była wektoryzowana, gdy próbowałem go z 4.4.5 – ergosys
czy mógłbyś wstawić przykładowy kod, który kompilował? kiedy wypełniłem jakieś fałszywe wartości, pętla była wektoryzowana ... – Christoph
@ergosys: co on powiedział;) – Christoph