迎来 64 位:
iPhone 5s 发布前,我听说苹果自主设计的 A7 SoC 将迎来 64 位。最初我不全信这一传闻,毕竟从一个稳定的架构转移到 64 位不是那么容易,不值得冒险。显然,我的观点是错误的。
在 PC 领域,多数用户已经对过渡到 64 位不再陌生,因为早在 2003 年 AMD 就宣告个人电脑正式进入 64 位时代。当时过渡的最大动机是增强内存寻址能力,从 32 位的 4GB 到 64 位的 16 EB。但是没必要支持最大的 16EB 内存,所以 AMD 的 x86-64 进用了 48 位于特定的内存地址(256TB)。从 x86 过渡到 x86-64 也带来小幅的性能提升。
对于 ARM 来说,过渡到 64 位的动机也是一样的:更大的内存。记得 ARM 和他们的合作伙伴曾希望能吞掉一部分英特尔高利润的服务器业务,这就非常需要 64 位的支持。ARM 已推出它的两个 64 位架构:Cortex A57 和 Cortex A53,ARMv8 ISA 自然就成了 32 位 ARMv7 新的一代。
跟 AMD 的 x86-64 不同,ARM 是带着一个新的 ISA 过渡到 64 位,而不是直接扩展旧的指令集。新的指令集叫做 A64,向下兼容 32位格式的指令集叫做 A32。单独一块微处理器就能同时支持这两种指令集,正如 ARMv8 那样拥有两种执行状态:AArch32 和 AArch64。当异常产生时,这两种执行状态能够切换/中端。换句话说,虽然 A64 是一个新的指令集,但你仍可以运行旧代码,当然,还需要一个支持 A64 的操作系统。在 A32 操作系统上无法运行 A64。也有可能仅设计一个 A64/AArch 64 的架构,某些服务器厂商或许会考虑使用,因为对他们来说向下兼容没多大意义。
Cyclone 完全可以执行 ARMv8 的 AArch32 和 AArch64 状态。考虑到苹果肯定会向下兼容现有的 iOS 应用,采用 ARMv8 的架构是非常合理的选择。
苹果过渡到 64 位并不是想扩大内存地址空间。以下是各代 iPhone 内存大小的发展趋势图,从图中我们可以看出,苹果并不着急扩大内存。
苹果总是隔代才增加内存。从 iPhone 4s 到 iPhone 5,苹果已经增加过内存了,所以 iPhone 5s 的内存跟 iPhone 5 一样,是 1GB 的 LPDDR3。现在可以预测 iPhone 6(或者 iPad 5)的内存可能会增加到 2GB。从内存寻址能力的角度来看,苹果最快也要到 2015 年才需要 64 位,但现在苹果把硬件的需求足足提前了两年。
其实仔细想想,现在也是开始过渡到 64 位的时候了。最新的 Xcode 测试版和 LLVM 编译器都已经向 ARMv8 兼容。从 iOS 7 正式发布之后开始,所有的应用程序都是 64 位。到 2015/2016 年,苹果开始碰到 32 位寻址能力的烦恼,不仅仅是操作系统的过渡,还有大量的应用程序都已经为 64 位开发。所以说苹果这次不像是提前,他们一向能把握好时机。ARM 阵营的其他厂商明天才会用上 ARMv8。
现在苹果的心思并不在扩大内存地址空间上。既然 A64 是一个全新的指令集,它还带来许多其他的好处。类似于 x86-64 的过渡,向 A64 的过渡也带来通用寄存器数量的增加。ARMv7 有 15 个通用寄存器,ARMv8/A64 有 31 个,而且每个都是 64 位的。所有 31 个寄存器都能同时访问。增加寄存器数量可以减少寄存器的压力,也直接影响着性能。
ARMv8 还加倍增加了 FP/NEON 寄存器(从 16 个增加到 32 个),还增加了寄存器的位宽,从 64 位增加到 128 位。支持 128 位寄存器能长远改善 SIMD 性能。然而,单词加倍寄存器数量只能小幅提升性能,加倍增加每个寄存器的大小才能很大程度改善性能。
ARMv8 还添加了新的加密指令,用于 AES 硬件计算和 SHA1/SHA256 算法。这些硬件 AES/SHA 指令具有大幅度提升性能的潜力,就像我们几年前在英特尔 CPU 看到的 AES-NI。新的高级 SIMD 指令和 AES/SHA 指令真正是设计来带动新一波的 iOS 应用程序。
许多 A64 指令模式也可以兼容 32位运算,而 A32 执行状态也添加了新的指令,所以为 ARMv8 编写的 AArch32 应用可能无法向下兼容。不过所有 ARMv7 和 32 位 Thumb 代码可以在 ARMv8 正常运行。
软件方面,iOS 7 以及所有原生应用都已开发兼容 AArch64。事实上,iPhone 5s 启动时都没有用到 AArch32。Safari、Mail,所有原生应用都已经是 64 位。
同时运行 A32 和 A64 应用的体验是流畅的,在实际使用中,你很难分辨出是同时运行了两种执行状态,还是只在 64 位运行。
我在运行当前的 32 位 ARMv7 应用程序时没有遇到向下兼容的问题。从一位终端用户的角度来看,过渡到 64 位一点困扰都没有。
64位性能提升:
新的 ARMv8 A64 指令和更大的寄存器空间能给性能带来多大影响?首先我们看看整数运算性能:
AES 和 SHA1 的提升是 ARMv8 新加密指令的直接结果。尤其是 AES 测试结果显示几乎达到一个数量级的性能改善。这种结果就跟我们在 PC 领域看到的英特尔 AES-NI 带来的提升一样。Dijkstra 的结果是唯一的后退。其他几项测试结果有小幅的提升。 总的来说,A7 在性能上已经很不错了。
如果整数运算测试结果看起来不错,那么浮点运算测试的结果就更好了:
因为有了 DP SIMD,ARMv8 的 DGEMM 运算速度有了非常大的提升。同时,增加了的寄存器空间也使 SFFT 获得不小的提升。结论是?要运行 64 位绝对需要更大的内存。
A7 和 OS X:
在测试 A7 性能之前,我曾猜测苹果率先迎来 64 位的移动芯片,唯一目的是为未来部署到更大的机器做准备。如果是在几年前,苹果与英特尔的合作关系会让我对自己的猜测深信不疑。不过现在我就没那么肯定了。
老实说,苹果继续自主投资和开发 SoC 的原因是没人能胜任这份工作。直到最近才出现能跟苹果竞争的 GPU,而 A7 在 CPU 方面都已经相当于英特尔的 Bay Trail。不过在 Mac 方面,A7 跟 英特尔的 Haswell 还是有很大差距的。我不认为苹果能在短期内拉近移动芯片跟桌面芯片的距离,但是我们不怀疑未来苹果有这样的能力。