я следующую программу 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
, мог бы опубликовать пример кода, который компилируется? когда я заполнил некоторые фиктивные значения, цикл был векторизован ... – Christoph
@ergosys: что он сказал;) – Christoph