【问题标题】:What does pycuda.debug actually do?pycuda.debug 实际上做了什么?
【发布时间】:2011-08-12 03:02:42
【问题描述】:

作为一个更大项目的一部分,我遇到了一个奇怪的一致错误,我无法理解,但它是一个典型的“黑匣子”错误;使用cuda-gdb python -m pycuda.debug prog.py -args 运行时,它运行良好,但速度较慢。如果我放弃 pycuda.debug,它就会中断。始终如一地在多内核执行的同一点上。

解释;我有(目前三个)内核,用于不同的网格和块排列,以解决更大优化问题的“切片”。这些严格来说应该可以工作,也可以不工作,因为函数本身只被告知“这里还有一些数据”,除了数据的内容之外,不知道诸如迭代次数之类的任何内容,无论它们的输入数据是否已分区或不是,直到这一点,他们表现完美。

基本上,如果没有 pycuda.debug 将调试符号暴露给 GDB,我看不到发生了什么,但我也看不到 pycuda.debug 的问题。

pycuda 实际上做了什么,所以我知道要在我的内核代码中寻找什么?

【问题讨论】:

    标签: python debugging cuda gpgpu pycuda


    【解决方案1】:

    几乎没有。它主要在 pycuda.driver 模块中设置编译器标志,以便使用必要的调试符号编译 CUDA 代码,并以 CUDA-gdb 所需的方式组装。剩下的是一个很小的包装器,它很好地封装了 pycuda 库,所以一切正常。整个python 20行左右,需要的话可以看源码分发中的代码。

    这里的关键是在调试器中运行的代码会将所有从寄存器和共享内存溢出到本地内存,以便驱动程序可以读取本地程序状态。因此,如果您的代码在为调试器构建时运行,而在正常构建时失败,这通常意味着存在共享内存缓冲区溢出或指针错误,导致 GPU 相当于段错误。

    【讨论】:

    • 有趣的是,我现在没有使用任何共享内存! (我之前被过早的优化所困扰)但奇怪的是,与其他数千个几乎相同的内核执行相比,这个特定的数据迭代并没有什么特别之处。无论哪种方式都需要更多调查,谢谢。
    • @Andrew Bolster:如果您愿意在某处提供代码,我可以尝试对其进行测试。我目前有一系列基于 GT200 和 Fermi 的卡可供我使用。
    • 解决了;我正在处理的问题有时可能在数值上不稳定,并且其中一个限制变量设置不正确。谢谢你的提议!
    猜你喜欢
    • 2013-06-02
    • 2020-11-21
    • 2015-02-26
    • 2017-06-29
    • 2013-06-13
    • 2021-10-25
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多