Skip to content
版 本

Compare

产 品 支 持 情 况

产 品

是 否 支 持

Ascend 950PR/Ascend 950DT

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

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

Atlas 200I/500 A2 推 理 产 品

Atlas 推 理 系 列 产 品AI Core

Atlas 推 理 系 列 产 品Vector Core

x

Atlas 训 练 系 列 产 品

Kirin X90

Kirin 9030

功 能 说 明

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

逐 元 素 比 较 两 个tensor大 小,如 果 比 较 后 的 结 果 为 真,则 输 出 结 果 的 对 应 比 特 位 为1,否 则 为0。

支 持 多 种 比 较 模 式:

  • LT:小 于(less than)

  • GT:大 于(greater than)

  • GE:大 于 或 等 于(greater than or equal to)

  • EQ:等 于(equal to)

  • NE:不 等 于(not equal to)

  • LE:小 于 或 等 于(less than or equal to)

函 数 原 型

  • 整 个Tensor参 与 计 算

    C++
    dst = src0 < src1;
    dst = src0 > src1;
    dst = src0 <= src1;
    dst = src0 >= src1;
    dst = src0 == src1;
    dst = src0 != src1;
    

    Atlas 200I/500 A2 推 理 产 品 暂 不 支 持 整 个Tensor参 与 计 算 的 运 算 符 重 载。

  • Tensor前n个 数 据 计 算

    C++
    template <typename T, typename U>
    __aicore__ inline void Compare(const LocalTensor<U>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, CMPMODE cmpMode, uint32_t count)
    
  • Tensor高 维 切 分 计 算

    • mask逐bit模 式

      C++
      template <typename T, typename U, bool isSetMask = true>
      __aicore__ inline void Compare(const LocalTensor<U>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, CMPMODE cmpMode, const uint64_t mask[], uint8_t repeatTime, const BinaryRepeatParams& repeatParams)
      
    • mask连 续 模 式

      C++
      template <typename T, typename U, bool isSetMask = true>
      __aicore__ inline void Compare(const LocalTensor<U>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, CMPMODE cmpMode, const uint64_t mask, uint8_t repeatTime, const BinaryRepeatParams& repeatParams)
      

参 数 说 明

模 板 参 数 及 接 口 参 数 说 明

表 1 模 板 参 数 说 明

参 数 名描 述
T源 操 作 数 数 据 类 型。
U目 的 操 作 数 数 据 类 型。
isSetMask保 留 参 数,保 持 默 认 值 即 可。

表 2 接 口 参 数 说 明

参 数 名 称输 入/输 出描 述
dst输 出目 的 操 作 数。
类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。
LocalTensor的 起 始 地 址 需 要32字 节 对 齐。
dst用 于 存 储 比 较 结 果,将dst中uint8_t类 型 的 数 据 按 照bit位 展 开,由 左 至 右 依 次 表 征 对 应 位 置 的src0和src1的 比 较 结 果,如 果 比 较 后 的 结 果 为 真,则 对 应 比 特 位 为1,否 则 为0。
src0、src1输 入源 操 作 数。
类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。
LocalTensor的 起 始 地 址 需 要32字 节 对 齐。
cmpMode输 入CMPMODE类 型,表 示 比 较 模 式,包 括EQ,NE,GE,LE,GT,LT。
• LT:src0小 于(less than)src1
• GT:src0大 于(greater than)src1
• GE:src0大 于 或 等 于(greater than or equal to)src1
• EQ:src0等 于(equal to)src1
• NE:src0不 等 于(not equal to)src1
• LE:src0小 于 或 等 于(less than or equal to)src1
mask/mask[]输 入mask用 于 控 制 每 次 迭 代 内 参 与 计 算 的 元 素。详 细 设 置 参 考掩 码
repeatTime输 入重 复 迭 代 次 数。矢 量 计 算 单 元,每 次 读 取 连 续 的256Bytes数 据 进 行 计 算,为 完 成 对 输 入 数 据 的 处 理,必 须 通 过 多 次 迭 代(repeat)才 能 完 成 所 有 数 据 的 读 取 与 计 算。repeatTime表 示 迭 代 的 次 数。
关 于 该 参 数 的 具 体 描 述 请 参 考高 维 切 分
repeatParams输 入控 制 操 作 数 地 址 步 长 的 参 数。BinaryRepeatParams类 型,包 含 操 作 数 相 邻 迭 代 间 相 同DataBlock的 地 址 步 长,操 作 数 同 一 迭 代 内 不 同DataBlock的 地 址 步 长 等 参 数。
相 邻 迭 代 间 的 地 址 步 长 参 数 说 明 请 参 考repeatStride;同 一 迭 代 内DataBlock的 地 址 步 长 参 数 说 明 请 参 考dataBlockStride
count输 入参 与 计 算 的 元 素 个 数。设 置count时,需 要 保 证count个 元 素 所 占 空 间256字 节 对 齐。未 对 齐 部 分 元 素 不 参 与 计 算,仅 完 整 对 齐 块 有 效。

