asc_dcci
产 品 支 持 情 况
| 产 品 | 是 否 支 持 |
|---|---|
Ascend 950PR/Ascend 950DT | √ |
| Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品 | √ |
| Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品 | √ |
功 能 说 明
在AI Core内 部,Scalar单 元 和DMA单 元 都 可 能 对Global Memory进 行 访 问。
\
如 上 图 所 示:
DMA搬 运 单 元 读 写Global Memory,数 据 通 过asc_copy_ub2gm和asc_copy_gm2ub等 接 口 在UB等Local Memory和Global Memory间 交 互,没 有Cache一 致 性 问 题; Scalar单 元 访 问Global Memory,首 先 会 访 问 每 个 核 内 的Data Cache,因 此 存 在Data Cache与Global Memory的Cache一 致 性 问 题。 该 接 口 用 来 刷 新Cache,保 证Cache的 一 致 性,使 用 场 景 如 下:
读 取Global Memory的 数 据,但 该 数 据 可 能 在 外 部 被 其 余 核 修 改,此 时 需 要 使 用asc_dcci接 口,直 接 访 问Global Memory,获 取 最 新 数 据; 用 户 通 过Scalar单 元 写Global Memory的 数 据,希 望 立 刻 写 出,也 需 要 使 用asc_dcci接 口。
Scalar单 元 访 问UB数 据 时,该 接 口 需 配 合asc_set_ctrl()接 口 使 用,将CTRL[49]设 置 为1'b1,开 启datacache模 式。
针 对Ascend 950PR/Ascend 950DT,不 支 持asc_dcci_entire_ub接 口。
函 数 原 型
C++
// 刷 新 传 入 地 址 所 在 的 单 个Cache Line
__aicore__ inline void asc_dcci_single(__gm__ void* dst)
// 刷 新 传 入 的UB地 址 空 间 地 址 所 在 的 单 个Cache Line
__aicore__ inline void asc_ub_dcci_single(__ubuf__ void* dst)
// 刷 新 所 有Cache Line
__aicore__ inline void asc_dcci_entire_all()
__aicore__ inline void asc_dcci_entire_ub()
__aicore__ inline void asc_dcci_entire_out()
__aicore__ inline void asc_dcci_entire_atomic()
参 数 说 明
| 参 数 名 | 输 入/输 出 | 描 述 |
|---|---|---|
| dst | 输 入 | 需 要 刷 新 缓 存 的 向 量 的 起 始 地 址。 |
返 回 值 说 明
无
流 水 类 型
PIPE_S
约 束 说 明
无
调 用 示 例
C++
// 示 例1:SINGLE_CACHE_LINE模 式,假 设 首 地 址 为0x40(64B对 齐)
// total_length指 参 与 计 算 的 数 据 长 度
constexpr uint64_t total_length = 32;
__gm__ int16_t src[total_length];
for( int i = 0; i < total_length; i++) {
src[i] = i;
}
// 由 于 首 地 址64B对 齐,调 用asc_dcci指 令 后,会 立 刻 刷 新 前32个 数
asc_dcci_single(reinterpret_cast<__gm__ uint64_t*>(src));