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