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:将一个oppush给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。