為什麼要從 ISA 談起#

寫應用程式時,我們鮮少思考 CPU 內部到底在做什麼。但要理解效能、除錯與跨平台移植,就不能跳過 ISA(Instruction Set Architecture,指令集架構)這層軟體與硬體之間的契約。本章從馮紐曼架構談起,再對照 CISC(Complex Instruction Set Computer,複雜指令集電腦)與 RISC(Reduced Instruction Set Computer,精簡指令集電腦)兩條設計路線。

馮紐曼架構#

1945 年 6 月 30 日,馮紐曼(Von Neumann)與工作夥伴在曼哈頓計畫中使用了當時最先進的電腦 Mark I 與 ENIAC 進行大量運算。在使用過程中,他意識到「儲存程式」的重要性,從而在論文 First Draft of a Report on the EDVAC 中提出了儲存程式邏輯架構,後人將這個架構稱為 Von Neumann architecture。

在計算機剛發展的年代,電腦只能處理特定問題:電路執行狀態固定,要更動功能就得重新接線甚至改結構。馮紐曼提出的架構顛覆了整個世界:

  • 透過 ISA 將「運算」轉化為一連串程式指令的執行細節(可以想成今日的組合語言)
  • 把指令當成一種特別型態的靜態資料,使得電腦可以輕易改變其程式
  • 程式甚至能在執行期自行修改自己的內容

程式自我修改這項特色已被現代程式設計揚棄,因為它會增加理解與除錯的難度,且現代 CPU 的管線與快取機制會讓此類技巧效率降低。

儲存程式型電腦的特點#

  • 以運算單元為中心
  • 採用儲存程式原理
  • 記憶體是按位址存取、線性編址的空間
  • 控制流由指令流產生
  • 指令由操作碼(opcode)和位址碼組成
  • 資料以二進位編碼(Binary Code)

CISC 與 RISC#

處理器的指令集主要分為兩類。

CISC(Complex Instruction Set Computer)#

代表性架構:

  • x86
  • PDP-11
  • Motorola 68000

除了上述三個之外,還有非常多的電腦製造商投入 CISC 架構的設計,但當今市場仍被廣泛使用的只剩 x86。

RISC(Reduced Instruction Set Computer)#

RISC 架構的特點:

  • 指令長度固定,CPU 更容易做解碼
  • 盡可能將資料放在 CPU 的暫存器中操作
  • 處理器的硬體簡化,所以時脈容易提高且更省電
  • 因為複雜的指令皆由多個基本指令組成,對於記憶體的開銷更大

知名的 RISC 架構:

  • ARM:過去稱作 Advanced RISC Machine(更早稱作 Acorn RISC Machine),是一個精簡指令集處理器架構家族,廣泛使用在許多嵌入式系統設計。由於低成本、高效能、低耗電的特性,現今的行動裝置幾乎都使用 ARM 提供的處理器架構解決方案(高通、三星、蘋果)。ARM 主要採用 IP 授權的販售方式。
  • MIPS:由 MIPS 公司開發並授權的精簡指令集架構,廣泛使用在許多電子產品、網路裝置、個人娛樂裝置與商業裝置上。最早是 32 位元,最新版本為 64 位元,主要競爭對手是 ARM 與 RISC-V。2021 年初 MIPS 公司宣布投入 RISC-V 開發,一代豪傑就此謝幕。
  • RISC-V:基於精簡指令集原則的開源指令集架構,可視為開源軟體運動相對應的「開源硬體」。專案 2010 年始於加州大學柏克萊分校,但許多貢獻者來自學界以外。RISC-V 指令集可以自由地用於任何目的,允許任何人設計、製造和銷售 RISC-V 晶片和軟體而不必支付專利費。

由於 ARM 高昂的權利金讓學界或新創很難設計出解決方案,這也是開源 RISC 架構誕生的契機。本系列後續探討現代處理器的文章都會以 RISC-V 架構作為教材。

現代處理器的趨勢#

最初處理器都是 CISC 架構。隨著時間推演,設計者將越來越多的運算指令塞進架構中。以 x86 為例:最初一定會有基本的運算指令、浮點數運算指令,後來陸續加入 MMX、SSE、AVX⋯ 等擴充。為了支援這些指令集,設計者勢必要將更多的硬體放入處理器中,功耗就成了 CISC 最頭痛的問題

撇開功耗不說,CISC 架構中約 20% 的指令會經常被使用,且佔整體程式的 80%——多數指令其實佔據了處理器的硬體資源卻鮮少被使用。

1979 年,加州大學柏克萊分校的 David Patterson 教授提出了將指令集架構精簡化的想法:硬體應該專心加速常用的指令,剩下較為複雜的指令可以利用基本指令做組合。

CISC 與 RISC 的界線正在模糊#

現今 RISC 與 CISC 不再有顯著的差異:

  • RISC 處理器的硬體設計與指令隨著時間越來越複雜
  • CISC 處理器則採用微碼(microcode)來實現複雜指令集

這點最早可以追溯到 Intel 的 Pentium Pro 處理器,其 micro-operation(micro-op,uop)奠定今日高速 x86 設計的基礎:CISC 的指令被解碼成多個內部 RISC-like 的 uop,再交給後端執行。

設計取捨速覽#

面向CISCRISC
指令長度變動固定
記憶體存取多數指令可直接存取主要透過 load/store
解碼複雜度
程式碼密度
功耗較高較低
代表x86ARM、RISC-V

理解這層差異後,後續看編譯器產生的組合語言、最佳化技巧與處理器設計時,比較容易掌握「為什麼這個架構要這樣做」。

原文出處#

  • 原書/iThome:https://ithelp.ithome.com.tw/articles/10264826