1. 前言
2. Engine
在MXNet的官網(wǎng)對Engine有一定的介紹,首先我們要知道Engine是用于并行化計算過程的。push用于將一個待執(zhí)行的函數(shù)送給engine運行,其中read_vars表示該函數(shù)的輸入,write_vars表示該函數(shù)的輸出。這樣整個計算過程可以表示為一個有向無環(huán)圖。使用特定的算法就可以規(guī)劃出圖的計算順序,具體的計算的完成,可以通過線程池等方式來進行。
3. engine.h
Engine類聲明在文件include/engine.h中。
-
NewVariable:返回一個VarHandle,它是一個指向Var類型的指針,Var是在engine命名空間中用于表示一個變量的數(shù)據(jù)結(jié)構(gòu)。 -
NewOperator:返回一個OperHandle,它的參數(shù):待執(zhí)行函數(shù),函數(shù)簽名void(RunContext, CallbackOnComplete),該函數(shù)輸入變量,輸出變量,函數(shù)的性質(zhì)(表示函數(shù)的類型,例如復(fù)制,計算),該op的名字,以及是否是一個等待的op。 -
Push:將一個oppush給engine -
PushAsyncFn:將一個函數(shù)push給engine -
WaitForVar:等待一個變量完成對它運算的op -
Get:返回單例engine -
PushSync:將一個函數(shù)push給engine,該方法就是將PushAsyncFn的函數(shù)和函數(shù)的回調(diào)函數(shù)一起執(zhí)行。 -
CreateCallback:返回一個回調(diào)函數(shù),類型是CallbackOnComplete。 -
DeduplicateVarHandle:去掉重復(fù)的變量,去掉輸入變量中出現(xiàn)在輸出變量中的
4. naive_engine.h
naive顧名思義,最‘簡單’的engine的實現(xiàn)。
-
NaiveOpr:定義了在engine中,一個操作應(yīng)該具備的結(jié)構(gòu):Fn待運行函數(shù),const_vars輸入,mutable_vars輸出,prop函數(shù)的類型,opr_name操作的名字。 -
NewOperator:返回一個操作,完成結(jié)構(gòu)的轉(zhuǎn)換 -
Push:將一個op push給engine。
5. threaded_engine.h
-
OprBlock:表示一個push給engine的操作,包含了一個特定的操作,一個wait值表示需要等待的任務(wù)數(shù),運行環(huán)境context。 -
VersionedVarBlock:var的version信息表示該var被操作改變的情況。該結(jié)構(gòu)體是ThreadVar鏈表的元素。OprBlock* trigger表示出發(fā)的操作。 -
ThreadedVar:鏈表,表示一組需要執(zhí)行的操作。-
AppendReadDependency:將一個對該變量進行讀的操作加入規(guī)劃 -
AppendWriteDependency: -
read_to_read():是否完成了所有的寫操作 -
head_:頭節(jié)點 -
pending_write_:下一個要進行的寫操作
-
-
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。