diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h index 226844f6456484f8197383f68ba5238661f85f16..a9706cf0cae727b1b37b3d853f98899ae17661f0 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/ci/hexagon.dockerfile b/ci/hexagon.dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..6066f654801d6cfdab6bd47ac2eb8943f7ab8f52 --- /dev/null +++ b/ci/hexagon.dockerfile @@ -0,0 +1,54 @@ +# 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" + +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 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 +# 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 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 diff --git a/cmake/EigenTesting.cmake b/cmake/EigenTesting.cmake index a1488fc4762201d291fca37fd9e42c0f8f17189f..81d9cfe04777c4065e3e2604d8ed6cb3e34cd094 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) diff --git a/cmake/HexagonToolchain.cmake b/cmake/HexagonToolchain.cmake new file mode 100644 index 0000000000000000000000000000000000000000..97fa476c0905a28a61dd06f91fd0e253d2ceb977 --- /dev/null +++ b/cmake/HexagonToolchain.cmake @@ -0,0 +1,153 @@ + +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 ca1748d23d1e94131be83a3f3a89e6c06a7eb635..eb5a847d8c5c2bfe06a7853818d3801749e487e5 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 15d7fb2def473abbc347566cc21545e02d507976..434a58a50b4a70b775f08d83b27ed9c4439c1fa5 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 // 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; +#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;