Cuda内核 - 可能的优化

时间:2012-08-25 08:05:14

标签: cuda thrust

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

__device__ bool mult(int colsize,int rowsize,int *Aj,int *Bi)
    {       
        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);

我必须承认,这个内核运行速度很慢。一旦我将数组返回到主机端,我使用thrust::inclusive_scan来查找我的结果数组。 我的问题是,我的内核有任何改进/优化的空间吗?我尝试使用共享内存,但它产生错误答案或抛出运行时异常。

此外,动态分配的共享内存(由内核启动中的第三个参数分配)如何在块之间分配?

任何帮助/提示/暗示将不胜感激。 提前致谢。

1 个答案:

答案 0 :(得分:1)

使用kernel<<<blocks,threads,mem>>> mem分配的共享内存是每个块分配的内存量。因此每个块获得mem个内存量。

对于你的代码,我不明白为什么mult函数中有2个for循环。只是想指出每个线程将执行这2个for循环。此外,由于您在kernel函数中也有一个for循环,这意味着每个线程将多次在mult函数中执行2 for个循环。这很慢。而且,做

int beg = Bptr[tid]; 
int end = Bptr[tid+1]; 

并不是完全合并的访问权限。非合并访问速度很慢。