哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在BuildRelay中會(huì)調(diào)用Codegen函數(shù)

電子設(shè)計(jì) ? 來源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2022-02-08 16:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者:安平博,Xilinx高級(jí)工程師;來源:AI加速微信公眾號(hào)

接著上一章繼續(xù)深入代碼,在BuildRelay中會(huì)調(diào)用Codegen函數(shù)。這個(gè)函數(shù)實(shí)現(xiàn)在src/relay/backend/graph_runtime_codegen.cc中。Codegen實(shí)現(xiàn)了內(nèi)存的分配,IR節(jié)點(diǎn)到TIR節(jié)點(diǎn)的轉(zhuǎn)換,tir圖節(jié)點(diǎn)的一個(gè)調(diào)度優(yōu)化。內(nèi)存分配由函數(shù)relay.backend.GraphPlanMemory來實(shí)現(xiàn),VisitExpr對(duì)節(jié)點(diǎn)進(jìn)行遍歷并進(jìn)行節(jié)點(diǎn)信息的記錄。LowerExternalfunctions完成ir節(jié)點(diǎn)到tir節(jié)點(diǎn)的轉(zhuǎn)化以及schedule的優(yōu)化。

pIYBAGAJmYKAeKUpAAOkJNgC9IE642.png

內(nèi)存分配

通過GetPackedFunc函數(shù)來獲得注冊(cè)到global map的內(nèi)存分配函數(shù)GraphPlanMemory。我們看一下文件src/relay/backend/graph_plan_memory.cc中對(duì)內(nèi)存的處理。

o4YBAGAJmcKARl1CAACGZg0dj7U340.png

在處理內(nèi)存分配中主要使用了StorageAllocaBaseVisitor,StorageAllocaInit,StorageAllocator這三個(gè)類。StorageAllocaBaseVisitor是一個(gè)基類,實(shí)現(xiàn)了對(duì)每個(gè)節(jié)點(diǎn)的訪問,并分配token,但是token中信息是在派生類中處理的。定義了一個(gè)StorageToken的結(jié)構(gòu)體,用于表示申請(qǐng)到內(nèi)存的大小,類型等信息。在內(nèi)存處理程序中,主要就是為每個(gè)節(jié)點(diǎn)分配這個(gè)token,同時(shí)定義token的內(nèi)部信息。內(nèi)存分配結(jié)果是一個(gè)節(jié)點(diǎn)和token的映射表。

o4YBAGAJmgGAEqo-AADcglyV-4Y415.png

StorageAllocator類中Plan函數(shù)為:

o4YBAGAJmkGASccNAAKmVvtXPgY414.png

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

1) 從一個(gè)copy節(jié)點(diǎn)由下而上遍歷一直到遇到下一個(gè)copy,比如可以推斷出add,x,y節(jié)點(diǎn)的設(shè)備號(hào)和copy1一樣;
2) 從最后一個(gè)copy節(jié)點(diǎn)向下遍歷,那么可以推斷出substract,exp設(shè)備號(hào)和copy3一樣。

pIYBAGAJmpqAIGavAACO4hsCsQ8586.png

設(shè)備號(hào)獲得后,this->run會(huì)調(diào)用基類的run函數(shù),基類run函數(shù)會(huì)調(diào)用派生類的CreateToken函數(shù)。CreateToken會(huì)申請(qǐng)StorageToken空間并且賦予設(shè)備號(hào)和數(shù)據(jù)類型,然后返回一個(gè)token_map_。和節(jié)點(diǎn)遍歷相關(guān)函數(shù)為Run->GetToken->VisitExpr。VisitExpr會(huì)最終調(diào)用StorageAllocaInit類中定義的VisitExpr_函數(shù)來遍歷節(jié)點(diǎn)。

節(jié)點(diǎn)內(nèi)存初始化完成后,回到StorageAllocator類中,run會(huì)調(diào)用其定義的CreateToken函數(shù)。

pIYBAGAJmt6AE8_gAALBr5QvaFI549.png

分配內(nèi)存空間會(huì)有兩種情況,一種是can_realloc一種是不能can_realloc的。先看不can_realloc的,GetMemorySize是根據(jù)token中記錄的數(shù)據(jù)類型和shape信息來獲得數(shù)據(jù)的大小,Alloc函數(shù)就是為tok分配字節(jié)數(shù)量?,F(xiàn)在看can_realloc的情況,Request中首先獲取節(jié)點(diǎn)數(shù)據(jù)的大小。然后從free_中查詢能夠滿足size的節(jié)點(diǎn),如果有比該節(jié)點(diǎn)size大的就選擇大的空閑區(qū)間分配,如果沒有大的空間分配,選擇最接近的空間分配。然后最終返回一個(gè)token_map_。

codegen

第一步是對(duì)ir節(jié)點(diǎn)進(jìn)行遍歷,轉(zhuǎn)換成codegen中定義的基礎(chǔ)節(jié)點(diǎn)。我們先看以下codegen中定義的節(jié)點(diǎn)類型,GraphNode是基礎(chǔ)節(jié)點(diǎn),GraphInputNode, GraphOpNode繼承自這個(gè)基礎(chǔ)節(jié)點(diǎn)。這些節(jié)點(diǎn)中主要提供了一些節(jié)點(diǎn)屬性,比如name,op類型等。還提供了dmlc接口,可以實(shí)現(xiàn)可視化。

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

