- 人工智能
- 深度学习
- 算子库
- CANN
- Ascend
【免费下载链接】asc-devkit
本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。
导读
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 }返回值计算规则(源码级)
类型校验先行:实现首先通过
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 的类型合法。分支一:按(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。
- T 为
分支二:按 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,满足多维场景算子开发诉求。
相关推荐
asc-devkit 中 GetTilingFunc 接口详解:按算子类型获取 Tiling 函数并独立调测
asc devkit 中 GetTilingFunc 接口详解:按算子类型获取 Tiling 函数并独立调测 本篇以 asc devkit 的 Tiling 调
人工智能深度学习算子库CANNAscendAscendC 高阶 API 实战:基于 Xor 接口的按元素异或算子样例(asc-devkit)
AscendC 高阶 API 实战:基于 Xor 接口的按元素异或算子样例(asc devkit) 本篇文章以 asc devkit 仓库中的 Xor 高阶 A
人工智能深度学习算子库CANNAscendCANN ops-nn 算子库 aclnnForeachErf 接口详解:Tensor 列表按元素误差函数计算
CANN ops nn 算子库 aclnnForeachErf 接口详解:Tensor 列表按元素误差函数计算 导读 aclnnForeachErf 是 CAN
人工智能算子库深度学习CANNAscend
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考