CPU 架構概觀

最後更新: 2021-07-15 15:11:38 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

處理器實作指令集架構(ISA):該契約定義指令、暫存器、資料型別、位址形成、例外與權限行為。微架構使用管線、執行單元、快取、預測器與內部佇列實作該契約。程式會觀察架構狀態;效能則取決於微架構狀態。

從擷取到退休 #

在概念層級,處理器會擷取指令位元組、解碼指令、取得運算元、執行操作、在需要時存取記憶體,並提交結果。簡單處理器可以循序執行這些步驟。管線化處理器會重疊多個指令的步驟,因此改善輸送量,而不要求每個指令都具有低延遲。

架構狀態包括通用暫存器、狀態暫存器、程式計數器與架構可見記憶體。微架構狀態包括已解碼操作快取、實體暫存器、重新排序緩衝區、分支歷史與快取替換中繼資料。內容切換必須保留 ABI 承諾的架構狀態;它既不儲存也不公開每個內部預測器或管線項目。

管線必須處理三類相依性:

  • 資料危害:一個操作消耗另一個尚未產生的結果。
  • 結構危害:操作競爭執行單元、連接埠、佇列或快取資源。
  • 控制危害:分支可能變更下一個擷取位址。

轉送會在暫存器寫回前提供結果。暫存器重新命名將架構名稱映射至更大的實體暫存器集合,從而移除虛假的讀後寫與寫後寫相依性。重新排序緩衝區讓獨立操作可以亂序執行,同時以保留精確架構例外的順序退休已完成操作。

超純量與推測執行 #

超純量前端每週期可以解碼或發出多個操作。發出寬度只是其中一項限制:真正相依性、執行連接埠壓力、快取遺漏與退休寬度都可能降低持續輸送量。

分支預測會在分支解析前選擇可能的控制流程路徑。正確預測會讓管線保持供應;預測錯誤會丟棄較年輕的推測工作,並在解析出的目標重新開始擷取。推測不得提交錯誤的架構狀態,但暫時執行可能影響快取與其他共享微架構資源。因此,隔離程式碼必須遵循平台對暫時執行弱點的指引,而不能只依賴架構權限檢查。

快取階層與記憶體延遲 #

處理器核心透過階層存取 DRAM,因為快速儲存昂貴且受物理限制。L1 指令與資料快取小且靠近核心。較大的 L2 與末級快取以延遲換取容量。快取行會一併傳輸相鄰位元組,因此循序存取利用空間區域性,重用則利用時間區域性。

快取會將位址分為標籤、集合索引與行偏移。關聯性允許集合中存在多個行,以比較標籤與替換複雜度為代價減少衝突遺漏。硬體預取器可以隱藏可預測延遲,但指標追逐與容量遺漏仍會暴露較低階快取或 DRAM 延遲。

多核心系統使用一致性協定協調同一快取行的快取副本。一致性為單一位置的寫入建立順序;記憶體一致性模型則定義不同存取之間允許的順序。正確的並行軟體必須使用語言原子操作、鎖或其他同步,因為快取一致性不會使未同步的複合操作變成原子操作。

虛擬記憶體硬體透過頁表轉換虛擬位址。轉譯後備緩衝區快取最近的轉換,因此即使資料本身已快取,TLB 遺漏仍會增加頁表走訪。NUMA 系統加入另一種距離:核心存取本機記憶體時,延遲較低或頻寬可能高於連接至另一插槽的記憶體。

核心、執行緒與 SIMD #

核心包含一個或多個架構執行內容。同步多執行緒(SMT)讓硬體執行緒共享核心的前端、快取與執行資源。SMT 可以填補原本閒置的發出槽,但競爭也可能降低每執行緒效能。作業系統執行緒是排程物件,數量可能超過核心與硬體執行緒。

多個核心會執行獨立指令串流。共享記憶體程式仍必須考慮同步、快取行競爭與錯誤共享。增加核心不會加速循序相依鏈。

SIMD 指令會將一項操作套用至向量暫存器中的多個通道。x86 提供 SSE、AVX 與 AVX-512 系列;Arm 與 RISC-V 提供自己的向量功能。名義向量寬度描述架構狀態,而不是延遲或輸送量。編譯器需要別名、對齊、相依性與目標功能資訊,才能安全地向量化。

組合語法與 ABI 邊界 #

組合語法是工具慣例,而不是 ISA 屬性。x86 Intel 語法將目的放在前面:

asm
mov rax, rbx

AT&T 語法將來源放在前面,以 % 為暫存器加前綴,並在許多助記符上加運算元大小後綴:

asm
movq %rbx, %rax

NASM 使用 Intel 語法,而 GNU objdump -d 預設使用 AT&T 語法,並接受 -Mintel。其他架構有自己的語法與工具特定指示詞。語法也不會定義呼叫慣例:引數暫存器、被呼叫端保存狀態、堆疊對齊與物件格式屬於 ABI。請參閱 NASM 了解組譯器工作流程。

評論

在 GitHub 上閱讀或評論(發表評論需要登入)