asc_sync_data_barrier
产品支持情况
- Ascend 950PR/Ascend 950DT:支持
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
- Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
- Atlas 200I/500 A2 推理产品:不支持
- Atlas 推理系列产品AI Core:不支持
- Atlas 推理系列产品Vector Core:不支持
- Atlas 训练系列产品:不支持
功能说明
阻塞后续的指令执行,直到所有之前的内存访问指令(需要等待的内存位置可通过参数控制)执行结束,用于解决Scalar的内存依赖。
函数原型
__aicore__ inline void asc_sync_data_barrier(mem_dsb_t arg)
参数说明
| 参数名 | 输入/输出 | 描述 |
|---|---|---|
| arg | 输入 | 表示需要等待的内存位置,类型为mem_dsb_t,可取值为: • DSB_ALL:等待所有内存访问指令。 • DSB_DDR:等待GM访问指令。 • DSB_UB:等待UB访问指令。 • DSB_SEQ:预留参数,暂未启动,为后续的功能扩展做保留。 |
返回值说明
无
流水类型
PIPE_S
约束说明
mem_dsb_t类型的入参必须直接传递枚举值字面量。
调用示例
由于asc_store_dev接口向GM写数据时不经过DCache,因此开发者需要考虑如下场景:当GM上地址addr已经在DCache缓存并且其对应的Cache Line标记为"脏"(dirty,表示该数据已被修改但尚未写回到GM)时,开发者应该在asc_store_dev接口之前调用asc_dcci接口将addr对应的Cache Line立即写回GM,否则asc_store_dev接口写入addr的数据后续可能被DCache写回的脏数据覆盖。
asc_dcci接口与asc_store_dev接口向GM写数据时硬件不能保证两个接口的执行顺序,因此开发者应该在asc_store_dev接口之前调用asc_sync_data_barrier接口对这两个接口进行同步,否则asc_store_dev接口写入addr的数据依然可能被DCache写回的脏数据覆盖。
根据以上的描述,为了简化编程(开发者无需关心addr是否在DCache缓存以及是否被标记为"脏"),建议开发者在使用asc_store_dev接口时采用如下代码片段:
asc_dcci_single(reinterpret_cast<__gm__ uint64_t*>(x_gm));
// 保证asc_store_dev接口向addr写入value之前,DCache中的脏数据已经写回GM。
asc_sync_data_barrier(mem_dsb_t::DSB_DDR);
asc_store_dev(x_gm, value);