Fixpipe
产 品 支 持 情 况
功 能 说 明
矩 阵 计 算 完 成 后,对 结 果 进 行 处 理,例 如 对 计 算 结 果 进 行 量 化 操 作,并 把 数 据 从CO1搬 迁 到Global Memory中。
示 意 图 如 下:

说 明
上 图 中Fixpipe Buffer->UB->L1 Buffer的 接 口,仅 在NPU_ARCH 351x版 本 支 持。
其 中,FixPipe Buffer不 同 的 量 化 模 式 对 应 的 内 存 排 布 如 下:

函 数 原 型
传 入FixpipeParamsV220
通 路CO1->GM,不 使 能tensor量 化 功 能:
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> __aicore__ inline void Fixpipe(const GlobalTensor<T>& dst, const LocalTensor<U>& src, const FixpipeParamsV220& intriParams)通 路CO1->GM,使 能tensor量 化 功 能:
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR, typename S = uint64_t, typename Std::enable_if<Std::is_same<PrimT<S>, uint64_t>::value, bool>::type = true> __aicore__ inline void Fixpipe(const GlobalTensor<T>& dst, const LocalTensor<U>& src, const LocalTensor<S>& cbufWorkspace, const FixpipeParamsV220& intriParams)
传 入FixpipeParamsM300
通 路CO1->UB,不 使 能tensor量 化 功 能:
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> __aicore__ inline void Fixpipe(const LocalTensor<T>& dst, const LocalTensor<U>& src, const FixpipeParamsM300& intriParams)通 路CO1->UB,使 能tensor量 化 功 能:
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR, typename S = uint64_t, typename Std::enable_if<Std::is_same<PrimT<S>, uint64_t>::value, bool>::type = true> __aicore__ inline void Fixpipe(const LocalTensor<T>& dst, const LocalTensor<U>& src, const LocalTensor<S>& cbufWorkspace, const FixpipeParamsM300& intriParams)通 路CO1->GM,不 使 能tensor量 化 功 能:
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> __aicore__ inline void Fixpipe(const GlobalTensor<T>& dst, const LocalTensor<U>& src, const FixpipeParamsM300& intriParams)通 路CO1->GM,使 能tensor量 化 功 能:
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR, typename S = uint64_t, typename Std::enable_if<Std::is_same<PrimT<S>, uint64_t>::value, bool>::type = true> __aicore__ inline void Fixpipe(const GlobalTensor<T>& dst, const LocalTensor<U>& src, const LocalTensor<S>& cbufWorkspace, const FixpipeParamsM300& intriParams)
传 入FixpipeParamsArch3510
通 路CO1->L1 Buffer,不 使 能tensor量 化 功 能
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> __aicore__ inline void Fixpipe(const LocalTensor<T>& dst, const LocalTensor<U>& src, const FixpipeParamsArch3510<config.format>& intriParams)通 路CO1->L1 Buffer,使 能tensor量 化 功 能
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> __aicore__ inline void Fixpipe(const LocalTensor<T>& dst, const LocalTensor<U>& src, const LocalTensor<uint64_t>& cbufWorkspace, const FixpipeParamsArch3510<config.format>& intriParams)通 路CO1->UB,不 使 能tensor量 化 功 能:
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> __aicore__ inline void Fixpipe(const LocalTensor<T>& dst, const LocalTensor<U>& src, const FixpipeParamsArch3510<config.format>& intriParams)通 路CO1->UB,使 能tensor量 化 功 能:
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> __aicore__ inline void Fixpipe(const LocalTensor<T>& dst, const LocalTensor<U>& src, const LocalTensor<uint64_t>& cbufWorkspace, const FixpipeParamsArch3510<config.format>& intriParams)通 路CO1->GM,不 使 能tensor量 化 功 能:
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> __aicore__ inline void Fixpipe(const GlobalTensor<T>& dst, const LocalTensor<U>& src, const FixpipeParamsArch3510<config.format>& intriParams)通 路CO1->GM,使 能tensor量 化 功 能:
Texttemplate <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> __aicore__ inline void Fixpipe(const GlobalTensor<T>& dst, const LocalTensor<U>& src, const LocalTensor<uint64_t>& cbufWorkspace, const FixpipeParamsArch3510<config.format>& intriParams)
参 数 说 明
表 1 模 板 参 数 说 明
Fixpipe相 关 配 置 参 数,类 型 为FixpipeConfig。取 值 如 下:
struct FixpipeConfig {
CO2Layout format;
bool isToUB; // 用 于 用 户 指 定 目 的 地 址 的 位 置 是 否 是UB
};
enum class CO2Layout : uint8_t {
NZ = 0, // 输 出 数 据 格 式 仍 为NZ格 式。
ROW_MAJOR, // 使 能NZ2ND,输 出 数 据 格 式 为ND格 式。
COLUMN_MAJOR, // 使 能NZ2DN,输 出 数 据 格 式 为DN格 式。
};
constexpr FixpipeConfig CFG_NZ = {CO2Layout::NZ};
constexpr FixpipeConfig CFG_ROW_MAJOR = {CO2Layout::ROW_MAJOR};
constexpr FixpipeConfig CFG_COLUMN_MAJOR = {CO2Layout::COLUMN_MAJOR}; | |
|
表 2 参 数 说 明
目 的 操 作 数,类 型 为LocalTensor或GlobalTensor。
| ||
源 操 作 数,支 持 的TPosition为CO1,为Mmad接 口 计 算 的 结 果,类 型 为LocalTensor数 据 结 构 的 定 义 请 参 考LocalTensor。支 持 的 数 据 类 型 为float/int32_t,支 持 的TPosition为CO1,数 据 格 式 为NZ格 式。起 始 地 址 需 要 满 足64B对 齐。 | ||
Fixpipe搬 运 参 数,具 体 定 义 请 参 考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_fixpipe.h,${INSTALL_DIR}请 替 换 为CANN软 件 安 装 后 文 件 存 储 路 径。 参 数 说 明 请 参 考表3。 | ||
量 化 参 数,类 型 为LocalTensor<uint64_t>,支 持 的TPosition为A1。仅 当quantPre为VDEQF16/VQF322B8_PRE/VREQ8时 支 持,quantPre介 绍 请 参 考FixpipeParamsV220/FixpipeParamsM300结 构 体 中quantPre部 分。 |
表 3 Fixpipe搬 运 参 数(FixpipeParamsV220/FixpipeParamsM300)结 构 体 说 明
表 4 FixpipeParamsArch3510结 构 体 参 数 说 明
| ||
| ||
源NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,取 值 范 围:srcStride∈[0, 65535], 单 位:C0_Size(16*sizeof(T), T为src的 数 据 类 型)。 | ||
QuantMode_t是 一 个 枚 举 类 型,用 于 控 制 量 化 模 式,默 认 值 为QuantMode_t::NoQuant,即 不 使 能 量 化 功 能。QuantMode_t取 值 如 下:
| ||
scalar量 化 参 数,表 示 单 个scale值,quantPre量 化 模 式 为scalar量 化 时 需 要 设 置 该 参 数。支 持 的 数 据 类 型 为uint64_t。 | ||
unitFlag是 一 种Mmad指 令 和Fixpipe指 令 细 粒 度 的 并 行,使 能 该 功 能 后,硬 件 每 计 算 完 一 个 分 形,计 算 结 果 就 会 被 搬 出,该 功 能 不 适 用 于 在L0C Buffer累 加 的 场 景。取 值 说 明 如 下: 2:使 能unitFlag,硬 件 执 行 完 指 令 之 后,不 会 设 置 寄 存 器; | ||
params是 类 型 为TransformParams的 成 员 变 量,TransformParams结 构 体 是 一 个 基 于 模 板 参 数 的 类 型 选 择 器,用 于 在 编 译 时 根 据 不 同 的CO2Layout布 局 类 型,自 动 选 择 对 应 的 参 数 类 型。 template <CO2Layout format>
struct TransformParams {};
template <>
struct TransformParams<CO2Layout::NZ> {
__aicore__ inline TransformParams(){};
using PARAMS = uint8_t;
};
template <>
struct TransformParams<CO2Layout::ROW_MAJOR> {
__aicore__ inline TransformParams(){};
using PARAMS = Nz2NdParams;
};
template <>
struct TransformParams<CO2Layout::COLUMN_MAJOR> {
__aicore__ inline TransformParams(){};
using PARAMS = Nz2DnParams;
};
| ||
双 目 标 模 式 控 制。当 启 用 双 目 标 模 式 控 制 时,L0C中 的M×N矩 阵 将 被 分 成 两 半,并 同 时 写 入 两 个 子 块(SUB BLOCK)的UB中,其 中 前 半 部 分 写 入SUB BLOCK0,后 半 部 分 写 入SUB BLOCK1。 2'b00:单 目 标 模 式,将 整 个 矩 阵 写 入 通 过subBlockId参 数 配 置 的 目 标UB。 2'b01:双 目 标 模 式,按M维 度 拆 分,M / 2 * N写 入 每 个UB, M必 须 为2的 倍 数。 2'b10:双 目 标 模 式,按N维 度 拆 分,M * N / 2写 入 每 个UB, N须 为32的 倍 数。 dualDstCtrl仅 支 持 在 普 通 搬 运 模 式 或NZ2ND搬 运 场 景 下 使 用,不 支 持 随 路 功 能 场 景。 | ||
是 否 使 能 通 道 拆 分 的 功 能。默 认 为false,不 使 能 该 功 能。仅 在src和dst都 为float时 才 能 使 能 通 道 拆 分,且 不 能 同 时 使 能ChannelSplit和NZ2ND功 能。 |
不 使 能NZ2ND的 情 况 下,参 数 设 置 示 例(通 过Fixpipe接 口 搬 运 并 去 除dummy数 据)和 解 释 说 明 如 下:
当M方 向 上 的 数 据 元 素 个 数 不 是16的 倍 数 时,搬 入 时 会 额 外 读 取dummy数 据,并 在 写 入 目 标 位 置 后 丢 弃 这 些dummy数 据。矩 阵 块 被 定 义 为 连 续 的16*16的 数 据 块,数 据 块 的 个 数 为M/16向 上 取 整, 矩 阵 块 的 长 度 为M*16*sizeof(T),T是 数 据 类 型。
单 搬 运 模 式:
- nSize = 48,表 示 源NZ矩 阵 中 待 搬 运 矩 阵(图 中 蓝 色 区 域)在N方 向 上 的 大 小 为48个 元 素。
- mSize = 24,表 示 源NZ矩 阵 中 待 搬 运 矩 阵 在M方 向 上 的 大 小 为24个 元 素。
- srcStride = 64,表 示 源NZ矩 阵 中 待 搬 运 矩 阵 相 邻Z排 布 的 起 始 地 址 偏 移,即 下 图 中 第 一 个 蓝 色Z排 布 的 起 始 地 址 与 第 二 个 蓝 色Z排 布 的 起 始 地 址 之 间 的 间 隔 为64 * C0_Size。
- dstStride = 40 * C0,表 示 目 的NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,即 下 图 中 第 一 个 蓝 色Z排 布 的 起 始 地 址 与 第 二 个 蓝 色Z排 布 的 起 始 地 址 之 间 的 间 隔 为40 * 16个 元 素。
图 1 不 使 能NZ2ND参 数 的 单 搬 运 模 式 设 置 示 意 图、
双 目 标 控 制 模 式:
在 普 通 搬 运 模 式 模 式 下 启 用 双 目 标 模 式 如 下 图 所 示,分 为 按M维 度 拆 分 和 按N维 度 拆 分,按M维 度 拆 分M必 须 为2的 倍 数,按N维 度 拆 分N必 须 为2的 倍 数:
N方 向 切 分:
- nSize = 32,表 示 源NZ矩 阵 中 待 搬 运 矩 阵 在N方 向 上 的 大 小 为32个 元 素。
- mSize = 48,表 示 源NZ矩 阵 中 待 搬 运 矩 阵 在M方 向 上 的 大 小48个 元 素。
- srcStride = 64,表 示 源NZ矩 阵 中 待 搬 运 矩 阵 相 邻Z排 布 的 起 始 地 址 偏 移,即 下 图 中 第 一 个 块Z排 布 矩 阵 的 起 始 地 址 与 第 二 个Z排 布 矩 阵 的 起 始 地 址 之 间 的 间 隔 为64 * C0_Size。
- dstStride = 64 * C0,表 示 目 的NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,即 下 图 中UB0中Z排 布 的 起 始 地 址 与UB1中Z排 布 的 起 始 地 址 之 间 的 间 隔 为64 * 16个 元 素。
M方 向 切 分:
- nSize = 32,表 示 源NZ矩 阵 中 待 搬 运 矩 阵 在N方 向 上 的 大 小 为32个 元 素。
- mSize = 24,表 示 源NZ矩 阵 中 待 搬 运 矩 阵 在M方 向 上 的 大 小 为48个 元 素。
- srcStride = 64,表 示 源NZ矩 阵 中 待 搬 运 矩 阵 相 邻Z排 布 的 起 始 地 址 偏 移,即 下 图 中 第 一 个 块Z排 布 矩 阵 的 起 始 地 址 与 第 二 个Z排 布 矩 阵 的 起 始 地 址 之 间 的 间 隔 为64 * C0_Size。
- dstStride = 40 * C0,表 示 目 的NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,即 下 图 中UB0(或UB1)中 第 一 个Z排 布 的 起 始 地 址 与 第 二 个Z排 布 的 起 始 地 址 之 间 的 间 隔 为40 * 16个 元 素。
图 2 不 使 能NZ2ND参 数 和NZ2DN参 数 的 双 目 标 搬 运 模 式 设 置 示 意 图
使 能NZ2ND的 情 况 下,参 数 设 置 示 例 和 解 释 说 明 如 下:
ndNum = 2,表 示 源NZ矩 阵 的 数 目 为2。图 中 蓝 色 区 域 为NZ矩 阵1,紫 色 区 域 为NZ矩 阵2。
nSize = 32,表 示 源NZ矩 阵(图 中 蓝 色 区 域)在N方 向 上 的 大 小 为32个 元 素。
mSize = 48,表 示 源NZ矩 阵 在M方 向 上 的 大 小 为48个 元 素。
srcStride = 64,表 示 源NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,即 下 图 中 第 一 个 蓝 色Z排 布 的 起 始 地 址 与 第 二 个 蓝 色Z排 布 的 起 始 地 址 之 间 的 间 隔 为64 * C0_Size。
dstStride = 64,表 示 目 的ND矩 阵 每 一 行 中 的 元 素 个 数 为64。
srcNdStride = 16, 表 示 不 同NZ矩 阵 起 始 地 址 之 间 的 间 隔 为16 * 16 * C0_Size。
dstNdStride = 4096,表 示 目 的 相 邻ND矩 阵 起 始 地 址 之 间 的 偏 移 为4096个 元 素。
单 搬 入 模 式
ndNum = 2,表 示 源NZ矩 阵 的 数 目 为2。图 中 蓝 色 区 域 为NZ矩 阵1,紫 色 区 域 为NZ矩 阵2。
nSize = 32,表 示 源NZ矩 阵(图 中 蓝 色 区 域)在N方 向 上 的 大 小 为32个 元 素。
mSize = 48,表 示 源NZ矩 阵 在M方 向 上 的 大 小 为48个 元 素。
srcStride = 64,表 示 源NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,即 下 图 中 第 一 个 蓝 色Z排 布 的 起 始 地 址 与 第 二 个 蓝 色Z排 布 的 起 始 地 址 之 间 的 间 隔 为64 * C0_Size。
dstStride = 64,表 示 目 的ND矩 阵 每 一 行 中 的 元 素 个 数 为64。
srcNdStride = 256, 表 示 不 同NZ矩 阵 起 始 地 址 之 间 的 间 隔 为256,单 位 为C0_Size。
dstNdStride = 4096,表 示 目 的 相 邻ND矩 阵 起 始 地 址 之 间 的 偏 移 为4096个 元 素。
图 4 使 能NZ2ND参 数 的 单 搬 入 模 式 设 置 示 意 图
双 搬 入 模 式
ndNum = 2,表 示 源NZ矩 阵 的 数 目 为2。图 中 红 框 区 域 为 矩 阵1,蓝 框 区 域 为 矩 阵2。
nSize = 32,表 示 源NZ矩 阵(图 中 红 框 区 域 或 蓝 框 区 域)在N方 向 上 的 大 小 为32个 元 素。
mSize = 48,表 示 源NZ矩 阵 在M方 向 上 的 大 小 为48个 元 素。
srcStride = 64,表 示 源NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,即 下 图 红 框 区 域 中 左 侧 浅 色Z排 布 矩 阵 的 起 始 地 址 与 右 侧 深 色Z排 布 矩 阵 的 起 始 地 址 之 间 的 间 隔 为64 * C0_Size。
dstStride = 64,表 示 目 的ND矩 阵 每 一 行 中 的 元 素 个 数 为64。
ndNum = 2, 表 示 源NZ矩 阵 的 数 目。
srcNdStride = 240 , 表 示 不 同NZ矩 阵 起 始 地 址 之 间 的 间 隔 为240 * C0_Size。
dstNdStride = 4096,表 示 目 的 相 邻ND矩 阵 起 始 地 址 之 间 的 偏 移 为4096个 元 素。
使 能NZ2DN的 情 况 下,参 数 设 置 示 例 和 解 释 说 明 如 下:
单 搬 运 模 式:
dnNum = 2,表 示 源NZ矩 阵 的 数 目 为2。图 中 蓝 色 区 域 为NZ矩 阵1,紫 色 区 域 为NZ矩 阵2。
nSize = 32,表 示 源NZ矩 阵(图 中 蓝 色 区 域)在N方 向 上 的 大 小 为32个 元 素。
mSize = 48,表 示 源NZ矩 阵 在M方 向 上 的 大 小 为48个 元 素。
srcStride = 80,表 示 源NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,即 下 图 中 相 邻 两 块 蓝 色Z排 布 的 起 始 地 址 之 间 的 间 隔 为80 * C0_Size。
dstStride = 80,表 示 目 的DN矩 阵 每 一 行 中 的 元 素 个 数 为80。
ndNum = 2, 表 示 源NZ矩 阵 的 数 目。
srcNzMatrixStride = 240,表 示 不 同 源NZ矩 阵 的 偏 移,即 下 图 中 第 一 个 蓝 色Z排 布 的 起 始 地 址 和 第 二 个 紫 色Z排 布 的 起 始 地 址 之 间 的 间 隔 为240 * C0_Size。
srcNzC0Stride = 1:表 示 源 矩 阵NZ分 形 相 邻 行 的 地 址 偏 移,。
dstDnMatrixStride:表 示 相 邻DN矩 阵 起 始 地 址 间 的 偏 移 为48 * 80 =3840个 元 素。
单 搬 运 模 式:
dnNum = 2,表 示 源NZ矩 阵 的 数 目 为2。图 中 蓝 色 区 域 为NZ矩 阵1,红 色 区 域 为NZ矩 阵2。
nSize = 24,表 示 源NZ矩 阵(图 中 蓝 色 区 域)在N方 向 上 的 大 小 为24个 元 素。
mSize = 24,表 示 源NZ矩 阵 在M方 向 上 的 大 小 为24个 元 素。
srcStride = 80,表 示 源NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,即 下 图 中 相 邻 两 块 蓝 色Z排 布 的 起 始 地 址 之 间 的 间 隔 为80 * C0_Size。
dstStride = 60,表 示 目 的DN矩 阵 每 一 行 中 的 元 素 个 数 为80。
ndNum = 2, 表 示 源NZ矩 阵 的 数 目。
srcNzMatrixStride = 240,表 示 不 同 源NZ矩 阵 的 偏 移,即 下 图 中 第 一 个 蓝 色Z排 布 的 起 始 地 址 和 第 二 个 紫 色Z排 布 的 起 始 地 址 之 间 的 间 隔 为240 * C0_Size。
srcNzC0Stride = 2:表 示 源 矩 阵NZ分 形 相 邻 行 的 地 址 偏 移。
dstDnMatrixStride:表 示 相 邻DN矩 阵 起 始 地 址 间 的 偏 移 为48 * 60 = 2880个 元 素。
约 束 说 明
- ndNum=0 表 示 不 执 行,此 指 令 将 不 被 执 行 并 报warning。
- 对 于 量 化 输 入 为float32数 据 类 型 的 说 明 如 下:
- 标 准 的IEEE 754 float32格 式 为:1bit符 号 位,8bits指 数 位,23bits尾 数 位;当 前AI处 理 器 支 持 的float32格 式 为:1bit符 号 位,8bits指 数 位,10bits尾 数 位。
- 如 果 用 户 提 供 的 是 标 准 的IEEE 754 float32输 入,API内 部 会 处 理 成 处 理 器 支 持 的float32格 式 进 行 计 算,此 时 如 果golden数 据 生 成 过 程 中 使 用 的 是 标 准 的IEEE 754 float32数 据,则 可 能 引 入 精 度 不 匹 配 问 题,需 要 修 正golden数 据 的 生 成,将 量 化 参 数 的23bits尾 数 位 的 低13bits数 据 位 清 零 再 参 与 量 化 计 算。
调 用 示 例
示 例 一:通 路CO1->GM。输 入A矩 阵 和B矩 阵 的 数 据 类 型 为half,输 出C矩 阵 为float,默 认 配 置 使 能Nz2Nd的 格 式 转 换。完 整 样 例 可 以 参 考样 例 链 接。
TextAscendC::GlobalTensor<outputType> cGM; cGM.SetGlobalBuffer((__gm__ outputType *)c); #if defined(__NPU_ARCH__) && (__NPU_ARCH__ == 2201) AscendC::FixpipeParamsV220 fixpipeParams; fixpipeParams.ndNum = 1; fixpipeParams.srcNdStride = 0; fixpipeParams.dstNdStride = 0; #elif defined(__NPU_ARCH__) && (__NPU_ARCH__ == 3510) AscendC::FixpipeParamsArch3510<AscendC::CO2Layout::ROW_MAJOR> fixpipeParams; #endif fixpipeParams.mSize = baseM; fixpipeParams.srcStride = CeilAlign(baseM, CUBE_BLOCK); fixpipeParams.nSize = baseN; fixpipeParams.dstStride = baseN; AscendC::Fixpipe<outputType, l0cType, AscendC::CFG_ROW_MAJOR>(cGM, c, fixpipeParams);示 例 二:通 路CO1->C1。输 入A矩 阵 和B矩 阵 的 数 据 类 型 为half,输 出C矩 阵 为int8_t,不 使 能Nz2Nd的 格 式 转 换,使 能Scalar量 化。完 整 样 例 可 以 参 考样 例 链 接。
TextAscendC::LocalTensor<outputType> c1Local(AscendC::TPosition::C1, c1Addr, cSizeAlignL1); #if defined(__NPU_ARCH__) && (__NPU_ARCH__ == 2201) uint16_t c0Size = 32; AscendC::FixpipeParamsV220 fixpipeParams; // NZ2NZ场 景,FixpipeParamsV220的dstStride单 位 为datablock(32Bytes) fixpipeParams.dstStride = baseM * c0Size * sizeof(outputType) / AscendC::ONE_BLK_SIZE; fixpipeParams.mSize = baseM; fixpipeParams.srcStride = CeilAlign(baseM, CUBE_BLOCK); fixpipeParams.nSize = baseN; // scalar quant fixpipeParams.quantPre = QuantMode_t::QF322B8_PRE; uint64_t deqScalar = static_cast<uint64_t>(*reinterpret_cast<int32_t *>(&quantScalar)); constexpr bool sign = (AscendC::IsSameType<outputType, int8_t>::value) ? true : false; deqScalar = (deqScalar & ~(static_cast<uint64_t>(1) << 46)) | (static_cast<uint64_t>(sign) << 46); fixpipeParams.deqScalar = deqScalar; AscendC::Fixpipe<outputType, l0cType, AscendC::CFG_NZ>(c1Local, c, fixpipeParams); // copy L1 to GM,针 对Atlas A2/A3系 列 产 品,支 持 从L1直 接 搬 出 到GM AscendC::PipeBarrier<PIPE_ALL>(); AscendC::DataCopyParams dataCopyInfo; dataCopyInfo.blockCount = 1; dataCopyInfo.blockLen = baseM * baseN * sizeof(outputType) / AscendC::ONE_BLK_SIZE; AscendC::DataCopy(cGM, c1Local, dataCopyInfo); #elif defined(__NPU_ARCH__) && (__NPU_ARCH__ == 3510) uint16_t c0Size = 32; AscendC::FixpipeParamsArch3510<AscendC::CO2Layout::NZ> fixpipeParams; // NZ2NZ场 景,FixpipeParamsArch3510的dstStride单 位 为 元 素 个 数 fixpipeParams.dstStride = baseM * c0Size; fixpipeParams.mSize = baseM; fixpipeParams.srcStride = CeilAlign(baseM, CUBE_BLOCK); fixpipeParams.nSize = baseN; // scalar quant fixpipeParams.quantPre = QuantMode_t::QF322B8_PRE; uint64_t deqScalar = static_cast<uint64_t>(*reinterpret_cast<int32_t *>(&quantScalar)); constexpr bool sign = (AscendC::IsSameType<outputType, int8_t>::value) ? true : false; deqScalar = (deqScalar & ~(static_cast<uint64_t>(1) << 46)) | (static_cast<uint64_t>(sign) << 46); fixpipeParams.deqScalar = deqScalar; AscendC::Fixpipe<outputType, l0cType, AscendC::CFG_NZ>(c1Local, c, fixpipeParams); #endif示 例 三:通 路CO1->UB。输 入A矩 阵 和B矩 阵 的 数 据 类 型 为half,输 出C矩 阵 为float,默 认 配 置 使 能Nz2Nd的 格 式 转 换。完 整 样 例 可 以 参 考样 例 链 接。
TextAscendC::LocalTensor<outputType> cUB; cUB = AscendC::LocalTensor<outputType>(AscendC::TPosition::VECOUT, 0, cSingleSize); AscendC::FixpipeParamsArch3510<AscendC::CO2Layout::ROW_MAJOR> fixpipeParams; fixpipeParams.mSize = baseM; fixpipeParams.nSize = baseN; fixpipeParams.srcStride = CeilAlign(baseM, CUBE_BLOCK); fixpipeParams.dstStride = baseN; AscendC::Fixpipe<outputType, l0cType, CFG_ROW_MAJOR_UB>(cUB, c, fixpipeParams);



