From 941d89e06df02073065ba69382948d2d089d4ad8 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 5 Dec 2022 09:11:11 +0000 Subject: [PATCH] cmake: fix RISC-V toolchains - RVV options are moved to configuration scripts instead of toolchains --- cmake/OpenCVCompilerOptimizations.cmake | 18 ++++-- .../core/include/opencv2/core/hal/intrin.hpp | 9 +-- platforms/linux/riscv-gnu.toolchain.cmake | 60 ++++++++++++++++++ platforms/linux/riscv.toolchain.cmake | 62 ------------------- platforms/linux/riscv64-clang.toolchain.cmake | 11 +--- platforms/linux/riscv64-gcc.toolchain.cmake | 31 ++-------- platforms/linux/riscv64-gnu.toolchain.cmake | 5 -- 7 files changed, 86 insertions(+), 110 deletions(-) create mode 100644 platforms/linux/riscv-gnu.toolchain.cmake delete mode 100644 platforms/linux/riscv.toolchain.cmake delete mode 100644 platforms/linux/riscv64-gnu.toolchain.cmake diff --git a/cmake/OpenCVCompilerOptimizations.cmake b/cmake/OpenCVCompilerOptimizations.cmake index ded4a92cfe..28929c3890 100644 --- a/cmake/OpenCVCompilerOptimizations.cmake +++ b/cmake/OpenCVCompilerOptimizations.cmake @@ -20,6 +20,9 @@ # VSX (always available on Power8) # VSX3 (always available on Power9) +# RISC-V arch: +# RVV + # CPU_{opt}_SUPPORTED=ON/OFF - compiler support (possibly with additional flag) # CPU_{opt}_IMPLIES= # CPU_{opt}_FORCE= - subset of "implies" list @@ -104,8 +107,6 @@ ocv_optimization_process_obsolete_option(ENABLE_NEON NEON OFF) ocv_optimization_process_obsolete_option(ENABLE_VSX VSX ON) -ocv_optimization_process_obsolete_option(ENABLE_RVV RVV OFF) - macro(ocv_is_optimization_in_list resultvar check_opt) set(__checked "") set(__queue ${ARGN}) @@ -375,11 +376,18 @@ elseif(PPC64LE) set(CPU_BASELINE "VSX" CACHE STRING "${HELP_CPU_BASELINE}") elseif(RISCV) + option(RISCV_RVV_SCALABLE "Use scalable RVV API on RISC-V" ON) + ocv_update(CPU_RVV_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_rvv.cpp") ocv_update(CPU_KNOWN_OPTIMIZATIONS "RVV") - ocv_update(CPU_RVV_FLAGS_ON "") - set(CPU_DISPATCH "RVV" CACHE STRING "${HELP_CPU_DISPATCH}") - set(CPU_BASELINE "RVV" CACHE STRING "${HELP_CPU_BASELINE}") + ocv_update(CPU_RVV_FLAGS_ON "-march=rv64gcv") + if(RISCV_RVV_SCALABLE) + set(CPU_RVV_FLAGS_ON "${CPU_RVV_FLAGS_ON} -DCV_RVV_SCALABLE") + endif() + ocv_update(CPU_RVV_FLAGS_CONFLICT "-march=[^ ]*") + + set(CPU_DISPATCH "" CACHE STRING "${HELP_CPU_DISPATCH}") + set(CPU_BASELINE "DETECT" CACHE STRING "${HELP_CPU_BASELINE}") elseif(LOONGARCH64) ocv_update(CPU_LASX_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_lasx.cpp") diff --git a/modules/core/include/opencv2/core/hal/intrin.hpp b/modules/core/include/opencv2/core/hal/intrin.hpp index 1971c91e1d..207b8cab4e 100644 --- a/modules/core/include/opencv2/core/hal/intrin.hpp +++ b/modules/core/include/opencv2/core/hal/intrin.hpp @@ -235,11 +235,12 @@ using namespace CV_CPU_OPTIMIZATION_HAL_NAMESPACE; #elif CV_WASM_SIMD && !defined(CV_FORCE_SIMD128_CPP) #include "opencv2/core/hal/intrin_wasm.hpp" -#elif CV_RVV && !defined(CV_FORCE_SIMD128_CPP) && !defined(CV_RVV_SCALABLE) -#include "opencv2/core/hal/intrin_rvv.hpp" - -#elif CV_RVV && !defined(CV_FORCE_SIMD128_CPP) && CV_RVV_SCALABLE +#elif CV_RVV && !defined(CV_FORCE_SIMD128_CPP) +#if defined(CV_RVV_SCALABLE) #include "opencv2/core/hal/intrin_rvv_scalable.hpp" +#else +#include "opencv2/core/hal/intrin_rvv.hpp" +#endif #elif CV_LASX #if !defined(CV_FORCE_SIMD128_CPP) diff --git a/platforms/linux/riscv-gnu.toolchain.cmake b/platforms/linux/riscv-gnu.toolchain.cmake new file mode 100644 index 0000000000..662fb6bddb --- /dev/null +++ b/platforms/linux/riscv-gnu.toolchain.cmake @@ -0,0 +1,60 @@ +if(COMMAND toolchain_save_config) + return() # prevent recursive call +endif() + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) +if(NOT DEFINED CMAKE_SYSTEM_PROCESSOR) + set(CMAKE_SYSTEM_PROCESSOR riscv64) +else() + #message("CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}") +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/gnu.toolchain.cmake") + +if(NOT "x${GCC_COMPILER_VERSION}" STREQUAL "x") + set(__GCC_VER_SUFFIX "-${GCC_COMPILER_VERSION}") +endif() + +if(NOT DEFINED GNU_MACHINE) + set(GNU_MACHINE riscv64-unknown-linux-gnu CACHE STRING "GNU compiler triple") +endif() + +if(NOT DEFINED TOOLCHAIN_COMPILER_LOCATION_HINT) + set(TOOLCHAIN_COMPILER_LOCATION_HINT PATHS /opt/riscv/bin ENV PATH) +endif() + +if(NOT DEFINED CMAKE_C_COMPILER) + find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}-gcc${__GCC_VER_SUFFIX} ${TOOLCHAIN_COMPILER_LOCATION_HINT}) +else() + #message(WARNING "CMAKE_C_COMPILER=${CMAKE_C_COMPILER} is defined") +endif() +if(NOT DEFINED CMAKE_CXX_COMPILER) + find_program(CMAKE_CXX_COMPILER NAMES ${GNU_MACHINE}-g++${__GCC_VER_SUFFIX} ${TOOLCHAIN_COMPILER_LOCATION_HINT}) +else() + #message(WARNING "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} is defined") +endif() +if(NOT DEFINED CMAKE_LINKER) + find_program(CMAKE_LINKER NAMES ${GNU_MACHINE}-ld${__GCC_VER_SUFFIX} ${GNU_MACHINE}-ld ${TOOLCHAIN_COMPILER_LOCATION_HINT}) +else() + #message(WARNING "CMAKE_LINKER=${CMAKE_LINKER} is defined") +endif() +if(NOT DEFINED CMAKE_AR) + find_program(CMAKE_AR NAMES ${GNU_MACHINE}-ar${__GCC_VER_SUFFIX} ${GNU_MACHINE}-ar ${TOOLCHAIN_COMPILER_LOCATION_HINT}) +else() + #message(WARNING "CMAKE_AR=${CMAKE_AR} is defined") +endif() + +if(NOT DEFINED RISCV_SYSROOT) + get_filename_component(_base_dir ${CMAKE_C_COMPILER} DIRECTORY) + get_filename_component(_base_dir ${_base_dir} DIRECTORY) + set(RISCV_SYSROOT ${_base_dir}/sysroot CACHE PATH "RISC-V sysroot") +endif() + +set(CMAKE_SYSROOT "${RISCV_SYSROOT}") +set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${RISCV_SYSROOT}) + +set(TOOLCHAIN_CONFIG_VARS ${TOOLCHAIN_CONFIG_VARS} + RISCV_SYSROOT +) +toolchain_save_config() diff --git a/platforms/linux/riscv.toolchain.cmake b/platforms/linux/riscv.toolchain.cmake deleted file mode 100644 index cea80bd9ba..0000000000 --- a/platforms/linux/riscv.toolchain.cmake +++ /dev/null @@ -1,62 +0,0 @@ -cmake_minimum_required(VERSION 3.5) - -if(COMMAND toolchain_save_config) - return() # prevent recursive call -endif() - -set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_VERSION 1) - -include("${CMAKE_CURRENT_LIST_DIR}/gnu.toolchain.cmake") - -MESSAGE(STATUS "Debug: CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}") - -if(NOT "x${GCC_COMPILER_VERSION}" STREQUAL "x") - set(__GCC_VER_SUFFIX "-${GCC_COMPILER_VERSION}") -endif() - -if(NOT DEFINED CMAKE_C_COMPILER) - MESSAGE("Looking for compler.. ${GNU_MACHINE}-gcc${__GCC_VER_SUFFIX}") - find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}-gcc${__GCC_VER_SUFFIX}) -else() - #message(WARNING "CMAKE_C_COMPILER=${CMAKE_C_COMPILER} is defined") -endif() -if(NOT DEFINED CMAKE_CXX_COMPILER) - find_program(CMAKE_CXX_COMPILER NAMES ${GNU_MACHINE}-g++${__GCC_VER_SUFFIX}) -else() - #message(WARNING "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} is defined") -endif() -if(NOT DEFINED CMAKE_LINKER) - find_program(CMAKE_LINKER NAMES ${GNU_MACHINE}-ld${__GCC_VER_SUFFIX} ${GNU_MACHINE}-ld) -else() - #message(WARNING "CMAKE_LINKER=${CMAKE_LINKER} is defined") -endif() -if(NOT DEFINED CMAKE_AR) - find_program(CMAKE_AR NAMES ${GNU_MACHINE}-ar${__GCC_VER_SUFFIX} ${GNU_MACHINE}-ar) -else() - #message(WARNING "CMAKE_AR=${CMAKE_AR} is defined") -endif() - -if(NOT DEFINED RISCV_LINUX_SYSROOT AND DEFINED GNU_MACHINE) - set(RISCV_LINUX_SYSROOT /usr/${GNU_MACHINE}) -endif() - -if(NOT DEFINED CMAKE_CXX_FLAGS) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,nocopyreloc") - - set(RISCV_LINKER_FLAGS "-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") - set(CMAKE_SHARED_LINKER_FLAGS "${RISCV_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}") - set(CMAKE_MODULE_LINKER_FLAGS "${RISCV_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}") - set(CMAKE_EXE_LINKER_FLAGS "${RISCV_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}") -else() - message(STATUS "User provided flags are used instead of defaults") -endif() - -set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${RISCV_LINUX_SYSROOT}) - -set(TOOLCHAIN_CONFIG_VARS ${TOOLCHAIN_CONFIG_VARS} - RISCV_LINUX_SYSROOT -) -toolchain_save_config() diff --git a/platforms/linux/riscv64-clang.toolchain.cmake b/platforms/linux/riscv64-clang.toolchain.cmake index 13bca12741..cec5f7d734 100644 --- a/platforms/linux/riscv64-clang.toolchain.cmake +++ b/platforms/linux/riscv64-clang.toolchain.cmake @@ -17,15 +17,8 @@ set(CMAKE_ASM_COMPILER_TARGET ${CLANG_TARGET_TRIPLE}) # Don't run the linker on compiler check set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) -set(CMAKE_C_FLAGS "-march=rv64gcv --gcc-toolchain=${RISCV_GCC_INSTALL_ROOT} -w ${CMAKE_C_FLAGS}") -set(CMAKE_CXX_FLAGS "-march=rv64gcv --gcc-toolchain=${RISCV_GCC_INSTALL_ROOT} -w ${CXX_FLAGS}") - -set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2") -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2") -OPTION(RISCV_RVV_SCALABLE "Use scalable RVV API on RISC-V" ON) # Enabled by default -IF(RISCV_RVV_SCALABLE) - ADD_DEFINITIONS(-DCV_RVV_SCALABLE) -ENDIF() +set(CMAKE_C_FLAGS "-march=rv64gc --gcc-toolchain=${RISCV_GCC_INSTALL_ROOT} -w ${CMAKE_C_FLAGS}") +set(CMAKE_CXX_FLAGS "-march=rv64gc --gcc-toolchain=${RISCV_GCC_INSTALL_ROOT} -w ${CXX_FLAGS}") set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) diff --git a/platforms/linux/riscv64-gcc.toolchain.cmake b/platforms/linux/riscv64-gcc.toolchain.cmake index 2da0fb7bd4..c3a0e161e3 100644 --- a/platforms/linux/riscv64-gcc.toolchain.cmake +++ b/platforms/linux/riscv64-gcc.toolchain.cmake @@ -1,29 +1,10 @@ set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_PROCESSOR riscv64) +set(CMAKE_SYSTEM_VERSION 1) +set(GNU_MACHINE riscv64-unknown-linux-gnu CACHE STRING "GNU compiler triple") -if(NOT DEFINED CMAKE_C_COMPILER) - find_program(CMAKE_C_COMPILER NAMES riscv64-unknown-linux-gnu-gcc - PATHS /opt/riscv/bin ENV PATH) +if(NOT DEFINED CMAKE_CXX_FLAGS) # guards toolchain multiple calls + set(CMAKE_C_FLAGS "-march=rv64gc") + set(CMAKE_CXX_FLAGS "-march=rv64gc") endif() -if(NOT DEFINED CMAKE_CXX_COMPILER) - find_program(CMAKE_CXX_COMPILER NAMES riscv64-unknown-linux-gnu-g++ - PATHS /opt/riscv/bin ENV PATH) -endif() - -get_filename_component(RISCV_GCC_INSTALL_ROOT ${CMAKE_C_COMPILER} DIRECTORY) -get_filename_component(RISCV_GCC_INSTALL_ROOT ${RISCV_GCC_INSTALL_ROOT} DIRECTORY) - -set(CMAKE_SYSROOT ${RISCV_GCC_INSTALL_ROOT}/sysroot CACHE PATH "RISC-V sysroot") - -# Don't run the linker on compiler check -set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) - -set(CMAKE_C_FLAGS "-march=rv64gcv_zfh ${CMAKE_C_FLAGS}") -set(CMAKE_CXX_FLAGS "-march=rv64gcv_zfh ${CXX_FLAGS}") - -set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) -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) \ No newline at end of file +include("${CMAKE_CURRENT_LIST_DIR}/riscv-gnu.toolchain.cmake") diff --git a/platforms/linux/riscv64-gnu.toolchain.cmake b/platforms/linux/riscv64-gnu.toolchain.cmake deleted file mode 100644 index 3263a1f99b..0000000000 --- a/platforms/linux/riscv64-gnu.toolchain.cmake +++ /dev/null @@ -1,5 +0,0 @@ -set(CMAKE_SYSTEM_PROCESSOR riscv64) -set(GNU_MACHINE riscv64-linux-gnu CACHE STRING "GNU compiler triple") -set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version") - -include("${CMAKE_CURRENT_LIST_DIR}/riscv.toolchain.cmake")