0
我已经编写了Monte Carlo仿真的CUDA代码。我基本上有一些粒子,并执行某些操作。为了计算我的3D网格的每个单元的密度,我有一个数组(在设备上),我为每个粒子分配一个单元ID。这是通过CUDA完成的。然后,我想将设备内存复制到主机以计算密度并将值写入文件。从设备复制时,cudaMemcpy没有响应
但是,在运行我的代码时,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");
作为输出,我看“复制”打印到命令行。那么没有更多的事情发生,没有分段错误,但也没有进一步的计算。
任何想法可能是什么问题?
在此先感谢!
我猜你的模拟仍在运行。内核的调用是异步的,所以我认为这是你的内核被卡住了。在内核调用之后,只需添加一个对cudaDeviceSynchronize()的调用,并查看它是否在那里阻塞,以便检查它。 – Sigismondo
您确定在cudaMemcpy调用之前没有发生运行时错误?很可能你的内核是罪魁祸首 - 要么是被困在一个循环中,要么是在做一些杀死上下文/应用程序的东西。尝试运行cuda-memcheck并用输出更新您的问题。 – talonmies
@Sigismondo:非常感谢!我在每次内核调用后添加了'cudaDeviceSynchronize();'并且注意到一些计算进入了一个无限循环并且没有返回。如果您将您的评论作为答案,我会很乐意接受它作为解决方案。谢谢! – k1next