☰
asc-devkit GetSortLen 接口详解:按元素个数计算 Sort 排序数据大小的字节数
2026/10/16 7:28:56 网站建设 项目流程
  • 人工智能
  • 深度学习
  • 算子库
  • CANN
  • Ascend

【免费下载链接】asc-devkit

本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。

项目地址:https://gitcode.com/cann/asc-devkit
点击查看免费下载

导读

GetSortLen 是 asc-devkit(CANN 昇腾 AI 处理器算子开发语言)中 Sort 排序接口族的一个辅助工具接口,它的职责非常聚焦:给定待排序的元素个数,返回 Sort 操作输出数据结构所占用的字节数,供开发者在规划缓冲区(Buffer)大小时直接使用。阅读本文后,你将掌握 GetSortLen 的函数原型、模板参数与入参约束、不同产品上的返回值计算规则(源码级),并学会把它与 Sort、Extract 等接口串成一条完整的排序流水线。

一、接口定位:Sort 排序流水线中的“尺寸计算器”

在 asc-devkit 的排序操作(Sort Operations)体系中,核心执行接口是 Sort,它负责将输入数据按数值大小排序,并把排序结果连同其索引一起写入目的操作数。而排序结果的物理排布不是简单的“值紧挨着值”,而是按(score, index) 结构或Region Proposal 结构排布(详见 Sort.md 的功能说明)。这就带来一个实际问题:

开发者需要为排序结果提前申请多大的内存?

GetSortLen 就是回答这个问题的接口。它与同族的 GetSortOffset(按元素位置取偏移量)、GetSortTmpSize(取 Sort 临时空间大小)共同组成 Sort 接口的内存规划辅助工具,让开发者在调用 Sort 之前就能精确计算所需的存储空间,避免因空间不足导致数据越界。

该接口声明于公开头文件 include/basic_api/kernel_operator_proposal_intf.h,实现在内部头文件 impl/basic_api/kernel_operator_proposal_intf_impl.h,归属于AscendC命名空间。

二、函数原型与参数详解

函数原型

template <typename T> __aicore__ inline uint32_t GetSortLen(const uint32_t elemCount)

接口标注了__aicore__,表明它是可直接在 AI Core 侧(核内)调用的内联函数,返回值为uint32_t类型。

模板参数 T

参数名描述
T操作数的数据类型。支持的数据类型为:half、float。

模板参数 T 决定了排序数据的类型宽度,进而影响返回值的计算(见下文“返回值计算规则”)。该参数需与后续调用 Sort 时使用的数据类型保持一致。

接口参数 elemCount

参数名输入/输出描述
elemCount输入输入元素个数。

elemCount是uint32_t类型,表示待排序的元素个数。它通常与 Sort 接口处理的元素总数(如调用示例中的calCount或m_elementCount)保持一致。

三、返回值说明

返回值是Sort 数据的大小,单位为字节,类型为uint32_t。

从源码实现看,返回值并不是简单的elemCount × sizeof(T),而是依据产品所采用的排序数据结构排布方式,乘以对应的单元素宽度常量:

