2014-02-17 25 views
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"); 

作为输出,我看“复制”打印到命令行。那么没有更多的事情发生,没有分段错误,但也没有进一步的计算。

任何想法可能是什么问题?

在此先感谢!

+1

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

+1

您确定在cudaMemcpy调用之前没有发生运行时错误?很可能你的内核是罪魁祸首 - 要么是被困在一个循环中,要么是在做一些杀死上下文/应用程序的东西。尝试运行cuda-memcheck并用输出更新您的问题。 – talonmies

+0

@Sigismondo:非常感谢!我在每次内核调用后添加了'cudaDeviceSynchronize();'并且注意到一些计算进入了一个无限循环并且没有返回。如果您将您的评论作为答案,我会很乐意接受它作为解决方案。谢谢! – k1next

回答

4

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

其实内核不允许返回任何值,其返回值可以是void而已,因为它们是异步的,并且在内核中的任何错误都会在下次调用在同步它们呈现:来电流0 ,呼叫相同流或显式同步。