Skip to content
Snippets Groups Projects
Unverified Commit 6ececa69 authored by Nithin Senthil Kumar's avatar Nithin Senthil Kumar Committed by GitHub
Browse files

New packages Mvapich2x and Mvapich2-GDR (#17883)


* Adding new packages Mvapich2x and Mvapich2-GDR which can be installed only via binary mirrors

* Added docstring descriptions to both packages

* Removed variant wrapper for cuda dependencies

* Fixed multiple flake8 errors

* Updated APIs to pass unit tests

* Updated APIs for MVAPICH2-X package and fixed flake8 warnings for MVAPICH2-GDR

* Changed url back to single line

* Removed extra parantesis around URL string

Co-authored-by: default avatarnithintsk <nithintsk@github.com>
parent 46fb456b
No related branches found
No related tags found
No related merge requests found
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os.path
import sys
class Mvapich2Gdr(AutotoolsPackage):
"""MVAPICH2-GDR is an optimized version of the MVAPICH2 MPI library for
GPU-enabled HPC and Deep Learning Applications. MVAPICH2-GDR is not
installable from source and is only available through a binary mirror.
If you do not find the binary you're looking for, send us an email at
mvapich@cse.ohio-state.edu. The binary mirror url is:
http://mvapich.cse.ohio-state.edu:8080/download/mvapich/spack-mirror/mvapich2-gdr/
"""
homepage = 'http://mvapich.cse.ohio-state.edu'
url = 'http://mvapich.cse.ohio-state.edu:8080/download/mvapich/spack-mirror/mvapich2-gdr/mvapich2-gdr-2.3.4.tar.gz'
maintainers = ['nithintsk', 'harisubramoni']
version('2.3.4', sha256='ed78101e6bb807e979213006ee5f20ff466369b01f96b6d1cf0c471baf7e35aa')
version('2.3.3', sha256='9b7b5dd235dbf85099fba3b6f1ccb49bb755923efed66ddc335921f44cb1b8a8')
provides('mpi')
provides('mpi@:3.1')
variant(
'process_managers',
description='The process manager to activate.',
default='mpirun',
values=('slurm', 'mpirun', 'pbs', 'jsrun'),
multi=False
)
variant(
'distribution',
description='The type of fabric distribution.',
default='stock-ofed',
values=('stock-ofed', 'mofed4.5', 'mofed4.6', 'mofed4.7', 'mofed5.0'),
multi=False
)
variant(
'pmi_version',
description='The pmi version to be used with slurm. '
'Is ignored if set for mpirun or jsrun. '
'jsrun uses pmix regardless of chosen option.',
default='pmi1',
values=('pmi1', 'pmi2', 'pmix'),
multi=False
)
variant(
'mcast',
description='Enable/Disable support for mcast',
default=True
)
variant(
'openacc',
description='Enable/Disable support for openacc',
default=False
)
variant(
'core_direct',
description='Enable/Disable support for core_direct',
default=False
)
depends_on('bison@3.4.2', type='build')
depends_on('libpciaccess@0.13.5', when=(sys.platform != 'darwin'))
depends_on('libxml2@2.9.10')
depends_on('cuda@9.2.88:10.2.89')
depends_on('pmix@3.1.3', when='pmi_version=pmix')
filter_compiler_wrappers(
'mpicc', 'mpicxx', 'mpif77', 'mpif90', 'mpifort', relative_root='bin'
)
@property
def libs(self):
query_parameters = self.spec.last_query.extra_parameters
libraries = ['libmpi']
if 'cxx' in query_parameters:
libraries = ['libmpicxx'] + libraries
return find_libraries(
libraries, root=self.prefix, shared=True, recursive=True
)
@property
def process_manager_options(self):
spec = self.spec
opts = []
if '~mcast' in spec:
opts.append('--disable-mcast')
if '+core_direct' in spec:
opts.append('--with-core-direct')
if '+openacc' in spec:
opts.append('--enable-openacc')
# See: http://slurm.schedmd.com/mpi_guide.html#mvapich2
if 'process_managers=slurm' in spec:
opts.append('--with-pm=slurm')
if 'pmi_version=pmi1' in spec:
opts.append('--with-pmi=pmi1')
if 'pmi_version=pmi2' in spec:
opts.append('--with-pmi=pmi2')
if 'pmi_version=pmix' in spec:
opts.append('--with-pmi=pmix')
opts.append('--with-pmix={0}'.format(spec['pmix'].prefix))
elif 'process_managers=pbs' in spec:
opts.append([
'--with-pm=hydra',
'--with-pbs=/opt/pbs'
])
if '~mcast' in spec:
opts.append('--disable-mcast')
if '+core_direct' in spec:
opts.append('--with-core-direct')
if '+openacc' in spec:
opts.append('--enable-openacc')
elif 'process_managers=jsrun' in spec:
opts.append([
'--with-pmi=pmix',
'--with-pmix={0}'.format(spec['pmix'].prefix),
'--with-pm=jsm'
])
return opts
def setup_build_environment(self, env):
# mvapich2 configure fails when F90 and F90FLAGS are set
env.unset('F90')
env.unset('F90FLAGS')
def setup_run_environment(self, env):
if 'pmi_version=pmi1' in self.spec:
env.set('SLURM_MPI_TYPE', 'pmi1')
if 'pmi_version=pmi2' in self.spec:
env.set('SLURM_MPI_TYPE', 'pmi2')
if 'pmi_version=pmix' in self.spec:
env.set('SLURM_MPI_TYPE', 'pmix')
# Because MPI functions as a compiler, we need to treat it as one and
# add its compiler paths to the run environment.
self.setup_compiler_environment(env)
def setup_dependent_build_environment(self, env, dependent_spec):
self.setup_compiler_environment(env)
# use the Spack compiler wrappers under MPI
env.set('MPICH_CC', spack_cc)
env.set('MPICH_CXX', spack_cxx)
env.set('MPICH_F77', spack_f77)
env.set('MPICH_F90', spack_fc)
env.set('MPICH_FC', spack_fc)
def setup_compiler_environment(self, env):
env.set('MPICC', join_path(self.prefix.bin, 'mpicc'))
env.set('MPICXX', join_path(self.prefix.bin, 'mpicxx'))
env.set('MPIF77', join_path(self.prefix.bin, 'mpif77'))
env.set('MPIF90', join_path(self.prefix.bin, 'mpif90'))
def setup_dependent_package(self, module, dependent_spec):
self.spec.mpicc = join_path(self.prefix.bin, 'mpicc')
self.spec.mpicxx = join_path(self.prefix.bin, 'mpicxx')
self.spec.mpifc = join_path(self.prefix.bin, 'mpif90')
self.spec.mpif77 = join_path(self.prefix.bin, 'mpif77')
self.spec.mpicxx_shared_libs = [
os.path.join(self.prefix.lib, 'libmpicxx.{0}'.format(dso_suffix)),
os.path.join(self.prefix.lib, 'libmpi.{0}'.format(dso_suffix))
]
def configure_args(self):
args = ['--enable-cuda',
'--disable-hybrid',
'--with-ch3-rank-bits=32',
'--disable-gl',
'--without-hydra-ckpointlib',
'--disable-static',
'--enable-shared',
'--disable-rdma-cm'
]
args.extend(self.process_manager_options)
return args
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os.path
import sys
class Mvapich2x(AutotoolsPackage):
"""MVAPICH2-X is the advanced version of the MVAPICH2 MPI library with
enhanced features (UMR, ODP, DC, Core-Direct, SHARP, XPMEM), OSU INAM
(InifniBand Network Monitoring and Analysis),PGAS (OpenSHMEM, UPC, UPC++,
and CAF), and MPI+PGAS programming models with unified communication
runtime. MVAPICH2-X is not installable from source and is only available
through a binary mirror. If you do not find the binary you're looking for,
send us an email at mvapich@cse.ohio-state.edu. The binary mirror url is:
http://mvapich.cse.ohio-state.edu:8080/download/mvapich/spack-mirror/mvapich2x/
"""
homepage = "http://mvapich.cse.ohio-state.edu"
url = "http://mvapich.cse.ohio-state.edu:8080/download/mvapich/spack-mirror/mvapich2x/mvapich2x-2.3.tar.gz"
maintainers = ['nithintsk', 'harisubramoni']
version('2.3', sha256='fc47070e2e9fac09b97022be2320200d732a0a4a820a2b51532b88f8ded14536', preferred=True)
version('2.3rc3', sha256='85a9f1ea1a837d487e356f021ef6f3a4661ad270a0c5f54777b362ee4d45166f')
provides('mpi')
provides('mpi@:3.1')
variant(
'feature',
description=('Feature descriptions are specified at: '
'https://mvapich.cse.ohio-state.edu/downloads/'),
default='basic',
values=('basic', 'basic-xpmem', 'advanced', 'advanced-xpmem'),
multi=False
)
variant(
'process_managers',
description='List of the process managers to activate',
default='mpirun',
values=('slurm', 'mpirun', 'pbs', 'jsrun'),
multi=False
)
variant(
'distribution',
description='The type of distribution of the fabric.',
default='stock-ofed',
values=('stock-ofed', 'mofed4.5', 'mofed4.6', 'mofed4.7', 'mofed5.0',
'ifs10.6', 'ifs10.9'),
multi=False
)
variant(
'pmi_version',
description=('The pmi version to be used with slurm. This variant is '
'IGNORED if set for mpirun or jsrun. jsrun uses pmix '
'regardless of chosen option.'),
default='pmi1',
values=('pmi1', 'pmi2', 'pmix'),
multi=False
)
depends_on('bison@3.4.2', type='build')
depends_on('libpciaccess@0.13.5', when=(sys.platform != 'darwin'))
depends_on('libxml2@2.9.10')
depends_on('pmix@3.1.3', when='pmi_version=pmix')
filter_compiler_wrappers(
'mpicc', 'mpicxx', 'mpif77', 'mpif90', 'mpifort', relative_root='bin'
)
@property
def libs(self):
query_parameters = self.spec.last_query.extra_parameters
libraries = ['libmpi']
if 'cxx' in query_parameters:
libraries = ['libmpicxx'] + libraries
return find_libraries(
libraries, root=self.prefix, shared=True, recursive=True
)
@property
def process_feature_options(self):
spec = self.spec
opts = []
if 'feature=basic' in spec:
opts = ['--enable-mcast', '--enable-hybrid', '--enable-mpit-tool',
'--enable-mpit-pvars=mv2']
elif 'feature=basic-xpmem' in spec:
opts = ['--enable-mcast', '--enable-hybrid', '--enable-mpit-tool',
'--enable-mpit-pvars=mv2', '--with-xpmem=/opt/xpmem/']
elif 'feature=advanced' in spec:
opts = ['--enable-mcast', '--enable-hybrid', '--enable-mpit-tool',
'--enable-mpit-pvars=mv2', '--with-core-direct',
'--enable-dc', '--enable-umr']
elif 'feature=advanced-xpmem' in spec:
opts = ['--enable-mcast', '--enable-hybrid', '--enable-mpit-tool',
'--enable-mpit-pvars=mv2', '--with-core-direct',
'--enable-dc', '--enable-umr', '--with-xpmem=/opt/xpmem/']
return opts
@property
def distribution_options(self):
opts = []
if ('distribution=ifs10.6' in self.spec or
'distribution=ifs10.9' in self.spec):
opts = ["--with-device=ch3:psm"]
else:
opts = ["--with-device=ch3:mrail", "--with-rdma=gen2"]
return opts
@property
def process_manager_options(self):
spec = self.spec
opts = []
# See: http://slurm.schedmd.com/mpi_guide.html#mvapich2
if 'process_managers=slurm' in spec:
opts = [
'--with-ch3-rank-bits=32',
'--with-pm=slurm'
]
if 'pmi_version=pmi1' in spec:
opts.append('--with-pmi=pmi1')
if 'pmi_version=pmi2' in spec:
opts.append('--with-pmi=pmi2')
if 'pmi_version=pmix' in spec:
opts.append('--with-pmi=pmix')
opts.append('--with-pmix={0}'.format(spec['pmix'].prefix))
elif 'process_managers=pbs' in spec:
opts = ['--with-ch3-rank-bits=32', '--with-pbs=/opt/pbs',
'--with-pm=hydra']
elif 'process_managers=jsrun' in spec:
opts = ['--with-ch3-rank-bits=32', '--with-pmi=pmix',
'--with-pmix={0}'.format(['pmix'].prefix),
'--with-pm=jsm']
opts.append('--disable-gl')
return opts
@property
def construct_ldflags(self):
# LDFLAGS contributed by the process manager
spec = self.spec
xpmem_ldflags = ''
if ('feature=basic-xpmem' in spec or 'feature=advanced-xpmem' in spec):
xpmem_ldflags = (' -Wl,-rpath,/opt/xpmem/lib '
'-L/opt/xpmem/lib -lxpmem')
# Add default LDFLAGS and combine together
LDFLAGS = 'LDFLAGS=-Wl,-rpath,XORIGIN/placeholder'
LDFLAGS = LDFLAGS + xpmem_ldflags
return LDFLAGS
@property
def construct_cflags(self):
# CFLAGS contributed by the feature
spec = self.spec
cflags = 'CFLAGS='
if ('feature=basic-xpmem' in spec or 'feature=advanced-xpmem' in spec):
cflags = cflags + '-I/opt/xpmem/include'
return cflags
def setup_build_environment(self, env):
# mvapich2 configure fails when F90 and F90FLAGS are set
env.unset('F90')
env.unset('F90FLAGS')
def setup_run_environment(self, env):
if 'pmi_version=pmi1' in self.spec:
set('SLURM_MPI_TYPE', 'pmi1')
if 'pmi_version=pmi2' in self.spec:
set('SLURM_MPI_TYPE', 'pmi2')
if 'pmi_version=pmix' in self.spec:
set('SLURM_MPI_TYPE', 'pmix')
# Because MPI functions as a compiler, we need to treat it as one and
# add its compiler paths to the run environment.
self.setup_compiler_environment(env)
def setup_dependent_build_environment(self, env, dependent_spec):
self.setup_compiler_environment(env)
# use the Spack compiler wrappers under MPI
env.set('MPICH_CC', spack_cc)
env.set('MPICH_CXX', spack_cxx)
env.set('MPICH_F77', spack_f77)
env.set('MPICH_F90', spack_fc)
env.set('MPICH_FC', spack_fc)
def setup_compiler_environment(self, env):
# For Cray MPIs, the regular compiler wrappers *are* the MPI wrappers.
# Cray MPIs always have cray in the module name, e.g. "cray-mvapich"
env.set('MPICC', join_path(self.prefix.bin, 'mpicc'))
env.set('MPICXX', join_path(self.prefix.bin, 'mpicxx'))
env.set('MPIF77', join_path(self.prefix.bin, 'mpif77'))
env.set('MPIF90', join_path(self.prefix.bin, 'mpif90'))
def setup_dependent_package(self, module, dependent_spec):
self.spec.mpicc = join_path(self.prefix.bin, 'mpicc')
self.spec.mpicxx = join_path(self.prefix.bin, 'mpicxx')
self.spec.mpifc = join_path(self.prefix.bin, 'mpif90')
self.spec.mpif77 = join_path(self.prefix.bin, 'mpif77')
self.spec.mpicxx_shared_libs = [
os.path.join(self.prefix.lib, 'libmpicxx.{0}'.format(dso_suffix)),
os.path.join(self.prefix.lib, 'libmpi.{0}'.format(dso_suffix))
]
def configure_args(self):
args = [
'--enable-ucr',
'--disable-static',
'--enable-shared',
'--disable-rdma-cm',
'--without-hydra-ckpointlib'
]
args.extend(self.process_manager_options)
args.extend(self.distribution_options)
args.append(self.construct_cflags)
args.append(self.construct_ldflags)
return args
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment