在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在BuildRelay中會調用Codegen函數

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2022-02-08 16:02 ? 次閱讀

作者:安平博,Xilinx高級工程師;來源:AI加速微信公眾號

接著上一章繼續深入代碼,在BuildRelay中會調用Codegen函數。這個函數實現在src/relay/backend/graph_runtime_codegen.cc中。Codegen實現了內存的分配,IR節點到TIR節點的轉換,tir圖節點的一個調度優化。內存分配由函數relay.backend.GraphPlanMemory來實現,VisitExpr對節點進行遍歷并進行節點信息的記錄。LowerExternalfunctions完成ir節點到tir節點的轉化以及schedule的優化。

pIYBAGAJmYKAeKUpAAOkJNgC9IE642.png

內存分配

通過GetPackedFunc函數來獲得注冊到global map的內存分配函數GraphPlanMemory。我們看一下文件src/relay/backend/graph_plan_memory.cc中對內存的處理。

o4YBAGAJmcKARl1CAACGZg0dj7U340.png

在處理內存分配中主要使用了StorageAllocaBaseVisitor,StorageAllocaInit,StorageAllocator這三個類。StorageAllocaBaseVisitor是一個基類,實現了對每個節點的訪問,并分配token,但是token中信息是在派生類中處理的。定義了一個StorageToken的結構體,用于表示申請到內存的大小,類型等信息。在內存處理程序中,主要就是為每個節點分配這個token,同時定義token的內部信息。內存分配結果是一個節點和token的映射表。

o4YBAGAJmgGAEqo-AADcglyV-4Y415.png

StorageAllocator類中Plan函數為:

o4YBAGAJmkGASccNAAKmVvtXPgY414.png

關鍵是前兩行代碼,第一行代碼初始化了storageToken,賦予了其設備類型和數據類型信息。第二行代碼遍歷每個節點,并且為每個節點分配內存空間。在內存初始化函數GetInitTokenMap中,首先收集每個節點的的設備信息。調用鏈為CollectDeviceInfo -> GetDeviceMap(src/relay/transforms/device_annotation.cc)。在構建relay圖結構的時候,每個節點是有設備號信息的,GetDeviceMap就是按照post-DFS順序獲得節點的設備號信息。當然并不是所有節點都有設備號信息,所以還需要根據節點之間的關系來推斷出設備號。比如下圖,add,sqrt,log節點被標注為1,2,3號設備,那么可以用兩種方式來推斷其它節點設備號。

1) 從一個copy節點由下而上遍歷一直到遇到下一個copy,比如可以推斷出add,x,y節點的設備號和copy1一樣;
2) 從最后一個copy節點向下遍歷,那么可以推斷出substract,exp設備號和copy3一樣。

pIYBAGAJmpqAIGavAACO4hsCsQ8586.png

設備號獲得后,this->run會調用基類的run函數,基類run函數會調用派生類的CreateToken函數。CreateToken會申請StorageToken空間并且賦予設備號和數據類型,然后返回一個token_map_。和節點遍歷相關函數為Run->GetToken->VisitExpr。VisitExpr會最終調用StorageAllocaInit類中定義的VisitExpr_函數來遍歷節點。

節點內存初始化完成后,回到StorageAllocator類中,run會調用其定義的CreateToken函數。

pIYBAGAJmt6AE8_gAALBr5QvaFI549.png

分配內存空間會有兩種情況,一種是can_realloc一種是不能can_realloc的。先看不can_realloc的,GetMemorySize是根據token中記錄的數據類型和shape信息來獲得數據的大小,Alloc函數就是為tok分配字節數量。現在看can_realloc的情況,Request中首先獲取節點數據的大小。然后從free_中查詢能夠滿足size的節點,如果有比該節點size大的就選擇大的空閑區間分配,如果沒有大的空間分配,選擇最接近的空間分配。然后最終返回一個token_map_。

codegen

第一步是對ir節點進行遍歷,轉換成codegen中定義的基礎節點。我們先看以下codegen中定義的節點類型,GraphNode是基礎節點,GraphInputNode, GraphOpNode繼承自這個基礎節點。這些節點中主要提供了一些節點屬性,比如name,op類型等。還提供了dmlc接口,可以實現可視化。

