900 lines
35 KiB
CMake
900 lines
35 KiB
CMake
# -----------------------------------------------------------------------------------------------------------
|
||
# 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.
|
||
# -----------------------------------------------------------------------------------------------------------
|
||
|
||
function(filter_copy_files SELECTED_FILES SELECTED_DIRS)
|
||
set(_selected_files "")
|
||
set(_selected_dirs "")
|
||
foreach(item ${KERNEL_SUB_DIRS})
|
||
set(path "${CURRENT_KERNEL_DIR}/${item}")
|
||
if(IS_DIRECTORY "${path}")
|
||
if(item MATCHES "^arch")
|
||
list(FIND ARCH_DIRECTORY "${item}" idx)
|
||
if(idx EQUAL -1)
|
||
continue()
|
||
endif()
|
||
endif()
|
||
list(APPEND _selected_dirs "${path}")
|
||
else()
|
||
list(APPEND _selected_files "${path}")
|
||
endif()
|
||
endforeach()
|
||
|
||
set(${SELECTED_FILES} "${_selected_files}" PARENT_SCOPE)
|
||
set(${SELECTED_DIRS} "${_selected_dirs}" PARENT_SCOPE)
|
||
endfunction()
|
||
|
||
function(add_target_source)
|
||
cmake_parse_arguments(ADD "" "BASE_TARGET;SRC_DIR" "TARGET_NAME" ${ARGN})
|
||
|
||
get_target_property(all_srcs ${ADD_BASE_TARGET} SOURCES)
|
||
set(add_srcs)
|
||
foreach(_src ${all_srcs})
|
||
string(REGEX MATCH "^${ADD_SRC_DIR}" is_match "${_src}")
|
||
if (is_match)
|
||
list(APPEND add_srcs ${_src})
|
||
endif ()
|
||
endforeach()
|
||
|
||
get_target_property(all_includes ${ADD_BASE_TARGET} INCLUDE_DIRECTORIES)
|
||
set(add_includes)
|
||
foreach(_include ${all_includes})
|
||
string(REGEX MATCH "^${ADD_SRC_DIR}" is_match "${_include}")
|
||
if (is_match)
|
||
list(APPEND add_includes ${_include})
|
||
endif ()
|
||
endforeach()
|
||
|
||
foreach(_target_name ${ADD_TARGET_NAME})
|
||
target_sources(${_target_name} PRIVATE
|
||
${add_srcs}
|
||
)
|
||
|
||
target_include_directories(${_target_name} PRIVATE
|
||
${add_includes}
|
||
)
|
||
endforeach()
|
||
endfunction()
|
||
|
||
function(op_add_subdirectory OP_LIST OP_DIR_LIST)
|
||
set(_OP_LIST)
|
||
set(_OP_DIR_LIST)
|
||
|
||
if(ENABLE_EXPERIMENTAL)
|
||
message(STATUS "Build experimental module")
|
||
file(GLOB OP_HOST_CMAKE_FILES
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/experimental/ffn/**/op_host/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/experimental/gmm/**/op_host/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/experimental/mc2/**/op_host/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/experimental/moe/**/op_host/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/experimental/posembedding/**/op_host/CMakeLists.txt"
|
||
)
|
||
else()
|
||
file(GLOB OP_HOST_CMAKE_FILES
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/gmm/**/op_host/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/gmm/**/CMakeLists.txt"
|
||
)
|
||
if(BUILD_OPEN_PROJECT AND (NOT BUILD_OPS_RTY_KERNEL))
|
||
file(GLOB CANNDEV_OPS_HOST_CMAKE_FILES
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/posembedding/**/op_host/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/moe/**/op_host/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/ffn/**/op_host/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/mc2/**/op_host/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/posembedding/**/framework/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/moe/**/framework/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/ffn/**/framework/CMakeLists.txt"
|
||
"${CMAKE_CURRENT_SOURCE_DIR}/mc2/**/framework/CMakeLists.txt"
|
||
)
|
||
List(APPEND OP_HOST_CMAKE_FILES ${CANNDEV_OPS_HOST_CMAKE_FILES})
|
||
endif()
|
||
endif()
|
||
|
||
foreach(OP_CMAKE_FILE ${OP_HOST_CMAKE_FILES})
|
||
if ("${OP_CMAKE_FILE}" MATCHES "op_host")
|
||
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 (NOT BUILD_OPEN_PROJECT)
|
||
if (EXISTS ${TOP_DIR}/asl/ops/cann/ops/built-in/tbe/impl/ascendc/${OP_NAME})
|
||
continue()
|
||
endif ()
|
||
endif ()
|
||
|
||
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 ()
|
||
|
||
if (ENABLE_TEST)
|
||
file(READ "${OP_DIR}/tests/CMakeLists.txt" CML_CONTENT)
|
||
if (CML_CONTENT MATCHES "OpsTest_Level2_AddOp")
|
||
set(UTEST_FRAMEWORK_OLD TRUE CACHE BOOL "UTEST_FRAMEWORK_OLD" FORCE)
|
||
else()
|
||
set(UTEST_FRAMEWORK_NEW TRUE CACHE BOOL "UTEST_FRAMEWORK_NEW" FORCE)
|
||
endif()
|
||
endif()
|
||
|
||
list(APPEND _OP_LIST ${OP_NAME})
|
||
list(APPEND _OP_DIR_LIST ${OP_DIR})
|
||
endforeach()
|
||
|
||
list(REMOVE_DUPLICATES _OP_LIST)
|
||
list(REMOVE_DUPLICATES _OP_DIR_LIST)
|
||
list(SORT _OP_LIST)
|
||
list(SORT _OP_DIR_LIST)
|
||
set(${OP_LIST} ${_OP_LIST} PARENT_SCOPE)
|
||
set(${OP_DIR_LIST} ${_OP_DIR_LIST} PARENT_SCOPE)
|
||
endfunction()
|
||
|
||
macro(add_op_to_compiled_list)
|
||
get_filename_component(PARENT_DIR ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY)
|
||
get_filename_component(OP_NAME ${PARENT_DIR} NAME)
|
||
# 记录全局的COMPILED_OPS和COMPILED_OP_DIRS,其中COMPILED_OP_DIRS只记录到算子名,例如moe/moe_token_permute_with_routing_map_grad
|
||
set(COMPILED_OPS ${COMPILED_OPS} ${OP_NAME} CACHE STRING "Compiled Ops" FORCE)
|
||
set(COMPILED_OP_DIRS ${COMPILED_OP_DIRS} ${PARENT_DIR} CACHE STRING "Compiled Ops Dirs" FORCE)
|
||
endmacro()
|
||
|
||
|
||
function(op_add_depend_directory)
|
||
cmake_parse_arguments(DEP "" "OP_DIR_LIST" "OP_LIST" ${ARGN})
|
||
set(_OP_DEPEND_DIR_LIST)
|
||
foreach(op_name ${DEP_OP_LIST})
|
||
if (DEFINED ${op_name}_depends)
|
||
foreach(depend_info ${${op_name}_depends})
|
||
if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${depend_info}/op_host/CMakeLists.txt AND NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/${depend_info}/CMakeLists.txt)
|
||
continue()
|
||
endif ()
|
||
|
||
get_filename_component(_depend_op_name "${depend_info}" NAME)
|
||
if (NOT BUILD_OPEN_PROJECT)
|
||
if (EXISTS ${TOP_DIR}/asl/ops/cann/ops/built-in/tbe/impl/ascendc/${_depend_op_name})
|
||
continue()
|
||
endif ()
|
||
endif ()
|
||
|
||
if (NOT ${_depend_op_name} IN_LIST DEP_OP_LIST)
|
||
list(APPEND _OP_DEPEND_DIR_LIST ${CMAKE_CURRENT_SOURCE_DIR}/${depend_info})
|
||
endif ()
|
||
endforeach()
|
||
endif()
|
||
endforeach()
|
||
|
||
list(SORT _OP_DEPEND_DIR_LIST)
|
||
list(REMOVE_DUPLICATES _OP_DEPEND_DIR_LIST)
|
||
set(${DEP_OP_DIR_LIST} ${_OP_DEPEND_DIR_LIST} PARENT_SCOPE)
|
||
endfunction()
|
||
|
||
function(add_compile_cmd_target)
|
||
cmake_parse_arguments(CMD "" "COMPUTE_UNIT" "" ${ARGN})
|
||
|
||
if(ADD_OPS_COMPILE_OPTION_V2)
|
||
set(OP_DEBUG_CONFIG_OPTION --opc-config-file ${ASCEND_CUSTOM_OPC_OPTIONS})
|
||
else()
|
||
if(OP_DEBUG_CONFIG)
|
||
set(OP_DEBUG_CONFIG_OPTION --op-debug-config ${OP_DEBUG_CONFIG})
|
||
endif()
|
||
set(OP_TILING_KEY_OPTION --tiling-keys ${ASCEND_CUSTOM_TILING_KEYS})
|
||
endif()
|
||
|
||
set(_OUT_DIR ${ASCEND_BINARY_OUT_DIR}/${CMD_COMPUTE_UNIT})
|
||
set(GEN_OUT_DIR ${_OUT_DIR}/gen)
|
||
set(COMPILE_CMD_TARGET generate_compile_cmd_${CMD_COMPUTE_UNIT})
|
||
|
||
set(SED_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/cmake/scripts/fix_format.sh)
|
||
|
||
add_custom_target(${COMPILE_CMD_TARGET} ALL
|
||
COMMAND ${CMAKE_COMMAND} -E make_directory ${GEN_OUT_DIR}
|
||
COMMAND ${HI_PYTHON} ${ASCENDC_CMAKE_UTIL_DIR}/ascendc_bin_param_build.py
|
||
${base_aclnn_binary_dir}/aic-${CMD_COMPUTE_UNIT}-ops-info.ini
|
||
${GEN_OUT_DIR}
|
||
${CMD_COMPUTE_UNIT}
|
||
${OP_TILING_KEY_OPTION}
|
||
${OP_DEBUG_CONFIG_OPTION}
|
||
COMMAND ${HI_PYTHON} ${ASCENDC_CMAKE_UTIL_DIR}/ascendc_bin_param_build.py
|
||
${base_aclnn_binary_dir}/inner/aic-${CMD_COMPUTE_UNIT}-ops-info.ini
|
||
${GEN_OUT_DIR}
|
||
${CMD_COMPUTE_UNIT}
|
||
${OP_TILING_KEY_OPTION}
|
||
${OP_DEBUG_CONFIG_OPTION}
|
||
COMMAND ${HI_PYTHON} ${ASCENDC_CMAKE_UTIL_DIR}/ascendc_bin_param_build.py
|
||
${base_aclnn_binary_dir}/exc/aic-${CMD_COMPUTE_UNIT}-ops-info.ini
|
||
${GEN_OUT_DIR}
|
||
${CMD_COMPUTE_UNIT}
|
||
${OP_TILING_KEY_OPTION}
|
||
${OP_DEBUG_CONFIG_OPTION}
|
||
COMMAND bash ${SED_SCRIPT} ${GEN_OUT_DIR}
|
||
)
|
||
|
||
add_dependencies(${COMPILE_CMD_TARGET} opbuild_gen_default opbuild_gen_inner opbuild_gen_exc)
|
||
add_dependencies(generate_compile_cmd ${COMPILE_CMD_TARGET})
|
||
endfunction()
|
||
|
||
function(add_ops_info_target)
|
||
cmake_parse_arguments(OPINFO "" "COMPUTE_UNIT" "" ${ARGN})
|
||
|
||
set(OPS_INFO_TARGET generate_ops_info_${OPINFO_COMPUTE_UNIT})
|
||
if (ENABLE_BUILT_IN)
|
||
set(OPS_INFO_JSON ${ASCEND_AUTOGEN_DIR}/aic-${OPINFO_COMPUTE_UNIT}-ops-info-transformer.json)
|
||
else()
|
||
set(OPS_INFO_JSON ${ASCEND_AUTOGEN_DIR}/aic-${OPINFO_COMPUTE_UNIT}-ops-info.json)
|
||
endif()
|
||
set(CUSTOM_OPS_INFO_DIR ${CUSTOM_DIR}/op_impl/ai_core/tbe/config/${OPINFO_COMPUTE_UNIT})
|
||
|
||
set(OPS_INFO_INI ${base_aclnn_binary_dir}/aic-${OPINFO_COMPUTE_UNIT}-ops-info.ini)
|
||
set(OPS_INFO_INNER_INI ${base_aclnn_binary_dir}/inner/aic-${OPINFO_COMPUTE_UNIT}-ops-info.ini)
|
||
set(OPS_INFO_EXCLUDE_INI ${base_aclnn_binary_dir}/exc/aic-${OPINFO_COMPUTE_UNIT}-ops-info.ini)
|
||
|
||
add_custom_command(OUTPUT ${OPS_INFO_JSON}
|
||
COMMAND ${HI_PYTHON} ${ASCENDC_CMAKE_UTIL_DIR}/parse_ini_to_json.py
|
||
${OPS_INFO_INI}
|
||
${OPS_INFO_INNER_INI}
|
||
${OPS_INFO_EXCLUDE_INI}
|
||
${OPS_INFO_JSON}
|
||
COMMAND mkdir -p ${CUSTOM_OPS_INFO_DIR}
|
||
COMMAND cp -f ${OPS_INFO_JSON} ${CUSTOM_OPS_INFO_DIR}
|
||
)
|
||
|
||
add_custom_target(${OPS_INFO_TARGET} ALL
|
||
DEPENDS ${OPS_INFO_JSON}
|
||
)
|
||
|
||
add_dependencies(${OPS_INFO_TARGET} opbuild_gen_default opbuild_gen_inner opbuild_gen_exc)
|
||
add_dependencies(generate_ops_info ${OPS_INFO_TARGET})
|
||
|
||
if (ENABLE_BUILT_IN)
|
||
install(FILES ${OPS_INFO_JSON}
|
||
DESTINATION ops_transformer/built-in/op_impl/ai_core/tbe/config/${OPINFO_COMPUTE_UNIT} OPTIONAL
|
||
)
|
||
else()
|
||
install(FILES ${OPS_INFO_JSON}
|
||
DESTINATION packages/vendors/${VENDOR_NAME}_transformer/op_impl/ai_core/tbe/config/${OPINFO_COMPUTE_UNIT} OPTIONAL
|
||
)
|
||
endif()
|
||
endfunction()
|
||
|
||
function(add_ops_compile_options)
|
||
cmake_parse_arguments(OP_COMPILE "" "OP_NAME" "COMPUTE_UNIT;OPTIONS" ${ARGN})
|
||
|
||
if(NOT OP_COMPILE_OPTIONS)
|
||
return()
|
||
endif()
|
||
|
||
if(ADD_OPS_COMPILE_OPTION_V2)
|
||
execute_process(COMMAND ${HI_PYTHON} ${ASCENDC_CMAKE_UTIL_DIR}/ascendc_gen_options.py
|
||
${ASCEND_CUSTOM_OPTIONS} ${OP_COMPILE_OP_NAME}
|
||
${OP_COMPILE_COMPUTE_UNIT} ${OP_COMPILE_OPTIONS}
|
||
RESULT_VARIABLE EXEC_RESULT
|
||
OUTPUT_VARIABLE EXEC_INFO
|
||
ERROR_VARIABLE EXEC_ERROR)
|
||
if (EXEC_RESULT)
|
||
message("add ops compile options info: ${EXEC_INFO}")
|
||
message("add ops compile options error: ${EXEC_ERROR}")
|
||
message(FATAL_ERROR "Error: add ops compile options failed!")
|
||
endif ()
|
||
else()
|
||
file(APPEND ${ASCEND_CUSTOM_OPTIONS}
|
||
"${OP_COMPILE_OP_NAME},${OP_COMPILE_COMPUTE_UNIT},${OP_COMPILE_OPTIONS}\n"
|
||
)
|
||
endif()
|
||
endfunction()
|
||
|
||
function(add_ops_tiling_keys)
|
||
cmake_parse_arguments(OP_COMPILE "" "OP_NAME" "COMPUTE_UNIT;TILING_KEYS" ${ARGN})
|
||
|
||
if(NOT OP_COMPILE_TILING_KEYS)
|
||
return()
|
||
endif()
|
||
|
||
if(ADD_OPS_COMPILE_OPTION_V2)
|
||
list(JOIN OP_COMPILE_TILING_KEYS "," STRING_TILING_KEYS)
|
||
add_ops_compile_options(
|
||
OP_NAME ${OP_COMPILE_OP_NAME}
|
||
OPTIONS --tiling_key=${STRING_TILING_KEYS}
|
||
)
|
||
else()
|
||
file(APPEND ${ASCEND_CUSTOM_TILING_KEYS}
|
||
"${OP_COMPILE_OP_NAME},${OP_COMPILE_COMPUTE_UNIT},${OP_COMPILE_TILING_KEYS}\n"
|
||
)
|
||
endif()
|
||
endfunction()
|
||
|
||
function(add_opc_config)
|
||
cmake_parse_arguments(OP_COMPILE "" "OP_NAME" "COMPUTE_UNIT;CONFIG" ${ARGN})
|
||
|
||
if(NOT ADD_OPS_COMPILE_OPTION_V2)
|
||
return()
|
||
endif()
|
||
|
||
set(_OPC_CONFIG)
|
||
|
||
if(NOT OP_COMPILE_CONFIG)
|
||
list(APPEND _OPC_CONFIG "-DNOT_DYNAMIC_COMPILE")
|
||
else()
|
||
string(REPLACE "," ";" OP_COMPILE_CONFIG_LIST "${OP_COMPILE_CONFIG}")
|
||
list(APPEND _OPC_CONFIG "-DNOT_DYNAMIC_COMPILE")
|
||
|
||
foreach(_option ${OP_COMPILE_CONFIG_LIST})
|
||
if("${_option}" STREQUAL "ccec_g")
|
||
list(APPEND _OPC_CONFIG "-g")
|
||
elseif("${_option}" STREQUAL "ccec_O0")
|
||
list(APPEND _OPC_CONFIG "-O0")
|
||
elseif("${_option}" STREQUAL "sanitizer")
|
||
list(APPEND _OPC_CONFIG "-sanitizer")
|
||
elseif("${_option}" STREQUAL "dump_cce")
|
||
list(APPEND _OPC_CONFIG "--save-temp-files")
|
||
endif()
|
||
endforeach()
|
||
endif()
|
||
|
||
if(ENABLE_OOM)
|
||
list(APPEND _OPC_CONFIG "--oom")
|
||
list(APPEND _OPC_CONFIG "-ffunction-sections -fdata-sections")
|
||
endif()
|
||
|
||
if(_OPC_CONFIG)
|
||
add_ops_compile_options(
|
||
OP_NAME ${OP_COMPILE_OP_NAME}
|
||
OPTIONS ${_OPC_CONFIG}
|
||
)
|
||
endif()
|
||
endfunction()
|
||
|
||
function(add_ops_src_copy)
|
||
cmake_parse_arguments(SRC_COPY "" "TARGET_NAME;SRC;DST;BE_RELIED;COMPUTE_UNIT" "" ${ARGN})
|
||
|
||
set(OPS_UTILS_INC_KERNEL_TARGET ops_utils_inc_kernel_${SRC_COPY_COMPUTE_UNIT})
|
||
if (EXISTS ${OPS_ADV_UTILS_KERNEL_INC})
|
||
if (NOT TARGET ${OPS_UTILS_INC_KERNEL_TARGET})
|
||
get_filename_component(_ROOT_OPS_SRC_DIR "${SRC_COPY_DST}" DIRECTORY)
|
||
set(OPS_UTILS_INC_KERNEL_DIR ${_ROOT_OPS_SRC_DIR}/ascendc/common)
|
||
add_custom_command(OUTPUT ${OPS_UTILS_INC_KERNEL_DIR}
|
||
COMMAND mkdir -p ${OPS_UTILS_INC_KERNEL_DIR}/regbase
|
||
COMMAND cp -rf ${OPS_ADV_UTILS_KERNEL_INC}/*.* ${OPS_UTILS_INC_KERNEL_DIR}
|
||
)
|
||
|
||
add_custom_target(${OPS_UTILS_INC_KERNEL_TARGET}
|
||
DEPENDS ${OPS_UTILS_INC_KERNEL_DIR}
|
||
)
|
||
endif ()
|
||
endif ()
|
||
|
||
# set(MC2_OPS_LIST "matmul_reduce_scatter;"
|
||
# "grouped_mat_mul_allto_allv;"
|
||
# "grouped_mat_mul_all_reduce;"
|
||
# "batch_mat_mul_reduce_scatter_allto_all;"
|
||
# "allto_allv_grouped_mat_mul;"
|
||
# "allto_all_all_gather_batch_mat_mul;"
|
||
# "distribute_barrier;"
|
||
# "moe_distribute_combine_add_rms_norm;"
|
||
# "moe_distribute_dispatch;"
|
||
# "moe_distribute_combine;"
|
||
# "moe_distribute_dispatch_v2;"
|
||
# "moe_distribute_combine_v2;"
|
||
# "moe_update_expert;"
|
||
# "all_gather_matmul;"
|
||
# "matmul_all_reduce;"
|
||
# "matmul_all_reduce_add_rms_norm;"
|
||
# "inplace_matmul_all_reduce_add_rms_norm;"
|
||
# "attention_to_ffn;"
|
||
# "ffn_to_attention;"
|
||
# ) # mc2算子列表
|
||
set(MC2_OPS_LIST ""
|
||
) # mc2算子列表
|
||
|
||
get_filename_component(FOLDER_NAME "${SRC_COPY_DST}" NAME_WE)
|
||
list(FIND MC2_OPS_LIST "${FOLDER_NAME}" INDEX)
|
||
if(NOT INDEX EQUAL -1)
|
||
set(BELONG_MC2_OPS TRUE)
|
||
endif()
|
||
|
||
if(NOT BUILD_OPS_RTY_KERNEL AND BELONG_MC2_OPS)
|
||
file(GLOB SRC_FILES ${SRC_COPY_SRC}/* ${SRC_COPY_SRC}/op_kernel/*)
|
||
else()
|
||
file(GLOB SRC_FILES ${SRC_COPY_SRC}/*)
|
||
endif()
|
||
list(FILTER SRC_FILES EXCLUDE REGEX "op_host")
|
||
|
||
get_filename_component(PARENT_PTH "${SRC_COPY_SRC}" DIRECTORY)
|
||
get_filename_component(CUR_NAME "${SRC_COPY_SRC}" NAME)
|
||
get_filename_component(PARENT_NAME "${PARENT_PTH}" NAME)
|
||
|
||
set(DOING_TARGET_NAME ${SRC_COPY_TARGET_NAME})
|
||
if(${CUR_NAME} STREQUAL "common")
|
||
set(DOING_TARGET_NAME ${PARENT_NAME}_${DOING_TARGET_NAME})
|
||
endif()
|
||
|
||
if (NOT TARGET ${DOING_TARGET_NAME})
|
||
set(_BUILD_FLAG ${SRC_COPY_DST}/${DOING_TARGET_NAME}.done)
|
||
if (NOT BUILD_OPS_RTY_KERNEL AND BELONG_MC2_OPS)
|
||
add_custom_command(OUTPUT ${_BUILD_FLAG}
|
||
COMMAND mkdir -p ${SRC_COPY_DST}
|
||
COMMAND cp -rf ${SRC_FILES} ${SRC_COPY_DST}
|
||
COMMAND rm -rf ${SRC_COPY_DST}/op_kernel/
|
||
COMMAND touch ${_BUILD_FLAG}
|
||
)
|
||
else()
|
||
add_custom_command(OUTPUT ${_BUILD_FLAG}
|
||
COMMAND mkdir -p ${SRC_COPY_DST}
|
||
COMMAND cp -rf ${SRC_FILES} ${SRC_COPY_DST}
|
||
COMMAND touch ${_BUILD_FLAG}
|
||
)
|
||
endif()
|
||
|
||
add_custom_target(${DOING_TARGET_NAME}
|
||
DEPENDS ${_BUILD_FLAG}
|
||
)
|
||
endif ()
|
||
|
||
if (TARGET ${OPS_UTILS_INC_KERNEL_TARGET})
|
||
add_dependencies(${DOING_TARGET_NAME} ${OPS_UTILS_INC_KERNEL_TARGET})
|
||
endif ()
|
||
|
||
if (DEFINED SRC_COPY_BE_RELIED)
|
||
add_dependencies(${SRC_COPY_BE_RELIED} ${DOING_TARGET_NAME})
|
||
endif ()
|
||
|
||
endfunction()
|
||
|
||
function(add_bin_compile_target)
|
||
cmake_parse_arguments(BINARY "" "COMPUTE_UNIT" "OP_INFO" ${ARGN})
|
||
|
||
if (ENABLE_BUILT_IN)
|
||
set(_INSTALL_DIR ops_transformer/built-in/op_impl/ai_core/tbe/kernel)
|
||
else()
|
||
set(_INSTALL_DIR packages/vendors/${VENDOR_NAME}_transformer/op_impl/ai_core/tbe/kernel)
|
||
endif()
|
||
set(_OUT_DIR ${ASCEND_BINARY_OUT_DIR}/${BINARY_COMPUTE_UNIT})
|
||
|
||
set(BIN_OUT_DIR ${_OUT_DIR}/bin)
|
||
set(GEN_OUT_DIR ${_OUT_DIR}/gen)
|
||
set(SRC_OUT_DIR ${_OUT_DIR}/src)
|
||
file(MAKE_DIRECTORY ${BIN_OUT_DIR})
|
||
|
||
foreach(_op_info ${BINARY_OP_INFO})
|
||
get_filename_component(_op_name "${_op_info}" NAME)
|
||
set(${_op_name}_dir ${_op_info})
|
||
set(${_op_name}_apt_dir ${_op_info})
|
||
endforeach()
|
||
|
||
set(_ops_target_list)
|
||
set(compile_scripts)
|
||
file(GLOB scripts_list ${GEN_OUT_DIR}/*.sh)
|
||
list(APPEND compile_scripts ${scripts_list})
|
||
|
||
foreach(bin_script ${compile_scripts})
|
||
get_filename_component(bin_file ${bin_script} NAME_WE)
|
||
string(REPLACE "-" ";" bin_sep ${bin_file})
|
||
list(GET bin_sep 0 op_type)
|
||
list(GET bin_sep 1 op_file)
|
||
list(GET bin_sep 2 op_index)
|
||
|
||
if (NOT DEFINED ${op_file}_dir)
|
||
continue()
|
||
endif ()
|
||
|
||
if (NOT TARGET ${op_file})
|
||
add_custom_target(${op_file})
|
||
add_dependencies(ops_transformer_kernel ${op_file})
|
||
endif ()
|
||
|
||
set(OP_TARGET_NAME ${op_file}_${BINARY_COMPUTE_UNIT})
|
||
|
||
if (NOT TARGET ${OP_TARGET_NAME})
|
||
add_custom_target(${OP_TARGET_NAME})
|
||
add_dependencies(${op_file} ${OP_TARGET_NAME})
|
||
list(APPEND _ops_target_list ${OP_TARGET_NAME})
|
||
|
||
set(OP_SRC_OUT_DIR ${SRC_OUT_DIR}/${op_file})
|
||
set(OP_BIN_OUT_DIR ${BIN_OUT_DIR}/${op_file})
|
||
file(MAKE_DIRECTORY ${OP_SRC_OUT_DIR})
|
||
|
||
add_ops_src_copy(
|
||
TARGET_NAME
|
||
${OP_TARGET_NAME}_src_copy
|
||
SRC
|
||
${${op_file}_dir}
|
||
DST
|
||
${OP_SRC_OUT_DIR}
|
||
COMPUTE_UNIT
|
||
${BINARY_COMPUTE_UNIT}
|
||
)
|
||
|
||
if (DEFINED ${op_file}_depends)
|
||
foreach(depend_info ${${op_file}_depends})
|
||
get_filename_component(_depend_op_name "${depend_info}" NAME)
|
||
set(_depend_op_target ${_depend_op_name}_${BINARY_COMPUTE_UNIT}_src_copy)
|
||
add_ops_src_copy(
|
||
TARGET_NAME
|
||
${_depend_op_target}
|
||
SRC
|
||
${CMAKE_SOURCE_DIR}/${depend_info}
|
||
DST
|
||
${SRC_OUT_DIR}/${_depend_op_name}
|
||
COMPUTE_UNIT
|
||
${BINARY_COMPUTE_UNIT}
|
||
BE_RELIED
|
||
${OP_TARGET_NAME}_src_copy
|
||
)
|
||
endforeach()
|
||
endif ()
|
||
|
||
set(DYNAMIC_PY_FILE ${OP_SRC_OUT_DIR}/${op_type}.py)
|
||
add_custom_command(OUTPUT ${DYNAMIC_PY_FILE}
|
||
COMMAND cp -rf ${ASCEND_IMPL_OUT_DIR}/dynamic/${op_file}.py ${DYNAMIC_PY_FILE}
|
||
# COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/cmake/scripts/update_get_kernel_source.sh ${DYNAMIC_PY_FILE}
|
||
)
|
||
|
||
add_custom_target(${OP_TARGET_NAME}_py_copy
|
||
DEPENDS ${DYNAMIC_PY_FILE}
|
||
)
|
||
|
||
add_custom_command(OUTPUT ${OP_BIN_OUT_DIR}
|
||
COMMAND mkdir -p ${OP_BIN_OUT_DIR}
|
||
)
|
||
|
||
add_custom_target(${OP_TARGET_NAME}_mkdir
|
||
DEPENDS ${OP_BIN_OUT_DIR}
|
||
)
|
||
|
||
if (ENABLE_BUILT_IN)
|
||
install(DIRECTORY ${OP_BIN_OUT_DIR}
|
||
DESTINATION ${_INSTALL_DIR}/${BINARY_COMPUTE_UNIT}/ops_transformer OPTIONAL
|
||
)
|
||
install(FILES ${BIN_OUT_DIR}/${op_file}.json
|
||
DESTINATION ${_INSTALL_DIR}/config/${BINARY_COMPUTE_UNIT}/ops_transformer OPTIONAL
|
||
)
|
||
else()
|
||
install(DIRECTORY ${OP_BIN_OUT_DIR}
|
||
DESTINATION ${_INSTALL_DIR}/${BINARY_COMPUTE_UNIT} OPTIONAL
|
||
)
|
||
install(FILES ${BIN_OUT_DIR}/${op_file}.json
|
||
DESTINATION ${_INSTALL_DIR}/config/${BINARY_COMPUTE_UNIT} OPTIONAL
|
||
)
|
||
endif()
|
||
endif ()
|
||
|
||
set(_group "1-0")
|
||
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 (${op_file} IN_LIST ASCEND_OP_NAME)
|
||
list(LENGTH ASCEND_OP_NAME _len)
|
||
list(FIND ASCEND_OP_NAME ${op_file} _index)
|
||
math(EXPR _next_index "${_index} + 1")
|
||
if (${_next_index} LESS ${_len})
|
||
list(GET ASCEND_OP_NAME ${_next_index} _group_str)
|
||
set(_regex "^[0-9]+-[0-9]+$")
|
||
string(REGEX MATCH "${_regex}" match "${_group_str}")
|
||
if (match)
|
||
set(_group ${_group_str})
|
||
endif ()
|
||
endif ()
|
||
endif ()
|
||
endif ()
|
||
endif ()
|
||
|
||
string(REPLACE "-" ";" _group_sep ${_group})
|
||
|
||
list(GET _group_sep 1 start_index)
|
||
set(end_index ${op_index})
|
||
list(GET _group_sep 0 step)
|
||
|
||
set(_compile_flag false)
|
||
if (${start_index} LESS ${end_index})
|
||
foreach(i RANGE ${start_index} ${end_index} ${step})
|
||
if (${i} EQUAL ${end_index})
|
||
set(_compile_flag true)
|
||
break()
|
||
endif ()
|
||
endforeach()
|
||
elseif (${start_index} EQUAL ${end_index})
|
||
set(_compile_flag true)
|
||
else()
|
||
set(_compile_flag false)
|
||
endif ()
|
||
|
||
if (_compile_flag)
|
||
set(_BUILD_COMMAND)
|
||
set(_BUILD_FLAG ${GEN_OUT_DIR}/${OP_TARGET_NAME}_${op_index}.done)
|
||
if (ENABLE_OPS_HOST OR ENABLE_HOST_TILING)
|
||
list(APPEND _BUILD_COMMAND export ASCEND_CUSTOM_OPP_PATH=${CUSTOM_DIR} &&)
|
||
endif ()
|
||
list(APPEND _BUILD_COMMAND export HI_PYTHON="python3" &&)
|
||
list(APPEND _BUILD_COMMAND export TILINGKEY_PAR_COMPILE=1 &&)
|
||
list(APPEND _BUILD_COMMAND export BIN_FILENAME_HASHED=1 &&)
|
||
list(APPEND _BUILD_COMMAND bash ${bin_script} ${OP_SRC_OUT_DIR}/${op_type}.py ${OP_BIN_OUT_DIR})
|
||
if(CMAKE_GENERATOR MATCHES "Unix Makefiles")
|
||
list(APPEND _BUILD_COMMAND && echo $(MAKE))
|
||
endif()
|
||
|
||
add_custom_command(OUTPUT ${_BUILD_FLAG}
|
||
COMMAND ${_BUILD_COMMAND}
|
||
COMMAND touch ${_BUILD_FLAG}
|
||
WORKING_DIRECTORY ${GEN_OUT_DIR}
|
||
)
|
||
|
||
add_custom_target(${OP_TARGET_NAME}_${op_index}
|
||
DEPENDS ${_BUILD_FLAG}
|
||
)
|
||
|
||
if (ENABLE_OPS_HOST OR ENABLE_HOST_TILING)
|
||
add_dependencies(${OP_TARGET_NAME}_${op_index} optiling_compat generate_ops_info)
|
||
endif ()
|
||
add_dependencies(${OP_TARGET_NAME}_${op_index} ${OP_TARGET_NAME}_src_copy ${OP_TARGET_NAME}_py_copy ${OP_TARGET_NAME}_mkdir)
|
||
add_dependencies(${OP_TARGET_NAME} ${OP_TARGET_NAME}_${op_index})
|
||
endif ()
|
||
endforeach()
|
||
|
||
if (_ops_target_list)
|
||
set(OPS_CONFIG_TARGET ops_config_${BINARY_COMPUTE_UNIT})
|
||
set(BINARY_INFO_CONFIG_FILE ${BIN_OUT_DIR}/binary_info_config.json)
|
||
set(RELOCATABLE_KERNEL_INFO_CONFIG_FILE ${BIN_OUT_DIR}/relocatable_kernel_info_config.json)
|
||
|
||
add_custom_command(OUTPUT ${BINARY_INFO_CONFIG_FILE}
|
||
COMMAND ${HI_PYTHON} ${ASCENDC_CMAKE_UTIL_DIR}/ascendc_ops_config.py -p ${BIN_OUT_DIR} -s ${BINARY_COMPUTE_UNIT}
|
||
)
|
||
|
||
add_custom_target(${OPS_CONFIG_TARGET}
|
||
DEPENDS ${BINARY_INFO_CONFIG_FILE}
|
||
)
|
||
|
||
add_dependencies(ops_transformer_config ${OPS_CONFIG_TARGET})
|
||
|
||
foreach(_op_target ${_ops_target_list})
|
||
add_dependencies(${OPS_CONFIG_TARGET} ${_op_target})
|
||
endforeach()
|
||
|
||
if (ENABLE_BUILT_IN)
|
||
install(FILES ${BINARY_INFO_CONFIG_FILE}
|
||
DESTINATION ${_INSTALL_DIR}/config/${BINARY_COMPUTE_UNIT}/ops_transformer OPTIONAL
|
||
)
|
||
install(FILES ${RELOCATABLE_KERNEL_INFO_CONFIG_FILE}
|
||
DESTINATION ${_INSTALL_DIR}/config/${BINARY_COMPUTE_UNIT}/ops_transformer OPTIONAL
|
||
)
|
||
else()
|
||
install(FILES ${RELOCATABLE_KERNEL_INFO_CONFIG_FILE}
|
||
DESTINATION ${_INSTALL_DIR}/config/${BINARY_COMPUTE_UNIT} OPTIONAL
|
||
)
|
||
install(FILES ${BINARY_INFO_CONFIG_FILE}
|
||
DESTINATION ${_INSTALL_DIR}/config/${BINARY_COMPUTE_UNIT} OPTIONAL
|
||
)
|
||
endif()
|
||
endif ()
|
||
endfunction()
|
||
|
||
function(redefine_file_macro)
|
||
cmake_parse_arguments(_FILE "" "" "TARGET_NAME" ${ARGN})
|
||
|
||
foreach(_target_name ${_FILE_TARGET_NAME})
|
||
target_compile_options(${_target_name} PRIVATE
|
||
-Wno-builtin-macro-redefined
|
||
)
|
||
|
||
get_target_property(_srcs ${_target_name} SOURCES)
|
||
|
||
foreach(_src ${_srcs})
|
||
get_filename_component(_src_name "${_src}" NAME)
|
||
set_source_files_properties(${_src}
|
||
PROPERTIES COMPILE_DEFINITIONS __FILE__="${_src_name}"
|
||
)
|
||
endforeach()
|
||
endforeach()
|
||
endfunction()
|
||
|
||
function(add_static_ops)
|
||
cmake_parse_arguments(STATIC "" "SRC_DIR" "ACLNN_SRC;ACLNN_INNER_SRC" ${ARGN})
|
||
set(prepare_ops_adv_static_target prepare_ops_transformer_static)
|
||
set(static_src_temp_dir ${CMAKE_CURRENT_BINARY_DIR}/static_src_temp_dir)
|
||
set(modified_files)
|
||
foreach(ops_type ${OPS_STATIC_TYPES})
|
||
get_target_property(all_srcs aclnn_ops_${ops_type} SOURCES)
|
||
set(add_srcs)
|
||
set(generate_aclnn_srcs)
|
||
foreach(_src ${all_srcs})
|
||
string(REGEX MATCH "^${STATIC_SRC_DIR}" is_match "${_src}")
|
||
if (is_match)
|
||
list(APPEND add_srcs ${_src})
|
||
endif ()
|
||
endforeach()
|
||
|
||
foreach(_src ${add_srcs})
|
||
get_filename_component(name_without_ext ${_src} NAME_WE)
|
||
string(REGEX REPLACE "^aclnn_" "" _op_name ${name_without_ext})
|
||
|
||
foreach(_aclnn_src ${STATIC_ACLNN_SRC})
|
||
get_filename_component(aclnn_name ${_aclnn_src} NAME_WE)
|
||
if("aclnn_${_op_name}" STREQUAL "${aclnn_name}")
|
||
list(APPEND generate_aclnn_srcs ${_aclnn_src})
|
||
break()
|
||
endif()
|
||
endforeach()
|
||
|
||
foreach(_aclnn_inner_src ${STATIC_ACLNN_INNER_SRC})
|
||
get_filename_component(aclnn_inner_name ${_aclnn_inner_src} NAME_WE)
|
||
if("aclnnInner_${_op_name}" STREQUAL "${aclnn_inner_name}")
|
||
list(APPEND generate_aclnn_srcs ${_aclnn_inner_src})
|
||
break()
|
||
endif()
|
||
endforeach()
|
||
endforeach()
|
||
|
||
if(add_srcs)
|
||
list(TRANSFORM add_srcs REPLACE "${STATIC_SRC_DIR}" "${static_src_temp_dir}" OUTPUT_VARIABLE add_static_srcs)
|
||
list(APPEND modified_files ${add_static_srcs})
|
||
set(aclnn_ops_static_target aclnn_ops_${ops_type}_static)
|
||
set_source_files_properties(${add_static_srcs}
|
||
TARGET_DIRECTORY ${aclnn_ops_static_target}
|
||
PROPERTIES GENERATED TRUE
|
||
)
|
||
|
||
target_sources(${aclnn_ops_static_target} PRIVATE
|
||
${add_static_srcs}
|
||
)
|
||
add_dependencies(${aclnn_ops_static_target} ${prepare_ops_adv_static_target})
|
||
endif()
|
||
|
||
if(generate_aclnn_srcs)
|
||
list(REMOVE_DUPLICATES generate_aclnn_srcs)
|
||
set(aclnn_op_target acl_op_${ops_type}_builtin)
|
||
set_source_files_properties(${generate_aclnn_srcs}
|
||
TARGET_DIRECTORY ${aclnn_op_target}
|
||
PROPERTIES GENERATED TRUE
|
||
)
|
||
|
||
target_sources(${aclnn_op_target} PRIVATE
|
||
${generate_aclnn_srcs}
|
||
)
|
||
endif()
|
||
endforeach()
|
||
|
||
if(NOT TARGET ${prepare_ops_adv_static_target})
|
||
list(REMOVE_DUPLICATES modified_files)
|
||
add_custom_command(OUTPUT ${static_src_temp_dir}
|
||
COMMAND mkdir -p ${static_src_temp_dir}
|
||
COMMAND cp -rf ${STATIC_SRC_DIR}/gmm ${STATIC_SRC_DIR}/mc2 ${STATIC_SRC_DIR}/attention ${static_src_temp_dir} || true
|
||
COMMAND ${HI_PYTHON} -B ${OPS_STATIC_SCRIPT} InsertIni -p ${static_src_temp_dir} -f ${modified_files}
|
||
)
|
||
|
||
add_custom_target(${prepare_ops_adv_static_target}
|
||
DEPENDS ${static_src_temp_dir}
|
||
)
|
||
endif()
|
||
endfunction()
|
||
function(add_aicpu_kernel_modules)
|
||
if(NOT TARGET ${OPHOST_NAME}_aicpu_obj)
|
||
add_library(${OPHOST_NAME}_aicpu_obj OBJECT)
|
||
target_include_directories(${OPHOST_NAME}_aicpu_obj PRIVATE ${AICPU_INCLUDE})
|
||
target_compile_definitions(
|
||
${OPHOST_NAME}_aicpu_obj PRIVATE _FORTIFY_SOURCE=2 google=ascend_private
|
||
$<$<BOOL:${ENABLE_TEST}>:ASCEND_AICPU_UT>
|
||
)
|
||
target_compile_options(
|
||
${OPHOST_NAME}_aicpu_obj PRIVATE $<$<NOT:$<BOOL:${ENABLE_TEST}>>:-DDISABLE_COMPILE_V1> -Dgoogle=ascend_private
|
||
-fvisibility=hidden ${AICPU_DEFINITIONS}
|
||
)
|
||
target_link_libraries(
|
||
${OPHOST_NAME}_aicpu_obj
|
||
PRIVATE $<BUILD_INTERFACE:$<IF:$<BOOL:${ENABLE_TEST}>,intf_llt_pub_asan_cxx17,intf_pub_cxx17>>
|
||
$<BUILD_INTERFACE:dlog_headers>
|
||
)
|
||
endif()
|
||
endfunction()
|
||
|
||
function(add_aicpu_cust_kernel_modules op_name aicpu_sources aicpu_jsons)
|
||
set(target_name ${op_name}_obj)
|
||
if(NOT TARGET ${target_name})
|
||
add_library(${target_name} OBJECT)
|
||
target_include_directories(${target_name} PRIVATE ${AICPU_INCLUDE})
|
||
target_compile_definitions(
|
||
${target_name} PRIVATE
|
||
_FORTIFY_SOURCE=2 _GLIBCXX_USE_CXX11_ABI=1
|
||
google=ascend_private
|
||
$<$<BOOL:${ENABLE_TEST}>:ASCEND_AICPU_UT>
|
||
)
|
||
target_compile_options(
|
||
${target_name} PRIVATE
|
||
$<$<NOT:$<BOOL:${ENABLE_TEST}>>:-DDISABLE_COMPILE_V1> -Dgoogle=ascend_private
|
||
-fvisibility=hidden ${AICPU_DEFINITIONS}
|
||
)
|
||
target_link_libraries(
|
||
${target_name}
|
||
PRIVATE $<BUILD_INTERFACE:$<IF:$<BOOL:${ENABLE_TEST}>,intf_llt_pub_asan_cxx17,intf_pub_cxx17>>
|
||
$<BUILD_INTERFACE:dlog_headers>
|
||
-Wl,--no-whole-archive
|
||
)
|
||
if (NOT (UT_TEST_ALL OR OP_KERNEL_AICPU_UT))
|
||
set_property(TARGET ${target_name} PROPERTY
|
||
CXX_COMPILER_LAUNCHER ${ASCEND_DIR}/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu-g++)
|
||
endif()
|
||
target_sources(${target_name} PRIVATE ${aicpu_sources})
|
||
set_property(GLOBAL APPEND PROPERTY AICPU_JSON_FILES ${aicpu_jsons})
|
||
if (NOT ${target_name} IN_LIST AICPU_CUST_OBJ_TARGETS)
|
||
set(AICPU_CUST_OBJ_TARGETS ${AICPU_CUST_OBJ_TARGETS} ${target_name} CACHE INTERNAL "All aicpu cust obj targets")
|
||
endif()
|
||
endif()
|
||
endfunction()
|
||
|
||
# 添加待编译算子
|
||
function(add_need_compile_ops op_name)
|
||
if(NOT ASCEND_OP_NAME)
|
||
# 为空则不需要更新
|
||
return()
|
||
endif()
|
||
|
||
set(NEW_OP_NAMES ${ASCEND_OP_NAME} ${op_name})
|
||
list(REMOVE_DUPLICATES NEW_OP_NAMES)
|
||
set(ASCEND_OP_NAME
|
||
${NEW_OP_NAMES}
|
||
CACHE STRING "Ascend op names to compile" FORCE
|
||
)
|
||
endfunction()
|
||
|
||
function(add_dependent_ops dependent_ops)
|
||
foreach(dep_op ${dependent_ops})
|
||
# 查询依赖算子所在目录
|
||
set(dep_op_path_list "")
|
||
if(ENABLE_EXPERIMENTAL)
|
||
foreach(ops_category ${OPS_CATEGORY_LIST})
|
||
file(GLOB dep_op_path "${PROJECT_SOURCE_DIR}/experimental/${ops_category}/${dep_op}")
|
||
list(APPEND dep_op_path_list ${dep_op_path})
|
||
endforeach()
|
||
endif()
|
||
set(outside_experimental FALSE)
|
||
# 如果非 experimental,或 experimental 下没找到,则去常规目录查找
|
||
if(NOT dep_op_path_list)
|
||
foreach(ops_category ${OPS_CATEGORY_LIST})
|
||
file(GLOB dep_op_path "${PROJECT_SOURCE_DIR}/${ops_category}/${dep_op}")
|
||
list(APPEND dep_op_path_list ${dep_op_path})
|
||
endforeach()
|
||
set(outside_experimental ${ENABLE_EXPERIMENTAL})
|
||
endif()
|
||
# 检查依赖存在
|
||
if(NOT dep_op_path_list)
|
||
message(FATAL_ERROR "dependent operator(${dep_op}) not exists")
|
||
endif()
|
||
list(LENGTH ${dep_op_path_list} find_dep_ops_count)
|
||
if(find_dep_ops_count GREATER 1)
|
||
message(FATAL_ERROR "dependent operator(${dep_op}) is not unique, the found operators:${dep_op_path_list}")
|
||
endif()
|
||
|
||
# ASCEND_OP_NAME 为空表示全部编译,则不需要特意添加目录;但指定experimental时未扫描常规算子,如果依赖常规算子,需要添加目录
|
||
# 已在待编译列表,则不需要加入
|
||
# 已在编译列表,则不需要重复加入
|
||
|
||
if((ASCEND_OP_NAME OR outside_experimental)
|
||
AND (NOT (dep_op IN_LIST ASCEND_OP_NAME))
|
||
AND (NOT (dep_op IN_LIST COMPILED_OPS))
|
||
)
|
||
# 加入依赖并去重
|
||
add_need_compile_ops("${dep_op}")
|
||
# 添加目录
|
||
get_filename_component(dep_op_path "${dep_op_path_list}" ABSOLUTE)
|
||
get_filename_component(dep_op_parent "${dep_op_path}" DIRECTORY)
|
||
get_filename_component(parent_path "${dep_op_parent}" NAME)
|
||
message(STATUS "add dependent operator: ${parent_path}/${dep_op}, path: ${dep_op_path}")
|
||
add_subdirectory("${dep_op_path}" "${CMAKE_BINARY_DIR}/dependent-ops/${parent_path}/${dep_op}")
|
||
endif()
|
||
endforeach()
|
||
endfunction()
|
||
|
||
if (BUILD_OPEN_PROJECT)
|
||
if (TESTS_UT_OPS_TEST)
|
||
include(${OPS_ADV_CMAKE_DIR}/func_utest.cmake)
|
||
endif ()
|
||
if (TESTS_EXAMPLE_OPS_TEST)
|
||
include(${OPS_ADV_CMAKE_DIR}/func_examples.cmake)
|
||
endif ()
|
||
endif ()
|