配置Engine
Engine是Matrix框架定义的业务软件基本功能单元,用户可继承Matrix定义的Engine模板类,创建业务中各功能模块的Engine(读取输入文件,图像预处理,神经网络推理,推理结果后处理,host/device数据传输等),详情请参考《Matrix API参考》。每一个Engine定义了函数Init()和Process(),在Graph初始化时,会自动运行Init(),从而实现Engine的参数初始化(包含内存分配和模型加载)。Process()接口实现数据的传输和业务逻辑。
- 常用接口介绍如表1所示。
表1 接口说明 接口
描述
说明
HIAI_DEFINE_PROCESS(inputPortNum, outputPortNum)
端口数量(Engine的数据输入和输出数据通道)
Matrix框架为每一端口创建了队列用于缓存数据,Engine间端口的传输关系在Graph配置文件内指定,请参考Graph关键字。
HIAI_StatusT Engine::Init(const AIConfig &config, const vector<AIModelDescription>&modelDesc)
Engine初始化
在创建Graph时此接口会被调用,初始化Engine,Graph配置文件中定义的ai_config会传给函数入参config,用户可在配置文件内添加自定义item,并在初始化函数内使用此item。
HIAI_IMPL_ENGINE_PROCESS(name, engineClass, inPortNum)
Engine的Process,在Device侧对应线程
由数据驱动,即输入端口收到数据后,由框架启动Process运行,如果设置了多个输入端口,每一个输入端口接收到数据后,都会触发一次Process运行,因此如果业务处理依赖多个输入,用户需自行实现多输入的同步逻辑。框架已将Process封装成宏定义,用户实现该宏定义即可。
- Engine读取输入端口的数据,框架支持最大16个输入端口(arg0~arg15),用户可直接使用,从业务应用角度看,数据传输的是共享指针,传输代码示例如下:
// 发送Engine:传输自定义数据USER_DEFINE_TYPE到目标engine std::shared_ptr<USER_DEFINE_TYPE > streamData= std::make_shared< USER_DEFINE_TYPE >(); // 对streamData进行赋值后,调用Senddata发送,发送需要将共享指针转换为void类型 hiai::Engine::SendData(0, " USER_DEFINE_TYPE ", std::static_pointer_cast<void>(deviceStreamData)); // 接收Engine:结构数据,并将数据转换为用户自定义类型USER_DEFINE_TYPE std::shared_ptr< USER_DEFINE_TYPE > inputArg = std::static_pointer_cast< USER_DEFINE_TYPE >(arg0);