[英]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.