Skip to content
版 本

CastDequant

产 品 支 持 情 况

产 品

是 否 支 持

Ascend 950PR/Ascend 950DT

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

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

Atlas 200I/500 A2 推 理 产 品

x

Atlas 推 理 系 列 产 品AI Core

Atlas 推 理 系 列 产 品Vector Core

x

Atlas 训 练 系 列 产 品

x

功 能 说 明

头 文 件 路 径 为:"basic_api/kernel_operator_vec_vconv_intf.h"。

对 输 入 做 量 化 并 进 行 精 度 转 换,对 输 出 结 果 的 溢 出 采 用 饱 和 处 理。本 接 口 需 要 与SetDeqScale接 口 配 合 使 用。

  • 输 入 数 据 类 型 为int16_t,关 闭 向 量 量 化 模 式。

    使 用SetDeqScale接 口 设 置 的scale、offset、signMode参 数,对 输 入 整 个 张 量 做Per-Tensor量 化,输 出b8数 据 类 型。计 算 公 式 如 下:

    $$ dst_i = Cast((src_i * scale) + offset) $$

  • 输 入 数 据 类 型 为int16_t,开 启 向 量 量 化 模 式。

    SetDeqScale接 口 设 置16组 量 化 参 数,每 组 包 含 一 个scale、offset、signMode,对 输 入 张 量 做Per-Block量 化,一 次repeat处 理8个DataBlock,每 个DataBlock为32B大 小,对 每 个DataBlock上 的16个 输 入 数 据 做 量 化 并 进 行 精 度 转 换,每 个 数 的 计 算 使 用 一 组 独 立 的 量 化 参 数,输 出 为b8数 据 类 型。计 算 公 式 如 下:

    $$ dst_i = Cast((src_i * scale_j) + offset_j), j \in [0,15] $$

  • 输 入 类 型 为int32_t,输 出half数 据 类 型。

    使 用SetDeqScale接 口 设 置 的scale参 数,采 用RINT精 度 舍 入 模 式。计 算 公 式 如 下:

    $$ dst_i = Cast(src_i * scale) $$

函 数 原 型

  • tensor前n个 数 据 计 算

    C++
    template <typename T, typename U, bool isVecDeq = true, bool halfBlock = true>
    __aicore__ inline void CastDequant(const LocalTensor<T>& dst, const LocalTensor<U>& src, const uint32_t count)
    
  • tensor高 维 切 分 计 算

    • mask逐bit模 式

      C++
      template <typename T, typename U, bool isSetMask = true, bool isVecDeq = true, bool halfBlock = true>
      __aicore__ inline void CastDequant(const LocalTensor<T>& dst, const LocalTensor<U>& src, const uint64_t mask[], uint8_t repeatTime, const UnaryRepeatParams& repeatParams)
      
    • mask连 续 模 式

      C++
      template <typename T, typename U, bool isSetMask = true, bool isVecDeq = true, bool halfBlock = true>
      __aicore__ inline void CastDequant(const LocalTensor<T>& dst, const LocalTensor<U>& src, const int32_t mask, uint8_t repeatTime, const UnaryRepeatParams& repeatParams)
      

参 数 说 明

模 板 参 数 说 明

参 数 名描 述
T目 的 操 作 数 数 据 类 型。
当 类 型 为b8时,和SetDeqScale接 口 的signMode入 参 配 合 使 用,当signMode=true时 输 出 数 据 类 型int8_t;signMode=false时 输 出 数 据 类 型uint8_t。
U源 操 作 数 数 据 类 型。
isSetMask是 否 在 接 口 内 部 设 置mask,默 认 为true。
• true,表 示 在 接 口 内 部 设 置mask。
• false,表 示 在 接 口 外 部 设 置mask,开 发 者 需 要 使 用SetVectorMask接 口 设 置mask值。这 种 模 式 下,本 接 口 入 参 中 的mask值 必 须 设 置 为 占 位 符MASK_PLACEHOLDER。
isVecDeq控 制 是 否 选 择 向 量 量 化 模 式。
SetDeqScale接 口 配 合 使 用,当SetDeqScale接 口 传 入Tensor时,isVecDeq必 须 为true。
halfBlock输 出 数 据 类 型 为b8时 有 效,用 于 指 示 输 出 元 素 存 放 在 上 半 还 是 下 半DataBlock。
halfBlock=true时,结 果 存 放 在 下 半DataBlock;halfBlock=false时,结 果 存 放 在 上 半DataBlock。
如 下 图 所 示,一 个DataBlock大 小 的 输 入 得 到8个b8类 型 输 出,当halfBlock为false时,这8个 输 出 数 据 存 放 在 下 半DataBlock。

