1. 程式人生 > >【平行計算-CUDA開發】CUDA軟體架構與Nvidia硬體對應關係

【平行計算-CUDA開發】CUDA軟體架構與Nvidia硬體對應關係

硬體基本架構

實際上在nVidia的GPU裡,最基本的處理單元是所謂的SP(Streaming Processor),而一顆nVidia的GPU裡,會有非常多的SP可以同時做計算;而數個SP會在附加一些其他單元,一起組成一個SM(Streaming Multiprocessor)。幾個SM則會在組成所謂的TPC(Texture Processing Clusters)。 
在G80/G92的架構下,總共會有128個SP,以8個SP為一組,組成16個SM,再以兩個SM為一個TPC,共分成8個TPC來運作。而在新一代的GT200裡,SP則是增加到240個,還是以8個SP組成一個SM,但是改成以3個SM組成一個TPC,共10組TPC。下面則是提供了兩種不同表示方式的示意圖。(可參考《

NVIDIA G92終極狀態!!》、《NVIDIA D10U繪圖核心》)

對應到CUDA

而在CUDA 中,應該是沒有TPC 的那一層架構,而是隻要根據GPU 的SM、SP 的數量和資源來調整就可以了。

如果把CUDA 的Grid – Block – Thread 架構對應到實際的硬體上的話,會類似對應成GPU – Streaming Multiprocessor ??– Streaming Processor;一整個Grid 會直接丟給GPU 來執行,而Block 大致就是對應到SM, thread 則大致對應到SP。當然,這個講法並不是很精確,只是一個簡單的比喻而已。

SM 中的Warp 和Block

CUDA的device實際在執行的時候,會以Block為單位,把一個個的block分配給SM進行運算;而block中的thread,又會以「warp」為單位,把thread來做分組計算。目前CUDA的warp大小都是32,也就是32個thread會被群組成一個warp來一起執行;同一個warp裡的thread,會以不同的資料,執行同樣的指令。此外,在Compute Capability 1.2的硬體中,還加入了warp vote的功能,可以快速的進行warp內的簡單統計。

基本上warp 分組的動作是由SM 自動進行的,會以連續的方式來做分組。比如說如果有一個block 裡有128 個thread 的話,就會被分成四組warp,第0-31 個thread 會是warp 1、32-63 是warp 2、64-95 是warp 3、96-127 是warp 4。

而如果block 裡面的thread 數量不是32 的倍數,那他會把剩下的thread 獨立成一個warp;比如說thread 數目是66 的話,就會有三個warp:0-31、32-63、64-65 。由於最後一個warp 裡只剩下兩個thread,所以其實在計算時,就相當於浪費了30 個thread 的計算能力;這點是在設定block 中thread 數量一定要注意的事!

一個SM 一次只會執行一個block 裡的一個warp,但是SM 不見得會一次就把這個warp 的所有指令都執行完;當遇到正在執行的warp 需要等待的時候(例如存取global memory 就會要等好一段時間),就切換到別的warp 來繼續做運算,藉此避免為了等待而浪費時間。所以理論上效率最好的狀況,就是在SM 中有夠多的warp 可以切換,讓在執行的時候,不會有「所有warp 都要等待」的情形發生;因為當所有的warp 都要等待時,就會變成SM 無事可做的狀況了~

下圖就是一個warp 排程的例子。一開始是先執行thread block 1 的warp1,而當他執行到第六行指令的時候,因為需要等待,所以就會先切到thread block 的warp2 來執行;一直等到存取結束,且剛好有一個warp 結束時,才繼續執行TB1 warp1 的第七行指令。

實際上,warp 也是CUDA 中,每一個SM 執行的最小單位;如果GPU 有16 組SM 的話,也就代表他真正在執行的thread 數目會是32*16 個。不過由於CUDA 是要透過warp 的切換來隱藏thread 的延遲、等待,來達到大量平行化的目的,所以會用所謂的active thread 這個名詞來代表一個SM 裡同時可以處理的thread 數目。

而在block 的方面,一個SM 可以同時處理多個thread block,當其中有block 的所有thread 都處理完後,他就會再去找其他還沒處理的block 來處理。假設有16 個SM、64 個block、每個SM 可以同時處理三個block 的話,那一開始執行時,device 就會同時處理48 個block;而剩下的16 個block 則會等SM 有處理完block 後,再進到SM 中處理,直到所有block 都處理結束。

建議的數值?

在Compute Capability 1.0/1.1中,每個SM最多可以同時管理768個thread(768 active threads)或8個block(8 active blocks);而每一個warp的大小,則是32個thread,也就是一個SM最多可以有768 / 32 = 24個warp(24 active warps)。到了Compute Capability 1.2的話,則是active warp則是變為32,所以active thread也增加到1024。

在這裡,先以Compute Capability 1.0/1.1 的數字來做計算。根據上面的資料,如果一個block 裡有128 個thread 的話,那一個SM 可以容納6 個block;如果一個block 有256 個thread 的話,那SM 就只能容納3 個block。不過如果一個block 只有64 個thread 的話,SM 可以容納的block 不會是12 個,而是他本身的數量限制的8 個。

