pytorch2.1 GPU Add算子調(diào)用流程代碼走讀

準備工作:

要對Pytorch的c++代碼進行比較方便的debug, 需要先做完以下幾件事兒:

  1. 購買NVIDIA顯卡裝在自己的電腦上. (需要會拆裝顯卡, 連接電源線之類的操作)

  2. 安裝nvidia顯卡驅(qū)動, 安裝cuda, 安裝cudnn. 這里會遇到顯卡驅(qū)動版本/顯卡本身/cuda/cudnn版本是否匹配的問題. 安裝過程中會遇到gcc版本和linux核版本是否一致的問題. (centos的話可以直接yum安裝顯卡驅(qū)動)

  3. 下載一份Pytorch源碼. 這里會遇到pytorch子倉無法下載的問題(里面有Google的代碼倉無法直連, 需要魔法上網(wǎng), 并且把git的http/socks代理設(shè)置為梯子的本地端口號).

  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, 這里可能遇到動態(tài)庫版本不一致的問題(比如說libstdc++.so.6).

  6. 給你的linux系統(tǒng)安裝圖形界面. 再安裝一個linux版本的vscode和chrome(方便隨時查資料). 這一步可以不做, 但是為了方便代碼跳轉(zhuǎn)和閱讀的話, 最好還是在linux的圖形界面上搞.

可能是因為我的linux是centos7.9, 反正遇到的問題比較多. 也許用ubuntu18.04系統(tǒng)問題會少一點.

如果你對linux上軟件的源碼編譯安裝, 軟鏈接替換等操作不熟悉的話, 這個過程就會比較艱難, 以上每一件事兒都可能卡住半天甚至一天的時間. 大概需要一個星期才能搞定所有問題.

如果你有鈔能力的話, 以上每一個步驟你都可以在淘寶上找運維裝機服務(wù)來解決, 估計500塊錢之內(nèi)可以解決.

正文

CPU上是怎么調(diào)用過來的 跟另一篇博客大同小異, 但因為版本不同(我的torch版本為: 2.1.0a0+gitdc4a253 ), 代碼邏輯有所變化.

首先是從python_variable_methods這個文件中, 這個文件主要做的應(yīng)該是c++和python互操作的功能, 就是調(diào)用python對象中加法綁定的c++函數(shù).


1-python_variable_methods.png

然后進入THPVariable_add方法, 這個進行一個操作數(shù)的類型判斷, 調(diào)用2565行的Tensor的add方法.

2-THPVariable_add.png

進入ops的add_Tensor方法

3-TensorBody.png

調(diào)用939行創(chuàng)建的op的call方法.

4-Operators_2.png

這里是比較關(guān)鍵的角色出場了, Dispatcher, 所有的算子應(yīng)該都是注冊到這個Dispatcher中的.

5-TypedOperatorHandle.png

在Dispatcher的調(diào)度下, 根據(jù)632行op的dispatchKeySet找到對應(yīng)的op. 然后進行調(diào)用.

6-Dispatcher__call.png

這部分代碼看的云里霧里的, 應(yīng)該都是一些為了讓代碼簡潔而寫的封裝代碼吧

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

經(jīng)過一系列云里霧里的繞繞, 進入到這個wrapper_CUDA_add_Tensor.cu這個文件, 這個就是cuda代碼的文件了.
在op.impl方法中進行實際的調(diào)用

11-wrapper_CUDA_add_Tensor.png

對于Tensor加法來說, 這個op.impl就是332行的代碼, 這里調(diào)用add_kernel方法

12-UfuncCUDA_add.png

67行這里是一個宏寫法的switch語句, 下面一大片代碼只會走其中一個分支. 因為是宏的寫法, debug進不去. 也沒關(guān)系直接看case就好了. 不管哪個case都會調(diào)用gpu_kernel這個方法

13-add_kernel.png

下面是gpu_kernel的具體實現(xiàn), 調(diào)用了gpu_kernel_impl方法

14-gpu_kernel.png

接下來是gpu_kernel_impl的實現(xiàn), 可以看到是調(diào)用了launch_vectorized_kernel方法.

15-gpu_kernel_impl.png

再往下就會調(diào)用到核函數(shù)了.

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

可以看到這里就已經(jīng)走到了調(diào)用核函數(shù)的位置了.

核函數(shù).png

從注釋可以看出 該部分代碼會判斷一下block的大小, 來決定是否對數(shù)據(jù)進行展開.

該核函數(shù)調(diào)用了另一個在device上調(diào)用執(zhí)行的方法


image.png

policy_t的注釋這樣寫的:


image.png

這段代碼看起來就是根據(jù)Tensor的數(shù)據(jù)類型不同來按照不同的方式加載到args數(shù)組中, 然后在GPU上調(diào)用傳入的elementwise的f函數(shù), 并把args作為入?yún)? 這樣Tensor的加法就計算完成了.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羹蚣,老刑警劉巖忿等,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撬槽,死亡現(xiàn)場離奇詭異,居然都是意外死亡患久,警方通過查閱死者的電腦和手機厚骗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門注益,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人溯捆,你說我怎么就攤上這事。” “怎么了提揍?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我倘零,道長邑闲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任刨仑,我火速辦了婚禮郑诺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杉武。我一直安慰自己辙诞,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布轻抱。 她就那樣靜靜地躺著飞涂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祈搜。 梳的紋絲不亂的頭發(fā)上较店,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音容燕,去河邊找鬼梁呈。 笑死,一個胖子當著我的面吹牛蘸秘,可吹牛的內(nèi)容都是我干的官卡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼秘血,長吁一口氣:“原來是場噩夢啊……” “哼味抖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灰粮,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤仔涩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粘舟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熔脂,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年柑肴,在試婚紗的時候發(fā)現(xiàn)自己被綠了霞揉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡晰骑,死狀恐怖适秩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤秽荞,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布骤公,位于F島的核電站,受9級特大地震影響扬跋,放射性物質(zhì)發(fā)生泄漏阶捆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一钦听、第九天 我趴在偏房一處隱蔽的房頂上張望洒试。 院中可真熱鬧,春花似錦朴上、人聲如沸垒棋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捕犬。三九已至,卻和暖如春酵镜,著一層夾襖步出監(jiān)牢的瞬間碉碉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工淮韭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垢粮,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓靠粪,卻偏偏與公主長得像蜡吧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子占键,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容