已合并
【feat】: sk support tiling and custom value argsformat #3921
tang-haojie创建于 7月8日
【feat】: sk support tiling and custom value argsformat #3921
已合并
tang-haojie创建于 7月8日
tang-haojie成员
7月8日

Pull Request

描述

背景
SuperKernel(SK)作为融合节点,其 AssembleIoByArgsFormat 对 args_format 中 AddrType 的支持程度不如 kernel_task_info.cc 完整。此前 SK 遇到 CUSTOM_VALUE 类型会触发强校验断言失败,遇到 TILING 类型会直接返回 FAILED,导致携带这些类型的算子无法在 SK 场景下正常运行。
修改点

CUSTOM_VALUE 支持
SkArgDesc 结构体重构:将 addr_type/ir_idx 压缩为子字段(sub_addr_type int16_t + sub_idx int16_t),释放 reserved[8] 用于存储 payload,保持 24 字节 POD 不变
移除 SkArgDescV2:与 SkArgDesc 布局统一后等价,合并为 SkArgDesc
ConvertArgDescNormal2Sk / ConvertArgDescSk2Normal:新增 CUSTOM_VALUE 的双向转换逻辑,payload 通过 memcpy_s 存取
kernel_task_info.cc PreprocessForSkNode:改为调用 ConvertArgDescSkToNormal 统一解包,不再手动拆解字段
super_kernel_task_info.cc AssembleIoByArgsFormat:新增 CUSTOM_VALUE case,从 reserved 中读取 uint64_t 值追加到 io_addrs
TILING 支持
新增 CopySubNodeTilingDataIfNeeded():遍历 SK 子节点的 sub_node_op_desc_list_,从各子节点 op_desc 的 OpRunInfo 获取 tiling data,通过 MallocDynamicMemory + aclrtMemcpy 拷贝到设备
InitKernel 调用顺序:在 AssembleIoByArgsFormat() 前调用 CopySubNodeTilingDataIfNeeded(),确保 tiling data 已就绪
TILING case 实现:从返回 FAILED 改为追加 sub_node_tiling_data_addrs_[node_idx],与 kernel_task_info 中对齐
测试覆盖
UT 新增 7 个 args_format 转换测试(CUSTOM_VALUE 编解码、BIT32/BIT64 宽度、HIDDEN_INPUT 兼容等)
UT 新增 AssembleIoByArgsFormat_CustomValue_Success 和 AssembleIoByArgsFormat_Tiling_Success
UT 新增 CopySubNodeTilingDataIfNeeded_Success(验证有/无 tiling data 的子节点混合场景)
ST super_kernel_graph_load_and_success 新增 {skn19t} 和 {skn19#42} token,覆盖 TILING 和 CUSTOM_VALUE 端到端流程

变更类型

请选择本次引入的变更类型:

关联的Issue

如何测试

描述测试此变更的步骤和前提条件:
1.
2.

核对清单

其他信息

在此添加任何其他关于本次 PR 的说明。

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 tang-haojie 的贡献)
Ttang-haojie成员
7月8日 添加了label:enhancement
Ttang-haojie成员
7月8日 创建了 pull request,commit d2b53942
Ttang-haojie成员
7月8日 关联了issue:[Question|问题咨询]: 昇腾的ge的开源特性会支持到鸿蒙cann kit里吗?
atomgit-bot
atomgit-bot
7月8日 评论:

变更摘要

本次 PR 为 SuperKernel (SK) 融合节点新增了对 CUSTOM_VALUETILING 两种 AddrType 的支持。核心思路是重构 SkArgDesc 结构体,将原有的 addr_type/ir_idx/folded/sub_addr_type/sub_idx 字段重新布局为 addr_type/ir_idx/sub_addr_type/sub_idx/reserved[8],使其与 ArgDesc 保持相同 24 字节 POD 大小,从而废弃 SkArgDescV2。在此基础上,ConvertArgDescNormal2Sk / ConvertArgDescSk2Normal 新增了 CUSTOM_VALUE 的双向转换,将 payload 通过 memcpy_s 存取于 reserved 字段;同时新增 CopySubNodeTilingDataIfNeeded() 方法,在 InitKernel 中先于 AssembleIoByArgsFormat 调用,将子节点 tiling data 拷贝到设备,使 AssembleIoByArgsFormat 中的 TILING case 可从设备地址追加到 io_addrs,而 CUSTOM_VALUE case 则从 reserved 读取 uint64_t 值追加。

