在之前已經有寫一篇《使用 Visual Studio 2005 撰寫 CUDA 程式》了~不過裡面提到的專案建置的方法,是用官方 template 這個專案來修改的方法。而在該文中,Heresy 也有提到,在 nVidia 的 CUDA Forum 中,有一些針對編譯規則的相關討論,也有人有寫出自己的 CUDA 程式編譯規則(請參考《Simple CUDA build rule for Visual Studio 2005》)。
當時 Heresy 因為不熟悉 Visual Studio 2005 的編譯規則設定,所以其實搞了好久都沒有成功過,後來只好作罷…不過,今天在網友的建議下,又試了一下,似乎出來了一些結果了?在這邊大概記錄一下。
在 VisualStudio 中加入規則
首先,建置規則(build rule)是可以設定成跟著 Visual Studio 整體走的,而設定的方法,其實也只是設定檔案所在的路徑。其設定方法如下:
而其實在 CUDA SDK 的目錄中,就有提供了一個官方的 build rule,位於「C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\scripts」底下,檔名是「nvcc.rules」。(安裝 CUDA SDK 會不會自動把這個目錄加到 VisualStduio 的設定裡 Heresy 到是忘了)
不過 Heresy 使用這個 rule 似乎沒辦法正確編譯;所以 Heresy 是改用《Simple CUDA build rule for Visual Studio 2005》的 rule。
設定專案使用的 build rule
在 Visual Studio 中加入 build rule 了後,Visual Studio 就會知道這些有輸入的規則了。不過在建立專案後,還是要再去指定這個專案要用哪些 rule。設定的方法,大概如下:
以上圖的例子來說,有兩個 *.cu 的建置規則。其中第一個「CudaCompile」是 nVidia CUDA SDK 提供的;而「CUDA」這一項,則是《Simple CUDA build rule for Visual Studio 2005》這篇文章中所提供的規則。Heresy 在這邊是選擇使用「CUDA」這個規則。
設定 CUDA 編譯選項
在經過上面的設定後,在專案的屬性裡(選取專案後,按右鍵,選「Properties」),應該會多一項「CUDA」的設定項目。
裡面有一些基本的設定,包含一般編譯器的,或者 CUDA 的;像如果要啟用 CUDA 的模擬功能來 debug 的話,就可以把 [CUDA-Specific] 的 [Emulation] 設定成 [Yes]。這點在 CUDA SDK 的 template 是設定成專案的 configuration,其實比較方便切換。
而在加入 .cu 的檔案後,在檔案上按右鍵,選「Properties」的話,應該要可以看到他「General」裡的「Tool」是出現「CUDA」的選項(下圖);這樣的話,應該就算是成功了!
不過另外一個要注意的是,《Simple CUDA build rule for Visual Studio 2005》這篇文章裡所提供的 Build rule 似乎只能處理在專案路徑下的檔案;也就是說 .cu 檔必須要和 .vcproj 在一起才能正常編譯,不然可能會出現找不到檔案的情形。
而由於 build rule 輸出的 obj 檔名應該沒有經過特殊的處理,所以建議不要有檔名相同,只有附檔名不同的情形(例如 a.cu, a.cpp) ;在這種情況下,有可能會因為輸出的物件檔名相同(都是 a.obj),而導致檔案備覆蓋掉,因此無法完成程式的編譯。
其他一般性設定
CUDA 還有一些比較一般性的設定,包括專案屬性裡:
- 「C/C++」-「General」的「Additional Include Directories」中要加「$(CUDA_INC_PATH)」
- 「Linker」-「General」的「Additional Library Directories」要加入「$(CUDA_LIB_PATH)」
- 「Linker」-「Input」的「Additional Dependencies」要視需要加入 CUDA 的 .lib 檔;一般應該至少要加入「cudart.lib」(吧?)。
用 Visual Studio 2005 建立新的 CUDA 專案的方法,大致上應該就是這樣子吧?Heresy 當初搞了好幾天都沒玩出來,現在想想,搞不好是因為檔案路徑的關係…總之,現在大概知道是這樣弄了,也希望不要有其他問題了。
[…] VisualStudio 的設定部分,他和 Heresy 所提的使用 nVidia Template 或使用網路上的 Build Rule 的方法不同,是直接去設定 .cu 檔的「Custom Build […]
讚讚
[…] Pingback: 使用 Visual Studio 2005 建立新 CUDA 專案 « Heresy's Space […]
讚讚
开勇的CUDA_VS_Wizard蛮好用的装好之后,直接打开里面的工程cuda-win32-app-msvc2005.sln,再添加.cu文件,比如里面自带的sample.cu,编译成功了。1>—— 已启动生成: 项目: cuda-win32-app-msvc2005, 配置: Debug Win32 ——1>Compiling…1>sample.cu1>tmpxft_000015c8_00000000-3_sample.cudafe1.gpu1>tmpxft_000015c8_00000000-8_sample.cudafe2.gpu1>sample.cu1>tmpxft_000015c8_00000000-3_sample.cudafe1.cpp1>tmpxft_000015c8_00000000-13_sample.ii…1>cuda-win32-app-msvc2005 – 0 个错误,1 个警告========== 生成: 1 已成功, 0 已失败, 0 最新, 0 已跳过 ==========
讚讚
設定方法是相同的。
或許是新版 CUDA 有又做了修改,或是當初 Heresy 沒弄好吧
讚讚
我使用nvidia提供的nvcc.rules成功编译过了。其实还蛮简单的,首先就是,工程右键菜单->custom build rules->find existing…加入C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\scripts\nvcc.rules。之后会提示你在tools的options中加入rules文件的路径,确定。出来时记得在cuda_compile前面打上勾。然后就是设置linker,No (/INCREMENTAL:NO),附加库路径 $(CUDA_LIB_PATH),以及连接库如 cudart.lib等。然后就成功编译了。如下是编译信息:1>—— Rebuild All started: Project: cuda6, Configuration: Debug Win32 ——1>Deleting intermediate and output files for project ‘cuda6’, configuration ‘Debug|Win32’1>NVCC Compiling…1>kernel.cu1>tmpxft_00000d64_00000000-3_kernel.cudafe1.gpu1>tmpxft_00000d64_00000000-8_kernel.cudafe2.gpu1>tmpxft_00000d64_00000000-3_kernel.cudafe1.cpp1>tmpxft_00000d64_00000000-12_kernel.ii1>c:\cuda\include\math_functions.h(3675) : warning C4996: ‘hypot’ was declared deprecated1> c:\cuda\include\math_functions.h(299) : see declaration of ‘hypot’1> Message: ‘The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _hypot. See online help for details.’1>Linking…1>Embedding manifest…1>Build log was saved at "file://e:\Visual Studio 2005\Projects\cuda3\cuda6\Debug\BuildLog.htm"1>cuda6 – 0 error(s), 1 warning(s)========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
讚讚
不知道你是哪些東西 link 不到?
讚讚
謝謝 不過我還是沒試出來 @@"
讚讚
Heresy 知道有這東西,但是沒有去用過。
不過,link 上的 error,一般就都是該 input 的 lib 造成沒有正確指定,或是 .cu 沒有正確編譯造成的了~
讚讚
hello!!
我想請問一下
不知Heresy有沒有使用過這個wizard:
http://forums.nvidia.com/index.php?s=b06c75d38f8342e30e60aa88a9b7270a&showtopic=65111&st=0
國外的網友都回應說這很好用
不過我光用他加入您提供的VectorAdd原始碼
就會有linking上的error
試了很多方法還是出現相同的error
不知道是什麼原因?
讚讚
Heresy 的做法是先建立好一個 main.cu 的檔案,再把他加到 VisualStudio 裡。
讚讚