若 需 要 得 到 连 续 的 目 的 操 作 数 数 据,可 以 通 过 将DataBlock分 为 奇 偶 块,调 用 两 次 接 口 分 别 处 理 奇 偶 块,奇 数 块 的 输 出 存 放 在 下 半DataBlock,偶 数 块 输 出 存 放 在 上 半DataBlock。

参 数 说 明

参 数 名 称输 入/输 出说 明
dst输 出目 的 操 作 数。
类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。
LocalTensor的 起 始 地 址 需 要32字 节 对 齐。
src输 入源 操 作 数。
类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。
LocalTensor的 起 始 地 址 需 要32字 节 对 齐。
count输 入参 与 计 算 的 元 素 个 数。
参 数 取 值 范 围 和 操 作 数 的 数 据 类 型 有 关,数 据 类 型 不 同,能 够 处 理 的 元 素 个 数 最 大 值 不 同,最 大 处 理 的 数 据 量 不 能 超 过UB大 小 限 制。
mask/mask[]输 入mask用 于 控 制 每 次 迭 代 内 参 与 计 算 的 元 素。
注 意:数 据 类 型 转 换 的mask会 按 照 输 入 和 输 出 类 型 中sizeof(dtype)较 大 的 来 筛 选。
设 置 详 见掩 码 操 作
repeatTime输 入重 复 迭 代 次 数。
矢 量 计 算 单 元,每 次 读 取 连 续 的256Bytes数 据 进 行 计 算,为 完 成 对 输 入 数 据 的 处 理,必 须 通 过 多 次 迭 代(repeat)才 能 完 成 所 有 数 据 的 读 取 与 计 算。repeatTime表 示 迭 代 的 次 数。
关 于 该 参 数 的 具 体 描 述 请 参 考高 维 切 分
repeatParams输 入控 制 操 作 数 地 址 步 长 的 参 数。UnaryRepeatParams类 型,包 含 操 作 数 相 邻 迭 代 间 相 同DataBlock的 地 址 步 长,操 作 数 同 一 迭 代 内 不 同DataBlock的 地 址 步 长 等 参 数。
相 邻 迭 代 间 的 地 址 步 长 参 数 说 明 请 参 考repeatStride;同 一 迭 代 内DataBlock的 地 址 步 长 参 数 说 明 请 参 考dataBlockStride

数 据 类 型

Ascend 950PR/Ascend 950DT支 持 的 数 据 类 型 组 合 情 况

src数 据 类 型dst数 据 类 型
int32_thalf
int16_tint8_t
int16_tuint8_t

Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品 支 持 的 数 据 类 型 组 合 情 况

src数 据 类 型dst数 据 类 型
int32_thalf
int16_tint8_t
int16_tuint8_t

Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品 支 持 的 数 据 类 型 组 合 情 况

src数 据 类 型dst数 据 类 型
int32_thalf
int16_tint8_t
int16_tuint8_t

Atlas 推 理 系 列 产 品AI Core支 持 的 数 据 类 型 组 合 情 况

src数 据 类 型dst数 据 类 型
int16_tint8_t
int16_tuint8_t

返 回 值 说 明

约 束 说 明

  • 地 址 对 齐 约 束 参 考地 址 对 齐 约 束

  • 操 作 数 地 址 重 叠 约 束 请 参 考地 址 重 叠 约 束

  • 当 输 出 类 型 为b8时,目 的 操 作 数 数 据 类 型 需 要 和SetDeqScale接 口 的signMode入 参 配 合,当signMode=true时 输 出 数 据 类 型int8_t;signMode=false时 输 出 数 据 类 型uint8_t。

  • halfBlock参 数 仅 在 输 出 数 据 为b8类 型 时 有 效。

  • 当 输 入 类 型 为int16_t,开 启 向 量 量 化 模 式 时,SetDeqScale接 口 需 要 传 入 至 少128B大 小 的UB空 间,若 空 间 不 足128B,可 能 导 致 精 度 错 误。

  • 该 接 口 需 要 与SetDeqScale配 合 使 用,使 用 关 系 映 射 表 如 下:

    CastDequant与SetDeqScale使 用 关 系 映 射 表

    CastDequant使 用 场 景对 应 使 用 的SetDeqScale函 数 原 型
    输 入 类 型 为int16_t,关 闭 向 量 量 化 模 式
    __aicore__ inline void SetDeqScale(float scale, int16_t offset, bool signMode)
    输 入 类 型 为int16_t,开 启 向 量 量 化 模 式
    template <typename T>
    __aicore__ inline void SetDeqScale(const LocalTensor<T>& vdeq, const VdeqInfo& vdeqInfo)
    输 入 类 型 为int32_t,输 出 数 据 类 型 为half类 型
    __aicore__ inline void SetDeqScale(half scale)