接下來是節(jié)點(diǎn)遍歷,heads_=VisitExpr(func->body)。節(jié)點(diǎn)遍歷過程中會(huì)將func中的節(jié)點(diǎn)轉(zhuǎn)換為graphNode。對(duì)于varNode,因?yàn)橐呀?jīng)記錄在var_map_中,直接返回引用。ConstantNode會(huì)轉(zhuǎn)換為GraphInputNode,tuppleNode會(huì)返回每個(gè)字段的graphNode。在遍歷節(jié)點(diǎn)過程中,會(huì)將graphNode都添加到nodes_中。

重點(diǎn)看一下對(duì)CallNode的處理,只支持op是functionNode類型的。

pIYBAGAJmx6AF101AAGj_ZQNbQ8072.png

Function生成時(shí),走兩個(gè)分支,一個(gè)是外部codegen,一個(gè)是通用分支。對(duì)應(yīng)外部function codegen的處理為:

pIYBAGAJm2CAfy9BAANCOTr1_2U471.png

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

o4YBAGAJm7yAUjp_AAKzrtE_tdQ078.png

然后通過GraphAddCallNode將其加入nodes_中。在GraphAddCallNode中還會(huì)對(duì)op->args進(jìn)行深入遍歷。

內(nèi)部func處理如下:

o4YBAGAJm_uALky3AAGAfeWt9Xs683.png

也是通過相同的pf0和pf1函數(shù)。CcacheKey的創(chuàng)建過程一樣,但是在lowerInternal中不一樣。

o4YBAGAJnD6ATZm6AAStQTbokG4194.png

首先創(chuàng)建了一個(gè)schedule,schedule的具體實(shí)現(xiàn)很復(fù)雜目前還不夠理解。

如果是copy節(jié)點(diǎn),那么不進(jìn)行l(wèi)ower處理,直接返回CachedFunc封裝。不是copy節(jié)點(diǎn),如果我們?cè)?a href="http://www.greenbey.cn/tags/python/" target="_blank">python中自己定義了lower函數(shù)就調(diào)用python中的,如果沒有就會(huì)調(diào)用TVM中的lower函數(shù)。Lower函數(shù)在src/driver/driver_api.cc文件中。在這里調(diào)用了很多tir的passes來進(jìn)行一個(gè)節(jié)點(diǎn)轉(zhuǎn)換。這塊后邊再詳細(xì)看。

