c++ - 带有 Boost 的 Cuda

标签 c++ boost cuda nvcc

我目前正在编写一个 CUDA 应用程序并想使用 boost::program_options库来获取所需的参数和用户输入。

我遇到的问题是 NVCC 无法处理编译 boost 文件 any.hpp 给出的错误,例如

1>C:\boost_1_47_0\boost/any.hpp(68): error C3857: 'boost::any': multiple template parameter lists are not allowed

我在网上搜索发现是因为NVCC cannot handle the certain constructs used in the boost code但是 NVCC 应该将主机代码的编译委托(delegate)给 C++ 编译器。就我而言,我使用的是 Visual Studio 2010,因此主机代码应传递给 cl

由于 NVCC 似乎很困惑,我什至写了一个简单的关于 boost 内容的包装器,并将它放在一个单独的 .cpp(而不是 .cu)文件中,但是我仍然遇到构建错误。奇怪的是,在编译我的 main.cu 而不是 wrapper.cpp 时会引发错误,但即使 main.cu 没有,仍然是由 boost 引起的'不包括任何 boost 代码

有人知道这个问题的解决方案甚至解决方法吗?

最佳答案

Dan,我过去使用 boost::program_options 编写了一个 CUDA 代码,然后回头看看我是如何处理你的问题的。 nvcc 编译链中肯定有一些怪癖。我相信,如果你适本地分解了你的类,我相信你通常可以处理这个问题,并且意识到 NVCC 通常不能处理 C++ 代码/头文件,但你的 C++ 编译器可以很好地处理与 CUDA 相关的头文件。

我基本上有 main.cpp,其中包括我的 program_options header ,以及指示如何处理选项的解析内容。然后 program_options header 包含与 CUDA 相关的 header /类原型(prototype)。重要的部分(正如我认为您已经看到的)是没有 CUDA 代码,并且随附的 header 包含该选项 header 。将您的对象传递给选项函数并填写相关信息。类似于策略模式的丑陋版本。串联:

main.cpp:
#include "myprogramoptionsparser.hpp"
(...)
CudaObject* MyCudaObj = new CudaObject;
GetCommandLineOptions(argc,argv,MyCudaObj);

myprogramoptionsparser.hpp:
#include <boost/program_options.hpp>
#include "CudaObject.hpp"

void GetCommandLineOptions(int argc,char **argv,CudaObject* obj){
(do stuff to cuda object) }

CudaObject.hpp:
(do not include myprogramoptionsparser.hpp)

CudaObject.cu:
#include "CudaObject.hpp"

这可能有点烦人,但 nvcc 编译器在处理更多 C++ 代码方面似乎越来越好。这在 VC2008/2010 和 linux/g++ 中对我来说效果很好。

关于c++ - 带有 Boost 的 Cuda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7399688/

相关文章:

php - 如何在网络服务器中执行 CUDA 文件 (PHP)

c++ - OpenGL glutInit() : XOpenDisplay() causing segmentation fault

c++ - 三元搜索以在数组中找到差异最小的点

C++函数模板编译

c++ - 具有三元运算符和模板的自动

c++ - 将可变参数模板参数转发给类似 printf 的函数

c++ - 运行时在 boost::mpl::vector 中找到第一个匹配项

python - 使用 boost python 从 C++ 传递一个 numpy 数组

c++ - 清除缓冲区-Winsock

matrix - CUBLAS - 矩阵元素求幂可能吗?