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

C++ 从c+派生cuda类+;类,在大型框架中,c++,cuda,mpi,derived-class,C++,Cuda,Mpi,Derived Class,我有一个相当大的c++/mpi项目,我想在其中集成一些cuda功能。 我创建了一个示例项目(尚未运行)来说明这个问题。来源之间的评论描述了问题 我有一个main.cc: /*main.cc*/ #include <iostream> #include "derivedclass.h" #include "someotherclass.h" using namespace std; int main(){ int intstate = 4; DerivedClass<

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

我有一个main.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();
}
这个基类提供了很多功能(太多了,但不是我的项目,所以我无法更改)。 有些方法将由我并行。因此,对我来说,这似乎是使用Cuda派生基类的最干净的方法:

/*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*/
}
因此,我有以下问题:

  • 是否可以从c++类派生cuda类

  • 当我尝试用g++编译main.cc类,用nvcc编译.cu类时,我在.cu类中使用cuda内容时遇到了一个错误,例如cudamalloc: ./Folder/class.cu:行:Fehler:在»cudamaloc«之前需要初始值设定项 当我尝试用nvcc编译主类时,我发现MPI功能有问题。 那么,是否可以使用使用g++/mpicc编译的main.cc中的cuda类(对我来说这似乎是正确的方法)


  • <>我希望我能描述我的问题,理解并感谢任何帮助。

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

    错误“在'cudamaloc'之前需要初始值设定项”是一个奇怪的语法错误。它似乎与派生类的内容没有任何关系。我怀疑你只是有一个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;
    }
    
    /*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*/
    }