Cuda与Boost

Dan*_*Dan 12 c++ boost cuda nvcc

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

我遇到的麻烦是NVCC无法处理编译提升文件的any.hpp错误,例如

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

我在网上搜索并发现这是因为NVCC 无法处理boost代码中使用的某些结构,但是NVCC应该将主机代码的编译委托给C++编译器.在我的情况下,我使用的是Visual Studio 2010,因此应该传递主机代码cl.

由于NVCC似乎变得困惑,我甚至围绕增强内容编写了一个简单的包装器并将其粘贴在一个单独的.cpp(而不是.cu)文件中,但我仍然遇到构建错误.很奇怪错误是在编译我main.cu而不是wrapper.cpp但仍然是由boost引起的,即使main.cu不包括任何增强代码.

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

Aur*_*ius 8

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

我本质上有main.cpp,其中包括我的program_options标头,以及解析如何处理选项的解析内容.然后,program_options标头包含与CUDA相关的头/类原型.重要的部分(我认为你已经看到)是没有CUDA代码和附带的标题包括该选项标题.将您的对象传递给选项功能,并填写相关信息.像战略模式的丑陋版本.级联:

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"
Run Code Online (Sandbox Code Playgroud)

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


fab*_*ioM 5

您必须将代码分为两部分:

  1. 内核必须由nvcc编译
  2. 调用内核的程序必须由g ++编译.

然后将两个对象链接在一起,一切都应该正常工作.nvcc仅用于编译CUDA内核代码.