关于cuda的内存泄漏

本人刚接触cuda,现在遇到了一个关于内存泄漏的问题,在此向各位大牛请教!

简单的说,我现在有4个二维矩阵,分别是两个40401350和4040110大小的矩阵。
我要对这4个矩阵中的值进行两两比较(分别进行减法和除法运算)
最后需要输出3个40401大小的数组

实验室的电脑用的是Quadra FX 580 显卡,显存512M,支持cuda 1.1。

我现在遇到的问题是,运行程序时,电脑黑屏一下,然后右下角弹出提示框说显卡驱动遇到问题重启。
在VS2010下出现如下信息
[attach]1772[/attach]

不知道讲明白没有,我将自己的代码贴在下面
自己水平实在太菜,实在找不出到底是哪里出问题了,在此虚心向各位请教,希望不吝赐教,再次感谢!

N=40401
RPatchNum=350
SPatchNum=10

   cudaMemcpy2D(patchRA_d,RPitch,patchRA,RPatchNum*sizeof(float),RPatchNum*sizeof(float),N,cudaMemcpyHostToDevice);
   cudaMemcpy2D(patchRT_d,RPitch,patchRT,RPatchNum*sizeof(int),RPatchNum*sizeof(int),N,cudaMemcpyHostToDevice);
   cudaMemcpy2D(patchSA_d,SPitch,patchSA,SPatchNum*sizeof(float),SPatchNum*sizeof(float),N,cudaMemcpyHostToDevice);
   cudaMemcpy2D(patchST_d,SPitch,patchST,SPatchNum*sizeof(int),SPatchNum*sizeof(int),N,cudaMemcpyHostToDevice);

   dim3 blocksize(256,1);
   dim3 gridsize(((N+blocksize.x-1)/blocksize.x),1);
   focusKernel<<<gridsize,blocksize>>>(patchRA_d,patchRT_d,patchSA_d,patchST_d,Rd,Sd,Dd,wave_d,temp,RPatchNum,SPatchNum,N);                        
   checkCudaError("kernel");

   cudaMemcpy(R,Rd,N*sizeof(float),cudaMemcpyDeviceToHost);                        
   checkCudaError("memcpy");
   cudaMemcpy(S,Sd,N*sizeof(float),cudaMemcpyDeviceToHost);
   checkCudaError("memcpy");
   cudaMemcpy(D,Dd,N*sizeof(float),cudaMemcpyDeviceToHost);
   checkCudaError("memcpy");

kernel函数

if(id<N)
   {
   for(int j=id;j<N;j++)
   {
   for (int k=0;k<RPatchNum;k++)
   {
   deltT=patchRT_d[j*RPatchNum+k]-patchRT_d[id*RPatchNum+k];
   if (deltT>-temp&&deltT<temp)
   {                                        
   //deltA=patchRA_d[j][k]/patchRA_d[id][k];
   deltA=__fdividef(patchRA_d[j*RPatchNum+k],patchRA_d[id*RPatchNum+k]);
   tempR+=wave_d[deltT+temp]*deltA;
   }
   }
   Rd[id]+=tempR;

   for (int k=0;k<SPatchNum;k++)
   {
   deltT=patchST_d[j*SPatchNum+k]-patchST_d[id*SPatchNum+k];                                
   if (deltT>-temp&&deltT<temp)
   {
   //deltA=patchSA_d[j][k]/patchSA_d[id][k];
   deltA=__fdividef(patchSA_d[j*SPatchNum+k],patchSA_d[id*SPatchNum+k]);
   tempS+=wave_d[deltT+temp]*deltA;
   }
   }
   tempD=tempR*tempS;
   Sd[id]+=tempS,Dd[id]+=tempD;
   }
   }        

内存泄露估计是你分配了空间没有释放,自己好好查找一下吧。

建议先用cuda-memcheck找一下。

我分配了空间的都释放掉了啊

为什么运行cuda-memcheck闪一下就退了?需要配合其它东西运行吗?

嗯,我用了这个,结果还是黑屏,显卡驱动重启
显示信息为:“Cuda error:memcpy:the launch timed out and was terminated.”
是说我想显存中的数据传回内存时出现了错误吗?
为什么会出现这个错误?

你在内核下面加个同步的,我怀疑你访存越界了。

还是一样的结果,vs里显示说memory leaks;
用memcheck就说“the launch timed out and was terminated.”

你可以仔细看看每个读写存储器的地方,然后想想是否越界了。或者注释一部分代码再试,尽量缩小出问题代码的范围。

这有可能是cudamemcpy之前有错。建议每个kernel调用后用cudaGetLastError()及cudaGetErrorString()检查错误。

我在每个cudamemcpy后面都调用了错误检查,还是一样的结果,而且电脑还花屏了

可以用排除法来找找问题到底出在哪。比如先把所以kernel都注释掉,保证这时没问题。然后把代码慢慢加回去,一边加一边看程序是否报错。

楼主的问题很诡异啊,不知你是否解决了,解决的话可否分享一下原因?