Cuda編程結構《1》

因爲研一的課程裏面有高性能計算這門課,沒辦法,爲了不讓上課成爲苦惱的工作,只能認真學,還好CUDA變成對於我來說也不算陌生,那麼我也記錄下我的學習過程,爲後來的同學鋪墊一下。

   學習編程就必須要知道CUDA程序到底是怎麼一個執行過程。好的,這一節在介紹流之前,先把CUDA程序結構簡要說一下。
CUDA程序文件後綴爲.cu,有些編譯器可能不認識這個後綴的文件,我們可以在VS2008的Tools->Options->Text Editor->File Extension裏添加cu後綴到VC++中。
一個.cu文件內既包含CPU程序(稱爲主機程序),也包含GPU程序(稱爲設備程序)。如何區分主機程序和設備程序?根據聲明,凡是掛有“global”或者“device”前綴的函數,都是在GPU上運行的設備程序,不同的是global設備程序可被主機程序調用,而device設備程序則只能被設備程序調用。
沒有掛任何前綴的函數,都是主機程序。主機程序顯示聲明可以用host前綴。設備程序需要由NVCC進行編譯,而主機程序只需要由主機編譯器(如VS2008中的cl.exe,Linux上的GCC)。主機程序主要完成設備環境初始化,數據傳輸等必備過程,設備程序只負責計算。
主機程序中,有一些“cuda”打頭的函數,這些都是CUDA Runtime API,即運行時函數,主要負責完成設備的初始化、內存分配、內存拷貝等任務。我們編程中會用到的函數   cudaGetDeviceCount(),cudaGetDeviceProperties(),cudaSetDevice()都是運行時API。這些函數的具體參數聲明我們不必一一記下來,拿出第三節的官方利器就可以輕鬆查詢。
流並行:
線程並行爲細粒度的並行,而塊並行爲粗粒度的並行,同時也知道CUDA的線程組織情況,即Grid-Block-Thread結構。一組線程並行處理可以組織爲一個block,而一組block並行處理可以組織爲一個Grid,很自然地想到,Grid只是一個網格,我們是否可以利用多個網格來完成並行處理呢?答案就是利用流。
CUDA中的流用cudaStream_t類型實現,用到的API有以下幾個:cudaStreamCreate(cudaStream_t * s)用於創建流,cudaStreamDestroy(cudaStream_t s)用於銷燬流,cudaStreamSynchronize()用於單個流同步,cudaDeviceSynchronize()用於整個設備上的所有流同步,cudaStreamQuery()用於查詢一個流的任務是否已經完成。具體的含義可以查詢API手冊。
下面我們將VS案例中的任務改用流實現,仍然是{1,2,3,4,5}+{10,20,30,40,50} = {11,22,33,44,55}這個例子:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章