asc_mmad_sparse
产 品 支 持 情 况
| 产 品 | 是 否 支 持 |
|---|---|
| Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品 | √ |
| Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品 | √ |
功 能 说 明
完 成 矩 阵 乘 加 操 作,传 入 的 左 矩 阵A为 稠 密 矩 阵,右 矩 阵B为 稀 疏 矩 阵。对 于 矩 阵A,在asc_mmad_sparse计 算 时 完 成 稠 密 化;对 于 矩 阵B,在 计 算 执 行 前 的 输 入 数 据 准 备 时 自 行 完 成 稠 密 化(按 照 下 文 中 介 绍 的 稠 密 算 法 进 行 稠 密 化),所 以 输 入 本 接 口 的 矩 阵A为 稠 密 矩 阵。稠 密 矩 阵A需 要 通 过asc_copy_l12l0b_sparse载 入,同 时 加 载 索 引 矩 阵,索 引 矩 阵 在 矩 阵B稠 密 化 的 过 程 中 生 成,再 用 于 矩 阵A的 稠 密 化。
函 数 原 型
- 常 规 计 算
C++
__aicore__ inline void asc_mmad_sparse(__cc__ int32_t* c, __ca__ int8_t* a, __cb__ int8_t* b, uint16_t m, uint16_t k, uint16_t n, uint8_t unit_flag, bool cmatrix_source, bool cmatrix_init_val)
- 同 步 计 算
C++
__aicore__ inline void asc_mmad_sparse_sync(__cc__ int32_t* c, __ca__ int8_t* a, __cb__ int8_t* b, uint16_t m, uint16_t k, uint16_t n, uint8_t unit_flag, bool cmatrix_source, bool cmatrix_init_val)
参 数 说 明
| 参 数 名 | 输 入/输 出 | 描 述 |
|---|---|---|
| c | 输 出 | 目 的 操 作 数,结 果 矩 阵C,起 始 地 址 需 要1024字 节 对 齐。 |
| a | 输 入 | 源 操 作 数,左 矩 阵A,起 始 地 址 需 要512字 节 对 齐。 |
| b | 输 入 | 源 操 作 数,右 矩 阵B,起 始 地 址 需 要512字 节 对 齐。 |
| m | 输 入 | 左 矩 阵Height,取 值 范 围:m∈[0,4095]。 |
| k | 输 入 | 左 矩 阵Width、右 矩 阵Height,取 值 范 围:k∈[0,4095]。 |
| n | 输 入 | 右 矩 阵Width,取 值 范 围:n∈[0,4095]。 |
| unit_flag | 输 入 | unit_flag是 一 种Mmad指 令 和Fixpipe指 令 细 粒 度 的 并 行,开 启 该 功 能 后,硬 件 每 计 算 完 一 个 分 形,计 算 结 果 就 会 被 搬 出,该 功 能 不 适 用 于L0C Buffer累 加 的 场 景。取 值 说 明 如 下: 0:保 留 值。 2:开 启unit_flag,硬 件 执 行 完 指 令 后,不 会 关 闭unit_flag功 能。 3:开 启unit_flag,硬 件 执 行 完 指 令 后,会 关 闭unit_flag功 能。 开 启 该 功 能 时,Mmad指 令 的unit_flag在 最 后 一 个 分 形 设 置 为3,其 余 分 形 计 算 设 置 为2即 可。 |
| cmatrix_source | 输 入 | 配 置C矩 阵 初 始 值 是 否 来 源 于BiasTable Buffer(存 放Bias的 硬 件 缓 存 区)。取 值 说 明 如 下: • true:来 源 于BiasTable Buffer。 • false:来 源 于L0C Buffer。 |
| cmatrix_init_val | 输 入 | 配 置C矩 阵 初 始 值 是 否 为0。取 值 说 明 如 下: • true:C矩 阵 初 始 值 为0。 • false:C矩 阵 初 始 值 通 过cmatrix_source参 数 进 行 配 置。 |
返 回 值 说 明
无
流 水 类 型
PIPE_M
约 束 说 明
- 原 始 稀 疏 矩 阵B每4个 元 素 中 应 保 证 最 多2个 非 零 元 素,如 果 存 在3个 或 更 多 非 零 元 素,则 仅 使 用 前2个 非 零 元 素。
- 当m、k、n中 的 任 意 一 个 值 为0时,该 指 令 不 会 被 执 行。
稠 密 算 法 说 明
假 设 原 始 稀 疏 矩 阵B的 每4个 元 素 中 至 少 有2个 零,稠 密 化 后 的 矩 阵B是 一 个 在 每4个 元 素 中 过 滤 掉2个 零 的 稠 密 矩 阵。矩 阵B稠 密 化 的 过 程 中 生 成 索 引 矩 阵,过 程 如 下:对 于 稀 疏 矩 阵B中 的 每4个 元 素,将 在index矩 阵 中 生 成2个2位 索 引,并 按 照 以 下 规 则 进 行 编 码。索 引 必 须 在{0, 1, 2}范 围 内。
•第 一 个 索 引 用 于 指 示 前3个 元 素 中 第1个 非 零 元 素 的 相 对 位 置。
•第 二 个 索 引 用 于 指 示 第2个 非 零 元 素 在 后3个 元 素 中 的 相 对 位 置。
具 体 可 参 考 下 表。其 中,“-”表 示 算 法 不 关 心 该 位 置 上 的 值,因 为 其 会 被 过 滤。
| 示 例 | ele0 | ele1 | ele2 | ele3 | Index_a[i] | Index_b[i] |
| Two non-zero elements | 0 | 0 | X | Y | 2'b10 | 2'b10 |
| 0 | X | 0 | Y | 2'b01 | 2'b10 | |
| X | 0 | 0 | Y | 2'b00 | 2'b10 | |
| 0 | X | Y | - | 2'b01 | 2'b01 | |
| X | 0 | Y | - | 2'b00 | 2'b01 | |
| X | Y | - | - | 2'b00 | 2'b00 | |
| One non-zero element | 0 | 0 | 0 | X | 2'b00 | 2'b10 |
| 0 | 0 | X | 0 | 2'b10 | 2'b00 | |
| 0 | X | 0 | 0 | 2'b01 | 2'b00 | |
| X | 0 | 0 | 0 | 2'b00 | 2'b00 | |
| All zero | 0 | 0 | 0 | 0 | 2'b00 | 2'b00 |

调 用 示 例
C++
constexpr uint32_t total_length = 128;
__ca__ int8_t a[total_length];
__cb__ int8_t b[total_length];
__cc__ int32_t c[total_length];
uint16_t m = 2;
uint16_t k = 2;
uint16_t n = 1;
uint8_t unit_flag = 2;
bool cmatrix_source = true;
bool cmatrix_init_val = true;
asc_mmad_sparse(c, a, b, m, k, n, unit_flag, cmatrix_source, cmatrix_init_val);