繁体   English   中英

将 2D 数组从 C++ 类传递给 CUDA 函数

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

我是一个跳入 CUDA 的 Java 人,但语法让我很困惑。 我正在尝试在 .cpp 文件中创建一个矩阵,然后将其传递给要处理的 .cu 文件。 我看到 CUDA 函数期望二维数组出现的示例

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

当我编译代码时,我收到错误无法将参数 '1' 的'float ( )[8]' 转换为 'float*' 到 'void handleMatrix(float*)'*

我应该以不同的方式声明或创建矩阵吗?

在此先感谢您的帮助。

你可以做

handleMatrix(table[0]);

或者,等效地,

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

那就是如果'handleMatrix'是主机代码。 如果是设备代码,则不能像这样分配缓冲区。 您需要在本地内存中组装一个数组,填充条目,使用 cudaMalloc() 或 cudaMallocPitch() 在设备内存中分配另一个数组,然后使用 cudaMemcpy() 或 cudaMemcpy2D() 从本地复制到设备。

你想要一个指向数组的指针。 声明数组指针的语法是

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

也就是说,当您取消引用 A 时,您将获得对 8 x 8 浮点数数组的引用。

即使对于一维数组,指向数组的指针( float (*anArray)[100] )和指向元素的指针( float *anArray )之间也存在区别。 C++ 会将前者透明地转换为后者,这意味着对于一维数组(但不是更高维的数组),您通常可以忽略差异。

在您的示例中, table[0]转换为指向 64 个连续浮点数的有效float*指针。 但它看起来非常可疑, handleMatrix接受一个旨在作为数组的指针,并且不接受有关该数组维度的任何信息。

handleMatrix() 函数,这是您的函数还是库的一部分? 如果是后者,您可能需要将二维数组创建为长行 x col 一维数组。 如果前者您需要更改函数以接受二维数组,例如 handleMatrix(float**m) 并将矩阵的维度传递给函数;

最好虽然你应该在 C++ 中编程时使用 vector<> 然后被调用者知道尺寸。

例如

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

  void handleMatrix( matrix& m ) {..}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM