掌桥专利:专业的专利平台
掌桥专利
首页

一种数据流水编排方法、装置、存储介质及终端设备

文献发布时间:2023-06-19 15:50:55



技术领域

本申请属于芯片技术领域,尤其涉及一种数据流水编排方法、装置、计算机可读存储介质及终端设备。

背景技术

随着各种人工智能(Artificial Intelligence,AI)芯片的普及,AI协处理器芯片方案也逐步成为人工智能领域解决方案的主要应用场景。但现有技术中的数据流水编排方法主要针对的是单一平台内部的数据流水编排,难以实现在主处理器和AI协处理器芯片之间的跨平台的数据流水编排。

发明内容

有鉴于此,本申请实施例提供了一种数据流水编排方法、装置、计算机可读存储介质及终端设备,以解决现有的数据流水编排方法主要针对的是单一平台内部的数据流水编排,难以实现在主处理器和AI协处理器芯片之间的跨平台的数据流水编排的问题。

本申请实施例的第一方面提供了一种数据流水编排方法,可以包括:

读取预设的数据流水编排配置文件;

在主机端创建用于数据流水编排的容器对象;

根据所述配置文件中的通信链路配置信息在所述容器对象内创建所述主机端与从机端之间的通信链路对象;

根据所述配置文件中的线程配置信息分别在所述主机端和所述从机端创建数据处理线程对象;

根据所述配置文件中的连接配置信息建立各个数据处理线程对象之间的数据流连接,其中,所述主机端的数据处理线程对象与所述从机端的数据处理线程对象之间通过所述通信链路对象建立数据流连接;

根据所述配置文件中的输入输出配置信息设置所述容器对象的输入端口和输出端口,以完成数据流水编排。

进一步地,所述根据所述配置文件中的线程配置信息分别在所述主机端和所述从机端创建数据处理线程对象,包括:

调用所述主机端的线程管理模块在所述主机端创建数据处理线程对象;

通过远程过程调用模块调用所述从机端的线程管理模块在所述从机端创建数据处理线程对象。

进一步地,在根据所述配置文件中的线程配置信息分别在所述主机端和所述从机端创建数据处理线程对象之后,还包括:

调用所述主机端的线程基类中的属性设置函数设置所述主机端的数据处理线程对象的属性;

通过远程过程调用模块调用所述从机端的线程基类中的属性设置函数设置所述从机端的数据处理线程对象的属性。

进一步地,所述根据所述配置文件中的连接配置信息建立各个数据处理线程对象之间的数据流连接,包括:

调用所述主机端的线程基类中的输入输出函数建立所述主机端的数据处理线程对象之间的数据流连接;

通过远程过程调用模块调用所述从机端的线程基类中的输入输出函数建立所述从机端的数据处理线程对象之间的数据流连接;

通过所述通信链路对象建立所述主机端的数据处理线程对象与所述从机端的数据处理线程对象之间的数据流连接。

进一步地,所述通过所述通信链路对象建立所述主机端的数据处理线程对象与所述从机端的数据处理线程对象之间的数据流连接,包括:

将源线程对象的输出端口连接至所述通信链路对象的发送端口;所述源线程对象为所述主机端的数据处理线程对象和所述从机端的数据处理线程对象中的数据流输出方;

设置所述源线程对象的输出端口的远程标志位;

通过所述远程过程调用模块读取目的线程对象的输入端口的任务队列指针,并将该指针赋值给所述源线程对象的输出端口的远程任务队列指针;所述目的线程对象为所述主机端的数据处理线程对象和所述从机端的数据处理线程对象中的数据流输入方;

通过所述远程过程调用模块读取所述目的线程对象的输入端口的任务类型,并将该任务类型赋值给所述源线程对象的输出端口的任务类型;

通过所述远程过程调用模块设置所述目的线程对象的输入端口的远程标志位。

进一步地,在完成数据流水编排之后,还包括:

通过所述容器对象的输入端口向所述容器对象输入数据处理任务;

驱动所述容器对象对所述数据处理任务进行处理,得到与所述数据处理任务对应的任务处理结果;

通过所述容器对象的输出端口输出所述任务处理结果。

进一步地,所述驱动所述容器对象对所述数据处理任务进行处理,包括:

通过源线程对象的输出端口对第一数据处理任务进行序列化,根据序列化后的所述第一数据处理任务、远程任务队列和任务类型组成第二数据处理任务,并将所述第二数据处理任务发送至所述通信链路对象的发送端口;所述源线程对象为所述主机端的数据处理线程对象和所述从机端的数据处理线程对象中的数据流输出方;

通过所述通信链路对象的发送端口接收所述第二数据处理任务,并将所述第二数据处理任务发送至目的线程对象的输入端口的任务队列;所述目的线程对象为所述主机端的数据处理线程对象和所述从机端的数据处理线程对象中的数据流输入方;

通过所述目的线程对象的输入端口对所述第二数据处理任务进行反序列化,并将反序列化后的所述第二数据处理任务发送至所述目的线程对象的数据处理函数进行处理。

