ExpSegsumGrad 同时支持两代架构,依据 math/exp_segsum_grad/op_host/exp_segsum_grad_def.cpp:39-50:
ExpSegsumGrad
math/exp_segsum_grad/op_host/exp_segsum_grad_def.cpp:39-50
this->AICore().AddConfig("ascend910b")
this->AICore().AddConfig("ascend910_93")
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)。
op_host/
op_host/arch35/
exp_segsum_grad_tiling_arch35.cpp
.h
exp_segsum_grad_tiling.cpp
这种不对称把复杂度推给了构建脚本。math/exp_segsum_grad/op_host/CMakeLists.txt 只能这样写:
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 分支里把它从目标源列表中删掉。两代实现靠"事后删除"而不是靠"目录归属"区分。
add_modules_sources
同一算子的 op_kernel/ 侧已经是「顶层 arch22 + arch35/ 子目录」的布局,host 侧未对齐。
op_kernel/
arch35/
与仓库通用机制对齐。cmake/func.cmake 已提供 add_all_modules_sources(... COMPUTE_UNIT ... TILING_DIR ...),经 find_value_by_key 把 compute unit 映射到 tiling 目录,再由 add_tiling_sources 收集:
cmake/func.cmake
add_all_modules_sources(... COMPUTE_UNIT ... TILING_DIR ...)
find_value_by_key
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 即此用法:
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 删除法。
op_host/arch22/
REMOVE_ITEM
消除易失效的路径耦合。REMOVE_ITEM 里硬编码了 ${CMAKE_CURRENT_SOURCE_DIR}/exp_segsum_grad_tiling.cpp 这个字面路径。文件一旦改名或移动,REMOVE_ITEM 会静默变成空操作(CMake 的 list(REMOVE_ITEM) 对不存在的元素不报错),ascend950 构建就可能把两套 tiling 同时编进去。这类失效没有任何编译期信号。
${CMAKE_CURRENT_SOURCE_DIR}/exp_segsum_grad_tiling.cpp
list(REMOVE_ITEM)
目录即架构边界,与 op_kernel/ 布局一致,新增第三代架构时可直接加目录,无需再改 CMakeLists.txt 的分支逻辑。
CMakeLists.txt
Aclnn 直调。依据 math/exp_segsum_grad/op_host/op_api/aclnn_exp_segsum_backward.h:65,79,对外暴露:
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)。
tests/st/aclnnExpSegsumBackward/
atk_aclnnExpSegsumBackward.json
executor_aclnnExpSegsumBackward.py
仓库代码中未见该算子的 PyTorch 适配层,故不在此声明其他使能方式。
本需求为代码结构重构,不改变任何使能方式。
依据 op_host/exp_segsum_grad_def.cpp:23-37,三个参数(输入 grad_output、grad_self,输出 grad_input)均为:
op_host/exp_segsum_grad_def.cpp:23-37
grad_output
grad_self
grad_input
DT_FLOAT16
DT_FLOAT
DT_BF16
FORMAT_ND
UnknownShapeFormat
本需求不改变数据类型支持范围。
这是本需求的核心,分两步。
第一步:文件归位(已由关联 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/
第二步:构建规则跟随目录调整(待完成)
文件移动后,以下三处仍按迁移前的路径匹配,需一并收敛:
file(GLOB OPTILING_SRCS ${SOURCE_DIR}/*_tiling*.cpp)
TILING_DIR
op_host/*_tiling*.cpp
${OPHOST_NAME}_tiling_obj
ASCEND_COMPUTE_UNIT STREQUAL "ascend950"
list(REMOVE_ITEM ...)
cmake/ut.cmake
add_modules_ut_sources
${DIR}/test_*_tiling.cpp
${DIR}/${TILING_DIR}/test_*_tiling*.cpp
tests/ut/op_host/CMakeLists.txt
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:
math/exp_segsum_grad
add_all_modules_sources
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 能命中新目录。
本需求不涉及 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 侧向这一既有布局对齐。
exp_segsum_grad.cpp
math/exp_segsum_grad/CMakeLists.txt
add_kernel_sources(KERNEL_SRC arch35/exp_segsum_grad.cpp COMPUTE_UNITS ascend950 AUTO_SYNC false)
依据 op_host/exp_segsum_grad_def.cpp 的 AddConfig 与 op_host/config/ 下的配置目录:
op_host/exp_segsum_grad_def.cpp
AddConfig
op_host/config/
op_host/config/ascend910b/exp_segsum_grad_binary.json
exp_segsum_grad_simplified_key.ini
op_host/config/ascend910_93/exp_segsum_grad_binary.json
op_host/config/ascend950/exp_segsum_grad_binary.json
本需求不改变支持硬件范围。
本需求为源码目录结构重构,不引入新的算子使用约束,也不解除既有约束。算子原有的数据类型、Format、shape 支持范围与 tiling 策略(SCHEDULE_MODE = 1 batchmode、核间同步等)均保持不变。
SCHEDULE_MODE = 1
需要注意的工程约束是:op_host/arch22/ 是本仓库首次出现的目录形态——全仓已有 490 个算子使用 op_host/arch35/,而 op_host/arch22/ 目前仅 exp_segsum_grad 一例。因此不能假设现有构建脚本已默认支持该路径,必须显式核对上述三处 glob 规则。
exp_segsum_grad
💡 备注(选填)
关联 PR:https://gitcode.com/cann/ops-math/pull/4380
该 PR 已完成第一步(文件归位)与 tests/ut/op_kernel/CMakeLists.txt 的路径同步;第二步(host 侧构建与 UT 收集规则跟随调整)待后续提交收敛。
tests/ut/op_kernel/CMakeLists.txt
/assign @daiwei18
一、背景信息 (必填)
ExpSegsumGrad同时支持两代架构,依据math/exp_segsum_grad/op_host/exp_segsum_grad_def.cpp:39-50:this->AICore().AddConfig("ascend910b")、this->AICore().AddConfig("ascend910_93")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 侧未对齐。二、价值/作用 (必填)
与仓库通用机制对齐。
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删除法。消除易失效的路径耦合。
REMOVE_ITEM里硬编码了${CMAKE_CURRENT_SOURCE_DIR}/exp_segsum_grad_tiling.cpp这个字面路径。文件一旦改名或移动,REMOVE_ITEM会静默变成空操作(CMake 的list(REMOVE_ITEM)对不存在的元素不报错),ascend950 构建就可能把两套 tiling 同时编进去。这类失效没有任何编译期信号。目录即架构边界,与
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)均为:DT_FLOAT16、DT_FLOAT、DT_BF16FORMAT_ND(含UnknownShapeFormat)本需求不改变数据类型支持范围。
3.2.2 host侧设计
这是本需求的核心,分两步。
第一步:文件归位(已由关联 PR 完成)
op_host/exp_segsum_grad_tiling.cppop_host/arch22/exp_segsum_grad_tiling.cppop_host/exp_segsum_grad_tiling.hop_host/arch22/exp_segsum_grad_tiling.htests/ut/op_host/test_exp_segsum_grad_tiling.cpptests/ut/op_host/arch22/test_exp_segsum_grad_tiling.cpp迁移后
op_host/下的架构划分为:第二步:构建规则跟随目录调整(待完成)
文件移动后,以下三处仍按迁移前的路径匹配,需一并收敛:
cmake/func.cmake·add_modules_sourcesfile(GLOB OPTILING_SRCS ${SOURCE_DIR}/*_tiling*.cpp)非递归匹配op_host/顶层;该宏无TILING_DIR参数op_host/*_tiling*.cpp不再有匹配项,arch22 tiling 不会被加入${OPHOST_NAME}_tiling_objmath/exp_segsum_grad/op_host/CMakeLists.txtASCEND_COMPUTE_UNIT STREQUAL "ascend950"分支显式添加arch35/源;list(REMOVE_ITEM ...)指向已迁走的${CMAKE_CURRENT_SOURCE_DIR}/exp_segsum_grad_tiling.cppREMOVE_ITEM退化为空操作cmake/ut.cmake·add_modules_ut_sources${DIR}/test_*_tiling.cpp与${DIR}/${TILING_DIR}/test_*_tiling*.cpp,而tests/ut/op_host/CMakeLists.txt的调用点未传TILING_DIRarch22/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/下的配置目录:op_host/config/ascend910b/exp_segsum_grad_binary.json、exp_segsum_grad_simplified_key.iniop_host/config/ascend910_93/exp_segsum_grad_binary.json、exp_segsum_grad_simplified_key.iniop_host/config/ascend950/exp_segsum_grad_binary.json本需求不改变支持硬件范围。
3.4 算子约束限制
本需求为源码目录结构重构,不引入新的算子使用约束,也不解除既有约束。算子原有的数据类型、Format、shape 支持范围与 tiling 策略(
SCHEDULE_MODE = 1batchmode、核间同步等)均保持不变。需要注意的工程约束是:
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 收集规则跟随调整)待后续提交收敛。