关闭广告

迈克·阿什 致力于他的博客 iPhone 64S 切换到 5 位架构的实际影响。本文借鉴了他的发现。

之所以写这篇文章,主要是因为关于配备 5 位 ARM 处理器的新款 iPhone 64s 对用户和市场的实际意义存在大量错误信息。在这里,我们将尝试为开发人员带来有关此转变的性能、功能和影响的客观信息。

“64位”

“X 位”标签可以引用处理器的两个部分 - 整数寄存器的宽度和指针的宽度。幸运的是,在大多数现代处理器上,这些宽度是相同的,因此对于 A7,这意味着 64 位整数寄存器和 64 位指针。

然而,同样重要的是要指出“64 位”的含义: RAM物理地址大小。与 RAM 通信的位数(因此设备可以支持的 RAM 量)与 CPU 位数无关。 ARM 处理器具有 26 位和 40 位地址之间的任何位置,并且可以独立于系统的其余部分进行更改。

  • 数据总线大小。从 RAM 或缓冲存储器接收的数据量同样与该因素无关。各个处理器指令可能请求不同数量的数据,但它们要么以块的形式发送,要么从内存接收超出需要的数据。这取决于数据量的大小。 iPhone 5 已经以 64 位量子的形式从内存接收数据(并且具有 32 位处理器),并且我们可以遇到高达 192 位的大小。
  • 任何与浮点数有关的东西。此类寄存器 (FPU) 的大小同样独立于处理器的内部工作。 ARM 在 ARM64(64 位 ARM 处理器)之前就一直使用 64 位 FPU。

一般优点和缺点

如果我们比较相同的 32 位和 64 位架构,它们通常并没有那么不同。这也是公众普遍对苹果移动设备转向 64 位的原因感到困惑的原因之一。然而,这一切都来自于A7(ARM64)处理器的具体参数以及苹果如何使用它,而不仅仅是来自该处理器具有64位架构这一事实。

然而,如果我们仍然看看这两种架构之间的差异,我们会发现几个差异。显而易见的是,64 位整数寄存器可以更有效地处理 64 位整数。即使在此之前,也可以在 32 位处理器上使用它们,但这通常意味着将它们分成 32 位长的片段,这会导致计算速度变慢。因此,64 位处理器通常可以使用 64 位类型进行计算,与使用 32 位类型进行计算一样快。这意味着通常使用 64 位类型的应用程序可以在 64 位处理器上运行得更快。

虽然 64 位不会影响处理器可以使用的 RAM 总量,但它可以使在一个程序中使用大块 RAM 变得更容易。任何在 32 位处理器上运行的单个程序都只有大约 4 GB 的地址空间。考虑到操作系统和标准库会占用一些空间,这会为程序留下 1-3 GB 的空间供应用程序使用。但是,如果 32 位系统具有超过 4 GB 的 RAM,则使用该内存会稍微复杂一些。我们必须强制操作系统为我们的程序映射这些更大的内存块(内存虚拟化),或者我们可以将程序分成多个进程(理论上每个进程都有 4GB 的内存可用于直接寻址)。

然而,这些“黑客”非常困难且缓慢,以至于很少有应用程序使用它们。实际上,在 32 位处理器上,每个程序只会使用其 1-3 GB 内存,更多可用 RAM 可用于同时运行多个程序或使用此内存作为缓冲区(缓存)。这些用途很实用,但我们希望任何程序都能够轻松使用大于 4GB 的内存块。

现在我们来看看一个常见的(实际上是不正确的)说法:没有超过 4GB 的内存,64 位架构就没用。即使在内存较少的系统上,较大的地址空间也很有用。内存映射文件是一种方便的工具,其中文件的部分内容在逻辑上链接到进程的内存,而无需将整个文件加载到内存中。因此,系统可以逐渐处理比 RAM 容量大很多倍的大文件。在 32 位系统上,如此大的文件无法可靠地进行内存映射,而在 64 位系统上,由于地址空间更大,因此这是小菜一碟。

然而,较大的指针也带来了一个很大的缺点:否则相同的程序在 64 位处理器上需要更多的内存(这些较大的指针必须存储在某个地方)。由于指针是程序中常见的部分,这种差异会给缓存带来负担,进而导致整个系统运行速度变慢。因此,从长远来看,我们可以看到,如果我们只是将处理器架构更改为 64 位,实际上会降低整个系统的速度。所以这个因素必须通过其他地方更多的优化来平衡。

ARM64

A7 是为新款 iPhone 64s 提供支持的 5 位处理器,它不仅仅是具有更宽寄存器的常规 ARM 处理器。 ARM64 对旧的 32 位版本进行了重大改进。

苹果A7处理器。

注册表

ARM64 拥有两倍于 32 位 ARM 的整数寄存器(注意不要混淆寄存器的数量和宽度 - 我们在“64 位”部分中讨论过宽度。因此 ARM64 拥有两倍宽的寄存器和两倍的数量寄存器)。 32位ARM有16个整数寄存器:13个程序计数器(PC——包含当前指令的编号)、64个堆栈指针(指向正在进行的函数的指针)、32个链接寄存器(指向结束后返回的指针)的功能),其余 28 个供应用程序使用。然而,ARM32有64个整数寄存器,包括16个零寄存器、32个链接寄存器、128个帧指针(类似于堆栈指针)和XNUMX个为将来保留的寄存器。这使得我们有 XNUMX 个寄存器供应用程序使用,是 XNUMX 位 ARM 的两倍多。同时,ARMXNUMX 将浮点数 (FPU) 寄存器的数量从 XNUMX 个 XNUMX 位寄存器增加了一倍到 XNUMX 个。

