我写了一个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函数,如何调试?
2条答案
按热度按时间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库,就像您执行普通调试一样:
1.为此我们需要两个终端会话,我将它们称为会话1和会话2,在会话1中,启动你的python解释器:
1.在会话2中,找到与您的python解释器关联的进程ID(将USER替换为您的实际用户名):
在上面的示例中,23221是Python解释器的进程ID(使用man ps获取帮助)
1.在会话2中,启动cuda-gdb以附加到该进程ID:
1.在会话2中,在(cuda-gdb)提示符下,在CUDA C/C++库中的所需位置设置断点。在本例中,我们将在内核代码的前几行之一(www.example.com文件中的第70行)设置断点t383.cu。如果尚未加载库(在本演练中,我们没有这样做),那么cuda-gdb将指出这一点,并询问您是否希望在将来的库加载中使断点挂起。(或者,在开始cuda-gdb会话之前,您可以在解释器中运行一次python脚本,就像我们在下面的步骤7中所做的那样。这将加载库的符号表,并避免出现此提示)。设置断点之后,我们将在cuda-gdb中发出continue命令,以便再次运行python解释器:
1.在会话1中,运行python脚本:
1.我们的python解释器现在已经停止(并且没有响应),因为在会话2中我们看到断点已经被命中:
我们看到断点在库(内核)代码的第70行,正如预期的那样。只要您在库函数中,普通的C/C++ cuda-gdb调试就可以在会话2中的这一点上继续。
当你完成调试时(你可能需要删除设置的断点),你可以在会话2中再次输入continue,以允许控制返回到会话1中的python解释器,并完成你的应用程序。
b1zrtrql2#
为了完善Robert的回答,如果你使用的是CUDA-Python,你可以使用选项
--args
来传递一个包含参数的命令行。例如,这是一个有效的命令行:您的原始命令无效,因为如果没有
--args
,cuda-gdb将接受参数a主机核心转储文件。以下是完整的命令行,其中包含CUDA-Python repository的示例: