【问题标题】:Eigen not vectorizing matrix multiplication in iOS?特征不在iOS中向量化矩阵乘法?
【发布时间】:2013-06-10 13:22:29
【问题描述】:

我正在使用 Eigen 库 在 iPad 2 上进行一些计算。(即 cortex-a9)。似乎有些操作是使用 NEON 指令矢量化的,而有些则不是。

我尝试过的向量化操作:点积、向量和矩阵的加法和减法。

未矢量化的运算:矩阵乘法。

我在同一个项目和同一个文件中使用这些操作,所以编译器选项是相同的。我正在使用-O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp

我使用的所有矩阵都有动态大小。有什么我做错了,还是这是预期的行为?

谢谢。

【问题讨论】:

  • 您得出的结论是,一些操作是矢量化的,而另一些不是?检查代码? GCC 和 Clang 都为 Cortex A 系列部件上配备 NEON 的 FP 单元的浮点运算发出霓虹灯指令。另外,你确定你真的想要 -mfloat-abi-softfp 用于 iOS 吗?这在 Linux 领域很常见,人们喜欢构建与许多不同 ARM 架构版本兼容的软件——但运行时会受到严重的惩罚。 Apple 选择了胖二进制文件。
  • 我正在使用 Xcode Instruments 来检查汇编代码。对于点积,我看到一堆vaddvmov,但不是矩阵乘法。此外,点积比 OpenCV 函数有很大的改进(大约 50%),但矩阵乘法没有。

标签: ios eigen neon


【解决方案1】:

当您使用-mfpu=neongcc/clang 时,gcc/clang 将向量化整数运算,但不会向量化浮点数,因为 NEON 不是 100% 符合 IEEE 标准的(它不支持非正规数)。您必须指定 -ffast-math 以使 gcc/clang 使用 NEON 对浮点代码进行矢量化。但是,您必须小心,因为-ffast-math 会影响数值结果。

【讨论】:

  • 不,实际上,当 NEON 正确启用时,Eigen 会显式地对其操作进行矢量化,而不管 -ffast-math 是否存在。我想问题在于应该删除的选项 -mfloat-abi-softfp。
  • -mfloat-abi=softfp 表示“使用通用寄存器进行参数传递,但使用硬件指令进行 FP 计算”。这应该不是问题,Android 程序总是使用通用寄存器进行参数传递。
  • -mfloat-abi=softfp 是一个令人讨厌的折衷方案,已在包括 Android 在内的 ARM Linux 系统上采用。毫无疑问,在某些情况下,此选项会对性能造成很大影响,尤其是考虑到在 NEON 和整数单元之间移动数据时存在巨大的流水线停顿 - 当参数在整数寄存器中传递时,这必须在函数序言和尾声中发生这是它的原因之一继续使用的是 SoC 供应商提供的 IP 的“黑盒”——想想 OpenGL 和用于访问相机硬件的用户空间库——它们是根据这个 ABI 约定构建的。
  • 顺便说一句,Apple 提供的 clangs 在没有 -ffast-math 的情况下进行优化时似乎很高兴矢量化 - 并且搜索文档也没有显示有关此选项的任何内容。我似乎记得 Xcode 附带的古老版本的 GCC 也是这种情况,但将在下一个版本中弃用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2023-01-11
  • 1970-01-01
相关资源
最近更新 更多