有没有人真的让 NVCC 和英特尔编译器一起工作?

Posted

技术标签:

【中文标题】有没有人真的让 NVCC 和英特尔编译器一起工作?【英文标题】:Has Anyone Actually gotten NVCC and the intel compiler to work together? 【发布时间】:2014-05-05 02:49:34 【问题描述】:

关于试图让 NVCC 使用英特尔编译器的问题很多。这不工作,我明白了。

人们给出的最常见的答案是使用 NVCC/cl.exe 将设备代码编译成库,然后单独编译主机代码并链接它们。我正在尝试这个,但无处可去。

在 VS2012 中,我创建了一个包含 2 个项目的解决方案 - 一个 CUDA,另一个是控制台应用程序。

我已将 CUDA 项目设置为使用 VS2012 编译成静态库。编译没问题。

我已将控制台应用程序设置为 intel 14.0 并编译为 exe。我还添加了“附加库依赖项”的正确路径,并通过“附加依赖项”告诉了编译器关于 CUDA 库的信息(我还告诉了它关于 cudart_static.lib 的信息)。

Build依赖也设置为先编译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 工具包 - 6.0

Cuda Compute 版本 - 5.0(并按原样编译)

那么,我只是在浪费我的时间还是我错过了什么?似乎我已经经历了一百个帖子,但我还没有看到一个成功。很多人急于告诉你这是你应该做的,但没有人告诉你怎么做!

【问题讨论】:

我会将基于 CUDA 的库编译为动态库 (DLL) 而不是静态库。在 Windows 中,静态库不与其依赖项链接,因此当您将静态库链接到您的应用程序时,您还必须将您的应用程序与 CUDA 链接,以填充静态库对 CUDA 的依赖项。如果您创建 DLL,则 CUDA 对您的应用程序完全隐藏。 使用 DLL 有效。不知道为什么静态库不会,我确实告诉编译器关于 CUDA;猜它不相信我:) @PointerFail:您能否将该解决方案添加为答案?(回答您自己的问题完全可以)稍后您可以接受该答案,这会将问题从未回答的问题列表中删除并制作下一个遇到相同问题的人更容易通过搜索找到。谢谢 【参考方案1】:

对于所有使用 Windows 并试图让 CUDA 和英特尔编译器合作的人,请参阅我最初的问题,了解我如何设置解决方案。

为了让它工作,按照 Roger Dahl 的建议,我将 CUDA 项目更改为 DLL。

这涉及以下修改:

    将 CUDA 项目更改为 dll

    将 __declspec(dllexport) 添加到 CUDA 包装函数

    指向 DLL lib 文件的控制台链接器

这行得通,我现在可以利用所有英特尔编译器优化。

但是,请注意,我确实需要将 intel 编译器设置为仅执行单文件 IPO。多文件 IPO 会导致错误,这是意料之中的。

希望这对同一条船上的其他人有所帮助。

【讨论】:

感谢您将此添加为答案

以上是关于有没有人真的让 NVCC 和英特尔编译器一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 cuda-gdb 与使用 nvcc 编译的静态库的 g++ 链接程序一起使用?

为 CPU 编译 cuda 代码

将 std::ref() 与 nvcc 一起使用时,类没有成员“second_argument_type”[重复]

为啥 nvcc 无法使用 boost::spirit 编译 CUDA 文件?

CUDA - nvcc -G - 如果工作不正常

如何使用 GCC 5.1 和 OpenMP 将工作卸载到 Xeon Phi