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);