但为什么寄存器的数量如此重要呢?内存通常比 CPU 计算速度慢,并且读/写可能需要很长时间。这将使快速处理器必须继续等待内存,并且我们将达到系统的自然速度限制。处理器试图通过缓冲区层来隐藏这一障碍,但即使是最快的缓冲区(L1)仍然比处理器的计算慢。然而,寄存器是直接位于处理器中的存储单元,它们的读/写速度足够快,不会减慢处理器的速度。寄存器的数量实际上意味着处理器计算最快的内存量,这极大地影响了整个系统的速度。

同时,这个速度需要编译器良好的优化支持,以便语言可以使用这些寄存器,而不必将所有内容存储在通用应用程序(慢速)内存中。

指令系统

ARM64还给指令集带来了重大变化。指令集是处理器可以执行的一组原子操作(例如“ADD register1 register2”将两个寄存器中的数字相加)。各个语言可用的函数都是由这些指令组成的。更复杂的函数必须执行更多指令,因此它们可能会更慢。

ARM64 中的新增功能包括 AES 加密、SHA-1 和 SHA-256 哈希函数指令。因此,只有语言才会调用该指令,而不是复杂的实现——这将为此类函数的计算带来巨大的加速,并有望增加应用程序的安全性。例如。新的 Touch ID 还在加密中使用这些指令,从而实现真正的速度和安全性(理论上,攻击者必须修改处理器本身才能访问数据 - 至少考虑到其微型尺寸,这是不切实际的)。

与32位的兼容性

值得一提的是,A7 可以完全在 32 位模式下运行,无需仿真。这意味着新款 iPhone 5s 可以运行在 32 位 ARM 上编译的应用程序,不会出现任何速度减慢的情况。但是,它无法使用新的 ARM64 功能,因此专门为 A7 进行特殊构建始终是值得的,它应该运行得更快。

运行时变化

运行时是向编程语言添加功能的代码,它可以在应用程序运行时使用,直到翻译完成。由于 Apple 不需要维护应用程序兼容性(64 位二进制文​​件在 32 位上运行),因此他们有能力对 Objective-C 语言进行更多改进。

其中之一就是所谓的 标记指针 (标记的指标)。通常,对象和指向这些对象的指针存储在内存的不同部分中。然而,新的指针类型允许数据很少的类直接在指针中存储对象。这一步不需要直接为对象分配内存,只需创建一个指针和其中的对象即可。标记指针仅在 64 位体系结构中受支持,也是因为 32 位指针中不再有足够的空间来存储足够的有用数据。因此,与 OS X 不同,iOS 还不支持此功能。然而,随着 ARM64 的到来,这种情况正在改变,iOS 在这方面也赶上了 OS X。

虽然指针有 64 位长,但在 ARM64 上,只有 33 位用于指针自己的地址。如果我们能够可靠地解密其余的指针位,我们就可以使用这个空间来存储额外的数据——就像前面提到的标记指针的情况一样。从概念上讲,这是 Objective-C 历史上最大的变化之一,尽管它不是一个有市场的功能——因此大多数用户不会知道 Apple 是如何推动 Objective-C 向前发展的。

至于这样一个标记指针的剩余空间可以存储有用的数据,例如Objective-C现在就用它来存储所谓的 引用计数 (参考文献数量)。以前,引用计数存储在内存中的不同位置,存储在为其准备的哈希表中,但是在大量 alloc/dealloc/retain/release 调用的情况下,这可能会减慢整个系统的速度。由于线程安全,该表必须被锁定,因此两个线程中的两个对象的引用计数不能同时更改。然而,这个值是新插入到所谓的其余部分中的。 ISA 指标。这又是一个不起眼,但却是未来巨大的优势和加速。然而,这在 32 位架构中永远无法实现。

有关关联对象的信息,该对象是否弱引用,是否需要为该对象生成析构函数等信息,也被新插入到对象指针的剩余位置中。得益于这些信息,Objective-C运行时能够从根本上加快运行时速度,这体现在每个应用程序的速度上。根据测试,这意味着所有内存管理调用的速度提高了约 40-50%。只需切换到 64 位指针并使用这个新空间即可。

结论

尽管竞争对手会试图传播这样的观点:转向 64 位架构是不必要的,但您已经知道这只是一个非常无知的观点。确实,简单地切换到 64 位而不调整语言或应用程序并没有真正的意义 - 它甚至会减慢整个系统的速度。但新的 A7 使用带有新指令集的现代 ARM64,并且 Apple 不辞辛劳地对整个 Objective-C 语言进行现代化改造并利用新功能 - 因此承诺了加速。

在这里,我们已经提到了 64 位架构是向前迈出的正确一步的大量原因。这是另一场“幕后”革命,苹果将努力不仅在设计、用户界面和丰富的生态系统方面保持领先地位,而且主要利用市场上最现代的技术。

来源: mikeash.com
.