diff --git a/cmake/modules/DumuxMacros.cmake b/cmake/modules/DumuxMacros.cmake index 33c474648b3ffd6db7e82301bb6d4b9ecc621f43..21299d9aa5d90cd6946be2de9580ddcf4ee64533 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 d552b8de607808776594b9af5143663df34637d3..199c9f972df03c8fc8d5075cc45435c0e97635c4 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 7bea4cdb5140938ef86718aaf606dd734361edda..1efc82f8beda386001fb33f8cf1662255d335083 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 {