Nsight调试无法进入断点

  • 14 replies
  • 439 views
Nsight调试无法进入断点
« 于: 六月 19, 2019, 04:02:35 pm »
如题,Nsight版本为6.0,cuda为10.0,使用两个项目进行测试-Cuda_Samples的matrixMul项目和新建CUDA10.0自动生成的向量加法项目,生成且正常运行后,分别在__global__ void MatrixMulCUDA和__global__ void addKernel里设置断点,点击Nsight-start cuda debugging(legacy)后,程序进入调试,最终进入中断状态,详见图示。
ps:关于Nsight和VS项目的设置有尝试一些,但并不奏效!!
« 最后编辑时间: 六月 19, 2019, 04:07:40 pm 作者 meteorsfate »

Re: Nsight调试无法进入断点
« 回复 #1 于: 六月 20, 2019, 02:39:23 pm »
楼主没太看懂你的中文?
不明白楼主给出自己的kernel和自带的范例kernel(那个加法)的意思?

你用的是什么卡?过老的卡是不被支持的。

是想说都无法进入断点么?同时还“尝试了各种设置”?这种情况建议检查一下显卡是否过老。

如果是想说一个能,一个不能,则需要检查kernel是否会执行到。只有kernel能执行到(断点所在),才有可能命中。

等待反馈。

Re: Nsight调试无法进入断点
« 回复 #2 于: 六月 20, 2019, 05:27:44 pm »
我遇到了和他类似的问题,我来解释一下。我现在的程序可以正常运行得到结果,但是如果启用cuda debug的话会有问题。问题总结有两条点:1.断点停不下 2.结果跑不出来(截图中的应用程序处于中断模式)。
我用的卡是笔记本上的MX250,不知道是不是它不支持cuda debug,但是它明明可以跑完整的程序,程序之气那在1050ti上调试的,没有问题。

Re: Nsight调试无法进入断点
« 回复 #3 于: 六月 20, 2019, 07:36:15 pm »
我遇到了和他类似的问题,我来解释一下。我现在的程序可以正常运行得到结果,但是如果启用cuda debug的话会有问题。问题总结有两条点:1.断点停不下 2.结果跑不出来(截图中的应用程序处于中断模式)。
我用的卡是笔记本上的MX250,不知道是不是它不支持cuda debug,但是它明明可以跑完整的程序,程序之气那在1050ti上调试的,没有问题。

MX250是Pascal系列的卡,目前无资料说明它不能支持CUDA调试。

建议更新驱动/系统/尝试Next-Gen和Legacy两种调试方式试试看。
(以及,建议更新你的CUDA开发包为10.1)

Re: Nsight调试无法进入断点
« 回复 #4 于: 六月 20, 2019, 07:38:49 pm »
MX250是Pascal系列的卡,目前无资料说明它不能支持CUDA调试。

建议更新驱动/系统/尝试Next-Gen和Legacy两种调试方式试试看。
(以及,建议更新你的CUDA开发包为10.1)

此外,考虑到很多人依然在坚持很古老的开发包(例如昨天碰到的CUDA 7.5报告自带的驱动找不到显卡的),我建议你至少更新到9.2+,如果可能更新到10.1