因此在Compute Capability 1.0/1.1的硬體上,決定block大小的時候,最好讓裡面的thread數目是warp數量(32)的倍數(可以的話,是64的倍數會更好);而在一個SM裡,最好也要同時存在複數個block。如果再希望能滿足最多24個warp的情形下,block裡的thread數目似乎會是96(一個SM中有8個block)、128(一個SM中有6個block)、192(一個SM中有4個block)、256(一個SM中有3個block)這些數字了~ 
而官方的建議則是一個block裡至少要有64個thread,192或256個也是通常比較合適的數字(請參考Programming Guide) 。

但是是否這些數字就是最合適的呢?其實也不盡然。因為實際上,一個SM 可以允許的block 數量,還要另外考慮到他所用到SM 的資源:shared memory、registers 等。在G80 中,每個SM 有16KB 的shared memory 和8192 個register。而在同一個SM 裡的block 和thread,則要共用這些資源;如果資源不夠多個block 使用的話,那CUDA 就會減少Block 的量,來讓資源夠用。在這種情形下,也會因此讓SM 的thread 數量變少,而不到最多的768 個。

比如說如果一個thread 要用到16 個register 的話(在kernel 中宣告的變數),那一個SM 的8192 個register 實際上只能讓512 個thread 來使用;而如果一個thread 要用32 個register,那一個SM 就只能有256 個thread 了~而shared memory 由於是thread block 共用的,因此變成是要看一個block 要用多少的shread memory、一個SM 的16KB 能分給多少個block 了。

所以雖然說當一個SM裡的thread越多時,越能隱藏latency,但是也會讓每個thread能使用的資源更少因此,這點也就是在最佳化時要做取捨的了。

轉自:

http://kheresy.wordpress.com/2008/07/09/cuda-%E7%9A%84-threading%EF%BC%9Ablock-%E5%92%8C-grid-%E7%9A%84%E8%A8%AD%E5%AE%9A%E8%88%87-warp/

相關推薦

平行計算-CUDA開發CUDA軟體架構Nvidia硬體對應關係

硬體基本架構 實際上在nVidia的GPU裡,最基本的處理單元是所謂的SP(Streaming Processor),而一顆nVidia的GPU裡,會有非常多的SP可以同時做計算;而數個SP會在附加一些其他單元,一起組成一個SM(Streaming Multiprocessor)。幾個SM則會在組成所

IOS 開發學習37 的Architectureiphone版本對應關係

簡介 Arm是處理器是移動裝置上佔用率最大的處理器。 armv6、armv7、armv7s、arm64都是arm處理器的指令集。通常指令是向下相容的。在模擬器執行時,iOS模擬器執行的是x86指令集。只有在真機上,才會對執行arm指令集。 如果出現錯

