有很多关于试图让NVCC使用intel编译器的问题。它没有用,我明白了。
人们给出的最常见的答案是使用NVCC / cl.exe将设备代码编译到库中,然后单独编译主机代码并链接它们。我试图这样做,但我无处可去。
在VS2012中,我创建了一个包含2个项目的解决方案 - 一个是CUDA,另一个是控制台应用程序。
我已经将使用VS2012编译的CUDA项目设置为静态库。它没有问题。
我已将控制台应用程序设置为intel 14.0并编译为exe。我还添加了正确的路径"附加库依赖"并通过"附加依赖"告诉编译器有关CUDA库的信息。 (我也告诉过它cudart_static.lib)。
还设置构建依赖项以首先编译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编译,我就没有问题。
操作系统 - Windows 7 64位(但32位应用程序)
平台 - VS2012
Cuda Toolkit - 6.0
Cuda Compute Version - 5.0(并按此编译)
所以,我只是在浪费时间或是否有一些我想念的东西?我似乎已经完成了一百个帖子,但我还没有看到一个成功。很多人急于告诉你这是你应该做的,但没有人告诉你该怎么做!
答案 0 :(得分:2)
对于那些使用Windows并尝试让CUDA和intel编译器进行合作的人,请参阅我关于如何设置解决方案的初步问题。
为了让它工作,根据Roger Dahl的建议,我将CUDA项目更改为DLL。
这涉及以下修改:
将CUDA项目更改为dll
将__declspec(dllexport)添加到CUDA包装函数
将控制台链接器指向DLL库文件
这有效,我现在能够利用所有英特尔编译器优化。
但请注意,我确实需要将intel编译器设置为仅执行单个文件IPO。多文件IPO会导致错误,这在某种程度上是预期的。
希望这可以帮助其他人在同一条船上。