Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Hexagon] Reuse Hexagon SDK analysis across cmake files #8822

Merged
merged 5 commits into from
Aug 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions cmake/config.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,13 @@ set(USE_FALLBACK_STL_MAP OFF)
set(USE_HEXAGON_DEVICE OFF)
set(USE_HEXAGON_SDK /path/to/sdk)

# Hexagon architecture to target when compiling TVM itself (not the target for
# compiling _by_ TVM). This applies to components like the TVM runtime, but is
# also used to select correct include/library paths from the Hexagon SDK when
# building offloading runtime for Android.
# Valid values are v60, v62, v65, v66, v68.
set(USE_HEXAGON_ARCH "v66")

# Whether to use ONNX codegen
set(USE_TARGET_ONNX OFF)

Expand Down
65 changes: 12 additions & 53 deletions cmake/modules/Hexagon.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@
# under the License.

include(ExternalProject)
include(cmake/modules/HexagonSDK.cmake)

set(PICK_SIM "sim")
set(PICK_HW "target")
set(PICK_NONE "OFF")

set(FOUND_HEXAGON_SDK_ROOT FALSE)
set(FOUND_HEXAGON_TOOLCHAIN FALSE)

function(find_hexagon_toolchain)
Expand All @@ -47,41 +47,10 @@ function(find_hexagon_toolchain)
endif()
endfunction()

function(find_hexagon_sdk_root)
if(FOUND_HEXAGON_SDK_ROOT)
return()
endif()
message(STATUS "Checking Hexagon SDK root: ${USE_HEXAGON_SDK}")
file(GLOB_RECURSE HEXAGON_AEESTDDEF "${USE_HEXAGON_SDK}/*/AEEStdDef.h")
if(HEXAGON_AEESTDDEF)
# The path is ${HEXAGON_SDK_ROOT}/incs/stddef/AEEStdDef.h.
get_filename_component(HEXAGON_TMP0 "${HEXAGON_AEESTDDEF}" DIRECTORY)
get_filename_component(HEXAGON_TMP1 "${HEXAGON_TMP0}" DIRECTORY)
get_filename_component(HEXAGON_TMP2 "${HEXAGON_TMP1}" DIRECTORY)
set(HEXAGON_SDK_ROOT "${HEXAGON_TMP2}" CACHE PATH
"Root directory of Hexagon SDK")
set(FOUND_HEXAGON_SDK_ROOT TRUE)
else(HEXAGON_AEESTDDEF)
message(SEND_ERROR "Cannot validate Hexagon SDK in ${USE_HEXAGON_SDK}")
endif()
endfunction()

if(BUILD_FOR_HEXAGON)
find_hexagon_sdk_root()
if(HEXAGON_SDK_ROOT MATCHES "3.5.1")
message(SEND_ERROR "Hexagon SDK 3.5.1 is not supported")
elseif(HEXAGON_SDK_ROOT MATCHES "3\.[0-9]+\.[0-9]+")
include_directories(
SYSTEM "${USE_HEXAGON_SDK}/libs/common/qurt/ADSPv62MP/include/posix"
SYSTEM "${USE_HEXAGON_SDK}/libs/common/qurt/ADSPv62MP/include/qurt")
else()
include_directories(
SYSTEM "${HEXAGON_SDK_ROOT}/rtos/qurt/computev65/include/posix"
SYSTEM "${HEXAGON_SDK_ROOT}/rtos/qurt/computev65/include/qurt")
endif()
include_directories(
SYSTEM "${HEXAGON_SDK_ROOT}/incs"
SYSTEM "${HEXAGON_SDK_ROOT}/incs/stddef")
find_hexagon_sdk_root("${USE_HEXAGON_SDK}" "${USE_HEXAGON_ARCH}")
# Add SDK and QuRT includes when building for Hexagon.
include_directories(SYSTEM ${HEXAGON_SDK_INCLUDES} ${HEXAGON_QURT_INCLUDES})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you switch this to target_include_directories? You may have to call it multiple times with different targets (tvm_objs, tvm). I know the old code used include_directories, but it would be good to clean this up.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that would also require moving the include(cmake/modules/Hexagon.cmake) to be after the definitions of tvm_objs. It would then also require using the target_sources function instead of appending to the RUNTIME_SRCS variable, since the RUNTIME_SRCS variable isn't used after the definition of the object libraries.

If we're cleaning up the module usage, I'd lean toward having every module define an object library, along with any flags that are needed. It looks like there's a nice new feature in cmake 3.12 that allows object libraries to specify linkage. There are some workarounds for earlier versions, including using static libraries, but needing the -Wl,--whole-archive flag is causing some issues.

I think I'd stick with the current style for consistency with other modules, but I want to change it to use object libraries if/when we require a newer version of cmake.

Copy link
Contributor Author

@kparzysz-quic kparzysz-quic Aug 24, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These targets are created after the target-specific modules are included. In other words, they don't yet exist here.

Edit: This is essentially what @Lunderberg said, I didn't see his comment when I was replying.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like to clean up the module, but I don't want to put too much of a burden on you @kparzysz-quic. If its too much work switch this to target_include_directories, we can leave it as further work.

