【问题标题】:pass a 2D array from a C++ class to a CUDA function将二维数组从 C++ 类传递给 CUDA 函数
【发布时间】:2020-12-19 17:47:05
【问题描述】:

我是一个跳入 CUDA 的 Java 人,语法让我感到困惑。我正在尝试在 .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;
}

当我编译代码时出现错误 无法将参数“1”转换为“float ()[8]”到“float*”到“void handleMatrix(float*)”*

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

提前感谢您的帮助。

【问题讨论】:

    标签: c++ cuda


    【解决方案1】:

    你可以的

    handleMatrix(table[0]);
    

    或者,等价的,

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        在您的示例中,table[0] 转换为指向 64 个连续浮点数的有效 float* 指针。但看起来很可疑handleMatrix 接受了一个本应是数组的指针,并且没有获取有关该数组维度的任何信息。

        【讨论】:

          【解决方案4】:

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

          最好在使用 C++ 编程时使用向量,然后被调用者知道尺寸。

          例如

            #include <vector>
            typedef std::vector<std::vector<float > > matrix;
          
            void handleMatrix( matrix& m ) {..}
          

          【讨论】:

          • 这在仅主机代码中很好,但是 std::vector 不能传递给 CUDA 内核。
          猜你喜欢
          • 2021-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多