Closed
[Requirement|需求建议]: split/split_v/unpack 小 shape 场景头开销优化 #4568
zhanglei842Add on  9 days agoClosed at  2 days ago
zhanglei842Collaborators
9 days ago Create

一、背景信息(必填)

split/split_v/unpack(conversion 域,arch35)在小 shape 场景下,算子执行时间中 kernel 头开销占比过高:

  1. 三个算子的所有 tiling 模板统一使用完整的 SplitVTilingData(含 MAX_CORE_COUNT=72 的 nBlockSplitOffset/nBlockSplitOffsetEnd/nBlockSplitPrefixStart/nBlockSplitPrefixEnd 等数组字段),kernel 入口 GET_TILING_DATA 需整体反序列化,小 shape 模板实际只访问其中少数字段;
  2. kernel 入口与算子模板无差别构造 TPipe 并向模板注入 TPipe& pipe_、TQueBind 成员,小 shape 纯搬运/UB 内切分路径用不到队列机制;
  3. split_v kernel 入口残留未使用的 split_v_simt_chunk_pre.h include 与 TILING_KEY_SIMT_CHUNK(204) 定义(死代码)。

二、价值/作用(必填)

  • 小 shape 场景下降低 tiling 数据反序列化与 kernel 入口初始化开销,缩短算子端到端耗时;
  • tiling 数据按模板裁剪后体积显著缩减,减少 host→device 传递量;
  • 消除小 shape 路径的 TPipe/TQueBind 初始化,简化 kernel 头部执行路径;
  • 清理 SIMT chunk 死代码,降低维护成本。

三、设计方案(必填)

3.1 使能方式

Aclnn 直调(Ascend C kernel,KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY),入口 split_v(GM_ADDR x, GM_ADDR sizeSplits, GM_ADDR y, GM_ADDR workspace, GM_ADDR tiling) / split(...) / unpack(...))。

3.2 总体设计
3.2.1 算子支持的数据类型

int8 / int16 / int32 / int64(kernel 按 sizeof(DTYPE_X) 分支以 uint8/uint16/uint32/uint64 处理);sizeSplits 支持 int32(tiling 数据含 isInt32 标志)。

3.2.2 host 侧设计

split_v_tiling_arch35.h 新增按模板裁剪的精简 tiling 结构并注册 tilingKey:

tilingKey 精简结构 适用模板
100 / 101 SplitVSlimTilingData(纯标量 16 字段) 100 等长纯搬运、101 等长 UB 内 split(split/unpack 共用)
102 SplitVPureCopyTilingData 纯搬运模板(split_v_pure_copy.h)
103 SplitVUbSplitTilingData UB 内 split 模板(split_v_ub_split.h)
104 / 111 / 112 SplitVScalarTilingData(无数组字段,三模板字段并集) 104 特殊纯搬运(split_v)、111 小 G 等长(split/unpack)、112 等长 deinterleave(split/unpack)

host 侧 SplitVTiling 新增 FillSlimTilingData() / FillPureCopyTilingData() / FillUbSplitTilingData() / FillScalarTilingData() 分别填充对应结构,字段顺序与 SplitVTilingData 保持一致。

3.2.3 kernel 侧设计
  • kernel 入口(split_apt.cpp / split_v_apt.cpp / unpack_apt.cpp)按 tilingKey 用 GET_TILING_DATA_WITH_STRUCT 反序列化对应精简结构,替换原统一 GET_TILING_DATA(SplitVTilingData);
  • 移除入口与各模板的 TPipe 构造/注入(如 SplitVPureCopyModeSameLen op(pipe) → SplitVPureCopyModeSameLen op),模板删除 TPipe& pipe_、TQueBind 成员,改用事件(EVT_ID0/EVT_ID1)驱动的 DataCopy;
  • 等长模板(split_v_pure_copy_same_len.h、split_v_ub_split_same_len.h 等)改为从精简 tiling 取数(如 ubSize、realCoreNum);
  • 删除 split_v_apt.cpp 中未使用的 split_v_simt_chunk_pre.h include 与 TILING_KEY_SIMT_CHUNK(204)。
3.3 支持硬件

950

3.4 算子约束限制

  • 精简 tiling 结构仅覆盖所列 tilingKey 模板实际访问的字段,MAX_CORE_COUNT=72 上界不变;
  • SplitVSlimTilingData/SplitVScalarTilingData 为纯标量结构(无数组字段),不承载按核偏移数组,按核偏移数组仅保留在 102/103 对应结构中;
  • 111/112 模板由 split 与 unpack 共用(REGISTER_TILING_DATA_CLASS(Split_111/112/SplitV_111/112, ...))。
likedislike
Zzhanglei842Collaborators
9 days ago Added label: requirement
Zzhanglei842Collaborators
9 days ago Associated pull request
CANN-robotCANN-robotCollaborators
2 days ago Close issue
CANN-robotCANN-robotCollaborators
2 days ago changed custom state from 进行中 to 已完成
CANN-robotCANN-robotCollaborators
2 days ago Added label: resolved