From 4999d38194e2a6b16c821251afa630b196834f2d Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 26 Jan 2023 18:39:25 +0100 Subject: [PATCH] Improve portability Improve support for RISC-V arch in volk_gnsssdr via cpu_features (updated to c919e9a). Set BLA_PREFER_PKGCONFIG if not defined by the user, helps to find lapack in some archs (e.g., riscv64) Fix for Fedora/OpenSUSE, which do not install cpu_features along volk. Remove volk_gnsssdr_8ic_s8ic_multiply_8ic kernel since it was problematic in some archs Improve Python detection Fixes for GCC 13 Remove ENABLE_GENERIC_ARCH configuration option and old ARM detection mechanism Update gtest to 1.13.0 Add CI jobs for volk_gnsssdr and gnss-sdr in non-x86 archs --- .github/workflows/gnss-sdr_archs.yml | 79 +++++++ .github/workflows/main.yml | 3 +- ...k_android.yml => volk_gnsssdr_android.yml} | 4 +- .github/workflows/volk_gnsssdr_archs.yml | 80 +++++++ CMakeLists.txt | 66 ++---- README.md | 61 +++--- cmake/Modules/FindGFORTRAN.cmake | 2 +- cmake/Modules/SetupPython.cmake | 30 ++- cmake/Modules/TestForARM.cmake | 115 ---------- docs/CHANGELOG.md | 3 + .../volk_gnsssdr/CMakeLists.txt | 17 +- .../cmake/Modules/VolkPython.cmake | 40 ++-- .../volk_gnsssdr/cpu_features/CMakeLists.txt | 5 + .../volk_gnsssdr/cpu_features/README.md | 16 +- .../cpu_features/include/cpuinfo_riscv.h | 62 ++++++ .../cpu_features/include/internal/hwcaps.h | 14 +- .../cpu_features/src/impl_riscv_linux.c | 109 ++++++++++ .../src/utils/list_cpu_features.c | 11 + .../cpu_features/test/CMakeLists.txt | 7 + .../cpu_features/test/cpuinfo_riscv_test.cc | 141 ++++++++++++ .../volk_gnsssdr/docs/kernels.dox | 1 - .../orc/volk_gnsssdr_8ic_conjugate_8ic.orc | 27 --- .../volk_gnsssdr_8ic_s8ic_multiply_8ic.orc | 39 ---- .../volk_gnsssdr_8ic_conjugate_8ic.h | 10 - .../volk_gnsssdr_8ic_s8ic_multiply_8ic.h | 205 ------------------ .../volk_gnsssdr/lib/kernel_tests.h | 4 +- .../volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c | 26 ++- .../signal_source/libs/fpga_switch.h | 1 + src/tests/CMakeLists.txt | 20 +- src/tests/data/gnsstk_gcc13.patch | 12 + 30 files changed, 659 insertions(+), 551 deletions(-) create mode 100644 .github/workflows/gnss-sdr_archs.yml rename .github/workflows/{volk_android.yml => volk_gnsssdr_android.yml} (96%) create mode 100644 .github/workflows/volk_gnsssdr_archs.yml delete mode 100644 cmake/Modules/TestForARM.cmake create mode 100644 src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/cpuinfo_riscv.h create mode 100644 src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/impl_riscv_linux.c create mode 100644 src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/cpuinfo_riscv_test.cc delete mode 100644 src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/asm/orc/volk_gnsssdr_8ic_conjugate_8ic.orc delete mode 100644 src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/asm/orc/volk_gnsssdr_8ic_s8ic_multiply_8ic.orc delete mode 100644 src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_8ic_s8ic_multiply_8ic.h create mode 100644 src/tests/data/gnsstk_gcc13.patch diff --git a/.github/workflows/gnss-sdr_archs.yml b/.github/workflows/gnss-sdr_archs.yml new file mode 100644 index 000000000..8105a6e31 --- /dev/null +++ b/.github/workflows/gnss-sdr_archs.yml @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: 2023 Carles Fernandez-Prades + +name: Run gnss-sdr in non-x86 archs + +on: + push: + branches: + - "**-archs" + - main + workflow_dispatch: + +jobs: + gnss-sdr-non-x86: + runs-on: ubuntu-latest + name: ${{ matrix.distro }} ${{ matrix.arch }} ${{ matrix.compiler.name }} + + # Run steps on a matrix of archs. + strategy: + fail-fast: false + matrix: + include: + - arch: aarch64 + distro: ubuntu22.04 + compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } + - arch: aarch64 + distro: ubuntu22.04 + compiler: { name: clang-14, cc: clang-14, cxx: clang++-14 } + - arch: armv7 + distro: ubuntu22.04 + compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } + - arch: ppc64le + distro: ubuntu22.04 + compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } + - arch: s390x + distro: ubuntu22.04 + compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } + - arch: riscv64 + distro: ubuntu22.04 + compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } + + steps: + - uses: actions/checkout@v3.1.0 + - uses: uraimo/run-on-arch-action@v2.5.0 + name: Test in non-x86 container + continue-on-error: ${{ contains(fromJson('["ppc64le", "s390x"]'), matrix.arch) }} + id: test + with: + arch: ${{ matrix.arch }} + distro: ${{ matrix.distro }} + githubToken: ${{ github.token }} # Not required, but speeds up builds + setup: | + mkdir -p "${PWD}/testing" + dockerRunArgs: | + --volume "${PWD}:/gnss-sdr" + env: | + CC: ${{ matrix.compiler.cc }} + CXX: ${{ matrix.compiler.cxx }} + shell: /bin/sh + install: | + apt-get update -q -y + apt-get install -q -y ${{ matrix.compiler.name }} git ninja-build cmake \ + libboost-dev libboost-date-time-dev libboost-system-dev libboost-filesystem-dev \ + libboost-thread-dev libboost-chrono-dev libboost-serialization-dev \ + liblog4cpp5-dev gnuradio-dev gr-osmosdr libpugixml-dev libpcap-dev libblas-dev \ + liblapack-dev libarmadillo-dev libgflags-dev libgoogle-glog-dev \ + libgnutls-openssl-dev libmatio-dev googletest protobuf-compiler libprotobuf-dev \ + python3-mako liborc-0.4-dev + run: | + git config --global --add safe.directory /gnss-sdr + cd /gnss-sdr + cd testing + mkdir install + cmake -DENABLE_SYSTEM_TESTING_EXTRA=ON -DCMAKE_INSTALL_PREFIX=/gnss-sdr/testing/install -DENABLE_INSTALL_TESTS=ON .. + echo "Build with $(nproc) thread(s)" + make -j$(nproc) + make install + cd install/bin + ./position_test diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 53d92ec6f..d25e7b2ff 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,6 +9,7 @@ on: push: paths-ignore: - "**/CITATION.cff" + workflow_dispatch: jobs: build-ubuntu: @@ -113,7 +114,7 @@ jobs: ln -s $(brew --prefix llvm)/bin/clang-apply-replacements /usr/local/bin ln -s $(brew --prefix llvm)/bin/run-clang-tidy /usr/local/bin - name: Prepare run - run: cd build && cmake .. && make volk_gnsssdr_module gtest-1.12.1 core_monitor core_libs pvt_libs + run: cd build && cmake .. && make volk_gnsssdr_module gtest-1.13.0 core_monitor core_libs pvt_libs - name: run clang-tidy run: cd build && run-clang-tidy -fix - name: check diff --git a/.github/workflows/volk_android.yml b/.github/workflows/volk_gnsssdr_android.yml similarity index 96% rename from .github/workflows/volk_android.yml rename to .github/workflows/volk_gnsssdr_android.yml index 5e466d224..69a04edfc 100644 --- a/.github/workflows/volk_android.yml +++ b/.github/workflows/volk_gnsssdr_android.yml @@ -4,12 +4,14 @@ on: push: paths: - "src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/**" + - "CMakeLists.txt" pull_request: paths: - "src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/**" + - "CMakeLists.txt" workflow_dispatch: -name: Build volk-gnssdr on Android NDK +name: Build volk_gnsssdr on Android NDK jobs: build: name: Build on Android NDK ${{ matrix.arch.name }} diff --git a/.github/workflows/volk_gnsssdr_archs.yml b/.github/workflows/volk_gnsssdr_archs.yml new file mode 100644 index 000000000..a40c1c163 --- /dev/null +++ b/.github/workflows/volk_gnsssdr_archs.yml @@ -0,0 +1,80 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: 2023 Carles Fernandez-Prades + +name: Run volk_gnsssdr tests + +on: + push: + paths: + - "src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/**" + - "CMakeLists.txt" + pull_request: + paths: + - "src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/**" + - "CMakeLists.txt" + workflow_dispatch: + +jobs: + build-ubuntu-non-x86: + runs-on: ubuntu-latest + name: ${{ matrix.distro }} ${{ matrix.arch }} ${{ matrix.compiler.name }} + + # Run steps on a matrix of archs. + strategy: + fail-fast: false + matrix: + include: + - arch: aarch64 + distro: ubuntu22.04 + compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } + - arch: aarch64 + distro: ubuntu22.04 + compiler: { name: clang-14, cc: clang-14, cxx: clang++-14 } + - arch: armv7 + distro: ubuntu22.04 + compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } + - arch: ppc64le + distro: ubuntu22.04 + compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } + - arch: s390x + distro: ubuntu22.04 + compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } + - arch: riscv64 + distro: ubuntu22.04 + compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } + + steps: + - uses: actions/checkout@v3.1.0 + - uses: uraimo/run-on-arch-action@v2.5.0 + name: Build in non-x86 container + # continue-on-error: ${{ contains(fromJson('["ppc64le", "s390x"]'), matrix.arch) }} + id: build + with: + arch: ${{ matrix.arch }} + distro: ${{ matrix.distro }} + githubToken: ${{ github.token }} # Not required, but speeds up builds + setup: | + mkdir -p "${PWD}/testing" + dockerRunArgs: | + --volume "${PWD}:/volk_gnsssdr" + env: | + CC: ${{ matrix.compiler.cc }} + CXX: ${{ matrix.compiler.cxx }} + shell: /bin/sh + install: | + apt-get update -q -y + apt-get install -q -y git cmake python3-mako liborc-dev ${{ matrix.compiler.name }} + run: | + git config --global --add safe.directory /volk_gnsssdr + cd /volk_gnsssdr + cd testing + cmake ../src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/ + echo "Build with $(nproc) thread(s)" + make -j$(nproc) + ./cpu_features/list_cpu_features + ./apps/volk_gnsssdr-config-info --alignment + ./apps/volk_gnsssdr-config-info --avail-machines + ./apps/volk_gnsssdr-config-info --all-machines + ./apps/volk_gnsssdr-config-info --malloc + ./apps/volk_gnsssdr-config-info --cc + ctest -V diff --git a/CMakeLists.txt b/CMakeLists.txt index 33d27e6dd..d9c8f1465 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,8 +68,6 @@ option(ENABLE_CUDA "Enable building of processing blocks implemented with CUDA ( option(ENABLE_FPGA "Enable building of processing blocks implementing FPGA offloading" OFF) # Building and packaging options -option(ENABLE_GENERIC_ARCH "Builds a portable binary" OFF) - option(ENABLE_PACKAGING "Enable software packaging" OFF) option(ENABLE_OWN_GLOG "Download glog and link it to gflags" OFF) @@ -85,7 +83,6 @@ option(ENABLE_STRIP "Create stripped binaries without debugging symbols (in Rele option(Boost_USE_STATIC_LIBS "Use Boost static libs" OFF) if(ENABLE_PACKAGING) - set(ENABLE_GENERIC_ARCH ON) set(ENABLE_ARMA_NO_DEBUG ON) set(CMAKE_VERBOSE_MAKEFILE ON) set(ENABLE_STRIP OFF) @@ -344,7 +341,7 @@ if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_ CMAKE_VERSION VERSION_LESS 3.5) set(GNSSSDR_GTEST_LOCAL_VERSION "1.10.x") else() - set(GNSSSDR_GTEST_LOCAL_VERSION "1.12.1") + set(GNSSSDR_GTEST_LOCAL_VERSION "1.13.0") endif() set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master") if(CMAKE_VERSION VERSION_GREATER 3.17.0) @@ -442,7 +439,6 @@ endif() - ################################################################################ # Set minimal C and C++ standards ################################################################################ @@ -501,23 +497,19 @@ endif() ################################################################################ # Check if the compiler defines the architecture as ARM ################################################################################ +if(CMAKE_SYSTEM_PROCESSOR MATCHES "(^arm)|(^aarch64)") + set(IS_ARM TRUE) +endif() if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")) if(CMAKE_CROSSCOMPILING) - set(IS_ARM TRUE) if(NOT CMAKE_NO_SYSTEM_FROM_IMPORTED) set(CMAKE_NO_SYSTEM_FROM_IMPORTED TRUE) endif() - else() - if(NOT IS_ARM) - include(TestForARM) - endif() - endif() -else() - if(CMAKE_SYSTEM_PROCESSOR MATCHES "(^aarch64)|(arm64)") - set(IS_ARM TRUE) endif() endif() + + ################################################################################ # pkg-config - Helper tool used when compiling applications and libraries. ################################################################################ @@ -526,6 +518,7 @@ set(FPHSA_NAME_MISMATCHED ON) find_package(PkgConfig) + ################################################################################ # Find the POSIX thread (pthread) libraries ################################################################################ @@ -1193,7 +1186,7 @@ if(NOT VOLKGNSSSDR_FOUND) include(GNUInstallDirs) set(SUPPORTED_CPU_FEATURES_ARCH FALSE) if(CMAKE_SYSTEM_PROCESSOR MATCHES - "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)") + "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)|^riscv") set(SUPPORTED_CPU_FEATURES_ARCH TRUE) endif() if(${CMAKE_INSTALL_LIBDIR} MATCHES lib64) @@ -1232,11 +1225,14 @@ if(NOT VOLKGNSSSDR_FOUND) set_package_properties(CPUFEATURES PROPERTIES DESCRIPTION "A cross platform C99 library to get CPU features at runtime (version: ${CPUFEATURES_VERSION})" ) + if((CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0")) # detect cpu_features without s390x / riscv support + set(ENABLE_CPUFEATURES OFF) + endif() else() set_package_properties(CPUFEATURES PROPERTIES DESCRIPTION "A cross platform C99 library to get CPU features at runtime" ) - if(VOLK_VERSION AND VOLK_VERSION VERSION_GREATER "2.3" AND VOLK_VERSION VERSION_LESS "2.5.2") # detect "hidden" cpu_features 0.6.0 + if(DEFINED VOLK_VERSION AND VOLK_VERSION VERSION_GREATER "2.3") # avoid clash with volk's cpufeatures. set(ENABLE_CPUFEATURES OFF) else() set_package_properties(CPUFEATURES PROPERTIES @@ -1805,6 +1801,9 @@ else() if(NOT BLA_VENDOR) set(BLA_VENDOR "Generic") endif() + if(NOT CMAKE_CROSSCOMPILING AND NOT DEFINED BLA_PREFER_PKGCONFIG) + set(BLA_PREFER_PKGCONFIG ON) # Required by riscv64 arch + endif() find_package(BLAS) set_package_properties(BLAS PROPERTIES URL "https://www.netlib.org/blas/" @@ -2903,9 +2902,9 @@ if(ENABLE_OPENCL) message(STATUS " You can disable OpenCL use by doing 'cmake -DENABLE_OPENCL=OFF ..'") endif() endif() - if(ENABLE_GENERIC_ARCH) + if(ENABLE_PACKAGING) set(ENABLE_OPENCL OFF) - message(STATUS "ENABLE_GENERIC_ARCH is set to ON so the use of OpenCL has been disabled.") + message(STATUS "ENABLE_PACKAGING is set to ON so the use of OpenCL has been disabled.") endif() if(NOT OPENCL_FOUND) message(STATUS "Processing blocks using OpenCL will not be built.") @@ -3282,36 +3281,6 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") endif() endif() -# Processor-architecture related flags -# See https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html -if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32) - if(NOT ENABLE_GENERIC_ARCH) - if(IS_ARM) - # ARM-specific options - # See https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html - if(NOT CMAKE_CROSSCOMPILING AND NOT CMAKE_TOOLCHAIN_FILE) - add_compile_options(-mtune=native) - endif() - else() - if(NOT ENABLE_CUDA) - add_compile_options(-march=native) - endif() - endif() - endif() -endif() -if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - if(NOT ENABLE_GENERIC_ARCH) - if(IS_ARM) - # ARM-specific options - if(NOT CMAKE_CROSSCOMPILING AND NOT CMAKE_TOOLCHAIN_FILE) - add_compile_options(-mcpu=native) - endif() - else() - add_compile_options(-march=native) - endif() - endif() -endif() - ################################################################################ @@ -3384,7 +3353,6 @@ add_feature_info(ENABLE_OPENCL ENABLE_OPENCL "Enables GPS_L1_CA_PCPS_OpenCl_Acqu add_feature_info(ENABLE_CUDA ENABLE_CUDA "Enables GPS_L1_CA_DLL_PLL_Tracking_GPU (experimental). Requires CUDA.") add_feature_info(ENABLE_FPGA ENABLE_FPGA "Enables building of processing blocks for FPGA offloading.") add_feature_info(ENABLE_ARMA_NO_DEBUG ENABLE_ARMA_NO_DEBUG "Enables passing the ARMA_NO_DEBUG macro to Armadillo, hence disabling bound checking.") -add_feature_info(ENABLE_GENERIC_ARCH ENABLE_GENERIC_ARCH "When disabled, flags such as '-march=native' are passed to the compiler.") add_feature_info(ENABLE_PACKAGING ENABLE_PACKAGING "Enables software packaging.") add_feature_info(ENABLE_OWN_GLOG ENABLE_OWN_GLOG "Forces the downloading and building of Google glog.") add_feature_info(ENABLE_OWN_ARMADILLO ENABLE_OWN_ARMADILLO "Forces the downloading and building of Armadillo.") diff --git a/README.md b/README.md index 9fa4c0ecd..d3461edfb 100644 --- a/README.md +++ b/README.md @@ -64,11 +64,12 @@ information about this open-source, software-defined GNSS receiver. 1. [GNU/Linux](#gnulinux) 1. [Alternative 1: Install dependencies using software packages](#alternative-1-install-dependencies-using-software-packages) 1. [Debian / Ubuntu](#debian--ubuntu) - 2. [Arch Linux](#arch-linux) - 3. [CentOS](#centos) - 4. [Fedora](#fedora) - 5. [openSUSE](#opensuse) - 6. [Rocky Linux](#rocky-linux) + 2. [AlmaLinux](#almalinux) + 3. [Arch Linux](#arch-linux) + 4. [CentOS](#centos) + 5. [Fedora](#fedora) + 6. [openSUSE](#opensuse) + 7. [Rocky Linux](#rocky-linux) 2. [Alternative 2: Install dependencies using PyBOMBS](#alternative-2-install-dependencies-using-pybombs) 3. [Manual installation of other required dependencies](#manual-installation-of-other-required-dependencies) 1. [Install Armadillo, a C++ linear algebra library](#install-armadillo-a-c-linear-algebra-library) @@ -85,7 +86,6 @@ information about this open-source, software-defined GNSS receiver. 2. [Build FMCOMMS2 based SDR Hardware support (OPTIONAL)](#build-fmcomms2-based-sdr-hardware-support-optional) 3. [Build OpenCL support (OPTIONAL)](#build-opencl-support-optional) 4. [Build CUDA support (OPTIONAL)](#build-cuda-support-optional) - 5. [Build a portable binary](#build-a-portable-binary) 2. [macOS](#macos) 1. [Macports](#macports) 2. [Homebrew](#homebrew) @@ -142,6 +142,7 @@ This section describes how to set up the compilation environment in GNU/Linux or Motorola (now Freescale), and Apple. - ppc64: 64-bit big-endian PowerPC architecture. - ppc64el: 64-bit little-endian PowerPC architecture. + - riscv64: 64-bit RISC-V open standard instruction set architecture. - s390x: IBM System z architecture for mainframe computers. Older distribution releases might work as well, but you will need GCC 4.7 or @@ -201,6 +202,26 @@ need `python-six`. Once you have installed these packages, you can jump directly to [download the source code and build GNSS-SDR](#clone-gnss-sdrs-git-repository). +#### AlmaLinux + +If you are using AlmaLinux: + +``` +# dnf update -y +# dnf install -y 'dnf-command(config-manager)' +# dnf config-manager --set-enabled powertools +# dnf install -y epel-release +# dnf install -y make gcc gcc-c++ kernel-devel cmake git boost-devel \ + boost-date-time boost-system boost-thread boost-chrono \ + boost-serialization log4cpp-devel gmp-devel uhd-devel gnuradio-devel \ + pugixml-devel matio-devel protobuf-devel glog-devel libpcap-devel \ + blas-devel lapack-devel armadillo-devel openssl-devel python3-mako \ + libarchive +``` + +Once you have installed these packages, you can jump directly to +[download the source code and build GNSS-SDR](#clone-gnss-sdrs-git-repository). + #### Arch Linux If you are using Arch Linux: @@ -496,8 +517,8 @@ $ sudo ldconfig #### Download [GoogleTest](https://github.com/google/googletest "Googletest Homepage") ``` -$ wget https://github.com/google/googletest/archive/release-1.12.1.zip -$ unzip release-1.12.1.zip +$ wget https://github.com/google/googletest/archive/refs/tags/v1.13.0.zip +$ unzip v1.13.0.zip ``` Please **DO NOT build or install** Google Test. Every user needs to compile @@ -521,10 +542,10 @@ downloaded resides. Just type in your terminal (or add it to your `$HOME/.bashrc` file for a permanent solution) the following line: ``` -export GTEST_DIR=/home/username/googletest-release-1.12.1 +export GTEST_DIR=/home/username/googletest-1.13.0 ``` -changing `/home/username/googletest-release-1.12.1` by the actual path where you +changing `/home/username/googletest-1.13.0` by the actual path where you unpacked Google Test. If the CMake script does not find that folder, or the environment variable is not defined, or the source code is not installed by a package, then it will download a fresh copy of the Google Test source code and @@ -790,26 +811,6 @@ $ sudo make install Of course, you will also need a GPU that [supports CUDA](https://developer.nvidia.com/cuda-gpus "CUDA GPUs"). -#### Build a portable binary - -In order to build an executable that not depends on the specific SIMD -instruction set that is present in the processor of the compiling machine, so -other users can execute it in other machines without those particular sets, use: - -``` -$ cmake -DENABLE_GENERIC_ARCH=ON .. -$ make -$ sudo make install -``` - -Using this option, all SIMD instructions are exclusively accessed via VOLK, -which automatically includes versions of each function for different SIMD -instruction sets, then detects at runtime which to use, or if there are none, -substitutes a generic, non-SIMD implementation. - -More details can be found in our tutorial about -[GNSS-SDR configuration options at building time](https://gnss-sdr.org/docs/tutorials/using-git/ "Configuration options at building time"). - ## macOS GNSS-SDR can be built on macOS (or the former Mac OS X), starting from 10.9 diff --git a/cmake/Modules/FindGFORTRAN.cmake b/cmake/Modules/FindGFORTRAN.cmake index 13984295f..5e4d2885d 100644 --- a/cmake/Modules/FindGFORTRAN.cmake +++ b/cmake/Modules/FindGFORTRAN.cmake @@ -20,7 +20,7 @@ if(DEFINED ENV{GFORTRAN_ROOT}) ) endif() -set(GCC_MAJOR_SERIES 12 11 10 9 8 7 6 5) +set(GCC_MAJOR_SERIES 13 12 11 10 9 8 7 6 5) set(GCC4_SERIES 4.9.1 4.9 4.8.3 4.8.1 4.7.2 4.7 4.8.2 4.8 4.7 4.6 4.5 4.4.4 4.4) set(GCC_SERIES ${GCC_MAJOR_SERIES} ${GCC4_SERIES}) diff --git a/cmake/Modules/SetupPython.cmake b/cmake/Modules/SetupPython.cmake index 396849e9c..2260357ce 100644 --- a/cmake/Modules/SetupPython.cmake +++ b/cmake/Modules/SetupPython.cmake @@ -12,13 +12,22 @@ # - cmd an additional command to run # - have the result variable to set ######################################################################## -macro(GNSSSDR_PYTHON_CHECK_MODULE_RAW desc python_code have) +macro(GNSSSDR_PYTHON_CHECK_MODULE desc mod cmd have) + message(STATUS "Python checking for ${desc}") execute_process( - COMMAND ${PYTHON_EXECUTABLE} -c "${python_code}" + COMMAND ${PYTHON_EXECUTABLE} -c " +######################################### +try: import ${mod} +except: + try: ${mod} + except: exit(-1) +try: assert ${cmd} +except: exit(-1) +#########################################" OUTPUT_QUIET ERROR_QUIET - RESULT_VARIABLE return_code + RESULT_VARIABLE ${have} ) - if(return_code EQUAL 0) + if(${have} EQUAL 0) message(STATUS "Python checking for ${desc} - found") set(${have} TRUE) else() @@ -27,19 +36,6 @@ macro(GNSSSDR_PYTHON_CHECK_MODULE_RAW desc python_code have) endif() endmacro() -macro(GNSSSDR_PYTHON_CHECK_MODULE desc mod cmd have) - gnsssdr_python_check_module_raw( - "${desc}" " -######################################### -try: - import ${mod} - assert ${cmd} -except (ImportError, AssertionError): exit(-1) -except: pass -#########################################" - "${have}") -endmacro() - ######################################################################## # Setup the python interpreter: diff --git a/cmake/Modules/TestForARM.cmake b/cmake/Modules/TestForARM.cmake deleted file mode 100644 index 9cd248f34..000000000 --- a/cmake/Modules/TestForARM.cmake +++ /dev/null @@ -1,115 +0,0 @@ -# GNSS-SDR is a Global Navigation Satellite System software-defined receiver. -# This file is part of GNSS-SDR. -# -# SPDX-FileCopyrightText: 2011-2020 C. Fernandez-Prades cfernandez(at)cttc.es -# SPDX-License-Identifier: BSD-3-Clause - -############################################################################## -# check if the compiler defines the architecture as ARM and set the -# version, if found. -# -# - Anthony Arnold -############################################################################## - -if(__TEST_FOR_ARM_INCLUDED) - return() -endif() -set(__TEST_FOR_ARM_INCLUDED TRUE) - -# Function checks if the input string defines ARM version and sets the -# output variable if found. -function(check_arm_version ppdef input_string version output_var) - string(REGEX MATCH "${ppdef}" _VERSION_MATCH "${input_string}") - if(NOT _VERSION_MATCH STREQUAL "") - set(${output_var} "${version}" PARENT_SCOPE) - endif() -endfunction() - -message(STATUS "Checking for ARM") - -set(IS_ARM FALSE) -set(ARM_VERSION "") - -if(ENABLE_PACKAGING) - set(VERBOSE_BUILDING "-v") -else() - set(VERBOSE_BUILDING "") -endif() - -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - execute_process(COMMAND echo "int main(){}" - COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -dM ${VERBOSE_BUILDING} -E - - OUTPUT_VARIABLE TEST_FOR_ARM_RESULTS - ) - - string(REGEX MATCH "__arm" ARM_FOUND "${TEST_FOR_ARM_RESULTS}") - if(ARM_FOUND STREQUAL "") - string(REGEX MATCH "__aarch64" ARM_FOUND "${TEST_FOR_ARM_RESULTS}") - endif() - if(ARM_FOUND STREQUAL "") - if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm") - set(ARM_FOUND ${CMAKE_HOST_SYSTEM_PROCESSOR}) - endif() - endif() - - if(NOT ARM_FOUND STREQUAL "") - set(IS_ARM TRUE) - message(STATUS "ARM system detected.") - - # detect the version - check_arm_version("__ARM_ARCH_2__" ${TEST_FOR_ARM_RESULTS} "armv2" ARM_VERSION) - check_arm_version("__ARM_ARCH_2A__" ${TEST_FOR_ARM_RESULTS} "armv2a" ARM_VERSION) - check_arm_version("__ARM_ARCH_3__" ${TEST_FOR_ARM_RESULTS} "armv3" ARM_VERSION) - check_arm_version("__ARM_ARCH_3M__" ${TEST_FOR_ARM_RESULTS} "armv3m" ARM_VERSION) - check_arm_version("__ARM_ARCH_4__" ${TEST_FOR_ARM_RESULTS} "armv4" ARM_VERSION) - check_arm_version("__ARM_ARCH_4T__" ${TEST_FOR_ARM_RESULTS} "armv4t" ARM_VERSION) - check_arm_version("__ARM_ARCH_5__" ${TEST_FOR_ARM_RESULTS} "armv5" ARM_VERSION) - check_arm_version("__ARM_ARCH_5T__" ${TEST_FOR_ARM_RESULTS} "armv5t" ARM_VERSION) - check_arm_version("__ARM_ARCH_5E__" ${TEST_FOR_ARM_RESULTS} "armv5e" ARM_VERSION) - check_arm_version("__ARM_ARCH_5TE__" ${TEST_FOR_ARM_RESULTS} "armv5te" ARM_VERSION) - check_arm_version("__ARM_ARCH_6__" ${TEST_FOR_ARM_RESULTS} "armv6" ARM_VERSION) - check_arm_version("__ARM_ARCH_6J__" ${TEST_FOR_ARM_RESULTS} "armv6j" ARM_VERSION) - check_arm_version("__ARM_ARCH_6K__" ${TEST_FOR_ARM_RESULTS} "armv6k" ARM_VERSION) - check_arm_version("__ARM_ARCH_6T2__" ${TEST_FOR_ARM_RESULTS} "armv6t2" ARM_VERSION) - check_arm_version("__ARM_ARCH_6Z__" ${TEST_FOR_ARM_RESULTS} "armv6z" ARM_VERSION) - check_arm_version("__ARM_ARCH_6ZK__" ${TEST_FOR_ARM_RESULTS} "armv6zk" ARM_VERSION) - check_arm_version("__ARM_ARCH_6M__" ${TEST_FOR_ARM_RESULTS} "armv6-m" ARM_VERSION) - check_arm_version("__ARM_ARCH_7__" ${TEST_FOR_ARM_RESULTS} "armv7" ARM_VERSION) - check_arm_version("__ARM_ARCH_7A__" ${TEST_FOR_ARM_RESULTS} "armv7-a" ARM_VERSION) - check_arm_version("__ARM_ARCH_7M__" ${TEST_FOR_ARM_RESULTS} "armv7-m" ARM_VERSION) - check_arm_version("__ARM_ARCH_7R__" ${TEST_FOR_ARM_RESULTS} "armv7-r" ARM_VERSION) - check_arm_version("__ARM_ARCH_7EM_" ${TEST_FOR_ARM_RESULTS} "armv7e-m" ARM_VERSION) - check_arm_version("__ARM_ARCH_7VE__" ${TEST_FOR_ARM_RESULTS} "armv7ve" ARM_VERSION) - check_arm_version("__ARM_ARCH_8A__" ${TEST_FOR_ARM_RESULTS} "armv8-a" ARM_VERSION) - check_arm_version("__ARM_ARCH_8A" ${TEST_FOR_ARM_RESULTS} "armv8-a" ARM_VERSION) - - # anything else just define as unknown - if(ARM_VERSION STREQUAL "") - message(STATUS "Couldn't detect ARM version.") - set(ARM_VERSION "unknown") - else() - message(STATUS "ARM version ${ARM_VERSION} detected.") - endif() - else() - message(STATUS "System is not ARM.") - endif() -elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm") - set(IS_ARM TRUE) - set(ARM_VERSION ${CMAKE_HOST_SYSTEM_PROCESSOR}) - message(STATUS "ARM version ${ARM_VERSION} detected.") - endif() -elseif(CMAKE_CXX_COMPILER_ID STREQUAL "ARMClang") - set(IS_ARM TRUE) - set(ARM_VERSION "arm") - if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm") - set(ARM_VERSION ${CMAKE_HOST_SYSTEM_PROCESSOR}) - message(STATUS "ARM version ${ARM_VERSION} detected.") - endif() -else() - message(STATUS "Not detecting ARM on non-GNUCXX or non-Clang compiler. Defaulting to false.") - message(STATUS "If you are compiling for ARM, set -DIS_ARM=ON manually.") -endif() - -set(IS_ARM ${IS_ARM} CACHE BOOL "Compiling for ARM") -set(ARM_VERSION ${ARM_VERSION} CACHE STRING "ARM version") diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index b60c87ddc..5e43f0bf4 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -70,11 +70,14 @@ All notable changes to GNSS-SDR will be documented in this file. - Improved passing of compiler flags to `volk_gnsssdr` if the corresponding environment variables are defined. This fixes warnings in some packaging systems. +- Improved support for the RISC-V architecture. - Test files are now donwloaded at configuration time instead of being included in the source tree. This allows for a smaller package and fixes Lintian `very-long-line-length-in-source-file` warnings since those files were not recognized as binaries. The configuration flag `-DENABLE_PACKAGING=ON` passed to CMake deactivates file downloading. +- The `ENABLE_GENERIC_ARCH` building option was removed, simplifying the process + of buiding the software in non-x86 processor architectures. ### Improvements in Usability: diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt index 3ca3f822f..40286d2cb 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt @@ -258,7 +258,7 @@ endif() # cpu_features - sensible defaults, user settable option if(CMAKE_SYSTEM_PROCESSOR MATCHES - "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)") + "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)|^riscv") option(VOLK_CPU_FEATURES "volk-gnsssdr uses cpu_features" ON) else() option(VOLK_CPU_FEATURES "volk-gnsssdr uses cpu_features" OFF) @@ -266,7 +266,13 @@ endif() if(CMAKE_VERSION VERSION_GREATER 3.0 AND VOLK_CPU_FEATURES) find_package(CPUFEATURES) - set(USE_CPU_FEATURES ON) + if(CPUFEATURES_FOUND AND (CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0")) + set(USE_CPU_FEATURES OFF) + unset(CPUFEATURES_FOUND CACHE) + message(STATUS "Building volk-gnsssdr without cpu_features, installed version v${CPUFEATURES_VERSION} does not support the ${CMAKE_SYSTEM_PROCESSOR} architecture") + else() + set(USE_CPU_FEATURES ON) + endif() if(NOT CPUFEATURES_FOUND) message(STATUS "Building volk-gnsssdr with cpu_features") set(BUILD_TESTING OFF CACHE BOOL "Build cpu_features without tests." FORCE) @@ -290,13 +296,8 @@ endif() # Python include(VolkPython) # sets PYTHON_EXECUTABLE -volk_python_check_module("python >= 2.7" sys "sys.version.split()[0] >= '2.7'" PYTHON_MIN_VER_FOUND) -volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND) -if(Python2_VERSION OR (PYTHON_VERSION_STRING VERSION_LESS "3.0")) - volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND) -endif() -if(NOT PYTHON_MIN_VER_FOUND) +if(NOT PYTHON_EXECUTABLE) message(FATAL_ERROR "Python 2.7 or greater required to build VOLK_GNSSSDR") endif() diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Modules/VolkPython.cmake b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Modules/VolkPython.cmake index fcaabe4ff..2fc0819b7 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Modules/VolkPython.cmake +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Modules/VolkPython.cmake @@ -16,13 +16,22 @@ set(__INCLUDED_VOLK_PYTHON_CMAKE TRUE) # - cmd an additional command to run # - have the result variable to set ######################################################################## -macro(VOLK_PYTHON_CHECK_MODULE_RAW desc python_code have) +macro(VOLK_PYTHON_CHECK_MODULE desc mod cmd have) + message(STATUS "Python checking for ${desc}") execute_process( - COMMAND ${PYTHON_EXECUTABLE} -c "${python_code}" + COMMAND ${PYTHON_EXECUTABLE} -c " +######################################### +try: import ${mod} +except: + try: ${mod} + except: exit(-1) +try: assert ${cmd} +except: exit(-1) +#########################################" OUTPUT_QUIET ERROR_QUIET - RESULT_VARIABLE return_code + RESULT_VARIABLE ${have} ) - if(return_code EQUAL 0) + if(${have} EQUAL 0) message(STATUS "Python checking for ${desc} - found") set(${have} TRUE) else() @@ -31,19 +40,6 @@ macro(VOLK_PYTHON_CHECK_MODULE_RAW desc python_code have) endif() endmacro() -macro(VOLK_PYTHON_CHECK_MODULE desc mod cmd have) - volk_python_check_module_raw( - "${desc}" " -######################################### -try: - import ${mod} - assert ${cmd} -except (ImportError, AssertionError): exit(-1) -except: pass -#########################################" - "${have}") -endmacro() - ######################################################################## # Setup the python interpreter: @@ -57,6 +53,9 @@ if(CMAKE_VERSION VERSION_LESS 3.12 OR CMAKE_CROSSCOMPILING) if(PYTHON_EXECUTABLE) message(STATUS "User set python executable ${PYTHON_EXECUTABLE}") find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION} REQUIRED) + if(PYTHON_VERSION_STRING VERSION_LESS "3.0") + volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND) + endif() else() message(STATUS "PYTHON_EXECUTABLE not set - trying by default python3") message(STATUS "Use -DPYTHON_EXECUTABLE=/path/to/python to build for python 2.7") @@ -65,12 +64,18 @@ if(CMAKE_VERSION VERSION_LESS 3.12 OR CMAKE_CROSSCOMPILING) if(NOT PYTHONINTERP_FOUND) message(STATUS "python3 not found - trying with python2.7") find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION} REQUIRED) + volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND) endif() endif() + volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND) else() if(PYTHON_EXECUTABLE) message(STATUS "User set python executable ${PYTHON_EXECUTABLE}") find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION} REQUIRED) + volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND) + if(PYTHON_VERSION_STRING VERSION_LESS "3.0") + volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND) + endif() else() if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(_previous ${CMAKE_FIND_FRAMEWORK}) @@ -98,6 +103,7 @@ else() if(NOT MAKO_FOUND OR NOT SIX_FOUND) unset(PYTHON_EXECUTABLE) find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION}) + volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND) endif() endif() endif() diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/CMakeLists.txt b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/CMakeLists.txt index d02de9ee7..56c411c53 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/CMakeLists.txt +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/CMakeLists.txt @@ -56,6 +56,7 @@ set(PROCESSOR_IS_AARCH64 FALSE) set(PROCESSOR_IS_X86 FALSE) set(PROCESSOR_IS_POWER FALSE) set(PROCESSOR_IS_S390X FALSE) +set(PROCESSOR_IS_RISCV FALSE) if(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips") set(PROCESSOR_IS_MIPS TRUE) @@ -69,6 +70,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)") set(PROCESSOR_IS_POWER TRUE) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x)") set(PROCESSOR_IS_S390X TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^riscv") + set(PROCESSOR_IS_RISCV TRUE) endif() macro(add_cpu_features_headers_and_sources HDRS_LIST_NAME SRCS_LIST_NAME) @@ -90,6 +93,8 @@ macro(add_cpu_features_headers_and_sources HDRS_LIST_NAME SRCS_LIST_NAME) list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_ppc.h) elseif(PROCESSOR_IS_S390X) list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_s390x.h) + elseif(PROCESSOR_IS_RISCV) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_riscv.h) else() message(FATAL_ERROR "Unsupported architectures ${CMAKE_SYSTEM_PROCESSOR}") endif() diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/README.md b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/README.md index 972e56814..b23e8dec6 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/README.md +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/README.md @@ -158,14 +158,14 @@ flags : aes,avx,cx16,smx,sse4_1,sse4_2,ssse3 ## What's supported -| | x86³ | AArch64 | ARM | MIPS⁴ | s390x | POWER | -| ------- | :--: | :-----: | :-----: | :-----: | :-----: | :-----: | -| Linux | yes² | yes¹ | yes¹ | yes¹ | yes¹ | yes¹ | -| FreeBSD | yes² | not yet | not yet | not yet | not yet | not yet | -| MacOs | yes² | not yet | N/A | N/A | no | no | -| Windows | yes² | not yet | not yet | N/A | N/A | N/A | -| Android | yes² | yes¹ | yes¹ | yes¹ | N/A | N/A | -| iOS | N/A | not yet | not yet | N/A | N/A | N/A | +| | x86³ | AArch64 | ARM | MIPS⁴ | POWER | RISCV | s390x | +| ------- | :--: | :-----: | :-----: | :-----: | :-----: | :---: | :-----: | +| Linux | yes² | yes¹ | yes¹ | yes¹ | yes¹ | yes¹ | yes¹ | +| FreeBSD | yes² | not yet | not yet | not yet | not yet | N/A | not yet | +| MacOs | yes² | not yet | N/A | N/A | no | N/A | no | +| Windows | yes² | not yet | not yet | N/A | N/A | N/A | N/A | +| Android | yes² | yes¹ | yes¹ | yes¹ | N/A | N/A | N/A | +| iOS | N/A | not yet | not yet | N/A | N/A | N/A | N/A | 1. **Features revealed from Linux.** We gather data from several sources depending on availability: diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/cpuinfo_riscv.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/cpuinfo_riscv.h new file mode 100644 index 000000000..85bea6027 --- /dev/null +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/cpuinfo_riscv.h @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: 2022 Google LLC +// SPDX-License-Identifier: Apache-2.0 + +#ifndef CPU_FEATURES_INCLUDE_CPUINFO_RISCV_H_ +#define CPU_FEATURES_INCLUDE_CPUINFO_RISCV_H_ + +#include "cpu_features_cache_info.h" +#include "cpu_features_macros.h" + +#if !defined(CPU_FEATURES_ARCH_RISCV) +#error "Including cpuinfo_riscv.h from a non-riscv target." +#endif + +CPU_FEATURES_START_CPP_NAMESPACE + +typedef struct +{ + // Base + int RV32I : 1; // Base Integer Instruction Set, 32-bit + int RV64I : 1; // Base Integer Instruction Set, 64-bit + + // Extension + int M : 1; // Standard Extension for Integer Multiplication/Division + int A : 1; // Standard Extension for Atomic Instructions + int F : 1; // Standard Extension for Single-Precision Floating-Point + int D : 1; // Standard Extension for Double-Precision Floating-Point + int Q : 1; // Standard Extension for Quad-Precision Floating-Point + int C : 1; // Standard Extension for Compressed Instructions + int Zicsr : 1; // Control and Status Register (CSR) + int Zifencei : 1; // Instruction-Fetch Fence +} RiscvFeatures; + +typedef struct +{ + RiscvFeatures features; + char uarch[64]; // 0 terminated string + char vendor[64]; // 0 terminated string +} RiscvInfo; + +typedef enum +{ + RISCV_RV32I, + RISCV_RV64I, + RISCV_M, + RISCV_A, + RISCV_F, + RISCV_D, + RISCV_Q, + RISCV_C, + RISCV_Zicsr, + RISCV_Zifencei, + RISCV_LAST_, +} RiscvFeaturesEnum; + +RiscvInfo GetRiscvInfo(void); +int GetRiscvFeaturesEnumValue(const RiscvFeatures* features, + RiscvFeaturesEnum value); +const char* GetRiscvFeaturesEnumName(RiscvFeaturesEnum); + +CPU_FEATURES_END_CPP_NAMESPACE + +#endif // CPU_FEATURES_INCLUDE_CPUINFO_RISCV_H_ \ No newline at end of file diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/internal/hwcaps.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/internal/hwcaps.h index 29da4837a..c5836af35 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/internal/hwcaps.h +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/include/internal/hwcaps.h @@ -193,15 +193,15 @@ CPU_FEATURES_START_CPP_NAMESPACE #define HWCAP_S390_SIE 4194304 // https://elixir.bootlin.com/linux/latest/source/arch/riscv/include/uapi/asm/hwcap.h -#define RISCV_HWCAP_A (1UL << ('A' - 'A')) -#define RISCV_HWCAP_C (1UL << ('C' - 'A')) -#define RISCV_HWCAP_D (1UL << ('D' - 'A')) -#define RISCV_HWCAP_E (1UL << ('E' - 'A')) -#define RISCV_HWCAP_F (1UL << ('F' - 'A')) -#define RISCV_HWCAP_I (1UL << ('I' - 'A')) +#define RISCV_HWCAP_32 0x32 +#define RISCV_HWCAP_64 0x64 +#define RISCV_HWCAP_128 0x128 #define RISCV_HWCAP_M (1UL << ('M' - 'A')) -#define RISCV_HWCAP_V (1UL << ('V' - 'A')) +#define RISCV_HWCAP_A (1UL << ('A' - 'A')) +#define RISCV_HWCAP_F (1UL << ('F' - 'A')) +#define RISCV_HWCAP_D (1UL << ('D' - 'A')) #define RISCV_HWCAP_Q (1UL << ('Q' - 'A')) +#define RISCV_HWCAP_C (1UL << ('C' - 'A')) typedef struct { diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/impl_riscv_linux.c b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/impl_riscv_linux.c new file mode 100644 index 000000000..4bcf440d5 --- /dev/null +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/impl_riscv_linux.c @@ -0,0 +1,109 @@ +// SPDX-FileCopyrightText: 2022 Google LLC +// SPDX-License-Identifier: Apache-2.0 + +#include "cpu_features_macros.h" + +#ifdef CPU_FEATURES_ARCH_RISCV +#if defined(CPU_FEATURES_OS_LINUX) + +#include "cpuinfo_riscv.h" + +// According to +// https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/riscv/cpus.yaml +// isa string should match the following regex +// ^rv(?:64|32)imaf?d?q?c?b?v?k?h?(?:_[hsxz](?:[a-z])+)*$ +// +// This means we can test for features in this exact order except for Z +// extensions. + +//////////////////////////////////////////////////////////////////////////////// +// Definitions for introspection. +//////////////////////////////////////////////////////////////////////////////// +#define INTROSPECTION_TABLE \ + LINE(RISCV_RV32I, RV32I, "rv32i", RISCV_HWCAP_32, 0) \ + LINE(RISCV_RV64I, RV64I, "rv64i", RISCV_HWCAP_64, 0) \ + LINE(RISCV_M, M, "m", RISCV_HWCAP_M, 0) \ + LINE(RISCV_A, A, "a", RISCV_HWCAP_A, 0) \ + LINE(RISCV_F, F, "f", RISCV_HWCAP_F, 0) \ + LINE(RISCV_D, D, "d", RISCV_HWCAP_D, 0) \ + LINE(RISCV_Q, Q, "q", RISCV_HWCAP_Q, 0) \ + LINE(RISCV_C, C, "c", RISCV_HWCAP_C, 0) \ + LINE(RISCV_Zicsr, Zicsr, "_zicsr", 0, 0) \ + LINE(RISCV_Zifencei, Zifencei, "_zifencei", 0, 0) +#define INTROSPECTION_PREFIX Riscv +#define INTROSPECTION_ENUM_PREFIX RISCV +#include "define_introspection_and_hwcaps.inl" + +//////////////////////////////////////////////////////////////////////////////// +// Implementation. +//////////////////////////////////////////////////////////////////////////////// + +#include "internal/filesystem.h" +#include "internal/stack_line_reader.h" +#include +#include + +static const RiscvInfo kEmptyRiscvInfo; + +static void HandleRiscVIsaLine(StringView line, RiscvFeatures* const features) +{ + for (size_t i = 0; i < RISCV_LAST_; ++i) + { + StringView flag = str(kCpuInfoFlags[i]); + int index_of_flag = CpuFeatures_StringView_IndexOf(line, flag); + bool is_set = index_of_flag != -1; + kSetters[i](features, is_set); + if (is_set) + line = CpuFeatures_StringView_PopFront(line, index_of_flag + flag.size); + } +} + +static bool HandleRiscVLine(const LineResult result, RiscvInfo* const info) +{ + StringView line = result.line; + StringView key, value; + if (CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)) + { + if (CpuFeatures_StringView_IsEquals(key, str("isa"))) + { + HandleRiscVIsaLine(value, &info->features); + } + else if (CpuFeatures_StringView_IsEquals(key, str("uarch"))) + { + int index = CpuFeatures_StringView_IndexOfChar(value, ','); + if (index == -1) return true; + StringView vendor = CpuFeatures_StringView_KeepFront(value, index); + StringView uarch = CpuFeatures_StringView_PopFront(value, index + 1); + CpuFeatures_StringView_CopyString(vendor, info->vendor, + sizeof(info->vendor)); + CpuFeatures_StringView_CopyString(uarch, info->uarch, + sizeof(info->uarch)); + } + } + return !result.eof; +} + +static void FillProcCpuInfoData(RiscvInfo* const info) +{ + const int fd = CpuFeatures_OpenFile("/proc/cpuinfo"); + if (fd >= 0) + { + StackLineReader reader; + StackLineReader_Initialize(&reader, fd); + for (;;) + { + if (!HandleRiscVLine(StackLineReader_NextLine(&reader), info)) break; + } + CpuFeatures_CloseFile(fd); + } +} + +RiscvInfo GetRiscvInfo(void) +{ + RiscvInfo info = kEmptyRiscvInfo; + FillProcCpuInfoData(&info); + return info; +} + +#endif // defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) +#endif // CPU_FEATURES_ARCH_RISCV \ No newline at end of file diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/utils/list_cpu_features.c b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/utils/list_cpu_features.c index 38489640c..647c4e05f 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/utils/list_cpu_features.c +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/utils/list_cpu_features.c @@ -25,6 +25,8 @@ #include "cpuinfo_ppc.h" #elif defined(CPU_FEATURES_ARCH_S390X) #include "cpuinfo_s390x.h" +#elif defined(CPU_FEATURES_ARCH_RISCV) +#include "cpuinfo_riscv.h" #endif // Design principles @@ -217,6 +219,9 @@ DEFINE_ADD_FLAGS(GetPPCFeaturesEnumValue, GetPPCFeaturesEnumName, PPCFeatures, #elif defined(CPU_FEATURES_ARCH_S390X) DEFINE_ADD_FLAGS(GetS390XFeaturesEnumValue, GetS390XFeaturesEnumName, S390XFeatures, S390X_LAST_) +#elif defined(CPU_FEATURES_ARCH_RISCV) +DEFINE_ADD_FLAGS(GetRiscvFeaturesEnumValue, GetRiscvFeaturesEnumName, RiscvFeatures, + RISCV_LAST_) #endif // Prints a json string with characters escaping. @@ -447,6 +452,12 @@ static Node* CreateTree(void) AddMapEntry(root, "model", CreateString(strings.type.platform)); AddMapEntry(root, "# processors", CreateInt(strings.num_processors)); AddFlags(root, &info.features); +#elif defined(CPU_FEATURES_ARCH_RISCV) + const RiscvInfo info = GetRiscvInfo(); + AddMapEntry(root, "arch", CreateString("risc-v")); + AddMapEntry(root, "vendor", CreateString(info.vendor)); + AddMapEntry(root, "microarchitecture", CreateString(info.uarch)); + AddFlags(root, &info.features); #endif return root; } diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/CMakeLists.txt b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/CMakeLists.txt index e887cbb55..8df134964 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/CMakeLists.txt +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/CMakeLists.txt @@ -99,3 +99,10 @@ if(PROCESSOR_IS_S390X) target_link_libraries(cpuinfo_s390x_test all_libraries) add_test(NAME cpuinfo_s390x_test COMMAND cpuinfo_s390x_test) endif() +##------------------------------------------------------------------------------ +## cpuinfo_riscv_test +if(PROCESSOR_IS_RISCV) + add_executable(cpuinfo_riscv_test cpuinfo_riscv_test.cc ../src/impl_riscv_linux.c) + target_link_libraries(cpuinfo_riscv_test all_libraries) + add_test(NAME cpuinfo_riscv_test COMMAND cpuinfo_riscv_test) +endif() \ No newline at end of file diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/cpuinfo_riscv_test.cc b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/cpuinfo_riscv_test.cc new file mode 100644 index 000000000..ff22a18d9 --- /dev/null +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/cpuinfo_riscv_test.cc @@ -0,0 +1,141 @@ +// SPDX-FileCopyrightText: 2022 Google LLC +// SPDX-License-Identifier: Apache-2.0 + +#include "cpuinfo_riscv.h" +#include "filesystem_for_testing.h" +#include "gtest/gtest.h" +#include "hwcaps_for_testing.h" + +namespace cpu_features +{ +namespace +{ + +TEST(CpuinfoRiscvTest, Sipeed_Lichee_RV_FromCpuInfo) +{ + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"(processor : 0 +hart : 0 +isa : rv64imafdc +mmu : sv39 +uarch : thead,c906)"); + const auto info = GetRiscvInfo(); + EXPECT_STREQ(info.uarch, "c906"); + EXPECT_STREQ(info.vendor, "thead"); + + EXPECT_FALSE(info.features.RV32I); + EXPECT_TRUE(info.features.RV64I); + EXPECT_TRUE(info.features.M); + EXPECT_TRUE(info.features.A); + EXPECT_TRUE(info.features.F); + EXPECT_TRUE(info.features.D); + EXPECT_FALSE(info.features.Q); + EXPECT_TRUE(info.features.C); +} + +// https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/Kendryte-K510-4.17.0.cpuinfo +TEST(CpuinfoRiscvTest, Kendryte_K510_FromCpuInfo) +{ + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"( +hart : 0 +isa : rv64i2p0m2p0a2p0f2p0d2p0c2p0xv5-0p0 +mmu : sv39 + +hart : 1 +isa : rv64i2p0m2p0a2p0f2p0d2p0c2p0xv5-0p0 +mmu : sv39"); + const auto info = GetRiscvInfo(); + EXPECT_STREQ(info.uarch, ""); + EXPECT_STREQ(info.vendor, ""); + EXPECT_FALSE(info.features.RV32I); + EXPECT_TRUE(info.features.RV64I); + EXPECT_TRUE(info.features.M); + EXPECT_TRUE(info.features.A); + EXPECT_TRUE(info.features.F); + EXPECT_TRUE(info.features.D); + EXPECT_FALSE(info.features.Q); + EXPECT_TRUE(info.features.C); +} + +// https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/T-Head-C910-5.10.4.cpuinfo +TEST(CpuinfoRiscvTest, T_Head_C910_FromCpuInfo) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"( +processor : 0 +hart : 0 +isa : rv64imafdcsu +mmu : sv39 +cpu-freq : 1.2Ghz +cpu-icache : 64KB +cpu-dcache : 64KB +cpu-l2cache : 2MB +cpu-tlb : 1024 4-ways +cpu-cacheline : 64Bytes +cpu-vector : 0.7.1 +processor : 1 +hart : 1 +isa : rv64imafdcsu +mmu : sv39 +cpu-freq : 1.2Ghz +cpu-icache : 64KB +cpu-dcache : 64KB +cpu-l2cache : 2MB +cpu-tlb : 1024 4-ways +cpu-cacheline : 64Bytes +cpu-vector : 0.7.1"); + const auto info = GetRiscvInfo(); + EXPECT_STREQ(info.uarch, ""); + EXPECT_STREQ(info.vendor, ""); + EXPECT_FALSE(info.features.RV32I); + EXPECT_TRUE(info.features.RV64I); + EXPECT_TRUE(info.features.M); + EXPECT_TRUE(info.features.A); + EXPECT_TRUE(info.features.F); + EXPECT_TRUE(info.features.D); + EXPECT_FALSE(info.features.Q); + EXPECT_TRUE(info.features.C); +} +TEST(CpuinfoRiscvTest, UnknownFromCpuInfo) { + ResetHwcaps(); + auto& fs = GetEmptyFilesystem(); + fs.CreateFile("/proc/cpuinfo", R"( +processor : 0 +hart : 2 +isa : rv64imafdc +mmu : sv39 +uarch : sifive,bullet0 +processor : 1 +hart : 1 +isa : rv64imafdc +mmu : sv39 +uarch : sifive,bullet0 +processor : 2 +hart : 3 +isa : rv64imafdc +mmu : sv39 +uarch : sifive,bullet0 +processor : 3 +hart : 4 +isa : rv64imafdc +mmu : sv39 +uarch : sifive,bullet0)"); + const auto info = GetRiscvInfo(); + EXPECT_STREQ(info.uarch, "bullet0"); + EXPECT_STREQ(info.vendor, "sifive"); + + EXPECT_FALSE(info.features.RV32I); + EXPECT_TRUE(info.features.RV64I); + EXPECT_TRUE(info.features.M); + EXPECT_TRUE(info.features.A); + EXPECT_TRUE(info.features.F); + EXPECT_TRUE(info.features.D); + EXPECT_FALSE(info.features.Q); + EXPECT_TRUE(info.features.C); +} + +} // namespace +} // namespace cpu_features \ No newline at end of file diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/docs/kernels.dox b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/docs/kernels.dox index 06ab5521a..1b0a21d71 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/docs/kernels.dox +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/docs/kernels.dox @@ -23,7 +23,6 @@ \li \subpage volk_gnsssdr_8ic_magnitude_squared_8i \li \subpage volk_gnsssdr_8ic_x2_dot_prod_8ic \li \subpage volk_gnsssdr_8ic_x2_multiply_8ic -\li \subpage volk_gnsssdr_8ic_s8ic_multiply_8ic \li \subpage volk_gnsssdr_8i_accumulator_s8i \li \subpage volk_gnsssdr_8i_index_max_16u \li \subpage volk_gnsssdr_8i_max_s8i diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/asm/orc/volk_gnsssdr_8ic_conjugate_8ic.orc b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/asm/orc/volk_gnsssdr_8ic_conjugate_8ic.orc deleted file mode 100644 index 38e439925..000000000 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/asm/orc/volk_gnsssdr_8ic_conjugate_8ic.orc +++ /dev/null @@ -1,27 +0,0 @@ -# -# ORC implementation: calculates the conjugate of a 16 bits vector -# -# Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com -# -# ORC code that calculates the conjugate of a -# 16 bits vector (8 bits the real part and 8 bits the imaginary part) -# result = (real*real) + (imag*imag) -# -# -# ------------------------------------------------------------------------------ -# -# GNSS-SDR is a Global Navigation Satellite System software-defined receiver. -# This file is part of GNSS-SDR. -# -# Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) -# SPDX-License-Identifier: GPL-3.0-or-later -# -# ------------------------------------------------------------------------------ -# - -.function volk_gnsssdr_8ic_conjugate_8ic_a_orc_impl -.source 2 src1 -.dest 2 dst -.temp 2 merged -mergebw merged, 1, -1 -x2 mullb dst, merged, src1 diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/asm/orc/volk_gnsssdr_8ic_s8ic_multiply_8ic.orc b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/asm/orc/volk_gnsssdr_8ic_s8ic_multiply_8ic.orc deleted file mode 100644 index bdd0dc32d..000000000 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/asm/orc/volk_gnsssdr_8ic_s8ic_multiply_8ic.orc +++ /dev/null @@ -1,39 +0,0 @@ -# -# ORC implementation: multiplies a group of 16 bits vectors by one constant vector -# -# Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com -# -# -# ORC code that multiplies a group of 16 bits vectors -# (8 bits the real part and 8 bits the imaginary part) by one constant vector -# -# ------------------------------------------------------------------------------ -# -# GNSS-SDR is a Global Navigation Satellite System software-defined receiver. -# This file is part of GNSS-SDR. -# -# Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) -# SPDX-License-Identifier: GPL-3.0-or-later -# -# ------------------------------------------------------------------------------ -# - -.function volk_gnsssdr_8ic_s8ic_multiply_8ic_a_orc_impl -.source 2 src1 -.param 2 src2real -.param 2 src2imag -.dest 2 dst -.temp 2 iqprod -.temp 1 real -.temp 1 imag -.temp 1 rr -.temp 1 ii -.temp 1 ri -.temp 1 ir -x2 mullb iqprod, src1, src2real -splitwb ir, rr, iqprod -x2 mullb iqprod, src1, src2imag -splitwb ii, ri, iqprod -subb real, rr, ii -addb imag, ri, ir -mergebw dst, real, imag diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_8ic_conjugate_8ic.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_8ic_conjugate_8ic.h index 57ceaba72..6876d6a24 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_8ic_conjugate_8ic.h +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_8ic_conjugate_8ic.h @@ -324,16 +324,6 @@ static inline void volk_gnsssdr_8ic_conjugate_8ic_a_sse3(lv_8sc_t* cVector, cons #endif /* LV_HAVE_SSE3 */ -#ifdef LV_HAVE_ORC - -extern void volk_gnsssdr_8ic_conjugate_8ic_a_orc_impl(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points); -static inline void volk_gnsssdr_8ic_conjugate_8ic_u_orc(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points) -{ - volk_gnsssdr_8ic_conjugate_8ic_a_orc_impl(cVector, aVector, num_points); -} -#endif /* LV_HAVE_ORC */ - - #ifdef LV_HAVE_NEON #include diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_8ic_s8ic_multiply_8ic.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_8ic_s8ic_multiply_8ic.h deleted file mode 100644 index 71cf1d269..000000000 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_8ic_s8ic_multiply_8ic.h +++ /dev/null @@ -1,205 +0,0 @@ -/*! - * \file volk_gnsssdr_8ic_s8ic_multiply_8ic.h - * \brief VOLK_GNSSSDR kernel: multiplies a group of 16 bits vectors by one constant vector. - * \authors
    - *
  • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com - *
