面临的问题
在进行机器人应用开发时,如果将机器人的业务功能视为一个函数f,传感器的输入作为入参x,机器人的输出为结果y。确定性调度系统的要求是“对于所有的x,f的执行时间需要小于一个固定的上限时间t,且输出结果y是正确的,且t越小越好”。然而实际情况下,业务函数f本身的复杂度较高,需要管理的异构计算资源很多,包括CPU、AIC(负责矩阵计算的Cube核)、AIV(负责向量计算的Vector核)、DVPP等。此外,需要支持多种神经网络模型、多个业务进程,业务代码量大,因此只能采用宏观角度的调度策略来保证确定性。
图1 宏观确定性调度策略示意图
宏观确定性调度策略包括:
- 确定的计算资源:预留足够的CPU计算资源,以及AIC、AIV、DVPP硬件资源,确保满足规格的业务功能能够完成。
- 确定的调度器:任何场景下,一次事件调度产生的结果输出时间小于最大值,一般是us级。
- 确定的业务执行:在相同输入情况下,任何一个函数执行完成的时间是确定的,一般是ms级。
架构和原理
确定性调度系统如图2所示,主要由共享内存、确定性调度框架、OpenHiva调度框架等模块组成。其中OpenHiva调度框架是上层的编程框架,确定性调度框架是底层的编程框架。OpenHiva封装了底层较为复杂的确定性调度框架接口、AscendCL接口等,提供了一套类ROS的通信机制,并将其统一以发布/订阅的接口对外呈现,以便开发者使用。
图2 确定性调度系统
对确定性调度系统内部实现进一步细化,其流程如图3所示。
图3 确定性调度流程图
- 共享内存:
- 支持在整个数据平面跨进程共享数据。
- 支持根据共享范围区分不同的Group,同Group可以共享数据,跨Group无法访问数据。
- 支持一个进程同属不同Group,以便在不同Group间传递数据(当前所有共享内存使用同一个Group,用户感知不到共享内存分组,后续基于功能安全的考虑会对不同的进程添加不同的分组)。
- 确定性事件调度:事件调度是确定性调度框架的核心。
- 支持处理驱动数据平面的所有事件,包括HWTS(Hardware Task Scheduler,硬件任务调度)、DVPP等硬件事件以及队列、定时器相关的软件事件。
- 支持按照进程优先级、事件优先级2级的优先级调度策略,支持非抢占式的调度。为了确保任务处理的确定性,不支持时间片轮转、抢占式的调度方式。
- 确定性队列调度:队列调度的主要作用是将数据指针根据发布/订阅关系从发布者队列搬运到订阅者队列,便于发布者和订阅者解耦,各自定义自己的队列策略。
- DataMaster:主要作用是维护发布者和订阅者之间的关系,并将发布/订阅关系映射为队列间的关系下发到队列调度。DataMaster需要和OpenHiva调度框架协同工作。