2014-05-05 36 views
1

試圖讓NVCC使用intel編譯器的問題很多。它不起作用,我明白了。有沒有人實際上得到了NVCC和intel編譯器一起工作?

人們最常見的答案是使用NVCC/cl.exe將設備代碼編譯到庫中,然後單獨編譯主機代碼並將它們鏈接起來。我正在嘗試這個,但我沒有辦法。

在VS2012中,我創建了一個包含2個項目的解決方案 - 一個CUDA,另一個是控制檯應用程序。

我已經將CUDA項目設置爲與VS2012編譯成靜態庫。它編譯沒有問題。

我已經將控制檯應用程序設置爲intel 14.0並編譯爲exe。我還添加了「附加庫依賴關係」的正確路徑,並通過「附加依賴關係」(我還告訴它關於cudart_static.lib)告訴編譯器關於CUDA庫。

構建依賴關係也被設置爲首先編譯CUDA項目。

但是,這種設置是不好的。給我一個錯誤甚至是谷歌在一個損失:

Error 5 error MSB4057: The target "ComputeLegacyManifestEmbedding" does not exist in the project. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Platforms\Win32\PlatformToolsets\Intel C++ Compiler XE 14.0\Toolset.targets 1162 7 rxnCalc_cpp 

要驗證鏈接是好的,如果我設置這兩個項目通過VS2012編譯我沒有得到任何的問題。

OS - Windows 7的64位(32位應用程序雖然)

平臺 - VS2012

CUDA工具包 - 6.0

Cuda的計算版本 - 5.0(並彙編成這樣)

所以,我只是在浪費我的時間,還是有我缺少的東西?看來我已經經歷了一百個帖子,但我還沒有看到一個成功。很多人急於告訴你,這是你應該做的,但沒有人告訴你如何去做!

+0

我會將基於CUDA的庫編譯爲動態庫(DLL)而不是靜態庫。在Windows中,靜態庫不與其依賴關聯,因此,當您將靜態庫鏈接到應用程序時,還必須將應用程序與CUDA鏈接起來,以填充靜態庫對CUDA的依賴關係。如果你創建一個DLL,CUDA對你的應用程序是完全隱藏的。 –

+0

使用DLL工作。不知道爲什麼一個靜態庫不會,我曾告訴編譯器關於CUDA;猜猜它不相信我:) – PointerFail

+1

@PointerFail:你可以添加該解決方案作爲答案?(這是完全可以回答自己的問題)後來,你可以接受這個答案,這將回答未回答的問題列表並通過搜索使具有相同問題的下一個人更容易找到。謝謝 – talonmies

回答

2

對於那些使用windows並試圖讓CUDA和intel編譯器進行合作的人來說,請參閱我最初提出的關於如何設置解決方案的問題。

爲了使其正常工作,按照Roger Dahl的建議,我將CUDA項目更改爲DLL。

這涉及以下修改:

  1. 更改CUDA項目對DLL

  2. 點控制檯連接添加__declspec(dllexport)的CUDA的包裝函數的DLL庫文件

This works and我現在可以利用所有英特爾編譯器優化。

但是,請注意,我確實需要將intel編譯器設置爲僅執行單個文件IPO。多文件IPO將導致錯誤,這是有點期待。

希望這可以幫助他人在同一條船上。

+0

感謝您將此添加爲答案 – talonmies

相關問題