- * - * VOLK_GNSSSDR kernel that multiplies a group of 16 bits vectors - * (8 bits the real part and 8 bits the imaginary part) by one constant vector - * - * ----------------------------------------------------------------------------- - * - * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. - * This file is part of GNSS-SDR. - * - * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) - * SPDX-License-Identifier: GPL-3.0-or-later - * - * ----------------------------------------------------------------------------- - */ - -/*! - * \page volk_gnsssdr_8ic_s8ic_multiply_8ic - * - * \b Overview - * - * Multiplies the input vector by a scalar and stores the results in the third vector - * - * Dispatcher Prototype - * \code - * void volk_gnsssdr_8ic_s8ic_multiply_8ic(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points); - * \endcode - * - * \b Inputs - * \li aVector: The vector to be multiplied. - * \li scalar The complex scalar to multiply \p aVector - * \li num_points: The number of complex values in \p aVector to be multiplied by \p scalar and stored into \p cVector. - * - * \b Outputs - * \li cVector: The vector where the results will be stored - * - */ - -#ifndef INCLUDED_volk_gnsssdr_8ic_s8ic_multiply_8ic_H -#define INCLUDED_volk_gnsssdr_8ic_s8ic_multiply_8ic_H - -#include - -#ifdef LV_HAVE_SSE3 -#include - -static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_u_sse3(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) -{ - unsigned int number = 0; - const unsigned int sse_iters = num_points / 8; - - __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc; - - lv_8sc_t* c = cVector; - const lv_8sc_t* a = aVector; - - mult1 = _mm_set_epi8(0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF); - - y = _mm_set1_epi16(*(short*)&scalar); - imagy = _mm_srli_si128(y, 1); - imagy = _mm_and_si128(imagy, mult1); - realy = _mm_and_si128(y, mult1); - - for (; number < sse_iters; number++) - { - x = _mm_lddqu_si128((__m128i*)a); - - imagx = _mm_srli_si128(x, 1); - imagx = _mm_and_si128(imagx, mult1); - realx = _mm_and_si128(x, mult1); - - realx_mult_realy = _mm_mullo_epi16(realx, realy); - imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); - realx_mult_imagy = _mm_mullo_epi16(realx, imagy); - imagx_mult_realy = _mm_mullo_epi16(imagx, realy); - - realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); - realc = _mm_and_si128(realc, mult1); - imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); - imagc = _mm_and_si128(imagc, mult1); - imagc = _mm_slli_si128(imagc, 1); - - totalc = _mm_or_si128(realc, imagc); - - _mm_storeu_si128((__m128i*)c, totalc); - - a += 8; - c += 8; - } - - for (number = sse_iters * 8; number < num_points; ++number) - { - *c++ = (*a++) * scalar; - } -} -#endif /* LV_HAVE_SSE3 */ - - -#ifdef LV_HAVE_GENERIC - -static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_generic(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) -{ - /*lv_8sc_t* cPtr = cVector; - const lv_8sc_t* aPtr = aVector; - - for (int i = 0; i= 8) - { - *cPtr++ = (*aPtr++) * scalar; - *cPtr++ = (*aPtr++) * scalar; - *cPtr++ = (*aPtr++) * scalar; - *cPtr++ = (*aPtr++) * scalar; - *cPtr++ = (*aPtr++) * scalar; - *cPtr++ = (*aPtr++) * scalar; - *cPtr++ = (*aPtr++) * scalar; - *cPtr++ = (*aPtr++) * scalar; - number -= 8; - } - - // clean up any remaining - while (number-- > 0) - *cPtr++ = *aPtr++ * scalar; -} -#endif /* LV_HAVE_GENERIC */ - - -#ifdef LV_HAVE_SSE3 -#include - -static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_a_sse3(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) -{ - unsigned int number = 0; - const unsigned int sse_iters = num_points / 8; - - __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc; - - lv_8sc_t* c = cVector; - const lv_8sc_t* a = aVector; - - mult1 = _mm_set_epi8(0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF); - - y = _mm_set1_epi16(*(short*)&scalar); - imagy = _mm_srli_si128(y, 1); - imagy = _mm_and_si128(imagy, mult1); - realy = _mm_and_si128(y, mult1); - - for (; number < sse_iters; number++) - { - x = _mm_load_si128((__m128i*)a); - - imagx = _mm_srli_si128(x, 1); - imagx = _mm_and_si128(imagx, mult1); - realx = _mm_and_si128(x, mult1); - - realx_mult_realy = _mm_mullo_epi16(realx, realy); - imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); - realx_mult_imagy = _mm_mullo_epi16(realx, imagy); - imagx_mult_realy = _mm_mullo_epi16(imagx, realy); - - realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); - realc = _mm_and_si128(realc, mult1); - imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); - imagc = _mm_and_si128(imagc, mult1); - imagc = _mm_slli_si128(imagc, 1); - - totalc = _mm_or_si128(realc, imagc); - - _mm_store_si128((__m128i*)c, totalc); - - a += 8; - c += 8; - } - - for (number = sse_iters * 8; number < num_points; ++number) - { - *c++ = (*a++) * scalar; - } -} -#endif /* LV_HAVE_SSE3 */ - - -#ifdef LV_HAVE_ORC - -extern void volk_gnsssdr_8ic_s8ic_multiply_8ic_a_orc_impl(lv_8sc_t* cVector, const lv_8sc_t* aVector, const char scalarreal, const char scalarimag, unsigned int num_points); -static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_u_orc(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) -{ - volk_gnsssdr_8ic_s8ic_multiply_8ic_a_orc_impl(cVector, aVector, lv_creal(scalar), lv_cimag(scalar), num_points); -} -#endif /* LV_HAVE_ORC */ - -#endif /* INCLUDED_volk_gnsssdr_32fc_x2_multiply_32fc_H */ diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h index 3f38b263e..6a089836b 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h @@ -51,7 +51,8 @@ std::vector init_test_list(volk_gnsssdr_test_params_t volk_gnsssdr_test_params_t test_params_inacc2 = volk_gnsssdr_test_params_t(2e-1, test_params.scalar(), test_params.vlen(), test_params.iter(), test_params.benchmark_mode(), test_params.kernel_regex()); - std::vector test_cases; + std::vector + test_cases; QA(VOLK_INIT_TEST(volk_gnsssdr_8i_accumulator_s8i, test_params_more_iters)) QA(VOLK_INIT_TEST(volk_gnsssdr_8i_index_max_16u, test_params_more_iters)) @@ -61,7 +62,6 @@ std::vector init_test_list(volk_gnsssdr_test_params_t QA(VOLK_INIT_TEST(volk_gnsssdr_8ic_magnitude_squared_8i, test_params_more_iters)) QA(VOLK_INIT_TEST(volk_gnsssdr_8ic_x2_dot_prod_8ic, test_params)) QA(VOLK_INIT_TEST(volk_gnsssdr_8ic_x2_multiply_8ic, test_params)) - QA(VOLK_INIT_TEST(volk_gnsssdr_8ic_s8ic_multiply_8ic, test_params)) QA(VOLK_INIT_TEST(volk_gnsssdr_8u_x2_multiply_8u, test_params_more_iters)) QA(VOLK_INIT_TEST(volk_gnsssdr_64f_accumulator_64f, test_params)) QA(VOLK_INIT_TEST(volk_gnsssdr_32f_sincos_32fc, test_params_inacc)) diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c index d0db27e89..c089e8625 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c @@ -26,6 +26,10 @@ #include "cpuinfo_mips.h" #elif defined(CPU_FEATURES_ARCH_PPC) #include "cpuinfo_ppc.h" +#elif defined(CPU_FEATURES_ARCH_S390X) +#include "cpuinfo_s390x.h" +#elif defined(CPU_FEATURES_ARCH_RISCV) +#include "cpuinfo_riscv.h" #endif // This is required for MSVC @@ -41,15 +45,31 @@ struct VOLK_CPU volk_gnsssdr_cpu; %for arch in archs: static int i_can_has_${arch.name} (void) { %for check, params in arch.checks: - %if "neon" in arch.name: + %if "neon" in arch.name: #if defined(CPU_FEATURES_ARCH_ARM) if (GetArmInfo().features.${check} == 0){ return 0; } #endif - %else: + %elif "mips" in arch.name: +#if defined(CPU_FEATURES_ARCH_MIPS) + if (GetMipsInfo().features.${check} == 0){ return 0; } +#endif + %elif "ppc" in arch.name: +#if defined(CPU_FEATURES_ARCH_PPC) + if (GetPPCInfo().features.${check} == 0){ return 0; } +#endif + %elif "s390x" in arch.name: +#if defined(CPU_FEATURES_ARCH_S390X) + if (GetS390XInfo().features.${check} == 0){ return 0; } +#endif + %elif "riscv" in arch.name: +#if defined(CPU_FEATURES_ARCH_RISCV) + if (GetRiscvInfo().features.${check} == 0){ return 0; } +#endif + %else: #if defined(CPU_FEATURES_ARCH_X86) if (GetX86Info().features.${check} == 0){ return 0; } #endif - %endif + %endif %endfor return 1; } diff --git a/src/algorithms/signal_source/libs/fpga_switch.h b/src/algorithms/signal_source/libs/fpga_switch.h index 3595cf9ce..b4a73cb4f 100644 --- a/src/algorithms/signal_source/libs/fpga_switch.h +++ b/src/algorithms/signal_source/libs/fpga_switch.h @@ -23,6 +23,7 @@ #ifndef GNSS_SDR_FPGA_SWITCH_H #define GNSS_SDR_FPGA_SWITCH_H +#include #include /** \addtogroup Signal_Source diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 6a71d38d0..af8e96075 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -37,12 +37,6 @@ if(NOT GOOGLETEST_FOUND) if(CMAKE_GENERATOR STREQUAL Xcode) set(GTEST_BUILD_COMMAND "xcodebuild" "-configuration" $<$:Debug>$<$:Release>$<$:RelWithDebInfo>$<$:MinSizeRel> "-target" "gtest_main") endif() - if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) OR - (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)) - set(GOOGLETEST_GIT_TAG v${GNSSSDR_GTEST_LOCAL_VERSION}) - else() - set(GOOGLETEST_GIT_TAG release-${GNSSSDR_GTEST_LOCAL_VERSION}) - endif() if(GNSSSDR_GTEST_LOCAL_VERSION VERSION_LESS 1.12.0) set(DEBUG_DECORATION "d") else() @@ -51,7 +45,7 @@ if(NOT GOOGLETEST_FOUND) if(CMAKE_VERSION VERSION_LESS 3.2) ExternalProject_Add(gtest-${GNSSSDR_GTEST_LOCAL_VERSION} GIT_REPOSITORY https://github.com/google/googletest - GIT_TAG ${GOOGLETEST_GIT_TAG} + GIT_TAG v${GNSSSDR_GTEST_LOCAL_VERSION} SOURCE_DIR ${GNSSSDR_BINARY_DIR}/thirdparty/gtest/gtest-${GNSSSDR_GTEST_LOCAL_VERSION} BINARY_DIR ${GNSSSDR_BINARY_DIR}/gtest-${GNSSSDR_GTEST_LOCAL_VERSION} CMAKE_ARGS ${GTEST_COMPILER} @@ -80,7 +74,7 @@ if(NOT GOOGLETEST_FOUND) endif() ExternalProject_Add(gtest-${GNSSSDR_GTEST_LOCAL_VERSION} GIT_REPOSITORY https://github.com/google/googletest - GIT_TAG ${GOOGLETEST_GIT_TAG} + GIT_TAG v${GNSSSDR_GTEST_LOCAL_VERSION} SOURCE_DIR ${GNSSSDR_BINARY_DIR}/thirdparty/gtest/gtest-${GNSSSDR_GTEST_LOCAL_VERSION} BINARY_DIR ${GNSSSDR_BINARY_DIR}/gtest-${GNSSSDR_GTEST_LOCAL_VERSION} CMAKE_ARGS ${GTEST_COMPILER} @@ -369,12 +363,14 @@ if(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA) if(CMAKE_VERSION VERSION_GREATER 3.17.0) set(GNSSTK_PATCH_COMMAND cd ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION} && - ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/CMakeLists.txt < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_static14.patch + ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/CMakeLists.txt < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_static14.patch && + ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/core/lib/GNSSCore/ObsID.hpp < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_gcc13.patch ) else() set(GNSSTK_PATCH_COMMAND cd ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION} && - ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/CMakeLists.txt < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_static13.patch + ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/CMakeLists.txt < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_static13.patch && + ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/core/lib/GNSSCore/ObsID.hpp < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_gcc13.patch ) endif() # Patch only once @@ -408,6 +404,9 @@ if(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA) set(GNSSTK_PARALLEL_BUILD "-j${NUMBER_OF_PROCESSORS}") endif() endif() + if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(GNSSTK_FLAGS "-DCMAKE_CXX_FLAGS:STRING=-w") # Fix for clang in aarch64 + endif() if(CMAKE_VERSION VERSION_GREATER 3.17.0) ExternalProject_Add(gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION} GIT_REPOSITORY https://github.com/SGL-UT/gnsstk @@ -425,6 +424,7 @@ if(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA) -DCMAKE_CXX_EXTENSIONS=ON -DCMAKE_C_STANDARD=11 -DCMAKE_C_EXTENSIONS=ON + "${GNSSTK_FLAGS}" BUILD_COMMAND ${GNSSTK_BUILD_COMMAND} ${GNSSTK_PARALLEL_BUILD} BUILD_BYPRODUCTS ${GNSSSDR_BINARY_DIR}/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/install/lib/${CMAKE_FIND_LIBRARY_PREFIXES}gnsstk${CMAKE_STATIC_LIBRARY_SUFFIX} UPDATE_COMMAND "" diff --git a/src/tests/data/gnsstk_gcc13.patch b/src/tests/data/gnsstk_gcc13.patch new file mode 100644 index 000000000..e2ac0030f --- /dev/null +++ b/src/tests/data/gnsstk_gcc13.patch @@ -0,0 +1,12 @@ +SPDX-License-Identifier: GPL-3.0-or-later +SPDX-FileCopyrightText: 2022 Carles Fernandez-Prades +--- ObsID.hpp 2023-01-23 16:53:25.000000000 +0100 ++++ ObsID.hpp 2023-01-23 16:55:14.000000000 +0100 +@@ -47,6 +47,7 @@ + #ifndef OBSID_HPP + #define OBSID_HPP + ++#include + #include + #include + #include