asc_mrgsort4
产 品 支 持 情 况
| 产 品 | 是 否 支 持 |
|---|---|
| √ | |
| √ | |
| √ |
功 能 说 明
将 已 经 排 好 序 的 最 多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);