代码之家  ›  专栏  ›  技术社区  ›  Winter

将一个2D数组从C++类传递到CUDA函数

  •  3
  • Winter  · 技术社区  · 14 年前

    嘿伙计们, 我是一个跳进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;
    }
    

    当我编译代码时,我得到了错误 无法转换-float( )[8] 将参数1的*浮点数设为void handleMatrix(float*)*

    我应该用不同的方法来声明矩阵还是创建矩阵?

    提前谢谢你的帮助。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Eugene Smith    14 年前

    你可以的

    handleMatrix(table[0]);
    

    或者,同等地,

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

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

        2
  •  0
  •   Heatsink    14 年前

    需要指向数组的指针。声明指向数组的指针的语法是

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

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

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

        3
  •  0
  •   aschepler    14 年前

    在你的例子中, table[0] 转换为有效的 float* 指向64个连续浮点数的指针。但看起来很可疑 handleMatrix 获取一个指针,该指针应该是一个数组,而不获取任何有关该数组维数的信息。

        4
  •  0
  •   AndersK    14 年前

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

    最好在使用C++编程时使用vector & lt & gt,然后由被调用方知道维数。

    例如

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