From 37c842db09547d3b2294502d63e97cdcc22fa000 Mon Sep 17 00:00:00 2001 From: Shichuang Chen Date: Fri, 31 May 2024 19:11:42 +0530 Subject: [PATCH 1/5] add definitions for hexagon; add build cmake build/test support for hexagon dsp Signed-off-by: Shichuang Chen --- Eigen/src/Core/util/Macros.h | 7 + cmake/HexagonToolchain.cmake | 157 ++++++++++++++++++ test/main.h | 5 + .../src/SparseExtra/MatrixMarketIterator.h | 10 +- 4 files changed, 176 insertions(+), 3 deletions(-) create mode 100644 cmake/HexagonToolchain.cmake diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h index 226844f64..a9706cf0c 100644 --- a/Eigen/src/Core/util/Macros.h +++ b/Eigen/src/Core/util/Macros.h @@ -508,6 +508,13 @@ #define EIGEN_OS_SOLARIS 0 #endif +/// \internal EIGEN_OS_QURT set to 1 if the OS is Qualcomm DSP QURT +#if defined(__QDSP6_RTOS__) +#define EIGEN_OS_QURT 1 +#else +#define EIGEN_OS_QURT 0 +#endif + //------------------------------------------------------------------------------------------ // Detect GPU compilers and architectures //------------------------------------------------------------------------------------------ diff --git a/cmake/HexagonToolchain.cmake b/cmake/HexagonToolchain.cmake new file mode 100644 index 000000000..4e3e65434 --- /dev/null +++ b/cmake/HexagonToolchain.cmake @@ -0,0 +1,157 @@ +# =============================================================================== +# Copyright 2018 Qualcomm Technologies, Inc. All rights reserved. +# Confidential & Proprietary +# =============================================================================== + +if(HEXAGON_TOOLCHAIN_INCLUDED) + return() +endif(HEXAGON_TOOLCHAIN_INCLUDED) +set(HEXAGON_TOOLCHAIN_INCLUDED true) + +set(EIGEN_TEST_HVX ON) + +if (NOT DSP_VERSION) + set(DSP_VERSION v69) +endif() + +set(TOOLS_VARIANT $ENV{DEFAULT_TOOLS_VARIANT}) +set(PREBUILT_LIB_DIR hexagon_${TOOLS_VARIANT}_${DSP_VERSION}) + +# Cross Compiling for Hexagon +set(HEXAGON TRUE) +set(CMAKE_SYSTEM_NAME QURT) +set(CMAKE_SYSTEM_PROCESSOR Hexagon) +set(CMAKE_SYSTEM_VERSION "1") #${HEXAGON_PLATFORM_LEVEL}) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) +set(CUSTOM_RUNELF_PATH "") + +# To fix backward compatibility with EAI addon. +if (NOT HEXAGON_SDK_ROOT) + set(HEXAGON_SDK_ROOT $ENV{HEXAGON_SDK_ROOT}) +endif() + +if (NOT HEXAGON_TOOLS_ROOT) + if (DEFINED ENV{HEXAGON_TOOLS_ROOT}) + set(HEXAGON_TOOLS_ROOT $ENV{HEXAGON_TOOLS_ROOT}) + endif() + if(NOT HEXAGON_TOOLS_ROOT) + set(HEXAGON_TOOLS_ROOT $ENV{DEFAULT_HEXAGON_TOOLS_ROOT}) + endif() +endif() + +file(TO_CMAKE_PATH "${HEXAGON_TOOLS_ROOT}" HEXAGON_TOOLS_ROOT) +file(TO_CMAKE_PATH "${HEXAGON_SDK_ROOT}" HEXAGON_SDK_ROOT) + +include(${HEXAGON_SDK_ROOT}/build/cmake/hexagon_arch.cmake) + +set(HEXAGON_TOOLCHAIN ${HEXAGON_TOOLS_ROOT}) +set(HEXAGON_LIB_DIR "${HEXAGON_TOOLCHAIN}/Tools/target/hexagon/lib") +set(HEXAGON_ISS_DIR ${HEXAGON_TOOLCHAIN}/Tools/lib/iss) +set(RUN_MAIN_HEXAGON "${HEXAGON_SDK_ROOT}/libs/run_main_on_hexagon/ship/${PREBUILT_LIB_DIR}/run_main_on_hexagon_sim") + +set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES + HEXAGON_SDK_ROOT + HEXAGON_TOOLS_ROOT +) + +#QURT SPECIFIC LIBS and Includes +# Linker Flags +# QURT Related includes and linker flags + +set(V_ARCH ${HEXAGON_ARCH}) +set(_QURT_INSTALL_DIR "${HEXAGON_SDK_ROOT}/rtos/qurt/ADSP${V_ARCH}MP${V_ARCH_EXTN}") +set(_QURT_INSTALL_DIR "${HEXAGON_SDK_ROOT}/rtos/qurt/compute${V_ARCH}${V_ARCH_EXTN}") + +message(DEBUG "_QURT_INSTALL_DIR:${_QURT_INSTALL_DIR}") +set(RTOS_DIR ${_QURT_INSTALL_DIR}) +set(TARGET_DIR "${HEXAGON_LIB_DIR}/${V_ARCH}/G0") +include_directories( + ${_QURT_INSTALL_DIR}/include + ${_QURT_INSTALL_DIR}/include/qurt + ${_QURT_INSTALL_DIR}/include/posix + ) + +# Non QURT related includes and linker flags +set(TARGET_DIR_NOOS "${HEXAGON_TOOLCHAIN}/Tools/target/hexagon/lib/${HEXAGON_ARCH}") + +set(EXE_LD_FLAGS + -m${V_ARCH} + -G0 + -fpic + -Wl,-Bsymbolic + -Wl,-L${TARGET_DIR_NOOS}/G0/pic + -Wl,-L${HEXAGON_TOOLCHAIN}/Tools/target/hexagon/lib/ + -Wl,--no-threads -Wl,--wrap=malloc -Wl,--wrap=calloc -Wl,--wrap=free -Wl,--wrap=realloc -Wl,--wrap=memalign + -shared + "-o " + "" + -Wl,--start-group + "" + "" + -Wl,${TARGET_DIR_NOOS}/G0/pic/libc++.a + -Wl,${TARGET_DIR_NOOS}/G0/pic/libc++abi.a + -Wl,--end-group + -lc + ) + STRING(REPLACE ";" " " EXE_LD_FLAGS "${EXE_LD_FLAGS}") + +set(HEXAGON_C_LINK_EXECUTABLE_LINK_OPTIONS "${EXE_LD_FLAGS}" ) +message(DEBUG "Hexagon C Executable Linker Line:${HEXAGON_C_LINK_EXECUTABLE_LINK_OPTIONS}") +set(HEXAGON_CXX_LINK_EXECUTABLE_LINK_OPTIONS "${EXE_LD_FLAGS}") +message(DEBUG "Hexagon CXX Executable Linker Line:${HEXAGON_CXX_LINK_EXECUTABLE_LINK_OPTIONS}") + +# System include paths +include_directories(SYSTEM ${HEXAGON_SDK_ROOT}/incs) +include_directories(SYSTEM ${HEXAGON_SDK_ROOT}/incs/stddef) +include_directories(SYSTEM ${HEXAGON_SDK_ROOT}/ipc/fastrpc/incs) + +# LLVM toolchain setup +# Compiler paths, options and architecture +set(CMAKE_C_COMPILER ${HEXAGON_TOOLCHAIN}/Tools/bin/hexagon-clang${HEXAGON_TOOLCHAIN_SUFFIX}) +set(CMAKE_CXX_COMPILER ${HEXAGON_TOOLCHAIN}/Tools/bin/hexagon-clang++${HEXAGON_TOOLCHAIN_SUFFIX}) +set(CMAKE_AR ${HEXAGON_TOOLCHAIN}/Tools/bin/hexagon-ar${HEXAGON_TOOLCHAIN_SUFFIX}) +set(CMAKE_ASM_COMPILER ${HEXAGON_TOOLCHAIN}/Tools/bin/hexagon-clang++${HEXAGON_TOOLCHAIN_SUFFIX}) +set(HEXAGON_LINKER ${CMAKE_C_COMPILER}) +set(CMAKE_PREFIX_PATH ${HEXAGON_TOOLCHAIN}/Tools/target/hexagon) +set(HEXAGON_SIM "${HEXAGON_TOOLCHAIN}/Tools/bin/hexagon-sim${HEXAGON_TOOLCHAIN_SUFFIX}") +set(DEBUG_FLAGS "-O0 -g") +set(RELEASE_FLAGS "-O2") +set(COMMON_FLAGS "-m${HEXAGON_ARCH} -G0 -Wall -fno-zero-initialized-in-bss -fdata-sections -fpic") + +set(COMMON_FLAGS "${COMMON_FLAGS} -mhvx -mhvx-length=128B") + +set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,") +set(CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG "-Wl,-soname,") + +set(CMAKE_CXX_FLAGS_DEBUG "${COMMON_FLAGS} ${DEBUG_FLAGS}") +set(CMAKE_CXX_FLAGS_RELEASE "${COMMON_FLAGS} ${RELEASE_FLAGS}") +set(CMAKE_C_FLAGS_DEBUG "${COMMON_FLAGS} ${DEBUG_FLAGS}") +set(CMAKE_C_FLAGS_RELEASE "${COMMON_FLAGS} ${RELEASE_FLAGS}") +if(ADD_SYMBOLS) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -g ") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -g ") +endif() +set(CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}") +set(CMAKE_ASM_FLAGS_RELEASE "${CMAKE_ASM_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}") + +# Linker Options +set(CMAKE_C_LINK_EXECUTABLE "${HEXAGON_LINKER} ${HEXAGON_C_LINK_EXECUTABLE_LINK_OPTIONS}") +set(CMAKE_C_CREATE_SHARED_LIBRARY "${HEXAGON_LINKER} ${HEXAGON_PIC_SHARED_LINK_OPTIONS}") +set(CMAKE_CXX_LINK_EXECUTABLE "${HEXAGON_LINKER} ${HEXAGON_CXX_LINK_EXECUTABLE_LINK_OPTIONS}") +set(CMAKE_CXX_CREATE_SHARED_LIBRARY "${HEXAGON_LINKER} ${HEXAGON_PIC_SHARED_LINK_OPTIONS}") + +# Run simulator +set(CUSTOM_RUNELF_PATH ${RTOS_DIR}/sdksim_bin/runelf.pbn) + +set(q6ssLine1 "${HEXAGON_ISS_DIR}/qtimer.so --csr_base=0xFC900000 --irq_p=1 --freq=19200000 --cnttid=1\n") +set(q6ssLine2 "${HEXAGON_ISS_DIR}/l2vic.so 32 0xFC910000\n") +set(osamString "${RTOS_DIR}/debugger/lnx64/qurt_model.so\n") +file(WRITE ${CMAKE_BINARY_DIR}/q6ss.cfg ${q6ssLine1}) +file(APPEND ${CMAKE_BINARY_DIR}/q6ss.cfg ${q6ssLine2}) +file(WRITE ${CMAKE_BINARY_DIR}/osam.cfg ${osamString}) + +set(CMAKE_CROSSCOMPILING_EMULATOR + ${HEXAGON_SIM};-m${SIM_V_ARCH};--simulated_returnval;--usefs;${CMAKE_CURRENT_BINARY_DIR};--cosim_file;${CMAKE_BINARY_DIR}/q6ss.cfg;--l2tcm_base;0xd800;--rtos;${CMAKE_BINARY_DIR}/osam.cfg;${CUSTOM_RUNELF_PATH};--;${RUN_MAIN_HEXAGON};--) diff --git a/test/main.h b/test/main.h index ca1748d23..eb5a847d8 100644 --- a/test/main.h +++ b/test/main.h @@ -84,6 +84,11 @@ #define EIGEN_DEFAULT_DENSE_INDEX_TYPE int #endif +#if defined __HVX__ && (__HVX_LENGTH__ == 128) +// Need to prevent conflict FORBIDDEN_IDENTIFIER B0. +#include +#endif + // To test that all calls from Eigen code to std::min() and std::max() are // protected by parenthesis against macro expansion, the min()/max() macros // are defined here and any not-parenthesized min/max call will cause a diff --git a/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h b/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h index 15d7fb2de..6bf1ad928 100644 --- a/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h +++ b/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h @@ -171,10 +171,14 @@ class MatrixMarketIterator { std::string curfile; curfile = m_folder + "/" + m_curs_id->d_name; // Discard if it is a folder + +#if EIGEN_OS_QURT // + struct stat st_buf; + stat(curfile.c_str(), &st_buf); + if (S_ISDIR(st_buf.st_mode)) continue; +#else if (m_curs_id->d_type == DT_DIR) continue; // FIXME This may not be available on non BSD systems - // struct stat st_buf; - // stat (curfile.c_str(), &st_buf); - // if (S_ISDIR(st_buf.st_mode)) continue; +#endif // Determine from the header if it is a matrix or a right hand side bool isvector, iscomplex = false; -- GitLab From 22ec847187d41a21a2348536b1de6a061e6fdff9 Mon Sep 17 00:00:00 2001 From: Shichuang Chen Date: Mon, 3 Jun 2024 18:27:01 +0800 Subject: [PATCH 2/5] add hexagon environment dockerfile Signed-off-by: Shichuang Chen --- ci/hexagon.dockerfile | 54 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 ci/hexagon.dockerfile diff --git a/ci/hexagon.dockerfile b/ci/hexagon.dockerfile new file mode 100644 index 000000000..fd62cdc9b --- /dev/null +++ b/ci/hexagon.dockerfile @@ -0,0 +1,54 @@ +# see URLs below to create QPM login and download QPM deb package needed to build this image +# build image with your Qualcomm credentials via "docker build --build-arg QPM_USER=foo --build-arg QPM_PASS=bar -t eigen-hex ." +# run eigen test suite with hexagon simulator via "docker run --rm -it eigen-hex" + +FROM ubuntu:22.04 +# create a qualcomm account at https://myaccount.qualcomm.com/signup +ARG QPM_USER +ARG QPM_PASS + +# install qpm dependencies +RUN apt-get update && \ + apt-get install -y --no-install-recommends sudo bc libicu70 libsasl2-2 libsqlite3-0 librtmp1 ca-certificates && \ + rm -rf /var/lib/apt/lists/* + +# install qpm +# download QPM from https://qpm.qualcomm.com/#/main/tools/details/QPM3 +ADD qpm3.deb / +RUN dpkg -i qpm3.deb + +# login to qpm and hexagon sdk 5.x +# sign agreements at https://www.qualcomm.com/agreements +# hexagon installs to /local/mnt/workspace/Qualcomm/... +RUN mkdir -p /local/mnt/workspace +# hexagon installer uses /usr/bin/python +# hexagon installer needs unzip to unpack android ndk +RUN apt-get update && \ + apt-get install -y --no-install-recommends python-is-python3 unzip && \ + rm -rf /var/lib/apt/lists/* +RUN qpm-cli --login $QPM_USER $QPM_PASS && \ + qpm-cli --license-activate hexagonsdk5.x && \ + echo y | qpm-cli --install hexagonsdk5.x && \ + rm -rf /tmp/* + +# install hexagon-sim dependencies +RUN apt-get update && \ + apt-get install -y --no-install-recommends libncurses5 libtinfo5 libatomic1 && \ + rm -rf /var/lib/apt/lists/* + +# install eigen dependencies +RUN apt-get update && \ + apt-get install -y --no-install-recommends git cmake make && \ + rm -rf /var/lib/apt/lists/* + +# clone repo, compile tests +SHELL ["/bin/bash", "-c"] +RUN git clone --filter=blob:none -b master https://gitlab.com/libeigen/eigen.git /eigen && \ + mkdir /build && \ + cd /build &&\ + source /local/mnt/workspace/Qualcomm/Hexagon_SDK/5.5.0.1/setup_sdk_env.source && \ + cmake ../eigen -DCMAKE_TOOLCHAIN_FILE=../eigen/cmake/HexagonToolchain.cmake -DBUILD_TESTING=ON && \ + make -j 40 buildtests + +WORKDIR /build +CMD ctest -j 40 \ No newline at end of file -- GitLab From 0f7bb78e5c30442364ec8be01e7dac2650cbde25 Mon Sep 17 00:00:00 2001 From: Shichuang Chen Date: Tue, 4 Jun 2024 11:37:32 +0530 Subject: [PATCH 3/5] delete the /cmake/HexagonToolchain.cmake Copyright, update comment in dockerfile, fix syntax in dockerfile Signed-off-by: Shichuang Chen --- ci/hexagon.dockerfile | 8 ++++---- cmake/HexagonToolchain.cmake | 4 ---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/ci/hexagon.dockerfile b/ci/hexagon.dockerfile index fd62cdc9b..af42549b0 100644 --- a/ci/hexagon.dockerfile +++ b/ci/hexagon.dockerfile @@ -1,4 +1,4 @@ -# see URLs below to create QPM login and download QPM deb package needed to build this image +# see URLs below to create QPM login, download QPM deb package, and sign agreements needed to build this image # build image with your Qualcomm credentials via "docker build --build-arg QPM_USER=foo --build-arg QPM_PASS=bar -t eigen-hex ." # run eigen test suite with hexagon simulator via "docker run --rm -it eigen-hex" @@ -17,7 +17,7 @@ RUN apt-get update && \ ADD qpm3.deb / RUN dpkg -i qpm3.deb -# login to qpm and hexagon sdk 5.x +# login to qpm and install hexagon sdk 5.x # sign agreements at https://www.qualcomm.com/agreements # hexagon installs to /local/mnt/workspace/Qualcomm/... RUN mkdir -p /local/mnt/workspace @@ -26,7 +26,7 @@ RUN mkdir -p /local/mnt/workspace RUN apt-get update && \ apt-get install -y --no-install-recommends python-is-python3 unzip && \ rm -rf /var/lib/apt/lists/* -RUN qpm-cli --login $QPM_USER $QPM_PASS && \ +RUN qpm-cli --login $QPM_USER $QPM_PASS && \ qpm-cli --license-activate hexagonsdk5.x && \ echo y | qpm-cli --install hexagonsdk5.x && \ rm -rf /tmp/* @@ -43,7 +43,7 @@ RUN apt-get update && \ # clone repo, compile tests SHELL ["/bin/bash", "-c"] -RUN git clone --filter=blob:none -b master https://gitlab.com/libeigen/eigen.git /eigen && \ +RUN git clone --filter=blob:none -b add_build_for_hexagon_dsp https://gitlab.com/ShichuangChen/eigen.git /eigen && \ mkdir /build && \ cd /build &&\ source /local/mnt/workspace/Qualcomm/Hexagon_SDK/5.5.0.1/setup_sdk_env.source && \ diff --git a/cmake/HexagonToolchain.cmake b/cmake/HexagonToolchain.cmake index 4e3e65434..97fa476c0 100644 --- a/cmake/HexagonToolchain.cmake +++ b/cmake/HexagonToolchain.cmake @@ -1,7 +1,3 @@ -# =============================================================================== -# Copyright 2018 Qualcomm Technologies, Inc. All rights reserved. -# Confidential & Proprietary -# =============================================================================== if(HEXAGON_TOOLCHAIN_INCLUDED) return() -- GitLab From ee34bdf43f22307d72d554d5f9daac6ede40d6fe Mon Sep 17 00:00:00 2001 From: Shichuang Chen Date: Wed, 5 Jun 2024 15:32:29 +0530 Subject: [PATCH 4/5] add comment in EIGEN_OS_QURT didn't define DT_DIR; change EigenTesting.cmake avoid effect other architectures Signed-off-by: Shichuang Chen --- unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h b/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h index 6bf1ad928..434a58a50 100644 --- a/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h +++ b/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h @@ -172,7 +172,7 @@ class MatrixMarketIterator { curfile = m_folder + "/" + m_curs_id->d_name; // Discard if it is a folder -#if EIGEN_OS_QURT // +#if EIGEN_OS_QURT // EIGEN_OS_QURT didn't define DT_DIR struct stat st_buf; stat(curfile.c_str(), &st_buf); if (S_ISDIR(st_buf.st_mode)) continue; -- GitLab From c13d3789e69ee76b82397c1217bac99f2b345e19 Mon Sep 17 00:00:00 2001 From: ShichuangChen Date: Thu, 13 Jun 2024 15:20:19 +0800 Subject: [PATCH 5/5] update dockerfile Signed-off-by: ShichuangChen --- ci/hexagon.dockerfile | 2 +- cmake/EigenTesting.cmake | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ci/hexagon.dockerfile b/ci/hexagon.dockerfile index af42549b0..6066f6548 100644 --- a/ci/hexagon.dockerfile +++ b/ci/hexagon.dockerfile @@ -43,7 +43,7 @@ RUN apt-get update && \ # clone repo, compile tests SHELL ["/bin/bash", "-c"] -RUN git clone --filter=blob:none -b add_build_for_hexagon_dsp https://gitlab.com/ShichuangChen/eigen.git /eigen && \ +RUN git clone --filter=blob:none https://gitlab.com/libeigen/eigen.git /eigen && \ mkdir /build && \ cd /build &&\ source /local/mnt/workspace/Qualcomm/Hexagon_SDK/5.5.0.1/setup_sdk_env.source && \ diff --git a/cmake/EigenTesting.cmake b/cmake/EigenTesting.cmake index a1488fc47..81d9cfe04 100644 --- a/cmake/EigenTesting.cmake +++ b/cmake/EigenTesting.cmake @@ -75,8 +75,12 @@ macro(ei_add_test_internal testname testname_with_suffix) # let the user pass flags. if(${ARGC} GREATER 2) - separate_arguments(compile_options NATIVE_COMMAND ${ARGV2}) - target_compile_options(${targetname} PRIVATE ${compile_options}) + if(HEXAGON) + target_compile_options(${targetname} PRIVATE "SHELL:${ARGV2}") + else() + separate_arguments(compile_options NATIVE_COMMAND ${ARGV2}) + target_compile_options(${targetname} PRIVATE ${compile_options}) + endif() endif() if(EIGEN_TEST_CUSTOM_CXX_FLAGS) @@ -107,7 +111,11 @@ macro(ei_add_test_internal testname testname_with_suffix) endif() endif() - add_test(${testname_with_suffix} "${targetname}") + if(HEXAGON) + add_test(NAME ${testname_with_suffix} COMMAND "${targetname}") + else() + add_test(${testname_with_suffix} "${targetname}") + endif() # Specify target and test labels according to EIGEN_CURRENT_SUBPROJECT get_property(current_subproject GLOBAL PROPERTY EIGEN_CURRENT_SUBPROJECT) -- GitLab