From feb76169afc2568d45ce6deb0830594926d1af7b Mon Sep 17 00:00:00 2001 From: crivella Date: Fri, 27 Jun 2025 13:50:56 +0200 Subject: [PATCH 1/6] WIP making `mpi_abi` work with clang --- easybuild/easyblocks/m/mpich.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/easybuild/easyblocks/m/mpich.py b/easybuild/easyblocks/m/mpich.py index b8bece1c9eb..c36b3684883 100644 --- a/easybuild/easyblocks/m/mpich.py +++ b/easybuild/easyblocks/m/mpich.py @@ -37,10 +37,12 @@ from easybuild.tools import LooseVersion import easybuild.tools.environment as env +import easybuild.tools.toolchain as toolchain from easybuild.easyblocks.generic.configuremake import ConfigureMake from easybuild.framework.easyconfig import CUSTOM from easybuild.tools.build_log import EasyBuildError from easybuild.tools.systemtools import get_shared_lib_ext +from easybuild.tools.modules import get_software_root class EB_MPICH(ConfigureMake): @@ -55,6 +57,7 @@ def extra_options(extra_vars=None): extra_vars = ConfigureMake.extra_options(extra_vars) extra_vars.update({ 'debug': [False, "Enable debug build (which is slower)", CUSTOM], + 'mpi_abi': [False, "Enable build with MPI ABI compatibility", CUSTOM], }) return extra_vars @@ -109,6 +112,27 @@ def add_mpich_configopts(self): add_configopts.append('--enable-error-checking=no') add_configopts.append('--enable-timing=none') + ucx_root = get_software_root('UCX') + if ucx_root: + add_configopts.append('--with-ucx=%s' % ucx_root) + self.log.info("Enabling UCX support, using UCX root: %s", ucx_root) + + if self.cfg['mpi_abi']: + if LooseVersion(self.version) < LooseVersion('4.3'): + raise EasyBuildError("MPI ABI compatibility is not supported in MPICH < 4.3") + self.log.info("Enabling MPI ABI compatibility") + add_configopts.append('--enable-mpi-abi') + + # TODO https://github.com/llvm/llvm-project/issues/56760 + # #pragma weak ... cannot be used which leads `c_binding_abi.c` to use types such as + # ABI_Comm_copy_attr_function which are not defined. + + comp_fam = self.toolchain.comp_family() + if comp_fam == toolchain.LLVMtc: + # LLVM toolchain requires additional flags or to do something else? + pass + + # enable shared libraries, using GCC and GNU ld options add_configopts.append('--enable-shared') # enable static libraries @@ -164,6 +188,9 @@ def sanity_check_step(self, custom_paths=None, use_new_libnames=None, check_laun if check_launchers: binaries.extend(['mpiexec', 'mpiexec.hydra', 'mpirun']) + if self.cfg['mpi_abi']: + libnames.append('mpi_abi') + bins = [os.path.join('bin', x) for x in binaries] headers = [os.path.join('include', x) for x in ['mpi.h', 'mpicxx.h', 'mpif.h']] lib_exts = [shlib_ext] From 66a9f8fb6c446eaf05744ecf7ebea8ba9a82ce75 Mon Sep 17 00:00:00 2001 From: crivella Date: Mon, 30 Jun 2025 11:32:29 +0200 Subject: [PATCH 2/6] cleanup --- easybuild/easyblocks/m/mpich.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/easybuild/easyblocks/m/mpich.py b/easybuild/easyblocks/m/mpich.py index c36b3684883..e4cf5640da2 100644 --- a/easybuild/easyblocks/m/mpich.py +++ b/easybuild/easyblocks/m/mpich.py @@ -37,7 +37,6 @@ from easybuild.tools import LooseVersion import easybuild.tools.environment as env -import easybuild.tools.toolchain as toolchain from easybuild.easyblocks.generic.configuremake import ConfigureMake from easybuild.framework.easyconfig import CUSTOM from easybuild.tools.build_log import EasyBuildError @@ -123,16 +122,6 @@ def add_mpich_configopts(self): self.log.info("Enabling MPI ABI compatibility") add_configopts.append('--enable-mpi-abi') - # TODO https://github.com/llvm/llvm-project/issues/56760 - # #pragma weak ... cannot be used which leads `c_binding_abi.c` to use types such as - # ABI_Comm_copy_attr_function which are not defined. - - comp_fam = self.toolchain.comp_family() - if comp_fam == toolchain.LLVMtc: - # LLVM toolchain requires additional flags or to do something else? - pass - - # enable shared libraries, using GCC and GNU ld options add_configopts.append('--enable-shared') # enable static libraries From 3b0b43a46b5b5275ed00240d724c6ed05aac49f2 Mon Sep 17 00:00:00 2001 From: crivella Date: Mon, 30 Jun 2025 12:16:34 +0200 Subject: [PATCH 3/6] - Added default device `ch4` - Automatically add `:ucx` suffix if needed - Automatically add cuda build options if `CUDA` is a dep --- easybuild/easyblocks/m/mpich.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/easybuild/easyblocks/m/mpich.py b/easybuild/easyblocks/m/mpich.py index e4cf5640da2..d73f1dd9e0f 100644 --- a/easybuild/easyblocks/m/mpich.py +++ b/easybuild/easyblocks/m/mpich.py @@ -43,6 +43,7 @@ from easybuild.tools.systemtools import get_shared_lib_ext from easybuild.tools.modules import get_software_root +DEVICES_WITH_UCX_SUPPORT = ['ch4'] class EB_MPICH(ConfigureMake): """ @@ -56,6 +57,7 @@ def extra_options(extra_vars=None): extra_vars = ConfigureMake.extra_options(extra_vars) extra_vars.update({ 'debug': [False, "Enable debug build (which is slower)", CUSTOM], + 'device': ['ch4', "Device to use for MPICH (e.g. ch4, ch3)", CUSTOM], 'mpi_abi': [False, "Enable build with MPI ABI compatibility", CUSTOM], }) return extra_vars @@ -111,8 +113,18 @@ def add_mpich_configopts(self): add_configopts.append('--enable-error-checking=no') add_configopts.append('--enable-timing=none') + device = self.cfg['device'] + ucx_root = get_software_root('UCX') if ucx_root: + if ':' in device: + raise EasyBuildError("Device channel already manually specified in device = '%s'.", device) + elif device not in DEVICES_WITH_UCX_SUPPORT: + raise EasyBuildError( + "Device '%s' does not support UCX, please use one of %s.", + device, ', '.join(DEVICES_WITH_UCX_SUPPORT) + ) + device += ':ucx' add_configopts.append('--with-ucx=%s' % ucx_root) self.log.info("Enabling UCX support, using UCX root: %s", ucx_root) @@ -122,6 +134,13 @@ def add_mpich_configopts(self): self.log.info("Enabling MPI ABI compatibility") add_configopts.append('--enable-mpi-abi') + cuda_root = get_software_root('CUDA') + if cuda_root: + self.log.info("CUDA dependency detected, enabling CUDA support") + if LooseVersion(self.version) < LooseVersion('4'): + raise EasyBuildError("CUDA support is not available in MPICH < 4.x") + add_configopts.append(f'--with-cuda={cuda_root}') + # enable shared libraries, using GCC and GNU ld options add_configopts.append('--enable-shared') # enable static libraries @@ -129,6 +148,8 @@ def add_mpich_configopts(self): # enable Fortran 77/90 and C++ bindings add_configopts.extend(['--enable-fortran=all', '--enable-cxx']) + add_configopts.append(f'--with-device={device}') + self.cfg.update('configopts', ' '.join(add_configopts)) def configure_step(self, add_mpich_configopts=True): From d03eb10f8fbf048cd78926e8777ad4c77d850736 Mon Sep 17 00:00:00 2001 From: crivella Date: Mon, 30 Jun 2025 12:18:45 +0200 Subject: [PATCH 4/6] lint --- easybuild/easyblocks/m/mpich.py | 1 + 1 file changed, 1 insertion(+) diff --git a/easybuild/easyblocks/m/mpich.py b/easybuild/easyblocks/m/mpich.py index d73f1dd9e0f..1ead4e625c3 100644 --- a/easybuild/easyblocks/m/mpich.py +++ b/easybuild/easyblocks/m/mpich.py @@ -45,6 +45,7 @@ DEVICES_WITH_UCX_SUPPORT = ['ch4'] + class EB_MPICH(ConfigureMake): """ Support for building the MPICH MPI library and derivatives. From bbbd1185036dfa7e6d1246aea6182d72c5554bf5 Mon Sep 17 00:00:00 2001 From: crivella Date: Mon, 30 Jun 2025 15:01:01 +0200 Subject: [PATCH 5/6] Fix for old MPICH/GCC --- easybuild/easyblocks/m/mpich.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/easybuild/easyblocks/m/mpich.py b/easybuild/easyblocks/m/mpich.py index 1ead4e625c3..e54ad014178 100644 --- a/easybuild/easyblocks/m/mpich.py +++ b/easybuild/easyblocks/m/mpich.py @@ -75,6 +75,7 @@ def correct_mpich_build_env(self): """ env_vars = ['CFLAGS', 'CPPFLAGS', 'CXXFLAGS', 'FCFLAGS', 'FFLAGS', 'LDFLAGS', 'LIBS'] vars_to_unset = ['F90', 'F90FLAGS'] + vars_to_keep = [] for envvar in env_vars: envvar_val = os.getenv(envvar) if envvar_val: @@ -88,6 +89,15 @@ def correct_mpich_build_env(self): else: raise EasyBuildError("Both $%s and $%s set, can I overwrite $%s with $%s (%s) ?", envvar, new_envvar, new_envvar, envvar, envvar_val) + + # With MPICH 3.4.2-GCCcore-10.3.0 the configure script will fail complaining that `-fallow-argument-mismatch` + # is not present in the FFLAGS variable. + version = LooseVersion(self.version) + if version < LooseVersion('4'): + vars_to_keep.append('FFLAGS') + + vars_to_unset = list(set(vars_to_unset) - set(vars_to_keep)) + env.unset_env_vars(vars_to_unset) def add_mpich_configopts(self): From aa02ee583af52b5608a9f808adc0684fabe49ffa Mon Sep 17 00:00:00 2001 From: crivella Date: Mon, 30 Jun 2025 15:03:41 +0200 Subject: [PATCH 6/6] Added logs --- easybuild/easyblocks/m/mpich.py | 1 + 1 file changed, 1 insertion(+) diff --git a/easybuild/easyblocks/m/mpich.py b/easybuild/easyblocks/m/mpich.py index e54ad014178..34db0014588 100644 --- a/easybuild/easyblocks/m/mpich.py +++ b/easybuild/easyblocks/m/mpich.py @@ -94,6 +94,7 @@ def correct_mpich_build_env(self): # is not present in the FFLAGS variable. version = LooseVersion(self.version) if version < LooseVersion('4'): + self.log.info("MPICH version < 4, not unsetting FFLAGS to avoid configure failure") vars_to_keep.append('FFLAGS') vars_to_unset = list(set(vars_to_unset) - set(vars_to_keep))