告诉NVCC不要预处理主机代码,以避免重新定义BOOST_编译器

告诉NVCC不要预处理主机代码,以避免重新定义BOOST_编译器,boost,cuda,nvcc,Boost,Cuda,Nvcc,我有一个包含主机和设备代码的.cu文件: // device code __global__ void myKernel() { ... } // host code #include <boost/thread/mutex.hpp> boost::mutex myMutex; int main() { ... } 因此,我假设nvcc处理设备和主机代码的所有预处理。我是对的吗?如果是,我如何避免这种情况,并将预处理传递给cl.exe(MSVC 2010,Win7) 我已经尝

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

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

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

boost::mutex myMutex;

int main() { ... }
因此,我假设nvcc处理设备和主机代码的所有预处理。我是对的吗?如果是,我如何避免这种情况,并将预处理传递给cl.exe(MSVC 2010,Win7)


我已经尝试将主机代码放在一个单独的hpp/cpp文件中,并将此文件包含在cu文件中-同样的问题。在主机代码中,我定义了一个将在设备代码中使用的曲面引用。因此,这就是为什么我需要在cu文件中包含一个include,并且主机代码分别由设备代码知道。

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


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

谢谢,这回答了我的问题!我有一个与曲面引用相关的问题:我将在主机代码(.cc文件)中调用cudaBindSurfaceToArray,并将其与内核(.cu文件)中的surf3Dread一起使用。我怎样才能分享这个参考资料?我只能在设备代码中定义曲面,但在主机代码中无法使用它。如果在.cu文件中包含定义曲面引用的.hpp文件,则会再次出现BOOST错误。。。
warning C4005: 'BOOST_COMPILER': Macro-Redefinition c:\boost\include\boost-1_49_0\boost\config\compiler\visualc.hpp