数据:一定数量的光线、三角形光线集合(用二叉树组织)
问题描述:
在GF GT420上运行一个直线与三角形集合求交的cuda程序,当光线数量为200×200时,程序可以照常运行(但结果不对),当光线数量达到300×300时,程序以运行即黑屏,然后自动退出
此外,在kernel使用了较多的寄存器空间,如结构体数组(长度为50)、局部变量。
[attach]2962[/attach]
数据:一定数量的光线、三角形光线集合(用二叉树组织)
问题描述:
在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可以运行较长时间的极限值是多少,就是再怎么设置驱动程序都会终止的情况。
请勿挖坟!新问题请新开主题。
您必须重新启动一次才能让你的设置生效的。直接该动完没用。
请你理解此点。