передать двумерный массив из класса C ++ в функцию CUDA - PullRequest
3 голосов
/ 13 ноября 2010

Привет, ребята, я парень из Java, использующий CUDA, и его синтаксис сбивает меня с толку.Я пытаюсь создать матрицу в файле .cpp, а затем передать его в файл .cu для обработки.Я вижу примеры, когда функция CUDA ожидает, что 2D-массив будет выглядеть как

void handleMatrix(float* A){
    // do stuff
}

, когда я создаю матрицу, я привык делать это в коде, который выглядит следующим образом:

    int main()
{

   const int row=8;
   const int column=8;
   int rnum;
   srand(time(0));
   rnum = (rand() % 100) + 1;  

  float table[row][column];  
    for(int r=0; r<row; r++){ 
      for(int c=0; c<column;c++){       
        table[row][column] = (rand()%100) + 1.f;    
      }
      cout << "\n";
    }

   handleMatrix(table);
   return 0;
}

Когда я компилирую код, я получаю ошибку не может преобразовать 'float () [8]' в 'float *' для аргумента '1' в 'void handleMatrix (float *)' *

Есть ли другой способ объявить матрицу или создать ее?

Заранее спасибо за помощь.

Ответы [ 4 ]

1 голос
/ 13 ноября 2010

Вы можете сделать

handleMatrix(table[0]);

или, что эквивалентно,

handleMatrix(&table[0][0]);

Это если handleMatrix - это код хоста. Если это код устройства, вы не можете выделить буфер таким образом. Вы захотите собрать массив в локальной памяти, заполнить записи, выделить другой массив в памяти устройства с помощью cudaMalloc () или cudaMallocPitch (), а затем скопировать с локального устройства, используя cudaMemcpy () или cudaMemcpy2D ().

0 голосов
/ 13 ноября 2010

В вашем примере table[0] преобразуется в действительный указатель float* на 64 последовательных числа с плавающей запятой.Но выглядит весьма подозрительно, что handleMatrix принимает указатель, предназначенный для массива, и не принимает никакой информации о измерениях этого массива.

0 голосов
/ 13 ноября 2010

функция handleMatrix (), это функция от вас или часть библиотеки? Если последнее, вам может понадобиться создать 2-й массив в виде длинного ряда x col 1-й массив. Если первое, вам нужно изменить функцию, чтобы принять двумерный массив, например handleMatrix (float ** m) и передайте размеры матрицы функции;

желательно, хотя вы должны использовать vector <> при программировании на C ++, тогда размеры известны вызываемой стороне.

, например

  #include <vector>
  typedef std::vector<std::vector<float > > matrix;

  void handleMatrix( matrix& m ) {..}
0 голосов
/ 13 ноября 2010

Вы хотите указатель на массив. Синтаксис объявления указателя на массив:

void handleMatrix(float (*A)[8][8]) {
  // do stuff
}

То есть, когда вы разыменовываете A, вы получаете ссылку на массив 8 на 8 с плавающей точкой.

Даже для одномерных массивов существует различие между указателем на массив (float (*anArray)[100]) и указателем на элемент (float *anArray). C ++ будет прозрачно преобразовывать первое в последнее, что означает, что для одномерных массивов (но не массивов более высокого измерения) вы обычно можете игнорировать разницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...