ARM NEON矢量化失败

时间:2013-03-05 13:50:31

标签: compiler-construction arm vectorization neon

我想在我的ARM cortex-a9上启用NEON矢量化,但我在编译时得到了这个输出:

“未向量化:不支持相关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行或我的实现中的某些内容?

提前感谢您的帮助。

Guix

1 个答案:

答案 0 :(得分:8)

来自GCC's ARM options page

  
    

-mfpu =名称

         

...

         

如果选定的浮点硬件包含NEON扩展(例如-mfpu =`neon'),请注意GCC的自动向量化传递不会生成浮点运算,除非-funsafe-math-optimizations为也指定。这是因为NEON硬件没有完全实现用于浮点运算的IEEE 754标准(特别是非正规值被视为零),因此使用NEON指令可能会导致精度损失。

  

如果您指定-funsafe-math-optimizations它应该有效,但如果要高精度地使用它,请重读上面的注释。