2012-08-06 23 views
0

这里是我启动的并行计算某个数组的内核。Cuda内核产生的结果向量为零

__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); 

我使用GTX 480与CC 2.0的配置和。 现在我面临的问题是,无论何时q增加超过4096,​​数组中的值全部产生为0。 我知道我可以在X方向上使用的最大块数是65535,每个块最多可以有(1024,1024,64)个线程。那么为什么这个内核计算​​数组的错误输出呢?

回答

0

好吧,我终于想通了使用cudaError_t,当我试着cudaMemcpyd_Cjc数组从设备到主机,它会引发以下错误。

CUDA error: the launch timed out and was terminated 

事实证明,一些findkernel计算正在采取合理的大量的时间,这使得显示器驱动程序终止,因为OS“看门狗”的时间限制方案。

我相信我将不得不关闭X服务器或ssh我的gpu机器(从另一台机器)通过删除它display.This会给我一些时间来做计算,不会超过'看门狗'限制的操作系统。

+0

你的矩阵有多大?如果它们不是非常大,我敢肯定你可以在不关闭X的情况下做到这一点!首先,32个线程似乎太低 - 你尝试过使用128还是256?另一种可能性是重写你的内核:目前,你遍历每一列的所有行。如果'rows'很大,这是非常低效的。您可以计算每个矩阵条目的“mult”结果(0或1),然后使用并行前缀和(Thrust'scan')对每列的值进行求和。 _(可能有更有效的方法,这正是我刚才想到的......)_ – kroneml 2012-08-08 07:07:25

+0

@kroneml ...行和列以'4096','8192'等等命令....现在我在所有计算结束后使用'thrust :: inclusive_scan',并且'dCjc'是复制回主机端.... – Recker 2012-08-08 21:57:17

0

我好像有你贴了几件事情错的代码:在上面的代码CUDA

  1. 我猜findkernelkernel
  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如果不使用?

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

+0

@kroneml ....我编辑了我的代码....我想我张贴我的代码从备份文件,其中有旧代码... 1)是 2)3)4)5)我编辑了我的代码.. – Recker 2012-08-07 16:31:49