本申请实施例的第二方面提供了一种数据流水编排装置,可以包括实现上述任一种数据流水编排方法的各个功能模块。

本申请实施例的第三方面提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述任一种数据流水编排方法的步骤。

本申请实施例的第四方面提供了一种终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任一种数据流水编排方法的步骤。

本申请实施例的第五方面提供了一种计算机程序产品,当计算机程序产品在终端设备上运行时,使得终端设备执行上述任一种数据流水编排方法的步骤。

本申请实施例与现有技术相比存在的有益效果是:本申请实施例读取预设的数据流水编排配置文件;在主机端创建用于数据流水编排的容器对象;根据所述配置文件中的通信链路配置信息在所述容器对象内创建所述主机端与从机端之间的通信链路对象;根据所述配置文件中的线程配置信息分别在所述主机端和所述从机端创建数据处理线程对象;根据所述配置文件中的连接配置信息建立各个数据处理线程对象之间的数据流连接,其中,所述主机端的数据处理线程对象与所述从机端的数据处理线程对象之间通过所述通信链路对象建立数据流连接;根据所述配置文件中的输入输出配置信息设置所述容器对象的输入端口和输出端口,以完成数据流水编排。通过本申请实施例,可以按照预设的配置文件,建立起主处理器等主机端和AI协处理器芯片等从机端之间的数据流连接,从而实现跨平台的数据流水编排。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。

图1为本申请实施例的一种具体实施环境的示意图;

图2为进行线程间任务通信的任务队列的示意图;

图3为线程基类的示意图;

图4为线程注册登记的示意图;

图5为主机端和从机端之间的点对点信道的示意图;

图6为本申请实施例中一种数据流水编排方法的一个实施例流程图;

图7为主机端的数据处理线程对象之间的数据流连接示意图;

图8为数据处理线程进行前后兼容的示意图;

图9为主机端的数据处理线程对象与从机端的数据处理线程对象之间的数据流连接示意图;

图10为数据流水编排的一个具体实例的示意图;

图11为本申请实施例中一种数据流水编排装置的一个实施例结构图;

图12为本申请实施例中一种终端设备的示意框图。

具体实施方式

为使得本申请的发明目的、特征、优点能够更加的明显和易懂,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本申请一部分实施例,而非全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。

应当理解,当在本说明书和所附权利要求书中使用时,术语“包括”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。

还应当理解,在此本申请说明书中所使用的术语仅仅是出于描述特定实施例的目的而并不意在限制本申请。如在本申请说明书和所附权利要求书中所使用的那样,除非上下文清楚地指明其它情况,否则单数形式的“一”、“一个”及“该”意在包括复数形式。

还应当进一步理解,在本申请说明书和所附权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。

如在本说明书和所附权利要求书中所使用的那样,术语“如果”可以依据上下文被解释为“当...时”或“一旦”或“响应于确定”或“响应于检测到”。类似地,短语“如果确定”或“如果检测到[所描述条件或事件]”可以依据上下文被解释为意指“一旦确定”或“响应于确定”或“一旦检测到[所描述条件或事件]”或“响应于检测到[所描述条件或事件]”。

另外,在本申请的描述中,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。

图1所示为本申请实施例提供的一种数据流水编排方法的一种具体实施环境的示意图,该实施环境可以包括主机端(记为Host)和从机端(记为Device)。其中,主机端一般为基于X86或ARM的主处理器,从机端一般为用于特定目的的设备,例如AI协处理器芯片等。

在本申请实施例中,可以通过预设的容器(Container)接口来实现主机端和从机端之间跨平台的数据流水编排,此处将进行数据流水编排的容器记为De::Graph。在现有的计算机技术中,一般将容器作为一种特殊的类(Class),即对各种具体的对象(Object)的抽象化模板。在具体应用中,可以根据实际场景对类进行实例化,生成类的对象,此处将De::Graph实例化生成的容器对象记为Graph。De::Graph可以利用线程管理模块(记为NodeWrapper)这一外部模块来进行数据处理线程(记为Node)的管理,并可以利用链路管理模块(记为P2P ChannelWrapper)这一外部模块来进行跨平台的通信链路(记为Bridge)的管理。其中,线程管理模块在主机端和从机端各有一个全局实体对象,分别记为HostNodeWrapper和Device NodeWrapper,管理主机端/从机端注册的Node类型,负责Node对象的动态创建和删除;P2P ChannelWrapper设置于主机端,负责主机端和从机端之间的点对点信道(记为P2P Channel)的动态创建和删除。

