Files
enginex-ascend-910-vllm/csrc/cmake/func_utest.cmake
Sun Ruoxi 7f8a1b1f7a init v0.23.0
Signed-off-by: Sun Ruoxi <sunruoxi@4paradigm.com>
2026-08-27 15:11:51 +08:00

1199 lines
60 KiB
CMake
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -----------------------------------------------------------------------------------------------------------
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
# CANN Open Software License Agreement Version 2.0 (the "License").
# Please refer to the License for details. You may not use this file except in compliance with the License.
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
# See LICENSE in the root of the software repository for the full text of the License.
# -----------------------------------------------------------------------------------------------------------
########################################################################################################################
# 预定义变量
########################################################################################################################
# 缓存所有算子 UTest 场景 OpApi 动态库相关信息
set(_OpsTestUt_OpApiSources "" CACHE INTERNAL "" FORCE) # Sources
set(_OpsTestUt_OpApiPrivateIncludesExt "" CACHE INTERNAL "" FORCE) # PrivateIncludesExt
set(_OpsTestUt_OpApiLinkLibrariesExt "" CACHE INTERNAL "" FORCE) # LinkLibrariesExt
add_library(_OpsTestUt_OpApi_Wno INTERFACE)
target_compile_options(_OpsTestUt_OpApi_Wno
INTERFACE
$<$<CXX_COMPILER_ID:Clang>:-Wno-mismatched-tags>
$<$<CXX_COMPILER_ID:GNU>:-Wno-format-signedness>
-Wno-extra
-Wno-redundant-decls
)
add_definitions(-DNOT_DYNAMIC_COMPILE)
# 缓存所有算子 UTest 场景 OpProto 动态库相关信息
set(_OpsTestUt_OpProtoSources "" CACHE INTERNAL "" FORCE) # Sources
set(_OpsTestUt_OpProtoPrivateIncludesExt "" CACHE INTERNAL "" FORCE) # PrivateIncludesExt
set(_OpsTestUt_OpProtoLinkLibrariesExt "" CACHE INTERNAL "" FORCE) # LinkLibrariesExt
# 缓存所有算子 UTest 场景 OpTiling 动态库相关信息
set(_OpsTestUt_OpTilingSources "" CACHE INTERNAL "" FORCE) # Sources
set(_OpsTestUt_OpTilingPrivateIncludesExt "" CACHE INTERNAL "" FORCE) # PrivateIncludesExt
set(_OpsTestUt_OpTilingLinkLibrariesExt "" CACHE INTERNAL "" FORCE) # LinkLibrariesExt
add_library(_OpsTestUt_OpTiling_Wno INTERFACE)
target_compile_options(_OpsTestUt_OpTiling_Wno
INTERFACE
$<$<CXX_COMPILER_ID:Clang>:-Wno-unused-private-field>
$<$<CXX_COMPILER_ID:Clang>:-Wno-redundant-move>
-Wno-shadow
$<$<CXX_COMPILER_ID:GNU>:-Wno-format-signedness>
-Wno-extra
)
# 缓存当前算子 UTest 场景 OpKernel 目标
set(_OpsTestUt_OpKernelLibraries "" CACHE INTERNAL "" FORCE) # LinkLibrariesExt
add_library(_OpsTestUt_OpKernel_Wno INTERFACE)
target_compile_options(_OpsTestUt_OpKernel_Wno
INTERFACE
-Wno-undef
-Wno-cast-qual
-Wno-shadow
-Wno-sign-compare
-Wno-unused-macros
-Wno-unused-variable
$<$<CXX_COMPILER_ID:GNU>:-Wno-unused-but-set-variable>
$<$<CXX_COMPILER_ID:Clang>:$<$<VERSION_GREATER_EQUAL:${CMAKE_C_COMPILER_VERSION},15.0.4>:-Wno-unused-but-set-variable>>
$<$<CXX_COMPILER_ID:GNU>:-Wno-duplicated-branches>
-Wno-extra
-Wno-float-conversion
-Wno-parentheses
)
# 缓存当前算子 UTest 场景 UTestCommon 目标
set(_OpsTestUt_UTestCommonLibrary "" CACHE INTERNAL "" FORCE)
# 缓存所有算子 UTest 场景 UTest用例 动态库相关信息
set(_OpsTestUt_UTestCaseLibraries "" CACHE INTERNAL "" FORCE)
set(_OpsTestUt_UTestAclnnCaseLibraries "" CACHE INTERNAL "" FORCE)
add_library(_OpsTestUt_UTestCaseStatic_Wno INTERFACE)
target_compile_options(_OpsTestUt_UTestCaseStatic_Wno
INTERFACE
$<$<CXX_COMPILER_ID:Clang>:-Wno-vla>
)
# GTest 版本兼容性保证
add_library(_OpsTestUt_GTest_Wno INTERFACE)
target_compile_options(_OpsTestUt_GTest_Wno
INTERFACE
-Wno-undef
)
########################################################################################################################
# 编译方法
########################################################################################################################
# Level1, 添加算子 OpApi 动态库
#[[
调用参数:
one_value_keywords:
SUB_SYSTEM : 必选参数, 用于指定算子所属子系统, 如 transformer
BRIEF : 必选参数, 用于指定算子缩略名(建议以大驼峰命名, 与算子实际名称无强制对应关系), 如 Fag/Fas/Fa
SNAKE : 必选参数, 用于指定算子全名, 如 flash_attention_score_grad
multi_value_keywords:
SOURCES_EXT : 可选参数, 额外源文件
PRIVATE_INCLUDES_EXT : 可选参数, 额外头文件搜索路径
PRIVATE_LINK_LIBRARIES_EXT : 可选参数, 额外链接库
备注说明:
本函数提供编译算子对应 opapi.so 的功能. 下面介绍在调用本函数时所需了解的一些背景知识和注意事项.
1. 本函数假设算子对应 OpApi 的源文件位于 'src/${SUB_SYSTEM}/${SNAKE}/op_host' 路径, 并自动添加以下内容:
a) 源文件: ${SNAKE}.cpp, aclnn_${SNAKE}.cpp
b) 头文件搜索路径: 'src/${SUB_SYSTEM}/${SNAKE}/op_host'
2. 若算子 '需要额外的源文件’ 或 ‘源文件不满足上述约定的默认路径', 则可通过 SOURCES_EXT 参数指定 '额外的源文件';
3. 若算子 '需要额外头文件搜索路径’ 或 ‘本函数现有实现的头文件搜索路径设置不满足',
则可通过 PRIVATE_INCLUDES_EXT 参数指定 '额外的头文件搜索路径'; 参数 PRIVATE_LINK_LIBRARIES_EXT 设置逻辑同理;
]]
function(OpsTest_Level1_AddOpApiShared)
cmake_parse_arguments(
TMP
""
"SUB_SYSTEM;BRIEF;SNAKE"
"SOURCES_EXT;PRIVATE_INCLUDES_EXT;PRIVATE_LINK_LIBRARIES_EXT"
""
${ARGN}
)
get_filename_component(_L0_Src "${OPS_ADV_DIR}/${TMP_SUB_SYSTEM}/${TMP_SNAKE}/op_host/${TMP_SNAKE}.cpp" REALPATH)
if (NOT EXISTS "${_L0_Src}")
set(_L0_Src)
endif ()
get_filename_component(_L2_Src "${OPS_ADV_DIR}/${TMP_SUB_SYSTEM}/${TMP_SNAKE}/op_host/aclnn_${TMP_SNAKE}.cpp" REALPATH)
if (NOT EXISTS "${_L2_Src}")
set(_L2_Src)
endif ()
get_filename_component(_Inc "${OPS_ADV_DIR}/${TMP_SUB_SYSTEM}/${TMP_SNAKE}/op_host/" REALPATH)
if (NOT EXISTS "${_Inc}")
set(_Inc)
endif ()
set(_Sources ${TMP_SOURCES_EXT} ${_L0_Src} ${_L2_Src})
list(REMOVE_DUPLICATES _Sources)
if (_Sources)
set(_PrivateIncludeDirs ${TMP_PRIVATE_INCLUDES_EXT} ${_Inc})
list(REMOVE_DUPLICATES _PrivateIncludeDirs)
set(_OpsTestUt_OpApiSources ${_OpsTestUt_OpApiSources} ${_Sources} CACHE INTERNAL "" FORCE)
set(_OpsTestUt_OpApiPrivateIncludesExt ${_OpsTestUt_OpApiPrivateIncludesExt} ${_PrivateIncludeDirs} CACHE INTERNAL "" FORCE)
set(_OpsTestUt_OpApiLinkLibrariesExt ${_OpsTestUt_OpApiLinkLibrariesExt} ${TMP_PRIVATE_LINK_LIBRARIES_EXT} CACHE INTERNAL "" FORCE)
endif ()
endfunction()
# 私有函数, 外部不可直接调用, 用于实际生成 OpApi 动态库
#[[
]]
function(OpsTest_AddOpApiShared)
list(REMOVE_DUPLICATES _OpsTestUt_OpApiSources)
list(REMOVE_DUPLICATES _OpsTestUt_OpApiPrivateIncludesExt)
list(REMOVE_DUPLICATES _OpsTestUt_OpApiLinkLibrariesExt)
if ("${_OpsTestUt_OpApiSources}" STREQUAL "")
return()
endif ()
set(_Target ${UTest_NamePrefix}_OpApi)
add_library(${_Target} SHARED)
target_sources(${_Target}
PRIVATE
${_OpsTestUt_OpApiSources}
)
target_include_directories(${_Target}
PRIVATE
${OPAPI_INCLUDE}
${_OpsTestUt_OpApiPrivateIncludesExt}
${ASCEND_CANN_PACKAGE_PATH}/runtime/pkg_inc
${ASCEND_CANN_PACKAGE_PATH}/runtime/pkg_inc/profiling
)
target_compile_options(${_Target}
PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:-std=gnu++1z>
)
target_compile_definitions(${_Target}
PRIVATE
ACLNN_LOG_FMT_CHECK
LOG_CPP
PROCESS_LOG
)
target_link_libraries(${_Target}
PRIVATE
-Wl,--whole-archive
${_OpsTestUt_OpApiLinkLibrariesExt}
$<BUILD_INTERFACE:intf_pub_utest>
$<BUILD_INTERFACE:_OpsTestUt_OpApi_Wno>
-Wl,--no-whole-archive
PRIVATE $<$<BOOL:${BUILD_WITH_INSTALLED_DEPENDENCY_CANN_PKG}>:$<BUILD_INTERFACE:opapi_math>>
nnopbase
profapi
ge_common_base
ascend_dump
ascendalog
dl
)
set(_UTest_OpApiLibrary ${_Target} PARENT_SCOPE)
endfunction()
# Level1, 添加算子 OpProto 动态库
#[[
调用参数:
one_value_keywords:
SUB_SYSTEM : 必选参数, 用于指定算子所属子系统, 如 transformer
BRIEF : 必选参数, 用于指定算子缩略名(建议以大驼峰命名, 与算子实际名称无强制对应关系), 如 Fag/Fas/Fa
SNAKE : 必选参数, 用于指定算子全名, 如 flash_attention_score_grad
multi_value_keywords:
SOURCES_EXT : 可选参数, 额外源文件
PRIVATE_INCLUDES_EXT : 可选参数, 额外头文件搜索路径
PRIVATE_LINK_LIBRARIES_EXT : 可选参数, 额外链接库
备注说明:
本函数提供编译算子对应 OpProto.so 的功能. 下面介绍在调用本函数时所需了解的一些背景知识和注意事项.
1. 本函数假设算子对应 OpProto 的源文件位于 'src/${SUB_SYSTEM}/${SNAKE}/op_host' 路径, 并自动添加以下内容:
a) 源文件: ${SNAKE}_proto.cpp
b) 头文件搜索路径: 'src/${SUB_SYSTEM}/${SNAKE}/op_host'
2. 若算子 '需要额外的源文件’ 或 ‘源文件不满足上述约定的默认路径', 则可通过 SOURCES_EXT 参数指定 '额外的源文件';
3. 若算子 '需要额外头文件搜索路径’ 或 ‘本函数现有实现的头文件搜索路径设置不满足',
则可通过 PRIVATE_INCLUDES_EXT 参数指定 '额外的头文件搜索路径'; 参数 PRIVATE_LINK_LIBRARIES_EXT 设置逻辑同理;
]]
function(OpsTest_Level1_AddOpProtoShared)
cmake_parse_arguments(
TMP
""
"SUB_SYSTEM;BRIEF;SNAKE"
"SOURCES_EXT;PRIVATE_INCLUDES_EXT;PRIVATE_LINK_LIBRARIES_EXT"
""
${ARGN}
)
get_filename_component(_Src "${OPS_ADV_DIR}/${TMP_SUB_SYSTEM}/${TMP_SNAKE}/op_host/${TMP_SNAKE}_proto.cpp" REALPATH)
if (NOT EXISTS "${_Src}")
set(_Src)
endif ()
get_filename_component(_Inc "${OPS_ADV_DIR}/${TMP_SUB_SYSTEM}/${TMP_SNAKE}/op_host/" REALPATH)
if (NOT EXISTS "${_Inc}")
set(_Inc)
endif ()
set(_Sources ${TMP_SOURCES_EXT} ${_Src})
list(REMOVE_DUPLICATES _Sources)
if (_Sources)
set(_PrivateIncludeDirs ${TMP_PRIVATE_INCLUDES_EXT} ${_Inc})
list(REMOVE_DUPLICATES _PrivateIncludeDirs)
set(_OpsTestUt_OpProtoSources ${_OpsTestUt_OpProtoSources} ${_Sources} CACHE INTERNAL "" FORCE)
set(_OpsTestUt_OpProtoPrivateIncludesExt ${_OpsTestUt_OpProtoPrivateIncludesExt} ${_PrivateIncludeDirs} CACHE INTERNAL "" FORCE)
set(_OpsTestUt_OpProtoLinkLibrariesExt ${_OpsTestUt_OpProtoLinkLibrariesExt} ${TMP_PRIVATE_LINK_LIBRARIES_EXT} CACHE INTERNAL "" FORCE)
endif ()
endfunction()
# 私有函数, 外部不可直接调用, 用于实际生成 OpProto 动态库
#[[
]]
function(OpsTest_AddOpProtoShared)
list(REMOVE_DUPLICATES _OpsTestUt_OpProtoSources)
list(REMOVE_DUPLICATES _OpsTestUt_OpProtoPrivateIncludesExt)
list(REMOVE_DUPLICATES _OpsTestUt_OpProtoLinkLibrariesExt)
if ("${_OpsTestUt_OpProtoSources}" STREQUAL "")
return()
endif ()
set(_Target ${UTest_NamePrefix}_OpProto)
add_library(${_Target} SHARED)
target_sources(${_Target}
PRIVATE
${_OpsTestUt_OpProtoSources}
)
target_include_directories(${_Target}
PRIVATE
${OPBASE_INC_DIRS}
${_OpsTestUt_OpProtoPrivateIncludesExt}
)
target_compile_options(${_Target}
PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:-std=gnu++1z>
)
target_compile_definitions(${_Target}
PRIVATE
LOG_CPP
PROCESS_LOG
)
target_link_libraries(${_Target}
PRIVATE
-Wl,--whole-archive
${_OpsTestUt_OpProtoLinkLibrariesExt}
$<BUILD_INTERFACE:intf_pub_utest>
$<BUILD_INTERFACE:ops_transformer_utils_proto_headers>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:alog_headers>>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:dlog_headers>>
-Wl,--no-whole-archive
ascendalog
)
set(_UTest_OpProtoLibrary ${_Target} PARENT_SCOPE)
endfunction()
# Level1, 添加算子 OpTiling 动态库
#[[
调用参数:
one_value_keywords:
SUB_SYSTEM : 必选参数, 用于指定算子所属子系统, 如 transformer
BRIEF : 必选参数, 用于指定算子缩略名(建议以大驼峰命名, 与算子实际名称无强制对应关系), 如 Fag/Fas/Fa
SNAKE : 必选参数, 用于指定算子全名, 如 flash_attention_score_grad
multi_value_keywords:
SOURCES_EXT : 可选参数, 额外源文件
PRIVATE_INCLUDES_EXT : 可选参数, 额外头文件搜索路径
PRIVATE_LINK_LIBRARIES_EXT : 可选参数, 额外链接库
备注说明:
本函数提供编译算子对应 OpTiling.so 的功能. 下面介绍在调用本函数时所需了解的一些背景知识和注意事项.
1. 本函数假设算子对应 OpTiling 的源文件位于 'src/${SUB_SYSTEM}/${SNAKE}/op_host/${SNAKE}_tiling.cpp/.cc' 路径;
2. 若算子 '需要额外的源文件’ 或 ‘源文件不满足上述约定的默认路径', 则可通过 SOURCES_EXT 参数指定 '额外的源文件';
3. 若算子 '需要额外头文件搜索路径’ 或 ‘本函数现有实现的头文件搜索路径设置不满足',
则可通过 PRIVATE_INCLUDES_EXT 参数指定 '额外的头文件搜索路径'; 参数 PRIVATE_LINK_LIBRARIES_EXT 设置逻辑同理;
]]
function(OpsTest_Level1_AddOpTilingShared)
cmake_parse_arguments(
TMP
""
"SUB_SYSTEM;BRIEF;SNAKE"
"SOURCES_EXT;PRIVATE_INCLUDES_EXT;PRIVATE_LINK_LIBRARIES_EXT"
""
${ARGN}
)
file(GLOB _Src1 "${OPS_ADV_DIR}/${TMP_SUB_SYSTEM}/${TMP_SNAKE}/op_host/${TMP_SNAKE}_tiling.cc")
file(GLOB _Src2 "${OPS_ADV_DIR}/${TMP_SUB_SYSTEM}/${TMP_SNAKE}/op_host/${TMP_SNAKE}_tiling.cpp")
list(APPEND _Sources ${TMP_SOURCES_EXT} ${_Src1} ${_Src2})
list(REMOVE_DUPLICATES _Sources)
get_filename_component(_Inc "${OPS_ADV_DIR}/${TMP_SUB_SYSTEM}/${TMP_SNAKE}/op_host/" REALPATH)
if (NOT EXISTS "${_Inc}")
set(_Inc)
endif ()
if (_Sources)
set(_PrivateIncludeDirs ${TMP_PRIVATE_INCLUDES_EXT} ${_Inc})
list(REMOVE_DUPLICATES _PrivateIncludeDirs)
set(_OpsTestUt_OpTilingSources ${_OpsTestUt_OpTilingSources} ${_Sources} CACHE INTERNAL "" FORCE)
set(_OpsTestUt_OpTilingPrivateIncludesExt ${_OpsTestUt_OpTilingPrivateIncludesExt} ${_PrivateIncludeDirs} CACHE INTERNAL "" FORCE)
set(_OpsTestUt_OpTilingLinkLibrariesExt ${_OpsTestUt_OpTilingLinkLibrariesExt} ${TMP_PRIVATE_LINK_LIBRARIES_EXT} CACHE INTERNAL "" FORCE)
endif ()
endfunction()
# 私有函数, 外部不可直接调用, 用于实际生成 OpTiling 动态库
#[[
]]
function(OpsTest_AddOpTilingShared)
list(REMOVE_DUPLICATES _OpsTestUt_OpTilingSources)
list(REMOVE_DUPLICATES _OpsTestUt_OpTilingPrivateIncludesExt)
list(REMOVE_DUPLICATES _OpsTestUt_OpTilingLinkLibrariesExt)
set(_Target ${UTest_NamePrefix}_OpTiling)
add_library(${_Target} SHARED)
target_sources(${_Target}
PRIVATE
${_OpsTestUt_OpTilingSources}
${OPS_ADV_DIR}/tests/ut/framework_special/stubs/tiling/tiling_templates_registry.cpp
)
target_include_directories(${_Target}
PRIVATE
${OPBASE_INC_DIRS}
${_OpsTestUt_OpTilingPrivateIncludesExt}
${OPS_TRANSFORMER_DIR}/common/include
)
target_compile_definitions(${_Target}
PRIVATE
OP_TILING_LIB
LOG_CPP
PROCESS_LOG
)
target_compile_options(${_Target}
PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:-std=c++11>
)
target_link_libraries(${_Target}
PRIVATE
-Wl,--as-needed
-Wl,--no-whole-archive
${_OpsTestUt_OpTilingLinkLibrariesExt}
$<BUILD_INTERFACE:intf_pub_utest>
$<BUILD_INTERFACE:_OpsTestUt_OpTiling_Wno>
$<BUILD_INTERFACE:ops_transformer_utils_tiling_headers>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:alog_headers>>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:dlog_headers>>
graph
graph_base
exe_graph
platform
register
ascendalog
tiling_api
c_sec
)
set(_UTest_OpTilingLibrary ${_Target} PARENT_SCOPE)
endfunction()
# Level1, 添加算子 Kernel 静态库
#[[
调用参数:
one_value_keywords:
SUB_SYSTEM : 必选参数, 用于指定算子所属子系统, 如 transformer
BRIEF : 必选参数, 用于指定算子缩略名(建议以大驼峰命名, 与算子实际名称无强制对应关系), 如 Fag/Fas/Fa
SNAKE : 必选参数, 用于指定算子全名, 如 flash_attention_score_grad
multi_value_keywords:
SOURCES_EXT : 可选参数, 额外源文件
TILING_DATA_DEF_H : 可选参数, 算子 Kernel 所需 TilingData 定义头文件
PRIVATE_INCLUDES_EXT : 可选参数, 额外头文件搜索路径
PRIVATE_COMPILE_DEFINITIONS_EXT : 可选参数, 额外编译宏
备注说明:
本函数提供编译算子对应 kernel.a 的功能. 下面介绍在调用本函数时所需了解的一些背景知识和注意事项.
1. 本函数假设算子对应 Kernel 的源文件位于 'src/${SUB_SYSTEM}/${SNAKE}/${SNAKE}.cpp' 路径;
2. 若算子 '需要额外的源文件’ 或 ‘源文件不满足上述约定的默认路径', 则可通过 SOURCES_EXT 参数指定 '额外的源文件';
3. 当前 Ascend C 融合算子 Kernel 一般需要多个(>2) TilingData 定义头文件,
如 flash_attention_score 算子需要 data_copy_transpose_tiling_def.h 和 flash_attention_score_tiling.h;
- 在 NPU 编译时, 编译框架使用 ccec 编译器并使用 -include 编译选项注入所需的多个 TilingData 定义头文件 至 Kernel 源文件;
- 但 CPU 编译时, CMake 早期版本在处理 -include 选项时有 Bug(只第一个 -include 指定的头文件生效).
故本框架通过新增一个 {BRIEF}_tiling_data.h, 再在该文件中 include 所需的多个 TilingData 定义头文件,
再通过 -include 编译选项注入 {BRIEF}_tiling_data.h 的方式规避 CPU 编译时 CMake 不能处理多个 -include 选项的 Bug;
4. PRIVATE_COMPILE_DEFINITIONS_EXT 设置格式如下:
optional{KernelCtrlParam func suffix} optional{OtherCompileDefinitions}}
其中 KernelCtrlParam 用于指定 Kernel 编译控制参数, func 为标识 Kernel 原始入口函数名,
suffix 为标识当前 Kernel 二进制及 Kernel 入口函数后缀; 其设置逻辑如下:
4.0 KernelCtrlParam 内 func, suffix 必需按序设置;
4.1 当不设置 KernelCtrlParam 时, 仅会编译一个 Kernel.a 并以 OtherCompileDefinitions 设置编译 Definitions(如设置);
4.2 若当设置 KernelCtrlParam 时, 本函数会按 KernelCtrlParam 个数逐个编译 Kernel.a,
并以 KernelCtrlParam 间 OtherCompileDefinitions 设置编译宏定义; 并将 func 重命名为 {func}_{suffix};
4.3 KernelCtrlParam 内 func 支持指定多个, 指定多个时 func 之间用','间隔;
]]
function(OpsTest_Level1_AddOpKernelStatic)
cmake_parse_arguments(
TMP
""
"SUB_SYSTEM;BRIEF;SNAKE"
"SOURCES_EXT;TILING_DATA_DEF_H;PRIVATE_INCLUDES_EXT;PRIVATE_COMPILE_DEFINITIONS_EXT"
""
${ARGN}
)
# 生成 Kernel 所需的结构体表示的对应 tiling.h
string(TOLOWER ${TMP_BRIEF} tmp_brief)
set(_tmp_files ${TMP_TILING_DATA_DEF_H})
list(REMOVE_DUPLICATES _tmp_files)
set(_ori_files)
set(_define_py ${OPS_ADV_DIR}/cmake/scripts/utest/gen_tiling_data_stub.py)
foreach (_tmp ${_tmp_files})
if (EXISTS ${_tmp})
list(APPEND _ori_files "-s=${_tmp}")
else ()
message(FATAL_ERROR "${_tmp} not exist.")
endif ()
endforeach ()
# 生成目标根目录
get_filename_component(_OpsTest_GenDir "${CMAKE_CURRENT_BINARY_DIR}/gen" REALPATH)
get_filename_component(_OpsTest_GenDirInc "${_OpsTest_GenDir}/inc" REALPATH)
execute_process(
COMMAND ${HI_PYTHON} ${_define_py} "-o=${tmp_brief}" ${_ori_files} "-d=${_OpsTest_GenDirInc}"
)
set(_Target ${UTest_NamePrefix}_${TMP_BRIEF}_OpTilingDataDef)
add_library(${_Target} INTERFACE)
target_include_directories(${_Target} INTERFACE ${_OpsTest_GenDirInc} ${OPS_ADV_UTILS_KERNEL_INC})
# 编译变量处理
set(_TargetPrefix ${UTest_NamePrefix}_${TMP_BRIEF}_OpKernel)
aux_source_directory(${OPS_ADV_DIR}/${TMP_SUB_SYSTEM}/${TMP_SNAKE} _Sources)
list(APPEND _Sources ${TMP_SOURCES_EXT})
set(_PrivateIncludeDirectories
${_OpsTest_GenDirInc}
${TMP_PRIVATE_INCLUDES_EXT}
<ASCEND_CANN_PACKAGE_PATH>/${SYSTEM_PREFIX}/ascendc/include/basic_api
<ASCEND_CANN_PACKAGE_PATH>/${SYSTEM_PREFIX}/ascendc/include/basic_api/impl
<ASCEND_CANN_PACKAGE_PATH>/${SYSTEM_PREFIX}/ascendc/include/basic_api/interface
<ASCEND_CANN_PACKAGE_PATH>/tools/tikicpulib/lib/include
<ASCEND_CANN_PACKAGE_PATH>/include/ascendc
<ASCEND_CANN_PACKAGE_PATH>/x86_64-linux/include/ascendc/highlevel_api
<ASCEND_CANN_PACKAGE_PATH>/pkg_inc/runtime/runtime
<ASCEND_CANN_PACKAGE_PATH>/runtime/pkg_inc
)
get_filename_component(_Inc "${OPS_ADV_DIR}/${TMP_SUB_SYSTEM}/${TMP_SNAKE}" REALPATH)
if (EXISTS "${_Inc}")
list(APPEND _PrivateIncludeDirectories ${_Inc})
endif ()
set(_PrivateCompileOptions
-include ${_OpsTest_GenDirInc}/tiling/${tmp_brief}/tiling_stub.h
)
set(_PrivateLinkLibraries
-Wl,--as-needed
-Wl,--no-whole-archive
c_sec
$<BUILD_INTERFACE:intf_pub_utest>
$<BUILD_INTERFACE:_OpsTestUt_OpKernel_Wno>
)
# 多 Kernel 处理
set(_OpKernelLibraries)
list(FIND TMP_PRIVATE_COMPILE_DEFINITIONS_EXT KernelCtrlParam _GrpIdx)
if ("${_GrpIdx}" STREQUAL "-1")
# 不存在多 Kernel 配置时, 不添加后缀, 编译一个 Kernel.a
set(_Target ${_TargetPrefix})
add_library(${_Target} STATIC)
target_sources(${_Target} PRIVATE ${_Sources})
target_include_directories(${_Target} PRIVATE ${_PrivateIncludeDirectories})
target_compile_definitions(${_Target} PRIVATE ${TMP_PRIVATE_COMPILE_DEFINITIONS_EXT})
target_compile_options(${_Target} PRIVATE ${_PrivateCompileOptions})
target_link_libraries(${_Target}
PUBLIC
tikicpulib::${OPS_ADV_UTEST_OPS_TEST_ASCEND_PRODUCT_TYPE}
PRIVATE
${_PrivateLinkLibraries}
)
list(APPEND _OpKernelLibraries ${_Target})
else ()
# 存在 1/n 多 Kernel 配置时, 添加后缀, 编译多 Kernel.a
while (NOT "${_GrpIdx}" STREQUAL "-1")
# 获取当前 Func, Suffix, CompileDefinitions
math(EXPR _FuncIdx "${_GrpIdx} + 1")
math(EXPR _SuffixIdx "${_GrpIdx} + 2")
math(EXPR _SubLstBgnIdx "${_GrpIdx} + 3")
list(GET TMP_PRIVATE_COMPILE_DEFINITIONS_EXT ${_FuncIdx} _FuncOriValList)
list(GET TMP_PRIVATE_COMPILE_DEFINITIONS_EXT ${_SuffixIdx} _SuffixVal)
list(SUBLIST TMP_PRIVATE_COMPILE_DEFINITIONS_EXT ${_SubLstBgnIdx} -1 TMP_PRIVATE_COMPILE_DEFINITIONS_EXT)
list(FIND TMP_PRIVATE_COMPILE_DEFINITIONS_EXT KernelCtrlParam _GrpIdx) # _GrpIdx 移动
list(SUBLIST TMP_PRIVATE_COMPILE_DEFINITIONS_EXT 0 ${_GrpIdx} _SubCompileDefinitions)
string(REPLACE "," ";" _FuncOriValList "${_FuncOriValList}")
set(_FuncValDef)
foreach (_f ${_FuncOriValList})
list(APPEND _FuncValDef "-D${_f}=${_f}_${_SuffixVal}")
endforeach ()
# 编译目标
set(_Target ${_TargetPrefix}_${_SuffixVal})
add_library(${_Target} STATIC)
target_sources(${_Target} PRIVATE ${_Sources})
target_include_directories(${_Target} PRIVATE ${_PrivateIncludeDirectories})
target_compile_definitions(${_Target} PRIVATE ${_FuncValDef} ${_SubCompileDefinitions})
target_compile_options(${_Target} PRIVATE ${_PrivateCompileOptions})
target_link_libraries(${_Target}
PUBLIC
tikicpulib::${OPS_ADV_UTEST_OPS_TEST_ASCEND_PRODUCT_TYPE}
PRIVATE
${_PrivateLinkLibraries}
)
list(APPEND _OpKernelLibraries ${_Target})
endwhile ()
endif ()
set(_OpsTestUt_OpKernelLibraries ${_OpKernelLibraries} CACHE INTERNAL "" FORCE)
endfunction()
# Level1, 添加算子 UTest 用例 Common 静态库
#[[
调用参数:
one_value_keywords:
BRIEF : 必选参数, 用于指定算子缩略名(建议以大驼峰命名, 与算子实际名称无强制对应关系), 如 Fag/Fas/Fa
SNAKE : 必选参数, 用于指定算子全名, 如 flash_attention_score_grad
TILING_DATA_DEF_BRIEF: 可选参数, 用于指定链接的 TilingData 头文件目标
multi_value_keywords:
SOURCES_EXT : 可选参数, 额外源文件
SOURCES_EXT_FORCE : 可选参数, 强制使用 SOURCES_EXT 指定的额外源文件 (Common), 不再自动寻找 comm 下源文件
PUBLIC_INCLUDES_EXT : 可选参数, 额外头文件搜索路径(public)
PRIVATE_INCLUDES_EXT : 可选参数, 额外头文件搜索路径
PRIVATE_LINK_LIBRARIES_EXT : 可选参数, 额外链接库
PRIVATE_COMPILE_DEFINITIONS : 可选参数, 额外的编译宏定义
]]
function(OpsTest_Level1_AddUTestCommonStatic)
cmake_parse_arguments(
TMP
""
"BRIEF;SNAKE;TILING_DATA_DEF_BRIEF"
"SOURCES_EXT;SOURCES_EXT_FORCE;PUBLIC_INCLUDES_EXT;PRIVATE_INCLUDES_EXT;PRIVATE_LINK_LIBRARIES_EXT;PRIVATE_COMPILE_DEFINITIONS"
""
${ARGN}
)
if (NOT TMP_TILING_DATA_DEF_BRIEF)
set(TMP_TILING_DATA_DEF_BRIEF ${TMP_BRIEF})
endif ()
# 强制指定源码处理
set(_Src1)
set(_Src2)
set(_Common_Sources ${TMP_SOURCES_EXT})
if (NOT TMP_SOURCES_EXT_FORCE)
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/comm)
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/comm/inc)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/comm/src _Src1)
else ()
file(GLOB_RECURSE _Src1 "${CMAKE_CURRENT_SOURCE_DIR}/comm/*.cc")
file(GLOB_RECURSE _Src2 "${CMAKE_CURRENT_SOURCE_DIR}/comm/*.cpp")
endif ()
endif ()
endif ()
list(APPEND _Common_Sources ${_Src1} ${_Src2})
list(REMOVE_DUPLICATES _Common_Sources)
set(_Target_UTest_Common)
if (_Common_Sources)
set(_Target_UTest_Common ${UTest_NamePrefix}_${TMP_BRIEF}_UTest_Common)
add_library(${_Target_UTest_Common} STATIC)
target_sources(${_Target_UTest_Common} PRIVATE ${_Common_Sources})
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/comm/inc)
target_include_directories(${_Target_UTest_Common} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/comm/inc)
elseif (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/comm)
target_include_directories(${_Target_UTest_Common} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/comm)
endif ()
target_include_directories(${_Target_UTest_Common}
PUBLIC
${TMP_PUBLIC_INCLUDES_EXT}
PRIVATE
${OPBASE_INC_DIRS}
${OPS_TRANSFORMER_DIR}/common/include
${ASCEND_CANN_PACKAGE_PATH}/include
${TMP_PRIVATE_INCLUDES_EXT}
)
target_compile_definitions(${_Target_UTest_Common}
PRIVATE
${TMP_PRIVATE_COMPILE_DEFINITIONS}
)
target_link_libraries(${_Target_UTest_Common}
PRIVATE
-Wl,--as-needed
-Wl,--no-whole-archive
platform
register
opp_registry
error_manager
metadef
tiling_api
$<BUILD_INTERFACE:intf_pub_utest>
$<BUILD_INTERFACE:_OpsTestUt_UTestCaseStatic_Wno>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:alog_headers>>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:dlog_headers>>
tikicpulib::${OPS_ADV_UTEST_OPS_TEST_ASCEND_PRODUCT_TYPE}
${UTest_NamePrefix}_${TMP_TILING_DATA_DEF_BRIEF}_OpTilingDataDef
${UTest_NamePrefix}_Utils
${TMP_PRIVATE_LINK_LIBRARIES_EXT}
${_OpsTestUt_OpKernelLibraries} # 当前各算子 common 内以 extern 方式声明 kernel 入口, 故添加依赖
)
endif ()
set(_OpsTestUt_UTestCommonLibrary ${_Target_UTest_Common} CACHE INTERNAL "" FORCE)
endfunction()
# Level1, 添加算子 UTest 用例静态库
#[[
调用参数:
one_value_keywords:
BRIEF : 必选参数, 用于指定算子缩略名(建议以大驼峰命名, 与算子实际名称无强制对应关系), 如 Fag/Fas/Fa
SNAKE : 必选参数, 用于指定算子全名, 如 flash_attention_score_grad
TILING_DATA_DEF_BRIEF: 可选参数, 用于指定链接的 TilingData 头文件目标
multi_value_keywords:
SOURCES_EXT : 可选参数, 额外源文件
SOURCES_EXT_FORCE : 可选参数, 强制使用 SOURCES_EXT 指定的额外源文件 (UTest), 不再自动寻找 utest 下源文件
PRIVATE_INCLUDES_EXT : 可选参数, 额外头文件搜索路径
PRIVATE_LINK_LIBRARIES_EXT : 可选参数, 额外链接库
PRIVATE_COMPILE_DEFINITIONS : 可选参数, 额外的编译宏定义
]]
function(OpsTest_Level1_AddUTestCaseStatic)
cmake_parse_arguments(
TMP
""
"BRIEF;SNAKE;TILING_DATA_DEF_BRIEF"
"SOURCES_EXT;SOURCES_EXT_FORCE;PRIVATE_INCLUDES_EXT;PRIVATE_LINK_LIBRARIES_EXT;PRIVATE_COMPILE_DEFINITIONS"
""
${ARGN}
)
if (NOT TMP_TILING_DATA_DEF_BRIEF)
set(TMP_TILING_DATA_DEF_BRIEF ${TMP_BRIEF})
endif ()
# 强制指定源码处理
set(_UTest_Sources ${TMP_SOURCES_EXT})
if (NOT TMP_SOURCES_EXT_FORCE)
file(GLOB_RECURSE _Src1 "${CMAKE_CURRENT_SOURCE_DIR}/utest/*.cc")
file(GLOB_RECURSE _Src2 "${CMAKE_CURRENT_SOURCE_DIR}/utest/*.cpp")
list(APPEND _UTest_Sources ${_Src1} ${_Src2})
endif ()
list(REMOVE_DUPLICATES _UTest_Sources)
if (_UTest_Sources)
set(_Target_UTest ${UTest_NamePrefix}_${TMP_BRIEF}_UTest_Case)
add_library(${_Target_UTest} STATIC)
target_sources(${_Target_UTest} PRIVATE ${_UTest_Sources})
target_include_directories(${_Target_UTest}
PRIVATE
${ASCEND_CANN_PACKAGE_PATH}/include
${TMP_PRIVATE_INCLUDES_EXT}
${CMAKE_CURRENT_SOURCE_DIR}/utest
)
target_compile_definitions(${_Target_UTest}
PRIVATE
${TMP_PRIVATE_COMPILE_DEFINITIONS}
)
target_link_libraries(${_Target_UTest}
PRIVATE
-Wl,--as-needed
-Wl,--no-whole-archive
gtest
$<BUILD_INTERFACE:intf_pub_utest>
$<BUILD_INTERFACE:_OpsTestUt_UTestCaseStatic_Wno>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:alog_headers>>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:dlog_headers>>
tikicpulib::${OPS_ADV_UTEST_OPS_TEST_ASCEND_PRODUCT_TYPE}
${UTest_NamePrefix}_${TMP_TILING_DATA_DEF_BRIEF}_OpTilingDataDef
${UTest_NamePrefix}_Utils
$<BUILD_INTERFACE:_OpsTestUt_GTest_Wno>
${UTest_NamePrefix}_Utest
${TMP_PRIVATE_LINK_LIBRARIES_EXT}
${_OpsTestUt_UTestCommonLibrary}
)
set(_OpsTestUt_UTestCaseLibraries ${_OpsTestUt_UTestCaseLibraries} ${_Target_UTest} CACHE INTERNAL "" FORCE)
endif ()
endfunction()
# Level1, 添加算子 UTest 用例(Aclnn)静态库
#[[
调用参数:
one_value_keywords:
BRIEF : 必选参数, 用于指定算子缩略名(建议以大驼峰命名, 与算子实际名称无强制对应关系), 如 Fag/Fas/Fa
SNAKE : 必选参数, 用于指定算子全名, 如 flash_attention_score_grad
TILING_DATA_DEF_BRIEF: 可选参数, 用于指定链接的 TilingData 头文件目标
multi_value_keywords:
SOURCES_EXT : 可选参数, 额外源文件
SOURCES_EXT_FORCE : 可选参数, 强制使用 SOURCES_EXT 指定的额外源文件 (UTest_Aclnn), 不再自动寻找 utest_aclnn 下源文件
PRIVATE_INCLUDES_EXT : 可选参数, 额外头文件搜索路径
PRIVATE_COMPILE_DEFINITIONS : 可选参数, 额外的编译宏定义
PRIVATE_LINK_LIBRARIES_EXT : 可选参数, 额外链接库
]]
function(OpsTest_Level1_AddUTestAclnnCaseStatic)
cmake_parse_arguments(
TMP
""
"BRIEF;SNAKE;TILING_DATA_DEF_BRIEF"
"SOURCES_EXT;SOURCES_EXT_FORCE;PRIVATE_INCLUDES_EXT;PRIVATE_COMPILE_DEFINITIONS;PRIVATE_LINK_LIBRARIES_EXT"
""
${ARGN}
)
if (NOT TMP_TILING_DATA_DEF_BRIEF)
set(TMP_TILING_DATA_DEF_BRIEF ${TMP_BRIEF})
endif ()
# 强制指定源码处理
set(_UTest_Aclnn_Sources ${TMP_SOURCES_EXT})
if (NOT TMP_SOURCES_EXT_FORCE)
file(GLOB_RECURSE _Src1 "${CMAKE_CURRENT_SOURCE_DIR}/utest_aclnn/*.cc")
file(GLOB_RECURSE _Src2 "${CMAKE_CURRENT_SOURCE_DIR}/utest_aclnn/*.cpp")
list(APPEND _UTest_Aclnn_Sources ${_Src1} ${_Src2})
endif ()
list(REMOVE_DUPLICATES _UTest_Aclnn_Sources)
if (_UTest_Aclnn_Sources)
set(_Target_UTest_Aclnn ${UTest_NamePrefix}_${TMP_BRIEF}_UTest_Case_Aclnn)
add_library(${_Target_UTest_Aclnn} STATIC)
target_sources(${_Target_UTest_Aclnn} PRIVATE ${_UTest_Aclnn_Sources})
target_include_directories(${_Target_UTest_Aclnn}
PRIVATE
${ASCEND_CANN_PACKAGE_PATH}/include
${TMP_PRIVATE_INCLUDES_EXT}
${CMAKE_CURRENT_SOURCE_DIR}/utest_aclnn
)
target_compile_definitions(${_Target_UTest_Aclnn}
PRIVATE
${TMP_PRIVATE_COMPILE_DEFINITIONS}
)
target_link_libraries(${_Target_UTest_Aclnn}
PRIVATE
-Wl,--as-needed
-Wl,--no-whole-archive
gtest
$<BUILD_INTERFACE:intf_pub_utest>
$<BUILD_INTERFACE:_OpsTestUt_UTestCaseStatic_Wno>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:alog_headers>>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:dlog_headers>>
tikicpulib::${OPS_ADV_UTEST_OPS_TEST_ASCEND_PRODUCT_TYPE}
${UTest_NamePrefix}_${TMP_TILING_DATA_DEF_BRIEF}_OpTilingDataDef
${UTest_NamePrefix}_Utils
$<BUILD_INTERFACE:_OpsTestUt_GTest_Wno>
${UTest_NamePrefix}_Utest
${TMP_PRIVATE_LINK_LIBRARIES_EXT}
${_OpsTestUt_UTestCommonLibrary}
)
set(_OpsTestUt_UTestAclnnCaseLibraries ${_OpsTestUt_UTestAclnnCaseLibraries} ${_Target_UTest_Aclnn} CACHE INTERNAL "" FORCE)
endif ()
endfunction()
# Level2, 添加算子 UTest 用例动态库 及其所需全部库(OpTiling.so, OpKernel.a 等)
#[[
调用参数:
one_value_keywords:
SUB_SYSTEM : 必选参数, 用于指定算子所属子系统, 如 transformer
BRIEF : 必选参数, 用于指定算子缩略名(建议以大驼峰命名, 与算子实际名称无强制对应关系), 如 Fag/Fas/Fa
SNAKE : 必选参数, 用于指定算子全名, 如 flash_attention_score_grad
TILING_DATA_DEF_BRIEF: 可选参数, 用于指定链接的 TilingData 头文件目标
multi_value_keywords:
OPAPI_SOURCES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpApiShared 函数说明
OPAPI_PRIVATE_INCLUDES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpApiShared 函数说明
OPAPI_PRIVATE_LINK_LIBRARIES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpApiShared 函数说明
PROTO_SOURCES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpProtoShared 函数说明
PROTO_PRIVATE_INCLUDES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpProtoShared 函数说明
PROTO_PRIVATE_LINK_LIBRARIES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpProtoShared 函数说明
TILING_SOURCES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpTilingShared 函数说明
TILING_PRIVATE_INCLUDES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpTilingShared 函数说明
TILING_PRIVATE_LINK_LIBRARIES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpTilingShared 函数说明
KERNEL_SOURCES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpKernelStatic 函数说明
KERNEL_TILING_DATA_DEF_H : 透传参数, 详情参见 OpsTest_Level1_AddOpKernelStatic 函数说明
KERNEL_PRIVATE_INCLUDES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpKernelStatic 函数说明
KERNEL_PRIVATE_COMPILE_DEFINITIONS_EXT : 透传参数, 详情参见 OpsTest_Level1_AddOpKernelStatic 函数说明
UTEST_COMMON_SOURCES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddUTestCommonStatic 函数说明
UTEST_COMMON_SOURCES_EXT_FORCE : 透传参数, 详情参见 OpsTest_Level1_AddUTestCommonStatic 函数说明
UTEST_COMMON_PUBLIC_INCLUDES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddUTestCommonStatic 函数说明
UTEST_COMMON_PRIVATE_INCLUDES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddUTestCommonStatic 函数说明
UTEST_COMMON_PRIVATE_COMPILE_DEFINITIONS : 透传参数, 详情参见 OpsTest_Level1_AddUTestCommonStatic 函数说明
UTEST_COMMON_PRIVATE_LINK_LIBRARIES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddUTestCommonStatic 函数说明
UTEST_SOURCES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddUTestCaseStatic 函数说明
UTEST_SOURCES_EXT_FORCE : 透传参数, 详情参见 OpsTest_Level1_AddUTestCaseStatic 函数说明
UTEST_PRIVATE_INCLUDES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddUTestCaseStatic 函数说明
UTEST_PRIVATE_COMPILE_DEFINITIONS : 透传参数, 详情参见 OpsTest_Level1_AddUTestCaseStatic 函数说明
UTEST_PRIVATE_LINK_LIBRARIES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddUTestCaseStatic 函数说明
UTEST_ACLNN_SOURCES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddUTestAclnnCaseStatic 函数说明
UTEST_ACLNN_SOURCES_EXT_FORCE : 透传参数, 详情参见 OpsTest_Level1_AddUTestAclnnCaseStatic 函数说明
UTEST_ACLNN_PRIVATE_INCLUDES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddUTestAclnnCaseStatic 函数说明
UTEST_ACLNN_PRIVATE_COMPILE_DEFINITIONS : 透传参数, 详情参见 OpsTest_Level1_AddUTestAclnnCaseStatic 函数说明
UTEST_ACLNN_PRIVATE_LINK_LIBRARIES_EXT : 透传参数, 详情参见 OpsTest_Level1_AddUTestAclnnCaseStatic 函数说明
]]
function(OpsTest_Level2_AddOp)
cmake_parse_arguments(
TMP
""
"SUB_SYSTEM;BRIEF;SNAKE;TILING_DATA_DEF_BRIEF"
"OPAPI_SOURCES_EXT;OPAPI_PRIVATE_INCLUDES_EXT;OPAPI_PRIVATE_LINK_LIBRARIES_EXT;PROTO_SOURCES_EXT;PROTO_PRIVATE_INCLUDES_EXT;PROTO_PRIVATE_LINK_LIBRARIES_EXT;TILING_SOURCES_EXT;TILING_PRIVATE_INCLUDES_EXT;TILING_PRIVATE_LINK_LIBRARIES_EXT;KERNEL_SOURCES_EXT;KERNEL_TILING_DATA_DEF_H;KERNEL_PRIVATE_INCLUDES_EXT;KERNEL_PRIVATE_COMPILE_DEFINITIONS_EXT;UTEST_COMMON_SOURCES_EXT;UTEST_COMMON_SOURCES_EXT_FORCE;UTEST_COMMON_PUBLIC_INCLUDES_EXT;UTEST_COMMON_PRIVATE_INCLUDES_EXT;UTEST_COMMON_PRIVATE_COMPILE_DEFINITIONS;UTEST_COMMON_PRIVATE_LINK_LIBRARIES_EXT;UTEST_SOURCES_EXT;UTEST_SOURCES_EXT_FORCE;UTEST_PRIVATE_INCLUDES_EXT;UTEST_PRIVATE_COMPILE_DEFINITIONS;UTEST_PRIVATE_LINK_LIBRARIES_EXT;UTEST_ACLNN_SOURCES_EXT;UTEST_ACLNN_SOURCES_EXT_FORCE;UTEST_ACLNN_PRIVATE_INCLUDES_EXT;UTEST_ACLNN_PRIVATE_COMPILE_DEFINITIONS;UTEST_ACLNN_PRIVATE_LINK_LIBRARIES_EXT"
""
${ARGN}
)
OpsTest_Level1_AddOpApiShared(
SUB_SYSTEM ${TMP_SUB_SYSTEM}
BRIEF ${TMP_BRIEF}
SNAKE ${TMP_SNAKE}
SOURCES_EXT ${TMP_OPAPI_SOURCES_EXT}
PRIVATE_INCLUDES_EXT ${TMP_OPAPI_PRIVATE_INCLUDES_EXT}
PRIVATE_LINK_LIBRARIES_EXT ${TMP_OPAPI_PRIVATE_LINK_LIBRARIES_EXT}
)
OpsTest_Level1_AddOpProtoShared(
SUB_SYSTEM ${TMP_SUB_SYSTEM}
BRIEF ${TMP_BRIEF}
SNAKE ${TMP_SNAKE}
SOURCES_EXT ${TMP_PROTO_SOURCES_EXT}
PRIVATE_INCLUDES_EXT ${TMP_PROTO_PRIVATE_INCLUDES_EXT}
PRIVATE_LINK_LIBRARIES_EXT ${TMP_PROTO_PRIVATE_LINK_LIBRARIES_EXT}
)
OpsTest_Level1_AddOpTilingShared(
SUB_SYSTEM ${TMP_SUB_SYSTEM}
BRIEF ${TMP_BRIEF}
SNAKE ${TMP_SNAKE}
SOURCES_EXT ${TMP_TILING_SOURCES_EXT}
PRIVATE_INCLUDES_EXT ${TMP_TILING_PRIVATE_INCLUDES_EXT}
PRIVATE_LINK_LIBRARIES_EXT ${TMP_TILING_PRIVATE_LINK_LIBRARIES_EXT}
)
OpsTest_Level1_AddOpKernelStatic(
SUB_SYSTEM ${TMP_SUB_SYSTEM}
BRIEF ${TMP_BRIEF}
SNAKE ${TMP_SNAKE}
SOURCES_EXT ${TMP_KERNEL_SOURCES_EXT}
TILING_DATA_DEF_H ${TMP_KERNEL_TILING_DATA_DEF_H}
PRIVATE_INCLUDES_EXT ${TMP_KERNEL_PRIVATE_INCLUDES_EXT}
PRIVATE_COMPILE_DEFINITIONS_EXT ${TMP_KERNEL_PRIVATE_COMPILE_DEFINITIONS_EXT}
)
OpsTest_Level1_AddUTestCommonStatic(
BRIEF ${TMP_BRIEF}
SNAKE ${TMP_SNAKE}
SOURCES_EXT ${TMP_UTEST_COMMON_SOURCES_EXT}
SOURCES_EXT_FORCE ${TMP_UTEST_COMMON_SOURCES_EXT_FORCE}
TILING_DATA_DEF_BRIEF ${TMP_TILING_DATA_DEF_BRIEF}
PUBLIC_INCLUDES_EXT ${TMP_UTEST_COMMON_PUBLIC_INCLUDES_EXT}
PRIVATE_INCLUDES_EXT ${TMP_UTEST_COMMON_PRIVATE_INCLUDES_EXT}
PRIVATE_COMPILE_DEFINITIONS ${TMP_UTEST_COMMON_PRIVATE_COMPILE_DEFINITIONS}
PRIVATE_LINK_LIBRARIES_EXT ${TMP_UTEST_COMMON_PRIVATE_LINK_LIBRARIES_EXT}
)
OpsTest_Level1_AddUTestCaseStatic(
BRIEF ${TMP_BRIEF}
SNAKE ${TMP_SNAKE}
TILING_DATA_DEF_BRIEF ${TMP_TILING_DATA_DEF_BRIEF}
SOURCES_EXT ${TMP_UTEST_SOURCES_EXT}
SOURCES_EXT_FORCE ${TMP_UTEST_SOURCES_EXT_FORCE}
PRIVATE_INCLUDES_EXT ${TMP_UTEST_PRIVATE_INCLUDES_EXT}
PRIVATE_COMPILE_DEFINITIONS ${TMP_UTEST_PRIVATE_COMPILE_DEFINITIONS}
PRIVATE_LINK_LIBRARIES_EXT ${TMP_UTEST_PRIVATE_LINK_LIBRARIES_EXT}
)
OpsTest_Level1_AddUTestAclnnCaseStatic(
BRIEF ${TMP_BRIEF}
SNAKE ${TMP_SNAKE}
TILING_DATA_DEF_BRIEF ${TMP_TILING_DATA_DEF_BRIEF}
SOURCES_EXT ${TMP_UTEST_ACLNN_SOURCES_EXT}
SOURCES_EXT_FORCE ${TMP_UTEST_ACLNN_SOURCES_EXT_FORCE}
PRIVATE_INCLUDES_EXT ${TMP_UTEST_ACLNN_PRIVATE_INCLUDES_EXT}
PRIVATE_COMPILE_DEFINITIONS ${TMP_UTEST_ACLNN_PRIVATE_COMPILE_DEFINITIONS}
PRIVATE_LINK_LIBRARIES_EXT ${TMP_UTEST_ACLNN_PRIVATE_LINK_LIBRARIES_EXT}
)
endfunction()
function(op_add_ut_subdirectory OP_UT_LIST OP_UT_DIR_LIST)
set(_OP_UT_LIST)
set(_OP_UT_DIR_LIST)
file(GLOB OP_HOST_CMAKE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/**/**/tests/CMakeLists.txt")
foreach(OP_CMAKE_FILE ${OP_HOST_CMAKE_FILES})
if ("${OP_CMAKE_FILE}" MATCHES "tests")
get_filename_component(OP_HOST_DIR "${OP_CMAKE_FILE}" DIRECTORY)
get_filename_component(OP_DIR "${OP_HOST_DIR}" DIRECTORY)
else()
get_filename_component(OP_DIR "${OP_CMAKE_FILE}" DIRECTORY)
endif()
get_filename_component(OP_NAME "${OP_DIR}" NAME)
if (DEFINED ASCEND_OP_NAME AND NOT "${ASCEND_OP_NAME}" STREQUAL "")
if (NOT "${ASCEND_OP_NAME}" STREQUAL "all" AND NOT "${ASCEND_OP_NAME}" STREQUAL "ALL")
if (NOT ${OP_NAME} IN_LIST ASCEND_OP_NAME)
continue()
endif ()
endif ()
endif ()
list(APPEND _OP_UT_LIST ${OP_NAME})
list(APPEND _OP_UT_DIR_LIST ${OP_DIR})
endforeach()
list(REMOVE_DUPLICATES _OP_UT_LIST)
list(REMOVE_DUPLICATES _OP_UT_DIR_LIST)
list(SORT _OP_UT_LIST)
list(SORT _OP_UT_DIR_LIST)
set(${OP_UT_LIST} ${_OP_UT_LIST} PARENT_SCOPE)
set(${OP_UT_DIR_LIST} ${_OP_UT_DIR_LIST} PARENT_SCOPE)
endfunction()
# 私有函数, 外部不可直接调用, 用于执行包含多个算子的 UT 可执行程序
#[[
]]
function(OpsTest_RunLaunch)
cmake_parse_arguments(
TMP
""
"TARGET;EXECUTABLE"
""
""
${ARGN}
)
if (ENABLE_UT_EXEC)
set(LD_LIBRARY_PATH_ "LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${ASCEND_CANN_PACKAGE_PATH}/compiler/lib64:${ASCEND_CANN_PACKAGE_PATH}/toolkit/tools/simulator/Ascend910B1/lib")
if (ENABLE_ASAN OR ENABLE_UBSAN)
if (ENABLE_ASAN)
# 谨慎修改 ASAN_OPTIONS_ 取值, 当前出现告警会使 UT 失败.
# halt_on_error=1, 出现告警时停止运行进而触发构建失败, 避免主进程或 CPU孪生调试 fork 出的子进程出现错误无法发现的情况
# detect_stack_use_after_return=1, 栈空间返回后使用检测
# check_initialization_order, 尝试捕获初始化顺序问题
# strict_init_order, 动态初始化器永远不能访问来自其他模块的全局变量, 及时或者已经初始化
# strict_string_checks, 检查字符串参数是否正确以 null 终止
# detect_leaks=1, 内存泄漏检测
set(ASAN_OPTIONS_ "ASAN_OPTIONS=halt_on_error=1,detect_stack_use_after_return=1,check_initialization_order=1,strict_init_order=1,strict_string_checks=1,detect_leaks=1")
message(STATUS "${TMP_EXECUTABLE}: ${ASAN_OPTIONS_}")
endif ()
if (ENABLE_UBSAN)
# 谨慎修改 UBSAN_OPTIONS_ 取值, 当前出现告警会使 UT 失败.
# halt_on_error=1, 出现告警时停止运行进而触发构建失败, 避免主进程或 CPU孪生调试 fork 出的子进程出现错误无法发现的情况
# print_stacktrace=1, 出错时打印调用栈
set(UBSAN_OPTIONS_ "UBSAN_OPTIONS=halt_on_error=1,print_stacktrace=1")
message(STATUS "${TMP_EXECUTABLE}: ${UBSAN_OPTIONS_}")
endif ()
# 用例执行
# 采用链接 ASAN/MSAN 动态库方式执行, 受 SAN 机制限制, 若采用静态库, 则会导致如 OpTiling/OpProto 内 SAN 功能失效.
if (NOT "${SAN_LD_PRELOAD}" STREQUAL "")
message(STATUS "${SAN_LD_PRELOAD}")
endif ()
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
add_custom_command(
TARGET ${TMP_TARGET} POST_BUILD
COMMAND export ${LD_LIBRARY_PATH_} && ulimit -s 32768 && ${ASAN_OPTIONS_} ${UBSAN_OPTIONS_} ./${TMP_EXECUTABLE}
COMMENT "Run ${TMP_EXECUTABLE} with Sanitizer, ASAN(${ENABLE_ASAN}), UBSAN(${ENABLE_UBSAN})"
)
else ()
add_custom_command(
TARGET ${TMP_TARGET} POST_BUILD
COMMAND export ${LD_LIBRARY_PATH_} && export ${SAN_LD_PRELOAD} && ulimit -s 32768 && ${ASAN_OPTIONS_} ${UBSAN_OPTIONS_} ./${TMP_EXECUTABLE}
COMMENT "Run ${TMP_EXECUTABLE} with Sanitizer, ASAN(${ENABLE_ASAN}), UBSAN(${ENABLE_UBSAN})"
)
endif ()
else()
# 用例执行
add_custom_command(
TARGET ${TMP_TARGET} POST_BUILD
COMMAND export ${LD_LIBRARY_PATH_} && ./${TMP_EXECUTABLE}
COMMENT "Run ${TMP_EXECUTABLE}"
)
endif ()
endif ()
endfunction()
# 生成覆盖率
#[[
调用参数:
one_value_keywords:
TARGET : 必选参数, 用于指定覆盖率生成所依赖的目标(POST_BUILD)
multi_value_keywords:
FILTER_DIRECTORIES : 可选参数, 用于指定覆盖率结果过滤目录
]]
function(OpsTest_GenerateCoverage)
cmake_parse_arguments(
TMP
""
"TARGET"
"FILTER_DIRECTORIES"
""
${ARGN}
)
if (ENABLE_UT_EXEC)
if (ENABLE_GCOV)
find_program(LCOV lcov REQUIRED)
get_filename_component(GEN_COV_PY ${OPS_ADV_CMAKE_DIR}/scripts/utest/gen_coverage.py REALPATH)
get_filename_component(ASCEND_CANN_PACKAGE_PATH_PARENT "${ASCEND_CANN_PACKAGE_PATH}/../" REALPATH)
get_filename_component(GEM_COV_DATA_DIR "${CMAKE_CURRENT_BINARY_DIR}" REALPATH)
# 获取 gcc 默认头文件搜索路径
execute_process(
COMMAND ${CMAKE_C_COMPILER} --print-sysroot-headers-suffix
RESULT_VARIABLE _RST
OUTPUT_VARIABLE _SUFFIX
ERROR_QUIET
)
if (_RST)
get_filename_component(SYS_ROOT "/usr/include" REALPATH)
else ()
get_filename_component(SYS_ROOT "${_SUFFIX}/usr/include" REALPATH)
endif ()
list(REMOVE_DUPLICATES _FilterCmds)
add_custom_command(
TARGET ${TMP_TARGET} POST_BUILD
COMMAND ${HI_PYTHON} ${GEN_COV_PY}
"-s=${OPS_ADV_DIR}"
"-c=${GEM_COV_DATA_DIR}"
"-f=/tmp/*"
"-f=/usr/include/*"
"-f=${ASCEND_CANN_PACKAGE_PATH_PARENT}/*"
"-y=${OPS_ADV_DIR}/tests/test_config.yaml"
COMMENT "Generate coverage for ${TMP_TARGET}"
)
endif ()
endif ()
endfunction()
# 生成包含多个算子的 UT 可执行程序
#[[
]]
function(OpsTest_AddLaunch)
add_custom_target(ops_test_utest)
if (NOT _OpsTestUt_UTestCaseLibraries AND NOT _OpsTestUt_UTestAclnnCaseLibraries)
# 当 _OpsTestUt_UTestCaseLibraries 与 _OpsTestUt_UTestAclnnCaseLibraries 都为空时
# 说明区分领域的 TESTS_UT_OPS_TEST 选项被错误设置, 需排查对应触发 ut 的 python 脚本逻辑及 build.sh.
message(STATUS "_OpsTestUt_UTestCaseLibraries = ${_OpsTestUt_UTestCaseLibraries}.")
message(STATUS "_OpsTestUt_UTestAclnnCaseLibraries = ${_OpsTestUt_UTestAclnnCaseLibraries}")
message(STATUS "_OpsTestUt_UTestCaseLibraries and _OpsTestUt_UTestAclnnCaseLibraries both empty.")
return ()
endif ()
set(_UTest_OpApiLibrary)
set(_UTest_OpProtoLibrary)
set(_UTest_OpTilingLibrary)
set(_UTest_Main) # UTest 用例可执行程序(常规)
set(_UTest_Main_Aclnn) # UTest 用例可执行程序(Aclnn)
set(_Utest_ExecutableList) # 为提高PR场景执行效率, PR场景各可执行文件并行执行, 否则串行执行
# OpApi 动态库(可选)
OpsTest_AddOpApiShared()
# OpProto 动态库(可选)
OpsTest_AddOpProtoShared()
# OpTiling 动态库(必选)
OpsTest_AddOpTilingShared()
# UTest 用例可执行程序(常规)
if (_OpsTestUt_UTestCaseLibraries)
# 支持按算子分离可执行文件, 便于彼此冲突的 Kernel 侧编译宏设置
foreach (_OpsTestUt_UTestCaseLibrary ${_OpsTestUt_UTestCaseLibraries})
# 获取算子工程名
string(REPLACE "_UTest_Case" "" _OpBrief ${_OpsTestUt_UTestCaseLibrary})
string(REPLACE "UTest_" "" _OpBrief ${_OpBrief})
set(_UTest_Main ${UTest_NamePrefix}_Main_Normal_${_OpBrief})
add_executable(${_UTest_Main})
target_sources(${_UTest_Main} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tests/ut/framework_special/main.cpp)
target_compile_options(${_UTest_Main} PRIVATE -fPIC)
target_link_libraries(${_UTest_Main}
PRIVATE
-Wl,--no-as-needed
-Wl,--whole-archive
$<BUILD_INTERFACE:intf_pub_utest>
gtest
$<BUILD_INTERFACE:_OpsTestUt_GTest_Wno>
${_OpsTestUt_UTestCaseLibrary}
${UTest_NamePrefix}_Stubs
${UTest_NamePrefix}_Utils
${_UTest_OpApiLibrary} # 若算子在 UTest_{Op}_Common 内实现 Aclnn 相关执行逻辑, 则需要连接
-Wl,--as-needed
-Wl,--no-whole-archive
c_sec
)
add_dependencies(${_UTest_Main} ${_UTest_OpTilingLibrary})
add_dependencies(ops_test_utest ${_UTest_Main})
if (TESTS_UT_OPS_TEST_CI_PR)
OpsTest_RunLaunch(TARGET ${_UTest_Main} EXECUTABLE ${_UTest_Main})
else ()
list(APPEND _Utest_ExecutableList ${_UTest_Main})
endif ()
endforeach ()
endif ()
# UTest 用例可执行程序(Aclnn)
set(_param
"--cann_path=${ASCEND_CANN_PACKAGE_PATH}"
"--cann_package_name=opp"
"get_package_version"
)
if (_OpsTestUt_UTestAclnnCaseLibraries)
# 支持按算子分离可执行文件, 便于彼此冲突的 Kernel 侧编译宏设置
foreach (_OpsTestUt_UTestAclnnCaseLibrary ${_OpsTestUt_UTestAclnnCaseLibraries})
# 获取算子工程名
string(REPLACE "_UTest_Case_Aclnn" "" _OpBrief ${_OpsTestUt_UTestAclnnCaseLibrary})
string(REPLACE "UTest_" "" _OpBrief ${_OpBrief})
set(_UTest_Main_Aclnn ${UTest_NamePrefix}_Main_Aclnn_${_OpBrief})
add_executable(${_UTest_Main_Aclnn})
target_sources(${_UTest_Main_Aclnn} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tests/ut/framework_special/main_aclnn.cpp)
target_compile_options(${_UTest_Main_Aclnn} PRIVATE -fPIC)
target_link_libraries(${_UTest_Main_Aclnn}
PRIVATE
-Wl,--no-as-needed
-Wl,--whole-archive
$<BUILD_INTERFACE:intf_pub_utest>
gtest
$<BUILD_INTERFACE:_OpsTestUt_GTest_Wno>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:alog_headers>>
$<$<BOOL:${BUILD_OPEN_PROJECT}>:$<BUILD_INTERFACE:dlog_headers>>
${_OpsTestUt_UTestAclnnCaseLibrary}
${UTest_NamePrefix}_Stubs
${UTest_NamePrefix}_Utils
${_UTest_OpApiLibrary}
-Wl,--as-needed
-Wl,--no-whole-archive
c_sec
)
add_dependencies(${_UTest_Main_Aclnn} ${_UTest_OpProtoLibrary} ${_UTest_OpTilingLibrary})
add_dependencies(ops_test_utest ${_UTest_Main_Aclnn})
if (TESTS_UT_OPS_TEST_CI_PR)
OpsTest_RunLaunch(TARGET ${_UTest_Main_Aclnn} EXECUTABLE ${_UTest_Main_Aclnn})
else ()
list(APPEND _Utest_ExecutableList ${_UTest_Main_Aclnn})
endif ()
endforeach ()
endif ()
# 为提高PR场景执行效率, PR场景各可执行文件并行执行, 否则串行执行
if (NOT TESTS_UT_OPS_TEST_CI_PR)
foreach (_Exe ${_Utest_ExecutableList})
OpsTest_RunLaunch(TARGET ops_test_utest EXECUTABLE ${_Exe})
endforeach ()
endif ()
# 生成覆盖率
set(_FilterDirectories)
list(REMOVE_DUPLICATES _FilterDirectories)
OpsTest_GenerateCoverage(TARGET ops_test_utest FILTER_DIRECTORIES ${_FilterDirectories})
endfunction()
# 添加算子UT路径
#[[
]]
function(OpsTestUt_AddSubdirectory)
cmake_parse_arguments(
TMP
""
""
"CLANG_NOT_SUPPORTED_OP_LIST"
""
${ARGN}
)
if ("${TESTS_UT_OPS_TEST}" STREQUAL "")
return()
elseif ("ALL" IN_LIST TESTS_UT_OPS_TEST OR "all" IN_LIST TESTS_UT_OPS_TEST)
file(GLOB sub_dirs ${CMAKE_CURRENT_SOURCE_DIR}/*)
foreach (_dir ${sub_dirs})
if (IS_DIRECTORY ${_dir})
get_filename_component(_op_type ${_dir} NAME)
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" AND "${_op_type}" IN_LIST TMP_CLANG_NOT_SUPPORTED_OP_LIST)
message(STATUS "The UTest of ${_op_type} don't supported clang compiler yet.")
continue()
endif ()
add_subdirectory(${_dir})
endif ()
endforeach ()
else ()
set(_added_op_type_list)
foreach (_op_type ${TESTS_UT_OPS_TEST})
if (DEFINED ${_op_type}_alias)
set(_op_type ${${_op_type}_alias})
endif ()
if (NOT "${_op_type}" IN_LIST _added_op_type_list)
set(_dir ${CMAKE_CURRENT_SOURCE_DIR}/${_op_type})
if (IS_DIRECTORY ${_dir})
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" AND "${_op_type}" IN_LIST TMP_CLANG_NOT_SUPPORTED_OP_LIST)
message(STATUS "The UTest of ${_op_type} don't supported clang compiler yet.")
continue()
endif ()
add_subdirectory(${_dir})
list(APPEND _added_op_type_list ${_op_type})
endif ()
endif ()
endforeach ()
endif ()
endfunction()