我想在 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 的矢量化尚不可用......
有人有想法吗?我是否忘记了命令行或实现中的某些内容?
预先感谢您的帮助。
吉克斯
-mfpu=名称
...
如果所选浮点硬件包含 NEON 扩展(例如 -mfpu=`neon'),请注意 除非还指定了 -funsafe-math-optimizations,否则 GCC 的自动矢量化过程不会生成浮点运算。这是因为 NEON 硬件没有完全实现浮点运算的 IEEE 754 标准(特别是非正规值被视为零),因此使用 NEON 指令可能会导致精度损失。
如果您指定
-funsafe-math-optimizations
它应该可以工作,但如果您要高精度地使用它,请重新阅读上面的注释。
注意:GCC 中的 Neon 浮点自动矢量化已经工作了很多年,因此不需要这个问题/解决方案。