在本申请实施例中,可以使用如图2所示的任务队列(记为TaskQueue)来进行线程间任务(记为Task)的通信。任务队列内部使用固定大小的先进先出(First Input FirstOutput,FIFO)队列保存线程间的Task信息,Task信息包括Task类型信息以及Task的指针信息。如图2所示的例子,发送线程A和B在堆空间上动态申请Task对象,通过任务队列对象发送任务Task X和Y,接收线程C依次从任务队列对象中读取Task并处理,Task类型采用数值表示,约定Task指针的类型信息,处理完毕后在堆空间上释放Task对象。如果发送线程发送任务时任务队列的FIFO队列满,那么发送线程会堵塞直到接收线程从FIFO队列中取出Task;如果接收线程接收任务时任务队列的FIFO队列为空,那么接收线程会堵塞等待发送线程发送Task。

在本申请实施例中,可以使用线程输入类(记为PIN)来辅助线程读取任务队列中的输入任务(记为input task),PIN对象中可以包括如下信息:

(1)任务队列对象,用于线程间Task通信。

(2)线程支持的input task类型信息,该类型信息以类型名称的字符串(保证字符串全局唯一)为标记,例如,若PIN支持namespace X的struct A和namespace Y的struct B这两种任务类型(记为task type),那么PIN通过函数SetTypeInfo(0,“X::A”)和SetTypeInfo(1,“Y::B”)设置类型信息,表示该线程支持任务队列的X::A和Y::B的Task对象指针信息,如果任务类型为0,那么表示X::A类型的对象指针,如果任务类型为1,则表示Y::B类型的对象指针。

(3)任务队列中的Task删除函数信息,用于PIN对象析构时,释放任务队列对象的Task指针对象。

在本申请实施例中,可以使用线程输出类(记为POUT)来辅助线程发送输出任务(记为output task),每个POUT对象只允许一种任务类型输出,POUT对象中可以包括如下信息:

(1)任务队列指针信息,如果为空,表示该POUT悬空,不允许task输出。

(2)线程支持的output task类型信息,该类型信息以全局类型字符串为唯一标记,例如,若POUT支持namespace X的struct A任务类型,那么POUT通过函数SetTypeInfo(“X::A”)设置类型信息。

在本申请实施例中,可以使用如图3所示的线程基类(记为NodeBase)来抽象线程的公共行为和属性,线程基类中可以包括:

(1)1个PIN对象,用于线程的接收消息读取,线程从PIN中读取input task,并根据类型标识(记为type id)来解析Task指针信息,并调用任务处理函数(记为Proc)进行任务处理。

(2)16个POUT对象,用于线程的输出消息发送,每个POUT仅支持一种类型输出,以供任务处理函数输出output task。

(3)通用的属性配置参数以及设置函数(记为Set)和获取函数的接口(记为Get),属性采用键值(key-value)设置,其中,键(key)为string类型,值(value)支持int,float,string类型,属性用于控制线程的任务处理函数内部处理控制,比如可以调用基类Set(“min.face.pixel”,48)函数设置最小人脸参数,可以通过int min_face=Get(“min.face.pixel”)获取到用户设置的最小人脸参数。

(4)线程的任务处理函数,利用PIN读取input task并处理,处理完毕可以通过POUT发送output task。

(5)线程的启动函数(记为start)和停止函数(记为stop),用于控制线程启动和停止。

Node之间通过任务队列通信,而任务队列中存放的是通用的void*指针,依赖任务队列中的任务类型指示如何解析void*指针任务。在本申请实施例中,Node的任务处理函数定义任务类型的类型值含义,Node的PIN对象存储任务类型的类型关系。例如,在设计阶段可以定义Node能处理的类型“X::A”且其任务类型的值为0,还可以定义Node能处理的类型“Y::B”且其任务类型的值为1。

图4所示为Node注册登记的示意图,首先,可以基于线程基类扩展出所需的Node类(记为NodeClass),在线程基类的构造函数中注入PIN/POUT的task类型信息,从而实现用户自己的input tasks的任务处理函数;然后,可以通过注册中心(记为NodeRegister)注册NodeClass的类型信息,注册信息记录NodeClass的字符串名称,NodeClass的创建函数(记为new)和删除函数(记为delete);最后,线程管理模块提供统一的Node对象创建和删除功能,根据NodeClass的注册字符串名称,动态创建/释放NodeClass对象。

在本申请实施例中,P2P Channel可以分为从主机端到从机端方向的信道,以及从从机端到主机端方向的信道,可以高效地将数据传输到对端。

以图5所示的从主机端到从机端方向的信道为例来说明,P2P Channel可以包括:

(1)主机端的P2P发送线程的任务队列,用于接收主机端的其它线程的任务(Task)发送请求,发送的Task内容包括:从机端的任务队列信息、Task的序列化码流信息以及Task类型信息,其中,Task的类型信息用于通知从机端如何反序列化接收到的码流信息。

(2)主机端的P2P发送线程(记为P2P TxChannel),用于从任务队列取出Task并组包发送;

(3)从机端的P2P接收线程(记为P2P RxChannel),用于接收数据包并对其解包,解包后获得Task的接收任务队列以及Task类型信息,推送到从机端对应的任务队列中。

从从机端到主机端方向的P2P Channel与之类似,仅需将上述内容中的从机端和主机端互换即可,本申请实施例对此不再赘述。

