diff --git a/CMakeLists.txt b/CMakeLists.txt index c82883cd93..79c4f315d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -750,6 +750,11 @@ endif() add_custom_target(extra_test ${CMAKE_CTEST_COMMAND} -C ExtraTests) +# must activate avx2 flags for mixed precision. +if(HAVE_AVX2_EXTENSION) + set_property(SOURCE ${AVX2_SOURCE_FILES} PROPERTY COMPILE_FLAGS ${AVX2_FLAGS}) +endif() + # must link libraries after target 'opmsimulators' has been defined if(CUDA_FOUND) diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake index 02cd6aafd7..a387fe41d5 100644 --- a/CMakeLists_files.cmake +++ b/CMakeLists_files.cmake @@ -166,9 +166,6 @@ list (APPEND MAIN_SOURCE_FILES opm/simulators/linalg/FlexibleSolver5.cpp opm/simulators/linalg/FlexibleSolver6.cpp opm/simulators/linalg/FlowLinearSolverParameters.cpp - opm/simulators/linalg/mixed/bsr.c - opm/simulators/linalg/mixed/prec.c - opm/simulators/linalg/mixed/bslv.c opm/simulators/linalg/ISTLSolver.cpp opm/simulators/linalg/MILU.cpp opm/simulators/linalg/ParallelIstlInformation.cpp @@ -265,6 +262,15 @@ list (APPEND MAIN_SOURCE_FILES opm/simulators/wells/WGState.cpp ) +if (HAVE_AVX2_EXTENSION) + set (AVX2_SOURCE_FILES + opm/simulators/linalg/mixed/bsr.c + opm/simulators/linalg/mixed/prec.c + opm/simulators/linalg/mixed/bslv.c) + list (APPEND MAIN_SOURCE_FILES + ${AVX2_SOURCE_FILES}) +endif() + if (HAVE_ECL_INPUT) list (APPEND MAIN_SOURCE_FILES opm/simulators/utils/satfunc/GasPhaseConsistencyChecks.cpp diff --git a/opm-simulators-prereqs.cmake b/opm-simulators-prereqs.cmake index 58bb27ec9e..2488460b02 100644 --- a/opm-simulators-prereqs.cmake +++ b/opm-simulators-prereqs.cmake @@ -6,6 +6,7 @@ set (opm-simulators_CONFIG_VAR HAVE_MPI HAVE_PETSC COMPILE_GPU_BRIDGE + HAVE_AVX2_EXTENSION HAVE_CUDA HAVE_OPENCL HAVE_OPENCL_HPP @@ -37,6 +38,10 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.30.0) set(_Boost_CONFIG_MODE CONFIG) endif() +# Enable when available +#include(CheckAVX2) +#check_for_avx2() + # dependencies set (opm-simulators_DEPS # Compile with C99 support if available diff --git a/opm/simulators/linalg/FlexibleSolver_impl.hpp b/opm/simulators/linalg/FlexibleSolver_impl.hpp index 12c228fb50..b67fc0b12f 100644 --- a/opm/simulators/linalg/FlexibleSolver_impl.hpp +++ b/opm/simulators/linalg/FlexibleSolver_impl.hpp @@ -32,7 +32,9 @@ #include #include +#if HAVE_AVX2_EXTENSION #include +#endif #include #include @@ -183,8 +185,9 @@ namespace Dune tol, // desired residual reduction factor maxiter, // maximum number of iterations verbosity); - } else if (solver_type == "mixed-bicgstab") { - if constexpr (!Opm::is_gpu_operator_v) { +#if HAVE_AVX2_EXTENSION + } else if (solver_type == "mixed-bicgstab") { + if constexpr (!Opm::is_gpu_operator_v) { const std::string prec_type = prm.get("preconditioner.type", "error"); bool use_mixed_dilu= (prec_type=="mixed-dilu"); using MatrixType = decltype(linearoperator_for_solver_->getmat()); @@ -197,6 +200,7 @@ namespace Dune } else { OPM_THROW(std::invalid_argument, "mixed-bicgstab solver not supported for GPU operators."); } +#endif } else if (solver_type == "loopsolver") { linsolver_ = std::make_shared>(*linearoperator_for_solver_, *scalarproduct_,