Определение памяти для матрици на CUDA

Возможно ли на CUDA подобным образом определить память для матрици (аналогично языку С) ???

  1. // Allocate memory for matrix
  2. double ** matrixAllocate(int numRows, int numCols)
  3. {
  4.   // This is 2D array
  5.   double **matrix = NULL;
  6.   // Used as indexes in matrix[r][c]
  7.   unsigned int r = 0;
  8.   unsigned int c = 0;
  9.   // Allocate pointer memory for the first dimension of a matrix[][]
  10.   matrix = (double **) malloc(numRows * sizeof(double *));
  11.   if(NULL == matrix)
  12.   {
  13.     free(matrix);
  14.     printf("Memory allocation failed while allocating for matrix[].\n");
  15.     exit(-1);
  16.   }
  17.   // Allocate double memory for the second dimension of a matrix[][]
  18.   for(r = 0; r < numRows; r++)
  19.   {
  20.     matrix[r] = (double *) malloc(numCols * sizeof(double));
  21.     if(NULL == matrix[r])
  22.     {
  23.       free(matrix[r]);
  24.       printf("Memory allocation failed while allocating for matrix[x][].\n");
  25.       exit(-1);
  26.     }
  27.   }
  28.   return matrix;
  29. }

Forums: 

Вот нашел код float*

Вот нашел код

  1. float* devPtr;
  2. int pitch;
  3. cudaMalloc2D((void**)&devPtr, &pitch,width * sizeof(float), height);

Но получается что здесь мы тоже работаем с одномерным массивом, хотя память выделяем как под двумерный. В этом замысел, правильно?

Наверное, ответ на первый вопрос - нет, нельзя. Только еще интересно почему нет такой возможности.

да, работа с таким массивом

да, работа с таким массивом происходит точно так же как и с одномерным.
т. е. доступ к его элементам будет что-то вроде:
float e = (float *)((char*) devPtr + r * pitch) + c; // e = devPtr[r, c]
однако, дальнейшая работа с массивом, созданным при помощи cudaMalloc2D(), должна осуществляться функциями имеющими 2D в своем имени (cudaMemset2D, cudaMemcpy2D и пр.).
в общем, это вопрос удобства.

Может быть

Может быть лучше что-то вроде этого:

  1. double *d_array;
  2. size_t d_array_pitch;
  3. size_t d_arrayWidthInBytes = numCols * sizeof(double);
  4. cudaMallocPitch((void**)&d_array, &d_array_pitch, d_arrayWidthInBytes, numRows);

Это 1D массив, правда, но зато с правильным выравниванием по строкам в глобалной памяти.

P.S.: ну и более оптимально представить массив как double2.

Просто все что я видел и чем

Просто все что я видел и чем пользуюсь - использует представление двумерного массива в виде одномерного. В примерах от NVIDIA тоже так.
Соответсвенно и память отводится как под одномерный массив, хотя логически предполагается двумерный массив.
Можно какой-то небольшой пример с cudaMalloc2D()?