From b29f35c4b489db280f66778019fb65d03ddf3bf7 Mon Sep 17 00:00:00 2001 From: Timo Koch <timo.koch@iws.uni-stuttgart.de> Date: Fri, 22 Apr 2022 14:51:58 +0200 Subject: [PATCH] [parallel][cmake] Set/decide multithreading backend in CMake --- cmake/modules/DumuxMacros.cmake | 46 ++++++++++++++++++++++++++++++++ config.h.cmake | 8 ++++++ dumux/parallel/multithreading.hh | 17 +----------- 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/cmake/modules/DumuxMacros.cmake b/cmake/modules/DumuxMacros.cmake index 33c474648b..21299d9aa5 100644 --- a/cmake/modules/DumuxMacros.cmake +++ b/cmake/modules/DumuxMacros.cmake @@ -42,3 +42,49 @@ endif() find_package(OpenMP QUIET) include(AddOpenMPFlags) + +# test if we can use parallel algorithms +check_cxx_symbol_exists( + "std::execution::par_unseq" + "execution" + DUMUX_HAVE_CXX_EXECUTION_POLICY +) + +if(DUMUX_HAVE_CXX_EXECUTION_POLICY) + set(HAVE_CPP_PARALLEL_ALGORITHMS TRUE) +endif() + +# setup multithreading backend +if(NOT DUMUX_MULTITHREADING_BACKEND) + if(TBB_FOUND) + set(DUMUX_MULTITHREADING_BACKEND "TBB" CACHE STRING "The multithreading backend") + message(STATUS "Dumux multithreading backed: TBB") + elseif(OpenMP_FOUND) + set(DUMUX_MULTITHREADING_BACKEND "OpenMP" CACHE STRING "The multithreading backend") + message(STATUS "Dumux multithreading backed: OpenMP") + elseif(Kokkos_FOUND) + set(DUMUX_MULTITHREADING_BACKEND "Kokkos" CACHE STRING "The multithreading backend") + message(STATUS "Dumux multithreading backed: Kokkos") + elseif(DUMUX_HAVE_CXX_EXECUTION_POLICY) + set(DUMUX_MULTITHREADING_BACKEND "Cpp" CACHE STRING "The multithreading backend") + message(STATUS "Dumux multithreading backed: Cpp") + else() + set(DUMUX_MULTITHREADING_BACKEND "Serial" CACHE STRING "The multithreading backend") + message(STATUS "Dumux multithreading backed: Serial") + endif() + +# abort if a multithreading backend has been manually selected +# but it is not available +else() + if(DUMUX_MULTITHREADING_BACKEND STREQUAL "TBB" AND NOT TBB_FOUND) + message(FATAL_ERROR "Selected TBB as Dumux multithreading backed but TBB has not been found") + elseif(DUMUX_MULTITHREADING_BACKEND STREQUAL "OpenMP" AND NOT OpenMP_FOUND) + message(FATAL_ERROR "Selected OpenMP as Dumux multithreading backed but OpenMP has not been found") + elseif(DUMUX_MULTITHREADING_BACKEND STREQUAL "Kokkos" AND NOT Kokkos_FOUND) + message(FATAL_ERROR "Selected Kokkos as Dumux multithreading backed but Kokkos has not been found") + elseif(DUMUX_MULTITHREADING_BACKEND STREQUAL "Cpp" AND NOT DUMUX_HAVE_CXX_EXECUTION_POLICY) + message(FATAL_ERROR "Selected Cpp as Dumux multithreading backed but your compiler does not implement parallel STL") + else() + message(STATUS "Dumux multithreading backed: ${DUMUX_MULTITHREADING_BACKEND}") + endif() +endif() diff --git a/config.h.cmake b/config.h.cmake index d552b8de60..199c9f972d 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -76,6 +76,14 @@ /* Set if OpenMP was found */ #cmakedefine HAVE_OPENMP ENABLE_OPENMP +/* Set the DUMUX_MULTITHREADING_BACKEND */ +#ifndef DUMUX_MULTITHREADING_BACKEND +#define DUMUX_MULTITHREADING_BACKEND ${DUMUX_MULTITHREADING_BACKEND} +#endif + +/* Set HAVE_CPP_PARALLEL_ALGORITHMS if available */ +#cmakedefine HAVE_CPP_PARALLEL_ALGORITHMS 1 + /* end dumux Everything below here will be overwritten */ diff --git a/dumux/parallel/multithreading.hh b/dumux/parallel/multithreading.hh index 7bea4cdb51..1efc82f8be 100644 --- a/dumux/parallel/multithreading.hh +++ b/dumux/parallel/multithreading.hh @@ -25,23 +25,8 @@ #ifndef DUMUX_PARALLEL_MULTITHREADING_HH #define DUMUX_PARALLEL_MULTITHREADING_HH -// clang doesn't implement this yet (April 2022) although technically a C++17 feature -#define HAVE_CPP_PARALLEL_ALGORITHMS __cpp_lib_execution && __cpp_lib_execution >= 201603L && __cpp_lib_parallel_algorithm && __cpp_lib_parallel_algorithm >= 201603L - -// This variable can be set by the user -// If not we select a default depending on what's available #ifndef DUMUX_MULTITHREADING_BACKEND - #if HAVE_TBB - #define DUMUX_MULTITHREADING_BACKEND TBB - #elif HAVE_OPENMP - #define DUMUX_MULTITHREADING_BACKEND OpenMP - #elif HAVE_KOKKOS - #define DUMUX_MULTITHREADING_BACKEND Kokkos - #elif HAVE_CPP_PARALLEL_ALGORITHMS - #define DUMUX_MULTITHREADING_BACKEND Cpp - #else - #define DUMUX_MULTITHREADING_BACKEND Serial - #endif +#define DUMUX_MULTITHREADING_BACKEND Serial #endif namespace Dumux::Detail::Multithreading { -- GitLab