pycuda.debug 实际上有什么用?
在一个较大的项目中,我遇到了一个奇怪的、一直存在的错误,让我很困惑。这是一个典型的“黑箱”错误;当我用 cuda-gdb python -m pycuda.debug prog.py -args
运行时,一切正常,但速度很慢。如果我去掉 pycuda.debug,程序就会出错。而且这个错误总是在多个内核执行的同一个点出现。
简单来说,我有三个内核,它们在不同的网格和块配置中被用来解决一个更大优化问题的“切片”。严格来说,这些内核要么正常工作,要么不工作,因为它们只被告知“这里有更多数据”,除了数据的内容外,它们并不知道其他信息,比如迭代次数,或者输入数据是否被分割。在这个特定的点之前,它们的表现都很好。
基本上,我无法在没有 pycuda.debug 的情况下看到发生了什么,因为它需要将调试符号暴露给 GDB,但即使有了 pycuda.debug,我也看不到问题所在。
那么,pycuda 实际上做了什么,我该在我的内核代码中寻找什么呢?
1 个回答
1
几乎没有什么特别的。它主要是在pycuda.driver模块中设置一些编译器的标志,这样CUDA代码就能带上必要的调试信息进行编译,并且以CUDA-gdb需要的方式进行组装。剩下的部分是一个小的包装器,它很好地封装了pycuda库,让一切都能正常工作。整个代码大约只有20行,如果你想的话,可以在源代码中看到。
这里的关键是,在调试器中运行的代码会把所有的寄存器、共享内存和局部内存的信息都显示出来,这样驱动程序就能读取本地程序的状态。所以,如果你有一些代码在调试模式下能运行,但在正常模式下却失败,通常意味着有共享内存的缓冲区溢出或者指针错误,这会导致GPU出现类似于程序崩溃的情况。