ARM NEON矢量失败(ARM NEON vectorization failure)

2019-08-17 07:54发布

我想在我的ARM Cortex-A9使NEON矢量化,但我得到这个编译输出:

“不是矢量:不支持相关的语句: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行或在我的实现的东西吗?

在此先感谢您的帮助。

石膏板

Answer 1:

从GCC的ARM选项页

-mfpu =名称

...

如果所选择的浮点硬件包括NEON扩展(例如-mfpu =`氖'),请注意, 浮点操作不受GCC的自动矢量生成通除非还指定-funsafe-数学优化。 这是因为硬件NEON没有完全实现浮点算术IEEE 754标准 (特别是反规范值被视为零),所以使用的NEON指令可以导致精度的损失。

如果指定-funsafe-math-optimizations它应该工作,但重读以上,如果你要以高精度使用的注意事项。



文章来源: ARM NEON vectorization failure