From 4ae70bf81a66aa70cc7761228d2b38cc74669118 Mon Sep 17 00:00:00 2001 From: Thomas Padioleau Date: Sat, 22 Aug 2026 14:56:39 +0200 Subject: [PATCH] Improve compile time by making benchmarks optional --- CMakeLists.txt | 55 ++----------------- benchmarks/CMakeLists.txt | 47 ++++++++++++++++ {src => benchmarks}/main.cpp | 0 {src => benchmarks}/strong_scaling.cpp | 0 {src => benchmarks}/weak_scaling.cpp | 0 tests/CMakeLists.txt | 4 ++ .../ConvergenceOrder}/convergence_order.cpp | 0 7 files changed, 56 insertions(+), 50 deletions(-) create mode 100644 benchmarks/CMakeLists.txt rename {src => benchmarks}/main.cpp (100%) rename {src => benchmarks}/strong_scaling.cpp (100%) rename {src => benchmarks}/weak_scaling.cpp (100%) rename {src => tests/ConvergenceOrder}/convergence_order.cpp (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 519ab551..5245753d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 3.12) # Options should be defined before they're used +option(GMGPOLAR_BUILD_BENCHMARKS "Build GMGPolar benchmarks." OFF) option(GMGPOLAR_BUILD_TESTS "Build GMGPolar unit tests." ON) option(GMGPOLAR_USE_LIKWID "Use LIKWID to measure code (regions)." OFF) option(GMGPOLAR_USE_MUMPS "Use MUMPS to solve linear systems." OFF) @@ -96,56 +97,6 @@ install(EXPORT GMGPolarTargets add_subdirectory(src) -# Create the executables. These test specific cases and are not very useful -# without access to the source code so they are not installed with the -# library -add_executable(gmgpolar src/main.cpp) -add_executable(convergence_order src/convergence_order.cpp) -target_link_libraries(gmgpolar PRIVATE GMGPolarLib GMGPolarInterface) -target_link_libraries(convergence_order PRIVATE GMGPolarLib GMGPolarInterface) - -# Builds a single-run inner executable (NAME_run) from SOURCE and generates a -# bash wrapper script NAME that owns the loop over configurations, calling the -# runner once per Kokkos::ScopeGuard lifetime. SCRIPT_BODY is shell code that -# uses $RUNNER (absolute path injected at cmake-generate time) and $OUTFILE. -function(add_scaling_wrapper NAME SOURCE SCRIPT_BODY) - set(runner_target ${NAME}_run) - add_executable(${runner_target} ${SOURCE}) - target_link_libraries(${runner_target} PRIVATE GMGPolarLib GMGPolarInterface) - - set(script "${CMAKE_BINARY_DIR}/${NAME}") - file(GENERATE - OUTPUT "${script}" - CONTENT "#!/bin/bash\nset -euo pipefail\nRUNNER=$\n${SCRIPT_BODY}" - ) - add_custom_target(${NAME} ALL - COMMAND chmod 755 "${script}" - COMMENT "Preparing ${NAME} wrapper script" - ) -endfunction() - -set(WEAK_SCALING_BODY -[=[OUTFILE="weak_scaling_results.csv" -echo "Threads,DivideBy2,nr,ntheta,geometry,stencil_method,cacheDensityProfileCoefficients,cacheDomainGeometry,FMG,extrapolation_int,TotalTime,t_setup_total,t_setup_createLevels,t_setup_smoother,t_setup_directSolver,t_solve_total,t_solve_initial_approximation,t_solve_multigrid_iterations,t_check_convergence,t_check_exact_error,t_avg_MGC_total,t_avg_MGC_preSmoothing,t_avg_MGC_postSmoothing,t_avg_MGC_residual,t_avg_MGC_directSolver" > "$OUTFILE" -"$RUNNER" "$OUTFILE" 5 --kokkos-threads=1 -"$RUNNER" "$OUTFILE" 6 --kokkos-threads=4 -"$RUNNER" "$OUTFILE" 7 --kokkos-threads=16 -"$RUNNER" "$OUTFILE" 8 --kokkos-threads=56 -echo "Results written to $OUTFILE" -]=]) - -set(STRONG_SCALING_BODY -[=[OUTFILE="strong_scaling_results.csv" -echo "Threads,DivideBy2,nr,ntheta,geometry,stencil_method,cacheDensityProfileCoefficients,cacheDomainGeometry,FMG,extrapolation_int,TotalTime,t_setup_total,t_setup_createLevels,t_setup_smoother,t_setup_directSolver,t_solve_total,t_solve_initial_approximation,t_solve_multigrid_iterations,t_check_convergence,t_check_exact_error,t_avg_MGC_total,t_avg_MGC_preSmoothing,t_avg_MGC_postSmoothing,t_avg_MGC_residual,t_avg_MGC_directSolver" > "$OUTFILE" -for threads in $(seq 1 56); do - "$RUNNER" "$OUTFILE" --kokkos-threads=$threads -done -echo "Results written to $OUTFILE" -]=]) - -add_scaling_wrapper(weak_scaling src/weak_scaling.cpp "${WEAK_SCALING_BODY}") -add_scaling_wrapper(strong_scaling src/strong_scaling.cpp "${STRONG_SCALING_BODY}") - if(GMGPOLAR_BUILD_TESTS) enable_testing() find_package(GTest 1.17 QUIET) @@ -191,3 +142,7 @@ if(GMGPOLAR_BUILD_TESTS) endif() endif() endif() + +if(GMGPOLAR_BUILD_BENCHMARKS) + add_subdirectory(benchmarks) +endif() diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt new file mode 100644 index 00000000..c4676d53 --- /dev/null +++ b/benchmarks/CMakeLists.txt @@ -0,0 +1,47 @@ +# Create the executables. These test specific cases and are not very useful +# without access to the source code so they are not installed with the +# library +add_executable(gmgpolar main.cpp) +target_link_libraries(gmgpolar PRIVATE GMGPolarLib GMGPolarInterface) + +# Builds a single-run inner executable (NAME_run) from SOURCE and generates a +# bash wrapper script NAME that owns the loop over configurations, calling the +# runner once per Kokkos::ScopeGuard lifetime. SCRIPT_BODY is shell code that +# uses $RUNNER (absolute path injected at cmake-generate time) and $OUTFILE. +function(add_scaling_wrapper NAME SOURCE SCRIPT_BODY) + set(runner_target ${NAME}_run) + add_executable(${runner_target} ${SOURCE}) + target_link_libraries(${runner_target} PRIVATE GMGPolarLib GMGPolarInterface) + + set(script "${CMAKE_BINARY_DIR}/${NAME}") + file(GENERATE + OUTPUT "${script}" + CONTENT "#!/bin/bash\nset -euo pipefail\nRUNNER=$\n${SCRIPT_BODY}" + ) + add_custom_target(${NAME} ALL + COMMAND chmod 755 "${script}" + COMMENT "Preparing ${NAME} wrapper script" + ) +endfunction() + +set(WEAK_SCALING_BODY +[=[OUTFILE="weak_scaling_results.csv" +echo "Threads,DivideBy2,nr,ntheta,geometry,stencil_method,cacheDensityProfileCoefficients,cacheDomainGeometry,FMG,extrapolation_int,TotalTime,t_setup_total,t_setup_createLevels,t_setup_smoother,t_setup_directSolver,t_solve_total,t_solve_initial_approximation,t_solve_multigrid_iterations,t_check_convergence,t_check_exact_error,t_avg_MGC_total,t_avg_MGC_preSmoothing,t_avg_MGC_postSmoothing,t_avg_MGC_residual,t_avg_MGC_directSolver" > "$OUTFILE" +"$RUNNER" "$OUTFILE" 5 --kokkos-threads=1 +"$RUNNER" "$OUTFILE" 6 --kokkos-threads=4 +"$RUNNER" "$OUTFILE" 7 --kokkos-threads=16 +"$RUNNER" "$OUTFILE" 8 --kokkos-threads=56 +echo "Results written to $OUTFILE" +]=]) + +set(STRONG_SCALING_BODY +[=[OUTFILE="strong_scaling_results.csv" +echo "Threads,DivideBy2,nr,ntheta,geometry,stencil_method,cacheDensityProfileCoefficients,cacheDomainGeometry,FMG,extrapolation_int,TotalTime,t_setup_total,t_setup_createLevels,t_setup_smoother,t_setup_directSolver,t_solve_total,t_solve_initial_approximation,t_solve_multigrid_iterations,t_check_convergence,t_check_exact_error,t_avg_MGC_total,t_avg_MGC_preSmoothing,t_avg_MGC_postSmoothing,t_avg_MGC_residual,t_avg_MGC_directSolver" > "$OUTFILE" +for threads in $(seq 1 56); do + "$RUNNER" "$OUTFILE" --kokkos-threads=$threads +done +echo "Results written to $OUTFILE" +]=]) + +add_scaling_wrapper(weak_scaling weak_scaling.cpp "${WEAK_SCALING_BODY}") +add_scaling_wrapper(strong_scaling strong_scaling.cpp "${STRONG_SCALING_BODY}") diff --git a/src/main.cpp b/benchmarks/main.cpp similarity index 100% rename from src/main.cpp rename to benchmarks/main.cpp diff --git a/src/strong_scaling.cpp b/benchmarks/strong_scaling.cpp similarity index 100% rename from src/strong_scaling.cpp rename to benchmarks/strong_scaling.cpp diff --git a/src/weak_scaling.cpp b/benchmarks/weak_scaling.cpp similarity index 100% rename from src/weak_scaling.cpp rename to benchmarks/weak_scaling.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 9bc1585a..e65a0023 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -29,3 +29,7 @@ target_compile_features(gmgpolar_tests PRIVATE cxx_std_20) target_link_libraries(gmgpolar_tests GMGPolarLib GMGPolarInterface GTest::gtest) gtest_discover_tests(gmgpolar_tests DISCOVERY_MODE PRE_TEST) + +add_executable(convergence_order ConvergenceOrder/convergence_order.cpp) +target_link_libraries(convergence_order PRIVATE GMGPolarLib GMGPolarInterface) +add_test(NAME convergence_order COMMAND convergence_order) diff --git a/src/convergence_order.cpp b/tests/ConvergenceOrder/convergence_order.cpp similarity index 100% rename from src/convergence_order.cpp rename to tests/ConvergenceOrder/convergence_order.cpp