Skip to content
版 本

Fixpipe

产 品 支 持 情 况

产 品

是 否 支 持

Ascend 950PR/Ascend 950DT

支 持 包 含FixpipeParamsV220/FixpipeParamsArch3510参 数 的 接 口。

Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品

仅 支 持 包 含FixpipeParamsV220参 数 的 接 口。

Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品

仅 支 持 包 含FixpipeParamsV220参 数 的 接 口。

Atlas 200I/500 A2 推 理 产 品

仅 支 持 包 含FixpipeParamsM300参 数 的 接 口。

Atlas 推 理 系 列 产 品AI Core

x

Atlas 推 理 系 列 产 品Vector Core

x

Atlas 训 练 系 列 产 品

x

Kirin X90

Kirin 9030

功 能 说 明

矩 阵 计 算 完 成 后,对 结 果 进 行 处 理,例 如 对 计 算 结 果 进 行 量 化 操 作,并 把 数 据 从CO1搬 迁 到Global Memory中。

示 意 图 如 下:

说 明

上 图 中Fixpipe Buffer->UB->L1 Buffer的 接 口,仅 在NPU_ARCH 351x版 本 支 持。

其 中,FixPipe Buffer不 同 的 量 化 模 式 对 应 的 内 存 排 布 如 下:

函 数 原 型

  • 传 入FixpipeParamsV220

    • 通 路CO1->GM,不 使 能tensor量 化 功 能:

      Text
      template <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量 化 功 能:

      Text
      template <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量 化 功 能:

      Text
      template <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量 化 功 能:

      Text
      template <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量 化 功 能:

      Text
      template <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量 化 功 能:

      Text
      template <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量 化 功 能

      Text
      template <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量 化 功 能

      Text
      template <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量 化 功 能:

      Text
      template <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量 化 功 能:

      Text
      template <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量 化 功 能:

      Text
      template <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量 化 功 能:

      Text
      template <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 模 板 参 数 说 明

参 数 名

描 述

T

目 的 操 作 数 数 据 类 型。

U

源 操 作 数 数 据 类 型。

config

Fixpipe相 关 配 置 参 数,类 型 为FixpipeConfig。取 值 如 下:

  • CFG_ROW_MAJOR(默 认 取 值):使 能NZ2ND,输 出 数 据 格 式 为ND格 式。
  • CFG_NZ: 不 使 能NZ2ND,输 出 数 据 格 式 为NZ格 式。
  • CFG_COLUMN_MAJOR:使 能NZ2DN,输 出 数 据 格 式 为DN格 式。
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};

S

cbufWorkspace的 数 据 类 型。

  • 当 目 的 操 作 数、源 操 作 数、cbufWorkspace使 用 基 础 数 据 类 型 时,模 板 参 数S必 须 为uint64_t类 型,否 则 编 译 失 败。
  • 当 目 的 操 作 数、源 操 作 数、cbufWorkspace使 用TensorTrait类 型 时,模 板 参 数S的LiteType必 须 为uint64_t类 型,否 则 编 译 失 败。

模 板 参 数S后 一 个 模 板 参 数 仅 用 于 上 述 数 据 类 型 检 查,用 户 无 需 关 注。

表 2 参 数 说 明

参 数 名 称

输 入/输 出

含 义

dst

输 出

目 的 操 作 数,类 型 为LocalTensorGlobalTensor

  • 针 对LocalTensor:

    Atlas 200I/500 A2 推 理 产 品,支 持 的 数 据 类 型 为:int8_t、uint8_t、half、bfloat16_t、float、half、int32_t。

    Ascend 950PR/Ascend 950DT,支 持 的 数 据 类 型 为:int8_t、uint8_t、half、bfloat16_t、float、half、int32_t。

  • 针 对GlobalTensor:

    Ascend 950PR/Ascend 950DT,支 持 的 数 据 类 型 为:int8_t、uint8_t、hifloat8_t、fp8_e4m3fn_t、half、bfloat16_t、int32_t、float。

    Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品,支 持 的 数 据 类 型 为:int8_t、uint8_t、half、bfloat16_t、int32_t、float。

    Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品,支 持 的 数 据 类 型 为:int8_t、uint8_t、half、bfloat16_t、int32_t、float。

    Atlas 200I/500 A2 推 理 产 品,支 持 的 数 据 类 型 为:int8_t、uint8_t、half、bfloat16_t、int32_t、float。

    Kirin X90,支 持 的 数 据 类 型 为:int8_t、half、int32_t。

    Kirin 9030,支 持 的 数 据 类 型 为:half。

    数 据 格 式 为NZ或ND或DN格 式。经 过Fixpipe处 理,在 量 化 操 作 之 后,会 将 矩 阵 计 算 中 多 申 请 的 数 据 删 除。

src

输 入

源 操 作 数,支 持 的TPosition为CO1,为Mmad接 口 计 算 的 结 果,类 型 为LocalTensor数 据 结 构 的 定 义 请 参 考LocalTensor。支 持 的 数 据 类 型 为float/int32_t,支 持 的TPosition为CO1,数 据 格 式 为NZ格 式。起 始 地 址 需 要 满 足64B对 齐。

intriParams

输 入

Fixpipe搬 运 参 数,具 体 定 义 请 参 考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_fixpipe.h,${INSTALL_DIR}请 替 换 为CANN软 件 安 装 后 文 件 存 储 路 径。

参 数 说 明 请 参 考表3

cbufWorkspace

输 入

量 化 参 数,类 型 为LocalTensor<uint64_t>,支 持 的TPosition为A1。仅 当quantPre为VDEQF16/VQF322B8_PRE/VREQ8时 支 持,quantPre介 绍 请 参 考FixpipeParamsV220/FixpipeParamsM300结 构 体 中quantPre部 分。

表 3 Fixpipe搬 运 参 数(FixpipeParamsV220/FixpipeParamsM300)结 构 体 说 明

参 数 名 称

数 据 类 型

含 义

nSize

输 入

源NZ矩 阵 在N方 向 上 的 大 小。

  • 不 使 能NZ2ND功 能

    若 使 能channelSplit功 能,nSize必 须 为8的 倍 数,取 值 范 围:nSize∈[1, 4095]。

    若 不 使 能channelSplit功 能,nSize必 须 为16的 倍 数,取 值 范 围:nSize∈[1, 4095]。

  • 使 能NZ2ND功 能

    nSize取 值 范 围 ∈[1, 4095]。

mSize

输 入

源NZ矩 阵 在M方 向 上 的 大 小。

  • 不 使 能NZ2ND功 能

    取 值 范 围:mSize∈[1, 65535]。

  • 使 能NZ2ND功 能

    取 值 范 围:mSize∈[1, 8192]。

srcStride

输 入

源NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,取 值 范 围:srcStride∈[0, 65535], 单 位:C0_Size(16*sizeof(T),T为src的 数 据 类 型)。

dstStride

输 入

  • 不 使 能NZ2ND功 能

    目 的NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,取 值 不 为0, 单 位:datablock(32Bytes)。

  • 使 能NZ2ND功 能

    目 的ND矩 阵 每 一 行 中 的 元 素 个 数,取 值 不 为0 ,单 位:element。

quantPre

输 入

QuantMode_t是 一 个 枚 举 类 型,用 于 控 制 量 化 模 式,默 认 值 为QuantMode_t::NoQuant,即 不 使 能 量 化 功 能。QuantMode_t取 值 如 下:

  • NoQuant,不 使 能 量 化 功 能
  • F322F16,float cast成half,cast mode为CAST_RINT模 式
  • F322BF16,float cast成bfloat16_t,cast mode为CAST_RINT模 式
  • DEQF16,int32_t量 化 成half,scalar量 化
  • VDEQF16, int32_t量 化 成half,tensor量 化
  • QF322B8_PRE,float量 化 成uint8_t/int8_t,scalar量 化
  • VQF322B8_PRE,float量 化 成uint8_t/int8_t,tensor量 化
  • REQ8,int32_t量 化 成uint8_t/int8_t,scalar量 化
  • VREQ8,int32_t量 化 成uint8_t/int8_t,tensor量 化

deqScalar

输 入

scalar量 化 参 数,表 示 单 个scale值,quantPre量 化 模 式 为scalar量 化 时 需 要 设 置 该 参 数。支 持 的 数 据 类 型 为uint64_t。

ndNum

输 入

源NZ矩 阵 的 数 目,也 就 是 传 输ND矩 阵 的 数 目,取 值 范 围:ndNum∈[1, 65535]

srcNdStride

输 入

不 同NZ矩 阵 起 始 地 址 之 间 的 间 隔,取 值 范 围:srcNdStride∈[1, 512],单 位:数 据 块(16 * C0_Size)。当ndNum配 置 为1时,srcNdStride配 置 为0即 可,不 生 效。

dstNdStride

输 入

目 的 相 邻ND矩 阵 起 始 地 址 之 间 的 偏 移,取 值 范 围:dstNdstride∈[1, 65535],单 位:element。当ndNum配 置 为1时,dstNdStride配 置 为0即 可,不 生 效。

reluEn

输 入

是 否 使 能relu的 开 关,false:不 使 能relu功 能;true:使 能relu功 能。

unitFlag

输 入

unitFlag是 一 种Mmad指 令 和Fixpipe指 令 细 粒 度 的 并 行,使 能 该 功 能 后,硬 件 每 计 算 完 一 个 分 形,计 算 结 果 就 会 被 搬 出,该 功 能 不 适 用 于 在L0C Buffer累 加 的 场 景。取 值 说 明 如 下:

0:保 留 值;

2:使 能unitFlag,硬 件 执 行 完 指 令 之 后,不 会 设 置 寄 存 器;

3:使 能unitFlag,硬 件 执 行 完 指 令 之 后,会 将unitFlag关 闭。

使 能 该 功 能 时,Fixpipe指 令 的unitFlag设 置 为3即 可。

isChannelSplit

输 入

是 否 使 能 通 道 拆 分 的 功 能。默 认 为false,不 使 能 该 功 能。仅 在src和dst都 为float时 才 能 使 能 通 道 拆 分,且 不 能 同 时 使 能ChannelSplit和NZ2ND功 能。

表 4 FixpipeParamsArch3510结 构 体 参 数 说 明

参 数 名 称

数 据 类 型

含 义

nSize

输 入

源NZ矩 阵 在N方 向 上 的 大 小。

  • 不 使 能NZ2ND功 能

    若 使 能channelSplit功 能,nSize必 须 为8的 倍 数,取 值 范 围:nSize∈[1, 4095]。

    若 不 使 能channelSplit功 能,nSize必 须 为16的 倍 数,取 值 范 围:nSize∈[1, 4095]。

  • 使 能NZ2ND功 能

    nSize取 值 范 围 ∈[1, 4095]。

    • 通 路CO1->UB/L1,nSize*sizeof(T)必 须 为32的 倍 数。

mSize

输 入

源NZ矩 阵 在M方 向 上 的 大 小。

取 值 范 围:mSize∈[1, 65535]。

  • 使 能NZ2DN功 能,通 路CO1->UB/L1,mSize*sizeof(T)必 须 为32的 倍 数

srcStride

输 入

源NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,取 值 范 围:srcStride∈[0, 65535], 单 位:C0_Size(16*sizeof(T), T为src的 数 据 类 型)。

dstStride

