ARM NEON 向量化失败

5

我希望在我的ARM cortex-a9上启用NEON向量化,但在编译时出现如下输出:

"not vectorized: relevant stmt not supported: 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的向量化功能... 有人有什么想法吗?我在命令行或实现中忘记了什么吗? 提前感谢您的帮助。 Guix
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
9

来自GCC的ARM选项页面

-mfpu=name

...

如果所选的浮点硬件包括NEON扩展(例如-mfpu ='neon'),请注意,仅当指定了-funsafe-math-optimizations时,GCC的自动矢量化传递才会生成浮点运算。这是因为NEON硬件并未完全实现IEEE 754浮点算术标准(特别是微小值被视为零),因此使用NEON指令可能会导致精度损失。

如果您指定了-funsafe-math-optimizations,则应该可以解决问题,但如果要高精度使用,请重新阅读上面的注意事项。


0

注意:GCC中的Neon浮点自动向量化已经运行多年,因此不需要解决此问题/方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,