Bridge为基于P2P Channel的封装,用于主机端和从机端之间的Task序列化后通用数据传输通信,可以通过P2P Channel的P2P发送端口(记为P2P TxPort)发送序列化的Task到对端的任务队列中。

在本申请实施例中,De::Graph内部可以划分为如下独立的模块:

(1)线程创建/销毁模块(记为Node Create/Destroy):该模块根据用户指定的Node所属位置(主机端还是从机端),创建或者销毁Node对象;如果Node在主机端,那么调用Host NodeWrapper处理;如果Node在从机端,那么通过远程过程调用模块(RemoteProcedure Call,RPC)调用从机端的Device NodeWrapper处理。

(2)线程属性设置模块(记为NodeAttrs):线程基类为其派生出的线程提供通用的键值配置,用于指明线程的处理过程中所使用到的各种属性,对于其中的任意一个属性,均有与该属性对应的键值,如果Node在主机端,那么调用本地的线程基类的Set/Get函数接口;如果Node在从机端,那么通过远程过程调用模块调用线程基类的Set/Get函数接口。

(3)通信链路创建/销毁模块(记为Bridge Create/Destroy):该模块调用外部P2PChannelWrapper,创建/销毁跨平台通信链路。

(4)线程连接模块(记为NodesLink):该模块负责连接任意线程之间的PIN和POUT。

请参阅图6,本申请实施例中一种数据流水编排方法的一个实施例可以包括:

步骤S601、读取预设的数据流水编排配置文件。

所述配置文件可以由用户预先进行设置,其中可以包括如下信息:

(1)线程配置信息,其中包括NodeClass的字符串名称,Node对象的字符串名称。

(2)线程属性配置信息,其中包括Node对象字符串,Node对象的配置属性中的键的字符串名称以及与该键对应的目标值(可以为整形/浮点/字符串常量)。

(3)线程之间的连接信息,其中包括连接的源Node对象的字符串名称,源Node对象的POUT索引号,目的Node对象的字符串名称。其中,源Node对象为数据流输出方,目的Node对象为数据流输入方。由于同一Node对象中可能存在多个POUT,为了便于对其进行区分,对于同一Node对象中的任意一个POUT,均可为其设置唯一的标识,即POUT索引号。

(4)容器对象的输入输出信息,其中包括Graph的输入索引号以及输入Node对象的字符串名称,Graph的输出索引号以及输出Node对象的字符串名称,输出Node对象的POUT索引号。由于Graph中可能存在多个输入,为了便于对其进行区分,对于Graph中的任意一个输入,均可为其设置唯一的标识,即Graph的输入索引号;类似地,由于Graph中可能存在多个输出,为了便于对其进行区分,对于Graph中的任意一个输出,均可为其设置唯一的标识,即Graph的输出索引号。

(5)通信链路配置信息,以及线程之间通过通信链路的连接信息。

上述信息全部为常量类型,将其数据结构设计为json格式(支持标准json序列化/反序列化),这样就可以通过离线json文件读取数据流水编排的配置方式,重构整个数据流水编排流程。用户还可以根据实际情况对所述配置文件进行修改,而不需要重新编译一个新的数据流水编排就能得到所需的数据流水编排。

步骤S602、在主机端创建用于数据流水编排的容器对象。

步骤S603、根据所述配置文件中的通信链路配置信息在所述容器对象内创建所述主机端与从机端之间的通信链路对象。

即在Graph容器对象内创建Bridge对象,Graph支持1个主机端和多个从机端之间的Bridge,但不支持从机端之间建立Bridge。在本申请实施例中,可以调用如下接口创建Bridge对象:

