From ef3dd81b399a4a90a236c48abc2a23d5f0940aef Mon Sep 17 00:00:00 2001
From: Lars Bilke <lars.bilke@ufz.de>
Date: Thu, 13 Apr 2023 09:00:37 +0200
Subject: [PATCH] [cmake] Benchmarks for supported processes get an
 OpenMP-enabled variant.

- Implementation in AddTest(), variants are automatically added.
- Currently for TH2M and ThermoRichardsMechanics
- Use 4 threads (ctest scheduling takes this into account too, no system
  overload)
- Can be selected with e.g.: ctest -L ^omp
---
 scripts/cmake/test/AddTest.cmake | 119 +++++++++++++++++++------------
 1 file changed, 72 insertions(+), 47 deletions(-)

diff --git a/scripts/cmake/test/AddTest.cmake b/scripts/cmake/test/AddTest.cmake
index f250004f96f..3437f77e020 100644
--- a/scripts/cmake/test/AddTest.cmake
+++ b/scripts/cmake/test/AddTest.cmake
@@ -422,36 +422,6 @@ Use six arguments version of AddTest with absolute and relative tolerances"
                    AddTest_EXECUTABLE_ARGS "${AddTest_EXECUTABLE_ARGS}"
     )
 
-    add_test(
-        NAME ${TEST_NAME}
-        COMMAND
-            ${CMAKE_COMMAND} -DEXECUTABLE=${AddTest_EXECUTABLE_PARSED}
-            "-DEXECUTABLE_ARGS=${AddTest_EXECUTABLE_ARGS}" # Quoted because
-                                                           # passed as list see
-                                                           # https://stackoverflow.com/a/33248574/80480
-            -DBINARY_PATH=${AddTest_BINARY_PATH}
-            -DWRAPPER_COMMAND=${WRAPPER_COMMAND}
-            "-DWRAPPER_ARGS=${AddTest_WRAPPER_ARGS}"
-            "-DFILES_TO_DELETE=${FILES_TO_DELETE}"
-            -DWORKING_DIRECTORY=${AddTest_WORKING_DIRECTORY}
-            -DLOG_FILE=${PROJECT_BINARY_DIR}/logs/${TEST_NAME}.txt -P
-            ${PROJECT_SOURCE_DIR}/scripts/cmake/test/AddTestWrapper.cmake
-    )
-    if(DEFINED AddTest_DEPENDS)
-        if(NOT (TEST ${AddTest_DEPENDS} OR TARGET ${AddTest_DEPENDS}))
-            message(
-                FATAL_ERROR
-                    "AddTest ${TEST_NAME}: dependency ${AddTest_DEPENDS} does not exist!"
-            )
-        endif()
-        set_tests_properties(${TEST_NAME} PROPERTIES DEPENDS ${AddTest_DEPENDS})
-    endif()
-    if(DEFINED MPI_PROCESSORS)
-        set_tests_properties(
-            ${TEST_NAME} PROPERTIES PROCESSORS ${MPI_PROCESSORS}
-        )
-    endif()
-
     current_dir_as_list(ProcessLib labels)
     if(${AddTest_RUNTIME} LESS_EQUAL ${ogs.ctest.large_runtime})
         list(APPEND labels default)
@@ -459,6 +429,15 @@ Use six arguments version of AddTest with absolute and relative tolerances"
         list(APPEND labels large)
     endif()
 
+    _add_test(${TEST_NAME})
+
+    # OpenMP tests for specific processes only.
+    # TODO (CL) Once all processes can be assembled OpenMP parallel, the condition should be removed.
+    if("${labels}" MATCHES "TH2M|ThermoRichards")
+        _add_test(${TEST_NAME}-omp)
+        _set_omp_test_properties()
+    endif()
+
     if(AddTest_PYTHON_PACKAGES)
         list(APPEND labels python_modules)
         if(OGS_USE_PIP)