主要改动

  • SkArgDesc 结构体重构与 SkArgDescV2 移除inc/graph_metadef/graph/args_format_desc.h 中,将 SkArgDesc 的字段 foldedsub_addr_typesub_idx 重新布局为 sub_addr_type int16_tsub_idx int16_treserved[8],删除 SkArgDescV2,并增加 sizeof(SkArgDesc) == sizeof(ArgDesc) 的静态断言,确保结构体兼容且可安全 reinterpret_cast

  • CUSTOM_VALUE 双向转换逻辑graph_metadef/graph/utils/args_format_desc.cc 中,ConvertArgDescNormal2Sk 移除对 CUSTOM_VALUE 的断言拒绝,改为在 sub_idx 中编码位宽信息(BIT64→1,BIT32→-1),将 payload 通过 memcpy_s 写入 reserved[8]ConvertArgDescSk2Normal 对称地还原 CUSTOM_VALUE 类型与 payload。

  • TILING 支持与 CopySubNodeTilingDataIfNeededruntime/v1/graph/load/model_manager/task_info/fe/super_kernel_task_info.cc 新增 CopySubNodeTilingDataIfNeeded() 方法,遍历子节点 OpRunInfo 获取 tiling data,通过 MallocDynamicMemory + aclrtMemcpy 拷贝到设备,并在 InitKernel 中先于 AssembleIoByArgsFormat 调用;super_kernel_task_info.h 新增 sub_node_tiling_data_addrs_ 成员存储设备地址。

  • AssembleIoByArgsFormat 新增 CUSTOM_VALUE 和 TILING 处理super_kernel_task_info.cc 中,CUSTOM_VALUE case 从之前的返回 FAILED 改为从 arg_format.reserved 读取 uint64_t 值调用 AppendIoAddr;TILING case 从返回 FAILED 改为从 sub_node_tiling_data_addrs_ 获取设备地址追加到 io_addrs

  • PreprocessForSkNode 统一解包kernel_task_info.cc 中,原先手动拆解 SkArgDesc 子字段的逻辑被移除,改为统一调用 ArgsFormatDesc::ConvertArgDescSkToNormal 进行解包,简化代码并消除分散的 reinterpret_cast。

likedislike
atomgit-bot
atomgit-bot
7月8日 评论:

代码审查

关闭总结

审查结果汇总

优先级 数量
P0 0
P1 0
P2 2
P3 2

各文件审查确认

文件 结果
graph_metadef/graph/utils/args_format_desc.cc 已发现 3 个问题(P2 ×1, P3 ×2)
inc/graph_metadef/graph/args_format_desc.h 无问题(结构体布局变更为设计意图)
runtime/v1/graph/load/model_manager/task_info/fe/kernel_task_info.cc 无问题(使用统一 API 简化,行为等价)
runtime/v1/graph/load/model_manager/task_info/fe/super_kernel_task_info.cc 已发现 2 个问题(P2 ×1, P3 ×1)
runtime/v1/graph/load/model_manager/task_info/fe/super_kernel_task_info.h 无问题
tests/ge/st/testcase/test_davinci_model_execute.cc 无问题
tests/ge/ut/ge/graph/load/kernel_task_info_unittest.cc 无问题
tests/graph_metadef/ut/graph/testcase/args_format_desc_unittest.cc 无问题

整体风险评估:低至中等

本 PR 的核心变更是将 SkArgDesc 与废弃的 SkArgDescV2 合并为统一的 24 字节 POD 结构,并新增 CUSTOM_VALUE / TILING 的 SK 场景支持。设计意图明确,正向逻辑正确。发现的问题集中在两方面:

  1. int32_tint16_t 收窄(P2):新 SkArgDesc::sub_idx 收窄为 int16_t,可能导致 ir_idx 较大时(如 EVENT_ADDR 场景)静默截断。实际触发概率低,但一旦触发将导致错误的地址映射。

  2. 防御性检查缺失(P2):AssembleIoByArgsFormat 未校验 sub_node_tiling_data_addrs_ 向量大小,当前代码路径安全但缺乏不变量保护。

  3. 未对齐内存访问(P3 ×2):多处通过 reinterpret_cast 直接从 ArgDesc::reserved(偏移 9 字节,仅 1 字节对齐)读取 uint32_t/uint64_t,在严格对齐架构上可能触发硬件异常。其中 AssembleIoByArgsFormat 第 905 行的 uint64_t 解引用为本 diff 新增访问路径。

类型 数量
🔴 阻塞 0
🟡 建议 2

💬 仅评论

likedislike
此处折叠了81条消息 查看更多
夏国正成员
7月10日 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
7月10日 添加了label:lgtm
zhanj
zhanj成员
7月11日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
7月11日 添加了label:approved
CANN-robotCANN-robot成员
7月11日 合入了pull request