Pull Request已成功合入, 合并人@CANN-robot
(感谢 tang-haojie 的贡献)变更摘要
本次 PR 为 SuperKernel (SK) 融合节点新增了对 CUSTOM_VALUE 和 TILING 两种 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的字段folded、sub_addr_type、sub_idx重新布局为sub_addr_type int16_t、sub_idx int16_t、reserved[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 支持与
CopySubNodeTilingDataIfNeeded:runtime/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。


代码审查
关闭总结
审查结果汇总
| 优先级 | 数量 |
|---|---|
| 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 场景支持。设计意图明确,正向逻辑正确。发现的问题集中在两方面:
-
int32_t→int16_t收窄(P2):新SkArgDesc::sub_idx收窄为int16_t,可能导致ir_idx较大时(如 EVENT_ADDR 场景)静默截断。实际触发概率低,但一旦触发将导致错误的地址映射。 -
防御性检查缺失(P2):
AssembleIoByArgsFormat未校验sub_node_tiling_data_addrs_向量大小,当前代码路径安全但缺乏不变量保护。 -
未对齐内存访问(P3 ×2):多处通过
reinterpret_cast直接从ArgDesc::reserved(偏移 9 字节,仅 1 字节对齐)读取uint32_t/uint64_t,在严格对齐架构上可能触发硬件异常。其中AssembleIoByArgsFormat第 905 行的uint64_t解引用为本 diff 新增访问路径。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 2 |
💬 仅评论


/approve


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 的说明。