@@ -479,23 +458,6 @@ Use six arguments version of AddTest with absolute and relative tolerances"
         endif()
     endif()
 
-    set_tests_properties(
-        ${TEST_NAME}
-        PROPERTIES ${AddTest_PROPERTIES}
-                   COST
-                   ${AddTest_RUNTIME}
-                   DISABLED
-                   ${AddTest_DISABLED}
-                   LABELS
-                   "${labels}"
-    )
-    # Disabled for the moment, does not work with CI under load
-    # ~~~
-    # if(NOT OGS_COVERAGE)
-    #     set_tests_properties(${TEST_NAME} PROPERTIES TIMEOUT ${timeout})
-    # endif()
-    # ~~~
-
     add_dependencies(ctest ${AddTest_EXECUTABLE})
     add_dependencies(ctest-large ${AddTest_EXECUTABLE})
 
@@ -541,3 +503,66 @@ Use six arguments version of AddTest with absolute and relative tolerances"
     )
 
 endfunction()
+
+# Add a ctest and sets properties
+macro(_add_test TEST_NAME)
+    message(STATUS "working: ${AddTest_WORKING_DIRECTORY}")
+    add_test(
+        NAME ${TEST_NAME}
+        COMMAND
+            ${CMAKE_COMMAND} -DEXECUTABLE=${AddTest_EXECUTABLE_PARSED}
+            "-DEXECUTABLE_ARGS=${AddTest_EXECUTABLE_ARGS}" # Quoted because
+                                                           # passed as list see
+                                                           # https://stackoverflow.com/a/33248574/80480
+            -DBINARY_PATH=${AddTest_BINARY_PATH}
+            -DWRAPPER_COMMAND=${WRAPPER_COMMAND}
+            "-DWRAPPER_ARGS=${AddTest_WRAPPER_ARGS}"
+            "-DFILES_TO_DELETE=${FILES_TO_DELETE}"
+            -DWORKING_DIRECTORY=${AddTest_WORKING_DIRECTORY}
+            -DLOG_FILE=${PROJECT_BINARY_DIR}/logs/${TEST_NAME}.txt -P
+            ${PROJECT_SOURCE_DIR}/scripts/cmake/test/AddTestWrapper.cmake
+    )
+
+    if(DEFINED AddTest_DEPENDS)
+        if(NOT (TEST ${AddTest_DEPENDS} OR TARGET ${AddTest_DEPENDS}))
+            message(
+                FATAL_ERROR
+                    "AddTest ${TEST_NAME}: dependency ${AddTest_DEPENDS} does not exist!"
+            )
+        endif()
+        set_tests_properties(${TEST_NAME} PROPERTIES DEPENDS ${AddTest_DEPENDS})
+    endif()
+    if(DEFINED MPI_PROCESSORS)
+        set_tests_properties(
+            ${TEST_NAME} PROPERTIES PROCESSORS ${MPI_PROCESSORS}
+        )
+    endif()
+
+    set_tests_properties(
+        ${TEST_NAME}
+        PROPERTIES ${AddTest_PROPERTIES}
+                   COST
+                   ${AddTest_RUNTIME}
+                   DISABLED
+                   ${AddTest_DISABLED}
+                   LABELS
+                   "${labels}"
+    )
+endmacro()
+
+# Sets number of threads, adds label 'omp' and adds a dependency to the
+# non-OpenMP test because both write to the same output files.
+macro(_set_omp_test_properties)
+    get_test_property(${TEST_NAME}-omp ENVIRONMENT _environment)
+    set_tests_properties(
+        ${TEST_NAME}-omp
+        PROPERTIES ENVIRONMENT
+                   "OGS_ASM_THREADS=4;${_environment}"
+                   PROCESSORS
+                   4
+                   DEPENDS
+                   ${TEST_NAME}
+                   LABELS
+                   "${labels};omp"
+    )
+endmacro()
-- 
GitLab