Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
2D数组的Cudamaloc失败,错误代码11_C_Arrays_Cuda_Nvidia - Fatal编程技术网

2D数组的Cudamaloc失败,错误代码11

2D数组的Cudamaloc失败,错误代码11,c,arrays,cuda,nvidia,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], n

我正试图在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);
u\u int32\u t**device\u fb=0;
u_int32_t**host_fb=0;
cudamaloc((void**)和设备(块大小*网格大小)*尺寸(u*int32*t*);

对于(int i=0;iGPU上的2D阵列很难操作,您必须考虑GPU和CPU地址空间不兼容。让我指出一些观察结果:

1) 您首先没有初始化**host_fb数组,因此for循环中该数组元素的后续调用是错误的

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


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

嗯,你的代码有一些问题。请看下面代码中的注释

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

我尝试了您的代码,但我认为我仍然需要
主机\u fb
上的循环,否则稍后尝试访问
主机\u fb[0]
时会出现总线错误。我添加了循环(以及您的一些更改),它似乎起了作用,但我不确定它是否正确。总线错误是什么意思?你什么时候拿到的?这不是你之前得到的cudaErrorInvalidValue(错误代码11)吗?是的,之前错误出现在cudaMalloc上(错误代码11)。现在,当我尝试在cuda gdb中运行它时,它收到一个总线错误,并说它无法访问主机fb[0][0]
上的内存。