Eigen 3.3 中的 ARM NEON 改进

Posted

技术标签:

【中文标题】Eigen 3.3 中的 ARM NEON 改进【英文标题】:ARM NEON improvements in Eigen 3.3 【发布时间】:2016-12-19 13:27:52 【问题描述】:

我正在使用 Eigen C++ 库为 64 位 ARM Cortex-A53 处理器编写某些算法。

它在 Eigen 更改日志中显示 (http://eigen.tuxfamily.org/index.php?title=3.3) 3.3 版中对 ARM NEON 进行了改进,包括“正确调整向量寄存器的目标数量”。现在,有人知道这实际上是什么意思吗?是否可以告诉 Eigen 充分利用 A53 的 32 个向量寄存器?根据我的快速测试,它不会自动发生。

谢谢,劳里

【问题讨论】:

【参考方案1】:

感谢您的报告...从技术上讲,您发现了一个错误!

Eigen 应该将其对 NEON 128 位寄存器的使用调整为 arm64 模式下的使用,它使用其中的 32 个。我以为我已经做到了,但看起来我错了:-/ https://bitbucket.org/eigen/eigen/src/tip/Eigen/src/Core/arch/NEON/PacketMath.h?fileviewer=file-view-default#PacketMath.h-34

应该解决这个问题...

【讨论】:

也就是说,我现在记得这个变更日志条目指的是什么:Eigen 3.3 之前的情况更糟,因为那个常数被设置为 8 !至少现在它使用 16,这是 arm32 的正确值。 在默认分支上修复:bitbucket.org/eigen/eigen/commits/…,在 3.3 分支上修复:bitbucket.org/eigen/eigen/commits/…。请注意,仅仅因为此设置现在已修复,并不会自动知道 Eigen 将知道如何为特定操作充分利用附加寄存器。 谢谢伯努瓦。我的代码有两个关键部分。 1) 大矩阵的乘法和 2) 用 SelfAdjointEigenSolver 计算特征向量。 Eigen 版本 3.3(没有你的修复)为第 2 部分提供了很好的加速)。我继承了您的修复并添加了#define EIGEN_ARCH_ARM64 1 以进一步加快 1) 或 2),但我没有得到任何改进(与没有您的修复的 3.3 相比)。这听起来像预期的行为还是可能存在更多错误? 我认为这里发生的情况是,Eigen 没有比它用于 ARM32 的 16 个寄存器的更宽的 GEMM 内核来使用。因此它实际上不知道如何使用附加寄存器,即使它现在知道还有附加寄存器。随意在 Eigen 的 bugzilla 或邮件列表中提出这个问题。也就是说,在我自己的实验中,我发现通过使用更多寄存器来进一步加速此类 GEMM 内核的空间有限,也就是说,现有的 Eigen GEMM 已经接近通用 ARM 内核所能达到的速度。 如果您想获得更多专门针对 Cortex-A53 内核的显着加速,请考虑放弃像 Eigen 这样的通用代码。这是对各种内核的研究,包括 ARM 工程师专门为 Cortex-A53 优化的浮点内核。它在这个特定 CPU 上的性能比通用代码好得多,但请注意,它在其他 CPU 上会适得其反。 github.com/google/gemmlowp/blob/master/standalone/…

以上是关于Eigen 3.3 中的 ARM NEON 改进的主要内容,如果未能解决你的问题,请参考以下文章

ARM 中的 NEON 实现

ARM NEON 优化中的建议

如何在 iPhone 中编译 Eigen

eigen c++ 有neon优化吗

带有 NEON 的 ARM 汇编中的高级数学函数

ARM NEON 中的指令调度