Skip to content

Commit b9ecc8e

Browse files
committed
use mpi_launcher.cmake
1 parent 968a6a1 commit b9ecc8e

File tree

5 files changed

+40
-29
lines changed

5 files changed

+40
-29
lines changed

CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.19...3.28)
1+
cmake_minimum_required(VERSION 3.19...3.29)
22

33
project(FortranMPIexamples
44
LANGUAGES C Fortran
@@ -12,6 +12,7 @@ message(STATUS "CMake ${CMAKE_VERSION} Generator ${CMAKE_GENERATOR} Build type
1212

1313
# this has checks that can be reused in other projects as well
1414
include(cmake/mpi.cmake)
15+
include(cmake/mpi_launcher.cmake)
1516

1617
include(cmake/print_target_props.cmake)
1718
print_target_props(MPI::MPI_Fortran)

cmake/mpi.cmake

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ message(STATUS "MPI_Fortran_LINK_FLAGS: ${MPI_Fortran_LINK_FLAGS}")
1717

1818
include(${CMAKE_CURRENT_LIST_DIR}/openmpi.cmake)
1919

20-
2120
if(MPI_Fortran_HAVE_F08_MODULE)
2221
return()
2322
endif()

cmake/mpi_launcher.cmake

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
function(test_mpi_launcher name Nworker)
2+
# assumes target and test have same "name" (could be made different)
3+
4+
if(NOT (DEFINED MPIEXEC_EXECUTABLE AND DEFINED MPIEXEC_NUMPROC_FLAG))
5+
message(FATAL_ERROR "MPIEXEC_EXECUTABLE and MPIEXEC_NUMPROC_FLAG must be defined to use test_mpi_launcher")
6+
endif()
7+
8+
if(NOT Nworker)
9+
message(FATAL_ERROR "Nworker must be defined to use test_mpi_launcher")
10+
endif()
11+
12+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.29)
13+
set_property(TEST ${name} PROPERTY TEST_LAUNCHER ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${Nworker})
14+
else()
15+
set_property(TARGET ${name} PROPERTY CROSSCOMPILING_EMULATOR ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${Nworker})
16+
endif()
17+
18+
set_property(TEST ${name} PROPERTY PROCESSORS ${Nworker})
19+
20+
if(DEFINED mpi_tmpdir)
21+
set_property(TEST ${name} PROPERTY ENVIRONMENT "TMPDIR=${mpi_tmpdir}")
22+
endif()
23+
24+
endfunction()

cmake/openmpi.cmake

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
# https://github.com/open-mpi/ompi/issues/7393
22
# https://github.com/gerlero/openfoam-app/pull/112
33
# https://apple.stackexchange.com/a/287710
4-
# *** OpenMPI workaround
4+
5+
message(VERBOSE "MPI_C_LIBRARY_VERSION_STRING: ${MPI_C_LIBRARY_VERSION_STRING}")
6+
57
if(UNIX AND MPI_C_LIBRARY_VERSION_STRING MATCHES "Open[ ]?MPI")
68
if(NOT DEFINED mpi_tmpdir)
79
execute_process(COMMAND mktemp -d /tmp/mpi-XXXXXXXX
810
RESULT_VARIABLE ret
911
OUTPUT_VARIABLE mpi_tmpdir
1012
OUTPUT_STRIP_TRAILING_WHITESPACE
13+
TIMEOUT 10
1114
)
1215
if(NOT ret EQUAL 0)
1316
message(FATAL_ERROR "could not create MPI working dir via mktemp -d: ${ret}")
@@ -16,4 +19,3 @@ if(UNIX AND MPI_C_LIBRARY_VERSION_STRING MATCHES "Open[ ]?MPI")
1619
message(STATUS "${ret}: Created MPI working dir ${mpi_tmpdir}")
1720
endif()
1821
endif()
19-
# *** END OpenMPI workaround

test/CMakeLists.txt

+10-25
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,31 @@
11
add_executable(mpi_basic_C basic.c)
22
target_link_libraries(mpi_basic_C PRIVATE MPI::MPI_C)
33
add_test(NAME mpi_basic_C COMMAND mpi_basic_C)
4+
test_mpi_launcher(mpi_basic_C 1)
45

56
add_executable(mpi_version_C mpivers.c)
67
target_link_libraries(mpi_version_C PRIVATE MPI::MPI_C)
78
add_test(NAME mpi_version_C COMMAND mpi_version_C)
9+
test_mpi_launcher(mpi_version_C 1)
810

911
# --- Fortran MPI-3
1012

1113
add_executable(mpi_basic_Fortran basic.f90)
1214
target_link_libraries(mpi_basic_Fortran PRIVATE MPI::MPI_Fortran)
1315
add_test(NAME mpi_basic_Fortran COMMAND mpi_basic_Fortran)
16+
test_mpi_launcher(mpi_basic_Fortran 1)
1417

1518
add_executable(mpi_version_Fortran mpivers.f90)
1619
target_link_libraries(mpi_version_Fortran PRIVATE MPI::MPI_Fortran)
1720
add_test(NAME mpi_version_Fortran COMMAND mpi_version_Fortran)
21+
test_mpi_launcher(mpi_version_Fortran 1)
1822

1923
# --- more than one MPI image
2024

2125
add_executable(mpi_hello helloworld.f90)
2226
target_link_libraries(mpi_hello PRIVATE MPI::MPI_Fortran)
2327
add_test(NAME mpi_hello COMMAND mpi_hello)
28+
test_mpi_launcher(mpi_hello ${MPIEXEC_MAX_NUMPROCS})
2429
set_property(TEST mpi_hello PROPERTY FIXTURES_SETUP mpi_fxt)
2530

2631
# --- actual message passing
@@ -31,6 +36,7 @@ target_link_libraries(mpi_pass PRIVATE MPI::MPI_Fortran)
3136
if(MPIEXEC_MAX_NUMPROCS GREATER_EQUAL 2)
3237

3338
add_test(NAME mpi_pass COMMAND mpi_pass)
39+
test_mpi_launcher(mpi_pass 2)
3440
set_property(TEST mpi_pass PROPERTY FIXTURES_REQUIRED mpi_fxt)
3541

3642
endif()
@@ -39,28 +45,7 @@ endif()
3945

4046
get_property(tests DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY TESTS)
4147

42-
set_property(TEST ${tests} PROPERTY cpu_mpi)
43-
44-
set_property(TEST ${tests} PROPERTY SKIP_REGULAR_EXPRESSION "No host list provided")
45-
46-
# convenience vars
47-
set(single mpi_basic_C mpi_version_C mpi_basic_Fortran mpi_version_Fortran)
48-
set(_m ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG})
49-
50-
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.29)
51-
52-
set_property(TEST ${single} PROPERTY TEST_LAUNCHER ${_m} 1)
53-
set_property(TEST mpi_hello PROPERTY TEST_LAUNCHER ${_m} ${MPIEXEC_MAX_NUMPROCS})
54-
set_property(TEST mpi_pass PROPERTY TEST_LAUNCHER ${_m} 2)
55-
56-
else()
57-
58-
set_property(TARGET ${single} PROPERTY CROSSCOMPILING_EMULATOR ${_m} 1)
59-
set_property(TARGET mpi_hello PROPERTY CROSSCOMPILING_EMULATOR ${_m} ${MPIEXEC_MAX_NUMPROCS})
60-
set_property(TARGET mpi_pass PROPERTY CROSSCOMPILING_EMULATOR ${_m} 2)
61-
62-
endif()
63-
64-
if(DEFINED mpi_tmpdir)
65-
set_property(TEST ${tests} PROPERTY ENVIRONMENT TMPDIR=${mpi_tmpdir})
66-
endif()
48+
set_tests_properties(${tests} PROPERTIES
49+
RESOURCE_LOCK mpi
50+
SKIP_REGULAR_EXPRESSION "No host list provided"
51+
)

0 commit comments

Comments
 (0)