当前位置: 首页 > news >正文

CANN/asc-devkit:asc_mrgsort4多队列合并排序

asc_mrgsort4

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

产品支持情况

产品是否支持
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保留。

函数原型

  • 计算

    __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)
    // 如下原型仅支持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)
  • 同步计算

    __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)
    // 如下原型仅支持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字节对齐。

调用示例

// 示例对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本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/953406/

相关文章:

  • 告别讯飞!用Android原生TTS实现免费离线语音播报(附完整代码)
  • Git克隆报错‘项目未找到‘?别急着重装,先检查这3个地方(附凭据管理器操作)
  • 从Root检测到DRM解密:手把手调试一个运行在Android TEE里的‘小程序’(TA)
  • 韶关黄金回收6月最新报价+6家正规门店实测 - 余生黄金回收
  • 从伯德图到实际电路:一个电源工程师的补偿网络设计避坑指南
  • 【南京黄金回收+实时报价测评】 - 余生黄金回收
  • 【南京全城黄金回收|6月实时金价+6家正规门店实地评测】 - 余生黄金回收
  • 避坑指南:STM32CubeMX配置低功耗停止模式后,程序跑飞/无法唤醒怎么办?
  • 用高斯分布检测服务器异常行为:Z-score实战指南
  • 安防摄像头图像偏色、噪点多?手把手教你用PQTool进行ISP关键参数调试
  • Vidupe视频去重工具:智能清理重复视频的完整指南
  • 【AI开票革命性落地指南】:2024年企业财务人必须掌握的7大智能开票整合实战场景
  • 效率倍增:借助快马AI自动生成368776与229053核心功能模块,告别重复编码
  • 【南京黄金回收|2026年6月最新回收报价与正规门店实测】 - 余生黄金回收
  • 语音符号驱动的跨模态纹理生成系统设计与实现
  • 10分钟打造专属AI音色:RVC语音克隆完全指南,零基础也能成为声音魔法师
  • 15分钟搞定神经网络绘图:Neural-Network-Architecture-Diagrams文件结构与编辑技巧
  • 指纹识别算法实战:如何用Matlab优化特征点提取与匹配的准确率?
  • LabVIEW新手必看:别再乱用顺序结构了,数据流才是王道!
  • Multilingual-E5-Large常见问题解答:解决使用过程中遇到的20个典型问题
  • Qwen2.5-7B-Instruct-GPTQ-Int4模型微调教程:在量化模型上进行LoRA训练终极指南 [特殊字符]
  • 韶关黄金回收闲置旧金变现测评 - 余生黄金回收
  • Mac Mouse Fix:如何让10美元鼠标在macOS上实现触控板级体验
  • 告别重复造轮子:用快马AI一键生成可配置的短信费用管理模块
  • MATLAB鲸鱼优化BiLSTM时序预测工具:自动调参+数据预处理+结果可视化一体化包
  • 别再用split了!Java词频统计实战:StringTokenizer与HashMap的黄金搭档(附完整源码)
  • 【邯郸6月黄金回收+实时报价避坑指南】 - 余生黄金回收
  • 保姆级教程:Win10家庭版/专业版局域网共享文件夹,从开启网络发现到解决‘无法访问’全流程
  • nRF52832蓝牙主机开发避坑指南:从零实现按键控制与数据收发(附完整代码)
  • 嵌入式Linux启动提速:手把手教你用Buildroot配置Ramdisk(含内核参数详解)