已关闭
[Requirement|需求建议]: exp_segsum_grad host 侧 arch22/arch35 目录隔离 #2463
TangPC创建于  8月1日关闭于  8月1日
TangPC
TangPC成员
8月1日 创建

一、背景信息 (必填)

ExpSegsumGrad 同时支持两代架构,依据 math/exp_segsum_grad/op_host/exp_segsum_grad_def.cpp:39-50:

  • arch22:this->AICore().AddConfig("ascend910b")、this->AICore().AddConfig("ascend910_93")
  • arch35:this->AICore().AddConfig("ascend950", aicoreConfig)

但两代实现在 op_host/ 下的组织方式不对称:arch35 的 tiling 已收在 op_host/arch35/(exp_segsum_grad_tiling_arch35.cpp / .h),arch22 的 tiling 却散在 op_host/ 顶层(exp_segsum_grad_tiling.cpp / .h)。

这种不对称把复杂度推给了构建脚本。math/exp_segsum_grad/op_host/CMakeLists.txt 只能这样写:

add_modules_sources(OPTYPE exp_segsum_grad ACLNNTYPE aclnn_exclude)

if("${ASCEND_COMPUTE_UNIT}" STREQUAL "ascend950" AND TARGET ${OPHOST_NAME}_tiling_obj)
    target_sources(${OPHOST_NAME}_tiling_obj PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/arch35/exp_segsum_grad_tiling_arch35.cpp)
    get_target_property(EXP_SEGSUM_GRAD_TILING_SRCS ${OPHOST_NAME}_tiling_obj SOURCES)
    list(REMOVE_ITEM EXP_SEGSUM_GRAD_TILING_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/exp_segsum_grad_tiling.cpp")
    set_property(TARGET ${OPHOST_NAME}_tiling_obj PROPERTY SOURCES ${EXP_SEGSUM_GRAD_TILING_SRCS})
endif()

即:先让 add_modules_sources 把顶层的 arch22 tiling glob 进来,再在 ascend950 分支里把它从目标源列表中删掉。两代实现靠"事后删除"而不是靠"目录归属"区分。

同一算子的 op_kernel/ 侧已经是「顶层 arch22 + arch35/ 子目录」的布局,host 侧未对齐。

二、价值/作用 (必填)

  1. 与仓库通用机制对齐。cmake/func.cmake 已提供 add_all_modules_sources(... COMPUTE_UNIT ... TILING_DIR ...),经 find_value_by_key 把 compute unit 映射到 tiling 目录,再由 add_tiling_sources 收集:

    file(GLOB OPTILING_SRCS ${SOURCE_DIR}/op_host/*_tiling*.cpp ${SOURCE_DIR}/op_host/${tiling_dir}/*_tiling*.cpp)
    

    这正是为「一个算子多套架构 tiling 分目录存放」设计的机制。math/abs/CMakeLists.txt 即此用法:

    set(SUPPORT_COMPUTE_UNIT "ascend950" "mc62")
    set(SUPPORT_TILING_DIR "arch35" "arch35")
    add_all_modules_sources(OPTYPE abs ACLNNTYPE aclnn_exclude COMPUTE_UNIT ${SUPPORT_COMPUTE_UNIT} TILING_DIR ${SUPPORT_TILING_DIR} DISABLE_IN_OPP TRUE)
    

    arch22 的文件只要进了 op_host/arch22/,就能用「声明 compute unit → tiling 目录映射」取代当前的 REMOVE_ITEM 删除法。

  2. 消除易失效的路径耦合。REMOVE_ITEM 里硬编码了 ${CMAKE_CURRENT_SOURCE_DIR}/exp_segsum_grad_tiling.cpp 这个字面路径。文件一旦改名或移动,REMOVE_ITEM 会静默变成空操作(CMake 的 list(REMOVE_ITEM) 对不存在的元素不报错),ascend950 构建就可能把两套 tiling 同时编进去。这类失效没有任何编译期信号。

  3. 目录即架构边界,与 op_kernel/ 布局一致,新增第三代架构时可直接加目录,无需再改 CMakeLists.txt 的分支逻辑。

三、设计方案 (必填)

3.1 使能方式(涉及哪些框架:如Aclnn直调、Pytorch训练等)

Aclnn 直调。依据 math/exp_segsum_grad/op_host/op_api/aclnn_exp_segsum_backward.h:65,79,对外暴露:

ACLNN_API aclnnStatus aclnnExpSegsumBackwardGetWorkspaceSize(const aclTensor* gradOutput, const aclTensor* gradSelf, ...);
ACLNN_API aclnnStatus aclnnExpSegsumBackward(void* workspace, uint64_t workspaceSize, ...);

ST 用例位于 tests/st/aclnnExpSegsumBackward/(atk_aclnnExpSegsumBackward.json + executor_aclnnExpSegsumBackward.py)。

仓库代码中未见该算子的 PyTorch 适配层,故不在此声明其他使能方式。

本需求为代码结构重构,不改变任何使能方式。

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

依据 op_host/exp_segsum_grad_def.cpp:23-37,三个参数(输入 grad_output、grad_self,输出 grad_input)均为:

  • DataType:DT_FLOAT16、DT_FLOAT、DT_BF16
  • Format:FORMAT_ND(含 UnknownShapeFormat)

本需求不改变数据类型支持范围。

3.2.2 host侧设计

这是本需求的核心,分两步。

第一步:文件归位(已由关联 PR 完成)

原路径 新路径
op_host/exp_segsum_grad_tiling.cpp op_host/arch22/exp_segsum_grad_tiling.cpp
op_host/exp_segsum_grad_tiling.h op_host/arch22/exp_segsum_grad_tiling.h
tests/ut/op_host/test_exp_segsum_grad_tiling.cpp tests/ut/op_host/arch22/test_exp_segsum_grad_tiling.cpp

迁移后 op_host/ 下的架构划分为:

op_host/
├── arch22/                     # ascend910b / ascend910_93
│   ├── exp_segsum_grad_tiling.cpp
│   └── exp_segsum_grad_tiling.h
├── arch35/                     # ascend950
│   ├── exp_segsum_grad_tiling_arch35.cpp
│   └── exp_segsum_grad_tiling_arch35.h
├── exp_segsum_grad_def.cpp     # 架构无关
├── exp_segsum_grad_infershape.cpp
├── config/{ascend910b,ascend910_93,ascend950}/
└── op_api/

第二步:构建规则跟随目录调整(待完成)

文件移动后,以下三处仍按迁移前的路径匹配,需一并收敛:

位置 现状 影响
cmake/func.cmake · add_modules_sources file(GLOB OPTILING_SRCS ${SOURCE_DIR}/*_tiling*.cpp) 非递归匹配 op_host/ 顶层;该宏无 TILING_DIR 参数 迁移后 op_host/*_tiling*.cpp 不再有匹配项,arch22 tiling 不会被加入 ${OPHOST_NAME}_tiling_obj
math/exp_segsum_grad/op_host/CMakeLists.txt 仅在 ASCEND_COMPUTE_UNIT STREQUAL "ascend950" 分支显式添加 arch35/ 源;list(REMOVE_ITEM ...) 指向已迁走的 ${CMAKE_CURRENT_SOURCE_DIR}/exp_segsum_grad_tiling.cpp 非 ascend950 分支没有任何规则添加 arch22 源;REMOVE_ITEM 退化为空操作
cmake/ut.cmake · add_modules_ut_sources glob 为 ${DIR}/test_*_tiling.cpp 与 ${DIR}/${TILING_DIR}/test_*_tiling*.cpp,而 tests/ut/op_host/CMakeLists.txt 的调用点未传 TILING_DIR 两条 pattern 都只覆盖顶层,arch22/test_exp_segsum_grad_tiling.cpp 收集不到,随后 if(NOT OPHOST_TILING_CASES_SRC) return() 直接返回

建议的收敛方向:把 math/exp_segsum_grad 从旧的 add_modules_sources 迁到 add_all_modules_sources,用 compute unit → tiling 目录的映射声明取代 REMOVE_ITEM:

set(SUPPORT_COMPUTE_UNIT "ascend910b" "ascend910_93" "ascend950")
set(SUPPORT_TILING_DIR   "arch22"     "arch22"       "arch35")

UT 侧对应地在 add_modules_ut_sources 调用中补 TILING_DIR,使 ${DIR}/${TILING_DIR}/test_*_tiling*.cpp 能命中新目录。

3.2.3 kernel侧设计

本需求不涉及 kernel 侧改动。op_kernel/ 已是「顶层 exp_segsum_grad.cpp/.h(arch22)+ arch35/ 子目录」的布局,math/exp_segsum_grad/CMakeLists.txt 通过 add_kernel_sources(KERNEL_SRC arch35/exp_segsum_grad.cpp COMPUTE_UNITS ascend950 AUTO_SYNC false) 单独声明 arch35 kernel。本需求正是让 host 侧向这一既有布局对齐。

3.3 支持硬件

依据 op_host/exp_segsum_grad_def.cpp 的 AddConfig 与 op_host/config/ 下的配置目录:

架构 SOC 配置文件
arch22 ascend910b op_host/config/ascend910b/exp_segsum_grad_binary.json、exp_segsum_grad_simplified_key.ini
arch22 ascend910_93 op_host/config/ascend910_93/exp_segsum_grad_binary.json、exp_segsum_grad_simplified_key.ini
arch35 ascend950 op_host/config/ascend950/exp_segsum_grad_binary.json

本需求不改变支持硬件范围。

3.4 算子约束限制

本需求为源码目录结构重构,不引入新的算子使用约束,也不解除既有约束。算子原有的数据类型、Format、shape 支持范围与 tiling 策略(SCHEDULE_MODE = 1 batchmode、核间同步等)均保持不变。

需要注意的工程约束是:op_host/arch22/ 是本仓库首次出现的目录形态——全仓已有 490 个算子使用 op_host/arch35/,而 op_host/arch22/ 目前仅 exp_segsum_grad 一例。因此不能假设现有构建脚本已默认支持该路径,必须显式核对上述三处 glob 规则。

💡 备注(选填)

关联 PR:https://gitcode.com/cann/ops-math/pull/4380

该 PR 已完成第一步(文件归位)与 tests/ut/op_kernel/CMakeLists.txt 的路径同步;第二步(host 侧构建与 UT 收集规则跟随调整)待后续提交收敛。

likedislike
TangPCTangPC成员
8月1日 添加了label:requirement
TangPC
TangPC成员
8月1日 评论:

/assign @daiwei18

likedislike
CANN-robotCANN-robot成员
8月1日 将 daiwei18 设为负责人
CANN-robotCANN-robot成员
8月1日 关闭了 issue
CANN-robotCANN-robot成员
8月1日 添加了label:resolved