我已经为蒙特卡罗模拟编写了 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)
作为输出,我看到“复制”打印到命令行。然后什么也没有发生,没有分段错误,也没有进一步的计算。
知道可能是什么问题吗?
提前致谢!
我猜你的模拟仍在运行。内核的调用是异步的,所以我认为是你的内核卡住了。只需cudaDeviceSynchronize()
在内核调用后添加一个调用,看看它是否阻塞在那里,以便检查它。
事实上,内核不允许返回任何值,它们的返回值可以是void
唯一的,因为它们是异步的,内核中的任何错误都将在下一次同步它们的调用中呈现:流 0中的调用,同一流中的调用或显式同步。