前言
並行就是讓計算中相同或不同階段的各個處理同時進行。
目前有很多種實現並行的手段,如多核處理器,分散式系統等,而本專題的文章將主要介紹使用 GPU 實現並行的方法。
參考本專題文章前請務必搭建好 CUDA 開發平臺,搭建方法可以參考上一篇文章。
GPU 並行的優缺點
優點:
1. 視訊記憶體具有更大的記憶體頻寬
2. GPU 具有更大量的執行單元
3. 價格低廉
缺點:
1. 對於不能高度並行化的工作,能帶來幫助不大。
2. 對於絕大多數顯示卡型號,CUDA 僅支援 float 型別而不支援 double 型別運算,因此運算精度不高。
3. 目前還沒有出現通用的 GPU 並行程式設計標準。
4. 處理前需要先將資料傳輸進視訊記憶體,增加了一些時間開銷。
5. 需要特定顯示卡型號(英偉達)的支援
較之 CPU ,GPU 適合一次性進行大量相同的工作,而 CPU 則比較有彈性,能同時進行變化較多的工作。
CUDA 結構
CUDA 是一種底層庫,比 C/C++ 等語言以及 Open CV 之類的庫更加底層,是附加在作業系統和這類程式之間的一層:
CUDA 程式架構
CUDA 架構下,程式分成兩個部分:host 端和 device 端,前者在 CPU 部分執行,後者是在 GPU 部分執行。
具體的 CUDA 程式執行過程如下:
1. host 端程式先將待處理資料傳遞進視訊記憶體
2. GPU 執行 device 端程式
3. host 端程式將結果從視訊記憶體取回
如下圖所示:
CUDA thread 架構
thread 架構分成三個等級:
1. 執行的最小單元是 thread
2. 多個 thread 可以組成一個 block,block 中的 thread 可並行執行且可存取同一塊共享的視訊記憶體。但要注意的是每個 block 中的 thread 是有數量限制的。
3. 多個 block 可以組成一個 grid,但 grid 中的 block 無法共享視訊記憶體( 只能共享些別的資訊 ),因此可合作度並不高。
如下圖所示:
CUDA 程式執行模式
1. CUDA 程式利用並行化來替代記憶體 cache,即一個 thread 需要等待記憶體則 GPU 會切換到另一個 thread 執行。
2. CUDA 程式對於 "分支預處理" 的實現也是採用和 1 類似的方式。
小結
本文旨在對CUDA並行程式設計技術做一個感性而總體的介紹,該系列後續文章將具體講解CUDA程式設計技術。