前言
並行就是讓計算中相同或不同階段的各個處理同時進行。
目前有很多種實現並行的手段,如多核處理器,分布式系統等,而本專題的文章將主要介紹使用 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編程技術。