我的程序,它绘制一个小动画,使用过剩和cuda,并用C ++编写,一段时间后挂起,我在调试器中看到以下跟踪,当它挂起后几秒钟中断它:
Program received signal SIGINT, Interrupt.
0x000000011302a84c in cuGraphicsGLRegisterBuffer ()
(gdb) bt
#0 0x000000011302a84c in cuGraphicsGLRegisterBuffer ()
#1 0x000000011306bc36 in cuGraphicsGLRegisterBuffer ()
#2 0x0000000113039455 in cuGraphicsGLRegisterBuffer ()
#3 0x0000000113006864 in cuGraphicsGLRegisterBuffer ()
#4 0x000000011303cbe6 in cuGraphicsGLRegisterBuffer ()
#5 0x000000011303d972 in cuGraphicsGLRegisterBuffer ()
#6 0x0000000113028bc6 in cuGraphicsGLRegisterBuffer ()
#7 0x000000011302a090 in cuGraphicsGLRegisterBuffer ()
#8 0x000000011301fcb2 in cuGraphicsGLRegisterBuffer ()
#9 0x0000000112ffcead in cuGraphicsGLRegisterBuffer ()
#10 0x0000000113001718 in cuGraphicsGLRegisterBuffer ()
#11 0x0000000112ff27cf in cuMemcpyDtoH_v2 ()
#12 0x00000001001d70c4 in cudaGetExportTable ()
#13 0x00000001002098a5 in cudaMemcpy ()
(这是堆栈跟踪的顶部;其余的是我自己的函数,其中一个调用cudaMemcpy。)
如果我尝试在挂起后立即中断,则跟踪如下:
#0 0x00007fffffe0026d in __spin_lock ()
#1 0x00007fff880f855b in pthread_mutex_unlock ()
#2 0x000000011303ad89 in cuGraphicsGLRegisterBuffer ()
#3 0x000000011303b972 in cuGraphicsGLRegisterBuffer ()
#4 0x0000000113026bc6 in cuGraphicsGLRegisterBuffer ()
#5 0x0000000113028090 in cuGraphicsGLRegisterBuffer ()
#6 0x000000011301dcb2 in cuGraphicsGLRegisterBuffer ()
#7 0x0000000112ffaead in cuGraphicsGLRegisterBuffer ()
#8 0x0000000112fff718 in cuGraphicsGLRegisterBuffer ()
#9 0x0000000112ff07cf in cuMemcpyDtoH_v2 ()
#10 0x00000001001d70c4 in cudaGetExportTable ()
#11 0x00000001002098a5 in cudaMemcpy ()
我不知道如何处理这个问题。在cudaPeekAtLastError
调用之前,cudaMemcpy
没有给出任何错误。我也知道我可以运行nvidia SDK中包含的程序。此外,该程序在挂起之前运行几秒钟,这意味着所有cudaMemcpy
调用在挂起之前执行而不会产生错误,因此似乎没有任何问题具体涉及我如何调用cudaMemcpy
,或指针被错误分配(如果是,我希望cuda只生成一个错误,而不是挂起)。
该卡是GeForce 9400M,Cuda驱动程序/运行时4.2,Cuda功能1.1。
有什么建议吗?
答案 0 :(得分:1)
我猜你有一个指针问题,例如尝试复制缓冲区(源或目标)的末尾,或完全引用错误的指针。一旦你开始踩到无效的内存,不要指望任何理智的错误报告或有用的回溯。
查看您的回溯,可以调用GLRegister调用,因为您无意中尝试从映射到OpenGL的设备内存空间进行复制。
尝试cuda-memcheck和/或valgrind。或者,因为很容易重现,所以首先验证(通过调试器或printf)您传入memcpy的值。或者,通过禁用部分代码来手动进行二进制搜索,直到事情再次起作用。