2

我有一个包含主机和设备代码的 .cu 文件:

// device code
__global__ void
myKernel() { ... }

// host code
#include <boost/thread/mutex.hpp>

boost::mutex myMutex;

int main() { ... }

如您所见,我包含了 boost 的互斥锁功能。当我编译文件时,由于以下警告而出现错误:

warning C4005: 'BOOST_COMPILER': Macro-Redefinition c:\boost\include\boost-1_49_0\boost\config\compiler\visualc.hpp

所以我假设 nvcc 处理设备代码和主机代码的所有预处理。我是对的,如果是的话,我怎样才能避免这种情况并将预处理传递给 cl.exe(MSVC 2010,Win7)?

我已经尝试将主机代码放在单独的 hpp/cpp 文件中,并将该文件包含在 cu 文件中 - 同样的问题。在主机代码中,我定义了一个将在设备代码中使用的表面参考。所以这就是我需要在 cu 文件和主机代码中包含设备代码分别知道的原因。

4

1 回答 1

2

这是nvcc(技术上cudafe,我认为)的一个已知限制。nvcc 使用文件扩展名来确定是否应该为设备代码处理给定的源文件或传递给 CUDA 预处理器,然后传递给设备编译器。该编译轨迹无法正确解析 boost 包含的一些非常复杂的声明,因此编译失败。

解决方案是不要在.cu文件中导入 boost 标头。将您的主机升压代码放在一个.cc文件中,设备代码和内核启动在一个单独的文件中,并制作一些瘦包装器以从该文件.cu访问内核调用。.cc您仍然可以将所有源代码传递nvcc给编译,但是将 boost 导入与设备代码分开可以消除前端在 boost 声明中阻塞的问题。

于 2012-07-18T13:26:53.993 回答