close

最近在研究nVidia CUDA剛好在PTT VideoCard板上,看到有人很專業的的分享程式設計心得

本文已徵求作者同意將轉錄在自己的blog做成筆記

//本文轉錄自 VideoCard 看板
//作者:a5000ml

[引言]

從軟體設計角度來看,CUDA 寫作並不困難,困難之處在於如何最佳化,它需要了解不少硬體的細節。一般而言未最佳化的程式,在 GPGPU 上面執行,可以比傳統的 CPU 快上 5~10 倍,而最佳化過的程式,往往還能再增速 5~10 倍,達到 25~100 倍的效能。

CUDA 和傳統 C++ 最大的差異在於「平行化的程式設計」vs.「序列化的程式設計」,例如傳統上透過迴圈執行數千次的程式碼,在 CUDA 上就可以將它拆解成數百個同時執行的執行緒,每個執行緒只執行十幾次而己,因此產生數十到數百倍的效能。

CUDA 是在傳統 C++ 的基礎上,加入一些延伸語法,以及輔助的函式庫,而形成的一種程式語言,一般而言只要熟悉 C 或 C++,就很容易上手 (可能比 Java 容易上手,因為傳統 C/C++ 的函式庫都可以用),編譯好的程式碼,也可以跟其它語言做不錯的聯結。

在接下來幾篇文章中,我們從簡單的軟體設計角度開始,介紹 CUDA 如何寫作,逐漸帶出硬體細節,然後介紹最佳化的一些技術。

[第一章]CUDA程式如何執行

● 名詞 ●

主機 (host)  :插顯示卡那台PC。
裝置 (device):顯示卡。
核心 (kernel):在顯示卡上執行的程式碼區段。


● 執行流程 ●

因為 GPGPU 屬於外部裝置(device),其機器指令有別於傳統 CPU,所以程式核心(kernel) 必須經過特殊編譯後,在執行時期和所需的
資料由主機(host)送到裝置中,並在執行完成後,
將結果資料傳回主機,流程如下。




      主機(host)  PC                                                                           裝置(device)  顯示卡


                                         傳送資料到顯示卡記憶體中
(1) 主機記憶體 ------------------------------
------------>> 顯示卡記憶體


                                         傳送程式碼(kernel)到顯示卡
(2) 主機記憶體 ------------------------------
------------>> 顯示卡記憶體


(3) 主機做其它的事 or 閒置                                   執行顯示卡中的程式(kernel)


                                                        傳回執行結果
(4) 主機記憶體 <<----------------------------
-------------- 顯示卡記憶體



實際上,CUDA 提供了很多 API 簡化這些流程,包括記憶體在兩者間的搬移,
顯示卡記憶體的配置與釋放,kernel 設定、啟動與同步
等,所以上面的每一個步驟其實就是去叫用CUDA的函式而已。


● 編譯流程 ●

簡易的編譯流程如下,只要先準備好副檔名為 .cu 的 CUDA 程式碼檔案,然後使用CUDA的編譯器 (nvcc) 來編譯即可,進階的編譯流程
以後再介紹。


                        nvcc
   .cu 檔案  ----------> 可執行檔 or 目的檔


其中 .cu 檔案可以同時包含在 host 中執行的傳統 C++ 程式碼,以及在 GPGPU 中執行的 kernel 程式碼。


[名詞解釋]

(1) GPGPU (General purpose graphics processing units) 泛用圖形處理晶片
(2) host 主機:指插上顯示卡的那台機器。
(3) device 裝置:主機之外的其它單元,在這裡指顯示卡。
(4) kernel 核心:在GPGPU中執行的程式碼區段。
(5) API (Application Programming Interface) 程式設計介面,就是一組函式庫。
(6) nvcc : CUDA 的compiler,可到 nVidia 的官網免費下載 http://www.nvidia.com/object/cuda_get.html
(7) .cu 檔案:CUDA的程式碼檔案,基本上是 .cpp 檔案的延伸,除了傳統C++程式碼之外,
亦可包含kernel程式碼,透過 nvcc 編譯成目的檔或可執行檔。

[後續章節]

[第二章] CUDA 安裝
[第三章] 簡易 kernel 寫作
[第四章] CUDA 的記憶體分類
[第五章] CUDA 的函式種類

.. (可能還會調整)

[補充]

相關CUDA website

1. nVidia CUDA Zone
2. CUDAer
3. Heresy
4. Hotball

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 philip 的頭像
    philip

    Philippe's Expérience Note

    philip 發表在 痞客邦 留言(0) 人氣()