Lock【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品不支持Atlas A2 训练系列产品/Atlas A2 推理系列产品不支持Atlas 200I/500 A2 推理产品不支持Atlas 推理系列产品AI Core不支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品不支持功能说明头文件路径为basic_api/kernel_common.h。根据MutexID获取Mutex若Mutex已被锁定将阻塞后续指定流水指令队列直到当前流水的前序指令中对应MutexID的Mutex被Unlock/Unlock.md?utm_sourcegitcode_repo_files)。[!NOTE]说明 Lock接口需与Unlock/Unlock.md?utm_sourcegitcode_repo_files)接口配合使用对同一个MutexIDLock和Unlock必须严格成对出现否则硬件行为将不可预测。具体约束请参见约束说明。函数原型template pipe_t pipe static __aicore__ inline void Lock(MutexID id)参数说明表 1模板参数说明参数名描述pipe模板参数表示流水类别。支持的流水类型为PIPE_S/PIPE_M/PIPE_V/PIPE_MTE1/PIPE_MTE2/PIPE_MTE3/PIPE_FIX表 2参数说明参数名输入/输出描述id输入进行流水同步管理的MutexID。在不同编程范式中该ID的获取以及释放方式不同详细情况参考约束说明。返回值说明无约束说明每个锁有固定的一个MutexID在不同编程范式中该ID的获取以及释放方式不同采用TPipe-TQue框架编程范式时MutexID需要通过AllocMutexID.md)/ReleaseMutexID.md)进行申请释放。采用静态Tensor编程范式时MutexID由开发者自行管理建议使用0-2728-31为系统内部规划预留不建议使用。对于同一个MutexID必须先执行Lock然后才能执行Unlock且指定的pipe需要相同。如果Lock和Unlock没有按照这种成对出现的顺序排列硬件行为将不可预测。以下是常见的错误用法与正确用法示例// 错误写法 1先Unlock再Lock顺序颠倒。 AscendC::Mutex::UnlockPIPE_V(0); AscendC::Mutex::LockPIPE_V(0); // 错误写法 2连续两次Lock后再连续两次Unlock未遵循成对使用原则。 AscendC::Mutex::LockPIPE_V(0); AscendC::Mutex::LockPIPE_V(0); AscendC::Mutex::UnlockPIPE_V(0); AscendC::Mutex::UnlockPIPE_V(0); // 正确写法Lock和Unlock严格成对出现。 AscendC::Mutex::LockPIPE_V(0); AscendC::Mutex::UnlockPIPE_V(0); AscendC::Mutex::LockPIPE_V(0); AscendC::Mutex::UnlockPIPE_V(0);使用相同MutexID、相同流水的两组Lock/UnLock指令时第二次Lock不会再阻塞流水这种情况建议使用PipeBarrier.md)接口。以下是错误用法与正确用法的示例// 错误写法第二次Lock已不再阻塞起不到同步效果。 AscendC::Mutex::LockPIPE_V(0); AscendC::Add(zLocal, xLocal, yLocal, TILE_LENGTH); AscendC::Mutex::UnlockPIPE_V(0); // 不能达到阻塞PIPE_V的效果。 AscendC::Mutex::LockPIPE_V(0); AscendC::Add(zLocal, xLocal, yLocal, TILE_LENGTH); AscendC::Mutex::UnlockPIPE_V(0); // 正确写法使用PipeBarrier进行单流水内同步。 AscendC::Add(zLocal, xLocal, yLocal, TILE_LENGTH); AscendC::PipeBarrierPIPE_V(); AscendC::Add(zLocal, xLocal, yLocal, TILE_LENGTH);调用示例// 申请两个 MutexID供双缓冲流水交替复用。 uint8_t mutexId0 AscendC::AllocMutexID(); uint8_t mutexId1 AscendC::AllocMutexID(); // 交替使用两个 MutexID保证 MTE2、V、MTE3 三段流水按顺序串联。 for (int32_t i 0; i loopCount; i) { uint8_t mutexId (i % 2 0) ? mutexId0 : mutexId1; // 锁住 MTE2 流水保证当前 tile 的搬入按该 MutexID 顺序执行。 AscendC::Mutex::LockPIPE_MTE2(mutexId); AscendC::DataCopy(xLocal, src0Global[TILE_LENGTH * progress], TILE_LENGTH); AscendC::DataCopy(yLocal, src1Global[TILE_LENGTH * progress], TILE_LENGTH); // 搬入完成后解锁 MTE2 流水允许后续阶段继续推进。 AscendC::Mutex::UnlockPIPE_MTE2(mutexId); // 锁住 V 流水等待对应 tile 的搬入完成后再开始计算。 AscendC::Mutex::LockPIPE_V(mutexId); AscendC::Add(zLocal, xLocal, yLocal, TILE_LENGTH); // 计算完成后解锁 V 流水放行后续计算或搬出。 AscendC::Mutex::UnlockPIPE_V(mutexId); // 锁住 MTE3 流水确保计算结果完成后再写回 GM。 AscendC::Mutex::LockPIPE_MTE3(mutexId); AscendC::DataCopy(dstGlobal[TILE_LENGTH * progress], zLocal, TILE_LENGTH); // 搬出完成后解锁 MTE3 流水结束当前 tile 的处理。 AscendC::Mutex::UnlockPIPE_MTE3(mutexId); } // 释放本次样例申请的两个 MutexID。 AscendC::ReleaseMutexID(mutexId0); AscendC::ReleaseMutexID(mutexId1);完整样例请参考Mutex样例。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
CANN/asc-devkit: Lock核内同步函数
发布时间:2026/7/16 16:18:20
Lock【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品不支持Atlas A2 训练系列产品/Atlas A2 推理系列产品不支持Atlas 200I/500 A2 推理产品不支持Atlas 推理系列产品AI Core不支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品不支持功能说明头文件路径为basic_api/kernel_common.h。根据MutexID获取Mutex若Mutex已被锁定将阻塞后续指定流水指令队列直到当前流水的前序指令中对应MutexID的Mutex被Unlock/Unlock.md?utm_sourcegitcode_repo_files)。[!NOTE]说明 Lock接口需与Unlock/Unlock.md?utm_sourcegitcode_repo_files)接口配合使用对同一个MutexIDLock和Unlock必须严格成对出现否则硬件行为将不可预测。具体约束请参见约束说明。函数原型template pipe_t pipe static __aicore__ inline void Lock(MutexID id)参数说明表 1模板参数说明参数名描述pipe模板参数表示流水类别。支持的流水类型为PIPE_S/PIPE_M/PIPE_V/PIPE_MTE1/PIPE_MTE2/PIPE_MTE3/PIPE_FIX表 2参数说明参数名输入/输出描述id输入进行流水同步管理的MutexID。在不同编程范式中该ID的获取以及释放方式不同详细情况参考约束说明。返回值说明无约束说明每个锁有固定的一个MutexID在不同编程范式中该ID的获取以及释放方式不同采用TPipe-TQue框架编程范式时MutexID需要通过AllocMutexID.md)/ReleaseMutexID.md)进行申请释放。采用静态Tensor编程范式时MutexID由开发者自行管理建议使用0-2728-31为系统内部规划预留不建议使用。对于同一个MutexID必须先执行Lock然后才能执行Unlock且指定的pipe需要相同。如果Lock和Unlock没有按照这种成对出现的顺序排列硬件行为将不可预测。以下是常见的错误用法与正确用法示例// 错误写法 1先Unlock再Lock顺序颠倒。 AscendC::Mutex::UnlockPIPE_V(0); AscendC::Mutex::LockPIPE_V(0); // 错误写法 2连续两次Lock后再连续两次Unlock未遵循成对使用原则。 AscendC::Mutex::LockPIPE_V(0); AscendC::Mutex::LockPIPE_V(0); AscendC::Mutex::UnlockPIPE_V(0); AscendC::Mutex::UnlockPIPE_V(0); // 正确写法Lock和Unlock严格成对出现。 AscendC::Mutex::LockPIPE_V(0); AscendC::Mutex::UnlockPIPE_V(0); AscendC::Mutex::LockPIPE_V(0); AscendC::Mutex::UnlockPIPE_V(0);使用相同MutexID、相同流水的两组Lock/UnLock指令时第二次Lock不会再阻塞流水这种情况建议使用PipeBarrier.md)接口。以下是错误用法与正确用法的示例// 错误写法第二次Lock已不再阻塞起不到同步效果。 AscendC::Mutex::LockPIPE_V(0); AscendC::Add(zLocal, xLocal, yLocal, TILE_LENGTH); AscendC::Mutex::UnlockPIPE_V(0); // 不能达到阻塞PIPE_V的效果。 AscendC::Mutex::LockPIPE_V(0); AscendC::Add(zLocal, xLocal, yLocal, TILE_LENGTH); AscendC::Mutex::UnlockPIPE_V(0); // 正确写法使用PipeBarrier进行单流水内同步。 AscendC::Add(zLocal, xLocal, yLocal, TILE_LENGTH); AscendC::PipeBarrierPIPE_V(); AscendC::Add(zLocal, xLocal, yLocal, TILE_LENGTH);调用示例// 申请两个 MutexID供双缓冲流水交替复用。 uint8_t mutexId0 AscendC::AllocMutexID(); uint8_t mutexId1 AscendC::AllocMutexID(); // 交替使用两个 MutexID保证 MTE2、V、MTE3 三段流水按顺序串联。 for (int32_t i 0; i loopCount; i) { uint8_t mutexId (i % 2 0) ? mutexId0 : mutexId1; // 锁住 MTE2 流水保证当前 tile 的搬入按该 MutexID 顺序执行。 AscendC::Mutex::LockPIPE_MTE2(mutexId); AscendC::DataCopy(xLocal, src0Global[TILE_LENGTH * progress], TILE_LENGTH); AscendC::DataCopy(yLocal, src1Global[TILE_LENGTH * progress], TILE_LENGTH); // 搬入完成后解锁 MTE2 流水允许后续阶段继续推进。 AscendC::Mutex::UnlockPIPE_MTE2(mutexId); // 锁住 V 流水等待对应 tile 的搬入完成后再开始计算。 AscendC::Mutex::LockPIPE_V(mutexId); AscendC::Add(zLocal, xLocal, yLocal, TILE_LENGTH); // 计算完成后解锁 V 流水放行后续计算或搬出。 AscendC::Mutex::UnlockPIPE_V(mutexId); // 锁住 MTE3 流水确保计算结果完成后再写回 GM。 AscendC::Mutex::LockPIPE_MTE3(mutexId); AscendC::DataCopy(dstGlobal[TILE_LENGTH * progress], zLocal, TILE_LENGTH); // 搬出完成后解锁 MTE3 流水结束当前 tile 的处理。 AscendC::Mutex::UnlockPIPE_MTE3(mutexId); } // 释放本次样例申请的两个 MutexID。 AscendC::ReleaseMutexID(mutexId0); AscendC::ReleaseMutexID(mutexId1);完整样例请参考Mutex样例。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考