У меня довольно большой проект 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();
}
, который включает в себя некоторые классы 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;
}
Этот базовый класс предоставляет множество функциональных возможностей (слишком много, ноне мой проект, поэтому я не могу это изменить).Некоторые методы должны быть распараллелены мной.Так что для меня это, кажется, самый чистый способ получения BaseClass с помощью класса 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*/
}
Так что у меня есть следующие вопросы:
Этоможно получить cuda-класс из c ++ - класса
Когда я пытаюсь скомпилировать класс main.cc с помощью g ++ и классы .cu с помощью nvcc, я получаю ошибку при использовании cudaвещи в классе .cu, например, cudamalloc: ./Folder/class.cu:line: Fehler: ожидаемый инициализатор до »cudaMalloc« Когда я пытаюсь скомпилировать основной класс с помощью nvcc, у меня возникают проблемы с MPI-функциональностью.Так возможно ли использовать cuda-класс из main.cc, скомпилированного с g ++ / mpicc (что мне кажется правильным)?
Надеюсь, я описал свойПроблема понятна и ценю любую помощь.