关于CUDA调试的问题

斑竹你好,我从CUDA BY EXAMPLE上摘抄了一段代码,稍微进行了下改编,kernel如下
global void blend_kernel(float *dst,bool dstOut)
{
// map from threadIdx/BlockIdx to pixel position
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x;
int left = offset - 1;
int right = offset + 1;
if (x == 0) left++;
if (x == DIM-1) right–;
int top = offset - DIM;
int bottom = offset + DIM;
if (y == 0) top += DIM;
if (y == DIM-1) bottom -= DIM;

float t, l, c, r, b;
if (dstOut)
{
t = tex1Dfetch(texIn,top);
l = tex1Dfetch(texIn,left);
r = tex1Dfetch(texIn,right);
b = tex1Dfetch(texIn,bottom);
c = tex1Dfetch(texIn,offset);
}
else
{
t = tex1Dfetch(texOut,top);
l = tex1Dfetch(texOut,left);
r = tex1Dfetch(texOut,right);
b = tex1Dfetch(texOut,bottom);
c = tex1Dfetch(texIn,offset);
}
if (y == 0||y == DIM-1)
{
dst[offset] = (l+r+4t+4b-4*c)/6;
}
else
{
dst[offset] = (l+r+(1.0-1.0/DIM/2/((float)y/DIM))*b+(1.0-1.0/DIM/2/((float)y/DIM))*t)/4;
//dst[offset] = c + SPEED * (t + b + r + l - 4 * c);
}
}

我在声明float变量的地方设置了断点,命中后执行5次单步后,也就是执行完c = tex1Dfetch(texIn,offset);后,Nsight提示说"trying to step invalid wrap",并且有时候会产生黑屏一下然后又恢复的情况,请问这是怎么回事?

另外,除了Nsight本身的说明手册以外,还有什么手册或者书籍是讲关于CUDA调试这方面的?最好是中文的···看英文的总感觉自己会遗漏或是搞错什么东西···

楼主您好,

请您关闭TDR并重新启动贵计算机一次,看看问题是否消失。

感谢周末来访。

斑竹你好,我关闭了TDR并且重启了电脑,但问题依然存在
并且有时候屏幕会出现奇怪的黑色或其他颜色的斑点
是不是需要我在调试CUDA的时候NVIDIA的显卡不能承担显示屏幕的任务?需要使用集成显卡显示?

LZ您好:

这个现象在目前的主流显卡上是极为罕见的,您可否告知您的显卡型号?

GT335M
笔记本型号为华硕N82JQ
是11年的时候买的

LZ您好:

您的GPU应当是计算能力版本为1.x的,据第三方来源的说法,1.x的硬件在计算时如果指针指飞了有可能会破坏原本显示用途的显存空间的内容,并产生类似于“并且有时候屏幕会出现奇怪的黑色或其他颜色的斑点”的现象。(计算能力2.0及之后的设备未见此类现象。)

因此建议您检查一下您的代码,是否有访存越界的问题。

以及“有时候会产生黑屏一下然后又恢复的情况”这个一般是显卡驱动超时造成的,您可以先检查下代码有无死循环等的现象,若有,请修正之。再关闭TDR或者设定为足够大的值,并重启电脑。

大致建议如上,祝您好运~

请问你是怎么调试的?为什么我在 kernel函数里面,添加断电,总是没反应呢

kernel函数是在GPU里执行的,CPU自然不知道kernel函数执行到什么地方了,调试的时候CPU只是调用kernel,而根本不会进到函数里面去,所以在里面打断点是没有用的。调试的话我现在都是添加打印的,不过1.x的设备,我也不知道了,还是请教一下版主吧。感觉你的这种情况内存越界的可能性比较高。

各位好:

建议使用nsight来调试device端代码,以及使用cudaMemcheck工具检测访存越界。

1.x的设备不支持device端使用printf打印。
以及即便是2.0及以上的设备,也只建议用printf的结果作为参考,在某些情况下,printf看上去是正常输出了,但kernel实际是挂掉的,您可以用nsight发现这样的问题,或者在kernel之后使用cudaDeviceSynchronize()函数并检查此函数的返回值以判断kernel是否正常执行了。

祝各位好运~

不知道哪里有调试的 图文解说…我总感觉是我的操作问题

您好:

请您参阅nsight的手册,那里有详细的官方说明。

祝您调试顺利~