1. 前言
2. Engine
在MXNet的官网对Engine有一定的介绍,首先我们要知道Engine是用于并行化计算过程的。push
用于将一个待执行的函数送给engine运行,其中read_vars
表示该函数的输入,write_vars
表示该函数的输出。这样整个计算过程可以表示为一个有向无环图。使用特定的算法就可以规划出图的计算顺序,具体的计算的完成,可以通过线程池等方式来进行。
3. engine.h
Engine
类声明在文件include/engine.h
中。
-
NewVariable
:返回一个VarHandle
,它是一个指向Var
类型的指针,Var
是在engine命名空间中用于表示一个变量的数据结构。 -
NewOperator
:返回一个OperHandle
,它的参数:待执行函数,函数签名void(RunContext, CallbackOnComplete)
,该函数输入变量,输出变量,函数的性质(表示函数的类型,例如复制,计算),该op
的名字,以及是否是一个等待的op。 -
Push
:将一个op
push给engine -
PushAsyncFn
:将一个函数push给engine -
WaitForVar
:等待一个变量完成对它运算的op -
Get
:返回单例engine -
PushSync
:将一个函数push给engine,该方法就是将PushAsyncFn
的函数和函数的回调函数一起执行。 -
CreateCallback
:返回一个回调函数,类型是CallbackOnComplete
。 -
DeduplicateVarHandle
:去掉重复的变量,去掉输入变量中出现在输出变量中的
4. naive_engine.h
naive顾名思义,最‘简单’的engine的实现。
-
NaiveOpr
:定义了在engine中,一个操作应该具备的结构:Fn
待运行函数,const_vars
输入,mutable_vars
输出,prop
函数的类型,opr_name
操作的名字。 -
NewOperator
:返回一个操作,完成结构的转换 -
Push
:将一个op push给engine。
5. threaded_engine.h
-
OprBlock
:表示一个push给engine的操作,包含了一个特定的操作,一个wait值表示需要等待的任务数,运行环境context
。 -
VersionedVarBlock
:var的version信息表示该var被操作改变的情况。该结构体是ThreadVar链表的元素。OprBlock* trigger
表示出发的操作。 -
ThreadedVar
:链表,表示一组需要执行的操作。-
AppendReadDependency
:将一个对该变量进行读的操作加入规划 -
AppendWriteDependency
: -
read_to_read()
:是否完成了所有的写操作 -
head_
:头节点 -
pending_write_
:下一个要进行的写操作
-
-
ThreadedOpr
:用在OprBlock
,-
fn
:待执行函数 -
const_vars, mutable_vars
:表示输入输出
-
-
ThreadedEngine
:所有的ThreadedEngine
的基类。它规划所有操作,并调用PushToExecute
来执行任务。-
ExecuteOprBlock
:
-
6. stream_manager.h
使用Round-Robin算法来分发GPU的streams。
网友评论