我有一个包含主机和设备代码的.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和设备代码分别知道的主机代码的原因。
答案 0 :(得分:2)
这是nvcc
的已知限制(技术上cudafe
,我认为)。 nvcc使用文件扩展名来确定是否应该为设备代码处理给定的源文件,还是将其传递给CUDA预处理器,然后传递给设备编译器。该编译轨迹无法正确解析boost包含的一些非常复杂的声明,并且编译失败。
解决方案是不在.cu
文件中导入boost标头。将主机增强代码放在.cc
文件中,设备代码和内核启动在单独的.cu
文件中,并制作一些瘦包装器以访问.cc
文件中的内核调用。您仍然可以将所有源代码传递给nvcc
进行编译,但将boost导入与设备代码分开可以消除前端阻塞boost声明的问题。