gpt4 book ai didi

python - 如何跟踪从 numpy 到 C 实现的 "calling chain"?

转载 作者:行者123 更新时间:2023-12-05 02:26:53 25 4
gpt4 key购买 nike

我已阅读 tutorial and API guide of Numpy ,并且我从这个有用的文档中学习了如何使用我自己的 C 代码扩展 Numpy 或如何使用 C 调用 Numpy 函数。

然而,我真正想知道的是:如何跟踪从 python 代码到 C 实现的调用链?或者我怎么知道它的哪一部分 C implementation对应于这个简单的 numpy 数组加法?

x = np.array([1, 2, 3])
y = np.array([1, 2, 3])
print(x + y)

我可以使用gdb之类的工具一步步跟踪它的栈帧吗?

或者我可以直接从变量命名策略中识别出相应的代码吗? (比如如果我想知道关于加法的代码,我可以搜索类似 function PyNumpyArrayAdd(...) 的东西)


[编辑] 我找到了一个非常有用的视频,介绍了如何指出这些基本的 C 实现函数或运算符覆盖(如“+”“-”)的 C 实现。

https://www.youtube.com/watch?v=mTWpBf1zewc

通过 Numpy 邮件列表从 Andras Deak 那里得到这个。


[EDIT2] 还有另一种方法可以使用 gdb 跟踪 Numpy 中调用的所有函数。它非常重,因为它将显示 Numpy 中所有被调用的函数,包括这些微不足道的函数。这可能需要一些时间。

首先您需要下载/克隆 Numpy 存储库到您自己的工作空间,然后使用 -g 选项编译它,这将附加调试信息以进行调试。

然后在Numpy的setup.py所在的“path/to/numpy-main”目录下打开终端,然后运行gdb。

如果您想知道在这个 python 语句中调用了 Numpy 的 C 实现中的哪些函数:

y = np.exp(x)

您可以使用第一个答案提供的 gdb python 脚本在 Numpy 实现的所有函数上设置断点: Can gdb set break at every function inside a directory?

通过 source somename.py 加载此 python 脚本后,您可以在 gdb 中运行此命令:rbreak-dir numpy/core/src

并且你可以为每个断点设置命令:

commands 1-5004
> silent
> bt 1
> c
> end

(这里1-5004是你要运行命令的断点范围)

一旦激活断点,该命令将运行并打印第一层回溯(这是您所在的当前函数的信息),然后继续。通过这种方式,您可以跟踪 Numpy 中的所有功能,这是我自己工作环境的照片(我拍了一张快照,因为有规则阻止从工作计算机复制任何字节):

pic of GDB output

希望我的尝试能帮助到后来者。

最佳答案

However, what I really want to know is: how could I track the calling chain from python code to C implementation? Or i.e. how could I know which part of its C implementation corresponds to this simple numpy array addition?

据我所知,主要有两种方法:使用调试器或跟踪代码中的函数(通常通过查看包装部分或在 numpy/core/src/XXX/ )。 Numpy 有不同种类的函数。有些更关注 CPython 交互部分(例如类型检查、数组创建、通用迭代器等),有些则专注于计算部分(高效地进行计算)。关于你想要什么,需要检查不同的文件。 core/src/umath/loops.c.src 是执行基本独立数学运算的核心计算函数的方法。

Can I use some tools like gdb to track its stack frame step by step?

除非您熟悉 Numpy 的代码,否则使用调试器是常用的方法。您可以尝试通过查看包装器代码来找到 Numpy 入口点函数,但我认为这有点困难,因为这部分代码的可读性不是很好(生成许多相关部分当然是为了便于开发避免错误)。 GDB 的困难部分是在 Numpy 中找到函数的第一个入口点(CPython 解释器函数调用很难跟踪,因为它们很多(有时被递归调用)并且调用堆栈很大,远非清晰(即。没有关于正在执行的实际语句/表达式的明确信息。也就是说,AFAIR,入口点通常类似于 PyArray_XXXarray_XXX。你可以还跟踪了 Numpy 库的第一个函数执行代码。

Or can I directly recognize the corresponding codes from variable naming policy?

一些函数有一个标准化的名称,例如 PyArray_XXX。也就是说,核心计算功能通常没有。它们有一个由模板系统生成的名称,该系统解析注释和注释并基于此生成代码。两个数组相加,主要计算函数应该是例如@TYPE@_add@isa@其中 @TYPE@ 是关于您的目标平台的 INTLONG。有一个用于 float 的特殊版本(即特化),它使用优化的成对求和以确保准确性。这种命名约定非常频繁,因此您可以在代码中搜索 _addbegin repeat 部分 with add 作为 种类参数。


相关帖子:Numpy argmax source

关于python - 如何跟踪从 numpy 到 C 实现的 "calling chain"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73578142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com