kernel中的for循环最多执行20次

我在host端使用for循环调用kernel函数,kernel函数依据for循环的层数改变内部循环大小

__global__ static void getDegreedis(int *degree,int *degreedis,int init,int n){
	int dis=0;
	int m=init+n*10;
	for(int i=0;i<m;i++){
		degreedis[i] = degree[i] + dis;
		dis=degreedis[i];
	}

每次如此调用,第一次发现数据正常,后来的两次发现,kernel中的循环只进行了20次…图片上传失败。哎

代码被吃掉了一部分
host端调用代码如下

for(int i=0;i<3;i++){

		CUDA_CALL(cudaMemset(d_degreesum, 0, COUNT*sizeof(int)));

		CURAND_CALL(curandSetPseudoRandomGeneratorSeed(gen, i*123));
		CURAND_CALL(curandGenerateUniform(gen, devData, 256*step));
		getDegreedis<<<1,1,0>>>(d_degree,d_degreedis,init_num,i);
		kernel<<<1,COUNT,0>>>(d_BA,d_degree,d_degreedis,devData,d_nn,d_degreesum,init_num,step,MAX,count,i);
		

其中init_num为初始节点4 ,后面的i 为host端循环的i。

楼主您好,

有多种情况会导致您的这种结论的:

(1)您的循环被i < m所限制,如果您的m=20, 自然只能循环20次
(2)您的循环虽然看上去只有一个条件,但循环体的一些,例如非法访存(越界之类的),也会成功导致您的kernel挂掉,循环提前结束的。
(3)还有一种情况是都成功执行的,但是您观察出错:
例如您错误的将degreedis复制,原本有80个元素,您却忘记指定80 * sizeof(int)了,这将会导致只能实际上取回20个元素。从而您认为只循环了20次(实际上人家可能的确循环了80次)

建议的解决方案:
使用nsight单步循环的过程,看看真实的循环执行次数。

在我已经给出回复时,楼主又补充插入了一些信息到2#, 因此一些回复可能不再适用。

啊,感谢版主。是因为我复制回来的时候范围不够,只复制回来了20…谢谢版主了。找了半天都没看到

服务您是我们的荣幸。

期待您的下次莅临。