已关闭
[Requirement|需求建议]: 新增 simd_simt_stream_compaction SIMD/SIMT 混合编程流压缩最佳实践样例(5 场景调优路径) #1765
lizq15创建于  9月21日关闭于  13 天前
lizq15成员
9月21日 创建

Backgroud(背景信息)

流压缩(从给定序列中选择满足条件的元素并保序输出)是 MoE 分发、top-k 筛选、稀疏矩阵处理等场景中的常见计算。该算子的特点在于每个线程无法提前知道自己的元素在输出中的位置,输出位置必须由线程协作计算得出。

本需求开发一个 SIMD 与 SIMT 混合编程最佳实践样例 simd_simt_stream_compaction,以稳定流压缩算子为载体,呈现确定性(稳定)压缩的调优路径。

Origin(信息来源)

SIMT 样例开发需求

Benefit / Necessity (价值/作用)

  • 为混合编程开发者提供"输出位置需线程协作计算"这一典型数据依赖模式的完整调优参考路径
  • 量化展示各优化手段收益:GM 重扫描 → UB 缓存 → 两级归约前缀和 → Warp 原语(asc_ballot/__popc)→ 批处理减同步
  • 优化思路可迁移至 MoE 分发、top-k 筛选、稀疏矩阵处理等实际业务场景

Design(设计方案)

算子语义:给定输入序列 input[](int32)与判断条件,输出命中元素并保持原相对顺序。出参:output[](int32,GM,长度与 input 一致,多余位置补 INT32_MIN)、selected_count(uint32,GM,命中总数)。示例:挑选偶数,input [4,3,2,7,9,8,2] → output [4,2,8,2,INT32_MIN,INT32_MIN,INT32_MIN],selected_count=4。

5 个场景的调优路径:

Case 方案 关键点
0 UB 缓存线程命中状态 命中标志写入 thread_selected_flags(1024),再遍历求前缀;以 UB 共享替代 GM 重复读取
1 两级归约计算前缀和 先统计每 warp 命中数 warp_selected_counts 与 warp 内顺序 lane_offset,再算 warp_selected_offsets;UB 读取从约 5.36 亿次降至 33264 次
2 Warp 原语替代显式 flag 遍历 asc_ballot + __popc + lanemask_lt() 在寄存器层交换数据,不经 UB
likedislike
Llizq15成员
9月21日 添加了label:requirement
Llizq15成员
9月21日 修改了issue 的描述
lizq15成员
9月21日 评论:

你好,感谢你的建议,我们将安排需求增加此样例。

likedislike
Llizq15成员
9月22日 关联了pull request:feat:新增混合编程最佳实践样例
Llizq15成员
13 天前 修改了issue 的描述
lizq15成员
13 天前 评论:

您好,相关代码已合入,我们先关闭此issue,后续如果有其他问题,欢迎再提issue交流~

likedislike
Llizq15成员
13 天前 issue状态由 待办的 改变为 已解决
Llizq15成员
13 天前 关闭了 issue
CANN-robotCANN-robot成员
13 天前 添加了label:resolved