Извлечение cuda-класса из класса c ++, в больших рамках - PullRequest
0 голосов
/ 25 февраля 2012

У меня довольно большой проект 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*/
}

Так что у меня есть следующие вопросы:

  1. Этоможно получить cuda-класс из c ++ - класса

  2. Когда я пытаюсь скомпилировать класс main.cc с помощью g ++ и классы .cu с помощью nvcc, я получаю ошибку при использовании cudaвещи в классе .cu, например, cudamalloc: ./Folder/class.cu:line: Fehler: ожидаемый инициализатор до »cudaMalloc« Когда я пытаюсь скомпилировать основной класс с помощью nvcc, у меня возникают проблемы с MPI-функциональностью.Так возможно ли использовать cuda-класс из main.cc, скомпилированного с g ++ / mpicc (что мне кажется правильным)?

Надеюсь, я описал свойПроблема понятна и ценю любую помощь.

1 Ответ

1 голос
/ 26 февраля 2012

Из того, что я могу сказать из вашего кода, ваш производный класс - это просто класс C ++, который запускает ядра CUDA. Так что на самом деле это не «класс CUDA». Таким образом, ответ на ваш вопрос 1. «да», вы можете сделать это. Вам просто нужно поместить все функции-члены, запускающие ядра, в файлы .cu вместе с ядрами, которые они запускают.

Ошибка «ожидаемый инициализатор перед« cudaMalloc »» является странной синтаксической ошибкой. Похоже, это не имеет никакого отношения к вашим производным классным материалам. Я подозреваю, что у вас просто ошибка синтаксиса C ++.

...