pytorch2.1 GPU Add算子调用流程代码走读

准备工作:

要对Pytorch的c++代码进行比较方便的debug, 需要先做完以下几件事儿:

  1. 购买NVIDIA显卡装在自己的电脑上. (需要会拆装显卡, 连接电源线之类的操作)

  2. 安装nvidia显卡驱动, 安装cuda, 安装cudnn. 这里会遇到显卡驱动版本/显卡本身/cuda/cudnn版本是否匹配的问题. 安装过程中会遇到gcc版本和linux核版本是否一致的问题. (centos的话可以直接yum安装显卡驱动)

  3. 下载一份Pytorch源码. 这里会遇到pytorch子仓无法下载的问题(里面有Google的代码仓无法直连, 需要魔法上网, 并且把git的http/socks代理设置为梯子的本地端口号).

  4. 源译编译一份debug版本的Pytorch. 这里会遇到cmake版本问题. 为了减少问题, 尽量把编译脚本中能禁用的选项全部禁用掉. (DEBUG=1 USE_DISTRIBUTED=0 USE_MKLDNN=0 BUILD_TEST=0 USE_FBGEMM=0 USE_NNPACK=0 USE_QNNPACK=0 USE_XNNPACK=0 USE_NCCL=0 python3 setup.py develop
    )

  5. 源码编译一个和gcc匹配的gdb, 这里可能遇到动态库版本不一致的问题(比如说libstdc++.so.6).

  6. 给你的linux系统安装图形界面. 再安装一个linux版本的vscode和chrome(方便随时查资料). 这一步可以不做, 但是为了方便代码跳转和阅读的话, 最好还是在linux的图形界面上搞.

可能是因为我的linux是centos7.9, 反正遇到的问题比较多. 也许用ubuntu18.04系统问题会少一点.

如果你对linux上软件的源码编译安装, 软链接替换等操作不熟悉的话, 这个过程就会比较艰难, 以上每一件事儿都可能卡住半天甚至一天的时间. 大概需要一个星期才能搞定所有问题.

如果你有钞能力的话, 以上每一个步骤你都可以在淘宝上找运维装机服务来解决, 估计500块钱之内可以解决.

正文

CPU上是怎么调用过来的 跟另一篇博客大同小异, 但因为版本不同(我的torch版本为: 2.1.0a0+gitdc4a253 ), 代码逻辑有所变化.

首先是从python_variable_methods这个文件中, 这个文件主要做的应该是c++和python互操作的功能, 就是调用python对象中加法绑定的c++函数.


1-python_variable_methods.png

然后进入THPVariable_add方法, 这个进行一个操作数的类型判断, 调用2565行的Tensor的add方法.

2-THPVariable_add.png

进入ops的add_Tensor方法

3-TensorBody.png

调用939行创建的op的call方法.

4-Operators_2.png

这里是比较关键的角色出场了, Dispatcher, 所有的算子应该都是注册到这个Dispatcher中的.

5-TypedOperatorHandle.png

在Dispatcher的调度下, 根据632行op的dispatchKeySet找到对应的op. 然后进行调用.

6-Dispatcher__call.png

这部分代码看的云里雾里的, 应该都是一些为了让代码简洁而写的封装代码吧

7-KernelFunction__call.png
8-callUnboxedKernelFunction.png
9-wrap_kernel_functor_unboxed_.png
10-WrapFunctionIntoFunctor_.png

经过一系列云里雾里的绕绕, 进入到这个wrapper_CUDA_add_Tensor.cu这个文件, 这个就是cuda代码的文件了.
在op.impl方法中进行实际的调用

11-wrapper_CUDA_add_Tensor.png

对于Tensor加法来说, 这个op.impl就是332行的代码, 这里调用add_kernel方法

12-UfuncCUDA_add.png

67行这里是一个宏写法的switch语句, 下面一大片代码只会走其中一个分支. 因为是宏的写法, debug进不去. 也没关系直接看case就好了. 不管哪个case都会调用gpu_kernel这个方法

13-add_kernel.png

下面是gpu_kernel的具体实现, 调用了gpu_kernel_impl方法

14-gpu_kernel.png

接下来是gpu_kernel_impl的实现, 可以看到是调用了launch_vectorized_kernel方法.

15-gpu_kernel_impl.png

再往下就会调用到核函数了.

2023-05-10 14-03-06 的屏幕截图.png

可以看到这里就已经走到了调用核函数的位置了.

核函数.png

从注释可以看出 该部分代码会判断一下block的大小, 来决定是否对数据进行展开.

该核函数调用了另一个在device上调用执行的方法


image.png

policy_t的注释这样写的:


image.png

这段代码看起来就是根据Tensor的数据类型不同来按照不同的方式加载到args数组中, 然后在GPU上调用传入的elementwise的f函数, 并把args作为入参. 这样Tensor的加法就计算完成了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容