【问题标题】:Cuda kernel - possible optimizationsCuda 内核 - 可能的优化
【发布时间】:2012-08-25 23:55:14
【问题描述】:

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

__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 来查找我的结果阵列。 我的问题是,我的内核是否还有改进/优化的空间?我尝试使用共享内存,但它会产生错误的答案或引发运行时异常。

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

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

【问题讨论】:

  • 你能简单地解释一下你的代码打算做什么吗?那么我们就有更好的机会帮助您进行优化
  • @asm...试图在两个稀疏矩阵相乘中找到结果稀疏矩阵的 JC 数组....
  • 好吧,你实现了像matlab JC数组一样的东西..我会尝试提出一些想法
  • @asm..我有一个CSR 的矩阵和另一个CSC 格式的矩阵...所以我必须检查结果列是否有非零.. .我通过将每列B矩阵与A矩阵的所有行相乘来做到这一点(***假设操作为C = A * B ***)...如果有非零,我将在每个位置加1结果 Cjc 数组,这样在主机端 thrust::inclusive_scan 之后,我将拥有我想要的正确 JC 数组....

标签: cuda thrust


【解决方案1】:

至于使用kernel&lt;&lt;&lt;blocks,threads,mem&gt;&gt;&gt;mem分配的共享内存是每个块分配的内存量。所以每个块都会获得mem 的内存量。

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

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

不完全是合并访问。非合并访问很慢。

【讨论】:

  • 不,除非你有一个好的旧 GTX 8800,否则我不认为会有合并问题))但我同意 abhinode 提供的代码没有多大意义..
猜你喜欢
  • 2011-10-22
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
相关资源
最近更新 更多