3.1 指令集架構
指令集ISA是軟件用來與硬件通信的詞匯集合,定義了軟件和硬件之間的通信協議。Intel x86、ARM v8、RISC-V是當今廣泛使用指令集架構的實例。ISA開發者通常要確保符合規范的軟件或固件能在使用該規范構建的任何處理器上執行。廣泛部署的ISA組織通常還要保證向后兼容性以便第X代版本處理器編寫的代碼能夠繼續在第X+i代上運行。
除了提供標量訪存、標量計算和控制指令之外,廣泛部署的架構還在繼續增強其ISA以支持新的計算范式,包括增強的向量處理指令和矩陣/張量指令。
隨著深度學習領域的快速發展,業界對其他數字格式變量驅動的顯著性能提升重新產生了興趣。研究表明,在使用更少的位來表示變量、節省算力和內存帶寬方面,深度學習模型表現同樣出色。
3.2 流水線
流水線是加快CPU速度的基礎技術,其中多條指令在執行過程中可以重疊。簡單5段流水線:取指、譯碼、執行、訪存、寫回。(寄存器重命名、發射、去操作數、提交)
很多現代CPU都是深度流水線化的。流水線的吞吐量定義為單位時間內完成和退出流水線的指令數。任何給定指令的延遲是指經過流水線所有階段的總時間。將指令從一個階段移動到另一個階段所需的時間定義為CPU的基本時鐘周期或時鐘。流水線運行的時鐘周期數通常由流水線最慢的階段決定。理想流水線中每條指令的執行時間由下式給出:
? ? ? ? 流水化中每條指令的執行時間=非流水情況/流水階段數
實際實現中的流水線會引入幾個約束:結構冒險、數據冒險和控制冒險。幸運的是,程序員不需要應對流水線冒險,在現代CPU中所有類別的冒險都是由硬件控制的。
結構冒險由資源沖突引起,可以通過復制硬件資源(多端口寄存器)來消除,代價是硅面積和功耗方面的成本會很高昂。
數據冒險中WAW和WAR可以通過寄存器重命名來避免,RAW可以通過旁路網絡來減輕損失。
控制冒險由程序執行流程的變化而導致的。它們產生于流水線分支指令和其他更改程序流程的指令。決定分支方向的分支條件在流水線的EXE階段才能見分曉。因此,除非消除控制冒險,否則下一條指令的獲取不能被流水線化。不過可以用動態分支預測和投機執行來克服該冒險。
3.3 利用指令級并行
因為程序中大多數指令是獨立的,所以都適合流水線化和并行執行。
3.3.1 亂序執行
亂序執行主要用于避免因為依賴而引起的流水線停頓。指令的動態調度是通過復雜的硬件結構(記分板)和諸如寄存器重命名之類的技術實現的。記分板的大小決定了硬件在調度此類獨立指令時可以提前多長時間進行。
3.3.2 超標量引擎和超長指令字
目前CPU的典型發射寬度為2~6。為了保證恰當的平衡,這種超標量引擎還支持多個執行單元和流水線執行單元。CPU的多發射功能與深度流水線和亂序執行功能相結合,以獲取軟件給定片段的最大ILP。
Intel Itanium等架構使用VLIW,將調度超標量和多執行單元處理器的負擔從硬件轉移到編譯器。基本原理在于要求編譯器選擇正確的指令組合使得機器被充分利用,從而簡化硬件。因為硬件受制于指令窗口長度的限制,而編譯器可以獲取全局信息。
3.3.3 投機執行
如果指令在分支條件得到確定之前停頓,控制冒險可能會導致流水線中顯著的性能損失。硬件分支預測邏輯是一種避免這種性能損失的技術。
在條件結果得以明確之前,無法提交對機器狀態的修改,以確保機器的架構狀態永遠不受投機執行指令的影響。當預測錯誤時,投機執行的結果必須被制止和丟棄,即分支預測錯誤懲罰。
3.4 利用線程級并行
硬件多線程CPU支持專用硬件資源以獨立地跟蹤CPU中每個線程的狀態,目的是線程由于長時延活動(如內存引用)而被阻塞時,以最小的延遲從一個上下文切換到另一個上下文(不會產生保存和恢復線程上下文的成本)。
同步多線程SMT將指令級并行技術和多線程技術相結合,以最大限度地利用硬件資源。來自多個線程的指令在同一時間周期內執行。為了支持SMT,CPU必須復制硬件來存儲線程狀態(程序計數器、寄存器等),跟蹤亂序執行和投機執行的資源可以在線程間復制或分段共享。
3.5 存儲器層次
CPU存儲器層次劃分基于兩個基本特性:時間和空間局部性。
3.5.1 高速緩存層次
高速緩存時CPU流水線發出訪存時的存儲器層次中的第一級。理想情況下,流水線在具有最小訪問延遲和無限容量緩存時表現最佳。實際上高速緩存訪問時間隨其容量的增加而增加。因此,高速緩存被組織為最接近執行單元的小型快速存儲塊的層次結構,且由更大、更慢的塊進行備份。
高速緩存由多個確定大小的塊(緩存行)組成,典型大小為64字節。L1大小通常在8KB~32KB,而LLC大小通常在64KB~16MB。任何層級的高速緩存的架構都可以由以下4個屬性定義:
3.5.1.1 高速緩存中數據的放置
內存訪問請求中的地址可以用來訪問高速緩存。在直接映射中,內存塊的地址只能出現在高速緩存中的一個位置。在全相聯中,給定的緩存塊可以放在高速緩存的任何位置。在組相聯中,給定地址首先映射到一個組中,該地址可以映射在組中的任何位置。
3.5.1.2 在高速緩存中查找數據
????????????????????????????????????????address:標簽 索引 塊偏移量
地址中的最低順序位定義了塊內偏移量,組則是基于索引位來選擇,一旦組被選定,就可以使用標簽位來與該組中的所有標簽進行比較。如果其中一個標簽與傳入請求的標簽匹配并且設施了有效位,則緩存命中。與該塊條目相關聯的數據被提供給流水線。如果不匹配,則緩存未命中。
3.5.1.3 管理緩存未命中
當發生高速未命中,控制器必須在緩存中選擇要替換的塊,以分配給導致緩存未命中的地址。直接映射只能分配一個位置,組相連可以分配組內任何位置,全相聯可以分配所有位置。不過組相連和全相連一般會使用LRU策略來釋放緩存塊,為未命中地址騰出緩存空間。
3.5.1.4 管理寫操作
CPU設計使用2種基本機制來處理高速緩存中的緩存命中寫入操作:
? ? ? ? 1. 寫直達:命中的數據同時寫入緩存塊和層次結構中較低的層級。
? ? ? ? 2. 寫回:命中的數據只寫入緩存。因此層次結構較低層級中就會包含過期數據,修改后的緩存行的狀態通過標簽中的臟標識來追蹤。當修改后的緩存行最終被從緩存行中驅逐時,寫回操作會強制將緩存行寫回層次結構的較低層級中。
寫入操作時的高速緩存未命中可以通過2種方式處理:
? ? ? ? 1. 寫分配:未命中位置的數據從層次結構中較低層級加載到高速緩存中,隨后像寫入命中情況一樣處理剩余寫入操作。
? ? ? ? 2. 寫不分配:未命中事務直接被發送到層次結構中所有的較低層級,并且緩存塊不會被加載到高速緩存中。
大多數設計寫分配+寫回,寫不分配+寫直達策略。
3.5.1.5 其他高速緩存優化技術
從流水線的角度來說,任何訪問請求的延遲都可以由以下公式計算出來:
? ? ? ? 平均延遲 = 命中時間 + 未命中比例 * 未命中時間;
未命中比例高度依賴緩存的架構(塊大小、關聯性)以及運行在機器上的軟件。
硬件和軟件預取:減少緩存未命中以及后續停頓的方法之一,先于流水線需要將指令和數據預取到高速緩存層次的不同層級。
硬件預取器觀察正在運行的應用程序的行為,并基于重復的高速緩存未命中規律啟動預取。硬件預取技術可以自動適應程序行為,并且不需要優化編譯器或者剖析功能的支持。另外,硬件預取也不會有額外的地址生成和指令預取開銷。
軟件預取是對硬件預取的補充,開發者可以通過特定的硬件指令提前指定需要的內存位置。編譯器還可以自動將預取指令添加到代碼中。預取技術需要平衡實際需求和預取請求,以避免預取流量擠壓實際需求流量。
3.5.2 主存
主存使用大容量且成本合適的DRAM技術,主要屬性定義為延遲、帶寬和容量。延遲包括2部分,內存訪問時間和內存周期時間。
內存訪問時間:請求到數據可用時所消耗的時間。
內存周期時間:兩個連續的內存訪問之間所需的最短時間。
歷史上,DRAM帶寬每一代都得到提升,而延遲保持不變,甚至更高。
新的DRAM技術,GDDR和HBM在需要更大更寬的定制處理器上使用,所以不被DDR接口支持。
現代CPU支持多個獨立通道的DRAM。一般而言,每一個內存通道的寬度是32位或者64位。
3.6 虛擬內存
虛擬內存是讓所有運行在CPU上的進程可以共享屬于該CPU的物理內存的機制。虛擬內存提供一種保護機制,可以限制其他進程對分配給指定進程內存的訪問。虛擬內存還提供重定位機制,即能將程序加載到物理內存的任意位置而無需改變程序內尋址方式。
虛擬地址由提供虛擬地址和物理地址之間映射的專用硬件表翻譯成物理地址,這些表被稱為頁表。
????????????????????????????????虛擬地址:虛擬頁編號?頁偏移量
其中虛擬頁編號通過頁表被轉換為物理地址。如果請求的頁不在主存內,則會導致缺頁問題。
CPU通常使用層級結構的頁表格式將虛擬地址位有效地映射到可用的物理內存,缺點是缺頁代價很高,需要遍歷整個層級結構。為了減少地址翻譯時間,CPU支持TLB的硬件結構來緩存最近使用過的翻譯。
3.7 SIMD多處理器
向量和矩陣計算都非常適合SIMD架構,因為向量或矩陣的每個元素都需要使用相同的指令進行處理。SIMD多處理器主要用于數據并行并且只需要少量功能和操作的特殊用途任務。MMX-SSE-AVX。
起初,新的SIMD指令以匯編的方式編程。后來,引入了特殊的編譯器內建函數。
3.9 性能監控單元
現代CPU包含性能檢測單元PMU,PMU有一組性能監控計數器PMC,用以收集程序運行過程中發生的各種性能事件。
PMU提供固定功能計數器以及可編程計數器。固定功能計數器總是測量CPU核內的同一事件,而可編程計數器由用戶來選擇想要測量的事件。通常,每個邏輯核有4個可編程計數器和3個固定功能計數器。固定功能通常被設置為計算核時鐘、參考時鐘和退休指令。