ARM64有性能优势吗?

11
最近出现了64位ARM手机。但是构建64位应用程序是否有实际优势呢?特别是考虑到那些对增加的虚拟地址空间¹没有太多用处,但会浪费一些空间的应用程序。
那么ARM64除了更大的地址外,是否有其他优势可以证明构建这样的应用程序是64位的?
注意:我看到过64位性能优势,但它只提到了x86-64,它确实除了扩展虚拟地址空间外还有其他改进。我还记得情况确实是针对x86具体的,在其他一些像Sparc这样的平台上,通常的方法是只将内核和实际使用大量内存的应用程序编译为64位,其他所有东西都是32位。

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


2
这里有一些真实的AArch64 vs. AArch32性能数据。 - Notlikethat
1
与x86-64一样,AArch64也带来了其他改进,如加倍寄存器数量,因此将其与x86-32对64的比较似乎是合理的。 - sh1
1个回答

20

我不确定能够给出一个通用的答案,但是我可以提供一些差异的例子。当然,在ARM架构的版本8中添加了一些附加的差异,这些差异适用于目标指令集。

AArch64中的性能正向增加

  • 32个通用寄存器让编译器有更多的灵活性。
  • I/D高速缓存同步机制可以从用户模式下访问(无需系统调用)。
  • Load/Store-Pair指令使得可以使用一条指令加载128位的数据,并且仍然保持RISC特性。
  • 取消几乎普遍的条件执行,使得更多的乱序执行成为可能。
  • NEON寄存器布局的变化(D0仍然是Q0的低半部分,但D1现在是Q1的低半部分而不是Q0的上半部分)使得更多的乱序执行成为可能。
  • 64位指针可以进行指针标记。
  • CSEL可以实现各种疯狂的优化。

AArch64中的性能负向变化

  • 更多的寄存器可能也意味着对堆栈的压力更大。
  • 更大的指针意味着更大的内存占用。
  • 取消了几乎普遍的条件执行可能会增加分支预测器的压力。
  • 取消了load/store-multiple,函数进入/退出需要更多的指令。

ARMv8-A中的性能相关变化

  • Load-Aquire / Store-Release语义消除了基本同步操作的显式内存障碍。

我可能忘记了很多事情,但这些是一些比较明显的变化。


为什么NEON布局的改变会使得更多的乱序执行成为可能? - Nikolai
2
@Nikolai:因为D寄存器之间的排序要求不再需要与Q寄存器之间的排序要求分开考虑。在AArch32中,如果两个对Dx和Dx+1的无关操作共享相同的基础Q寄存器,则可以强制按程序顺序执行它们。 - unixsmurf
我不确定我理解你对CSEL指令的热情。它只能完成老的条件指令的一小部分功能。这似乎是ARM为了给我们提供避免一些分支的小方法而做出的最小努力。 - BitBank
3
@BitBank:热情是因为与通用条件语句不同,CSEL可以在不混乱乱序的情况下完成任务。 - unixsmurf
2
指针标记在32位系统中也是可能的,尽管比64位系统中标记的位数少。 - phuclv
在ARMv8的实践中,一个很大的优势是硬件支持AES、CRC和SHA,几乎总是存在的(尽管在RPi4上由于许可价格问题):它将有助于客户端和服务器端的TLS通信。加密很可能是大多数实际用例中的瓶颈。 - Arnaud Bouchez

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