HPCW 3.0
Loading...
Searching...
No Matches
ectrans.cmake
Go to the documentation of this file.
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
5# All rights reserved.
6#
7# SPDX-License-Identifier: Apache-2.0
8
9set_property(GLOBAL PROPERTY ectrans_can_use_system TRUE)
10set_property(GLOBAL PROPERTY ectrans_depends mpi ecbuild fiat)
11
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")
16
17if(ENABLE_ectrans_cpu)
18 set_property(GLOBAL APPEND PROPERTY ectrans_depends openblas fftw)
19endif()
20
21if(ENABLE_ectrans_gpu)
22 set_property(GLOBAL APPEND PROPERTY ectrans_depends cuda)
23endif()
24
25if(ectrans_enabled)
26 if(USE_SYSTEM_ectrans)
27 message(STATUS "ectrans: enabled (system installed)")
28
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}")
34 endif()
35
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}")
41 endif()
42 else()
43 message(STATUS "ectrans: enabled (internally built)")
44
45 set(ectrans_depends_ep ecbuild fiat MPI::MPI_C MPI::MPI_Fortran)
46
47 if(ENABLE_ectrans_cpu)
48 list(APPEND ectrans_depends_ep openblas)
49 list(APPEND ectrans_depends_ep fftw fftw_single)
50
51 #see FindFFTW.cmake
52 if(FFTW_ROOT)
53 list(APPEND ectrans_cmake_args "-DFFTW_ROOT=${FFTW_ROOT}")
54 endif()
55 endif()
56
57 ExternalProject_Data_Add(
58 ectrans
59 ${ectrans_revision}
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
74 ${default_cmake_args}
75 ${ectrans_cmake_args}
76 BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${ectrans_build_args})
77
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")
81 endif()
82
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
91 # higher
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")
94
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)
102
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)
108 add_test(
109 NAME ectrans-cpu-${case}
110 COMMAND
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}
113 --log-dir=${LOG_DIR}
114 --
115 ectrans-benchmark-cpu-sp ${ectrans_core_options} -t ${trunc}
116 WORKING_DIRECTORY ${ectrans_BIN_DIR})
117 endforeach()
118 endif()
119
120 if(ENABLE_ectrans_gpu)
121 foreach(case trunc IN ZIP_LISTS cases truncs)
122 add_test(
123 NAME ectrans-gpu-${case}
124 COMMAND
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}
127 --log-dir=${LOG_DIR}
128 --
129 ectrans-benchmark-gpu-sp ${ectrans_core_options} -t ${trunc}
130 WORKING_DIRECTORY ${ectrans_BIN_DIR})
131 endforeach()
132 endif()
133endif(ectrans_enabled)