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)
原代码:
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)