最近问题比较多,还望耐心指教!
对程序进行逐步调试的时候出现以下两个问题:
1.在调用核函数Phase<<<dimGrid, dimBlock>>>(dev_p, dev_u);处发生异常,提示:“查找源”(但是不存在),见附件;[attach]3009[/attach][attach]3010[/attach][attach]3012[/attach]
2.在cudaMemcpy((void*)p, (void*)dev_p, size, cudaMemcpyDeviceToHost);
cudaMemcpy((void*)u, (void*)dev_u, size, cudaMemcpyDeviceToHost);处发生异常,电脑黑屏一下,然后右下角弹出提示框说显示器驱动程序已停止响应,已恢复正常,并提示:“the launch timed out and was terminated”。
基本情况就是这样,真不知该怎么解决了,不知我是否描述清楚了,若有提问欠缺的地方还望多多指点。。。
问题1:如果您使用了中文路径,请换为英文路径。
问题2:您遇到的这种现象其实是windows的一个机制,在显示驱动不响应超过一段时间之后,会黑屏一下,显示the launch timed out and was terminated之类的信息。
比较常见的是kernel运行时间太长造成如此。
但是您定位在cudaMemcpy函数这里,我尚不清楚是何原因,建议您在这里检查返回值等,看看有什么问题。
大致如上,未尽之处,请其他版主/网友补充~
祝您编码愉快~
问题1:所有路径都是英文的。尚不清楚是什么原因。。。
问题2:是因为kernel中循环较多,运行时间太长导致。
对于2:请修改TDR时间限值或者直接关闭即可。
win7的TDR网上有设置方法,xp却没有查到,是不是在里面建一个?
XP下可能不行,这个机制我记得是vista才引入的。
建议您要么更换至WIN7,要么修改您的kernel规模,改大kernel为多个小kernel,从而避免超时。
一楼此图的问题,一般发生在楼主使用了错误的调试方式后出现的。
解决方式:
(1)不要进行host code调试,并step进去您的代码,这样实际上进入编译过程中生成的临时的wrapper代码,而无法进入kernel. (此临时生成的wrapper代码也是host code, 也就是您这样时钟无法调试device code的。)
(2)改为使用cuda调试,cuda调试可以用nsight菜单的start cuda debugging启动,并在点击此菜单前,在你感兴趣的kernel前头加入断点。
以上1点和2点可以规避出现此问题,让你顺利调试kernel code.
因为楼主没有说明自己的确是想调试kernel, 那么我继续做出猜测,
如果楼主想调试编译中生成的wrapper code, 可以在编译的时候加入–keep选项,保留中间临时文件(但一般这么做无意义,不过依然给出可能答案,根据您的可能需要)。
请主要考虑横线前面部分。
我关闭TDR后再次调试程序的时候电脑直接死机,需要重启才好。不知修改时间限值具体是怎么修改的呢?
我的确是想调试kernel,不过按版主这么一说估计是我采用逐步调试导致的。。。
使用Nsight 2.2+可以安全的调试。不怕卡死。
以及,请立刻采用cuda调试。
用nsight就可以改的,您不妨试试看。
不是不能用逐步,而是您没用nsight启动CUDA的debugging而是直接F5进了host端代码的调试,然后逐步调试会这样。
谢谢你们!现在终于知道问题所在了,可是我还没装Nsight呢:L单机调试的话需要有2个GPU才可以,对于这2个GPU分别有什么要求吗?
不需要。单机即可。而且无需改TDR即可调试。
请立刻到资源板块(MUST版主)下载nsight 2.2 or 3.0。享受调试快感。
电脑出了点问题,下午把nsight 2.2装上后进行CUDA debugging,结果没有任何跟踪信息,看到版主在另一个帖子上说2.2的无需任何设置,可直接进行调试,所以我也没有设置什么。刚接触,可能是我不会使用的问题?救助啊:'(
请教:Nsight在SDK的例子中可以设置断点调试,为什么在我自己的程序中设置了断点,还是和host上一样啊?不出现任何信息
您没有具体说明您的“不出现任何信息”是什么情况,所以我将对所有可能进行阐述:
(1)您在kernel中设置了断点。但是在执行nsight菜单里的start cuda debugging后,该断点没有命中。
–解决方案:请确保您处于VS的debug配置下,并且您的.cu文件属性里的generate gpu debug information (-G)是启用的。
(2)如果您在确定了(1)中的方式后,依然没有命中断点。
–解决方案:请确定您的断点处会被执行到。例如,如下位置的断点永远不能被命中:
if (threadIdx.x > 256)
{
代码; //该处设置了断点,但此断点不会在您以(128,1,1)的block shape调试启动时候命中。
}
(3)如果您的“不出现信息”是指您使用鼠标或者F9按键设置了断点但是前面无法出现断点的红色圆形标志,那么请确保您的代码是最新的,以及请确保此处可以插入断点,并建议您重新build一下。一般此时VS会提示“无法在此处设置断点”之类的情况。
请按照(1)(2)(3)酌情选择符合您的情况进行处理。