我已经创建了一个2D数组,它意味着[256][16],并希望创建一个指针将其传递给CUDA内核:
int result[matrix_rows * matrix_cols][16];
int (*h_result)[16] = result; //host pointer
int(*d_result)[16]; //device pointer
//memory allocation
CHECK_CUDA_ERROR(cudaMalloc((void**)&d_result, matrix_rows * matrix_cols * sizeof(int)));
kernel << <grid, block >> > (d_flat_array, d_result);
但是当我将内核中的值复制到d_result时,它只填充了256个假定元素中的13个,索引是正确的。
我试着调试,但没有发现索引的问题,但[13]之后的所有数组都是null。问题可能出在数组和指向它的指针的分配上吗?
2条答案
按热度按时间j13ufse21#
如何正确创建指向2D数组的指针
有两种方法可以做到这一点,如下所示:
方法一
在现代C++中使用
decltype
:方法二
使用
auto
占位符类型:方法三
正确的语法如下所示。还要注意右手边的
&
,它用于获取2D数组的地址:正如您所看到的,方法1和方法2比方法3更易读。
zxlwwiss2#
我总是用这样的方法来创建一个2D数组的指针:
然后你应该有一个二维数组与[第一][第二]元素。用后别忘了把它们洗一洗