2009年5月22日 星期五

CUDA 初體驗

聽說其實不算太小的小馬,現在常常花納稅人的錢跑長庚上課兼把妹,姑且不論他把妹的技巧火侯,其實他主要的目的,就是學習一個 nVIDIA 大魔王玩的新(其實也不太新)的賺錢把戲,名喚做 CUDA。

簡單地說,這東西就是可以將資料丟給將運算能力變態的 GPU 運算,大幅降低 CPU 的負荷,而且 GPU 本身就是 3D 運算起家,算算小學數學大概沒什麼感覺,但是丟給它平行運算與一堆有的沒有的高等數學,情況可就不一樣了。

這天馬公推薦我玩它的 SDK,要我把玩把玩。這東西在 Linux 之上使毫無意外是採用 gcc 編譯的,在 Win32 環境也毫無意外是採用 VC++ 編譯的,於是就有了一個想法:Win32 下頭能不能用 gcc 玩 CUDA SDK 呢?

我按照官方說明安裝了 Tool Kit  與 SDK,然後開啟 Visual C++ 的命令列視窗(有設定編譯路徑,跟系統附設的 CMD 環境不太一樣)順利使用 nvcc + VC++ 來編譯,好,確定可以跑了,而且我發現 nvcc 不單如官方手冊所說,吃 c 程式碼,C++ 程式碼也很 ok,至少我用 cout 與 cin 還沒出包。:)

然後繼續打開 MSYS 與 MinGW(Cygwin 個人很不適應,太機車了),開始設定奮戰,結果終於讓它開始編譯了,這一編才明白,CUDA SDK 底層其實使用了大量 VC++ 的巨集與定義,要讓 gcc 順利移過來,應該是系統級的工程了,或許該考慮拿 Linux 上頭的 Source Code 過來,看能不能在 Cygwin 或 MSYS 上頭順利編過去,不詳,也沒力氣了。

官方手冊就特別交待 win32 版本 gcc 不支援了,硬是要幹。

如果不介意跟路徑奮戰的話,Eclipse 與 Netbeans 確實可以設定編譯器為 CL.exe,理論上應該也是可以取代 Visual Studio 來編譯 CUDA 程式。

好費事。

那麼,CUDA 能不能進 Visual Studio 2008?官方說是可以的,我按照官方的作法,開啟 SDK 中的 template 專案,刪除程式碼作為骨架,確實是可行的。不過我這個人習慣得寸進尺,下一步就是,能不能直接產生 CUDA 的專案?

有關於專案這部份,網路上多數的資料都是 for Visual Studio 2005,2008 的說明不多,幾番奮戰下來,總算是設定成功,編過第一支 Hello Cuda。不過,網路上有幾位大德,很熱心開發了 Simple VS Project Wizard for CUDA,熬了半天夜,人家有現成又完整的,當然要抓來玩,2.0 版本直接支援 Visual Studio 2008,挺不錯,可以編出 .cu 檔案,也可以編出 .dll ,還有四種編譯設定,算是相當完整的環境。

不過這玩意裝下去還是要修改一下的,首先是編譯器的 WP64 要關閉,不然 CL.exe 與 nvcc 會發出一堆警告,雖不礙事,但挺礙眼。第二是關鍵字著色,CUDA SDK 中有附上 Usertype.dat 可供 VS 2005 之前版本使用,2008?不好意思,欠。第三是有關於 SDK 中 cutil.dll 的設定,有些人會用到,有些人不會,如果會用到的就沒事,Wizard 已經設定好了,SDK  中多數範例也都有用到,但用不到的人可能會覺得很機車,寫個程式還要多帶一個沒用的 cutil.dll 到處跑,不帶還不給跑,實在礙事,所以如果真的不需要它,記得要將專案設定中的 cutil 設定取消。

關於顏色,所以我是將 .cu 檔案設定參照 C++ 關鍵字,再怎麼不濟,也比沒有好。

這樣一個開發環境大約算是成功了,不過對於 CUDA 只能用 C/C++ 開發這件事情,我始終耿耿於懷,Wizard 上有 DLL 專案的選項,難不成……哈!果然可以,我試圖使用 C# 呼叫外部 DLL ,這回成功了,這代表 CUDA 雖然得用 C/C++ 來撰寫,起碼可以被外部呼叫了,如果使用的開發語言可以支援 DLL,如 C# 或 VB,那麼 CUDA 的資源應該也可以被順利納入。

Java 我不很熟,不過聽說有個東西叫做 JNI,或許可以透過它呼叫 DLL來使用 CUDA 的功能。

沒有留言: