Почему GCC не выполняет автоматическую векторизацию этого цикла?

У меня есть следующая программа на C (упрощение моего фактического варианта использования, которое демонстрирует такое же поведение)

#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 - это строка внутреннего цикла for. Когда я посмотрел, почему он может сказать это, мне показалось, что указатели могут иметь псевдонимы, но они не могут быть в моем коде, поскольку у меня есть ключевое слово __restrict. Они также предложили включить флаги -msse, но они, похоже, тоже ничего не делают. Есть помощь?

5
задан Jeremy Salwen 17 February 2011 в 00:44
поделиться