核函数里if和while问题:

斑竹您好:
有问题向您请教:
我安装了cuda5.0/nsight 3.0/win7,关于核函数里if和while的用法有些疑问:

__global__ void reset_680(float *d,int x_siz,int y_siz)
{
	int y_id=blockIdx.y*blockDim.y+threadIdx.y;
	int x_id=blockIdx.x*blockDim.x+threadIdx.x;
	if(y_id<y_siz&&x_id<x_siz)	
	{
		d[y_id*x_siz+x_id]=0;
	}
	__syncthreads();
}

这是一个初始化的核函数,我将指针d里的数据使用cudaMemcpy传到cpu中查看,发现时正确的,但是如果将代码中的if换成while后,cudaMemcpy就会出问题,黑屏一下,不知道这是什么原因,if和while有哪些区别?

因为改成while就是死循环,建议楼主先把基本功学好,此问题与cuda无关

LZ您好,大致看了您提供的代码,是没有问题的。
CUDA C中提供的if和while与C/C++中是一样的,前者是条件判断语句,后者是循环语句。

前者会在“()”内表达式为真的时候,执行一次下面的"{}“中的内容,而后者会反复执行”{}"中的内容,造成死循环(因为您并没有在循环体中设法跳出循环)。之后,在win7下,经过若干秒以后,会检测到您的GPU超时没有响应,从而重启驱动,这表现为“黑屏一下”。因此并非cudaMemcpy()有故障,而是您的kernel死循环了。

因此,请您确实搞清楚您所需要的行为,并选择合适的语句予以实现。

关于if和while的其他介绍,请参看普通C/C++语言教本。

此外,如果您需要对一段申请到的global memory空间清零,那么除了上kernel清零以外,还可以使用cudaMemset()这个函数。

祝您编码顺利~

恩,明白了;原来是这么简单的问题,辛苦斑竹详细回答,感谢斑竹提供的memory清零建议;

把最基本的东西给忽略了,谢谢

不客气的,欢迎您常来论坛讨论,祝您好运!!