|
产品 |
是否支持 |
|---|---|
|
Ascend 950PR/Ascend 950DT |
√ |
|
|
√ |
|
|
√ |
|
|
x |
|
|
x |
|
|
x |
|
|
x |
面向分离模式的核间同步控制接口。
该接口和CrossCoreWaitFlag接口配合使用。使用时需传入核间同步的标记ID(flagId),每个ID对应一个用于控制同步的计数器。
同步控制分为以下几种模式,如图1所示:
其中,模式4仅支持Ascend 950PR/Ascend 950DT。
1 2 |
template <uint8_t modeId, pipe_t pipe> __aicore__ inline void CrossCoreSetFlag(uint16_t flagId) |
|
参数名 |
描述 |
|---|---|
|
modeId |
核间同步的模式,取值如下:
|
|
pipe |
设置这条指令所在的流水类型,流水类型可参考硬件流水类型。 特别地,PIPE_S流水类型仅Ascend 950PR/Ascend 950DT支持。 |
|
参数名 |
输入/输出 |
描述 |
|---|---|---|
|
flagId |
输入 |
核间同步的标记。 Ascend 950PR/Ascend 950DT,取值范围如下: AIV0发起的flagId 0-10的CrossCoreSetFlag操作对应AIC CrossCoreWaitFlag中flagId 0-10的操作。 AIV1发起的flagId 0-10的CrossCoreSetFlag操作对应AIC CrossCoreWaitFlag中flagId 16-26的操作。 AIC发起的flagId 0-10的CrossCoreSetFlag操作对应AIV0 CrossCoreWaitFlag中flagId 0-10的操作。 AIC发起的flagId 16-26的CrossCoreSetFlag操作对应AIV1 CrossCoreWaitFlag中flagId 0-10的操作。 |
无
具体而言,在多流场景下,某条流的核间同步算子虽分配到n个物理核,但可能仅有n-m个核先被调度执行,而其余m个核因被其他流的核间同步算子抢占而尚未启动。先启动的n-m个核执行到核间同步时等待剩余m核完成,而剩余m核因被其他流的核间同步算子占用而无法释放,形成死锁。
Kernel直调场景下通过__schedmode__(mode)限定符来设置batchmode模式;工程化算子开发场景下,通过TilingContext的SetScheduleMode接口来设置batchmode模式,具体请参考《基础数据结构和接口》。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// 使用模式0的方式同步所有的AIV核 if (g_coreType == AscendC::AIV) { AscendC::CrossCoreSetFlag<0x0, PIPE_MTE3>(0x8); AscendC::CrossCoreWaitFlag(0x8); } // 使用模式1的方式同步当前AICore内的所有AIV子核 if (g_coreType == AscendC::AIV) { AscendC::CrossCoreSetFlag<0x1, PIPE_MTE3>(0x8); AscendC::CrossCoreWaitFlag(0x8); } // 注意:如果调用高阶API,无需开发者处理AIC和AIV的同步 // 以Matmul为例:AIC侧做完Matmul计算后通知AIV进行后处理 if (g_coreType == AscendC::AIC) { // Matmul处理 AscendC::CrossCoreSetFlag<0x2, PIPE_FIX>(0x8); } // AIV侧等待AIC Set消息, 进行Vector后处理 if (g_coreType == AscendC::AIV) { AscendC::CrossCoreWaitFlag(0x8); // Vector后处理 } |