mask/mask[]参 数 说 明

  • 针 对Ascend 950PR/Ascend 950DT,设 置 有 效。
  • 针 对Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品,保 留 参 数,设 置 无 效。
  • 针 对Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品,保 留 参 数,设 置 无 效。
  • 针 对Atlas 200I/500 A2 推 理 产 品,设 置 有 效。
  • 针 对Atlas 推 理 系 列 产 品AI Core,保 留 参 数,设 置 无 效。
  • 针 对Atlas 训 练 系 列 产 品,保 留 参 数,设 置 无 效。
  • 针 对Kirin X90,保 留 参 数,设 置 无 效。
  • 针 对Kirin 9030,保 留 参 数,设 置 无 效。

数 据 类 型

  • 针 对Ascend 950PR/Ascend 950DT
    • T支 持 的 数 据 类 型 为:int8_t、uint8_t、int16_t、uint16_t、half、bfloat16_t、int32_t、uint32_t、float、int64_t、uint64_t、double。
    • U支 持 的 数 据 类 型 为:int8_t、uint8_t。
  • 针 对Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品
    • T支 持 的 数 据 类 型 为:half(所 有CMPMODE都 支 持)、float(所 有CMPMODE都 支 持)、int32_t(只 支 持CMPMODE::EQ)。
    • U支 持 的 数 据 类 型 为:int8_t、uint8_t。
  • 针 对Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品
    • T支 持 的 数 据 类 型 为:half(所 有CMPMODE都 支 持)、float(所 有CMPMODE都 支 持)、int32_t(只 支 持CMPMODE::EQ)。
    • U支 持 的 数 据 类 型 为:int8_t、uint8_t。
  • 针 对Atlas 200I/500 A2 推 理 产 品
    • T支 持 的 数 据 类 型 为:half、float。
    • U支 持 的 数 据 类 型 为:int8_t、uint8_t。
  • 针 对Atlas 推 理 系 列 产 品AI Core
    • T支 持 的 数 据 类 型 为:half、float。
    • U支 持 的 数 据 类 型 为:int8_t、uint8_t。
  • 针 对Atlas 训 练 系 列 产 品
    • T支 持 的 数 据 类 型 为:half、float。
    • U支 持 的 数 据 类 型 为:int8_t、uint8_t。
  • 针 对Kirin X90
    • T支 持 的 数 据 类 型 为:half(所 有CMPMODE都 支 持)、float(所 有CMPMODE都 支 持)、int32_t(只 支 持CMPMODE::EQ)。
    • U支 持 的 数 据 类 型 为:uint8_t。
  • 针 对Kirin 9030
    • T支 持 的 数 据 类 型 为:half(所 有CMPMODE都 支 持)、float(所 有CMPMODE都 支 持)、int32_t(只 支 持CMPMODE::EQ)。
    • U支 持 的 数 据 类 型 为:uint8_t。

返 回 值 说 明

