CMakeLists.txt 11.8 KB
Newer Older
K
kalcohol 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# License); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# Copyright (c) 2021, OPEN AI LAB
# Author: lswang@openailab.com
#

# 0. clear var
UNSET (_DEV_TIM_VX_HEADER_PATH)
UNSET (_TIM_VX_BASE_SOURCE)
UNSET (_TIM_VX_OPS_SOURCE)
UNSET (_DEV_TIM_VX_DEVICE_SOURCE)
UNSET (_DEV_TIM_VX_COMPILER_DEFINES)
UNSET (_DEV_TIM_VX_COMPILER_OPTIONS)
UNSET (_DEV_TIM_VX_LINKER_OPTIONS)
UNSET (_DEV_TIM_VX_LINK_LIBRARIES)

32 33 34 35 36 37 38 39
# 0. npu kernel cache file option, in experimental
IF (TENGINE_ENABLE_MODEL_CACHE)
    SET (TIMVX_MODEL_CACHE ON)
ENDIF()

# 0. config file
CONFIGURE_FILE(timvx_define.h.in ${CMAKE_CURRENT_BINARY_DIR}/timvx_define.h)

K
kalcohol 已提交
40 41 42 43 44 45 46 47

# 1. integrate TIM-VX for default
IF (NOT (DEFINED TENGINE_ENABLE_TIM_VX_INTEGRATION))
    SET (TENGINE_ENABLE_TIM_VX_INTEGRATION ON)
ENDIF()

# 2. check arch
IF (${TENGINE_TARGET_PROCESSOR} MATCHES "ARM")
K
kalcohol 已提交
48 49 50
    IF (ANDROID)
        SET (_VX_ARCH "android")
    ELSE()
K
kalcohol 已提交
51 52 53 54 55
        IF (TENGINE_TARGET_PROCESSOR_32Bit)
            SET (_VX_ARCH "aarch32")
        ELSE()
            SET (_VX_ARCH "aarch64")
        ENDIF()
K
kalcohol 已提交
56
    ENDIF()
K
kalcohol 已提交
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
ELSEIF (${TENGINE_TARGET_PROCESSOR} MATCHES "X86")
    SET (_VX_ARCH "x86_64")
ELSE()
    MESSAGE (FATAL_ERROR "Tengine: Unsupported TIM-VX arch:${TENGINE_TARGET_PROCESSOR}")
ENDIF()

# 3. check & set TIM-VX integration library
IF (TENGINE_ENABLE_TIM_VX_INTEGRATION)
    # set
    SET (_TIM_VX_NAME  "tim_vx_internal")
    SET (_TIM_OVX_NAME "tim_ovx_internal")

    IF (TIM_VX_SOURCE_DIR)      # if TIM-VX source directory is set manually
        SET (_VX_ROOT ${TIM_VX_SOURCE_DIR}/src)
        IF ((EXISTS ${_VX_ROOT}/tim) AND (IS_DIRECTORY ${_VX_ROOT}/tim))
            MESSAGE (FATAL_ERROR "Tengine: TIM-VX source was manually set as ${TIM_VX_SOURCE_DIR}, but it's not exists ${TIM_VX_SOURCE_DIR}/src.")
        ENDIF()
    ELSE()                      # if TIM-VX source directory is not set, than check if copied manually
        SET (_VX_ROOT "${CMAKE_SOURCE_DIR}/source/device/tim-vx/src")
        IF ((EXISTS ${_VX_ROOT}/tim) AND (IS_DIRECTORY ${_VX_ROOT}/tim))
            MESSAGE (STATUS "Tengine: TIM-VX source was found in ${_VX_ROOT}/tim.")
        ELSE()                  # TODO: to download TIM-VX, for not exist
            MESSAGE (FATAL_ERROR "Tengine: TIM-VX source was not found. Please read doc/npu_tim-vx_user_manual.md for more info.")
        ENDIF()
    ENDIF()

    # defines string
    SET (_VX_OVX_API_ATTR "__attribute__\(\(visibility\(\"default\"\)\)\)")

    # for ovx api
    SET (_VX_OVX_ROOT ${_VX_ROOT}/tim/vx/internal/src)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}                       _VX_OVX_SRC)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/kernel                _VX_OVX_KERNEL)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/kernel/cl             _VX_OVX_KERNEL_CL)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/kernel/cpu            _VX_OVX_KERNEL_CPU)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/kernel/evis           _VX_OVX_KERNEL_EVIS)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/kernel/vx             _VX_OVX_KERNEL_VX)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/ops                   _VX_OVX_OPS)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/libnnext              _VX_OVX_LIBNNEXT)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/quantization          _VX_OVX_QUANTIZATION)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/custom/ops            _VX_OVX_CUSTOM_OPS)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/custom/ops/kernel     _VX_OVX_CUSTOM_OPS_KERNEL)
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/utils                 _VX_OVX_UTILS)
K
kalcohol 已提交
100 101 102 103
    AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/POST                  _VX_OVX_POST)

    #AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/client                _VX_OVX_CLIENT)
    #AUX_SOURCE_DIRECTORY (${_VX_OVX_ROOT}/libnnext/ops/kernel   _VX_OVX_LIBNNEXT_OPS_KERNEL)
