Skip to content

asc_set_scalar_cache_mode

产品支持情况

  • Ascend 950PR/Ascend 950DT:支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品AI Core:不支持
  • Atlas 推理系列产品Vector Core:不支持
  • Atlas 训练系列产品:不支持

功能说明

头文件路径为:"c_api/cache_ctrl/cache_ctrl.h"

配置标量单元访问Global Memory时的L2 Cache管理策略。接口通过修改CTRL寄存器对应比特域生效:

设置后,后续标量路径上的GM读写将按该策略访问L2 Cache,直至再次调用本接口修改。

函数原型

C
__aicore__ inline void asc_set_scalar_cache_mode(asc_load_l2_cache_mode l2_cache_mode)
__aicore__ inline void asc_set_scalar_cache_mode(asc_store_l2_cache_mode l2_cache_mode)

参数说明

表1 参数说明

参数名输入/输出描述
l2_cache_mode输入L2 Cache管理策略。load重载传入asc_load_l2_cache_mode枚举值;store重载传入asc_store_l2_cache_mode枚举值。

返回值说明

流水类型

PIPE_S

约束说明

调用示例

  • 场景A:标量load — NORMAL_FIRST_VICTIM+循环内重复读GM tiling表

动态tiling存放在GM上:tiling_gm[0]tile_count,后续依次为各tile的lengthoffset。循环内每个tile都会标量读取tiling字段,同一tiling区域会被多次访问,适合启用L2复用。若tiling字段只读一次、后续不再访问,应改用NOTALLOC_KEEP或无需调用本接口。

C++
__gm__ int32_t* tiling_gm;   // [tile_count, len[0..n-1], off[0..n-1]]
__gm__ half* src_gm;
__ubuf__ half* dst_ub;

// SIMD_VF外:tiling表将在循环内被多次标量读取
asc_set_scalar_cache_mode(asc_load_l2_cache_mode::NORMAL_FIRST_VICTIM);

int32_t tile_count = tiling_gm[0];
for (int32_t tile = 0; tile < tile_count; ++tile) {
    int32_t tile_len = tiling_gm[1 + tile];              // 每tile标量读GM
    int32_t tile_off = tiling_gm[1 + tile_count + tile]; // 每tile标量读GM
    asc_copy_gm2ub_align(dst_ub, src_gm + tile_off, tile_len * sizeof(half));
    // 向量搬运的l2_cache_mode由asc_copy_gm2ub_align单独配置,见set_l2_cache_mode样例
    // ... 向量计算 ...
}
  • 场景B:标量store — NOTALLOC_CLEAN+标量写GM

多核算子向GM统计counter做标量原子累加时,临时关闭标量写路径的L2分配,避免对控制字段产生不必要的Cache Line分配。

C++
__gm__ int32_t* counter_gm;  // GM上的多核共享计数器

asc_set_scalar_cache_mode(asc_store_l2_cache_mode::NOTALLOC_CLEAN);
asc_dcci_entire_all();       // 标量原子操作前保证DCache一致性
asc_atomic_add(counter_gm, 1);

免责声明:本站内容由 asc-devkit 仓 master 分支自动编译生成,属于持续开发版本,可能存在缺陷,仅供预览与参考。如需稳定及商用资料,请查阅官方 昇腾社区