输 入

  • 不 使 能NZ2ND功 能

    目 的NZ矩 阵 中 相 邻Z排 布 的 起 始 地 址 偏 移,取 值 不 为0, 单 位:element。

  • 使 能NZ2ND/NZ2DN功 能

    目 的ND矩 阵 每 一 行 中 的 元 素 个 数,取 值 不 为0 ,单 位:element。

quantPre

输 入

QuantMode_t是 一 个 枚 举 类 型,用 于 控 制 量 化 模 式,默 认 值 为QuantMode_t::NoQuant,即 不 使 能 量 化 功 能。QuantMode_t取 值 如 下:

  • NoQuant,不 使 能 量 化 功 能
  • F322F16,float cast成half,cast mode为CAST_RINT模 式
  • F322BF16,float cast成bfloat16_t,cast mode为CAST_RINT模 式
  • DEQF16,int32_t量 化 成half, scalar量 化
  • VDEQF16,int32_t量 化 成half,tensor量 化
  • QF322B8_PRE,float量 化 成uint8_t/int8_t,scalar量 化
  • VQF322B8_PRE,float量 化 成uint8_t/int8_t,tensor量 化
  • REQ8,int32_t量 化 成uint8_t/int8_t,scalar量 化
  • VREQ8,int32_t量 化 成uint8_t/int8_t,tensor量 化
  • QF322FP8_PRE,float量 化 成fp8_e4m3fn_t,scalar量 化
  • VQF322FP8_PRE,float量 化 成fp8_e4m3fn_t,tensor量 化
  • QF322HIF8_PRE,float量 化 成hifloat8_t(Half to Away Round),scalar量 化
  • VQF322HIF8_PRE,float量 化 成hifloat8_t(Half to Away Round),tensor量 化
  • QF322HIF8_PRE_HYBRID,float量 化 成hifloat8_t(Hybrid Round),scalar量 化
  • VQF322HIF8_PRE_HYBRID,float量 化 成hifloat8_t(Hybrid Round),tensor量 化
  • QS322BF16_PRE,int32_t量 化 成bfloat16_t,scalar量 化
  • VQS322BF16_PRE,int32_t量 化 成bfloat16_t,tensor量 化
  • QF322F16_PRE,float量 化 成half,scalar量 化
  • VQF322F16_PRE,float量 化 成half,tensor量 化
  • QF322BF16_PRE,float量 化 成bfloat16_t,scalar量 化
  • VQF322BF16_PRE,float量 化 成bfloat16_t,tensor量 化
  • QF322F32_PRE,float量 化 成float,scalar量 化,该 量 化 模 式 精 度 无 法 达 到 双 万 分 之 一,可 以 达 到 双 千 分 之 一。如 果 有 双 万 分 之 一 的 精 度 要 求,建 议 使 用AscendDeQuant高 阶API。
  • VQF322F32_PRE,float量 化 成float,tensor量 化,该 量 化 模 式 精 度 无 法 达 到 双 万 分 之 一,可 以 达 到 双 千 分 之 一。如 果 有 双 万 分 之 一 的 精 度 要 求,建 议 使 用AscendDeQuant高 阶API。

deqScalar

输 入

scalar量 化 参 数,表 示 单 个scale值,quantPre量 化 模 式 为scalar量 化 时 需 要 设 置 该 参 数。支 持 的 数 据 类 型 为uint64_t。

reluEn

输 入

是 否 使 能relu的 开 关,false:不 使 能relu功 能;true:使 能relu功 能。

unitFlag

输 入

unitFlag是 一 种Mmad指 令 和Fixpipe指 令 细 粒 度 的 并 行,使 能 该 功 能 后,硬 件 每 计 算 完 一 个 分 形,计 算 结 果 就 会 被 搬 出,该 功 能 不 适 用 于 在L0C Buffer累 加 的 场 景。取 值 说 明 如 下:

0:保 留 值;

2:使 能unitFlag,硬 件 执 行 完 指 令 之 后,不 会 设 置 寄 存 器;

3:使 能unitFlag,硬 件 执 行 完 指 令 之 后,会 将unitFlag关 闭。

