在线观看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

    文章

    4374

    瀏覽量

    64383
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    verilog模塊的調用、任務和函數

    在做模塊劃分時,通常會出現這種情形,某個大的模塊中包含了一個或多個功能子模塊,verilog是通過模塊調用或稱為模塊實例化的方式來實現這些子模塊與高層模塊的連接的.
    的頭像 發表于 05-03 10:29 ?550次閱讀
    verilog模塊的<b class='flag-5'>調用</b>、任務和<b class='flag-5'>函數</b>

    如何使用LAX_CODEGEN啟用動態內存分配?

    我目前正在探索NXP_MBDToolbox_LAX。lax_codegen 生成的代碼基于靜態分配。我想管理大型向量,如何使用 LAX_CODEGEN 啟用動態內存分配?
    發表于 04-10 08:09

    函數指針的六個常見應用場景

    函數指針嵌入式開發中有著廣泛的應用,它讓代碼更加靈活,減少冗余,提高可擴展性。很多時候,我們需要根據不同的情況動態調用不同的函數,而函數
    的頭像 發表于 04-07 11:58 ?397次閱讀
    <b class='flag-5'>函數</b>指針的六個常見應用場景

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

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

    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 ?1433次閱讀

    dubbo3.0 服務導入導出原理

    ,@DubboComponentScan 注解 Import 了一個 DubboComponentScanRegistrar,DubboComponentScanRegistrar 中會調用
    的頭像 發表于 11-04 15:01 ?423次閱讀
    dubbo3.0 服務導入導出原理

    GD32F407跑了freeRTOS,中斷調用xEventGroupSetBitsFromISR函數后就會死機,為什么?

    GD32F407跑了freeRTOS,串口接收使用了DMA+IDLE中斷來實現不定長接收,串口的IDLE中斷中接收完數據后,通過事件通知線程執行解析,但是中斷中調用xEventGroupSetBitsFromISR函數后就會死
    發表于 07-26 06:37

    CM32M433R MCU上調用riscv_sqrt_f32()函數的計算速度比直接調用sqrtf()要慢,為什么?

    CM32M433R MCU上調用riscv_sqrt_f32()函數的計算速度比直接調用sqrtf()要慢, 計算一次riscv_sqrt_f32大概54 cycles;sqrtf(
    發表于 07-24 06:12

    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

    esp8266怎么找到回調函數調用的地方?

    esp8266里的程序怎么運行? user_init里注冊了espconn_regist_sentcb,espconn_regist_recvcb這幾個回調函數,怎么找到這幾個回調函數調用
    發表于 07-10 08:24

    wifisoftAP的程序調用start_webserver(); 函數,結果設備不斷復位,是什么情況?

    wifisoftAP的程序調用start_webserver(); 函數,結果 設備不斷復位,這個什么情況? 開始的輸出信息
    發表于 06-19 06:47
    主站蜘蛛池模板: 欧美一级片在线免费观看 | 福利天堂| 黄色网 在线播放 | 久青草国产手机在线视频 | 欧美另类69xxxxx性欧 | 涩久久 | 婷婷五月五 | 国产深夜福利在线观看网站 | 久在草影院| 公妇乱淫日本免费观看 | 狠狠色噜噜狠狠狠狠97 | 成年女人毛片免费视频 | 美女大黄三级视频在线观看 | av72成人| 免费香蕉视频国产在线看 | 色爽爽爽爽爽爽爽爽 | 狠狠色噜噜狠狠狠97影音先锋 | 浮荡视频在线观看免费 | 婷婷在线网站 | aaa亚洲| 另类毛片 | 欧美12一13高清视频 | 日韩精品系列产品 | 午夜毛片不卡高清免费 | 女人张开腿让男人捅爽 | 久久久国产精品免费看 | 日韩免费高清一级毛片 | 日本人zzzwww色视频 | 日本激情网 | 风流护士| 夜色成人网 | 国产自在自线午夜精品视频 | 天天看片夜夜爽 | 色噜噜狠狠色综合中文字幕 | 天堂成人一区二区三区 | 女性私密部位扒开的视频 | 久久久久久久性潮 | 日本亚洲欧美国产日韩ay高清 | 久久精品视频网站 | 色中色软件| 欧美成人性动漫在线观看 |