【问题标题】:What can cause this cuda stack trace and what is wrong with this call to cudaMemcpy?什么会导致这个 cuda 堆栈跟踪以及这个对 cudaMemcpy 的调用有什么问题?
【发布时间】: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


【解决方案1】:

我猜您遇到了指针问题,例如试图复制超出缓冲区(源或目标)的末尾,或者完全引用了错误的指针。一旦你开始踩到无效内存,不要指望任何理智的错误报告或有用的回溯。

查看您的回溯,可能会调用 GLRegister 调用,因为您无意中尝试从映射到 OpenGL 的设备内存空间进行复制。

尝试 cuda-memcheck 和/或 valgrind。或者,因为很容易重现,所以首先验证(通过调试器或通过 printf)您传递给 memcpy 的值。或者,通过禁用部分代码来手动开始二进制搜索,直到一切恢复正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多