K
kalcohol 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
    
    # add ovx api lib target
    ADD_LIBRARY (${_TIM_OVX_NAME} STATIC)

    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE )
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_SRC})
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_KERNEL})
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_KERNEL_CL})
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_KERNEL_EVIS})
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_KERNEL_VX})
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_OPS})
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_LIBNNEXT})
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_QUANTIZATION})
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_CUSTOM_OPS})
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_CUSTOM_OPS_KERNEL})
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_UTILS})
K
kalcohol 已提交
120 121 122 123 124
    TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_POST})

    #TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_KERNEL_CPU})
    #TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_CLIENT})
    #TARGET_SOURCES (${_TIM_OVX_NAME} PRIVATE ${_VX_OVX_LIBNNEXT_OPS_KERNEL})
K
kalcohol 已提交
125 126 127 128 129 130 131 132 133 134

    TARGET_INCLUDE_DIRECTORIES (${_TIM_OVX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/3rdparty/tim-vx/include)
    TARGET_INCLUDE_DIRECTORIES (${_TIM_OVX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/3rdparty/tim-vx/include/CL)
    TARGET_INCLUDE_DIRECTORIES (${_TIM_OVX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/source/device/tim-vx/include)
    TARGET_INCLUDE_DIRECTORIES (${_TIM_OVX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/source/device/tim-vx/include/tim/vx)
    TARGET_INCLUDE_DIRECTORIES (${_TIM_OVX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/source/device/tim-vx/src/tim/vx)
    TARGET_INCLUDE_DIRECTORIES (${_TIM_OVX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/source/device/tim-vx/src/tim/vx/internal/include)

    TARGET_LINK_DIRECTORIES    (${_TIM_OVX_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/tim-vx/lib/${_VX_ARCH})

K
kalcohol 已提交
135 136 137 138 139
    IF (ANDROID)
        TARGET_LINK_LIBRARIES   (${_TIM_OVX_NAME} PRIVATE CLC GAL OpenVX OpenVXU VSC archmodelSw NNArchPerf)
    ELSE()
        TARGET_LINK_LIBRARIES   (${_TIM_OVX_NAME} PRIVATE CLC GAL OpenVX OpenVXU VSC ArchModelSw NNArchPerf)
    ENDIF()
K
kalcohol 已提交
140 141 142 143 144

    TARGET_COMPILE_DEFINITIONS (${_TIM_OVX_NAME} PRIVATE "-DOVXLIB_API=${_VX_OVX_API_ATTR}")

    TARGET_COMPILE_OPTIONS     (${_TIM_OVX_NAME} PRIVATE $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fPIC>)

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
    # collect tim-vx test files
    FILE (GLOB _VX_BASE_REMOVE_SRC ${_VX_ROOT}/tim/vx/*_test.cc)
    FILE (GLOB _VX_OPS_REMOVE_SRC  ${_VX_ROOT}/tim/vx/ops/*_test.cc)

    # remove test files for tim-vx
    IF(_VX_BASE_REMOVE_SRC)
        FILE (REMOVE ${_VX_BASE_REMOVE_SRC})
    ENDIF()
    IF(_VX_OPS_REMOVE_SRC)
        FILE (REMOVE ${_VX_OPS_REMOVE_SRC})
    ENDIF()

    # collect all source files for tim-vx
    AUX_SOURCE_DIRECTORY (${_VX_ROOT}/tim/vx      _VX_BASE_SRC)
    AUX_SOURCE_DIRECTORY (${_VX_ROOT}/tim/vx/ops  _VX_OPS_SRC)
K
kalcohol 已提交
160 161 162 163 164 165 166 167 168 169 170

    # TIM-VX source
    SET (_VX_SRC)
    LIST (APPEND      _VX_SRC ${_VX_BASE_SRC} ${_VX_OPS_SRC})

    # build
    ADD_LIBRARY (${_TIM_VX_NAME} STATIC ${_VX_SRC})

    TARGET_INCLUDE_DIRECTORIES (${_TIM_VX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/3rdparty/tim-vx/include)
    TARGET_INCLUDE_DIRECTORIES (${_TIM_VX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/3rdparty/tim-vx/include/CL)
    TARGET_INCLUDE_DIRECTORIES (${_TIM_VX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/source/device/tim-vx/include)
B
BowShotDS 已提交
171
    TARGET_INCLUDE_DIRECTORIES (${_TIM_VX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/source/device/common)
K
kalcohol 已提交
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
    TARGET_INCLUDE_DIRECTORIES (${_TIM_VX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/source/device/tim-vx/include/tim/vx)
    TARGET_INCLUDE_DIRECTORIES (${_TIM_VX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/source/device/tim-vx/src/tim/vx)
    TARGET_INCLUDE_DIRECTORIES (${_TIM_VX_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/source/device/tim-vx/src/tim/vx/internal/include)

    SET_TARGET_PROPERTIES (${_TIM_VX_NAME} PROPERTIES CXX_STANDARD_REQUIRED 14)
    SET_TARGET_PROPERTIES (${_TIM_VX_NAME} PROPERTIES CXX_STANDARD 14)

    TARGET_COMPILE_DEFINITIONS (${_TIM_VX_NAME} PRIVATE "-DOVXLIB_API=${_VX_OVX_API_ATTR}")

    TARGET_COMPILE_OPTIONS (${_TIM_VX_NAME} PRIVATE $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fPIC>)
    #TARGET_COMPILE_OPTIONS (${_TIM_VX_NAME} PRIVATE $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wall -Wextra -Wno-unused-parameter -Wno-sign-compare -Werror>)

    SET_TARGET_PROPERTIES  (${VSI_TIM_NAME} PROPERTIES CXX_STANDARD 14)
    SET_TARGET_PROPERTIES  (${VSI_TIM_NAME} PROPERTIES CXX_STANDARD_REQUIRED 14)

    TARGET_LINK_DIRECTORIES (${_TIM_VX_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/tim-vx/lib/${_VX_ARCH})

    TARGET_LINK_LIBRARIES   (${_TIM_VX_NAME} PRIVATE ${_TIM_OVX_NAME})
K
kalcohol 已提交
190 191 192 193 194
    IF (ANDROID)
        TARGET_LINK_LIBRARIES   (${_TIM_VX_NAME} PRIVATE CLC GAL OpenVX OpenVXU VSC archmodelSw NNArchPerf)
    ELSE()
        TARGET_LINK_LIBRARIES   (${_TIM_VX_NAME} PRIVATE CLC GAL OpenVX OpenVXU VSC ArchModelSw NNArchPerf)
    ENDIF()
K
kalcohol 已提交
195 196 197 198 199 200 201 202
ENDIF()


# 4.  set source root path
SET(_TIM_VX_ROOT ${CMAKE_SOURCE_DIR}/source/device/tim-vx)

# 5.  add header file path
LIST (APPEND _DEV_TIM_VX_HEADER_PATH        ${_TIM_VX_ROOT})
203
LIST (APPEND _DEV_TIM_VX_HEADER_PATH        ${CMAKE_CURRENT_BINARY_DIR})
K
kalcohol 已提交
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
LIST (APPEND _DEV_TIM_VX_HEADER_PATH        ${CMAKE_SOURCE_DIR}/3rdparty/tim-vx/include)
LIST (APPEND _DEV_TIM_VX_HEADER_PATH        ${CMAKE_SOURCE_DIR}/source/device/tim-vx/include)


# 6.  add linking lib searching path
LIST (APPEND _DEV_TIM_VX_LINK_PATH          ${CMAKE_SOURCE_DIR}/3rdparty/tim-vx/lib/${_VX_ARCH})


# 7.  add source files
AUX_SOURCE_DIRECTORY ("${_TIM_VX_ROOT}"     _TIM_VX_BASE_SOURCE)
AUX_SOURCE_DIRECTORY ("${_TIM_VX_ROOT}/op"  _TIM_VX_OPS_SOURCE)
LIST (APPEND _DEV_TIM_VX_DEVICE_SOURCE      ${_TIM_VX_BASE_SOURCE})
LIST (APPEND _DEV_TIM_VX_DEVICE_SOURCE      ${_TIM_VX_OPS_SOURCE})


# 8.  add build options for cpu device
# 8.1 is a gcc or clang like compiler
IF (TENGINE_COMPILER_GCC OR TENGINE_COMPILER_CLANG)
ENDIF()


# 8.2 is Microsoft Visual C++
IF (TENGINE_COMPILER_MSVC)
ENDIF()


# 9.  add link options


# 10.  add link libs
IF (TENGINE_ENABLE_TIM_VX_INTEGRATION)
    LIST (APPEND _DEV_TIM_VX_LINK_LIBRARIES   -Wl,--whole-archive ${_TIM_OVX_NAME} -Wl,--no-whole-archive)
    LIST (APPEND _DEV_TIM_VX_LINK_LIBRARIES   -Wl,--whole-archive ${_TIM_VX_NAME} -Wl,--no-whole-archive)
ELSE()
    LIST (APPEND _DEV_TIM_VX_LINK_LIBRARIES   tim-vx)
ENDIF()


# 11. set all to cmake cache
SET (TENGINE_TIM_VX_HEADER_PATH       ${_DEV_TIM_VX_HEADER_PATH}        CACHE INTERNAL  "Tengine TIM_VX device header files searching path"   FORCE)
SET (TENGINE_TIM_VX_LINK_PATH         ${_DEV_TIM_VX_LINK_PATH}          CACHE INTERNAL  "Tengine TIM_VX device link libraries searching path" FORCE)
SET (TENGINE_TIM_VX_DEVICE_SOURCE     ${_DEV_TIM_VX_DEVICE_SOURCE}      CACHE INTERNAL  "Tengine TIM_VX device main source files"             FORCE)
SET (TENGINE_TIM_VX_COMPILER_DEFINES  ${_DEV_TIM_VX_COMPILER_DEFINES}   CACHE INTERNAL  "Tengine TIM_VX about compiler defines"               FORCE)
SET (TENGINE_TIM_VX_COMPILER_OPTIONS  ${_DEV_TIM_VX_COMPILER_OPTIONS}   CACHE INTERNAL  "Tengine TIM_VX about compiler options"               FORCE)
SET (TENGINE_TIM_VX_LINKER_OPTIONS    ${_DEV_TIM_VX_LINKER_OPTIONS}     CACHE INTERNAL  "Tengine TIM_VX about linker options"                 FORCE)
SET (TENGINE_TIM_VX_LINK_LIBRARIES    ${_DEV_TIM_VX_LINK_LIBRARIES}     CACHE INTERNAL  "Tengine TIM_VX about link libraries"                 FORCE)


# 12. install device option
253
INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/timvx_define.h DESTINATION include/tengine RENAME timvx_device.h)