CUDA Nsight调试焦点块未激活

时间:2015-05-21 09:34:35

标签: c++ cuda nsight

原始代码:

for (int row_idx = 0; row_idx < 1370-1; row_idx++){
   for (int col_idx = 0; col_idx < 644-1; col_idx++){
      register int idx = row_idx*644 + col_idx;
      //some calculations which involve setting d_depthMap[idx]=0;
   }
}

使用cuda的parallised代码:

dim3 threadsPerBlock(8,8);
dim3 numBlocks(644/threadsPerBlock.x, 1370/threadsPerBlock.y);
Kernel <<<numBlocks,threadsPerBlock>>>(d_depthMap, d_dcf, d_inp, d_wdt);

__global__ void Kernel(unsigned char *d_depthMap, float* dcf, cv::Point3f *inp){
    register int rowIdx = (blockIdx.x*blockDim.x)+threadIdx.x;
    register int colIdx = (blockIdx.y*blockDim.y)+threadIdx.y;
    register int idx = rowIdx * 644 + col_idx;

    if (rowIdx < 1369 && colIdx < 643){
       //some calculations which involve setting d_depthMap[idx]=0;
    }
}

当我使用和不使用cuda比较depthMap时,值不匹配idx == 412295。

由于为列135和行640形成了这个idx,我尝试查找内核中的值。这转换为Block(16,7)和Thread(80,0)但是当我尝试使用night调试焦点时,我得到以下消息:&#34; Block not active&#34;。

我想知道这意味着什么?好像那块不存在,但为什么不存在呢?

enter image description here

1 个答案:

答案 0 :(得分:2)

Nsight VSE CUDA调试器是一个硬件调试器,这意味着它只能显示在您停止执行时分配给SM的线程块的状态。错误“阻止未激活”表示您正在请求的块当前未分配给SM。

如果要调试特定块,我建议设置一个条件断点,其条件等于blockIdx和threadIdx。

在Nsight Visual Studio Edition手册中

例如,您可以使用表达式

添加条件断点

@blockIdx(16,7,0)&amp;&amp; @threadIdx(7,0,0)