二维数组的 cudaMalloc 失败,错误代码 11

标签 c arrays cuda nvidia

我正在尝试在 CUDA 中实现一个二维数组,如下所示:

u_int32_t **device_fb = 0;
u_int32_t **host_fb = 0;

cudaMalloc((void **)&device_fb, (block_size*grid_size)*sizeof(u_int32_t*));

for(int i=0; i<(block_size*grid_size); i++)
{
    cudaMalloc((void **)&host_fb[i], numOpsPerCore*sizeof(u_int32_t));
}
cudaMemcpy(device_fb, host_fb, (block_size*grid_size)*sizeof(u_int32_t*), cudaMemcpyHostToDevice);

在测试中,host_fb 为 NULL。此外,当我获取 cudaMalloc((void **)&host_fb[i], numOpsPerCore*sizeof(u_int32_t)); 的第一次迭代的错误代码时,我得到了 cudaErrorInvalidValue。我究竟做错了什么?谢谢!

最佳答案

好吧,您的代码存在一些问题。查看下面代码中的注释。

在数组的大小中,您应该使用sizeof(u_int32_t) 而不是指针类型。 很难发现错误,因为两种类型的大小在某些平台上可能意外地相同,但在其他平台上则不同。

size_t arr_size = (block_size*grid_size) * sizeof(u_int32_t);

// host array wasn't allocated at all.
host_fb = malloc(arr_size);
cudaMalloc((void **)&device_fb, arr_size);

// the loop is unnecessary, you have now an allocated 2D table    

cudaMemcpy(device_fb, host_fb, (block_size*grid_size)*sizeof(u_int32_t*), cudaMemcpyHostToDevice);

我使用了 malloc 函数,因为 cudaMallocHostcudaHostAlloc 都分配了设备可访问的页面锁定主机内存,这可能不是你想要什么。如果存在性能问题,您可以使用它们,因为它们都会强制对分配的内存进行分页。有关详细信息,请参阅相应的文档。

关于二维数组的 cudaMalloc 失败,错误代码 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8098324/

相关文章:

ruby - 对象数组 : Reject all but ones with largest value

c++ - 如何获取set bit中的相对位置

c++ - 我想将我的代码从 C++ 更改为 CUDA,知道吗?

c - 在 C 中使用二分法的两个根之间的区别?

c - 添加值的递归函数正在输出异常值

c++ - 如何在 C/C++ 中创建 Windows 服务?

char数组到C中的LPCTSTR转换

c++ - 我的 C++ 代码在尝试计算表中元素的总和时崩溃

c++ - 为什么只有数组的第一个元素被初始化为-1?而其余的为 0

cuda - 1 个 CUDA 内核能否在每个时钟(麦克斯韦)处理超过 1 个浮点指令?