CUDA Nsight 调试焦点块未激活

CUDA Nsight Debug Focus Block not active

原代码:

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 的并行化代码:

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 不匹配。

因为这个 idx 是为第 135 列和第 640 行形成的,所以我尝试在内核中查找值。这转换为 Block(16,7) 和 Thread (80,0),但是当我尝试使用夜间调试焦点时,我收到以下消息:"Block not active"。

我想知道这是什么意思?好像那个块不存在,但为什么不存在?

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

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

在 Nsight Visual Studio 版手册中

  • Specify Debugger Context 节指出 "You can only choose blocks that are currently executing on the GPU hardware."
  • 部分 Set GPU Breakpoints 条件断点小节提供了有关如何为特定线程添加条件断点的步骤。

例如,您可以使用表达式

添加条件断点

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