任务调度器与运行管理器工程组成软硬件之间的大坝系统。在执行时,任务调度器对硬件进行任务的驱动,为昇腾AI处理器提供具体的目标任务,与运行管理器一起完成任务调度流程,并将输出数据回送给运行管理器,充当了一个任务输送分发和数据回传的通道。
功能简介
任务调度器运行在设备侧的任务调度CPU上,负责将运行管理器分发的具体任务进一步派发到AI CPU上。它也可以通过硬件任务块调度器(Block Scheduler,BS)把任务分配到到AI CORE上执行,并在执行完成后返回任务执行的结果给运行管理器。通常任务调度器处理的主要事务有:AI Core任务、AI CPU任务、内存拷贝任务、事件记录任务、事件等待任务、清理维护(Maintenance)任务以及性能分析(Profiling)任务。
内存拷贝主要以异步方式进行。事件记录任务主要记录事件的发生信息,如果存在等待该事件的任务,则这些任务在事件记录完成后可以解除等待,继续执行,消除由事件记录而导致执行流的阻塞。事件等待任务指如果等待的事件已经发生,则等待任务直接完成;当等待的事件尚未发生时,将等待任务填入待处理列表中,同时暂停事件等待任务所在执行流中后续所有任务的处理,在等待的事件发生时,再进行事件等待任务的处理。
在任务执行完成后,由清理维护任务根据任务参数不同进行相应的清理工作,回收计算资源。在执行过程还有可能要对计算的性能进行记录和分析,这时需要用到性能分析任务,来控制性能分析操作的启动和暂停。
任务调度器的功能框架如上图所示,任务调度器通常位于设备端,功能有任务调度CPU来完成。任务调度CPU由调度接口(Interface)、调度引擎(Engine)、调度逻辑处理模块、AI CPU调度器、任务块调度器、系统控制(SysCtrl)模块、性能分析(Profile)和日志(Log)模块组成。
任务调度CPU通过调度接口实现与运行管理器和驱动之间的通信和交互。将任务通过结果传送给任务调度引擎,任务调度引擎作为任务调度实现的主体,负责实现任务组织、任务依赖及任务调度控制等流程,管理着整个任务调度CPU的执行过程。任务调度引擎根据任务的具体类型,将任务分为计算、存储和控制三种类型,分发给不同调度逻辑处理模块,启动具体核函数任务、存储任务以及执行流间事件依赖等逻辑的管理与调度。
逻辑处理模块分为核函数执行模块(Kernel Execute)、直接存储访问执行模块(DMA Execute)和事件执行模块(Event Execute)。核函数执行模块进行计算任务的调度处理,实现AI CPU,AI Core上任务的调度逻辑,对具体的核函数进行调度处理。而直接存储访问执行模块实现存储任务的调度逻辑,对内存拷贝等进行调度处理。事件执行模块负责实现同步控制任务的调度逻辑,实现执行流间事件依赖的逻辑处理。在完成不同类型任务的调度逻辑处理后,开始直接交由相应的控制单元进行硬件执行。
针对AI CPU的任务执行,由任务调度CPU中的AI CPU调度器用软件的方式对AI CPU进行状态管理及任务调度。而对于AI Core的任务执行,则由任务调度CPU将处理后的任务通过一个单独的任务块调度器硬件分发到AI Core上,由AI Core进行具体计算,计算完成的结果也是由任务块调度器返回给任务调度CPU。
任务调度CPU在完成任务调度的过程中,由系统控制对系统进行配置和芯片功能的初始化,同时由性能分析和日志模块监测整个执行流程,记录关键执行参数以及具体执行细节,在整个执行结束或者报错时,可以进行具体的性能分析或者错误定位,为执行过程的正确性和高效性进行详细的评估分析提供依据。
调度流程
在神经网络的离线模型执行过程中,任务调度器接收来自离线模型执行器的具体执行任务,这些任务之间存在依赖关系,需要先解除依赖关系,再进行任务调度等步骤,最后根据具体的任务类型分发给AI Core或AI CPU,完成具体硬件的计算或执行。在任务调度过程中,任务是由多条执行指令(CMD)组成,由任务调度器和运行管理器进行相互交互,完成整个任务指令的有序调度。运行管理器执行在主机的CPU上,指令队列位于设备上的内存中,任务调度器进行具体任务指令的下发。
调度过程的详细流程如下图所示。
首先运行管理器调用驱动的dvCommandOcuppy接口进入指令队列中,根据指令的尾部信息查询指令队列中可用的存储空间,并将可以用的指令存储空间地址返回给运行管理器。运行管理器接收到地址后,将当前准备好的任务指令填充进指令队列存储空间中,并调用驱动的dvCommandSend接口更新指令队列当前的尾部信息和信用(credit)信息。队列接收新增的任务指令后,产生doorbell中断,并通知任务调度器在设备内存中的指令队列新增了任务指令。任务调度器得到通知后,进入设备内存中,搬运任务指令进入调度器的缓存中进行保存,并且更新设备端DDR内存中指令队列的头部信息。最后,任务调度器根据执行情况,将缓存中的指令发送给AI CPU或AI Core进行执行。
和大多数加速器运行时软件栈的构造基本一致,昇腾AI处理器中的运行管理器、驱动和任务调度器紧密配合,共同有序完成任务分发至相应硬件资源并执行。这个调度过程为深度神经网络计算过程中紧密有序的输送了任务,保证了任务执行的连续性和高效性。
更多信息请关注昇腾开发者社区
作者:Torrenza