GPU:並行計算利器

http://blog.jobbole.com/87849/javascript

 
 
 
 
 

GPU:並行計算利器

 

1 GPU是什麼

如圖1所示,這臺PC機與普通PC機不一樣的是這裏插了7張顯卡,左下角是顯卡,在中間的就是GPU芯片。顯卡的處理器稱爲圖形處理器(GPU),它是顯卡的「心臟」,與CPU相似,只不過GPU是專爲執行復雜的數學和幾何計算而設計的。css

GPU計算能力很是強悍,舉個例子:如今主流的i7處理器的浮點計算能力是主流的英偉達GPU處理器浮點計算能力的1/12。html

圖1 顯卡與GPU前端

2 爲何GPU計算能力如此強悍?

圖2對CPU與GPU中的邏輯架構進行了對比。其中Control是控制器、ALU算術邏輯單元、Cache是cpu內部緩存、DRAM就是內存。能夠看到GPU設計者將更多的晶體管用做執行單元,而不是像CPU那樣用做複雜的控制單元和緩存。從實際來看,CPU芯片空間的5%是ALU,而GPU空間的40%是ALU。這也是致使GPU計算能力超強的緣由。html5

圖2 cpu和gpu硬件邏輯結構對比java

那有人講了,爲何cpu不像gpu那樣設計呢,這樣計算能力也強悍了!python

爲何?CPU要作得很通用。CPU須要同時很好的支持並行和串行操做,須要很強的通用性來處理各類不一樣的數據類型,同時又要支持複雜通用的邏輯判斷,這樣會引入大量的分支跳轉和中斷的處理。這些都使得CPU的內部結構異常複雜,計算單元的比重被下降了。而GPU面對的則是類型高度統一的、相互無依賴的大規模數據和不須要被打斷的純淨的計算環境。所以GPU的芯片比CPU芯片簡單不少。linux

舉個例子,假設有一堆相同的加減乘除計算任務須要處理,那把這個任務交給一堆(幾十個)小學生就能夠了,這裏小學生相似於GPU的計算單元,而對一些複雜的邏輯推理等問題,好比公式推導、科技文章寫做等高度邏輯化的任務,交給小學生顯然不合適,這時大學教授更適合,這裏的大學教授就是CPU的計算單元了,大學教授固然能處理加減乘除的問題,單個教授計算加減乘除比單個小學生計算速度更快,可是成本顯然高不少。android

3 GPU編程庫

GPU計算能力這麼強,被普遍使用!好比挖礦(比特幣)、圖形圖像處理、數值模擬、機器學習算法訓練等等,那咱們怎麼發揮GPU超強的計算能力呢?—編程!

怎麼進行GPU編程呢?如今GPU形形色色,好比Nvidia、AMD、Intel都推出了本身的GPU,其中最爲流行的就是Nvidia的GPU,其還推出了CUDA並行編程庫。然而每一個GPU生產公司都推出本身的編程庫顯然讓學習成本上升不少,所以蘋果公司就推出了標準OpenCL,說各個生產商都支持個人標準,只要有一套OpenCL的編程庫就能對各種型的GPU芯片適用。固然了,OpenCL作到通用不是沒有代價的,會帶來必定程度的性能損失,在Nvidia的GPU上,CUDA性能明顯比OpenCL高出一大截。目前CUDA和OpenCL是最主流的兩個GPU編程庫。

從編程語言角度看,CUDA和OpenCL都是原生支持C/C++的,其它語言想要訪問還有些麻煩,好比Java,須要經過JNI來訪問CUDA或者OpenCL。基於JNI,現今有各類Java版本的GPU編程庫,好比JCUDA等。另外一種思路就是語言仍是由java來編寫,經過一種工具將java轉換成C。

圖3 GPU編程庫

 

4 CUDA程序流程

圖4 CUDA程序流程

5 實踐—以圖像處理爲例

假設咱們有以下圖像處理任務,給每一個像素值加1。並行方式很簡單,爲每一個像素開一個GPU線程,由其進行加1操做。

圖5 例子

圖6 核函數

圖7 主流程函數

6 GPU加速效果

下圖是我實現的基於CUDA的P&D DEM圖像預處理算法使用GPU的加速效果,GeForce GT 330是塊普通臺式機上的顯卡,如今價格也就500人民幣左右,用它達到了20倍的加速比,Tesla M2075是比較專業的顯卡,價格一萬左右,用它達到了將近百倍的加速比,這個程序i7 CPU單進程單線程要跑2個小時,而用Tesla M2075 GPU只花了一分多鐘就完成計算。

圖8 P&D DEM圖像預處理算法加速效果

附錄(發表的GPU算法相關的SCI論文):多流向算法GPU並行化

相關文章
相關標籤/搜索