此外,请确保kernel能被执行到。(如果中途莫名停在某些地方,不妨发一下host上的stack trace,以确定是代码的前部问题,还是已经在kernel中,属于NSight/Kernel/显卡驱动/VS版本的问题。

Re: Nsight调试无法进入断点
« 回复 #5 于: 六月 21, 2019, 09:45:13 am »
此外,考虑到很多人依然在坚持很古老的开发包(例如昨天碰到的CUDA 7.5报告自带的驱动找不到显卡的),我建议你至少更新到9.2+,如果可能更新到10.1

此外,请确保kernel能被执行到。(如果中途莫名停在某些地方,不妨发一下host上的stack trace,以确定是代码的前部问题,还是已经在kernel中,属于NSight/Kernel/显卡驱动/VS版本的问题。
我的CUDA版本是9.2,因为一起合作开发的老师也在使用这个版本因而目前还不方便更换,至于确保kernel被执行,我认为在它已经生成结果的情况下,可以证明kernel已经被执行了:在CPU端运行可以得到结果:{1,2,3,4,5} + {10,20,30,40,50} = {11,22,33,44,55},
在host上的调用堆栈只有一句话:Unknown -
  • No active CUDA kernels.


在vs的输出里面,有一项是从nsight的输出来源显示的是:
CUDA grid launch failed: CUcontext: 1209174527408 CUmodule: 1209391611440 Function: _Z18ksw_extend2_GPU_M3PiPKhS_S1_iPKaiiiiS_iiS_S_S_S_S_S_S_i
CUDA context created : 25d8a95a5d0
CUDA module loaded:   25d978ddad0 main.cu
CUDA module loaded:   25d9f005000 CPU_functions.cu
CUDA module loaded:   25d9f005c00 loader.cu
CUDA module loaded:   25d9f004700 GPU_functions.cu
CUDA grid launch failed: CUcontext: 2600780277200 CUmodule: 2601122809600 Function: _Z18ksw_extend2_GPU_M3PiPKhS_S1_iPKaiiiiS_iiS_S_S_S_S_S_S_i
这些问题。
请原谅我还不会发图片。 :'(


Re: Nsight调试无法进入断点
« 回复 #6 于: 六月 21, 2019, 11:31:55 am »
此外,考虑到很多人依然在坚持很古老的开发包(例如昨天碰到的CUDA 7.5报告自带的驱动找不到显卡的),我建议你至少更新到9.2+,如果可能更新到10.1

此外,请确保kernel能被执行到。(如果中途莫名停在某些地方,不妨发一下host上的stack trace,以确定是代码的前部问题,还是已经在kernel中,属于NSight/Kernel/显卡驱动/VS版本的问题。
显卡驱动是417.59,我查了一下,是支持cuda9.2的呢。

Re: Nsight调试无法进入断点
« 回复 #7 于: 六月 24, 2019, 02:26:27 pm »
如果是向量加法的例子,

(1)在提示grid launch failed的情况下,还“能得到正确结果”。这个我无法理解。
(2)请确保你开启了cuda memory checker,以便捕捉访存错误(例如你可能的在加法的时候越界)

Re: Nsight调试无法进入断点
« 回复 #8 于: 六月 26, 2019, 09:46:59 am »
如果是向量加法的例子,

(1)在提示grid launch failed的情况下,还“能得到正确结果”。这个我无法理解。
(2)请确保你开启了cuda memory checker,以便捕捉访存错误(例如你可能的在加法的时候越界)

可能是卡的问题吧,我换回了台式机,用原来1050ti,就完全没问题了。

Re: Nsight调试无法进入断点
« 回复 #9 于: 六月 27, 2019, 11:08:34 am »
已解决,应该是显卡驱动和cuda版本适配问题。目前换成cuda8.0和376.51版本的显卡驱动已经能够正常调试。

Re: Nsight调试无法进入断点
« 回复 #10 于: 六月 27, 2019, 12:33:09 pm »
楼主没太看懂你的中文?
不明白楼主给出自己的kernel和自带的范例kernel(那个加法)的意思?

你用的是什么卡?过老的卡是不被支持的。

是想说都无法进入断点么?同时还“尝试了各种设置”?这种情况建议检查一下显卡是否过老。

如果是想说一个能,一个不能,则需要检查kernel是否会执行到。只有kernel能执行到(断点所在),才有可能命中。

等待反馈。

已自行解决,显卡驱动过新导致和cuda版本不匹配。不过目前遇到一个问题:进行矩阵计算,维度较大时(>=1024*1024)调用cudaDeviceSynchronize()返回cudaErrorUnknown错误,且无法访问由cudamallocmanaged分配的内存,显示读取访问权限冲突,而维度较小时,则正常运行且可访问。论坛有回答说是访存越界问题,ps:已开启cuda memorychecker,但目前为止还没检查出来具体在哪里以及如何解决。

Re: Nsight调试无法进入断点
« 回复 #11 于: 六月 27, 2019, 12:54:51 pm »
已自行解决,显卡驱动过新导致和cuda版本不匹配。不过目前遇到一个问题:进行矩阵计算,维度较大时(>=1024*1024)调用cudaDeviceSynchronize()返回cudaErrorUnknown错误,且无法访问由cudamallocmanaged分配的内存,显示读取访问权限冲突,而维度较小时,则正常运行且可访问。论坛有回答说是访存越界问题,ps:已开启cuda memorychecker,但目前为止还没检查出来具体在哪里以及如何解决。

目前已知的唯一原因是访存导致kernel挂了,但如果你认为你的“显卡驱动过新”导致无法调试(我不这样认为)你的1050Ti的话,则没有办法。此外如果你真的发现cuda memory checker检测不到的话,我也没有办法。

这两个现象我多年来从来没有遭遇过像你这样的描述的。

Re: Nsight调试无法进入断点
« 回复 #12 于: 六月 27, 2019, 02:24:20 pm »
目前已知的唯一原因是访存导致kernel挂了,但如果你认为你的“显卡驱动过新”导致无法调试(我不这样认为)你的1050Ti的话,则没有办法。此外如果你真的发现cuda memory checker检测不到的话,我也没有办法。

这两个现象我多年来从来没有遭遇过像你这样的描述的。

抱歉,我的表述问题。驱动原因已经得到验证,我按照另一台可调试cuda的电脑驱动配置进行安装后,目前已经可以调试,只是在进行大矩阵计算时(1024*1024实际上似乎并不大)会出现访存问题,语句cudaError_t result = cudaDeviceSynchronize()执行完毕后,返回值是30,而通过cudamallocmanaged分配的内存皆不可访问,cuda memory checker也并没有检测到错误,会出现黑屏提示显卡驱动停止响应并已回复,同时会报如图所以的错误:
« 最后编辑时间: 六月 27, 2019, 02:25:27 pm 作者 meteorsfate »

Re: Nsight调试无法进入断点
« 回复 #13 于: 六月 27, 2019, 03:51:03 pm »
抱歉,我的表述问题。驱动原因已经得到验证,我按照另一台可调试cuda的电脑驱动配置进行安装后,目前已经可以调试,只是在进行大矩阵计算时(1024*1024实际上似乎并不大)会出现访存问题,语句cudaError_t result = cudaDeviceSynchronize()执行完毕后,返回值是30,而通过cudamallocmanaged分配的内存皆不可访问,cuda memory checker也并没有检测到错误,会出现黑屏提示显卡驱动停止响应并已回复,同时会报如图所以的错误:

显卡驱动停止响应这个问题,八成是显卡太弱,而kernel运行时间太长。

建议的解决方案:
从开始菜单运行NSight Monitor,里面有个Options(运行后在屏幕右下角的通知区域有个绿球),然后在Options里面有个超时值,改成默认的两秒太短了,可以改长一点,这也是Windows上使用WDDM驱动的时候运行的kernel运行的最大时间,超时将重置显卡驱动,同时你会观测到黑屏一下。修改完毕后,重启生效。

或者你可以购买更强大一点的卡。

或者你可以拆分你的kernel规模,每次启动较少的线程(PS:你是神马卡?)

Re: Nsight调试无法进入断点
« 回复 #14 于: 六月 27, 2019, 06:15:03 pm »
显卡驱动停止响应这个问题,八成是显卡太弱,而kernel运行时间太长。

建议的解决方案:
从开始菜单运行NSight Monitor,里面有个Options(运行后在屏幕右下角的通知区域有个绿球),然后在Options里面有个超时值,改成默认的两秒太短了,可以改长一点,这也是Windows上使用WDDM驱动的时候运行的kernel运行的最大时间,超时将重置显卡驱动,同时你会观测到黑屏一下。修改完毕后,重启生效。

或者你可以购买更强大一点的卡。

或者你可以拆分你的kernel规模,每次启动较少的线程(PS:你是神马卡?)

GTX1050,gpu内存分配和同步方式为cudamallocmanaged、cudaDeviceSynchronize,kernel设置为:dim3 blockSize(32, 32);dim3 gridSize((width + blockSize.x - 1) / blockSize.x,(height + blockSize.y - 1) / blockSize.y),width,height为矩阵宽高(ps:设定width=height)。关于显卡驱动重置黑屏,我调整过TDR,甚至设置为100,blocksize为(16,16)以及其他选择时,只要width/height>=1024,仍然会出现重置黑屏,cudaDeviceSynchronize会失败返回cudaErrorUknown,最重要的是内存无法访问。此外我尝试用cudamalloc和cudamemcpy来分配读取内存,kernel和TDR设置不变,这种情况下有所变化,width/height =1024或2048时均可正常运行且计算结果正确(即使显卡重置黑屏),但大于2048则不行,cudamemcpy会失败返回cudaErrorUknown,内存可访问但计算结果是错误的,观察发现全是初始值

我不清楚是否是kernel函数中矩阵坐标和线程对齐存在问题,但有一点:矩阵维度较小(只要小于1024*1024)时,程序调试可以正常进行,无重置黑屏,计算结果正确。我认为不太像是block及grid设置原因,可能是我kernel函数内部出了问题,但目前我无法找到。