template <typename T> __aicore__ inline uint32_t GetSortLen(const uint32_t elemCount) { using PrimType = PrimT<T>; ASCENDC_ASSERT((SupportType<PrimType, half, float>()), { KERNEL_LOG( KERNEL_ERROR, "Failed to check dtype in GetSortLen, current api support dtype combination is " "half / float"); }); #if defined(__NPU_ARCH__) && \ ((__NPU_ARCH__ == 2201) || (__NPU_ARCH__ == 3002) || (__NPU_ARCH__ == 3102) || (__NPU_ARCH__ == 5102) || \ (__NPU_ARCH__ == 5162) || (__NPU_ARCH__ == 3003) || (__NPU_ARCH__ == 3113) || (__NPU_ARCH__ == 3510)) if constexpr (Std::is_same<PrimType, half>::value) { return elemCount * halfSortedDataSize; } else { return elemCount * floatSortedDataSize; } #else return elemCount * regionProposalDataSize; #endif }

返回值计算规则(源码级)

  1. 类型校验先行:实现首先通过ASCENDC_ASSERT+SupportType<PrimType, half, float>检查模板参数,若传入half/float之外的数据类型(如int32_t、bfloat16_t),会记录KERNEL_ERROR级别日志"Failed to check dtype in GetSortLen, current api support dtype combination is half / float"并触发断言。因此调用前务必确认 T 的类型合法。

  2. 分支一:按(score, index)紧凑结构排布的产品:当__NPU_ARCH__宏取值为 2201、3002、3102、5102、5162、3003、3113、3510 时:

    • T 为half:返回elemCount * halfSortedDataSize,其中常量halfSortedDataSize = 4(定义于 impl/basic_api/kernel_operator_proposal_intf_impl.h);
    • T 为float:返回elemCount * floatSortedDataSize,其中常量floatSortedDataSize = 2。
  3. 分支二:按 Region Proposal 排布的产品:其他产品(如采用 Region Proposal 排布的 Atlas 推理系列产品 AI Core)统一返回elemCount * regionProposalDataSize,其中常量regionProposalDataSize = 8(定义于 impl/basic_api/dav_c100/kernel_operator_proposal_impl.h 等各产品实现头文件中)。

说明:上述常量是各产品排序指令内部的数据宽度语义,与 Sort.md 中描述的两种结果排布方式(方式一“(score, index)结构”、方式二“Region Proposal 结构”)直接相关。开发者通常无需关心常量背后的物理含义,只需把 GetSortLen 的返回值当作“排序结果 Buffer 的字节数”直接用于内存规划即可。请勿用elemCount * sizeof(T)自行推算,以免与接口约定不一致。

四、设计要点:与 GetSortOffset 的对称关系

GetSortLen 与 GetSortOffset 是一对“一长度、一偏移”的配套接口:

  • GetSortLen:根据元素个数,求 Sort 数据的总大小(字节数),用于申请整块内存;
  • GetSortOffset:根据元素位置,求 Sort 数据中该元素对应结构的起始偏移量(字节数),用于在已申请的内存上定位。

两者共享同一套数据类型校验逻辑(SupportType<PrimType, half, float>)和同一组宽度常量,源码中依次排列在 impl/basic_api/kernel_operator_proposal_intf_impl.h 中。典型配合方式是:用 GetSortLen 申请 buffer,再用 GetSortOffset 计算每个元素在 buffer 内的写入/读取位置。

五、实战调用示例

基本调用

// 待排序元素个数 const uint32_t elemCount = 128; // 获取 Sort 输出数据结构所占字节数 uint32_t sortLen = AscendC::GetSortLen<half>(elemCount);

与 GetSortLen.md 中给出的官方示例AscendC::GetSortLen<half>(128);等价,返回 128 个 half 元素对应的 Sort 数据大小(字节数)。

完整排序流水线中的位置

将 GetSortLen 与 Sort 接口族组合,可以构成一条完整的“预处理 → 排序 → 提取”流水线(参考 Sort.md 的调用示例):

// 待排序元素数量 uint32_t m_elementCount = 128; // 每次迭代完成 32 个元素的排序 uint32_t m_sortRepeatTimes = m_elementCount / 32; uint32_t m_extractRepeatTimes = m_elementCount / 32; // 用 GetSortLen 计算排序结果所需的字节数,据此规划 sortedLocal 的存储空间 uint32_t sortedLen = AscendC::GetSortLen<half>(m_elementCount); // 预处理:将 score 与其 index 拼接为排序所需的输入结构 AscendC::Concat(concatLocal, valueLocal, concatTmpLocal, m_concatRepeatTimes); // 执行排序:降序排序,结果以 (score, index) 结构写入 sortedLocal AscendC::Sort<T, isFullSort>(sortedLocal, concatLocal, indexLocal, sortTmpLocal, m_sortRepeatTimes); // 提取:从排序结果中分离出排序后的值与其索引 AscendC::Extract(dstValueLocal, dstIndexLocal, sortedLocal, m_extractRepeatTimes);

其中sortedLocal的存储空间大小即可由sortedLen推导(结合 32 字节地址对齐要求)。相关的预处理与后处理接口见 Concat 与 Extract;若采用带 SortConfig 的 Sort 重载,临时空间大小可参考 GetSortMaxMinTmpSize 与 GetSortTmpSize。

注意事项

  • 数据类型匹配:T 仅支持half与float,且应与 Sort 接口的操作数数据类型保持一致,否则会触发类型断言错误;
  • 与 Sort 的配套使用:GetSortLen 的返回值语义与 Sort 输出的排布方式强相关,若目标产品不支持 Sort 接口(如 Atlas 训练系列产品),GetSortLen 也不具备实际使用场景;
  • 地址对齐:排序结果写入的 LocalTensor 起始地址需满足 32 字节对齐要求(参见 Sort.md 的约束说明与通用地址对齐约束),申请 Buffer 时请在 GetSortLen 返回值基础上按对齐规则补齐。

六、接口可用性验证

在仓库测试代码中,GetSortLen 被纳入头文件可用性检查:测试文件 tests/api/basic_api/ascendc_host_header_checker/host_header_kernal_operator_intf_checker.cpp 通过using AscendC::GetSortLen;等方式对提案(Proposal)接口族进行符号引用检查,与GetSortOffset、MrgSort、MrgSort4、Concat、Extract等接口一并验证,确保公开头文件声明可被正确解析。这从侧面印证了 GetSortLen 是 Sort 排序操作族中稳定对外暴露的公开接口。

七、更多参考

  • 排序操作接口目录:sort_operations.md
  • 核心排序接口:Sort.md
  • 配套偏移量接口:GetSortOffset.md
  • 临时空间规划:GetSortTmpSize.md、GetSortMaxMinTmpSize.md
  • 预处理与后处理:Concat.md、Extract.md
  • 接口声明:include/basic_api/kernel_operator_proposal_intf.h
  • 接口实现:impl/basic_api/kernel_operator_proposal_intf_impl.h
  • 人工智能
  • 深度学习
  • 算子库
  • CANN
  • Ascend

【免费下载链接】asc-devkit

本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。

项目地址:https://gitcode.com/cann/asc-devkit
点击查看免费下载

相关推荐

上一篇:Neovide 功能全景指南:从连字渲染、光标特效到远程 Neovim 实例连接
下一篇:probe_routing:基于 "First Passage Percolation with Queried Hints" 的交通网络距离近似实验复现指南

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询