调 用 示 例

完 整 的 调 用 样 例 可 参 考复 合 计 算 样 例

  • 高 维 切 分 计 算 接 口 样 例-mask连 续 模 式。

    C++
    int32_t mask = 256 / sizeof(int16_t);
    // repeatTime = 2, 128 elements one repeat, 256 elements total
    // dstBlkStride, srcBlkStride = 1, no gap between blocks in one repeat
    // dstRepStride, srcRepStride = 8, no gap between repeats
    AscendC::CastDequant<uint8_t, int16_t, true, true, true>(dstLocal, srcLocal, mask, 2, { 1, 1, 8, 8 });
    
  • 高 维 切 分 计 算 接 口 样 例-mask逐bit模 式。

    C++
    uint64_t mask[2] = { UINT64_MAX, UINT64_MAX };
    // repeatTime = 2, 128 elements one repeat, 256 elements total
    // dstBlkStride, srcBlkStride = 1, no gap between blocks in one repeat
    // dstRepStride, srcRepStride = 8, no gap between repeats
    AscendC::CastDequant<uint8_t, int16_t, true, true, true>(dstLocal, srcLocal, mask, 2, { 1, 1, 8, 8 });
    
  • 前n个 数 计 算 接 口 样 例。

    C++
    AscendC::CastDequant<uint8_t, int16_t, true, true>(dstLocal, srcLocal, 256);
    

结 果 示 例 如 下:

输 入 数 据srcLocal: 
[20 53 26 12 36  6 20 93 66 30 56 99 59 92  7 37 22 47 98 10 85 29 14 46
 17 34 45 17 25 45 82 17 66 94 68 23 67  8 89  8 92  6 10 80 87 20  9 81
 70 62 11 58 38 83 32 14 38 47 41 63 94 26 96 89 88 35 86 55 60 82 15 65
 92 67 83 23 63 25 85 93 50 91 75 60 80 10 55 20 71 14 67 23 31 63  7 93
 69 45 61 23 43 86 11 81 81 36 76 58 53 25 23 51 59 78 82 10 39 40 24 50
 68 49 79 40  4 53 22 38 45 17 29 54  9 66 98 47 12 47 47 20 98  0 59 77
  1 21 39 70 66 20 68  8 77 77 54  0  3 33 37 37 48 60 83 88 27 70 31 49
 75 21 59  3 99 84 92 84 14 44 26 56 72 56 37 52 39 11  2 59 59 65 71 64
 10 65 62 48 42 79 69 69 27 99  8 38 36 77 34 34 60 50 52 50 41 31 95 68
 27 16 42 64 19 47  0 10 36 36 33 62 98 64 32 81 49 53 27 70 35  9 63  7
 10 89  3 39 94 23 89 16 23 60 71 42 46 58 65 90]
输 出 数 据dstLocal: 
[ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 20 53 26 12 36  6 20 93
 66 30 56 99 59 92  7 37  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 22 47 98 10 85 29 14 46 17 34 45 17 25 45 82 17  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0 66 94 68 23 67  8 89  8 92  6 10 80 87 20  9 81
   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 70 62 11 58 38 83 32 14
 38 47 41 63 94 26 96 89  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 88 35 86 55 60 82 15 65 92 67 83 23 63 25 85 93  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0 50 91 75 60 80 10 55 20 71 14 67 23 31 63  7 93
   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 69 45 61 23 43 86 11 81
 81 36 76 58 53 25 23 51  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 59 78 82 10 39 40 24 50 68 49 79 40  4 53 22 38  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0 45 17 29 54  9 66 98 47 12 47 47 20 98  0 59 77
   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1 21 39 70 66 20 68  8
 77 77 54  0  3 33 37 37  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 48 60 83 88 27 70 31 49 75 21 59  3 99 84 92 84  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0 14 44 26 56 72 56 37 52 39 11  2 59 59 65 71 64
   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 10 65 62 48 42 79 69 69
 27 99  8 38 36 77 34 34  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 60 50 52 50 41 31 95 68 27 16 42 64 19 47  0 10  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0 36 36 33 62 98 64 32 81 49 53 27 70 35  9 63  7
   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 10 89  3 39 94 23 89 16
 23 60 71 42 46 58 65 90]

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