Cuda内核将结果向量生成为零

时间:2012-08-06 19:47:43

标签: cuda gpgpu

这是我为了并行计算某个数组而启动的内核。

 __device__ bool mult(int colsize,int rowsize,int *Aj,int *Bi,int *val)
    {       
        for(int j = 0; j < rowsize;j++)
        {           
           for(int k = 0;k < colsize;k++)
            {   
              if(Aj[j] == Bi[k])
               {    
                return true;
                }                               
            }           
        }
            return false;       
    }


__global__ void kernel(int *Aptr,int *Aj,int *Bptr,int *Bi,int rows,int cols,int *Cjc)
    {
        int tid = threadIdx.x + blockIdx.x * blockDim.x;
        int i;
        if(tid < cols)
        {
            int beg = Bptr[tid];
            int end = Bptr[tid+1];
            for(i = 0;i < rows;i++)
            {
                int cbeg = Aptr[i];
                int cend = Aptr[i+1];
                if(mult(end - beg,cend - cbeg,Aj+cbeg,Bi+beg))
                {                                                
                     Cjc[tid+1] += 1;
                     //atomicAdd(Cjc+tid+1,1);           
                }
            }                
        }               
    }

以下是我如何决定网格和块的配置

int numBlocks,numThreads;

        if(q % 32 == 0)
        {
            numBlocks = q/32;
            numThreads = 32;
        }
        else
        {
            numBlocks = (q+31)/32;
            numThreads = 32;
        }
findkernel<<<numBlocks,numThreads>>>(devAptr,devAcol,devBjc,devBir,m,q,d_Cjc);

我正在使用带有CC 2.0的GTX 480。 现在我遇到的问题是,只要q增加到4096以上,Cjc数组中的值都会生成为0。 我知道我可以在X方向使用的最大块数是65535,每个块最多可以有(1024,1024,64)个线程。那么为什么这个内核会为Cjc数组计算错误的输出?

2 个答案:

答案 0 :(得分:0)

我觉得您发布的代码存在一些问题:

  1. 我猜findkernel在上面的CUDA代码中是kernel
  2. kernel有8个参数,但您只能使用7个参数来调用findkernel。这看起来不对劲!
  3. kernel,您测试if(tid < cols) - 我想这应该是if(tid < count) ??
  4. 为什么kernel期望count成为指针?我认为您不会将int指针传递给findkernel而是传递常规整数值。
  5. 为什么__device__ bool mult获得count / int *val如果不使用?
  6. 我猜#3或#4可能是你问题的根源,但你也应该看看其他事情。

答案 1 :(得分:0)

好的,所以我终于想出了使用cudaError_t当我尝试cudaMemcpy从设备到主机的d_Cjc数组时,它会抛出以下错误。

CUDA error: the launch timed out and was terminated

事实证明findkernel中的某些计算花费了相当多的时间,导致显示驱动程序因操作系统的“看门狗”时间限制而终止程序。

我相信我必须通过移除它的显示来关闭X服务器或ssh我的gpu机器(从另一台机器)。这将花费我一些时间来进行不超过操作系统“监视”限制的计算。