色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發燒友App

硬聲App

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

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

3天內不再提示
創作
電子發燒友網>電子資料下載>可編程邏輯>TVM學習(四)codegen

TVM學習(四)codegen

2021-01-27 | pdf | 692.66KB | 次下載 | 2積分

資料介紹

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

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

內存分配

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

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

StorageAllocator類中Plan函數為:

關鍵是前兩行代碼,第一行代碼初始化了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一樣。

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

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

分配內存空間會有兩種情況,一種是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類型的。

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

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

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

內部func處理如下:

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

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

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

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1電子電路原理第七版PDF電子教材免費下載
  2. 0.00 MB  |  1491次下載  |  免費
  3. 2單片機典型實例介紹
  4. 18.19 MB  |  95次下載  |  1 積分
  5. 3S7-200PLC編程實例詳細資料
  6. 1.17 MB  |  27次下載  |  1 積分
  7. 4筆記本電腦主板的元件識別和講解說明
  8. 4.28 MB  |  18次下載  |  4 積分
  9. 5開關電源原理及各功能電路詳解
  10. 0.38 MB  |  11次下載  |  免費
  11. 6100W短波放大電路圖
  12. 0.05 MB  |  4次下載  |  3 積分
  13. 7基于單片機和 SG3525的程控開關電源設計
  14. 0.23 MB  |  4次下載  |  免費
  15. 8基于AT89C2051/4051單片機編程器的實驗
  16. 0.11 MB  |  4次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234313次下載  |  免費
  3. 2PADS 9.0 2009最新版 -下載
  4. 0.00 MB  |  66304次下載  |  免費
  5. 3protel99下載protel99軟件下載(中文版)
  6. 0.00 MB  |  51209次下載  |  免費
  7. 4LabView 8.0 專業版下載 (3CD完整版)
  8. 0.00 MB  |  51043次下載  |  免費
  9. 5555集成電路應用800例(新編版)
  10. 0.00 MB  |  33562次下載  |  免費
  11. 6接口電路圖大全
  12. 未知  |  30320次下載  |  免費
  13. 7Multisim 10下載Multisim 10 中文版
  14. 0.00 MB  |  28588次下載  |  免費
  15. 8開關電源設計實例指南
  16. 未知  |  21539次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935053次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537793次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234313次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191183次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183277次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138039次下載  |  免費
主站蜘蛛池模板: 亚洲色欲国产免费视频| 国产精品一区二区AV97| 小SB几天没做SAO死了H| 老妇xxxxbbbb| 新影音先锋男人色资源网| 乱奷XXXXXHD| 好男人午夜www视频在线观看| 亚洲 欧美 制服 校园 动漫| 花蝴蝶在线观看中字| 伊人22222| 欧美人xxxxx| 国产精品99久久久久久动态图| 亚洲精品无码不卡在线播放he| 精品视频中文字幕| 91黄色影院| 爽爽影院线观看免费| 美女与男人对肌免费网站| 国语自产视频在线不卡| 丰满的女朋友 在线播放| 99视频一区| 最近更新2019中文字幕免费| 日本熟妇乱妇熟色在线电影 | 国产日韩成人内射视频| J午夜精品久久久久久毛片| 玩弄放荡人妻一区二区三区| 狠狠色狠狠色综合| 国产精品福利片| 4k岛国精品午夜高清在线观看| 色mimi| 皮皮色狼网| 奇虎成人网| 欧美性爱 成人| 末成年美女黄网站色大片连接| 久久久久久电影| 精品一区二区三区免费毛片| adc高清在线观看| 97精品国产亚洲AV超碰| 最美女人体内射精一区二区| 在线天天看片视频免费观看| 无码人妻精品一区二区蜜桃在线看| 日本68xxxxxxxxx老师|