使 能 该 功 能 时,Fixpipe指 令 的unitFlag设 置 为3即 可。

params

输 入

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

CO2Layout 布 局 类 型 如 下:

  • ROW_MAJOR

    当 启 用 该 模 式 时, 该 指 令 被 定 义 为 从L0C到 目 标 位 置 的 数 据 移 动,并 附 带NZ2ND转 换。

    struct Nz2NdParams {
        uint16_t ndNum = 1;
        uint16_t srcNdStride = 0;
        uint32_t dstNdStride = 0; 
    };

    ndNum: 源NZ矩 阵 的 数 目,也 就 是 传 输ND矩 阵 的 数 目,取 值 范 围:ndNum∈[1, 65535]。

    srcNdStride: 不 同NZ矩 阵 起 始 地 址 之 间 的 间 隔,取 值 范 围:srcNdStride∈[0, 65535],单 位: C0_SIZE。当ndNum配 置 为1时,srcNdStride配 置 为0即 可,不 生 效。

    dstNdStride: 目 的 相 邻ND矩 阵 起 始 地 址 之 间 的 偏 移,取 值 范 围:dstNdstride∈[1, 2^32 -1],单 位:element。当ndNum配 置 为1时,dstNdStride配 置 为0即 可,不 生 效。

  • COLUMN_MAJOR

    当 启 用 该 模 式 时, 该 指 令 被 定 义 为 从L0C到 目 标 位 置 的 数 据 移 动,并 附 带NZ2DN转 换。

    struct Nz2DnParams {
        uint16_t dnNum = 1;
        uint16_t srcNzMatrixStride = 0;
        uint32_t dstDnMatrixStride = 0;
        uint16_t srcNzC0Stride = 0; 
    };

    dnNum: 传 输DN矩 阵 的 数 目,取 值 范 围:dnNum∈[1, 65535]。

    srcNzMatrixStride: 不 同 源NZ矩 阵 的 偏 移(头 与 头),单 位: C0_SIZE。

    dstDnMatrixStride: 目 的 相 邻DN矩 阵 起 始 地 址 间 的 偏 移,取 值 范 围:dstDnMatrixdstride∈[1, 2^32 -1],单 位:element。

    srcNzC0Stride: 源 矩 阵NZ分 形 中 相 邻 行 的 地 址 偏 移(头 与 头), 单 位:C0_SIZE。

  • NZ

    当 启 用 该 模 式 时,为 普 通 搬 运DMA模 式,表 示 从L0C到 目 标 位 置 的 正 常 数 据 移 动。

dualDstCtrl

输 入

双 目 标 模 式 控 制。当 启 用 双 目 标 模 式 控 制 时,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的 倍 数。

2'b11:保 留。

dualDstCtrl仅 支 持 在 普 通 搬 运 模 式 或NZ2ND搬 运 场 景 下 使 用,不 支 持 随 路 功 能 场 景。

subBlockId

输 入

在 启 用 单 目 标 模 式 时 指 示 目 标UB的 编 号。

isChannelSplit

输 入

是 否 使 能 通 道 拆 分 的 功 能。默 认 为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个 元 素。

图 3 使 能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 = 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个 元 素。

    图 5 使 能NZ2ND参 数 双 搬 入 模 式 设 置 示 意 图

使 能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个 元 素。

图 6 使 能NZ2DN单 搬 运 模 式 示 意 图1

单 搬 运 模 式:

  • 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个 元 素。

图 7 使 能NZ2DN单 搬 运 模 式 示 意 图2

约 束 说 明

  • 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的 格 式 转 换。完 整 样 例 可 以 参 考样 例 链 接

    Text
    AscendC::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量 化。完 整 样 例 可 以 参 考样 例 链 接

    Text
    AscendC::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的 格 式 转 换。完 整 样 例 可 以 参 考样 例 链 接

    Text
    AscendC::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);
    

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