【问题标题】:Cuda with Boost带有 Boost 的 Cuda
【发布时间】:2011-11-16 00:20:17
【问题描述】:

我目前正在编写一个 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

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

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

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

【问题讨论】:

  • main.cu 是否包含其他包含 boost 代码的文件?
  • 是的,实际上它包括wrapper.h,其中包括boost\program_options.hpp。有没有什么好的方法可以将两者分开?

标签: c++ boost cuda nvcc


【解决方案1】:

另一种选择是将仅 cpp 的代码包装在

#ifndef __CUDACC__

【讨论】:

    【解决方案2】:

    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"
    

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

    【讨论】:

      【解决方案3】:

      你必须将代码分成两部分:

      1. 内核必须通过nvcc编译
      2. 调用内核的程序必须经过g++编译。

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

      【讨论】:

      • 确实,我的问题中已经说了这么多。解决方案实际上是如何实现这一目标或让 nvcc 正确处理它。
      • 我用VS2010编译这个不知道会不会有问题?
      【解决方案4】:

      感谢@ronag 的评论,我意识到我仍然(间接)在我的标题中间接包含boost/program_options.hpp,因为我的包装类定义中有一些需要它的成员变量。

      为了解决这个问题,我将这些变量移到了类之外,因此可以将它们移到类定义之外并进入 .cpp 文件。它们不再是成员变量,现在在wrapper.cpp中是全局的

      这似乎可行,但很难看,我觉得 nvcc 应该优雅地处理它;如果其他人有适当的解决方案,请仍然发布:)

      【讨论】:

        猜你喜欢
        • 2017-06-04
        • 2018-11-01
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 2020-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多