平行計算-CUDA開發淺談GPU平行計算新趨勢

 隨著GPU的可程式設計性不斷增強,GPU的應用能力已經遠遠超出了圖形渲染任務,利用GPU完成通用計算的研究逐漸活躍起來,將GPU用於圖形渲染以外領域的計算成為GPGPU(General Purpose computing on graphics proces

平行計算-CUDA開發FPGA 設計者應該學習 OpenCL及愛上OpenCL的十個理由

作為OpenCL CodeBench的開發者,Amdahl軟體公司始終堅信OpenCL能夠帶來巨大的利益,也從未懷疑過OpenCL標準的成功性。現在人們對計算效能的要求越來越高,在不超過發熱量和功耗的限制範圍,我們相信多核和多核系統提供了一個可行的解決方法。對於OpenCL使用者來說,OpenCL標準的優

平行計算-CUDA開發OpenACCOpenHMPP

在西雅圖超級計算大會(SC11)上釋出了新的基於指令的加速器並行程式設計標準,既OpenACC。這個開發標準的目的是讓更多的程式設計人員可以用到GPU計算,同時計算結果可以跨加速器使用,甚至能用在多核CPU上。出於顯而易見的原因,NVIDIA在大力推廣和支援OpenACC。

平行計算-CUDA開發從零開始學習OpenCL開發(一)架構

本文將作為我《從零開始做OpenCL開發》系列文章的第一篇。 1 異構計算、GPGPU與OpenCL   OpenCL是當前一個通用的由很多公司和組織共同發起的多CPU\GPU\其他晶片 異構計算(heterogeneous)的標準,它是跨平臺的。旨在充分利用G

計算機視覺平行計算CUDA開發GPU硬解碼---CUVID

問題描述:專案中,需要對高清監控視訊分析處理,經測試,其解碼過程所佔CPU資源較多,導致整個系統處理效率不高,解碼成為系統的瓶頸。 解決思路: 利用GPU解碼高清視訊,降低解碼所佔用CPU資源,加速解碼過程。 一、OpenCV中的硬解碼 OpenCV2.4.6中,

平行計算-CUDA開發GPGPU OpenCL/CUDA 高效能程式設計的10大注意事項

1.展開迴圈 如果提前知道了迴圈的次數,可以進行迴圈展開,這樣省去了迴圈條件的比較次數。但是同時也不能使得kernel程式碼太大。   迴圈展開程式碼例子: 1 #include<iostream> 2 using namespace std; 3 4 int main(){

ARM-Linux開發CUDA開發視訊開發關於Linux下利用GPU對視訊進行硬體加速轉碼的方案

最近一直在研究Linux下利用GPU進行硬體加速轉碼的方案,折騰了很久,至今沒有找到比較理想的硬加速轉碼方案。似乎網上討論這一方案的文章也特別少,這個過程中也進行了各種嘗試,遇到很多具體問題,以下便對之前所作的一些工作做一些總結和分享,省的時間長了自己也忘記了,也希望後來

CUDA開發Thrust庫

Thrust庫從C++的STL中得到靈感,將最簡單的類似於STL的結構放在Thrust庫中,比如STL中的vector。此外,Thrust庫還包含STL中的演算法和迭代器。         Thrust函式庫提供了兩個向量容器,分別為主機和裝置提供了向量類並且分別駐留在

Windows 10 應用開發使用x:Bind標記動態獲得計算結果

ash 進行 reg tps 屬性綁定 使用 例子 應用 處理 UWP 在傳統(WPF)的Binding標記上引入了 Bind 標記,Bind 基於編譯階段生成,因而具有較高的性能。但是,你得註意,這個性能上的優化是免去了運行階段動態綁定的開銷,這是不包括數據源的體積的。要

平行計算字首和並行思路

一.定義 如果給定一個數列a[n],令S[k] = a[0]+a[1]+…+a[k],(k = 0, 1, 2…n-1),數列S[k]即為數列a[n]的字首和。 二.序列演算法 很容易就能想到序列的演算法: S[0] = a[0]; for (int i

平行計算用MPI進行分散式記憶體程式設計(二)

 通過上一篇中,知道了基本的MPI編寫並行程式,最後的例子中,讓使用0號程序做全域性的求和的所有工作,而其他的程序卻都不工作,這種方式也許是某種特定情況下的方案,但明顯不是最好的方案。舉個例子,如果我們讓偶數號的程序負責收集求和的工作,情況會怎麼樣?如下圖:  

平行計算Bitonic Sort(雙調排序)基礎

雙調序列 雙調序列(Bitonic Sequence)是指由一個非嚴格增序列X和非嚴格減序列Y構成的序列,比如序列(23,10,8,3,5,7,11,78)。 定義:一個序列a1,a2,…,an是雙調序列(Bitonic Sequence),如果: (1)

Python平行計算Python 多核平行計算

以前寫點小程式其實根本不在乎並行,單核跑跑也沒什麼問題,而且我的電腦也只有雙核四個超執行緒(下面就統稱核好了),覺得去折騰並行沒啥意義(除非在做IO密集型任務)。然後自從用上了32核128GB記憶體,看到 htop 裡面一堆空載的核,很自然地就會想這個並行必須去折騰一下。後面發現,其實 Python 的並行真

Windows 10 應用開發跟隨系統主題顏色

tex 線程 align tro 都是 顏色 stroke object 截圖 有些時候,希望應用程序中的某些顏色可以與系統的主題顏色相同,並且當系統主題色改變時進行同步。 實現過程並不復雜,主要用到 UISettings 類,它公開一個 GetColorValue 方法

Windows 10 應用開發使用快捷訪問鍵

width object block 菜單項 miss await 觸控 程序 應用 UWP 雖然主要面向觸控操作,但 Windows 設備是萬能工具,不用手指不用筆的時候,也可能會接上鍵盤耍耍。因此,給應用界面上的一些元素弄個快捷訪問鍵也挺不錯的。為了使用 Windows

雲安全同態加密_調研分析(6)計算及雲安全主流體系架構模型——By Me

不同的 同態 示意圖 提供者 nis 管理 ati 分享 style 雲計算及雲安全的主流體系架構與模型 1. 雲計算主流安全參考模型 1.1 雲計算安全參考模型

高德地圖開發---簡單介紹

pat 人員 4.2 服務 登錄 .com con 高德 搜索服務 高德地圖 Android SDK 能夠為 Android 應用開發人員提供互動的、功能豐富的 Android 手機地圖。 將地圖顯示功能與搜索服務、定位服務分別封裝為三個類庫。每一個類庫不相互

Win 10 應用開發UI Composition 劄記(三): XAML 集成

單獨使用 切換 column gif 頂部 tel border 靜態 ons 除了 DirectX 遊戲開發,我們一般很少單獨使用 UI Composition ,因此,與 XAML 互動並集成是必然結果。這樣能夠把兩者的優勢混合使用,讓UI布局能夠更靈活。 說到與 X