Mutex(ISASI)
Mutex用于核内异步流水指令之间的同步控制,其功能类似于传统CPU中的锁机制。通过先锁定再释放指定流水来完成流水间的同步依赖,锁定/解锁指定流水对应Lock/Unlock接口。
- Lock:根据MutexID获取Mutex,若Mutex已被锁定,将阻塞后续指定流水指令队列,直到当前流水的前序指令中对应MutexID的Mutex被Unlock。
- Unlock:直到当前流水的前序指令执行完成后,根据MutexID释放对应Mutex。
图 1 Lock/UnLock接口
每个锁有固定的一个MutexID,在不同编程范式中,该ID的获取以及释放方式不同:
- 采用TPipe-TQue框架编程范式时,MutexID需要通过AllocMutexID/ReleaseMutexID进行申请释放。
- 采用静态Tensor编程范式时,MutexID由开发者自行管理,建议使用0-27,28-31为系统内部规划预留,不建议使用。
相对于SetFlag/WaitFlag同步机制,使用Lock/Unlock接口有以下优势:
- 内聚性更强,使用时与其它流水线解耦,可以简化反向同步,如图2所示,以PIPE_MTE2与PIPE_V之间同步为例。
- 可以使用更多的同步信号量。
图 2 SetFlag/WaitFlag同步与Lock/Unlock同步代码差异
Mutex类定义如下:
C++
class Mutex {
template <pipe_t pipe>
static __aicore__ inline void Lock(MutexID id);
template <pipe_t pipe>
static __aicore__ inline void Unlock(MutexID id);
};