指令集架構(ISA)

指令集擴展

指令集擴展是一組加到基本 ISA 上、賦予它新能力的額外指令,就像替一款桌遊買擴充包:核心規則不變,但新棋子讓你能做基本版做不到的事。基本 ISA 保持小而通用;擴展則層層加上能力——浮點數學、一次對許多數字做的向量運算、密碼學輔助、更短的壓縮指令——給需要它們的晶片與程式使用。

RISC-V 從設計上就圍繞這個概念。有一個極小的強制基本部分(只有整數指令),接著是一些標準化的可選擴展,每個用一個字母表示:「M」是整數乘除、「F」與「D」是單精度與雙精度浮點、「A」是原子操作、「C」是壓縮的 16 位元指令、「V」是向量。一顆晶片宣告它實作了哪些擴展,而軟體可以只要求現有的部分來編譯。x86 數十年來也是這樣成長,累積了像 SSE 與 AVX 這樣的向量數學家族——清楚顯示即便是一個「複雜」的 ISA 也持續在擴展。

擴展是 ISA 在不打破整個世界的前提下演進的方式,但它帶有一個值得誠實說明的真實陷阱:一個用了某擴展的程式,只能在實作了該擴展的晶片上跑。為 AVX-512 編譯的程式碼,在缺它的 CPU 上會出錯。這正是「增添能力」與「維持二進位相容」之間的張力,也是為什麼軟體常在執行時檢查有哪些擴展可用、據此選一條程式碼路徑,或乾脆出貨多個版本。為未來的擴展保留編碼空間,是 ISA 設計中最難、視野最長遠的工作之一。

一顆基本的 RISC-V 晶片無法用一條指令把兩個整數相乘;那在可選的「M」擴展裡。實作了「M」的晶片能直接跑「mul x5, x6, x7」;沒有「M」的晶片則必須用位移與加法以較慢的方式算出乘積。

可選的擴展加上指令;沒有它們的晶片必須用軟體模擬那份工作。

使用一個擴展是以可攜性換能力:這個二進位檔現在要求該擴展存在。這正是二進位相容的直接對立面,也是可攜軟體常在執行時探測功能的原因。

又稱
ISA extensionextensioninstruction set extensions指令集擴充擴展指令集