【问题标题】:ARM NEON vectorization failureARM NEON 矢量化失败
【发布时间】:2013-03-05 13:50:30
【问题描述】:

我想在我的 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 行或实现中的某些内容?

提前感谢您的帮助。

吉克斯

【问题讨论】:

    标签: compiler-construction arm vectorization neon


    【解决方案1】:

    来自GCC's ARM options page

    -mfpu=名称

    ...

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

    如果您指定-funsafe-math-optimizations,它应该可以工作,但如果您要以高精度使用它,请重新阅读上面的注释。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      相关资源
      最近更新 更多