约 束 说 明

  • 操 作 数 地 址 对 齐 要 求 请 参 见通 用 地 址 对 齐 约 束

  • dst按 照 小 端 顺 序 排 序 成 二 进 制 结 果,对 应src中 相 应 位 置 的 数 据 比 较 结 果。

  • 使 用 整 个tensor参 与 计 算 的 运 算 符 重 载 功 能,src0和src1需 满 足256字 节 对 齐;使 用tensor前n个 数 据 参 与 计 算 的 接 口,设 置count时,需 要 保 证count个 元 素 所 占 空 间256字 节 对 齐。

- 针 对Ascend 950PR/Ascend 950DT,int8\_t/uint8\_t/int64\_t/uint64\_t/double数 据 类 型 仅 支 持tensor前n个 数 据 计 算 接 口 和 整 个tensor参 与 计 算 的 运 算 符 重 载。

调 用 示 例

本 样 例 中,源 操 作 数src0和src1各 存 储 了256个float类 型 的 数 据。样 例 实 现 的 功 能 为,逐 元 素 对src0和src1中 的 数 据 进 行 比 较,如 果src0中 的 元 素 小 于src1中 的 元 素,dst结 果 中 对 应 的 比 特 位 置1;反 之,则 置0。dst结 果 使 用uint8_t类 型 数 据 存 储。

