我有一个包含主机和设备代码的 .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 文件和主机代码中以便设备代码分别知道的原因。
最佳答案
这是 nvcc
的一个已知限制(我认为从技术上讲是 cudafe
)。 nvcc 使用文件扩展名来确定给定的源文件是否应该针对设备代码进行处理,或者传递给 CUDA 预处理器,然后传递给设备编译器。该编译轨迹无法正确解析 boost 包含的一些非常复杂的声明,因此编译失败。
解决方案是不在 .cu
文件中导入 boost header 。将主机 boost 代码放入 .cc
文件中,将设备代码和内核启动放入单独的 .cu
文件中,并制作一些瘦包装器以访问来自 的内核调用>.cc
文件。您仍然可以将所有源代码传递给 nvcc 进行编译,但是将 boost 导入与设备代码分开可以消除前端因 boost 声明而阻塞的问题。
关于boost - 告诉 NVCC 不要预处理主机代码以避免 BOOST_COMPILER 重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11540962/