Ho il seguente programma C (una semplificazione del mio caso dell'uso effettivo che presenta lo stesso comportamento)Perché GCC non auto-vectorize questo loop?
#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;
}
}
}
Quando compilo con
-O3 -g -Wall -ftree-vectorizer-verbose=5 -msse -msse2 -msse3 -march=native -mtune=native --std=c99 -fPIC -ffast-math
ottenere l'output
main.c:10: note: not vectorized: unhandled data-ref
dove 10 è la linea dell'anello interno per. Quando ho cercato il motivo per cui poteva dirlo, sembrava che stessero dicendo che i puntatori potevano essere alias, ma non possono essere nel mio codice, dato che ho la parola chiave __restrict. Hanno anche suggerito di includere i flag -msse, ma non sembrano fare nulla. Qualsiasi aiuto?
Quale versione gcc? Potrebbe essere utile anche un esempio funzionante, dato che una versione compromessa è stata vettorizzata quando l'ho provata con 4.4.5 – ergosys
potresti pubblicare il codice di esempio che compila? quando ho inserito alcuni valori fittizi, il ciclo è stato vettorizzato ... – Christoph
@ergosys: cosa ha detto;) – Christoph