【问题标题】:Declaration of cuda variables in header which is included in cpp project在 cpp 项目中包含的标头中声明 cuda 变量
【发布时间】:2020-05-06 18:24:45
【问题描述】:

我有一个包含几个变量的类,这些变量仅在使用nvcc 编译时可用,例如thrust::device_vector<>。类声明本身在头文件中,它的实现在 .cu 文件中。该类将包含在使用g++ 编译的主项目中,这意味着cuda 变量的编译也将使用g++ 完成。这显然失败了。因此,我想知道是否有解决方案,即我的类包含诸如thrust::device_vector<> 之类的变量,但仍然可以包含在整个项目中?
我可以以某种方式仅在 .cu 文件中声明类变量,而不是在头文件中声明吗?

【问题讨论】:

  • "这个类将被包含在使用 g++ 编译的主项目中"。你不能那样做。如果它包含推力,它必须用 nvcc 编译。如果你有我必须用 g++ 编译的代码,那么重构
  • 这里我想避免两点,其中之一是我不能将 C++17 与 nvcc 一起使用,另一点是我通过一些包含包含 mpi。这也意味着我必须重新编译我包含的每个包含 mpi 的库,这是我想避免的……
  • 所以重构。你别无选择

标签: c++ cuda


【解决方案1】:

我的类包含诸如thrust::device_vector<>, 之类的变量,但仍然可以包含在整个项目中?

您必须使用 nvcc 编译包含代码的推力。没有替代。如果你在 vanilla C++17 代码中包含包含推力的标头并使用 C++ 编译器进行编译,则会出现错误。

我能否以某种方式仅在 .cu 文件中声明类变量,而不是在头文件中?

您可以这样做,这将是一个显而易见的解决方案。但这提出了一个同样明显的问题,即为什么您实际上首先需要原始 C++17 代码中的结构。如果打算在 C++17 代码中使用它,那么您又回到了起点。

我认为除了重构您的代码之外别无选择。您要么需要使用具有 C++ 和 CUDA 专业化的通用可移植结构的继承,以及在它们之间复制构造或类似结构的某种方式,要么隔离/扭曲 CUDA 代码路径之外的所有 C++17 代码并使用 nvcc 作为基础编译器,并用g++单独编译C++17。

再多的神奇思维都无法以您想象的方式解决这个问题。

【讨论】:

  • 如果我实现这种方法,继承会是什么样子?
  • 这完全取决于您的代码和用例。我可以想象所有非推力成员都可以在一个共同的结构中,所有推力成员都在一个 CUDA 专业化
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2012-12-19
相关资源
最近更新 更多