1. 前言
2. Engine
在MXNet的官網(wǎng)對(duì)Engine有一定的介紹砸民,首先我們要知道Engine是用于并行化計(jì)算過程的探熔。push
用于將一個(gè)待執(zhí)行的函數(shù)送給engine運(yùn)行泉蝌,其中read_vars
表示該函數(shù)的輸入拢蛋,write_vars
表示該函數(shù)的輸出玄妈。這樣整個(gè)計(jì)算過程可以表示為一個(gè)有向無環(huán)圖凰荚。使用特定的算法就可以規(guī)劃出圖的計(jì)算順序曲伊,具體的計(jì)算的完成叽讳,可以通過線程池等方式來進(jìn)行。
3. engine.h
Engine
類聲明在文件include/engine.h
中坟募。
-
NewVariable
:返回一個(gè)VarHandle
岛蚤,它是一個(gè)指向Var
類型的指針,Var
是在engine命名空間中用于表示一個(gè)變量的數(shù)據(jù)結(jié)構(gòu)懈糯。 -
NewOperator
:返回一個(gè)OperHandle
涤妒,它的參數(shù):待執(zhí)行函數(shù),函數(shù)簽名void(RunContext, CallbackOnComplete)
赚哗,該函數(shù)輸入變量她紫,輸出變量,函數(shù)的性質(zhì)(表示函數(shù)的類型屿储,例如復(fù)制贿讹,計(jì)算),該op
的名字扩所,以及是否是一個(gè)等待的op围详。 -
Push
:將一個(gè)op
push給engine -
PushAsyncFn
:將一個(gè)函數(shù)push給engine -
WaitForVar
:等待一個(gè)變量完成對(duì)它運(yùn)算的op -
Get
:返回單例engine -
PushSync
:將一個(gè)函數(shù)push給engine,該方法就是將PushAsyncFn
的函數(shù)和函數(shù)的回調(diào)函數(shù)一起執(zhí)行。 -
CreateCallback
:返回一個(gè)回調(diào)函數(shù)助赞,類型是CallbackOnComplete
买羞。 -
DeduplicateVarHandle
:去掉重復(fù)的變量,去掉輸入變量中出現(xiàn)在輸出變量中的
4. naive_engine.h
naive顧名思義雹食,最‘簡(jiǎn)單’的engine的實(shí)現(xiàn)畜普。
-
NaiveOpr
:定義了在engine中,一個(gè)操作應(yīng)該具備的結(jié)構(gòu):Fn
待運(yùn)行函數(shù)群叶,const_vars
輸入吃挑,mutable_vars
輸出,prop
函數(shù)的類型街立,opr_name
操作的名字舶衬。 -
NewOperator
:返回一個(gè)操作,完成結(jié)構(gòu)的轉(zhuǎn)換 -
Push
:將一個(gè)op push給engine赎离。
5. threaded_engine.h
-
OprBlock
:表示一個(gè)push給engine的操作逛犹,包含了一個(gè)特定的操作,一個(gè)wait值表示需要等待的任務(wù)數(shù)梁剔,運(yùn)行環(huán)境context
虽画。 -
VersionedVarBlock
:var的version信息表示該var被操作改變的情況。該結(jié)構(gòu)體是ThreadVar鏈表的元素荣病。OprBlock* trigger
表示出發(fā)的操作码撰。 -
ThreadedVar
:鏈表,表示一組需要執(zhí)行的操作个盆。-
AppendReadDependency
:將一個(gè)對(duì)該變量進(jìn)行讀的操作加入規(guī)劃 -
AppendWriteDependency
: -
read_to_read()
:是否完成了所有的寫操作 -
head_
:頭節(jié)點(diǎn) -
pending_write_
:下一個(gè)要進(jìn)行的寫操作
-
-
ThreadedOpr
:用在OprBlock
脖岛,-
fn
:待執(zhí)行函數(shù) -
const_vars, mutable_vars
:表示輸入輸出
-
-
ThreadedEngine
:所有的ThreadedEngine
的基類。它規(guī)劃所有操作砾省,并調(diào)用PushToExecute
來執(zhí)行任務(wù)鸡岗。-
ExecuteOprBlock
:
-
6. stream_manager.h
使用Round-Robin算法來分發(fā)GPU的streams混槐。