Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
需要为 Regbase 平台上的 aclnnUnique / aclnnUnique2 提供 values-only 全局去重能力:调用方仅获取去重后的值,不要求返回逆索引和出现次数。面向这类场景,设计专用 AI Core 计算路径,避免完整索引跟踪和多算子组合带来的额外搬运、中间存储及调度开销。
aclnnUnique
aclnnUnique2
功能要求:
returnInverse=false
returnInverse=false && returnCounts=false
sorted=true
sorted=false
内存优化
采用“全局升序排序 + 相邻去重”的两阶段融合方案。排序后相同数值相邻,去重阶段为每段相同数值输出一个代表值,并根据实际去重数量回传输出 shape。
输入(按展平语义处理) -> 按 dtype、N 和 UB 容量选择排序策略 -> 各核完成排序并进行全局同步 -> 复用 UB,执行单核或多核相邻去重 -> 输出有效 values,并写回实际输出长度
Host 负责准入校验、排序路由、分核、UB 切分和 workspace 规划;Kernel 按 tiling 协议执行,不在设备端重新推导策略。
2.1 输入约束与规划输入
2^30
N < 2^30
N >= 2^30
N × 元素字节数
2.2 排序路由与多核切分
以 N=65536 作为 compact radix 的初始分界;小于该值使用通用排序规划。分界需结合各 dtype 的实测结果校准。有效核数不得超过实际任务数,尾核和尾 tile 需单独记录有效长度,避免空任务参与计数和同步协议。
N=65536
2.3 去重分核与 UB 切分
N <= 8192
2.4 Workspace 布局与阶段复用
系统 workspace 排序 values 区(按 512 字节对齐) 阶段复用区:max(排序临时索引 + 排序 scratch, 去重核间辅助区)
256 × (3 × counterBytes + 2 × sizeof(uint16_t))
2.5 Host/Kernel 协议
tiling key 联合编码排序 schedule 和 useInt64Counters,只有多核 radix 选择 64 位计数实例,其余分支使用默认实例。传递排序路由、核数、tile 长度/数量、尾块长度、归并窗口、各 workspace 区域大小,以及去重单多核标志和各队列容量。复用字段需逐分支注明含义,明确元素数、字节数和核数单位。写回前校验容量、整数范围及非零除数。
useInt64Counters
3.1 排序阶段
3.2 阶段切换与同步
排序完成后所有参与核执行全局同步,保证完整有序序列可见;再重置 pipeline/UB 分配,将排序缓冲让给去重阶段。单核去重时,其他核只能在该同步点之后退出;多核去重时所有有效核继续参与计数与输出偏移计算。不得在读写未完成时复用 scratch 或 UB。
3.3 相邻去重阶段
3.4 动态输出与接口衔接
[K]
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
Backgroud(背景信息)
需要为 Regbase 平台上的
aclnnUnique/aclnnUnique2提供 values-only 全局去重能力:调用方仅获取去重后的值,不要求返回逆索引和出现次数。面向这类场景,设计专用 AI Core 计算路径,避免完整索引跟踪和多算子组合带来的额外搬运、中间存储及调度开销。功能要求:
aclnnUnique的目标场景为returnInverse=false;aclnnUnique2的目标场景为returnInverse=false && returnCounts=false。sorted=true输出升序去重结果;sorted=false不承诺保留输入顺序,允许复用排序去重流程。Origin(信息来源)
内存优化
Benefit / Necessity (价值/作用)
Design(设计方案)
1. 总体计算方案
采用“全局升序排序 + 相邻去重”的两阶段融合方案。排序后相同数值相邻,去重阶段为每段相同数值输出一个代表值,并根据实际去重数量回传输出 shape。
Host 负责准入校验、排序路由、分核、UB 切分和 workspace 规划;Kernel 按 tiling 协议执行,不在设备端重新推导策略。
2. Tiling 设计
2.1 输入约束与规划输入
2^30作为统一输入上限。radix 的计数位宽按 N 选择:N < 2^30使用 uint32,N >= 2^30使用 int64,以容纳 lookback 状态和累计计数;位宽选择与输入 dtype 无关。空输入交由接口层的空张量流程处理。N × 元素字节数是否溢出。2.2 排序路由与多核切分
以
N=65536作为 compact radix 的初始分界;小于该值使用通用排序规划。分界需结合各 dtype 的实测结果校准。有效核数不得超过实际任务数,尾核和尾 tile 需单独记录有效长度,避免空任务参与计数和同步协议。2.3 去重分核与 UB 切分
N <= 8192且完整单核缓冲预算不超过可用 UB;其余输入采用多核分段去重。2.4 Workspace 布局与阶段复用
256 × (3 × counterBytes + 2 × sizeof(uint16_t));扣除固定缓冲和 SIMT 预留后,按 256 元素粒度试算 tile,并同时满足排序临时空间与完整 value tile 的容量要求。2.5 Host/Kernel 协议
tiling key 联合编码排序 schedule 和
useInt64Counters,只有多核 radix 选择 64 位计数实例,其余分支使用默认实例。传递排序路由、核数、tile 长度/数量、尾块长度、归并窗口、各 workspace 区域大小,以及去重单多核标志和各队列容量。复用字段需逐分支注明含义,明确元素数、字节数和核数单位。写回前校验容量、整数范围及非零除数。3. Kernel 设计
3.1 排序阶段
3.2 阶段切换与同步
排序完成后所有参与核执行全局同步,保证完整有序序列可见;再重置 pipeline/UB 分配,将排序缓冲让给去重阶段。单核去重时,其他核只能在该同步点之后退出;多核去重时所有有效核继续参与计数与输出偏移计算。不得在读写未完成时复用 scratch 或 UB。
3.3 相邻去重阶段
3.4 动态输出与接口衔接
[K]。4. 验收要求
2^30前后的 counter 切换、非对齐尾块,以及 UB 容量临界点。大规模规划需覆盖 tile 数、清零长度和偏移字段的可表示边界;设备资源不足时应区分 Host 边界验证与大输入实跑,不能混称通过。