Nvidia CUDA初級教程1 CPU體系架構綜述
視頻:https://www.bilibili.com/video/BV1kx411m7Fk?p=2
講師:周斌
本節內容:了解現代CPU的架構和性能優化:
- 流水線 Pipelining
- 分支預測 Branch Prediction
- 超標量 Superscalar
- 亂序執行 Out-of-Order (OoO) Excution
- 存儲器層次 Memeory Hierarchy
- 矢量操作 Vertor Operations
- 多核處理 Multi-Core
CPU
什么是CPU?
-
執行指令、處理數據的器件
- 完成基本的邏輯和算術指令
-
現在增加了復雜功能
- 內存接口
- 外部設備接口
-
包含大量的晶體管
非常大(上億…)
什么是指令?
- 算術:add r4, r4 -> r4
- 訪存:load [r4] -> r7
- 控制:jz end
對于一個編譯好的程序,最優化目標:
cyclesinstruction×secondscycle\frac{cycles}{instruction}\times \frac{seconds}{cycle} instructioncycles?×cycleseconds?
CPI(每條指令的時鐘數)&時鐘周期
這兩個指標彼此并不獨立,會存在 trade-off。
桌面應用
桌面應用有以下特點:
- 輕量級進程,少量線程
- 大量分支和交互操作
- 大量的存儲器訪問
- 真正用于數值計算的指令很少
IO密集型程序
CPU性能優化
流水線
取指、譯碼、執行、訪存、寫回,邏輯上是串行的,但是在實際的CPU實現中,有大量并行優化的部分。流水線利用指令級并行 (instruction-level parallelism, ILP)
Pros: 極大地減小時鐘周期
Cons: 但是會增加一些延遲和芯片面積
流水線帶來的其他的問題:
- 具有依賴關系的指令怎樣處理
- 分支怎么處理
- 流水線的長度,14級/20級?并不是越高越好
其他一些優化:
-
旁路 Bypassing
-
停滯 Stalls
-
分支 Branches
分支預測
基于果蛆的分支記錄,猜測下一條指令
現代分支預測器的準確度大于90%
Pros: 提升性能及能量效率
Cons: 面積增加、可能會增加延遲
分支斷定
用條件語句替換分支
Pros:不適用分支預測器,減小面積,減少錯誤預測
超標量
常規 IPC (instructions/cycle) 受限于 1 instuction / clock
超標量:增加流水線的寬度
峰值IPC為N(N路超標量),但實際中,會有分支和調度產生的開銷,需要一些技巧來接近峰值
Pros: 提升IPC
Cons: 增加了面積、N倍資源占用、旁路網絡 N^2、需要更多寄存器和存儲器帶寬
指令調度
考慮如下指令:
xor r1, r2 -> r3
add r3, r4 -> r4
sub r5, r2 -> r3
addi r3, 1 -> r1
- xor與add互相依賴 (Read-After-Write, RAW)
- sub與addi互相依賴 (RAW)
- xor與sub不依賴 (WAW) ,但是它們會用到同一個寄存器 r3
寄存器重命名
替換寄存器:
xor p1, p2 -> p6
add p6, p4 -> p7
sub p5, p2 -> p8
addi p8, 1 -> p9
現在xor與sub可以并行執行
亂序執行
重排指令,獲得最大的吞吐率
- 重排緩沖區 Reorder Buffer,記錄所有執行中的指令狀態
- 發射隊列/調度器 Issue Queue/Scheduler ,選擇下一條執行的指令
Pros: IPC接近理想狀態
Cons: 面積增加、功耗增加
存儲器層次
- 存儲器越大越慢
緩存 caching
- 將數據放在盡可能接近的位置
- 利用:
- 時間臨近性:剛剛使用過的數據很可能會被再使用
- 空間臨近性:傾向于使用周圍的臨近的數據
緩存層次:
-
硬件管理
- L1、L2、L3緩存
-
軟件管理
內存、磁盤
存儲器的另外的考慮
- 分區 banking
- 避免多端口
- 一致性 coherency
- 控制器 memory controller
- 多個通道,增加帶寬
CPU內部的并行性
- 指令級并行 ILP
- 超標量
- 亂序執行
- 數據級并行 DLP
- 矢量計算
- 線程級并行 TLP
- 同步多線程 SMT
- 多核
向量運算
for (int i=0; i<N; i++) {A[i] = B[i] + C[i];
}
數據級并行:
- 單指令多數據 Single Instruction Multiple Data (SIMD)
- 執行單元(ALU)很寬
- 寄存器也很寬
for (int i=0; i<N; i+=4) {// 并行 同時計算A[i] = B[i] + C[i];A[i+1] = B[i+1] + C[i+1];A[i+2] = B[i+2] + C[i+2];A[i+3] = B[i+3] + C[i+3];
}
x86的向量運算
- SSE2
- AVX
線程級并行
線程
- 線程組成
- 指令流 instruction streams
- 私有寄存器,程序計數器,棧
- 共享全局變量
- 程序員可以創建和銷毀
- 程序員或者OS都可以調度
多核
- 將流水線完整復制
- Sandy Bridge-E: 6 cores
- 完整的核,除了最后一級緩存外,不共享其他資源
- 繼續保持摩爾定律
- 多核程序核利用率的問題
鎖、一致性和同一性
鎖 lock
- 問題:多個線程讀寫同一塊數據
- 解決方法:加鎖
一致性 coherence
- 問題:誰的數據是正確的?
- 解決方法:緩存一致性協議
同一性 consistency
- 問題:什么樣的數據是正確的
- 存儲器同一性模型
新時代的計算技術
- 能量墻
- 常規傳統單核處理器遇到物理約束,時鐘頻率 (perf/clock) 無法保持線性增長,免費的午餐要消失了
新摩爾定律
- 處理器越來越胖,核越來越多
- 單核的性能不會大幅提升
- 另外一堵墻:存儲器墻
處理器的存儲器帶寬無法滿足處理能力的提升
結論
-
CPU為串行程序優化:
- 流水線、分支預測、超標量、亂序執行、…
- 通過高時鐘頻率和高利用率來降低執行時間
-
緩慢的內存帶寬(存儲器帶寬)將會是大問題
-
并行處理是方向
- Sandy Bridge-E 6-12 活動線程
-
如果有成千上萬的活動線程并發執行呢?
Ref:
https://www.bilibili.com/video/BV1kx411m7Fk?p=2