ARM64是否具有性能优势

Jan*_*dec 7 performance 64-bit arm arm64

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

那么ARM64除了实际上需要构建这样的64bit应用程序的更大地址之外还有其他任何优势吗?

注意:我已经看到了64位性能优势,但它只提到了x86-64,除了扩展虚拟地址空间之外还有其他改进.我还记得情况确实特定于x86和其他一些像Sparc一样64位的平台,通常的做法是只编译内核和实际使用大量内存作为64位的应用程序,其他一切都是32位.


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

uni*_*urf 11

我不确定是否可以给出一般性回应,但我可以提供一些差异的例子.当然,在ARM体系结构的第8版中添加了其他差异,无论目标指令集如何都适用.

AArch64中的性能积极增加

  • 32个通用寄存器为编译器提供了更多的摆动空间.
  • 可从用户模式访问的I/D缓存同步机制(无需系统调用).
  • 加载/存储对指令使得可以用一条指令加载128位数据,并且仍然像RISC一样.
  • 删除近乎通用的条件执行会使更多的无序排序成为可能.
  • (D0还是Q0的下半部,而D1是Q1的现在下半部而非Q0的上半部分)中的NEON寄存器布局的改变使得有可能更外的排序.
  • 64位指针使指针标记成为可能.
  • CSEL支持各种疯狂的优化.

AArch64中的性能负面变化

  • 更多寄存器也可能意味着堆栈上的压力更高.
  • 较大的指针意味着更大的内存占用.
  • 删除近乎通用的条件执行可能会对分支预测器造成更高的压力.
  • 删除加载/存储多个意味着函数进入/退出所需的更多指令.

ARMv8-A中与性能相关的更改

  • Load-Aquire/Store-Release语义消除了对基本同步操作的显式内存屏障的需要.

我可能忘了很多东西,但这些是一些更明显的变化.

  • @BitBank:热情是因为与通用条件不同,CSEL在没有搞乱无序的情况下做到了这一点. (3认同)
  • @Nikolai:因为D寄存器之间的排序要求不再需要单独考虑Q寄存器之间的排序要求.在AArch32中,如果Dx和Dx + 1上的两个不相关的操作可以按程序顺序强制执行,如果它们共享相同的底层Q寄存器. (2认同)
  • 指针标记也可以在 32 位中使用,但要标记的位比 64 位少 (2认同)