【发布时间】:2012-05-23 03:41:16
【问题描述】:
我的程序,它绘制一个小动画,使用 glut 和 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。
有什么建议吗?
【问题讨论】:
-
窥视我的水晶球,我猜你正在执行的是到一个设备,以从一个在 OpenGL 注册的缓冲区中托管内存传输。那会很接近吗?
-
设备内存是用 cudaMalloc 分配的,没有注册到 OpenGL。代码中没有 Cuda 和 OpenGL 使用相同设备指针的地方,所以我希望 Cuda 和 OpenGL 在这里完全分开。
-
你有一个失控的递归函数吗?
-
不,函数不是递归的。
-
请注意,多行
cuGraphicsRegisterBuffer只是因为发布库不包含符号,所以您只能获取库入口点名称。如果您可以发布一个重现问题的独立代码示例,这将有所帮助。
标签: cuda