完 整 的 调 用 样 例 可 参 考Compare类 样 例场 景 一。

  • 整 个tensor参 与 计 算

    C++
    dstLocal = src0Local < src1Local;  // 小 于 LT
    dstLocal = src0Local > src1Local;  // 大 于 GT
    dstLocal = src0Local <= src1Local; // 小 于 等 于 LE
    dstLocal = src0Local >= src1Local; // 大 于 等 于 GE
    dstLocal = src0Local == src1Local; // 等 于 EQ
    dstLocal = src0Local != src1Local; // 不 等 于 NE
    
  • tensor前n个 数 据 计 算

    C++
    // srcDataSize:参 与 计 算 的 元 素 个 数
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LT, srcDataSize);
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GT, srcDataSize);
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LE, srcDataSize);
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GE, srcDataSize);
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::EQ, srcDataSize);
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::NE, srcDataSize);
    

    结 果 示 例 如 下:

    Text
    LT:小 于
    输 入 数 据src0Local:[ 2  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3  5  5  5  5  5  5  5  5  7  7  7  7  7  7  7  7
                        11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 ]
    输 入 数 据src1Local:[ 2  2  2  2  2  2  2  2  4  4  4  4  4  4  4  4  6  6  6  6  6  6  6  6  8  8  8  8  8  8  8  8
                        10 10 10 10 10 10 10 10 12 12 12 12 12 12 12 12 14 14 14 14 14 14 14 14 16 16 16 16 16 16 16 16 ]
    输 出 数 据dstLocal: [ 0 127 127 127 0 0 0 0 ]
    
    GT:大 于
    输 入 数 据src0Local:[ 2 3 5 7 11 13 17 19 ... ]
    输 入 数 据src1Local:[ 2 4 6 8 10 12 14 16 ... ]
    逐 元 素 比 较 结 果:   [ 0 0 0 0  1  1  1  1 ... ]
    输 出 数 据dstLocal: [ 240(0b11110000) ... ]
    
    GE:大 于 或 等 于
    输 入 数 据src0Local:[ 2 3 5 7 11 13 17 19 ... ]
    输 入 数 据src1Local:[ 2 4 6 8 10 12 14 16 ... ]
    输 出 数 据dstLocal: [ 241(0b11110001) ... ]
    
    LE:小 于 或 等 于
    输 入 数 据src0Local:[ 2 3 5 7 11 13 17 19 ... ]
    输 入 数 据src1Local:[ 2 4 6 8 10 12 14 16 ... ]
    输 出 数 据dstLocal: [ 15(0b00001111) ... ]
    
    EQ:等 于
    输 入 数 据src0Local:[ 2 3 5 7 11 13 17 19 ... ]
    输 入 数 据src1Local:[ 2 4 6 8 10 12 14 16 ... ]
    输 出 数 据dstLocal: [ 1(0b00000001) ... ]
    
    NE:不 等 于
    输 入 数 据src0Local:[ 2 3 5 7 11 13 17 19 ... ]
    输 入 数 据src1Local:[ 2 4 6 8 10 12 14 16 ... ]
    输 出 数 据dstLocal: [ 126(0b11111110) ... ]
    
  • Tensor高 维 切 分 计 算,mask逐bit模 式

    C++
    // masks数 组 控 制 每 次 迭 代 参 与 计 算 的 元 素,两 个uint64_t的 值 一 共128bit,每 个bit可 以 控 制 一 个 元 素,为1则 参 与 计 算,为0则 不 参 与 计 算
    // masks[0]可 以 控 制 前64个 元 素,低bit位 控 制 索 引 小 的 元 素;masks[1]同 理,可 以 控 制 后64个 元 素
    // 例 如,对float类 型 数 据,每 次 迭 代 处 理256B / sizeof(float) = 64个 元 素,因 此 只 需 要 通 过masks[0]即 可 进 行 控 制
    uint64_t masks[2] = {858993459, 0}; // 858993459(0x33333333)
    // repeat: 1, dstBlkStride: 1, src0BlkStride: 1, src1BlkStride: 1, dstRepStride: 1, src0RepStride: 8, src1RepStride: 8
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LT, masks, 1, { 1, 1, 1, 1, 8, 8 });
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GT, masks, 1, { 1, 1, 1, 1, 8, 8 });
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LE, masks, 1, { 1, 1, 1, 1, 8, 8 });
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GE, masks, 1, { 1, 1, 1, 1, 8, 8 });
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::EQ, masks, 1, { 1, 1, 1, 1, 8, 8 });
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::NE, masks, 1, { 1, 1, 1, 1, 8, 8 });
    

    结 果 示 例 如 下:

    Text
    LE:小 于 等 于
    输 入 数 据src0Local:[ 2  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3  5  5  5  5  5  5  5  5  7  7  7  7  7  7  7  7
                        11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 ]
    输 入 数 据src1Local:[ 2  2  2  2  2  2  2  2  4  4  4  4  4  4  4  4  6  6  6  6  6  6  6  6  8  8  8  8  8  8  8  8
                        10 10 10 10 10 10 10 10 12 12 12 12 12 12 12 12 14 14 14 14 14 14 14 14 16 16 16 16 16 16 16 16 ]
    输 入 数 据masks:{ 858993459, 0 }
    输 出 数 据dstLocal: [ 51 51 51 51 0 0 0 0 ]
    
  • Tensor高 维 切 分 计 算,mask连 续 模 式

    C++
    // mask控 制 每 次 迭 代 参 与 计 算 的 连 续 元 素 个 数
    // 例 如,对float类 型 数 据,每 次 迭 代 处 理256B / sizeof(float) = 64个 元 素,因 此mask可 取 值1至64
    uint64_t mask = 28;
    // repeat: 1, dstBlkStride: 1, src0BlkStride: 1, src1BlkStride: 1, dstRepStride: 1, src0RepStride: 8, src1RepStride: 8
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LT, mask, 1, { 1, 1, 1, 1, 8, 8 });
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GT, mask, 1, { 1, 1, 1, 1, 8, 8 });
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LE, mask, 1, { 1, 1, 1, 1, 8, 8 });
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GE, mask, 1, { 1, 1, 1, 1, 8, 8 });
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::EQ, mask, 1, { 1, 1, 1, 1, 8, 8 });
    AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::NE, mask, 1, { 1, 1, 1, 1, 8, 8 });
    

    结 果 示 例 如 下:

    Text
    LE:小 于 等 于
    输 入 数 据src0Local:[ 2  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3  5  5  5  5  5  5  5  5  7  7  7  7  7  7  7  7
                        11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 ]
    输 入 数 据src1Local:[ 2  2  2  2  2  2  2  2  4  4  4  4  4  4  4  4  6  6  6  6  6  6  6  6  8  8  8  8  8  8  8  8
                        10 10 10 10 10 10 10 10 12 12 12 12 12 12 12 12 14 14 14 14 14 14 14 14 16 16 16 16 16 16 16 16 ]
    输 入 数 据mask:28
    输 出 数 据dstLocal: [ 127 127 127 16 0 0 0 0 ]
    

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