graph->CreateBridge(Dev0,“chan#0”,Bridge0,{“mode”:H2D}),即创建主机端到从机端Dev0的chan#0,Bridge的索引号(index)为0;

graph->CreateBridge(Dev1,“chan#6”,Bridge3,{“mode”:D2H}),即创建从机端Dev1到主机端的chan#6,Bridge的索引号为3。

步骤S604、根据所述配置文件中的线程配置信息分别在所述主机端和所述从机端创建数据处理线程对象。

具体地,对于主机端,可以调用Host NodeWrapper根据NodeClass的字符串名称和Node对象的字符串名称,在主机端动态创建Node对象。在本申请实施例中,假设在所述线程配置信息中,NodeClass的字符串名称为NodeA,Node对象的字符串名称为node-a,则可以调用如下接口创建Node对象:

graph->CreateHostNode(“NodeA”,“node-a”),即调用Host NodeWrapper创建NodeA类的对象node-a。

对于从机端,可以通过远程过程调用模块调用Device NodeWrapper根据NodeClass的字符串名称和Node对象的字符串名称,在从机端动态创建Node对象。在本申请实施例中,假设在所述线程配置信息中,NodeClass的字符串名称为NodeB,Node对象的字符串名称为node-b,则可以调用如下接口创建Node对象:

graph->CreateDevNode(Dev1,“NodeB”,“node-b”),即通过RPC调用从机端Dev1的Device NodeWrapper创建NodeB类的对象node-b。

通过上述过程,可以按照预设的配置文件,分别在主机端和从机端创建数据处理线程对象,即实现了跨平台的数据处理线程对象创建。

进一步地,还可以根据所述配置文件中的线程属性配置信息设置Node对象的属性,对于主机端,可以调用主机端的线程基类中的设置函数设置主机端的Node对象的属性;对于从机端,可以通过远程过程调用模块调用从机端的线程基类中的设置函数设置从机端的Node对象的属性。在本申请实施例中,假设在所述线程配置信息中,Node对象的字符串名称为node-a,Node对象的配置属性中的键的字符串名称为resize_ratio,与该键对应的目标值为0.5,则可以调用如下接口设置Node对象的属性:

graph->SetNodeAttr(“node-a”,“resize_ratio”,0.5),即设置node-a对象的属性“resize_ratio”值为0.5,在内部实现过程中,会先查找node-a对象的位置(主机端还是从机端),如果在主机端端,那么直接调用线程基类中的设置函数设置,如果在从机端,那么先找到对应的从机端设备号,然后通过远程过程调用模块调用对应的从机端的线程基类中的设置函数设置。

通过上述过程,可以按照预设的配置文件,分别在主机端和从机端进行数据处理线程对象的属性设置,即实现了跨平台的数据处理线程对象属性设置。

步骤S605、根据所述配置文件中的连接配置信息建立各个数据处理线程对象之间的数据流连接。

各个Node对象之间的数据流连接可以分为如下几种情况:

(1)主机端的Node对象连接:具体地,可以根据所述连接配置信息,直接调用主机端的线程基类中的PIN和POUT建立主机端的Node对象之间的数据流连接。

首先,建立任务队列连接关系:根据所述连接配置信息中的源Node对象的字符串名称以及源Node对象的POUT索引号可以确定唯一的源Node对象的POUT,根据所述连接配置信息中的目的Node对象的字符串名称可以确定唯一的目的Node对象的PIN。在确定两者之后,可以将源Node对象X的POUT的任务队列对象指针指向目的Node对象Y的PIN的任务队列对象;然后,进行Task的类型检查以及关联:如图7中的示例,目的Node对象Y的PIN定义自己能够处理的接收Task类型以及接收Task类型标识,源Node对象X的POUT[2]定义自己发送的Task类型信息,源Node对象X的POUT[2]对象会查询目的Node对象Y是否支持“X::A”的Task类型信息,如果能匹配到且返回有效的task类型标识(类型为0),那么表示POUT和PIN连接有效,源Node对象X通过POUT[2]在向任务队列中发送任务时候携带发送任务的类型标识0。

(2)从机端的Node对象连接:通过远程过程调用模块远程调用从机端的线程基类中的PIN和POUT建立从机端的Node对象之间的数据流连接。

从机端的情况与主机端类似,具体可参照前述主机端的叙述,此处不再赘述。

(3)主机端的Node对象和从机端的Node对象连接:通过Bridge对象建立主机端的Node对象和从机端的Node对象之间的数据流连接。

在本申请实施例中,Node类型要兼容前后Node的连接方式,如图8所示,Node类型在PIN上要根据连接Node关系,支持同一平台本地Node(记为Local Node)的POUT连接,也支持不同平台远程Node(记为Remote Node)的POUT通过Bridge连接;同理Node类型的POUT也要兼容下一级Local Node和Remote Node的PIN连接。

为了支持Remote Node的连接,可以对Node的PIN作如下扩展:

描述接收指定的任务类型的连接状态的远程标志位数组(记为RemoteFlags),如果RemoteFlags[i]为真(True),那么表示任务类型为i的Task来自Remote Node;

描述接收指定的任务类型的Task的反序列化函数数组(记为TaskDeSers),如果RemoteFlags[i]为True,那么表示从任务队列读取的Task已经经过Bridge序列化,则内部需要调用TaskDeSers[i]对Task进行反序列化,再送给Node的任务处理函数。

为了支持Remote Node的连接,可以对Node的POUT作如下扩展:

描述POUT连接状态的远程标志位数组(记为RemoteFlag),如果RemoteFlag为True,那么表示POUT发送给Remote Node的PIN;

描述POUT的发送Task的序列化函数(记为TaskSer),如果RemoteFlag为True,那么POUT需要调用TaskSer对Task做序列化,然后才能通过Bridge发送给Remote Node的PIN;

描述POUT发送Remote Node的远程任务队列(记为RemoteTaskQueue)指针;

描述POUT连接Bridge的发送端口(记为P2PTxPort)指针。

图9所示为主机端的Node对象和从机端的Node对象连接的示例图,如图所示,以主机端的NodeA的POUT[0]通过Bridge#0,发送TaskA::X任务给从机端的NodeB为例来说明跨平台PIN和POUT连接过程:

(1)将源线程对象的输出端口连接至所述通信链路对象的发送端口。

在该示例中,即连接主机端的NodeA的POUT[0]到Bridge#0的P2PTxPort。

(2)设置源线程对象的输出端口的属性。

具体地,设置所述源线程对象的输出端口的远程标志位;通过所述远程过程调用模块读取目的线程对象的输入端口的任务队列指针,并将该指针赋值给所述源线程对象的输出端口的远程任务队列指针;通过所述远程过程调用模块读取所述目的线程对象的输入端口的任务类型,并将该任务类型赋值给所述源线程对象的输出端口的任务类型。

在该示例中,即设置主机端的NodeA的POUT[0]的属性。具体地,设置RemoteFlag为True,通过远程过程调用模块读取到从机端的NodeB的PIN TaskQueue指针,赋值给远程任务队列;通过远程过程调用模块读取到从机端的NodeB的PIN TaskType信息,赋值给POUT的任务类型,比如图中TaskA::X对应的任务类型为1。

(3)设置目的线程对象的输入端口的属性。

具体地,通过所述远程过程调用模块设置所述目的线程对象的输入端口的远程标志位。

在该示例中,即设置从机端的NodeB的PIN属性。具体地,通过远程过程调用模块设置RemoteFlags数组标记,比如图中TaskA::X对应的任务类型为1,那么设置RemoteFlags[1]为True。

在本申请实施例中,可以调用如下接口建立主机端的Node对象和从机端的Node对象之间的数据流连接:

graph->LinkNodes(“node-a”,0,“node-b”),即表示主机端node-a对象的输出POUT[0]连接在主机端node-b对象的PIN上,如果连接的任务类型不匹配,那么连接失败;如果node-a和node-b不在主机端,那么连接失败;

graph->LinkNodes(“node-a”,1,“dev0-node-c”,bridge0),bridge0表示的是主机端到从机端dev0的bridge信道,通过bridge 0将主机端的node-a对象的输出POUT[1]连接到dev0-node-c对象的PIN上,如果连接的任务类型不匹配,那么连接失败;如果node-a不在主机端,dev0-node-c不在从机端dev0上,那么连接失败。

通过上述过程,可以按照预设的配置文件,通过通信链路对象建立主机端的数据处理线程对象与从机端的数据处理线程对象之间的数据流连接,即实现了跨平台的数据流连接。

通过步骤S605,提供了分别针对主机端之间、从机端之间、以及主机端与从机端之间这三种情况的不同的处理方式,从而实现了在各个数据处理线程对象之间的数据流连接。

步骤S606、根据所述配置文件中的输入输出配置信息设置所述容器对象的输入端口(记为input)和输出端口(记为output)。

在本申请实施例中,假设在所述输入输出配置信息中,Graph的输入索引号为0,输入Node对象的字符串名称为node-a,则可以调用如下接口来设置Graph的input和output:

graph->SetInputNode(0,“node-a”),即表示node-a对象的PIN为Graph的输入input[0];

假设在所述输入输出配置信息中,Graph的输出索引号为1,输出Node对象的字符串名称为node-e,输出POUT索引号为7,则可以调用如下接口来设置容器对象的output:

graph->SetOutputNode(1,“node-e”,7),即表示node-e对象的POUT[7]为Graph的输出output[1];

通过以上过程,即可以按照预设的配置文件,建立起主处理器等主机端和AI协处理器芯片等从机端之间的数据流连接,从而实现跨平台的数据流水编排,生成最终的Graph以供后续使用。

图10所示即为数据流水编排的一个具体实例,如图所示,在主机端建立NodeA,E对象,通过远程过程调用模块在从机端建立NodeB,C,D对象,以及主机端和从机端之间的通信链路Bridge#1,2,3对象,最后通过Graph的线程连接模块建立各个Node之间的PIN和POUT的数据关联,形成一个跨平台的数据处理Graph流。

在完成数据流水编排之后,当需要执行这一数据流水编排时,则启动Graph,调用Graph的启动函数start(),通过Graph的input向Graph输入Task,并驱动Graph对该Task进行处理,得到与该Task对应的任务处理结果,通过Graph的output读取并输出该任务处理结果。处理完毕后,调用Graph的停止函数stop(),停止Graph,最后删除Graph。通过这样的方式,即可实现按照预先完成的数据流水编排来执行对各种数据处理任务的处理。

其中,在驱动Graph对该Task进行处理的过程中,当需要进行主机端和从机端之间的任务传输处理时,则具体可以包括:通过源Node的POUT对原始的数据处理任务(记为第一数据处理任务)进行序列化,根据序列化后的所述第一数据处理任务、远程任务队列和任务类型组成第二数据处理任务,并将所述第二数据处理任务发送至Bridge的P2PTxPort;通过Bridge的P2PTxPort接收所述第二数据处理任务,并将所述第二数据处理任务发送至目的Node的PIN的任务队列;通过所述目的Node的PIN对所述第二数据处理任务进行反序列化,并将反序列化后的所述第二数据处理任务发送至所述目的Node的任务处理函数进行处理。

以图9中主机端的NodeA到从机端的NodeB传输为例,经过NodesLink跨平台连接后,主机端和从机端的NodeA和NodeB都已经获取到相应的连接信息,Task传输步骤如下:

(1)NodeA的任务处理函数进行业务处理,在栈空间上申请TaskA::X任务并赋值,通过主机端的NodeA POUT[1]->SendTask(tx_task,1)发送给Remote Node;

(2)主机端的NodeA的POUT[0]检测到RemoteFlag为True,那么调用serTask=POUT[0]->TaskSer(tx_task)对tx_task进行序列化并释放原先的tx_task,并结合远程任务队列以及任务类型组成新的传输task,发送到POUT[0]->P2PTxPort;

(3)Bridge#0通过P2PTxPort接收到传输task,调用跨平台底层驱动链路发送到从机端的NodeB的PIN TaskQueue中;

(4)从机端NodeB收到任务类型为1的task,检测到PIN->RemoteFlags[1]为True,那么把传输task取出,调用PIN->TaskDeSers[1]对传输任务进行反序列化并释放传输任务,得到新的rx_task,送给Node的任务处理函数进行处理。

通过上述过程,即可实现主机端的数据处理线程对象与从机端的数据处理线程对象之间跨平台的任务传输处理。

应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。

对应于上文实施例所述的一种数据流水编排方法,图11示出了本申请实施例提供的一种数据流水编排装置的一个实施例结构图。

本实施例中,一种数据流水编排装置可以包括:

配置文件读取模块1101,用于读取预设的数据流水编排配置文件;

容器对象创建模块1102,用于在主机端创建用于数据流水编排的容器对象;

通信链路对象创建模块1103,用于根据所述配置文件中的通信链路配置信息在所述容器对象内创建所述主机端与从机端之间的通信链路对象;

线程对象创建模块1104,用于根据所述配置文件中的线程配置信息分别在所述主机端和所述从机端创建数据处理线程对象;

数据流连接建立模块1105,用于根据所述配置文件中的连接配置信息建立各个数据处理线程对象之间的数据流连接,其中,所述主机端的数据处理线程对象与所述从机端的数据处理线程对象之间通过所述通信链路对象建立数据流连接;

输入输出设置模块1106,用于根据所述配置文件中的输入输出配置信息设置所述容器对象的输入端口和输出端口,以完成数据流水编排。

进一步地,所述线程对象创建模块可以包括:

主机端线程对象创建单元,用于调用所述主机端的线程管理模块在所述主机端创建数据处理线程对象;

从机端线程对象创建单元,用于通过远程过程调用模块调用所述从机端的线程管理模块在所述从机端创建数据处理线程对象。

进一步地,所述线程对象创建模块还可以包括:

主机端线程对象属性设置单元,用于调用所述主机端的线程基类中的属性设置函数设置所述主机端的数据处理线程对象的属性;

从机端线程对象属性设置单元,用于通过远程过程调用模块调用所述从机端的线程基类中的属性设置函数设置所述从机端的数据处理线程对象的属性。

进一步地,所述数据流连接建立模块可以包括:

主机端数据流连接建立单元,用于调用所述主机端的线程基类中的输入输出函数建立所述主机端的数据处理线程对象之间的数据流连接;

从机端数据流连接建立单元,用于通过远程过程调用模块调用所述从机端的线程基类中的输入输出函数建立所述从机端的数据处理线程对象之间的数据流连接;

跨平台数据流连接建立单元,用于通过所述通信链路对象建立所述主机端的数据处理线程对象与所述从机端的数据处理线程对象之间的数据流连接。

进一步地,所述跨平台数据流连接建立单元可以包括:

端口连接子单元,用于将源线程对象的输出端口连接至所述通信链路对象的发送端口;所述源线程对象为所述主机端的数据处理线程对象和所述从机端的数据处理线程对象中的数据流输出方;

第一标志位设置子单元,用于设置所述源线程对象的输出端口的远程标志位;

指针赋值子单元,用于通过所述远程过程调用模块读取目的线程对象的输入端口的任务队列指针,并将该指针赋值给所述源线程对象的输出端口的远程任务队列指针;所述目的线程对象为所述主机端的数据处理线程对象和所述从机端的数据处理线程对象中的数据流输入方;

任务类型赋值子单元,用于通过所述远程过程调用模块读取所述目的线程对象的输入端口的任务类型,并将该任务类型赋值给所述源线程对象的输出端口的任务类型;

第二标志位设置子单元,用于通过所述远程过程调用模块设置所述目的线程对象的输入端口的远程标志位。

进一步地,所述数据流水编排装置还可以包括:

数据处理任务输入模块,用于通过所述容器对象的输入端口向所述容器对象输入数据处理任务;

数据处理任务处理模块,用于驱动所述容器对象对所述数据处理任务进行处理,得到与所述数据处理任务对应的任务处理结果;

任务处理结果输出模块,用于通过所述容器对象的输出端口输出所述任务处理结果。

进一步地,所述数据处理任务处理模块可以包括:

第一处理单元,用于通过源线程对象的输出端口对第一数据处理任务进行序列化,根据序列化后的所述第一数据处理任务、远程任务队列和任务类型组成第二数据处理任务,并将所述第二数据处理任务发送至所述通信链路对象的发送端口;所述源线程对象为所述主机端的数据处理线程对象和所述从机端的数据处理线程对象中的数据流输出方;

第二处理单元,用于通过所述通信链路对象的发送端口接收所述第二数据处理任务,并将所述第二数据处理任务发送至目的线程对象的输入端口的任务队列;所述目的线程对象为所述主机端的数据处理线程对象和所述从机端的数据处理线程对象中的数据流输入方;

第三处理单元,用于通过所述目的线程对象的输入端口对所述第二数据处理任务进行反序列化,并将反序列化后的所述第二数据处理任务发送至所述目的线程对象的数据处理函数进行处理。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置,模块和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。

图12示出了本申请实施例提供的一种终端设备的示意框图,为了便于说明,仅示出了与本申请实施例相关的部分。

如图12所示,该实施例的终端设备12包括:处理器120、存储器121以及存储在所述存储器121中并可在所述处理器120上运行的计算机程序122。所述处理器120执行所述计算机程序122时实现上述各个数据流水编排方法实施例中的步骤,例如图6所示的步骤S601至步骤S606。或者,所述处理器120执行所述计算机程序122时实现上述各装置实施例中各模块/单元的功能,例如图11所示模块1101至模块1106的功能。

示例性的,所述计算机程序122可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器121中,并由所述处理器120执行,以完成本申请。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述所述计算机程序122在所述终端设备12中的执行过程。

所述终端设备12可以是桌上型计算机、笔记本、掌上电脑、智能手机及智能电视等计算设备。本领域技术人员可以理解,图12仅仅是终端设备12的示例,并不构成对终端设备12的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述终端设备12还可以包括输入输出设备、网络接入设备、总线等。

所述处理器120可以是中央处理单元(Central Processing Unit,CPU),还可以是其它通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其它可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。所述处理器120可以是所述终端设备12的神经中枢和指挥中心,所述处理器120可以根据指令操作码和时序信号,产生操作控制信号,完成取指令和执行指令的控制。

所述存储器121可以是所述终端设备12的内部存储单元,例如终端设备12的硬盘或内存。所述存储器121也可以是所述终端设备12的外部存储设备,例如所述终端设备12上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等。进一步地,所述存储器121还可以既包括所述终端设备12的内部存储单元也包括外部存储设备。所述存储器121用于存储所述计算机程序以及所述终端设备12所需的其它程序和数据。所述存储器121还可以用于暂时地存储已经输出或者将要输出的数据。

所述终端设备12还可以包括通信模块,所述通信模块可以提供应用在网络设备上的包括无线局域网(Wireless Local Area Networks,WLAN)(如Wi-Fi网络),蓝牙,Zigbee,移动通信网络,全球导航卫星系统(Global Navigation Satellite System,GNSS),调频(Frequency Modulation,FM),近距离无线通信技术(Near Field Communication,NFC),红外技术(Infrared,IR)等通信的解决方案。所述通信模块可以是集成至少一个通信处理模块的一个或多个器件。该通信模块可以包括天线,该天线可以只有一个阵元,也可以是包括多个阵元的天线阵列。所述通信模块可以通过天线接收电磁波,将电磁波信号调频以及滤波处理,将处理后的信号发送到处理器。所述通信模块还可以从处理器接收待发送的信号,对其进行调频、放大,经天线转为电磁波辐射出去。

所述终端设备12还可以包括电源管理模块,所述电源管理模块可以接收外接电源、电池和/或充电器的输入,为所述处理器、所述存储器和所述通信模块等供电。

所述终端设备12还可以包括显示模块,所述显示模块可用于显示由用户输入的信息或提供给用户的信息。所述显示模块可包括显示面板,可选的,可以采用液晶显示器(Liquid Crystal Display,LCD)、有机发光二极管(Organic Light-Emitting Diode,OLED)等形式来配置显示面板。进一步的,触控面板可覆盖显示面板,当触控面板检测到在其上或附近的触摸操作后,传送给所述处理器以确定触摸事件的类型,随后所述处理器根据触摸事件的类型在所述显示面板上提供相应的视觉输出。

所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

在本申请所提供的实施例中,应该理解到,所揭露的装置/终端设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/终端设备实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

本申请实施例提供了一种计算机程序产品,当计算机程序产品在所述终端设备上运行时,使得所述终端设备可实现上述各个方法实施例中的步骤。

所述集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读存储介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读存储介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读存储介质不包括电载波信号和电信信号。

以上所述实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。

相关技术
  • 一种数据流水编排方法、装置、可读存储介质及终端设备
  • 一种ICE服务编排方法、装置、终端设备以及存储介质
技术分类

06120114604101