Ошибка векторизации ARM NEON

Я хотел бы включить векторизацию NEON на моем ARM cortex-a9, но я получаю этот вывод при компиляции:

"не векторизовано: соответствующий stmt не поддерживается: D.14140_82 = D.14143_77 * D.14141_81"

Вот мой цикл:

void my_mul(float32_t * __restrict data1, float32_t * __restrict data2, float32_t * __restrict out){    
    for(int i=0; i<SIZE*4; i+=1){
        out[i] = data1[i]*data2[i];
    }
}

И параметры, используемые при компиляции:

-march=armv7-a -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize -mvectorize-with-neon-quad -ftree-vectorizer-verbose=2

Я использую компилятор arm-linux-gnueabi (v4.6).

Важно отметить, что проблема возникает только с векторами float32. Если я включу int32, то векторизация будет выполнена. Возможно, векторизация для float32 еще недоступна…

У кого-нибудь есть идея? Я что-то забыл в строке cmd или в своей реализации?

Заранее спасибо за вашу помощь.

Гикс


person user2092113    schedule 05.03.2013    source источник


Ответы (1)


На странице параметров GCC ARM

-mfpu=имя

...

Если выбранное оборудование для операций с плавающей запятой включает расширение NEON (например, -mfpu=`neon'), обратите внимание, что операции с плавающей запятой не генерируются проходом автоматической векторизации GCC, если также не указан параметр -funsafe-math-optimizations. Это связано с тем, что оборудование NEON не полностью реализует стандарт IEEE 754 для арифметики с плавающей запятой (в частности, ненормальные значения обрабатываются как нулевые), поэтому использование инструкций NEON может привести к потере точности.

Если вы укажете -funsafe-math-optimizations, это должно сработать, но перечитайте примечание выше, если вы собираетесь использовать это с высокой точностью.

person auselen    schedule 05.03.2013