審核編輯:何安

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4421

    瀏覽量

    67815
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式開發(fā)常用函數(shù)速查表

    嵌入式開發(fā)中,掌握常用函數(shù)的用法可以大大提高開發(fā)效率。無論是單片機(jī)初學(xué)者還是有一定經(jīng)驗(yàn)的工程師,熟悉函數(shù)庫(kù)和調(diào)用方式都是必備技能。今天,我們?yōu)榇蠹艺硪环萸度胧介_發(fā)常用
    的頭像 發(fā)表于 01-19 09:06 ?442次閱讀
    嵌入式開發(fā)常用<b class='flag-5'>函數(shù)</b>速查表

    C語(yǔ)言函數(shù)指針的六個(gè)高級(jí)的應(yīng)用場(chǎng)景

    調(diào)用函數(shù)。通常,回調(diào)函數(shù)某個(gè)庫(kù)函數(shù)或框架函數(shù)中注冊(cè)的,當(dāng)某個(gè)條件滿足時(shí),庫(kù)
    發(fā)表于 01-04 12:25

    matlab調(diào)用dll動(dòng)態(tài)庫(kù)函數(shù),死機(jī)問題,如何強(qiáng)行跳出?

    matlab調(diào)用dll動(dòng)態(tài)庫(kù)中的函數(shù),例如圖莫斯,發(fā)送數(shù)據(jù)時(shí),經(jīng)常會(huì)卡死,是否有辦法限制時(shí)間,比如3秒,沒有回應(yīng),就強(qiáng)行結(jié)束函數(shù)調(diào)用。執(zhí)行后續(xù)邏輯。
    發(fā)表于 12-31 10:14

    瑞薩RA系列FSP庫(kù)開發(fā)實(shí)戰(zhàn)指南之DMAC中斷回調(diào)函數(shù)

    調(diào)用R_DMAC_SoftwareStart函數(shù)來發(fā)起軟件觸發(fā)請(qǐng)求信號(hào)來啟動(dòng)DMAC傳輸。
    的頭像 發(fā)表于 12-26 09:25 ?5024次閱讀

    函數(shù)調(diào)用性能消耗

    一個(gè)字)或者小于四個(gè)字大?。òㄕ加?個(gè)字的doubles和long longs)。 如果參數(shù)限制個(gè)數(shù)為4,那么第五個(gè)和之后的字就會(huì)存儲(chǔ)棧上。這便在調(diào)用函數(shù)是需要從棧上加載參數(shù)從而增加存儲(chǔ)和讀取的消耗
    發(fā)表于 12-12 07:50

    labview調(diào)用pylon庫(kù)函數(shù)失敗

    labview中去調(diào)用pylon庫(kù)函數(shù)。labview2018(32位),pylon(202506),ni vas,ni vdm均安裝。dll文件為runtime文件下win32
    發(fā)表于 12-11 13:20

    如何用函數(shù)指針調(diào)用函數(shù)

    ;please enter a and b:\"); scanf(\"%d%d\",a,b); c = (*p)(a, b);//通過函數(shù)指針調(diào)用Max函數(shù)
    發(fā)表于 12-11 06:26

    控制流和函數(shù)調(diào)用的精細(xì)調(diào)整

    特性,避免不必要的計(jì)算。 函數(shù)調(diào)用涉及開銷,因?yàn)樗枰4娈?dāng)前執(zhí)行環(huán)境并跳轉(zhuǎn)到新的執(zhí)行環(huán)境。減少函數(shù)調(diào)用,尤其是頻繁執(zhí)行的循環(huán)中,可以顯著
    發(fā)表于 11-14 06:32

    深入了解系統(tǒng)調(diào)用API:探索操作系統(tǒng)底層的關(guān)鍵接口

    ,也無法使用內(nèi)核函數(shù)。當(dāng)用戶進(jìn)程必須訪問內(nèi)核或使用某個(gè)內(nèi)核函數(shù)時(shí),就得使用系統(tǒng)調(diào)用(System Call)。Linux中,系統(tǒng)調(diào)用是用戶
    的頭像 發(fā)表于 11-03 09:20 ?851次閱讀

    調(diào)用rt_timer_check函數(shù)就報(bào)錯(cuò)怎么解決?

    調(diào)用rt_timer_check函數(shù)就報(bào)錯(cuò) (rt_interrupt_get_nest() > 0) assertion failed at function
    發(fā)表于 09-18 06:11

    告別代碼迷宮!exgnss擴(kuò)展庫(kù)讓GNSS定位開發(fā)秒變簡(jiǎn)單

    提供三種比較經(jīng)典的應(yīng)用模式,可根據(jù)實(shí)際項(xiàng)目需求靈活運(yùn)用。 應(yīng)用模式1:exgnss.DEFAULT 打開gnss后,gnss定位成功時(shí),如果有回調(diào)函數(shù),會(huì)調(diào)用回調(diào)函數(shù); 使用此應(yīng)用模式調(diào)用
    的頭像 發(fā)表于 09-10 17:23 ?907次閱讀
    告別代碼迷宮!exgnss擴(kuò)展庫(kù)讓GNSS定位開發(fā)秒變簡(jiǎn)單

    詳解hal_entry入口函數(shù)

    當(dāng)使用RTOS時(shí),程序從main函數(shù)開始進(jìn)行線程調(diào)度;當(dāng)沒有使用RTOS時(shí),C語(yǔ)言程序的入口函數(shù)main函數(shù)調(diào)用了hal_entry函數(shù)。由
    的頭像 發(fā)表于 07-25 15:34 ?2204次閱讀

    C語(yǔ)言中的內(nèi)聯(lián)函數(shù)與宏

    C編程中,內(nèi)聯(lián)函數(shù)和宏都用于避免函數(shù)調(diào)用的開銷并編寫可復(fù)用的邏輯部分,但它們工作方式和安全性方面存在顯著差異。
    的頭像 發(fā)表于 07-25 15:10 ?2043次閱讀
    C語(yǔ)言中的內(nèi)聯(lián)<b class='flag-5'>函數(shù)</b>與宏

    調(diào)用rt_timer_check函數(shù)就報(bào)錯(cuò),為什么?

    調(diào)用rt_timer_check函數(shù)就報(bào)錯(cuò) (rt_interrupt_get_nest() > 0) assertion failed at function
    發(fā)表于 06-10 06:18

    verilog模塊的調(diào)用、任務(wù)和函數(shù)

    在做模塊劃分時(shí),通常會(huì)出現(xiàn)這種情形,某個(gè)大的模塊中包含了一個(gè)或多個(gè)功能子模塊,verilog是通過模塊調(diào)用或稱為模塊實(shí)例化的方式來實(shí)現(xiàn)這些子模塊與高層模塊的連接的.
    的頭像 發(fā)表于 05-03 10:29 ?1721次閱讀
    verilog模塊的<b class='flag-5'>調(diào)用</b>、任務(wù)和<b class='flag-5'>函數(shù)</b>
    郴州市| 洛宁县| 岐山县| 射阳县| 利川市| 平阴县| 广德县| 嘉善县| 鄂托克前旗| 广州市| 温州市| 维西| 迭部县| 台湾省| 绥芬河市| 石家庄市| 双柏县| 民权县| 健康| 平安县| 来安县| 陵水| 湖北省| 门源| 宜宾县| 云阳县| 泽州县| 城固县| 五莲县| 叶城县| 新乡县| 五台县| 延川县| 大英县| 南乐县| 昆山市| 霍邱县| 汽车| 双辽市| 获嘉县| 三原县|