从设备复制时 cudaMemcpy 没有响应

k1n*_*ext 0 c cuda

我已经为蒙特卡罗模拟编写了 CUDA 代码。我基本上有许多粒子并执行某些操作。为了计算我的 3D 网格的每个单元格的密度,我有一个数组(在设备上),我为每个粒子分配一个单元格 ID。这是通过 CUDA 完成的。然后我想将设备内存复制到主机以计算密度并将值写入文件。

但是,在运行我的代码时,cudaMemcpy没有响应并且语句之后的代码没有执行。我担心我在分配数组时做错了什么,如果有人能指出我的错误,我会很高兴。

这是代码的重要部分:

size_t sizeInt = dim*numParticles *sizeof(int);
...
int *h_cellIndex = NULL; // host
err = cudaHostAlloc((void **)&h_cellIndex, sizeInt,0);
//int *h_cellIndex = (int*) malloc(sizeInt);  <- this instead didn't work either
...
int *d_cellIndex = NULL; // device
err = cudaMalloc((void **)&d_cellIndex, sizeInt);
...
// simulation starts
...
printf("copy\n");
cudaMemcpy(h_cellIndex,d_cellIndex,sizeInt,cudaMemcpyDeviceToHost);
printf("copy done\n");
Run Code Online (Sandbox Code Playgroud)

作为输出,我看到“复制”打印到命令行。然后什么也没有发生,没有分段错误,也没有进一步的计算。

知道可能是什么问题吗?

提前致谢!

Sig*_*ndo 6

我猜你的模拟仍在运行。内核的调用是异步的,所以我认为是你的内核卡住了。只需cudaDeviceSynchronize()在内核调用后添加一个调用,看看它是否阻塞在那里,以便检查它。

事实上,内核不允许返回任何值,它们的返回值可以是void唯一的,因为它们是异步的,内核中的任何错误都将在下一次同步它们的调用中呈现:流 0中的调用,同一流中的调用或显式同步。