Skip to content
版 本

asc_mrgsort4

产 品 支 持 情 况

产 品是 否 支 持
Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品
Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品
Ascend 950PR/Ascend 950DT

功 能 说 明

将 已 经 排 好 序 的 最 多4条 队 列,合 并 排 列 成1条 队 列,结 果 按 照score域 由 大 到 小 排 序。

asc_mrgsort4处 理 的 数 据 一 般 是 经 过asc_bitsort指 令 处 理 后 的 数 据,也 就 是asc_bitsort指 令 的 输 出,队 列 的 结 构Region Proposal如 下 所 示:

  • 数 据 类 型 为float,每 个 结 构 占 据8 Bytes。

  • 数 据 类 型 为half,每 个 结 构 也 占 据8 Bytes,中 间 有2 Bytes保 留。

函 数 原 型

  • 计 算

    C++
    __aicore__ inline void asc_mrgsort4(__ubuf__ half* dst, __ubuf__ half* src[ASC_C_API_MRGSORT_ELEMENT_LEN], uint8_t repeat, uint16_t element_length_0, uint16_t element_length_1, uint16_t element_length_2, uint16_t element_length_3, bool if_exhausted_suspension, uint8_t valid_bit)
    __aicore__ inline void asc_mrgsort4(__ubuf__ float* dst, __ubuf__ float* src[ASC_C_API_MRGSORT_ELEMENT_LEN], uint8_t repeat, uint16_t element_length_0, uint16_t element_length_1, uint16_t element_length_2, uint16_t element_length_3, bool if_exhausted_suspension, uint8_t valid_bit)
    
    C++
    // 如 下 原 型 仅 支 持Ascend 950PR/Ascend 950DT
    __aicore__ inline void asc_mrgsort4(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t element_length_0, uint16_t element_length_1, uint16_t element_length_2, uint16_t element_length_3, bool if_exhausted_suspension, uint8_t valid_bit)
    __aicore__ inline void asc_mrgsort4(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t element_length_0, uint16_t element_length_1, uint16_t element_length_2, uint16_t element_length_3, bool if_exhausted_suspension, uint8_t valid_bit)
    
  • 同 步 计 算

    C++
    __aicore__ inline void asc_mrgsort4_sync(__ubuf__ half* dst, __ubuf__ half* src[ASC_C_API_MRGSORT_ELEMENT_LEN], uint8_t repeat, uint16_t element_length_0, uint16_t element_length_1, uint16_t element_length_2, uint16_t element_length_3, bool if_exhausted_suspension, uint8_t valid_bit)
    __aicore__ inline void asc_mrgsort4_sync(__ubuf__ float* dst, __ubuf__ float* src[ASC_C_API_MRGSORT_ELEMENT_LEN], uint8_t repeat, uint16_t element_length_0, uint16_t element_length_1, uint16_t element_length_2, uint16_t element_length_3, bool if_exhausted_suspension, uint8_t valid_bit)
    
    C++
    // 如 下 原 型 仅 支 持Ascend 950PR/Ascend 950DT
    __aicore__ inline void asc_mrgsort4_sync(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t element_length_0, uint16_t element_length_1, uint16_t element_length_2, uint16_t element_length_3, bool if_exhausted_suspension, uint8_t valid_bit)
    __aicore__ inline void asc_mrgsort4_sync(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t element_length_0, uint16_t element_length_1, uint16_t element_length_2, uint16_t element_length_3, bool if_exhausted_suspension, uint8_t valid_bit)
    

参 数 说 明

参 数 名输 入/输 出描 述
dst输 出目 的 操 作 数(矢 量)的 起 始 地 址。
src输 入源 操 作 数(矢 量)的 起 始 地 址 的 数 组,待 合 并 的Region Proposal队 列。队 列 数 量ASC_C_API_MRGSORT_ELEMENT_LEN值 为4。
repeat输 入迭 代 次 数,每 一 次 源 操 作 数 和 目 的 操 作 数 计 算 并 跳 过 四 个 队 列 总 长 度。
element_length_0输 入源 队 列0的 长 度。
element_length_1输 入源 队 列1的 长 度。
element_length_2输 入源 队 列2的 长 度。
element_length_3输 入源 队 列3的 长 度。
if_exhausted_suspension输 入某 条 队 列 耗 尽 后,指 令 是 否 需 要 停 止。
valid_bit输 入有 效 队 列 个 数。有 效 取 值 如 下:
3:前 两 条 队 列 有 效。
7:前 三 条 队 列 有 效。
15:四 条 队 列 全 部 有 效。

返 回 值 说 明

流 水 类 型

PIPE_V

约 束 说 明

  • 当repeat=1时,表 示 进 行 一 次 迭 代,可 自 由 设 置element_length_..., if_exhausted_suspension, valid_bit参 数。
  • 当repeat>1时,表 示 进 行 多 次 迭 代,必 须 满 足 以 下 条 件:包 含 四 条 源 队 列,四 个 源 队 列 的 长 度 一 致 且 在 内 存 中 连 续 存 储,valid_bit的 值 为15,if_exhausted_suspension的 值 为false。
  • 操 作 数 地 址 重 叠 约 束 请 参 考通 用 地 址 重 叠 约 束
  • dst、src的 起 始 地 址 需 要32字 节 对 齐。

调 用 示 例

C++
// 示 例 对8个 已 排 序 好 的Region Proposal队 列 进 行 归 并 排 序,每 个 队 列 包 含32个 元 素。
// 第 一 步,每 次 排 序4个32元 素 队 列src,共repeat两 次,得 到 两 个 排 序 好 的128元 素 的 新 队 列tmp。
// 第 二 步,将 两 个 排 序 好 的128元 素 新 队 列tmp再 进 行 归 并 排 序,得 到 最 终 的256元 素 队 列dst。

constexpr uint16_t element_length = 32;
// 每 个 元 素 包 含float32的score和4字 节 的index,占8字 节,相 当 于2个sizeof(float)。
constexpr uint16_t array_length = element_length * 2;
__ubuf__ float src_workspace[array_length * 8];
__ubuf__ float tmp_workspace[array_length * 8];
__ubuf__ float dst_workspace[array_length * 8];

__ubuf__ float* src[ASC_C_API_MRGSORT_ELEMENT_LEN];
__ubuf__ float* dst;
uint8_t valid_bit;

// 每 个 迭 代 可 以 处 理4个 队 列,共2个 迭 代。
src[0] = &src_workspace[0];
src[1] = &src_workspace[1 * array_length];
src[2] = &src_workspace[2 * array_length];
src[3] = &src_workspace[3 * array_length];
dst = tmp_workspace;
valid_bit = 15;
asc_mrgsort4(dst, src, 2, element_length, element_length, element_length, element_length, false, valid_bit);

// 迭 代1次,处 理2个 队 列。
src[0] = &tmp_workspace[0];
src[1] = &tmp_workspace[1 * 4 * array_length];
dst = dst_workspace;
valid_bit = 3;
asc_mrgsort4(dst, src, 1, 4 * element_length, 4 * element_length, 0, 0, false, valid_bit);

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