Nvidia顯卡硬件與軟件

硬件

下面這張圖是GPU的硬件結構,這個圖有點大,放大看可以看到很多細節,我們可以看到有各種硬件組成單元,比如GPC,TPC,SM, L2Cache,綠色小塊就是cuda core也叫sp,後面這些都有專門對應的軟件信息。
在這裏插入圖片描述
再往裏面深入一層就可以看到更加具體的細節,下面這種圖就是SM的細節。可以看到sm裏面又分爲兩個大塊,每一個大塊的名字叫SMP(SM Processing Block),對於浮點計算來說,CPU可以同時支持不同精度的浮點運算,但在GPU裏針對單精度和雙精度就需要各自獨立的計算單元,一般在GPU裏支持單精度運算的Single Precision ALU稱之爲FP32 core或簡稱core,而把用作雙精度運算的Double Precision ALU稱之爲DP unit或者FP64 core,這裏的SM裏邊由32個DP Unit,由64個CUDA Core,所以單精度雙精度單元數量比是2:1,廠家的配置說明裏CUDA Core就是單指綠色的個數,不包括黃色的。每一個SM有自己的指令緩存,L1緩存,共享內存。而每一個SMP有自己的Warp Scheduler、Register File等。LD/ST 是load store unit,用來內存操作的。SFU是Special function unit,用來做cuda的intrinsic function的,類似於__cos()這種。
在這裏插入圖片描述

軟件

  1. 當一個kernel啓動後,thread會被分配到這些SM中執行。同一個block只會分配到一個SM中,所以同一個block中的threads必然在同一個SM中並行(SIMT)執行。
  2. 實際上一個block中並不是所有的thread能夠在同一時刻執行,Nvidia把32個threads組成一個warp,warp是調度和運行的基本單元 , warp中所有threads並行的執行相同的指令。而同一個block的warp處於同一個wrap scheduler(wrap調度器),當某個wrap阻塞時,其他wrap頂上去,這樣同一個block的warp就是出去亂序狀態,而block和block之間的scheduler更是不相同,所以不同block之間的wrap更是亂序狀態,透徹的理解了運行原理,我們才能在正確的地方加入同步機制,避免死鎖等問題。
  3. 假如一個SM有64個sp, 也就是說同時可以執行2個wrap, 正在被執行的warp叫做resident warp, 每個SM支持的最大resident warp個數可以在對應的顯卡說明上找到,除了一些運行時候的wrap, 還有一些warp處於不同狀態,掛起,就緒,這些wrap和正在執行的warp被統稱爲active wrap, 這些warp需要的資源(寄存器)在進入sm的時候就已經被分配。比如下圖的SM1就包含m個active warp。
    在這裏插入圖片描述

爲了提高SM的利用率,我們需要將所有active wrap都要用完,假如我們有16個block, 每個block有32個thread,(這裏說一下,每一個sm都有block所能容納的上限,wrap所能容納的上限(這個可以根據sp的個數推導出來,最好還是去查表),原因就不在詞細講,有興趣可以自己看[nvidia]的文檔,比如有一塊GPU的block上限是16,activate warp的上限是64), 那麼上面那個<16,32>的kernel對於sm的使用率就只有25%, 所以有時候我們需要根據自己使用GPU來設置合適thread來提高sm的利用率,此外還有share_memory的影響,所以使用的時候要小心

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章