c ++ cuda: cudaMallocManaged доступ вне конструктора - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть класс c ++, который использует cudaMallocManaged, вот так:

MyMatrix::MyMatrix(int new_rows, int new_cols, int padrr, int padcc)
{
  rows = new_rows;
  cols = new_cols;
  padr = padrr;
  padc = padcc;

  cout << "allocating memory" << endl;
  float *data;
  cudaError_t cudaStatus = cudaMallocManaged(&data, new_rows*new_cols*sizeof(float));
  if (cudaStatus != cudaSuccess){
      cout << cudaStatus << endl << flush;
      exit(1);
  }
  cudaDeviceSynchronize();
  cout << "allocating memory successful:" << cudaStatus << endl;
  // I CAN ACCESS DATA HERE
  //data[15] = 5.5; //fine
}
MyMatrix::~MyMatrix(void)
{
 cudaFree(data); // delete the data array
}

У меня есть файл заголовка .h тоже:

class MyMatrix
{

  public:
      MyMatrix(int new_rows, int new_cols, int padr, int padt);
      ~MyMatrix(void);

      float *data;
      int padr;
      int padc;
      int rows;
      int cols;
}

Я могу получить доступ к массиву данных в порядке внутри этого конструктора.

Однако, как только я пытаюсь получить к нему доступ (чтение или запись), я получаю terminated by signal SIGSEGV (Address boundary error).Например:

MyMatrix *newmat = new MyMatrix(totalr, totalc, padr, padc);
cout << (*newmat).data[0] << endl;

Или

MyMatrix newmat = new MyMatrix(totalr, totalc, padr, padc);
cout << newmat.data[0] << endl;

Как я могу "сохранить" этот указатель?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

В вашем конструкторе вы создаете локальную переменную с именем data:

float *data;

После выделения памяти CUDA и присвоения значения локальной переменной data адрес памяти, по-видимому, нехранится где угодно постоянно.Таким образом, ваша память становится недоступной.

У вас есть эта строка newmat.data, но в constructro вы никогда не присваивали значение элементу data.Вы использовали только локальную переменную с тем же именем.

0 голосов
/ 25 сентября 2018

Ваша проблема в том, что в

MyMatrix::MyMatrix(int new_rows, int new_cols, int padrr, int padcc)
{
  rows = new_rows;
  cols = new_cols;
  padr = padrr;
  padc = padcc;

  cout << "allocating memory" << endl;
  float *data;
  cudaError_t cudaStatus = cudaMallocManaged(&data, new_rows*new_cols*sizeof(float));
  if (cudaStatus != cudaSuccess){
      cout << cudaStatus << endl << flush;
      exit(1);
  }
  cudaDeviceSynchronize();
  cout << "allocating memory successful:" << cudaStatus << endl;
  // I CAN ACCESS DATA HERE
  //data[15] = 5.5; //fine
}

data, который вы используете в cudaMallocManaged(&data, new_rows*new_cols*sizeof(float)), это float *data;, который вы объявили в строке выше, а не data член вашего класса.Вам просто нужно избавиться от локального float *data;, чтобы вы использовали член класса data, например

MyMatrix::MyMatrix(int new_rows, int new_cols, int padrr, int padcc)
{
  rows = new_rows;
  cols = new_cols;
  padr = padrr;
  padc = padcc;

  cout << "allocating memory" << endl;

  cudaError_t cudaStatus = cudaMallocManaged(&data, new_rows*new_cols*sizeof(float));
  if (cudaStatus != cudaSuccess){
      cout << cudaStatus << endl << flush;
      exit(1);
  }
  cudaDeviceSynchronize();
  cout << "allocating memory successful:" << cudaStatus << endl;
  // I CAN ACCESS DATA HERE
  //data[15] = 5.5; //fine
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...