當前位置: 華文問答 > 數位

CUDA運算速度和顯卡CUDA核心數量關系大嗎?

2016-05-16數位

nvidia gpu內部硬體單元有很多種,單獨某一種的數量與顯卡效能並不成嚴格的正相關。

實際上每一代架構都在調整各種單元之間的比例,目的是為了 讓程式提高並列度,使有效吞吐接近理論極限 。如果設計gpu的過程中沒有權衡各種硬體資源的比例,會造成某一種硬體資源的缺乏成為限制整個cuda程式執行效率的瓶頸。

問題裏的cuda core,或者稱為sp,是主要的運算單元,內部有分別處理int和單精度float的部份,用於執行一些常用的運算指令。除了sp之外還有雙精度單元用於科學計算以及特殊運算單元sfu來執行比較復雜的運算指令比如三角函式。 而gpu中除了這些運算單元之外還有很重要很稀缺的儲存器結構。現代電腦,無論CPU還是GPU,主要的效能瓶頸都來自儲存器。 gpu運算單元的總峰值吞吐能力遠遠超過訪存的峰值頻寬。

在硬體上比SP更大的運算單位稱為SM,一個SM是由多個SP加上其他的資源組成的,實際上 SM才更像是一個具有完整功能的CORE。 因為SM可以排程並行射指令到運算單元內。

nvidia一直在努力把自己的gpu從一般的圖形處理器往通用計算的方向發展,cuda core裏面的cuda這個詞就是nvidia主推的平行計算架構。無論是圖形渲染還是cuda編程,最基本的程式並列結構稱為thread,這是程式設計師可以控制的最細粒度的並列單位。每一個thread在運算單元上就對應一個sp,所以新聞裏常常會籠統的把sp數量等同於thread的並列數量,從而量化不同GPU的效能。多個thread組合起來稱為一個block,數量是程式設計師可以設定的。在同一個block內的thread之間可以相互通訊,因為他們可以共用同一個SM內的shared memory(共享儲記憶體),每一個thread還擁有各自獨占的register(寄存器)和local memory(本地儲存器),這幾種儲存器都是整個GPU中距離運算單元距離最近,速度最快的儲存器資源。但是跨block的執行緒通訊不能透過SM內部的儲存器,只能透過距離很遠,存取時間長達幾百個周期的global memory(全域記憶體,就是指視訊記憶體)來實作,這個速度實在太慢了,所以cuda程式會盡量避免使用global memory。

block在硬體上是由SM呼叫駐留的,一個SM會把屬於它的block拆分成很多warp(硬體上的排程單位)分批餵給運算單元去執行,一個warp包含了32個thread。而所有屬於這個SM的block會共用這個SM上的資源。對於編程人員來說,程式並列化的關鍵就在於設計一個方案,使得一個SM內的各種硬體單元都能有效利用,得到最理想的吞吐。

打個比方,一個SM內部有48kb的shared memory,8192個register,假如程式設計師設定的每個block裏面有64個執行緒,並且希望每個sm能同時駐留2個block,那麽每個執行緒就能分到8192/2/64=64個register,一個block可以分配到48/2=24kb的shared memory,接著這位程式設計師又修改了程式,使得每個thread使用到的資源更多,並且恰好比之前算出來的極限值多那麽一點點,就會導致一個SM滿足不了駐留2個block,只能留下來一個,於是就會空置很多硬體資源不能得到有效的利用。總結一下,如果一個SM內的硬體資源比例不均,不能滿足程式設計師的分配需求,那麽就會導致同時執行的block數量變少。結合題主的問題來說, 即使一個gpu內部有很多很多的運算單元,卻沒有足夠的其他資源支撐這些運算單元同時並列,那麽這些運算單元就會閑置,白白浪費了算力。

最新的Pascal雖然每個SM的sp數量相對於前代Maxwell而言只有一半(64/128),但是擁有相同的儲存器資源,所以能提供給每個block/thread更多的儲存器資源,從而保證每個運算單元的充分利用。再加上全域上的GPU執行頻率比原來更高,即使總運算單元數量減少一點,最終折算的吞吐能力也會比上一代更高。

另外gpu的設計是考慮到成本和散熱等宏觀因素的,高速片上儲存器占用晶體管多,所以容量有限,往往在芯片制程和工藝更新換代之後才有條件增大容量,不可能做到無限制的堆砌硬體資源。新一代的設計一般都會著重於提升每瓦效能,並且根據實際編程中總結出來的設計模式對硬體資源比例進行調整,這是個不斷trade off的過程。