在大型框架中从c++类派生cuda类

Deriving cuda-class from c++ class, in large framework

本文关键字:派生 cuda c++ 大型 框架      更新时间:2023-10-16

我有一个相当大的c++/mpi项目,我想在其中集成一些cuda功能。我创建了一个示例项目(还不能运行)来说明这个问题。消息来源之间的评论描述了这个问题。

我有一个主.cc:

/*main.cc*/
#include <iostream>
#include "derivedclass.h"
#include "someotherclass.h"
using namespace std;
int main(){
  int intstate = 4;
  DerivedClass<int> myDerivedClass;
  myDerivedClass.setState(intstate);
  myDerivedClass.compute();
  int result = myDerived.getResult();
  SomeOtherClass mySomeOtherClass(result);
  mySomeOtherClass.print();
}

其中包括一些c++类:

/*someotherclass.h*/
#ifndef INTEGRATOR_H_GUARD
#define INTEGRATOR_H_GUARD
class SomeOtherClass{
 private:
  int someVariable;
 public:
  SomeotherClass(int someVariable);
  void print();
};
#endif

/*someotherclass.cc*/
#include "someotherclass.h"
SomeOtherClass::SomeOtherClass(int someVariable){
  this->someVariable = someVariable;
}
SomeOtherClass::print(){
  cout << this->someVariable << endl;
}

这些c++部分相当大,我不想更改它们。

有一些基类:

/*baseclass.h*/
#ifndef BASECLASS_H_GUARD
#define BASECLASS_H_GUARD
class BaseClass{
 protected:
  int someVariable;
 public:
  BaseClass(int someVariable);
  void compute();
  int getResult();
};
#endif
/*baseclass.cc*/
BaseClass::BaseClass(int someVariable){
  this->someVariable = someVariable;
}
void BaseClass::compute(){
  /* do something*/
}
int BaseClass::getResult(){
  return this->someVariable;
}

这个基类提供了很多功能(太多了,但不是我的项目,所以我无法更改)。有些方法是由我并行化的。所以对我来说,这似乎是用Cuda:用Class派生BaseClass的最干净的方法

/*derivedclass.h*/
#ifndef DERIVEDCLASS_H_GUARD
#define DERIVEDCLASS_H_GUARD
#include "baseclass.h"
class DerivedClass: public BaseClass{
 public:
  DerivedClass(int someVariable);
  void compute();
};
#endif
/*derivedclass.cu*/
#include "derivedclass.h"
DerivedClass::DerivedClass(int someVariable):
  BaseClass(someVariable);
{
}
void DerivedClass::compute(){
  /* do some cuda stuff*/
}

所以我有以下问题:

  1. 有可能从c++类派生出一个cuda类吗

  2. 当我试图用g++编译main.cc类,用nvcc编译.cu类时,我在.cu类中使用cuda时出错,例如cudamalloc:./Folder/class.cu:line:Fehler:在»cudaMalloc«之前需要初始值设定项当我试图用nvcc编译主类时,我会遇到MPI功能的问题。那么,有没有可能使用一个用g++/mpicc编译的main.cc中的cuda类(这对我来说似乎是正确的方法)?

我希望我能理解我的问题,并感谢任何帮助。

从您的代码中可以看出,您的派生类只是一个启动CUDA内核的C++类。所以它并不是真正的"CUDA课程"。那么你的问题的答案是1。是"是",你可以这么做。您只需要将启动内核的任何成员函数与它们启动的内核一起放在.cu文件中。

错误"在'cudaMalloc'之前需要初始值设定项"是一个奇怪的语法错误。它似乎与派生类的东西没有任何关系。我怀疑你只是有一个C++语法错误。