ARM64有性能优势吗

Posted

技术标签:

【中文标题】ARM64有性能优势吗【英文标题】:Is there performance advantage to ARM64 【发布时间】:2015-01-06 13:52:45 【问题描述】:

最近 64 位 ARM 手机开始出现。但是构建 64 位应用程序有什么实际优势吗?特别考虑对增加的虚拟地址空间没有太多用途的应用程序¹,但由于指针大小的增加会浪费一些空间。

那么除了更大的地址之外,ARM64 还有其他优势吗?实际上可以保证构建这样的 64 位应用程序?

注意:我见过64-bit Performance Advantages,但它只提到了x86-64,它除了扩展的虚拟地址空间之外还有其他改进。我还记得这种情况确实是特定于 x86 的,在其他一些像 Sparc 这样的 64 位平台上,通常的方法是只编译内核和实际使用大量内存的应用程序作为 64 位,而其他一切都作为 32 -位。


¹该应用程序是多平台的,它仍然需要在内存低至 48MiB 的设备上构建和运行。确实有一些从外部存储读取的大数据,但它一次不需要超过几兆字节。

【问题讨论】:

有一些真实的 AArch64 与 AArch32 的性能数据here。 与 x86-64 一样,AArch64 也有其他改进,例如寄存器数量翻倍,因此与 x86-32-versus-64 的比较似乎是合理的。 【参考方案1】:

我不确定能否给出一般性答复,但我可以提供一些差异示例。当然,第 8 版 ARM 架构中添加了其他差异,无论目标指令集如何。

AArch64 中的积极性能补充

32 个通用寄存器为编译器提供了更多的回旋余地。 可从用户模式访问的 I/D 缓存同步机制(无需系统调用)。 Lo​​ad/Store-Pair 指令可以通过一条指令加载 128 位数据,并且仍保持类似 RISC 的特性。 移除近乎通用的条件执行使得更多的无序执行成为可能。 NEON 寄存器布局的变化(D0 仍然是 Q0 的下半部分,但 D1 现在是 Q1 的下半部分而不是 Q0 的上半部分)使得更多的乱序成为可能。 64 位指针使指针标记成为可能。 CSEL 支持各种疯狂的优化。

AArch64 中对性能不利的变化

更多的寄存器可能也意味着更高的堆栈压力。 更大的指针意味着更大的内存占用。 移除近乎通用的条件执行可能会对分支预测器造成更高的压力。 移除 load/store-multiple 意味着函数进入/退出需要更多指令。

ARMv8-A 中与性能相关的变化

Lo​​ad-Aquire/Store-Release 语义消除了基本同步操作对显式内存屏障的需求。

我可能忘记了很多东西,但这些都是比较明显的变化。

【讨论】:

为什么 NEON 布局的变化会使更多的乱序成为可能? @Nikolai:因为 D 寄存器之间的订购要求不再需要与 Q 寄存器之间的订购要求分开考虑。在 AArch32 中,如果 Dx 和 Dx+1 上的两个不相关操作共享相同的底层 Q 寄存器,则它们可能会强制按程序顺序发生。 不确定我是否理解您对 CSEL 指导的热情。这只是旧条件指令可以做的一小部分。真的感觉像是 ARM 的最小努力,至少给了我们一个避免一些分支的小方法。 @BitBank:热情是因为与通用条件不同,CSEL 做到这一点时不会弄乱无序。 指针标记也可以在 32 位中进行,尽管要标记的位数比 64 位要少

以上是关于ARM64有性能优势吗的主要内容,如果未能解决你的问题,请参考以下文章

x86的库和arm的.o文件能链接吗

在 x86-64 上,32 位应用程序是不是比 64 位应用程序有性能优势?

java 8顺序流有直接或间接的性能优势吗?

使用 Context API 与 Redux 有性能优势吗?

有可能吗?如果有,结合 Minimal API 和经典控制器是不是有性能优势?

较短的代码是不是有明显的性能优势?