Skip to content
版 本

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个 元 素 中 的 相 对 位 置。
具 体 可 参 考 下 表。其 中,“-”表 示 算 法 不 关 心 该 位 置 上 的 值,因 为 其 会 被 过 滤。

示 例ele0ele1ele2ele3Index_a[i]Index_b[i]
Two non-zero elements00XY2'b102'b10
0X0Y2'b012'b10
X00Y2'b002'b10
0XY-2'b012'b01
X0Y-2'b002'b01
XY--2'b002'b00
One non-zero element000X2'b002'b10
00X02'b102'b00
0X002'b012'b00
X0002'b002'b00
All zero00002'b002'b00
该 索 引 矩 阵 用 于A矩 阵 的 稠 密 化,根 据 索 引 矩 阵 从MatrixA中 的4个 元 素 中 选 择2个 元 素 参 与 计 算,如 下 图 所 示:

稠密算法说明图

调 用 示 例

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

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