在前面一篇的《nVidia CUDA 簡介》中,已經大概介紹過 CUDA 的概念了∼接下來,大概來講一下寫 CUDA 程式的方法吧!不過這一篇,應該算是事前準備的前置工作部分就是了。而 Heresy 在這邊,會用 Visual Studio 2005 來當作開發環境。
編譯架構
由於 CUDA 有一部分是 C 語言的延伸,所以要編譯 CUDA 的程式,還需要有 nVidia CUDA 的編譯器:nvcc。
而整個編譯的流程,可以參考右圖(本圖參考 nVidia 在 Siggraph 2007 的 talk 的投影片繪製)。我們將包含 C/C 以及 CUDA 的程式寫好之後,須要透過 nvcc 來進行編譯;nvcc 會把 CUDA 的 GPU 程式的部分,轉換成 PTX code,再經過數到手續,最後變成在 GPU 可以執行的程式。而 CPU 程式的部分,則會保留讓 C/C 的編譯器來編譯。不過,這一部分 Heresy 只是大概在概念上了解,實際運作的過程則比較不清楚。
在 CUDA 提供的 Sample 中,大部分的情形下,都會把 CUDA 的程式集中,寫成一個(或數個)附檔名是 .cu 的檔案;而其他沒有用到 CUDA 的部分,則還是寫成 C 的 .cpp。而在編譯的時候,就只會把 .cu 的檔案丟給 CUDA 的 nvcc 進行編譯,.cpp 的檔案則仍然由 VS 的編譯器來處理。
而由於要另外指定一個 nvcc 在特定的檔案,所以其實在 VisualStudio 的設定,就有一些小麻煩了∼
官方建議:用 template 修改
以 nVidia 官方來說,是建議從 SDK 範例的 template 這個範例來做修改,這樣就可以不用多費勁做其他設定了∼
要這樣做的話,他的說明文件是在「C:Program FilesNVIDIA CorporationNVIDIA CUDA SDKdocCUDA_SDK_release_notes_win32.txt」(根據安裝設定不同,可能在不同地方)。這樣的方法還算滿簡單的,步驟大概如下:
- 將「NVIDIA CUDA SDKprojects emplate」的內容,複製到自己的新專案目錄下,假設專案名稱是「myproject」。
- 修改檔案名稱成自己想要的。
- 修改 *.sln 和 *.vcproj 以及程式檔,把所有的「template」用「myproject」取代。
到此,應該就算成功的把 template 改成 myproject 了;而應該會有 release, debug, emurelease, emudebug 四種建置的方法。其中,「emu」開頭的,代表是用模擬的方法來執行的;也就是說,CUDA 會把 GPU 的程式也編譯成 CPU 的程式,這樣就可以用 Visual Studio 來設定中斷點或 debug 了!不過當然,速度也會非常的慢…
不過,nVidia 官方所有的 Sample Projects 都有使用到 SDK 提供的「CUda UTility Library」(cutil,位於「NVIDIA CUDA SDKcommon」),所以直接根據上面的方法修改,可能會找不到 cutil 的路徑。這時候,就要把專案裡的「../../common/inc」、「../../common/lib」這兩個 cutil 的相對路徑做對硬的修改。另一個方法,就是不要使用 cutil∼因為實際上,這也不是完全必須的;實際上,Heresy 就是採去「不使用 cutil」的方法。
而如果堅持想要開新專案來重頭設定呢?最麻煩的部分,應該會是在編譯規則的部分;在 nVidia 的 CUDA Forum 中,有一些相關的討論,有興趣的可以參考《Simple CUDA build rule for Visual Studio 2005》這篇。不過 Heresy 自己在嘗試了一段時間後,還是沒有成功…最後還是放棄了。
語法的 highlight
由於 nVidia 建議 CUDA 程式的附檔名是用 .cu,所以雖然 CUDA 程式接近是基本的 C 語言,但是 VS 還是不會有語法解析的效果。而要讓 .cu 的程式檔可以和 .c 或 .cpp 一樣,有 highlight 效果的話,可以依照下面的步驟:
- 首先,在 nVidia CUDA SDK 的安裝目錄(一般是在「C:Program FilesNVIDIA CorporationNVIDIA CUDA SDK」)的「docsyntax_highlighting」資料夾裡,有一個 visual_studio_8 的資料夾;裡面的 usertype.dat 這個檔案,就是 nVidia 寫好的語法檔。
- 找到 VS2005 的安裝目錄,一般是在「C:Program FilesMicrosoft Visual Studio 8」;然後,確認底下的「Common7IDE」目錄下,是否已經有 usertype.dat 這個檔案。
有的話,可以把 nVidia 提供的檔案內容附加到 VS 目錄下的檔案裡;沒有的話,直接複製一份過來就可以了。- 開啟 Visual Studio 2005,選擇選單的「Tools」、「Options…」,展開左邊的「Text Editor」那一項,並選擇「File Extension」。接著,在右邊的「Extension」的地方輸入「cu」後,按下「Add」,並按下右腳的「ok」。
- 重新啟動 Visual Studio 2005,就可以看到 .cu 的檔案也有語法 highlight 了∼
不過這樣也只會有語法 highlight 的效果,其他像是自動完成、function 的摺疊功能,仍然是沒有的…