diff --git a/.github/workflows/push_pull.yml b/.github/workflows/push_pull.yml index 3cbd6fc2d4..7e0fce60c4 100644 --- a/.github/workflows/push_pull.yml +++ b/.github/workflows/push_pull.yml @@ -39,7 +39,7 @@ jobs: credentials: username: ${{ github.actor }} password: ${{ secrets.github_token }} - options: --cpus 2 + options: --cpus 4 steps: - name: Checkout uses: actions/checkout@main @@ -55,8 +55,8 @@ jobs: - name: Build and check uses: ./.github/actions/build_and_check env: - build_procs: 2 - check_procs: 2 + build_procs: 4 + check_procs: 4 myconfig: 'maxset' with_ccache: 'true' with_cuda: 'false' @@ -78,7 +78,7 @@ jobs: credentials: username: ${{ github.actor }} password: ${{ secrets.github_token }} - options: --cpus 2 + options: --cpus 4 steps: - name: Checkout uses: actions/checkout@main @@ -94,8 +94,8 @@ jobs: - name: Build and check uses: ./.github/actions/build_and_check env: - build_procs: 2 - check_procs: 2 + build_procs: 4 + check_procs: 4 myconfig: 'maxset' with_ccache: 'true' with_cuda: 'false' diff --git a/CMakeLists.txt b/CMakeLists.txt index 06e29ace6f..d374aaa4d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -372,13 +372,16 @@ else() endif() # OpenMPI checks the number of processes against the number of CPUs -set(ESPRESSO_MPIEXEC_OVERSUBSCRIBE "") +set(ESPRESSO_MPIEXEC_PREFLAGS "") # Open MPI 4.x has a bug on NUMA archs that prevents running in singleton mode set(ESPRESSO_MPIEXEC_GUARD_SINGLETON_NUMA OFF) set(ESPRESSO_CPU_MODEL_NAME_OMPI_SINGLETON_NUMA_PATTERN "AMD (EPYC|Ryzen)") if("${ESPRESSO_MPIEXEC_VENDOR}" STREQUAL "OpenMPI") - set(ESPRESSO_MPIEXEC_OVERSUBSCRIBE "-oversubscribe") + list(APPEND ESPRESSO_MPIEXEC_PREFLAGS "--oversubscribe") + if(ESPRESSO_INSIDE_DOCKER) + list(APPEND ESPRESSO_MPIEXEC_PREFLAGS "--bind-to" "none") + endif() if(${ESPRESSO_MPIEXEC_VERSION} VERSION_LESS 5.0) if(NOT DEFINED ESPRESSO_CPU_MODEL_NAME) if(CMAKE_SYSTEM_NAME STREQUAL Linux) diff --git a/cmake/espresso_unit_test.cmake b/cmake/espresso_unit_test.cmake index c857d9bed1..daa07218b0 100644 --- a/cmake/espresso_unit_test.cmake +++ b/cmake/espresso_unit_test.cmake @@ -52,7 +52,7 @@ function(ESPRESSO_UNIT_TEST) set(TEST_NUM_PROC ${ESPRESSO_TEST_NP}) endif() espresso_set_mpiexec_tmpdir(${TEST_NAME}) - add_test(${TEST_NAME} ${MPIEXEC} ${ESPRESSO_MPIEXEC_OVERSUBSCRIBE} + add_test(${TEST_NAME} ${MPIEXEC} ${ESPRESSO_MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${TEST_NUM_PROC} ${MPIEXEC_PREFLAGS} ${ESPRESSO_MPIEXEC_TMPDIR} ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME} ${MPIEXEC_POSTFLAGS}) diff --git a/maintainer/CI/build_cmake.sh b/maintainer/CI/build_cmake.sh index 4d4ce68d15..b155ed8c62 100755 --- a/maintainer/CI/build_cmake.sh +++ b/maintainer/CI/build_cmake.sh @@ -79,20 +79,14 @@ ci_procs=2 if [ "${GITLAB_CI}" = "true" ]; then if [[ "${OSTYPE}" == "linux-gnu"* ]]; then # Linux runner - if grep -q "i7-3820" /proc/cpuinfo; then - # communication bottleneck for more than 2 cores on Intel i7-3820 - ci_procs=2 - else - ci_procs=4 - fi + ci_procs=4 elif [[ "${OSTYPE}" == "darwin"* ]]; then # macOS runner - ci_procs=2 + ci_procs=4 fi elif [ "${GITHUB_ACTIONS}" = "true" ]; then - # GitHub Actions only provide 1 core; request 2 cores to run tests - # in parallel (OpenMPI allows oversubscription) - ci_procs=2 + # GitHub Actions provide 4 cores + ci_procs=4 else ci_procs=$(nproc) fi @@ -131,7 +125,6 @@ set_default_value with_walberla_avx false set_default_value with_stokesian_dynamics false set_default_value test_timeout 500 set_default_value hide_gpu false -set_default_value mpiexec_preflags "" if [ "${make_check_unit_tests}" = true ] || [ "${make_check_python}" = true ] || [ "${make_check_tutorials}" = true ] || [ "${make_check_samples}" = true ] || [ "${make_check_benchmarks}" = true ]; then run_checks=true @@ -166,9 +159,6 @@ if [ "${with_walberla}" = true ]; then if [ "${with_walberla_avx}" = true ]; then cmake_params="${cmake_params} -D ESPRESSO_BUILD_WITH_WALBERLA_AVX=ON" fi - # disable default OpenMPI CPU binding mechanism to avoid stale references to - # waLBerla objects when multiple LB python tests run in parallel on NUMA archs - mpiexec_preflags="${mpiexec_preflags:+$mpiexec_preflags;}--bind-to;none" fi cmake_params="${cmake_params} -D ESPRESSO_BUILD_WITH_COVERAGE=${with_coverage}" @@ -328,7 +318,7 @@ else if [ "${check_proc_particle_test}" -gt 4 ]; then check_proc_particle_test=4 fi - mpiexec -n ${check_proc_particle_test} ./pypresso "${srcdir}/testsuite/python/particle.py" || exit 1 + mpiexec -n ${check_proc_particle_test} $(mpiexec --version | grep -Pq "\\(Open(RTE| MPI)\\)" && echo "--oversubscribe --bind-to none") ./pypresso "${srcdir}/testsuite/python/particle.py" || exit 1 end "TEST" fi diff --git a/maintainer/benchmarks/CMakeLists.txt b/maintainer/benchmarks/CMakeLists.txt index ea6c0c5f48..63c04f57fb 100644 --- a/maintainer/benchmarks/CMakeLists.txt +++ b/maintainer/benchmarks/CMakeLists.txt @@ -28,9 +28,9 @@ if(EXISTS ${MPIEXEC}) OUTPUT_VARIABLE mpi_version_output ERROR_VARIABLE mpi_version_output) if(mpi_version_result EQUAL 0 AND mpi_version_output MATCHES "\\(Open(RTE| MPI)\\) ([3-9]\\.|1[0-9])") - set(ESPRESSO_MPIEXEC_OVERSUBSCRIBE "-oversubscribe") + set(ESPRESSO_MPIEXEC_PREFLAGS "--oversubscribe") else() - set(ESPRESSO_MPIEXEC_OVERSUBSCRIBE "") + set(ESPRESSO_MPIEXEC_PREFLAGS "") endif() endif() @@ -86,7 +86,7 @@ function(PYTHON_BENCHMARK) add_test( NAME ${BENCHMARK_TEST_NAME} COMMAND - ${MPIEXEC} ${ESPRESSO_MPIEXEC_OVERSUBSCRIBE} ${MPIEXEC_NUMPROC_FLAG} + ${MPIEXEC} ${ESPRESSO_MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${BENCHMARK_NUM_PROC} ${MPIEXEC_PREFLAGS} ${CMAKE_BINARY_DIR}/pypresso ${BENCHMARK_FILE} ${BENCHMARK_ARGUMENTS} ${MPIEXEC_POSTFLAGS}) diff --git a/samples/drude_bmimpf6.py b/samples/drude_bmimpf6.py index fa07f15643..86c6c5215f 100644 --- a/samples/drude_bmimpf6.py +++ b/samples/drude_bmimpf6.py @@ -107,7 +107,7 @@ # TIMESTEP fs_to_md_time = 1.0e-2 -time_step_fs = 1.0 +time_step_fs = 0.5 time_step_ns = time_step_fs * 1e-6 dt = time_step_fs * fs_to_md_time system.time_step = dt @@ -229,7 +229,7 @@ def combination_rule_sigma(rule, sig1, sig2): # ENERGY MINIMIZATION print("\n-->E minimization") print(f"Before: {system.analysis.energy()['total']:.2e}") -n_max_steps = 100000 +n_max_steps = 10000 system.integrator.set_steepest_descent(f_max=5.0, gamma=0.01, max_displacement=0.01) system.integrator.run(n_max_steps) diff --git a/testsuite/python/CMakeLists.txt b/testsuite/python/CMakeLists.txt index 2fa3fa7977..ee90256b07 100644 --- a/testsuite/python/CMakeLists.txt +++ b/testsuite/python/CMakeLists.txt @@ -92,7 +92,7 @@ function(python_test) add_test( NAME ${TEST_NAME} COMMAND - ${MPIEXEC} ${ESPRESSO_MPIEXEC_OVERSUBSCRIBE} ${MPIEXEC_NUMPROC_FLAG} + ${MPIEXEC} ${ESPRESSO_MPIEXEC_PREFLAGS} ${MPIEXEC_NUMPROC_FLAG} ${TEST_NUM_PROC} ${MPIEXEC_PREFLAGS} ${ESPRESSO_MPIEXEC_TMPDIR} ${CMAKE_BINARY_DIR}/pypresso ${PYPRESSO_OPTIONS} ${TEST_FILE_CONFIGURED} ${TEST_ARGUMENTS} ${MPIEXEC_POSTFLAGS}) diff --git a/testsuite/python/resources.json b/testsuite/python/resources.json index 906149627d..db5acbeff3 100644 --- a/testsuite/python/resources.json +++ b/testsuite/python/resources.json @@ -8,7 +8,7 @@ "gpus": [ { "id": "0", - "slots": 4 + "slots": 8 } ] }