關閉廣告

麥克·阿什 致力於他的博客 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 位元暫存器增加了一倍。

但為什麼寄存器的數量如此重要呢?記憶體通常比 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 位元指標並使用這個新空間。

záver

儘管競爭對手會試圖傳播這樣的觀點:轉向 64 位元架構是不必要的,但您已經知道這只是一個非常無知的觀點。確實,簡單地切換到 64 位元而不調整語言或應用程式並沒有真正的意義 - 它甚至會減慢整個系統的速度。但新的 A7 使用帶有新指令集的現代 ARM64,並且 Apple 不辭辛勞地對整個 Objective-C 語言進行現代化改造並利用新功能 - 因此承諾了加速。

在這裡,我們已經提到了 64 位元架構是向前邁出的正確一步的大量原因。這是另一場「幕後」革命,蘋果將努力不僅在設計、用戶介面和豐富的生態系統方面保持領先地位,而且主要利用市場上最現代的技術。

來源: mikeash.com
.