发明内容
本申请实施例提供了一种任务执行方法、任务配置方法、板卡、服务器,以至少解决相关技术未安装操作***的板卡无法支持多用户操作的问题 。
根据本申请的一个实施例,提供了一种任务执行方法,应用于板卡,所述板卡的内存包括第一区域和第二区域,所述第一区域中具有多个头结构体数据,所述头结构体数据用于表示推理任务的配置信息,所述第二区域中具有多个任务结构体数据,所述任务结构体数据中包括用于执行对应的任务的任务信息,包括:从所述第一区域中的多个头结构体数据中获取第一头结构体数据,其中,所述头结构体数据用于表示推理任务的配置信息,所述第一头结构体数据中的第一属性的属性值为第一值,其中,所述第一值用于指示头结构体数据对应的推理任务处于待执行状态;从所述第一头结构体数据中获取第一任务结构体地址,并根据所述第一任务结构体地址从所述内存的第二区域中获取第一任务结构体数据,其中,所述第一任务结构体数据中包括用于执行所述第一任务结构体数据对应的第一任务的相关信息;根据所述第一任务结构体数据执行所述第一任务,其中,所述第一头结构体数据对应的第一推理任务包括所述第一任务。
在一个示例性的实施例中,所述内存还包括第三区域,所述第三区域用于进行数据存储,所述根据所述第一任务结构体数据执行所述第一任务,包括:从所述第一任务结构体数据中获取第一任务信息地址;在所述第一任务结构体数据用于指示执行N个计算操作的情况下,通过以下方式执行第i个计算操作、以执行所述第一任务中的所述N个计算操作,其中,i为大于等于1、小于等于N的正整数:根据所述第一任务信息地址确定所述第i个计算操作对应的第i个数据输入地址和第i个数据输出地址;根据所述第i个数据输入地址从所述内存的第三区域中获取第i个输入数据,并根据所述第i个输入数据进行计算,得到第i个计算结果;根据所述第i个数据输出地址在所述内存的第三区域存储所述第i个计算结果。
在一个示例性的实施例中,所述根据所述第i个输入数据进行计算,得到第i个计算结果,包括:从所述第一任务结构体数据中获取第二属性的属性值,其中,所述第二属性的属性值用于指示所述第一任务对应的计算方式:在所述第二属性的属性值为第一预设值的情况下,使用深度学习加速器DLA对所述第i个输入数据进行计算,得到第i个计算结果;在所述第二属性的属性值为第二预设值的情况下,使用精简指令集计算机RISCV对所述第i个输入数据进行计算,得到第i个计算结果。
在一个示例性的实施例中,在所述根据所述第一任务结构体数据执行所述第一任务之后,所述方法还包括:在所述第一任务结构体数据中存在第二任务结构体地址的情况下,根据所述第二任务结构体地址从所述内存的第二区域中获取第二任务结构体数据,其中,所述第二任务结构体数据中包括用于执行所述第二任务结构体数据对应的第二任务的相关信息;根据所述第二任务结构体数据执行所述第二任务,其中,所述第一推理任务包括所述第二任务。
在一个示例性的实施例中,在所述根据所述第一任务结构体数据执行所述第一任务之后,所述方法还包括:在所述第一任务结构体数据中不存在第二任务结构体地址的情况下,确定所述第一区域中的多个头结构体数据中是否存在第二头结构体数据,其中,第二头结构体数据中的所述第一属性的属性值为所述第一值;在所述第一区域中的多个头结构体数据中存在所述第二头结构体数据的情况下,从所述第二头结构体数据中获取第三任务结构体地址,并根据所述第三任务结构体地址从所述内存的第二区域中获取第三任务结构体数据,其中,所述第三任务结构体数据中包括用于执行所述第三任务结构体数据对应的第三任务的相关信息;根据所述第三任务结构体数据执行所述第三任务,其中,所述第二头结构体数据对应的第二推理任务包括所述第三任务。
在一个示例性的实施例中,在所述从所述第一区域中的多个头结构体数据中获取第一头结构体数据之后,方法还包括:从所述第一头结构体数据中获取第一任务结构体地址之前,将所述第一头结构体数据中的所述第一属性的属性值修改为第二值,其中,所述第二值用于指示所述第一头结构体数据对应的第一推理任务处于执行状态。
在一个示例性的实施例中,所述方法还包括:在根据所述第一头结构体数据完成所述第一推理任务的情况下,将所述第一头结构体数据中的所述第一属性的属性值修改为第三值,其中,所述第三值用于指示所述第一头结构体数据对应的第一推理任务处于已完成状态。
在一个示例性的实施例中,在所述从所述第一区域中的多个头结构体数据中获取第一头结构体数据之前,所述方法还包括:在所述多个头结构体数据中具有多个目标头结构体数据的情况下,确定所述第一头结构体数据为所述多个目标头结构体数据中序号最小的头结构体数据,其中,所述目标头结构体数据中的所述第一属性的属性值为所述第一值。
在一个示例性的实施例中,在所述从所述第一区域中的多个头结构体数据中获取第一头结构体数据之前,所述方法还包括:在所述多个头结构体数据中具有多个目标头结构体数据的情况下,确定所述第一头结构体数据为所述多个目标头结构体数据中配置时间距离当前最远的头结构体数据,其中,所述目标头结构体数据中的所述第一属性的属性值为所述第一值。
根据本申请的另一个实施例,提供了一种任务配置方法,应用于服务器,所述服务器与板卡具有通信连接关系,所述板卡的内存包括第一区域和第二区域,所述第一区域中具有多个头结构体数据,所述头结构体数据用于表示推理任务的配置信息,所述第二区域中具有多个任务结构体数据,所述任务结构体数据中包括用于执行对应的任务的任务信息,包括:在所述板卡的内存的第一区域确定待配置的第一头结构体数据,其中,所述板卡与所述服务器具有通信连接关系;在所述内存的第二区域配置第一任务对应的第一任务结构体数据,其中,所述第一任务结构体数据中包括用于执行所述第一任务的相关信息;在所述第一头结构体数据中写入所述第一任务结构体数据在所述内存的第二区域中对应的第一任务结构体地址,其中,所述第一头结构体数据用于表示第一推理任务的配置信息,所述第一推理任务包括所述第一任务。
在一个示例性的实施例中,在所述板卡的内存的第一区域确定待配置的第一头结构体数据之前,所述方法还包括:确定所述内存是否已执行初始化操作;在所述内存未执行初始化操作的情况下,通过以下方式对所述内存执行初始化操作:将所述内存划分为多个区域,其中,所述多个区域包括:第一区域、第二区域、第三区域、第四区域;在所述第一区域中初始化多个头结构体数据,以及在所述第二区域中初始化多个任务结构体数据,以及在所述第四区域中初始化内存分配链表,其中,所述内存分配链表用于存放所述第三区域中的内存空间的分配信息,所述第三区域用于进行数据存储。
在一个示例性的实施例中,所述在所述板卡的内存的第一区域确定待配置的第一头结构体数据,包括:从所述第一区域中的多个头结构体数据中确定第一属性的属性值为第四值的所述第一头结构体数据,其中,所述第四值用于指示头结构体数据未被使用。
在一个示例性的实施例中,在所述在所述板卡的内存的第一区域确定待配置的第一头结构体数据之后,所述方法还包括:将所述第一头结构体数据中第一属性的属性值修改为第五值,其中,所述第五值用于指示头结构体数据正在配置数据。
在一个示例性的实施例中,在所述在所述第一头结构体数据中写入所述第一任务结构体数据在所述内存的第二区域中对应的第一任务结构体地址之后,所述方法还包括:将所述第一头结构体数据中第一属性的属性值修改为第一值,其中,所述第一值用于指示头结构体数据对应的推理任务处于待执行状态。
在一个示例性的实施例中,所述板卡的内存还包括第三区域,所述第三区域用于进行数据存储,所述在所述内存的第二区域配置第一任务对应的第一任务结构体数据,包括:从所述多个任务结构体数据中确定未配置的参考任务结构体数据;配置所述参考任务结构体数据中的第二属性的属性值,并将所述第一任务的N个计算操作的N个操作相关信息设置在所述参考任务结构体数据的第一任务信息地址中,得到所述第一任务结构体数据,其中,所述第二属性的属性值用于指示所述第一任务对应的计算方式;其中,通过以下方式确定用于执行所述N个计算操作的第i个计算操作的第i个操作相关信息:在所述内存的第三区域为所述第i个计算操作的第i个输入数据申请内存空间,确定申请的内存空间的第i个输入数据地址;以及在所述内存的第三区域为所述第i个计算操作的第i个输出数据申请内存空间,确定申请的内存空间的第i个输出数据地址,其中,所述第i个操作相关信息包括:所述第i个输入数据地址和所述第i个输出数据地址。
在一个示例性的实施例中,所述内存还包括:第四区域,所述第四区域中存放内存分配链表,所述内存分配链表用于存放所述第三区域中的内存空间的分配信息,在所述在所述内存的第三区域为所述第i个计算操作的第i个输入数据申请内存空间,确定申请的内存空间的第i个输入数据地址,包括:在所述内存的第四区域中的内存分配链表中确定第一节点,并确定所述第i个输入数据地址为所述第一节点对应的内存空间起始地址;其中,所述第一节点对应的内存空间未使用,所述第一节点对应的内存空间的大小大于或等于所述第i个输入数据的大小,所述内存分配链表用于存放所述第三区域中的内存空间的分配信息。
在一个示例性的实施例中,在所述在所述第四区域中的内存分配链表中确定第一节点之后,所述方法还包括:在所述第一节点对应的内存空间的大小大于所述第i个输入数据的大小的情况下,在所述内存分配链表的第一节点和第二节点之间***目标节点;设置所述目标节点对应的内存空间状态为未使用状态;以及设置所述目标节点对应的内存空间起始地址为第一地址;以及设置所述目标节点对应的内存空间大于为第一大小;其中,所述第一地址为所述第一节点对应的内存空间起始地址在偏移所述第i个输入数据的大小以后的地址,所述第一大小为所述第二节点对应的内存空间起始地址减去所述目标节点对应的内存空间起始地址。
在一个示例性的实施例中,所述内存还包括:第三区域和第四区域,所述第三区域用于进行数据存储,所述第四区域中存放内存分配链表,所述内存分配链表用于存放所述第三区域中的内存空间的分配信息,所述方法还包括:在检测到在所述内存的第四区域中的内存分配链表中存在第三节点和第四节点的情况下,将所述内存分配链表中的第四节点删除,将所述第三节点与第五节点相连;将所述第三节点对应的内存空间大于更新为第二大小;其中,所述第三节点和所述第四节点对应的内存空间均未使用,所述第三节点、第四节点和第五节点依次相连,所述第四节点位于所述第三节点和所述第五节点之间,所述第二大小为所述第五节点对应的内存空间起始地址减去所述第三节点对应的内存空间起始地址,所述内存分配链表用于存放所述第三区域中的内存空间的分配信息,所述第三区域用于进行数据存储。
在一个示例性的实施例中,在所述在所述内存的第二区域配置第一任务对应的第一任务结构体数据之后,所述方法还包括:在所述第一推理任务还包括第二任务的情况下,在所述内存的第二区域配置第二任务对应的第二任务结构体数据,其中,所述第二任务结构体数据中包括用于执行所述第二任务的相关信息;将所述第二任务结构体数据的任务结构体地址写入所述第一任务结构体数据中。
根据本申请的又一个实施例,还提供了一种板卡,所述板卡的内存包括第一区域和第二区域,所述第一区域中具有多个头结构体数据,所述头结构体数据用于表示推理任务的配置信息,所述第二区域中具有多个任务结构体数据,所述任务结构体数据中包括用于执行对应的任务的任务信息,包括:第一获取模块,用于从所述第一区域中的多个头结构体数据中获取第一头结构体数据,其中,所述第一头结构体数据中的第一属性的属性值为第一值,其中,所述第一值用于指示头结构体数据对应的推理任务处于待执行状态;第二获取模块,用于从所述第一头结构体数据中获取第一任务结构体地址,并根据所述第一任务结构体地址从所述内存的第二区域中获取第一任务结构体数据,其中,所述第一任务结构体数据中包括用于执行所述第一任务结构体数据对应的第一任务的相关信息;执行模块,用于根据所述第一任务结构体数据执行所述第一任务,其中,所述第一头结构体数据对应的第一推理任务包括所述第一任务。
根据本申请的又一个实施例,还提供了一种服务器,所述服务器与板卡具有通信连接关系,所述板卡的内存包括第一区域和第二区域,所述第一区域中具有多个头结构体数据,所述头结构体数据用于表示推理任务的配置信息,所述第二区域中具有多个任务结构体数据,所述任务结构体数据中包括用于执行对应的任务的任务信息,包括:确定模块,用于在所述板卡的内存的第一区域确定待配置的第一头结构体数据;第一配置模块,用于在所述内存的第二区域配置第一任务对应的第一任务结构体数据,其中,所述第一任务结构体数据中包括用于执行所述第一任务的相关信息;第二配置模块,用于在所述第一头结构体数据中写入所述第一任务结构体数据在所述内存的第二区域中对应的第一任务结构体地址,其中,所述第一头结构体数据用于表示第一推理任务的配置信息,所述第一推理任务包括所述第一任务。
根据本申请的又一个实施例,还提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
根据本申请的又一个实施例,还提供了一种电子设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上述任一项方法实施例中的步骤。
通过本申请,板卡的内存的第一区域中具有多个头结构体数据,每一个头结构体数据对应一个推理任务,进而可以使得板卡支持多用户操作(例如在同一时间一个用户在对板卡进行数据传输,另一个用户在使用板卡进行任务推理),进而解决了未安装操作***的加速卡无法支持多用户操作的问题,提高了板卡资源的利用率。
具体实施方式
下文中将参考附图并结合实施例来详细说明本申请的实施例。
需要说明的是,本申请的说明书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
本申请实施例中所提供的任务配置方法实施例可以在服务器设备或者类似的运算装置中执行。以运行在服务器设备上为例,图1是本申请实施例的一种任务配置方法的服务器设备的硬件结构框图。如图1所示,服务器设备可以包括一个或多个(图1中仅示出一个)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)和用于存储数据的存储器104,其中,上述服务器设备还可以包括用于通信功能的传输设备106以及输入输出设备108。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述服务器设备的结构造成限定。例如,服务器设备还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本申请实施例中的任务配置方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至服务器设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输设备106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括服务器设备的通信供应方提供的无线网络。在一个实例中,传输设备106包括一个网络适配器(Network Interface Controller,简称为NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输设备106可以为射频(Radio Frequency,简称为RF)模块,其用于通过无线方式与互联网进行通讯。
在本实施例中提供了一种任务执行方法,应用于板卡(板卡包括但不限于加速卡)。需要说明的是,所述板卡的内存包括第一区域和第二区域,所述第一区域中具有多个头结构体数据,所述头结构体数据用于表示推理任务的配置信息,所述第二区域中具有多个任务结构体数据,所述任务结构体数据中包括用于执行对应的任务的任务信息。
可选的,内存的第一区域为图2所示的Memory Header区域,Header区域存放的是用户推理任务的配置信息,每一个推理任务对应一个memory_header结构体数据,Header区域可供多个用户同时设置多个推理任务。
可选的,每一个头结构体数据对应的头结构体的结构如下所示:struct memory_header{uint32_t handle;uint32_t status;uint32_t task_addr;uint32_t task_size;}。
其中,handle:使用该结构体的用户的序号,该值从0开始,后面结构体中该值依次累加。
status(即下文第一属性):该结构体对应用户或任务当前的任务状态,状态包含如下所示:struct task_status{TASK_STATUS_IDLE,TASK_STATUS_SETTING,TASK_STATUS_READY,TASK_STATUS_WAITING,TASK_STATUS_DOING,ASK_STATUS_DONE}。
其中,TASK_STATUS_IDLE:任务空闲,该结构体还没有被使用。
TASK_STATUS_SETTING:用户已经拿到这个结构体并在更新设置数据。
TASK_STATUS_READY:用户已经准备好当前任务的数据和配置信息,但还没下发执行在命令。
TASK_STATUS_WAITING(即下文第一值):用户数据已经准备好等待加速卡进行推理操作,并下发执行操作命令,此时等待加速卡执行该任务。
TASK_STATUS_DOING:加速卡正在执行该任务。
TASK_STATUS_DONE:加速卡已经执行完该推理任务。
需要说明的是,状态流程为:IDLE->SETTING->READY/WAITING -> DONING->DONE。
task_addr:任务结构体数据对应的任务结构体地址。
task_size:表示该 memory_header与多少个任务结构体数据相关联。
可选的,内存的第二区域为图2所示的TASK区域。TASK区域存放模型计算任务task。每个task信息通过一个结构体数据类型表示,具体数据内容如下:struct memory_task{uint32_t status;uint32_t dev_type;uint32_t num_address;uint64_t address_list;uint64_t next;}。
其中,status: 用于表示当前task结构体是否已占用。
dev_type:计算任务使用加速卡的深度学习加速器(Deep LearningAccelerator,简称为DLA)进行计算还是加速卡的CPU 精简指令集计算机(ReducedInstruction Set Computing,简称为RISCV)进行计算,该值0对应DLA计算,1对应RISCV计算。
需要说明的是,DLA是一种板卡端用于网络模型算法计算的硬件加速单元,可以比CPU更高效的完成算子计算,实现计算加速;RISCV是一种板卡端的CPU,类比于服务器端的CPU,完成程序的执行,同样也可以进行网络模型的算法计算,但计算性能比DLA专用的加速单元差,DLA不支持的算法计算会在RISCV上面执行计算操作。
num_address:描述该task包含的address_list个数,一个task子任务可能包含多个计算操作。每个计算操作对应一个address_list。
address_list:描述该task所需要的内存起始地址和大小信息的链表起始地址,如果有多个计算操作,address_list链表会包含多个节点。可选的,address_list如图6所示。
next:描述下一个tasks地址。
可选的,图3是根据本申请实施例的一种任务执行方法的流程图,如图3所示,该流程包括如下步骤S302-S306。
步骤S302:从所述第一区域中的多个头结构体数据中获取第一头结构体数据,其中,所述第一头结构体数据中的第一属性的属性值为第一值,其中,所述第一值用于指示头结构体数据对应的推理任务处于待执行状态。
在一个示例性的实施例中,在上述步骤S302之前,所述方法还包括:在所述多个头结构体数据中具有多个目标头结构体数据的情况下,确定所述第一头结构体数据为所述多个目标头结构体数据中序号最小的头结构体数据,其中,所述目标头结构体数据中的所述第一属性的属性值为所述第一值。
需要说明的是,上述序号即为上述handle。可选的,头结构体数据中的序号最小,则表明该头结构体数据为最早配置好的数据。
在一个示例性的实施例中,在上述步骤S302之前,所述方法还包括:在所述多个头结构体数据中具有多个目标头结构体数据的情况下,确定所述第一头结构体数据为所述多个目标头结构体数据中配置时间距离当前最远的头结构体数据,其中,所述目标头结构体数据中的所述第一属性的属性值为所述第一值。
也就是说,板卡会从最早配置好的推理任务开始进行计算。
步骤S304:从所述第一头结构体数据中获取第一任务结构体地址,并根据所述第一任务结构体地址从所述内存的第二区域中获取第一任务结构体数据,其中,所述第一任务结构体数据中包括用于执行所述第一任务结构体数据对应的第一任务的相关信息。
步骤S306:根据所述第一任务结构体数据执行所述第一任务,其中,所述第一头结构体数据对应的第一推理任务包括所述第一任务。
上述步骤,板卡的内存的第一区域中具有多个头结构体数据,每一个头结构体数据对应一个推理任务,进而可以使得板卡支持多用户操作(例如在同一时间一个用户在对板卡进行数据传输,另一个用户在使用板卡进行任务推理),进而解决了未安装操作***的加速卡无法支持多用户操作的问题,提高了板卡资源的利用率。
在一个示例性的实施例中,所述内存还包括第三区域,所述第三区域用于进行数据存储,上述步骤S306包括步骤S11-S12。
步骤S11:从所述第一任务结构体数据中获取第一任务信息地址。
需要说明的是,可以从第一任务结构体数据中获取address_list字段的属性值,得到第一任务结构体数据。
步骤S12:在所述第一任务结构体数据用于指示执行N个计算操作的情况下,通过以下步骤S121-S123执行第i个计算操作、以执行所述第一任务中的所述N个计算操作,其中,i为大于等于1、小于等于N的正整数。
可选的,可以根据第一任务结构体数据中num_address字段的属性值确定第一任务结构体数据用于指示执行多少个计算操作。
步骤S121:根据所述第一任务信息地址确定所述第i个计算操作对应的第i个数据输入地址和第i个数据输出地址。
步骤S122:根据所述第i个数据输入地址从所述内存的第三区域中获取第i个输入数据,并根据所述第i个输入数据进行计算,得到第i个计算结果。
需要说明的是,内存的第三区域即为图2所示的DATA区域,该区域存放模型数据和输入输出等数据,内存空间按大小动态分配,其中内存分配情况在memory list中维护。
在一个示例性的实施例中,根据所述第i个输入数据进行计算,得到第i个计算结果,包括:从所述第一任务结构体数据中获取第二属性的属性值,其中,所述第二属性的属性值用于指示所述第一任务对应的计算方式:在所述第二属性的属性值为第一预设值的情况下,使用深度学习加速器DLA对所述第i个输入数据进行计算,得到第i个计算结果;在所述第二属性的属性值为第二预设值的情况下,使用精简指令集计算机RISCV对所述第i个输入数据进行计算,得到第i个计算结果。
需要说明的是,第二属性即为上述dev_type,第一预设值等于0,第二预设值等于1。
步骤S123:根据所述第i个数据输出地址在所述内存的第三区域存储所述第i个计算结果。
在一个示例性的实施例中,在上述步骤S306之后,所述方法还包括步骤S21-S22:步骤S21:在所述第一任务结构体数据中存在第二任务结构体地址的情况下,根据所述第二任务结构体地址从所述内存的第二区域中获取第二任务结构体数据,其中,所述第二任务结构体数据中包括用于执行所述第二任务结构体数据对应的第二任务的相关信息;步骤S22:根据所述第二任务结构体数据执行所述第二任务,其中,所述第一推理任务包括所述第二任务。
需要说明的是,推理任务中的多个任务是环环相连的,每个memory_task结构体对应一个推理子任务,各个子任务memory_task结构体通过next想关联,板卡拿到首个memory_task结构体后通过next可获取全部task。进而完成一个推理任务。
在一个示例性的实施例中,在上述步骤S306之后,所述方法还包括步骤S31-S33。
步骤S31:在所述第一任务结构体数据中不存在第二任务结构体地址的情况下,确定所述第一区域中的多个头结构体数据中是否存在第二头结构体数据,其中,第二头结构体数据中的所述第一属性的属性值为所述第一值。
步骤S32:在所述第一区域中的多个头结构体数据中存在所述第二头结构体数据的情况下,从所述第二头结构体数据中获取第三任务结构体地址,并根据所述第三任务结构体地址从所述内存的第二区域中获取第三任务结构体数据,其中,所述第三任务结构体数据中包括用于执行所述第三任务结构体数据对应的第三任务的相关信息。
步骤S33:根据所述第三任务结构体数据执行所述第三任务,其中,所述第二头结构体数据对应的第二推理任务包括所述第三任务。
也就是说,在板卡执行完第一头结构体数据对应的第一推理任务以后,就接着在内存的第一区域去寻找第二头结构体数据,进而执行第二头结构体数据对应的第二推理任务。
在一个示例性的实施例中,在所述从所述第一区域中的多个头结构体数据中获取第一头结构体数据之后,方法还包括:从所述第一头结构体数据中获取第一任务结构体地址之前,将所述第一头结构体数据中的所述第一属性的属性值修改为第二值,其中,所述第二值用于指示所述第一头结构体数据对应的第一推理任务处于执行状态。
需要说明的是,上述第二值为TASK_STATUS_DOING。即板卡拿到第一头结构体数据后,会将第一头结构体数据中的status字段的值设置为DOING,进而开始推理操作。
在一个示例性的实施例中,所述方法还包括:在根据所述第一头结构体数据完成所述第一推理任务的情况下,将所述第一头结构体数据中的所述第一属性的属性值修改为第三值,其中,所述第三值用于指示所述第一头结构体数据对应的第一推理任务处于已完成状态。
需要说明的是,上述第三值为TASK_STATUS_DONE。即板卡在执行完第一头结构体数据对应的第一推理任务之后,会将第一头结构体数据中的status字段的值设置为DONE,并通过硬件信号反馈到服务器端用户进程中,用户获取到该信号开始接收推理任务的结果并继续后续流程。
可选的,服务器在从板卡的内存中获取第一推理任务的计算结果的情况下,会将第一头结构体数据中status字段的值修改为TASK_STATUS_IDLE,进而该结构体数据可以再次被其他用户配置。
在本实施例中提供了一种任务配置方法,应用于服务器,其中,板卡与服务器具有通信连接关系,图4是根据本申请实施例一种任务配置方法的流程图,如图4所示,该流程包括如下步骤S402-S406。
步骤S402在所述板卡的内存的第一区域确定待配置的第一头结构体数据。
在一个示例性的实施例中,上述步骤S402包括:从所述第一区域中的多个头结构体数据中确定第一属性的属性值为第四值的所述第一头结构体数据,其中,所述第四值用于指示头结构体数据未被使用。
需要说明的是,上述第四值为TASK_STATUS_IDLE,如果一个头结构体数据中status字段的值为TASK_STATUS_IDLE,则表明该头结构体数据未被使用,进而可以对该头结构体数据进行配置。
在一个示例性的实施例中,在上述步骤S402之后,所述方法还包括:将所述第一头结构体数据中第一属性的属性值修改为第五值,其中,所述第五值用于指示头结构体数据正在配置数据。
需要说明的是,上述第五值为TASK_STATUS_SETTING。进而通过这种方式,可以避免一个头结构体数据同时被多个用户进行配置。
步骤S404:在所述内存的第二区域配置第一任务对应的第一任务结构体数据,其中,所述第一任务结构体数据中包括用于执行所述第一任务的相关信息。
在一个示例性的实施例中,在上述步骤S404之后,所述方法还包括:在所述第一推理任务还包括第二任务的情况下,在所述内存的第二区域配置第二任务对应的第二任务结构体数据,其中,所述第二任务结构体数据中包括用于执行所述第二任务的相关信息;将所述第二任务结构体数据的任务结构体地址写入所述第一任务结构体数据中。
需要说明的是,通过这种方式,可以根据第一任务结构体数据找到第二任务结构体数据。
步骤S406:在所述第一头结构体数据中写入所述第一任务结构体数据在所述内存的第二区域中对应的第一任务结构体地址,其中,所述第一头结构体数据用于表示第一推理任务的配置信息,所述第一推理任务包括所述第一任务。
在一个示例性的实施例中,在上述步骤S406之后,所述方法还包括:将所述第一头结构体数据中第一属性的属性值修改为第一值,其中,所述第一值用于指示头结构体数据对应的推理任务处于待执行状态。
上述步骤,板卡的内存的第一区域中具有多个头结构体数据,每一个头结构体数据对应一个推理任务,进而可以使得板卡支持多用户操作(例如在同一时间一个用户在对板卡进行数据传输,另一个用户在使用板卡进行任务推理),进而解决了未安装操作***的加速卡无法支持多用户操作的问题,提高了板卡资源的利用率。
在一个示例性的实施例中,上述步骤S402之前,所述方法还包括步骤S41-S42。
步骤S41:确定所述内存是否已执行初始化操作。
步骤S42:在所述内存未执行初始化操作的情况下,通过以下步骤S421-S422对所述内存执行初始化操作。
步骤S421:将所述内存划分为多个区域,其中,所述多个区域包括:第一区域、第二区域、第三区域、第四区域。
步骤S422:在所述第一区域中初始化多个头结构体数据,以及在所述第二区域中初始化多个任务结构体数据,以及在所述第四区域中初始化内存分配链表,其中,所述内存分配链表用于存放所述第三区域中的内存空间的分配信息,所述第三区域用于进行数据存储。
需要说明的是,第四区域为图2所示的Memory List区域,用于存放内存分配信息,分配的内存空间为DATA区间。内存分配信息通过一个双向链表(即上述内存分配链表)来维护,该链表节点的数据内容如下所示:struct memory_list{uint32_t index;uint32_tstatus;uint64_t start_address;uint64_t end_address;uint32_t size;uint32_tnext_index;uint32_t pre_index;}。
其中,index:该链表节点的序号。
status:该链表节点对应的内存使用情况(使用used、未使用free)。
start_address:该链表节点对应的内存空间起始地址。
end_address:内存结束地址。
size:内存大小。
next_index:该链表节点下一个链表节点。
pre_index:该链表节点上一个链表节点。
在一个示例性的实施例中,在所述内存的第二区域配置第一任务对应的第一任务结构体数据,可以通过以下步骤S51-S52实现。
步骤S51:从所述多个任务结构体数据中确定未配置的参考任务结构体数据。
步骤S52:配置所述参考任务结构体数据中的第二属性的属性值,并将所述第一任务的N个计算操作的N个操作相关信息设置在所述参考任务结构体数据的第一任务信息地址中,得到所述第一任务结构体数据,其中,所述第二属性的属性值用于指示所述第一任务对应的计算方式。
其中,通过以下步骤S521-S522确定用于执行所述N个计算操作的第i个计算操作的第i个操作相关信息。
步骤S521:在所述内存的第三区域为所述第i个计算操作的第i个输入数据申请内存空间,确定申请的内存空间的第i个输入数据地址。
需要说明的是,在确定第i个输入数据地址之后,需要第i个输入数据地址将第i个计算操作的第i个输入数据写入至所述内存的第三区域中。
步骤S522:在所述内存的第三区域为所述第i个计算操作的第i个输出数据申请内存空间,确定申请的内存空间的第i个输出数据地址,所述第i个操作相关信息包括:所述第i个输入数据地址和所述第i个输出数据地址。
需要说明的是,上述步骤S521与上述步骤S522是异步执行的,其不存在执行的先后顺序。
在一个示例性的实施例中,上述步骤S521可以通过以下方式实现:在所述第四区域中的内存分配链表中确定第一节点,并确定所述第i个输入数据地址为所述第一节点对应的内存空间起始地址;其中,所述第一节点对应的内存空间未使用,所述第一节点对应的内存空间的大小大于或等于所述第i个输入数据的大小。
也就是说,在用户需要申请内存时,会遍历内存分配链表,找到free且size不小于申请内存size的节点,将该节点的start_address内存地址信息返回给用户使用。
可选的,上述步骤S522的具体实现方法与上述步骤S521相同,本申请在此不进行赘述。
在一个示例性的实施例中,在所述在所述第四区域中的内存分配链表中确定第一节点之后,所述方法还包括:在所述第一节点对应的内存空间的大小大于所述第i个输入数据的大小的情况下,在所述内存分配链表的第一节点和第二节点之间***目标节点;设置所述目标节点对应的内存空间状态为未使用状态;以及设置所述目标节点对应的内存空间起始地址为第一地址;以及设置所述目标节点对应的内存空间大于为第一大小;其中,所述第一地址为所述第一节点对应的内存空间起始地址在偏移所述第i个输入数据的大小以后的地址,所述第一大小为所述第二节点对应的内存空间起始地址减去所述目标节点对应的内存空间起始地址。
也就是说,第一节点对应内存的size大于申请的内存size,那么会将该节点更新为申请的内存size,并在该节点后***一个新节点存放该节点剩余size的内存数据信息。
在一个示例性的实施例中,所述方法还包括:在检测到在所述内存的第四区域中的内存分配链表中存在第三节点和第四节点的情况下,将所述内存分配链表中的第四节点删除,将所述第三节点与第五节点相连;将所述第三节点对应的内存空间大于更新为第二大小;其中,所述第三节点和所述第四节点对应的内存空间均未使用,所述第三节点、第四节点和第五节点依次相连,所述第四节点位于所述第三节点和所述第五节点之间,所述第二大小为所述第五节点对应的内存空间起始地址减去所述第三节点对应的内存空间起始地址。
也就是说,在服务器进行板卡的内存的释放时,判断该内存节点的前后节点是否有free状态的节点,如果有free状态的节点,那么该节点与free状态节点合并为一个(更新前节点信息并删除后面这个节点),如果前后不是free状态,那么该节点状态status更新为未使用free状态,供后面内存申请使用。
显然,上述所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。为了更好的理解上述方法,以下结合实施例对上述过程进行说明,但不用于限定本发明实施例的技术方案,具体地:为 了更好的理解相关技术中不具备操作***的加速卡中的内存格式,以下进行具体说明。
相关技术中板卡端的存储格式如图5所示。
(1)DLA数据区。
存放描述整个推理过程中各个计算任务task的数据信息,计算任务task为加速卡一次操作的最小单位,每个计算任务包含的数据信息格式如图6所示。
图6中最后面的addr_list是一个链表数据,里面存放的是前面N个m_memory的存放地址,通过addr_list可以依次得到N个m_memory的数据。m_memory存放的是一个计算任务的子任务所需数据的地址信息。
计算任务task是加速卡一次调度处理的最小单位,其子任务对应这个task包含的算子信息,算子信息包含算子的类型以及输入输出内存地址。加速卡首先拿到一个task任务,然后解析该task任务里面的各个算子信息,通过加速卡内部的计算单元依次执行算子计算:从输入内存地址指向的内存处拿到输入数据,通过算子类型信息确定使用哪个硬件计算单元进行计算,然后将计算结果存放在输出内存地址指向的内存空间中,算子类型信息以及输入地址和输出地址都在m_memory中配置。
(2)TASK数据区。
存放整个推理操作多个计算任务task的信息,即每个计算任务task的addr_list的地址,加速卡进行推理操作时,会先从该TASK数据区依次获取各个计算任务task的addr_list地址,然后去该地址拿到addr_list数据,之后通过addr_list数据拿到每个子计算任务task的中的算子的数据,拿到这个数据后加速卡就可以开始进行加速计算。
以上操作依次执行直到最后一个task的最后一个算子计算完成为止,最后一个算子的输出结果即整个推理操作的结算结果。
(3)COMPILER数据区。
DLA数据区里面的m_memory存放的是各个算子的输入输出数据地址,该地址指向的内存空间即COMPILER数据区里面,这里存放的是每个算子计算使用的数据。
图7描述的是上面所述的内存访问的流程示意图,加速卡进行推理操作时先从TASK数据区得到task信息,该task信息指向DLA数据区的address list,address list指向memory,memory指向COMPILER数据区的输入输出数据地址,COMPILER存放所有算子的输入和输出数据。其中,DLA数据区包含的RISCV和DLA address list,其中DLA address list表示的内容使用加速卡加速单元进行计算,而RISCV执行加速卡加速单元不支持的计算任务。
但此种方式只能支持操作顺序进行,不能多用户同时操作,导致板卡资源得不到充分利用 。
针对相关技术的缺点,本申请提供一种服务于加速卡多用户内存管理方案,以便板卡能够同时响应多个用户任务,以解决上述相关技术中存在的问题,为了充分利用板卡内存资源,本申请重新定义了一种内存格式,具体如图3所示,图3中相关存储区域的介绍已在上文进行详细描述,本申请在此不进行赘述。
需要说明的是,通过以上各个区间的数据格式,用户可以在各个区间中获取空闲的内存空间存放对应的数据,然后通过各个空间里面的链表或结构体中的信息完成不同区间数据的关联。各个区间里面的链表或结构体数据的初始值在首次使用该内存前进行初始化。本申请在用户执行操作前会先判断是否是首次执行,如果是那么调用初始化流程,如果非首次那么直接进行推理操作任务。
需要说明的是,本申请所述的内存位于板卡端,用户的操作在服务器端,对于上面内存空间数据的遍历查找更新操作,一种方式是服务器端同步保存一份链表及结构体数据内容,与板卡端一致,每次读写数据时只更新对应区间的数据,以实现数据信息的更新。此外,还可以将板卡端与服务器端内存通过DMA方式直接映射,即板卡端内存在服务器端可直接访问,所以在服务器端直接读写此内存即可。
为了更好的理解,以下结合具体实施例进行说明:本申请通过提供一种内存管理格式和使用方法用于支持多用户同时读写数据,以支持多用户并行操作,以lenet网络模型为例,其处理流程如下所述。
1、用户首先判断是否是首次执行。
因服务器端为Linux***,这里直接使用Linux***支持的文件锁方法来判断,即判断首次执行时是否可获取该文件锁,如果是第一次操作那么该文件锁可获取,那么此时用户给该文件加锁以使后续再次获取该文件锁时不能获取,同时初始化各内存区间的数据。
如果非首次操作,因不能拿到文件锁,进而可知不是首次操作,即不需要进行内存初始化。
2、用户在Memory Header区间存放用户(任务)信息。
首先遍历Header区间找到status=TASK_STATUS_IDLE空闲状态的结构体,Header区间大小为4Kbytes,每个结构体大小为36bytes,即该区间可同时存放4*1024/36=113个该结构体,即支持113个用户任务同时下发,受限于板卡端整个内存大小的限制,实际支持的任务数量会小于此处支持的最大数量。
因在初始化时每个结构体按照顺序已经将handle依次赋值,从0开始递增赋值,这里只更新status为TASK_STATUS_SETTING设置状态。结构体其他成员在后面操作拿到对应数据地址时再更新。
3、用户在Memory TASK区间存放任务的多个task信息。
首先遍历TASK区间找到status = free状态的结构体,之后将第一个task存入该处,同时更新Header区间里面的task_addr信息,用于指向该处地址。
本申请所使用的lenet网络共有4个task信息,继续遍历TASK区间,找到下一个status=free的结构体,存入第二个task数据,并将该地址存放早前一个task的next处,以便通过前一个能找到这个结构体数据。同理直到找到第4个status=free的结构体存入task数据,并将该结构体的next设置为null,即这个结构体是最后一个task。
4、用户在memory List区间存放动态申请内存信息。
每个task里面的具体数据需要申请内存存放,这里通过搜索Memory List链表查找符合要求的内存空间,找到后将模型数据存放在链表所指向的DATA区间的内存中,并更新该链表节点。
Lenet网络需要大概几十个内存空间,通过遍历搜索合适的内存完成每块数据的存放和链表更新。针对模型的每个task,在完成一个task内全部模型数据的内存分配和存储后,会将内存的地址存放在address_list中。数据解析时会从Task区间中拿到task,然后在task中拿到address_list,通过address_list拿到具体的各个数据地址,进而拿到模型数据进行操作。
需要说明的是,用户推理任务按照如上操作在各个区间中根据分配的内存空间存放各个数据后,下发推理操作命令,此时板卡端开始解析上面数据进行推理操作,板卡端解析数据流程如下1-6所示。
1、板卡端程序首先从Header区间中遍历各个结构体数据,每个结构体数据对应一个推理任务。
2、拿到Header中结构体数据后,将结构体数据中的status设置为DOING,即板卡端开始推理操作。
3、根据结构体中task_addr去TASK区间拿到指定的memory_task结构体,每个memory_task结构体对应一个推理子任务,各个子任务memory_task结构体通过next相关联,板卡端程序拿到首个memory_task结构体后通过next可获取全部task。
4、根据memory_task结构体中的address_list可拿到该task推理子任务的全部数据存放地址等信息,根据这些地址信息可拿到DATA区间里面的实际数据,这些数据即推理任务计算所使用的数据,板卡端完成这些数据的计算并将计算结果存放在输出的内存中,输出的内存空间同样在address_list中指定好,该内存同样由用户在申请内存时申请。
5、经过上面流程操作直到最后一个task处理完成,一次完整的推理任务完成之后板卡端程序再从Memory Header中解析下一个结构体数据,重复上面操作直到Header中全部数据处理完成。
6、每个memory_header中的任务处理完成后,将Header中memory_header结构体中status设置为DONE,并通过硬件信号反馈到服务器端用户进程中,用户获取到该信号开始接收推理任务的结果并继续后续流程。需要说明的是,用户执行完操作后如果不需要此次任务的数据,则需要释放其申请的各个区间的内存。
综上所述,多个用户可以将多个任务并行下发到板卡端,只要板卡端还有内存空间用户就可以继续下发任务。板卡端依次解析各个任务的数据并执行任务直到所有任务完成。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。
在本实施例中还提供了一种板卡和服务器,用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的模块较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图8是根据本申请实施例的一种板卡的结构框图,如图8所示,该板卡的内存包括第一区域和第二区域,所述第一区域中具有多个头结构体数据,所述头结构体数据用于表示推理任务的配置信息,所述第二区域中具有多个任务结构体数据,所述任务结构体数据中包括用于执行对应的任务的任务信息,该板卡包括:第一获取模块82,用于从所述第一区域中的多个头结构体数据中获取第一头结构体数据,其中,所述第一头结构体数据中的第一属性的属性值为第一值,其中,所述第一值用于指示头结构体数据对应的推理任务处于待执行状态;第二获取模块84,用于从所述第一头结构体数据中获取第一任务结构体地址,并根据所述第一任务结构体地址从所述内存的第二区域中获取第一任务结构体数据,其中,所述第一任务结构体数据中包括用于执行所述第一任务结构体数据对应的第一任务的相关信息;执行模块86,用于根据所述第一任务结构体数据执行所述第一任务,其中,所述第一头结构体数据对应的第一推理任务包括所述第一任务。
需要说明的是,板卡的内存的第一区域中具有多个头结构体数据,每一个头结构体数据对应一个推理任务,进而可以使得板卡支持多用户操作(例如在同一时间一个用户在对板卡进行数据传输,另一个用户在使用板卡进行任务推理),进而解决了未安装操作***的加速卡无法支持多用户操作的问题,提高了板卡资源的利用率。
在一个示例性的实施例中,所述内存还包括第三区域,所述第三区域用于进行数据存储,执行模块86,还用于从所述第一任务结构体数据中获取第一任务信息地址;在所述第一任务结构体数据用于指示执行N个计算操作的情况下,通过以下方式执行第i个计算操作、以执行所述第一任务中的所述N个计算操作,其中,i为大于等于1、小于等于N的正整数:根据所述第一任务信息地址确定所述第i个计算操作对应的第i个数据输入地址和第i个数据输出地址;根据所述第i个数据输入地址从所述内存的第三区域中获取第i个输入数据,并根据所述第i个输入数据进行计算,得到第i个计算结果;根据所述第i个数据输出地址在所述内存的第三区域存储所述第i个计算结果。
在一个示例性的实施例中,执行模块86,还用于从所述第一任务结构体数据中获取第二属性的属性值,其中,所述第二属性的属性值用于指示所述第一任务对应的计算方式:在所述第二属性的属性值为第一预设值的情况下,使用深度学习加速器DLA对所述第i个输入数据进行计算,得到第i个计算结果;在所述第二属性的属性值为第二预设值的情况下,使用精简指令集计算机RISCV对所述第i个输入数据进行计算,得到第i个计算结果。
在一个示例性的实施例中,所述板卡,还包括:第一处理模块,用于在所述根据所述第一任务结构体数据执行所述第一任务之后,在所述第一任务结构体数据中存在第二任务结构体地址的情况下,根据所述第二任务结构体地址从所述内存的第二区域中获取第二任务结构体数据,其中,所述第二任务结构体数据中包括用于执行所述第二任务结构体数据对应的第二任务的相关信息;根据所述第二任务结构体数据执行所述第二任务,其中,所述第一推理任务包括所述第二任务。
在一个示例性的实施例中,所述板卡,还包括:第二处理模块,用于在所述根据所述第一任务结构体数据执行所述第一任务之后,在所述第一任务结构体数据中不存在第二任务结构体地址的情况下,确定所述第一区域中的多个头结构体数据中是否存在第二头结构体数据,其中,第二头结构体数据中的所述第一属性的属性值为所述第一值;在所述第一区域中的多个头结构体数据中存在所述第二头结构体数据的情况下,从所述第二头结构体数据中获取第三任务结构体地址,并根据所述第三任务结构体地址从所述内存的第二区域中获取第三任务结构体数据,其中,所述第三任务结构体数据中包括用于执行所述第三任务结构体数据对应的第三任务的相关信息;根据所述第三任务结构体数据执行所述第三任务,其中,所述第二头结构体数据对应的第二推理任务包括所述第三任务。
在一个示例性的实施例中,所述板卡,还包括:第一修改模块,用于在所述从所述第一区域中的多个头结构体数据中获取第一头结构体数据之后,从所述第一头结构体数据中获取第一任务结构体地址之前,将所述第一头结构体数据中的所述第一属性的属性值修改为第二值,其中,所述第二值用于指示所述第一头结构体数据对应的第一推理任务处于执行状态。
在一个示例性的实施例中,第一修改模块,还用于在根据所述第一头结构体数据完成所述第一推理任务的情况下,将所述第一头结构体数据中的所述第一属性的属性值修改为第三值,其中,所述第三值用于指示所述第一头结构体数据对应的第一推理任务处于已完成状态。
在一个示例性的实施例中,第一获取模块82,还用于在所述从所述第一区域中的多个头结构体数据中获取第一头结构体数据之前,在所述多个头结构体数据中具有多个目标头结构体数据的情况下,确定所述第一头结构体数据为所述多个目标头结构体数据中序号最小的头结构体数据,其中,所述目标头结构体数据中的所述第一属性的属性值为所述第一值。
在一个示例性的实施例中,第一获取模块82,还用于在所述从所述第一区域中的多个头结构体数据中获取第一头结构体数据之前,在所述多个头结构体数据中具有多个目标头结构体数据的情况下,确定所述第一头结构体数据为所述多个目标头结构体数据中配置时间距离当前最远的头结构体数据,其中,所述目标头结构体数据中的所述第一属性的属性值为所述第一值。
图9是根据本申请实施例的一种服务器的结构框图,如图9所示,该服务器包括:确定模块92,用于在所述板卡的内存的第一区域确定待配置的第一头结构体数据,其中,所述板卡与所述服务器具有通信连接关系;第一配置模块94,用于在所述内存的第二区域配置第一任务对应的第一任务结构体数据,其中,所述第一任务结构体数据中包括用于执行所述第一任务的相关信息;第二配置模块96,用于在所述第一头结构体数据中写入所述第一任务结构体数据在所述内存的第二区域中对应的第一任务结构体地址,其中,所述第一头结构体数据用于表示第一推理任务的配置信息,所述第一推理任务包括所述第一任务。
需要说明的是,由于板卡的内存的第一区域中具有多个头结构体数据,每一个头结构体数据对应一个推理任务,进而可以使得板卡支持多用户操作(例如在同一时间一个用户在对板卡进行数据传输,另一个用户在使用板卡进行任务推理),进而解决了未安装操作***的加速卡无法支持多用户操作的问题,提高了板卡资源的利用率。
在一个示例性的实施例中,所述服务器还包括:初始化模块,用于在所述板卡的内存的第一区域确定待配置的第一头结构体数据之前,确定所述内存是否已执行初始化操作;在所述内存未执行初始化操作的情况下,通过以下方式对所述内存执行初始化操作:将所述内存划分为多个区域,其中,所述多个区域包括:第一区域、第二区域、第三区域、第四区域;在所述第一区域中初始化多个头结构体数据,以及在所述第二区域中初始化多个任务结构体数据,以及在所述第四区域中初始化内存分配链表,其中,所述内存分配链表用于存放所述第三区域中的内存空间的分配信息,所述第三区域用于进行数据存储。
在一个示例性的实施例中,确定模块92,还用于从所述第一区域中的多个头结构体数据中确定第一属性的属性值为第四值的所述第一头结构体数据,其中,所述第四值用于指示头结构体数据未被使用。
在一个示例性的实施例中,所述服务器还包括:第二修改模块,用于在所述板卡的内存的第一区域确定待配置的第一头结构体数据之后,将所述第一头结构体数据中第一属性的属性值修改为第五值,其中,所述第五值用于指示头结构体数据正在配置数据。
在一个示例性的实施例中,第二修改模块,还用于在所述在所述第一头结构体数据中写入所述第一任务结构体数据在所述内存的第二区域中对应的第一任务结构体地址之后:将所述第一头结构体数据中第一属性的属性值修改为第一值,其中,所述第一值用于指示头结构体数据对应的推理任务处于待执行状态。
在一个示例性的实施例中,第一配置模块94,还用于从所述多个任务结构体数据中确定未配置的参考任务结构体数据;配置所述参考任务结构体数据中的第二属性的属性值,并将所述第一任务的N个计算操作的N个操作相关信息设置在所述参考任务结构体数据的第一任务信息地址中,得到所述第一任务结构体数据,其中,所述第二属性的属性值用于指示所述第一任务对应的计算方式;其中,通过以下方式确定用于执行所述N个计算操作的第i个计算操作的第i个操作相关信息:在所述内存的第三区域为所述第i个计算操作的第i个输入数据申请内存空间,确定申请的内存空间的第i个输入数据地址;以及在所述内存的第三区域为所述第i个计算操作的第i个输出数据申请内存空间,确定申请的内存空间的第i个输出数据地址,其中,所述第i个操作相关信息包括:所述第i个输入数据地址和所述第i个输出数据地址。
在一个示例性的实施例中,所述内存还包括:第四区域,所述第四区域中存放内存分配链表,所述内存分配链表用于存放所述第三区域中的内存空间的分配信息,第一配置模块94,还用于在所述内存的第四区域中的内存分配链表中确定第一节点,并确定所述第i个输入数据地址为所述第一节点对应的内存空间起始地址;其中,所述第一节点对应的内存空间未使用,所述第一节点对应的内存空间的大小大于或等于所述第i个输入数据的大小。
在一个示例性的实施例中,第一配置模块94,还用于在所述在所述第四区域中的内存分配链表中确定第一节点,在所述第一节点对应的内存空间的大小大于所述第i个输入数据的大小的情况下,在所述内存分配链表的第一节点和第二节点之间***目标节点;设置所述目标节点对应的内存空间状态为未使用状态;以及设置所述目标节点对应的内存空间起始地址为第一地址;以及设置所述目标节点对应的内存空间大于为第一大小;其中,所述第一地址为所述第一节点对应的内存空间起始地址在偏移所述第i个输入数据的大小以后的地址,所述第一大小为所述第二节点对应的内存空间起始地址减去所述目标节点对应的内存空间起始地址。
在一个示例性的实施例中,所述内存还包括:第三区域和第四区域,所述第三区域用于进行数据存储,所述第四区域中存放内存分配链表,所述内存分配链表用于存放所述第三区域中的内存空间的分配信息,所述服务器还包括:第三处理模块,用于在检测到在所述内存分配链表中存在第三节点和第四节点的情况下,将所述内存分配链表中的第四节点删除,将所述第三节点与第五节点相连;将所述第三节点对应的内存空间大于更新为第二大小;其中,所述第三节点和所述第四节点对应的内存空间均未使用,所述第三节点、第四节点和第五节点依次相连,所述第四节点位于所述第三节点和所述第五节点之间,所述第二大小为所述第五节点对应的内存空间起始地址减去所述第三节点对应的内存空间起始地址。
在一个示例性的实施例中,所述服务器还包括:第三配置模块,用于在所述在所述内存的第二区域配置第一任务对应的第一任务结构体数据之后,在所述第一推理任务还包括第二任务的情况下,在所述内存的第二区域配置第二任务对应的第二任务结构体数据,其中,所述第二任务结构体数据中包括用于执行所述第二任务的相关信息;将所述第二任务结构体数据的任务结构体地址写入所述第一任务结构体数据中。
需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。
本申请的实施例还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
在一个示例性实施例中,上述计算机可读存储介质可以包括但不限于:U盘、只读存储器(Read-Only Memory,简称为ROM)、随机存取存储器(Random Access Memory,简称为RAM)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。
本申请的实施例还提供了一种电子设备,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
在一个示例性实施例中,上述电子设备还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
本实施例中的具体示例可以参考上述实施例及示例性实施方式中所描述的示例,本实施例在此不再赘述。
显然,本领域的技术人员应该明白,上述的本申请的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请不限制于任何特定的硬件和软件结合。
以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。