InitDetermineComputeWorkspace
产品支持情况
- 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。以上三个接口共同完成基于核间顺序执行的确定性计算,确定性计算的具体含义请参考确定性计算。
函数原型
C++
__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“卡死”现象。
调用示例
C++
// 初始化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示例。