NVIDIA CUDA初級教程視訊 - 學習筆記(一)CPU體系架構概述
阿新 • • 發佈:2018-12-10
一句話:CPU大量用於資料搬運而非數值運算,用流水線和分支提高效率
【計算機組成原理】
Q:什麼是CPU?
A:是執行指令、處理資料的器件,用於完成基本的邏輯和算術指令,現在增加了複雜功能(記憶體介面、外部裝置介面),包含大量電晶體(上百億)
Q:什麼是指令?
A:包括算術、訪存、控制。對於一個編譯好的程式,最優化目標:CPI(每條指令所需時鐘週期:cycles/instruction)× 時鐘週期(seconds/cycle)。這兩個指標彼此並不獨立
桌面應用多為輕量級程序,少量執行緒,有大量分支和互動操作,需要大量的儲存器訪問
摩爾定律:晶片的整合密度每2年翻一翻,且成本下降一半。但目前矽基晶片達到物理極限(量子效應明顯)
流水線 Pipeline
- 利用指令級並行,極大的減小時鐘週期,同時增加一些延遲和芯片面積
- 帶來處理具有依賴關係指令和分支處理的問題
- 流水線長度(流水線分級):級數多不一定能帶來效能提升
旁路 Bypassing
- (開後門)處理具有依賴關係的指令
停滯 Stalls
分支 Branches
- 等待判斷條件,要不要執行
分支預測 Branch Prediction
- 基於過去的分支記錄,猜測下一條指令
- 現代預測器準確度大於90%。提升效能及能量效率,面積增加,可能會增加延遲(猜也需要時間)
分支斷定 Another option: Predication
- 不使用分支預測器,用條件語句替換分支(所有分支都做)
- 在GPU中使用分支斷定
提升 IPC
- 常規 IPC (instructions/cycle) 受限於 1 instruction / clock
- 超標量 (Superscalar) – 增加流水線寬度(類似於三頭六臂,為了處理更多的資料)
- N倍資源使用,旁路網路N^2,需要更多的暫存器和儲存器頻寬(但三頭六臂吃的飯也多了,需要的床也大了)
指令排程 Scheduling :
- 指令直接是否依賴
暫存器重新命名 Register Renaming
- 替換暫存器,讓指令可以並行執行
亂序執行 Out-of-Order(OoO) Execution
- 重排指令,獲得最大的吞吐率:Fetch → Decode → Rename → Dispatch → Issue → Register-Read → Execute → Memory → Writeback → Commit (調節順序,用更合理的順序做事情)
- 重排緩衝區Reorder Buffer (ROB):記錄所有執行中的指令狀態
- 發射佇列/排程器Issue Queue/Scheduler:選擇下一條執行的指令
快取 Caching
- 將資料放在儘可能接近的位置(手機放在口袋裡,而不是放包裡)
- 利用時間臨近性(剛剛使用過的資料很可能會被再使用)和空間臨近性(傾向於使用周圍的臨近的資料)
CPU內部的並行性
- 指令級並行 Instruction-Level (ILP) extraction :超標量Superscalar、亂序執行Out-of-order(OoO)
- 資料級並行 Data-Level Parallelism (DLP) :向量計算Vectors (資料間沒有相關性,可以同時運算)
- 執行緒級並行 Thread-Level Parallelism (TLP) :同步多執行緒Simultaneous Multithreading (SMT) 、多核 Multicore
鎖、一致性、同一性 Locks,Coherence,Consistency
- 多執行緒讀寫同一塊資料?加鎖(我用完了再把鎖給你,你來用)
- 誰的資料是正確的 (Coherence)? 快取一致性協議
- 什麼樣的資料是正確的 (Consistency)?儲存器同一性模型
現實的困境
- 能量牆: Power Wall(拿掉散熱器片,晶片煎雞蛋)
- 儲存器牆:處理器的儲存器頻寬無法滿足處理能力的提升
結論
- CPU 為序列程式優化
Pipelines, branch prediction, superscalar, OoO
Reduce execution time with high clock speeds and high utilization
- 緩慢的記憶體頻寬(儲存器頻寬)將會是大問題
- 並行處理是方向