第二篇:CUDA 並行程式設計簡介

穆晨發表於2017-01-19

前言

       並行就是讓計算中相同或不同階段的各個處理同時進行。

       目前有很多種實現並行的手段,如多核處理器,分散式系統等,而本專題的文章將主要介紹使用 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程式設計技術。

相關文章