告诉NVCC不要预处理主机代码以避免重新定义BOOST_COMPILER

时间:2012-07-18 12:04:34

标签: boost cuda nvcc

我有一个包含主机和设备代码的.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文件中包含include和设备代码分别知道的主机代码的原因。

1 个答案:

答案 0 :(得分:2)

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

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