原始代码:
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;。
我想知道这意味着什么?好像那块不存在,但为什么不存在呢?
答案 0 :(得分:2)
Nsight VSE CUDA调试器是一个硬件调试器,这意味着它只能显示在您停止执行时分配给SM的线程块的状态。错误“阻止未激活”表示您正在请求的块当前未分配给SM。
如果要调试特定块,我建议设置一个条件断点,其条件等于blockIdx和threadIdx。
在Nsight Visual Studio Edition手册中
例如,您可以使用表达式
添加条件断点@blockIdx(16,7,0)&amp;&amp; @threadIdx(7,0,0)