InitDetermineComputeWorkspace
产品支持情况
产品 |
是否支持 |
|---|---|
Atlas 350 加速卡 |
√ |
x |
|
√ |
|
x |
|
√ |
|
x |
|
x |
功能说明
初始化GM共享内存的值,完成初始化后才可以调用WaitPreBlock和NotifyNextBlock。
函数原型
1 | __aicore__ inline void InitDetermineComputeWorkspace(GlobalTensor<int32_t>& gmWorkspace, LocalTensor<int32_t>& ubWorkspace) |
参数说明
参数名称 |
输入/输出 |
含义 |
|---|---|---|
gmWorkspace |
输入 |
临时空间,初始化核间同步的共享内存,类型为GlobalTensor。 |
ubWorkspace |
输入 |
临时空间,用于操作gmWorkspace,类型为LocalTensor。 |
返回值说明
无
约束说明
- gmWorkspace申请的空间最少要求为:blockNum * 32Bytes;ubWorkspace申请的空间最少要求为:blockNum * 32 + 32Bytes;其中blockNum为调用的核数,可调用GetBlockNum获取。
- 使用该接口进行多核控制时,算子调用时指定的逻辑numBlocks必须保证不大于实际运行该算子的AI处理器核数,否则框架进行多轮调度时会插入异常同步,导致Kernel“卡死”现象。
调用示例
如下示例模拟8个核进行数据处理,使用确定性计算接口保证核间运行顺序,进行原子累加。
// m_gmWorkspace为初始化核间同步的共享内存,类型为GlobalTensor;ubWorkspace为操作m_gmWorkspace的临时空间,类型为LocalTensor int64_t m_tileCount = 256 * sizeof(int32_t); // 参与计算的元素总数所占的空间,单位为bytes // 初始化GM共享内存的值 AscendC::InitDetermineComputeWorkspace(m_gmWorkspace, ubWorkspace); // copy in // srcLocal为int32_t类型的LocalTensor,m_srcGlobal为int32_t的GlobalTensor AscendC::DataCopy(srcLocal, m_srcGlobal[m_tileCount], m_tileCount); // copy out // 调用WaitPreBlock读GM地址中的值,确认是否需要继续等待 AscendC::WaitPreBlock(m_gmWorkspace, ubWorkspace); // 开启原子累加 AscendC::SetAtomicAdd<int32_t>(); // m_dstGlobal为int32_t的GlobalTensor AscendC::DataCopy(m_dstGlobal[m_tileCount], srcLocal, m_tileCount); AscendC::DisableDmaAtomic(); // 调用NotifyNextBlock写GM地址,通知下一个核当前核的操作已完成,下一个核可以进行操作 AscendC::NotifyNextBlock(m_gmWorkspace, ubWorkspace);
//每个核的输入数据为: [1,1,1,1,1,...,1] // 256个1 //最终输出数据: [8,8,8,8,8,...,8] // 256个8
父主题: 核间同步