cuda程序运行黑屏、自动退出

数据:一定数量的光线、三角形光线集合(用二叉树组织)
问题描述:
在GF GT420上运行一个直线与三角形集合求交的cuda程序,当光线数量为200×200时,程序可以照常运行(但结果不对),当光线数量达到300×300时,程序以运行即黑屏,然后自动退出
此外,在kernel使用了较多的寄存器空间,如结构体数组(长度为50)、局部变量。

[attach]2962[/attach]


一种较大的可能就是楼主您的kernel运行超时了。

不知道楼主是否在黑屏的同时看到屏幕一闪,然后右下角出现类似”驱动程序无响应,被重新启动了"之类的字样?

您可以如下取消:
(1)在开始菜单的NVIDIA Corporation中=>找到Nsight Visual Studio Edition组=>找到nsight monitor并启动。
(2)等待任务栏的通知区域(右下角)出现nsight monitor的图标。
(3)使用您的鼠标右键点击该图标=>选择Options=>选择General=>选择WDDM TDR Enabled=>false
(4)点击确定并重新启动贵计算机。

然后下次您的kernel就可以较长时间的运行了。
(需要注意的是,在您如此修改后,如果您的kernel运行过程,例如2分钟,或者,您的kernel死循环了。您可以需要重新启动贵计算机来恢复。)

恩,调试有如下错误提示
Internal debugger error occurred while attempting to launch _Z19PerRay_Tracing_cudaR8Ray_cudaP13Triangle_cudaP11KdNode_cudaPiP15TreeObject_cudaP12TreeIns_cudaS4_S5_P10Scene_cudaP13ArrayLen_cuda in CUcontext 0x05cfd5f0, CUmodule 0x09e8ea80:
code patching failed due to lack of code patching memory.
Please increase Nsight|Options|CUDA|Code Patching Memory and try again.
All breakpoints for function _Z19PerRay_Tracing_cudaR8Ray_cudaP13Triangle_cudaP11KdNode_cudaPiP15TreeObject_cudaP12TreeIns_cudaS4_S5_P10Scene_cudaP13ArrayLen_cuda have been removed.
See Output View for additional messages of this type.
我根据提示将Code Patching Memory从2增加到4 此错误提示依然存在。

善哉啊!楼主你设置了多少个断点!威武87!

有些硬件,支持一定数目的硬件断点,以及如果过多,只能通过软件上的指令替换实现。(例如x86, 例如arm)。

而N卡,可能只支持软件断点, 此时,假设你在地址n设置了一个断点,nsight会保存该处的原始指令,并使用特殊的断点指令替换(例如trap)。保存该处的原始指令需要一定的额外存储空间。

您遇到的提示就是保存原始指令的空间不足,一般常见于您设置的保存空间过小,或者您设置了超多的断点。

您可以尝试在您的VS里的那个nsight选项中(不是右下角的), 里面有个代码hot patching buffer size比例(类似字样),您可以尝试增大这个。

或者,您可以尝试减少断点。

以及,请报告上文的那个实验是否成功。

恩,我会减少断点的。
还有刚才黑屏的问题搞定了,谢谢版主啊!

您客气了。能服务您是我的荣幸!

:handshake

学习了 话说版主的“能服务您是我的荣幸”这句话 还是让我有点小感动啊!!

yuhuilcm您好:

欢迎来论坛看帖,和讨论学习,斑竹就是服务广大网友的。
但是,请勿在本版挖坟灌水哦~

请问一下版主,我的一个核函数的估计运行时间在两分钟左右 但是实际运行的时候10秒就退出 得出一个不对的结果 我已经按照你上面说的设置了 是不是还需要设置其他什么地方呢??

yuhuilcm您好:

建议您先检查一下您的kernel的执行情况,可以采用如下方法:

cudaError_t err;

your_kernel<<<blocks per grid,threads per block>>>(your parameters);

err=cudaDeviceSynchronize();

printf(“%s \n”,cudaGetErrorString(err));

这样可以通过打印出来的信息观察您的kernel是否正确执行了。

您可以先这样检查一下。

祝您好运~

按照版主的方法,得出结果是no error ,我在看看我的程序吧,谢谢版主的答复

yuhuilcm您好:

报no error的话,说明您的kernel是正常执行和返回的。

如果此时结果还有错误,请您检查一下kernel的实现逻辑是否有问题。

祝您调试顺利~

请问这里的kernel可以运行较长时间的极限值是多少,就是再怎么设置驱动程序都会终止的情况。

请勿挖坟!新问题请新开主题。

您必须重新启动一次才能让你的设置生效的。直接该动完没用。

请你理解此点。