更新时间:2021-03-18 GMT+08:00
分享

配置数据传输

Matrix框架定义的数据传输,根据业务应用分为以下三类,接口类似、传输的对象都为共享指针,但是根据场景不同,接口使用方式有明显区别。

  • Graph外传输数据到Engine的输入端口:请参考《Matrix API参考》中的“Graph::SendData”章节。
  • Graph内的Engine输出端口传输数据到Graph外:请参考《Matrix API参考》中的“Graph::SetDataRecvFunctor”和“Engine::SetDataRecvFunctor”章节。
  • Graph内Engine间的数据传输:请参考《Matrix API参考》中的“Engine::SendData”章节。

Engine间的数据传输

Matrix框架将业务软件分为Host侧(X86/Arm服务器)和Device侧(Ascend 310芯片)两部分软件,因此Engine间的数据传输分为跨侧传输和同侧传输,说明如下:

  • 跨侧传输:传输的数据需要序列化为二进制,通过PCIE或DMA等硬件完成数据传输后,反序列为有效数据。因此对于自定义数据结构,需要用户自定义序列化与反序列化函数,Matrix框架主要提供两种序列化/反序列函数定义方式,分别为普通接口和高速接口,普通接口适合256K以下的数据传输,高速接口适合256K以上的数据传输(高速接口传输小内存块,速度与普通接口类似),详情请参考《Matrix API参考》中的“数据类型序列化和反序列化(C++语言)”章节。
  • 同侧传输:传输的数据即为共享指针的地址,并未拷贝,由于Engine是线程运行,该方式即为线程间用共享内存的方式,实现数据传输,需要用户保证不出现非法访问。Matrix框架推荐用于传输的共享指针,在传输给下一个Engine后,本Engine不再修改共享指针。
  • 跨侧传输在实现序列化与反序列化函数之后,在业务应用上采用的接口与同侧传输一致。
    HIAI_StatusT Engine::SendData(uint32_t portId, const std::string& messageName,
    const shared_ptr<void>& dataPtr, uint32_t timeOut = TIME_OUT_VALUE);

Graph外传数据到engine的输入端口

  • 由Engine组成的业务流,由数据驱动,数据从Graph外传输到Graph内,即通过该接口实现。
  • 以下接口可实现跨侧传输和同侧传输,要求与Engine间的数据传输一致,详情请参考《Matrix API参考》中的“Graph::SendData”章节。
    HIAI_StatusT Graph::SendData(const EnginePortID& targetPortConfig, const
    std::string& messageName, const std::shared_ptr<void>& dataPtr,const uint32_t
    timeOut = 500)

Graph内的Engine输出端口传输数据到Graph外

框架提供了回调函数的模板类DataRecvInterface,框架要求回调函数与输出Engine运行于同侧,即支持同侧传输,不支持跨侧传输。Matrix采用以下两种设置回调函数的方式将Engine输出端口的数据传输到Graph外:
  • 业务流节点Engine输出端口回调,请参考《Matrix API参考》中的“Graph::SetDataRecvFunctor”章节。
  • 其他场景,Engine输出端口回调,请参考《Matrix API参考》中的“Engine::SetDataRecvFunctor”章节。
分享:

    相关文档

    相关产品