InitDetermineComputeWorkspace
【免费下载链接】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_operator_determine_compute_sync_intf.h"。
InitDetermineComputeWorkspace是基于核间顺序执行的确定性计算的初始化配置接口,能够初始化GM共享内存的值,完成初始化后才可以调用WaitPreBlock和NotifyNextBlock。以上三个接口共同完成基于核间顺序执行的确定性计算,确定性计算的具体含义请参考确定性计算。
函数原型
__aicore__ inline void InitDetermineComputeWorkspace(GlobalTensor<int32_t>& gmWorkspace, LocalTensor<int32_t>& ubWorkspace)参数说明
表1接口参数说明
| 参数名称 | 输入/输出 | 含义 |
|---|---|---|
| gmWorkspace | 输入 | 临时空间,初始化核间同步的共享内存,类型为GlobalTensor。 |
| ubWorkspace | 输入 | 临时空间,用于操作gmWorkspace,类型为LocalTensor。 |
返回值说明
无
约束说明
- gmWorkspace申请的空间最少要求为:GetBlockNum()*32Bytes,ubWorkspace申请的空间最少要求为:GetBlockNum()*32+32Bytes。
- 与IBSet/SyncAll不同,该接口输入参数gmWorkspace缓存的值不需要初始化为0。
- 使用该接口进行多核控制时,算子调用时指定的逻辑AI Core核数numBlocks必须保证不大于实际运行该算子的AI处理器核数,否则框架进行多轮调度时会插入异常同步,导致Kernel“卡死”现象。
调用示例
// 初始化GM共享内存的同步状态,必须在核函数开始时首先调用。 AscendC::InitDetermineComputeWorkspace(gmWorkspace, ubWorkspace); for(int64_t i = 0; i < tileNum; i++) { AscendC::LocalTensor<T> srcLocal = que.AllocTensor<T>(); AscendC::DataCopy(srcLocal, srcGlobal[i * tileCount], tileCount); // 等待前序核(blockIdx-1)完成操作。 AscendC::WaitPreBlock(gmWorkspace, ubWorkspace); // 开启原子累加。 AscendC::SetAtomicAdd<T>(); AscendC::DataCopy(dstGlobal[i * tileCount], srcLocal, tileCount); AscendC::DisableDmaAtomic(); // 通知后序核(blockIdx+1)当前核已完成。 AscendC::NotifyNextBlock(gmWorkspace, ubWorkspace); que.FreeTensor(srcLocal); }完整样例请参考sequential_block_sync示例。
【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考