Tengo el siguiente programa en C (una simplificación de mi caso de uso real que presenta el mismo comportamiento)¿Por qué GCC no auto-vectorizará este ciclo?
#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;
}
}
}
Cuando compilo con
-O3 -g -Wall -ftree-vectorizer-verbose=5 -msse -msse2 -msse3 -march=native -mtune=native --std=c99 -fPIC -ffast-math
que obtener la salida
main.c:10: note: not vectorized: unhandled data-ref
donde 10 es la línea del ciclo for interno. Cuando miré por qué podría decir esto, parecía estar diciendo que los punteros podrían tener un alias, pero no pueden estar en mi código, ya que tengo la palabra clave __restrict. También sugirieron incluir las banderas -msse, pero tampoco parecen hacer nada. ¿Alguna ayuda?
¿Qué versión gcc? Un ejemplo de trabajo podría ser útil también, como una versión pirateada vectorizada cuando lo intenté con 4.4.5 – ergosys
¿podría publicar código de ejemplo que se compile? cuando completé algunos valores ficticios, el lazo fue vectorizado ... – Christoph
@ergosys: lo que dijo;) – Christoph