AI Core采用顺序取指令、并行执行指令的调度方式,如下图所示:
指令序列被顺序译码,根据指令的类型,有两种可能:
队列缩写 |
队列名称 |
备注 |
---|---|---|
V |
Vector指令队列 |
用于调度向量指令 |
M |
Matrix指令队列 |
用于调度Cube指令 |
MTE1 |
存储移动指令队列1 |
用于调度如下内存移动指令: L1到L0A/L0B/UB,或者用SPR初始化L0A/L0B Buffer |
MTE2 |
存储移动指令队列2 |
用于调度如下内存移动指令: GM到L1/L0A/L0B/UB |
MTE3 |
存储移动指令队列3 |
用于调度如下内存移动指令: UB到GM |
根据调度分类的不同,可以把指令分类,加上被译码过程直接解释的Scalar指令(缩写为S),可以有6种指令分类:S、V、M、MTE1/2/3。
除S队列之外,分属于不同队列的指令能够乱序执行,但是队列内部指令为顺序执行,即在满足数据依赖的前提下,指令的物理执行顺序不一定与代码的书写顺序一致。
TBE封装了这种依赖关系,所以应用开发人员不必对Barrier或者Flag进行编程。但应用开发人员仍需要理解这个基本原理,才能通过合适的代码调度,实现更好的同步关系。基于DSL方式进行算子开发无需关注代码调度,DSL提供了自动调度(auto_schedule)机制。