Winter
Winter

Reputation: 1490

pass a 2D array from a C++ class to a CUDA function

I am a Java guy jumping into CUDA and the syntax is tripping me. I'm trying to create a matrix in the .cpp file then pass that off to the .cu file to be processed. I see examples where the CUDA function expects the 2D array to come in looking like

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

when I create the matrix I'm used to doing it in code that looks like this:

    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;
}

When I compile the code I'm getting the error cannot convert ‘float ()[8]’ to ‘float*’ for argument ‘1’ to ‘void handleMatrix(float*)’*

Is there a different way I should be declaring the matrix or creating it?

Thanks in advance for the help.

Upvotes: 3

Views: 2104

Answers (4)

Eugene Smith
Eugene Smith

Reputation: 9398

You can do

handleMatrix(table[0]);

or, equivalently,

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

That's if 'handleMatrix' is host code. If it's device code, you can't allocate the buffer like that. You'll want to assemble an array in local memory, fill the entries, allocate another array in the device memory using cudaMalloc() or cudaMallocPitch(), and then copy from local to device using cudaMemcpy() or cudaMemcpy2D().

Upvotes: 1

AndersK
AndersK

Reputation: 36092

the handleMatrix() function, is this a function from you or is part of a library? If the latter you may need to create the 2-d array as a long row x col 1-d array. If the former you need to change the function to accept a 2-d array e.g. handleMatrix(float**m) and pass the dimensions of the matrix to the function;

preferably though you should use vector<> when programming in C++ then the dimensions are known by the callee.

e.g.

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

  void handleMatrix( matrix& m ) {..}

Upvotes: 0

aschepler
aschepler

Reputation: 72463

In your example, table[0] converts to a valid float* pointer to 64 consecutive float numbers. But it looks highly suspicious that handleMatrix takes a pointer meant to be an array and doesn't take any information about the dimensions of that array.

Upvotes: 0

Heatsink
Heatsink

Reputation: 504

You want a pointer to an array. The syntax for declaring a pointer to an array is

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

That is, when you dereference A, you get a reference to an 8 by 8 array of floats.

Even for 1D arrays, there is a distinction between pointer to array (float (*anArray)[100]) and pointer to element (float *anArray). C++ will transparently convert the former to the latter, which means that for 1D arrays (but not arrays of higher dimension) you can usually ignore the difference.

Upvotes: 0

Related Questions