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

标签 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 文件和主机代码中以便设备代码分别知道的原因。

最佳答案

这是 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/

相关文章:

c++ - 使用常量内存将结构数组从主机复制到设备

c++ - 错误 : conflicting declaration for uint32_t

visual-studio-2010 - "Visual Studio configuration file"是什么,为什么 nvcc 正在寻找它,为什么找不到它,如何修复?

cuda - CUDA 编译器如何知道扭曲的发散行为?

c++ - boost socket 的 vector

c++ - 为什么我在这里得到两个不同的输出?

c++ - 通过 STL 或 Boost 引入虚拟参数

boost - boost::asio tcp 套接字关闭是否阻塞?

java - 枚举所有长度为 N 的 vector ,其中每个元素的值为 [0 ... K],所有元素的总和为 SUM

makefile - 为 CUDA 程序创建 makefile