0

这是我为并行计算一些数组而启动的内核。

 __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数组计算错误的输出呢?

4

2 回答 2

0

您发布的代码似乎有一些问题:

  1. 我猜findkernelkernel在上面的CUDA代码中?
  2. kernel有 8 个参数,但你只使用 7 个参数来调用findkernel. 这看起来不太对!
  3. kernel,你测试if(tid < cols)- 我想这应该是if(tid < count)
  4. 为什么kernel期望count是一个指针?我认为您不会将int指针而是常规整数值传递给findkernel.
  5. 为什么__device__ bool multget count/int *val如果不使用它?

我猜#3 或#4 可能是你的问题的根源,但你也应该看看其他的东西。

于 2012-08-07T09:14:09.080 回答
0

cudaError_t好的,所以当我尝试从设备到主机cudaMemcpy 的阵列时,我终于想通了d_Cjc,它会引发以下错误。

CUDA error: the launch timed out and was terminated

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

我相信我将不得不关闭 X 服务器或 ssh 我的 gpu 机器(从另一台机器)移除它的显示。这将为我赢得一些时间来进行不会超过操作系统的“看门狗”限制的计算。

于 2012-08-07T20:50:27.563 回答