PyTorch-内核在哪里发布



我需要获得PyTorch启动的内核的信息。例如一个调用堆栈信息;main.py:24-&gt->callkernel.py:53";将是有益的。我是否可以在PyTorch应用程序执行过程中收集这些信息?我目前也在搜索PyTorch的源代码,但仍然找不到CUDA内核的启动行。我的问题有两个:

  • 我可以在内核启动时获取调用堆栈吗
  • 有人能给我看一个PyTorch源代码中内核启动的例子吗

要获得有用的堆栈跟踪,您很可能需要使用调试符号构建pytorch(此处提供了构建说明)。我不确定是否有任何调试版本可供下载。但是,如果没有一些背景,堆栈跟踪可能没有多大意义,所以这里有一个关于代码库中定义内容的概述:

PyTorch中的大多数运算符在代码库中实现为PyTorch/aten/src/aten/native中的C++at::native命名空间函数。构建PyTorch时,代码生成脚本会自动为native_functions.yaml中定义的运算符生成Python函数和Python-to-C++绑定,并且生成的代码不会被检查到repo中(因此,如果您想了解代码生成中发生了什么,则必须阅读脚本或自己构建PyTorc)。

at::native操作员通常会为该操作员调用设备调度函数,该函数通常以_stub为后缀。dispatch函数检查参数所在的设备(cpu、cuda等),然后运行特定于设备的实现。从那里,另一个分派发生,它调用特定于数据类型的实现。

举个例子,这里声明了add.out运算符(在Python中执行torch.add(..., out=...)时调用)。Codegen生成将Python函数绑定到这里定义的at::native::add_out所需的一切。请注意,该函数调用add_stub,这是设备调度函数。

用于CCD_ 8的CPU实现在这里被注册并且在这里被实现为CCD_。CUDA实现在这里被注册并且在这里被实现为add_kernel_cuda。请注意,这两者都使用了一个TensorIteratorBase对象。长话短说,这个对象将遍历张量输入中应该添加在一起的每一对元素。

add_kerneladd_kernel_cuda中还有另一个分派,它根据参数的数据类型选择一个单独的实现。单独的数据类型实现是从共享模板函数生成的。您可以看到,CPU函数对于向量化和非向量化操作也有不同的实现,而CUDA实现只有一个。

如果您想查看完整的堆栈跟踪,可以使用gdb --args python <script name>运行一个脚本,并为所需的特定内核创建一个断点。同样,需要调试符号来理解它

最新更新