cudaMalloc无法处理2D数组,错误代码为11

时间:2011-11-11 18:27:43

标签: c arrays cuda nvidia

我正在尝试在CUDA中实现2D数组,如下所示:

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。我究竟做错了什么?谢谢!

2 个答案:

答案 0 :(得分:2)

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

在数组的大小中,您应该使用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都分配了设备可访问的页面锁定主机内存,这可能不是您想要的。如果存在性能问题,可以使用它们,因为它们都会强制分配已分配的内存。有关详细信息,请参阅相应的文档。

答案 1 :(得分:0)

GPU上的2D阵列操作起来很棘手,您必须考虑到GPU和CPU地址空间不兼容。让我指出一些意见:

1)你没有首先初始化** host_fb数组,所以后续调用for-cycle中这个数组的元素是错误的。

2)您应该使用cudaMallocHost(或类似的东西)来分配将由CPU访问的内存

除此之外,我无法帮助你,因为你还没有告诉我们代码应该完成什么。