遍歷func的parameters,將parameters轉換到graph的input節點。通過AddNode添加這些input節點,并且將轉換后的graphInputNode加入var_map_中,var_map_中是expr到graphNode的映射。

接下來是節點遍歷,heads_=VisitExpr(func->body)。節點遍歷過程中會將func中的節點轉換為graphNode。對于varNode,因為已經記錄在var_map_中,直接返回引用。ConstantNode會轉換為GraphInputNode,tuppleNode會返回每個字段的graphNode。在遍歷節點過程中,會將graphNode都添加到nodes_中。

重點看一下對CallNode的處理,只支持op是functionNode類型的。

pIYBAGAJmx6AF101AAGj_ZQNbQ8072.png

Function生成時,走兩個分支,一個是外部codegen,一個是通用分支。對應外部function codegen的處理為:

pIYBAGAJm2CAfy9BAANCOTr1_2U471.png

首先創建一個CCacheKey類型作為_CompileEngineLower函數的參數傳入。具體CcacheKey有什么作用,以后再深入研究吧。_CompileEngineLower的實現在文件src/relay/backend/compile_engine.cc中。調用鏈為Lower -> LowerInternal(key)->cached_func。定義了一個cache_node并封裝成cached_func返回。這塊具體的操作并不是很理解,可能還需要熟悉cachedFuncNode的作用。

o4YBAGAJm7yAUjp_AAKzrtE_tdQ078.png

然后通過GraphAddCallNode將其加入nodes_中。在GraphAddCallNode中還會對op->args進行深入遍歷。

內部func處理如下:

o4YBAGAJm_uALky3AAGAfeWt9Xs683.png

也是通過相同的pf0和pf1函數。CcacheKey的創建過程一樣,但是在lowerInternal中不一樣。

o4YBAGAJnD6ATZm6AAStQTbokG4194.png

首先創建了一個schedule,schedule的具體實現很復雜目前還不夠理解。

如果是copy節點,那么不進行lower處理,直接返回CachedFunc封裝。不是copy節點,如果我們在python中自己定義了lower函數就調用python中的,如果沒有就會調用TVM中的lower函數。Lower函數在src/driver/driver_api.cc文件中。在這里調用了很多tir的passes來進行一個節點轉換。這塊后邊再詳細看。

審核編輯:何安

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4341

    瀏覽量

    62796