@Lunderberg I think cmake 3.9 is the minimum version of cmake we support. There are a lot of useful features in 3.12 and 3.13 that I'd like to use, but many OSs don't have newer version of cmake.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That was my guess, since ubuntu18.04 is on 3.10 in the repo. It would be nice to have a newer version, but not worth dropping support. It looks like the CMakeLists.txt declares a minimum version of cmake 3.2, while the documentation gives 3.5.

endif()

if(USE_HEXAGON_DEVICE STREQUAL "OFF")
Expand Down Expand Up @@ -113,29 +82,19 @@ if(USE_HEXAGON_DEVICE STREQUAL "${PICK_SIM}")
CMAKE_ARGS
"-DCMAKE_C_COMPILER=${HEXAGON_TOOLCHAIN}/bin/hexagon-clang"
"-DCMAKE_CXX_COMPILER=${HEXAGON_TOOLCHAIN}/bin/hexagon-clang++"
"-DHEXAGON_ARCH=${USE_HEXAGON_ARCH}"
INSTALL_COMMAND "true"
)
elseif(USE_HEXAGON_DEVICE STREQUAL "${PICK_HW}")
find_hexagon_sdk_root()
find_hexagon_sdk_root("${USE_HEXAGON_SDK}" "${USE_HEXAGON_ARCH}")
find_hexagon_toolchain()
message(STATUS "Hexagon SDK: ${HEXAGON_SDK_ROOT}")
if(HEXAGON_SDK_ROOT MATCHES "3.5.1")
message(SEND_ERROR "Hexagon SDK 3.5.1 is not supported")
elseif(HEXAGON_SDK_ROOT MATCHES "3\.[0-9]+\.[0-9]+")
set(RPCMEM_DIR "libs/common/rpcmem")
set(REMOTE_DIR "libs/common/remote/ship/android_Release_aarch64")
else()
set(RPCMEM_DIR "ipc/fastrpc/rpcmem")
set(REMOTE_DIR "ipc/fastrpc/remote/ship/android_aarch64")
endif()
file(GLOB RUNTIME_HEXAGON_DEVICE_SRCS src/runtime/hexagon/target/*.cc)
include_directories(SYSTEM "${HEXAGON_SDK_ROOT}/incs/stddef")
include_directories(SYSTEM "${HEXAGON_SDK_ROOT}/${RPCMEM_DIR}/inc")
include_directories(
SYSTEM "${HEXAGON_SDK_ROOT}/incs")
include_directories(
SYSTEM "${HEXAGON_SDK_ROOT}/${REMOTE_DIR}")
include_directories(SYSTEM "${HEXAGON_TOOLCHAIN}/include/iss")

include_directories(SYSTEM
${HEXAGON_SDK_INCLUDES}
${HEXAGON_RPCMEM_ROOT}/inc
${HEXAGON_REMOTE_ROOT}
)
Comment on lines +93 to +97
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you also switch this to target_include_directories?

list(APPEND TVM_RUNTIME_LINKER_LIBS "dl")
if(BUILD_FOR_ANDROID)
# Hexagon runtime uses __android_log_print, which is in liblog.
Expand Down
123 changes: 123 additions & 0 deletions cmake/modules/HexagonSDK.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# 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.

set(FOUND_HEXAGON_SDK_ROOT FALSE)

macro(set_parent var)
set(${var} ${ARGN} PARENT_SCOPE)
endmacro()

function(find_hexagon_sdk_root HEXAGON_SDK_PATH HEXAGON_ARCH)
if(FOUND_HEXAGON_SDK_ROOT)
return()
endif()
if(${ARGC} LESS "2")
message(SEND_ERROR "Must provide Hexagon SDK path and Hexagon arch")
endif()

# Initial verification of the Hexagon SDK.
message(STATUS "Checking Hexagon SDK root: ${HEXAGON_SDK_PATH}")
file(GLOB_RECURSE VERSION_HEADERS "${HEXAGON_SDK_PATH}/*/version.h")
if(VERSION_HEADERS)
foreach(HEADER IN LISTS VERSION_HEADERS)
if(HEADER MATCHES "incs/version.h$")
set(SDK_VERSION_HEADER "${HEADER}")
break()
endif()
endforeach()
# The path is ${HEXAGON_SDK_ROOT}/incs/version.h.
get_filename_component(TMP0 "${SDK_VERSION_HEADER}" DIRECTORY)
get_filename_component(TMP1 "${TMP0}" DIRECTORY)
set(HEXAGON_SDK_ROOT "${TMP1}" CACHE PATH "Root directory of Hexagon SDK")
else()
message(SEND_ERROR "Cannot validate Hexagon SDK in ${HEXAGON_SDK_PATH}")
endif()

execute_process(
COMMAND grep "#define[ \t]*VERSION_STRING" "${SDK_VERSION_HEADER}"
OUTPUT_VARIABLE SDK_VERSION_DEFINE)
string(
REGEX REPLACE ".*VERSION_STRING.* ([0-9\\.]+) .*" "\\1"
SDK_VERSION_STRING "${SDK_VERSION_DEFINE}")

if (SDK_VERSION_STRING MATCHES "3.5.1")
message(SEND_ERROR "Hexagon SDK 3.5.1 is not supported")
endif()

# Set the Hexagon arch directory component.
set(HEXARCH_DIR_v60 "ADSPv60MP")
set(HEXARCH_DIR_v62 "ADSPv62MP")
set(HEXARCH_DIR_v65 "computev65")
set(HEXARCH_DIR_v66 "computev66")
set(HEXARCH_DIR_v68 "computev68")
tmoreau89 marked this conversation as resolved.
Show resolved Hide resolved
set(HEXARCH_DIR_STR "HEXARCH_DIR_${HEXAGON_ARCH}")
set(HEXARCH_DIR "${${HEXARCH_DIR_STR}}")

if(NOT HEXARCH_DIR)
message(SEND_ERROR
"Please set HEXAGON_ARCH to one of v60, v62, v65, v66, v68")
endif()

# Set parent variables:
# - HEXAGON_SDK_VERSION
# - HEXAGON_SDK_INCLUDES
# - HEXAGON_QURT_INCLUDES
# - HEXAGON_RPCMEM_ROOT
# - HEXAGON_REMOTE_ROOT
# - HEXAGON_QAIC_EXE
set_parent(HEXAGON_SDK_VERSION "${SDK_VERSION_STRING}")

if(SDK_VERSION_STRING MATCHES "^3\.[0-9]+\.[0-9]+")
# SDK 3.x.y
if(HEXAGON_ARCH MATCHES "v6[7-9]|v[7-9][0-9]")
message(SEND_ERROR
"Hexagon SDK ${SDK_VERSION_STRING} does not support ${HEXAGON_ARCH}")
endif()
set_parent(HEXAGON_SDK_INCLUDES
"${HEXAGON_SDK_ROOT}/incs"
"${HEXAGON_SDK_ROOT}/incs/a1std"
"${HEXAGON_SDK_ROOT}/incs/qlist"
"${HEXAGON_SDK_ROOT}/incs/stddef")
set_parent(HEXAGON_QURT_INCLUDES
"${HEXAGON_SDK_ROOT}/libs/common/qurt/${HEXARCH_DIR}/include/posix"
"${HEXAGON_SDK_ROOT}/libs/common/qurt/${HEXARCH_DIR}/include/qurt")
set_parent(HEXAGON_RPCMEM_ROOT "${HEXAGON_SDK_ROOT}/libs/common/rpcmem")
set_parent(HEXAGON_REMOTE_ROOT
"${HEXAGON_SDK_ROOT}/libs/common/remote/ship/android_Release_aarch64")
set_parent(HEXAGON_QAIC_EXE "${HEXAGON_SDK_ROOT}/tools/qaic/bin/qaic")
else()
# SDK 4.x.y.z
if(HEXAGON_ARCH MATCHES "v6[02]")
message(SEND_ERROR
"Hexagon SDK ${SDK_VERSION_STRING} does not support ${HEXAGON_ARCH}")
endif()
set_parent(HEXAGON_SDK_INCLUDES
"${HEXAGON_SDK_ROOT}/incs"
"${HEXAGON_SDK_ROOT}/incs/stddef")
set_parent(HEXAGON_QURT_INCLUDES
"${HEXAGON_SDK_ROOT}/rtos/qurt/${HEXARCH_DIR}/include/posix"
"${HEXAGON_SDK_ROOT}/rtos/qurt/${HEXARCH_DIR}/include/qurt")
set_parent(HEXAGON_RPCMEM_ROOT "${HEXAGON_SDK_ROOT}/ipc/fastrpc/rpcmem")
set_parent(HEXAGON_REMOTE_ROOT # libadsprpc.so
"${HEXAGON_SDK_ROOT}/ipc/fastrpc/remote/ship/android_aarch64")
set_parent(HEXAGON_QAIC_EXE
"${HEXAGON_SDK_ROOT}/ipc/fastrpc/qaic/Ubuntu16/qaic")
endif()

set(FOUND_HEXAGON_SDK_ROOT TRUE)
endfunction()

8 changes: 7 additions & 1 deletion src/runtime/hexagon/sim/driver/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,17 @@ if(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/config.cmake)
include(${CMAKE_CURRENT_BINARY_DIR}/config.cmake)
endif()

if("${HEXAGON_ARCH}" STREQUAL "")
set(DEFAULT_HEXAGON_ARCH "v66")
message(STATUS "HEXAGON_ARCH not defined, defaulting to ${DEFAULT_HEXAGON_ARCH}")
set(HEXAGON_ARCH "${DEFAULT_HEXAGON_ARCH}")
endif()

set(EXTRA_CXX_FLAGS
"-O2"
"-Wno-format"
"-mhvx -mhvx-length=128b"
"-mv65"
"-m${HEXAGON_ARCH}"
"-stdlib=libc++"
)

Expand Down
Loading