如何使用cuda-gdb python调试?

oxcyiej7  于 2023-02-18  发布在  Python
关注(0)|答案(2)|浏览(339)

我写了一个www.example.com,它很简单hello.py that is simply

print("hi")

然后运行

cuda-gdb python3 hello.py

我得到:

Reading symbols from python3...
(No debugging symbols found in python3)
"/home/x/Desktop/py_projects/hello.py" is not a core dump: file format not recognized

如果我在python代码中调用cuda函数,如何调试?

lnlaulya

lnlaulya1#

假设你只需要调试C/C部分,可以使用python中的cuda-gdb。我不知道有哪个调试器可以从调试python跳到调试CUDA C。这里有一个可能的方法,复制了here所提供的方法。
要调试从python调用的CUDA C/C库函数,下面是一种可能性,它受到this article的启发。
1.在本演练中,我将使用t383.pyt383.cuthis answer中的www.example.com和www.example.com文件,并在CentOS7上使用CUDA 10、python 2.7.5
1.使用-G和-g开关编译CUDA C/C
库,就像您执行普通调试一样:

$ nvcc -Xcompiler -fPIC -std=c++11 -shared -arch=sm_60 -G -g -o t383.so t383.cu -DFIX

1.为此我们需要两个终端会话,我将它们称为会话1会话2,在会话1中,启动你的python解释器:

$ python
...
>>>

1.在会话2中,找到与您的python解释器关联的进程ID(将USER替换为您的实际用户名):

$ ps -ef |grep USER
...
USER    23221 22694  0 23:55 pts/0    00:00:00 python
...
$

在上面的示例中,23221是Python解释器的进程ID(使用man ps获取帮助)
1.在会话2中,启动cuda-gdb以附加到该进程ID:

$ cuda-gdb -p 23221
... (lots of spew here)
(cuda-gdb)

1.在会话2中,在(cuda-gdb)提示符下,在CUDA C/C++库中的所需位置设置断点。在本例中,我们将在内核代码的前几行之一(www.example.com文件中的第70行)设置断点t383.cu。如果尚未加载库(在本演练中,我们没有这样做),那么cuda-gdb将指出这一点,并询问您是否希望在将来的库加载中使断点挂起。(或者,在开始cuda-gdb会话之前,您可以在解释器中运行一次python脚本,就像我们在下面的步骤7中所做的那样。这将加载库的符号表,并避免出现此提示)。设置断点之后,我们将在cuda-gdb中发出continue命令,以便再次运行python解释器:

(cuda-gdb) break t383.cu:70
No symbol table is loaded.  Use the "file" command.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (t383.cu:70) pending.
(cuda-gdb) continue
Continuing.

1.在会话1中,运行python脚本:

>>> execfile("t383.py")
init terrain_height_map
1, 1, 1, 1, 1,
1, 1, 1, 1,
1, 1, 1, 1,

1.我们的python解释器现在已经停止(并且没有响应),因为在会话2中我们看到断点已经被命中:

[New Thread 0x7fdb0ffff700 (LWP 23589)]
[New Thread 0x7fdb0f7fe700 (LWP 23590)]
[Switching focus to CUDA kernel 0, grid 1, block (0,0,0), thread (0,0,0), device 0, sm 0, warp 0, lane 0]

Thread 1 "python" hit Breakpoint 1, update_water_flow<<<(1,1,1),(1024,1,1)>>> (
    water_height_map=0x80080000800000, water_flow_map=0xfffcc000800600,
    d_updated_water_flow_map=0x7fdb00800800, SIZE_X=4, SIZE_Y=4) at t383.cu:70
70          int col = index % SIZE_X;
(cuda-gdb)

我们看到断点在库(内核)代码的第70行,正如预期的那样。只要您在库函数中,普通的C/C++ cuda-gdb调试就可以在会话2中的这一点上继续。
当你完成调试时(你可能需要删除设置的断点),你可以在会话2中再次输入continue,以允许控制返回到会话1中的python解释器,并完成你的应用程序。

b1zrtrql

b1zrtrql2#

为了完善Robert的回答,如果你使用的是CUDA-Python,你可以使用选项--args来传递一个包含参数的命令行。例如,这是一个有效的命令行:

$ cuda-gdb --args python3 hello.py

您的原始命令无效,因为如果没有--args,cuda-gdb将接受参数a主机核心转储文件。
以下是完整的命令行,其中包含CUDA-Python repository的示例:

$ cuda-gdb -q --args python3 simpleCubemapTexture_test.py
Reading symbols from python3...
(No debugging symbols found in python3)
(cuda-gdb) set cuda break_on_launch application
(cuda-gdb) run
Starting program: /usr/bin/python3 simpleCubemapTexture_test.py.
...
[Switching focus to CUDA kernel 0, grid 1, block (0,0,0), thread (0,0,0), device 0, sm 0, warp 0, lane 0]
0x00007fff67858600 in transformKernel<<<(8,8,1),(8,8,1)>>> ()
(cuda-gdb) p $pc
$1 = (void (*)()) 0x7fff67858600 <transformKernel>
(cuda-gdb) bt
#0  0x00007fff67858600 in transformKernel<<<(8,8,1),(8,8,1)>>> ()

相关问题