1# Copyright (c) 2020 - 2024 David Guibert
2# Copyright (c) 2024 Sam Hatfield
3# Copyright (c) 2024 Antoine Morvan
4# Copyright (c) 2024 - 2025 Niclas Schroeter
7# SPDX-License-Identifier: Apache-2.0
9set_property(GLOBAL PROPERTY ectrans_can_use_system TRUE)
10set_property(GLOBAL PROPERTY ectrans_depends mpi ecbuild fiat)
12option(ENABLE_ectrans_gpu "Enable ectrans GPU benchmarks" OFF)
13option(ENABLE_ectrans_cpu "Enable ectrans CPU benchmarks" ON)
14set(ectrans_cmake_args "" CACHE STRING "Custom CMake arguments for ectrans")
15set(ectrans_build_args "" CACHE STRING "Custom Make arguments for ectrans")
18 set_property(GLOBAL APPEND PROPERTY ectrans_depends openblas fftw)
22 set_property(GLOBAL APPEND PROPERTY ectrans_depends cuda)
26 if(USE_SYSTEM_ectrans)
27 message(STATUS "ectrans: enabled (system installed)")
29 if(ENABLE_ectrans_cpu)
30 find_program(ECTRANS_EXE ectrans-benchmark-cpu-sp REQUIRED)
31 set(ectrans_BIN_DIR ${CMAKE_BINARY_DIR})
32 get_filename_component(ECTRANS_EXE_DIR "${ECTRANS_EXE}" DIRECTORY)
33 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${ECTRANS_EXE_DIR}")
36 if(ENABLE_ectrans_gpu)
37 find_program(ECTRANS_EXE ectrans-benchmark-gpu-sp REQUIRED)
38 set(ectrans_BIN_DIR ${CMAKE_BINARY_DIR})
39 get_filename_component(ECTRANS_EXE_DIR "${ECTRANS_EXE}" DIRECTORY)
40 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${ECTRANS_EXE_DIR}")
43 message(STATUS "ectrans: enabled (internally built)")
45 set(ectrans_depends_ep ecbuild fiat MPI::MPI_C MPI::MPI_Fortran)
47 if(ENABLE_ectrans_cpu)
48 list(APPEND ectrans_depends_ep openblas)
49 list(APPEND ectrans_depends_ep fftw fftw_single)
53 list(APPEND ectrans_cmake_args "-DFFTW_ROOT=${FFTW_ROOT}")
57 ExternalProject_Data_Add(
60 DEPENDS ${ectrans_depends_ep}
61 CMAKE_ARGS ${cmake_params}
62 -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
63 -DCMAKE_INSTALL_PREFIX:FILEPATH=<INSTALL_DIR>
64 -DENABLE_MPI=ON -DENABLE_OMP=ON
65 -DENABLE_DOUBLE_PRECISION=ON
66 -DENABLE_SINGLE_PRECISION=ON
67 -DENABLE_CPU=${ENABLE_ectrans_cpu}
68 -DENABLE_TESTS=${ENABLE_ectrans_cpu}
69 -DENABLE_TRANSI=${ENABLE_ectrans_cpu}
70 -DENABLE_GPU=${ENABLE_ectrans_gpu}
71 -DENABLE_ACC=${ENABLE_ectrans_gpu}
72 -DENABLE_GPU_GRAPHS_GEMM=OFF
73 -DENABLE_GPU_GRAPHS_FFT=OFF
76 BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${ectrans_build_args})
78 ExternalProject_Get_Property(ectrans INSTALL_DIR)
79 set(ectrans_BIN_DIR ${INSTALL_DIR})
80 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${ectrans_BIN_DIR}/bin")
83 # Options shared by all ecTrans cases
84 # --norms: output spectral error norms to verify numerical correctness
85 # --meminfo: output memory usage and core binding information
86 # -n 100: run benchmark for 100 iterations
87 # -l 137: use 137 vertical levels (as in standard configurations of the IFS)
88 # --vordiv: enable computation of grid-point vorticity and divergence during the inverse transform
89 # --uvders: enable computation of derivatives of U and V during the inverse transform
90 # --scders: enable computation of derivatives of scalar fields during the inverse transform
92 # --check: The multiplier of the machine epsilon used as a tolerance for correctness checking
93 set(ectrans_core_options "--norms --meminfo -n 100 -l 137 --vordiv --uvders --scders --check 1000")
95 # Define cases small, medium, and big, based on truncation (i.e. spectral resolution)
96 # We choose truncations of 319, 639 and 1279 because these are common resolutions for the IFS, and
97 # it's relatively easy to construct a weak-scaling benchmark suite with a reasonable number of
98 # nodes based on these three by assuming the work scales with the cube of truncation
99 # E.g., for ECMWF Atos, we use 1, 8, and 64 nodes for these three cases, respectively
100 set(cases "small" "medium" "big")
101 set(truncs 319 639 1279)
103 # Define test cases for ecTrans
104 # Note that all cases use the single-precision binary of ecTrans, as ECMWF uses single precision
105 # for all forecast configurations of the IFS by default
106 if(ENABLE_ectrans_cpu)
107 foreach(case trunc IN ZIP_LISTS cases truncs)
109 NAME ectrans-cpu-${case}
111 env LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH} PATH=$ENV{PATH}
112 $<TARGET_FILE:job_launcher> --name=ectrans-cpu-${case}
115 ectrans-benchmark-cpu-sp ${ectrans_core_options} -t ${trunc}
116 WORKING_DIRECTORY ${ectrans_BIN_DIR})
120 if(ENABLE_ectrans_gpu)
121 foreach(case trunc IN ZIP_LISTS cases truncs)
123 NAME ectrans-gpu-${case}
125 env LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH} PATH=$ENV{PATH}
126 $<TARGET_FILE:job_launcher> --name=ectrans-gpu-${case}
129 ectrans-benchmark-gpu-sp ${ectrans_core_options} -t ${trunc}
130 WORKING_DIRECTORY ${ectrans_BIN_DIR})
133endif(ectrans_enabled)