当块编号小于最大编号时,cuda内核失败

时间:2016-10-24 07:55:17

标签: cuda

我在CUBLAS中编写了一个与cublasSdgmm相同的CUDA函数,我发现当我增加块编号时,函数性能可能会更差,甚至会失败。

这是代码,M = 9.6e6,S = 3,最佳性能块编号为320,我的GPU为GTX960,X维度的最大块大小为2147483647。

__global__ void DgmmKernel(float *d_y, float *d_r, int M, int S){
  int row = blockIdx.x*blockDim.x + threadIdx.x;
  int col = blockIdx.y*blockDim.y + threadIdx.y;
  while(row < M){
    d_y[row + col * M] *= d_r[row];
    row += blockDim.x * gridDim.x;
  }
}
void Dgmm(float *d_y, float *d_r, int M, int S){
  int xthreads_per_block = 1024;                                                                 
  dim3 dimBlock(xthreads_per_block, 1);                                        
  dim3 dimGrid(320, S);                                             
  DgmmKernel<<<dimBlock, dimGrid>>>(d_y, d_r, M, S);                
}       

我猜原因是GPU中可能存在资源限制,是不是正确?

如果它是正确的,什么特定资源限制性能,内核函数只读取两个向量并执行乘法运算。是否有任何方法可以提高我的GPU性能。

1 个答案:

答案 0 :(得分:2)

您在内核启动时反转了块和网格维度参数,并且您的内核永远不会运行。你应该这样做:

  dim3 dimBlock(xthreads_per_block, 1);                                        
  dim3 dimGrid(320, S);                                             
  DgmmKernel<<<dimGrid, dimBlock>>>(d_y, d_r, M, S);  

如果您的代码包含appropriate runtime error checking,则您已经知道内核启动失败,并且对于S&gt; 3的任何值,配置错误都是无效的。