收藏 人收藏

    評論

    相關推薦

    如何把兩個數據返回給調用函數

    函數的處理結果包含兩個數據,如何把兩個數據返回給調用函數? 第一種,把兩個數據封裝成一個結構體,函數返回結構體。 調用
    的頭像 發表于 01-08 10:15 ?72次閱讀

    EE-128:C語言中的DSP:從C調用匯編類成員函數

    電子發燒友網站提供《EE-128:C語言中的DSP:從C調用匯編類成員函數.pdf》資料免費下載
    發表于 01-07 13:48 ?0次下載
    EE-128:C語言中的DSP:從C<b class='flag-5'>調用</b>匯編類成員<b class='flag-5'>函數</b>

    HAL庫的函數調用示例

    HAL(Hardware Abstraction Layer,硬件抽象層)庫是STM32等微控制器中常用的庫,它為開發者提供了訪問和控制硬件設備的接口。以下是一些常用的HAL庫函數及其調用示例: 一
    的頭像 發表于 12-02 14:01 ?551次閱讀

    RTOS V1.4版本SDK作為TCP Server沒有調用斷開連接的回調函數,為什么?

    espconn_regist_connectcb所注冊的函數 espconn_regist_connectcb所注冊的函數里面調用espconn_regist_disconcb
    發表于 07-18 08:31

    websocket.c RTOS演示中缺少對wifi_connect()的調用怎么辦?

    RTOS SDK 1.3 中,有一個名為 /examples/websocket_demo/websocket/websocket.c 的示例。函數中有一個名為 websocket_task
    發表于 07-18 06:37

    ESP8266收到重傳的UDP數據包,則udp接收回調函數會調用兩次,怎么解決?

    我們使用 esp8266 開發了一個網格系統。 在所有開發完成時,我們發現了一個關鍵問題。 如果ESP8266收到重傳的 UDP 數據包,則 udp 接收回調函數會調用兩次。 (*. 收到兩個
    發表于 07-18 06:29

    點擊j-link下載之后,不會調用出j-link.exe,沒有反應怎么解決?

    點擊j-link下載之后,不會調用出j-link.exe,沒有反應,有大神遇到這種情況嗎,怎么解決,求助
    發表于 07-18 06:12

    ESP32S2使用VSCODE編譯,總是會調用build-&gt;bootLoader-&gt;config-&gt;sdkconfig.h文件為什么?

    ESP32S2使用VSCODE編譯,調用sdkconfig.h頭文件時,總是會調用 build->bootLoader->config->
    發表于 06-07 06:48

    FreeRTOS如何在中斷中調用內存分配函數

    最近在玩FreeRTOS,遇到一個問題,就是不知如何在中斷中調用內存分配函數。pvPortMalloc函數中會調用xTaskResumeAll,而這個
    發表于 05-08 08:25

    函數多層調用的主要注意事項分析

    應用方案設計中,開發者經常會碰到某個子函數需要多次多級調用的情況。
    的頭像 發表于 03-27 15:36 ?988次閱讀
    子<b class='flag-5'>函數</b>多層<b class='flag-5'>調用</b>的主要注意事項分析

    回調函數(callback)是什么?回調函數的實現方法

    回調函數是一種特殊的函數,它作為參數傳遞給另一個函數,并在被調用函數執行完畢后被調用。回調
    發表于 03-12 11:46 ?3055次閱讀

    函數指針與回調函數的應用實例

    通常我們說的指針變量是指向一個整型、字符型或數組等變量,而函數指針是指向函數函數指針可以像一般函數一樣,用于調用
    的頭像 發表于 03-07 11:13 ?417次閱讀
    <b class='flag-5'>函數</b>指針與回調<b class='flag-5'>函數</b>的應用實例

    內聯函數定義 為什么需要內聯函數

    inline關鍵字是C99標準的型關鍵字,其作用是將函數展開,把函數的代碼復制到每一個調用處。
    的頭像 發表于 02-19 12:20 ?567次閱讀

    linux用gdb調試遇到函數調用怎么辦?

    linux用gdb調試遇到函數調用怎么辦? Linux上使用GDB調試時,遇到函數調用是一個常見的情況。
    的頭像 發表于 01-31 10:33 ?738次閱讀

    Linux內核中信號相關的系統調用

    ,sys_sigaction()和sys_rt_sigaction()幾乎相同,因此C庫中包含的sigaction()包裝函數最終會調用sys_rt_sigaction()而不是sys_sigaction()。
    的頭像 發表于 01-20 09:34 ?780次閱讀
    主站蜘蛛池模板: 免费人成激情视频在线观看冫 | 国产美女视频一区二区二三区| 欧美色欧美亚洲高清在线视频 | 国产大片黄在线看免费| 免费h网站在线观看| 又粗又长又大真舒服好爽漫画| 亚洲一区二区精品推荐| 精品久久久久国产免费| 一级黄免费| 天堂电影免费在线资源| 欧美一区二区三区性| 精品四虎免费观看国产高清 | 久久久成人影院| 巨尻在线观看| 国产三级日产三级韩国三级| www.xxx.日本| 天天操天天操天天操香蕉| 国产网站大全| 一区二区三区视频在线观看| 种子 在线播放| 四虎影酷| 久久中文字幕综合婷婷| 成年美女| 欧美黄色片免费观看| 91黄色视屏| 五月天婷婷网亚洲综合在线| 久久国产精品免费| h网址在线观看| 一二三四日本视频社区| 全国男人的天堂网站| 国产精品久久久久影院色老大| 天天综合网色| 538porm在线看国产亚洲| 男女性接交无遮挡免费看视频| 天天插天天透| 久久精品韩国三级| 亚洲福利视频网址| 午夜视频网站| 99久久精品99999久久| 国产理论在线| 在线毛片免费|