summaryrefslogtreecommitdiff
path: root/var
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2015-11-23 15:53:53 -0800
committerTodd Gamblin <tgamblin@llnl.gov>2015-11-23 15:53:53 -0800
commitc13329c25a85fd26986746fc5adf818f9dc4ed01 (patch)
treefa2a526ab2ab557296e0837e89e60f907dc8459e /var
parent6798c177c6eb9421c423ac0f20c17802d71995bb (diff)
parent27c64f77404ed3f8a201294596a8a607f18bd39b (diff)
downloadspack-c13329c25a85fd26986746fc5adf818f9dc4ed01.tar.gz
spack-c13329c25a85fd26986746fc5adf818f9dc4ed01.tar.bz2
spack-c13329c25a85fd26986746fc5adf818f9dc4ed01.tar.xz
spack-c13329c25a85fd26986746fc5adf818f9dc4ed01.zip
Merge pull request #155 from epfl-scitas/packages/mvapich2
packages/mvapich2 : added support for process managers and network types
Diffstat (limited to 'var')
-rw-r--r--var/spack/packages/mvapich2/package.py224
1 files changed, 138 insertions, 86 deletions
diff --git a/var/spack/packages/mvapich2/package.py b/var/spack/packages/mvapich2/package.py
index ca0b1287c1..dc2b2cb23f 100644
--- a/var/spack/packages/mvapich2/package.py
+++ b/var/spack/packages/mvapich2/package.py
@@ -1,104 +1,156 @@
-import os
from spack import *
+
class Mvapich2(Package):
- """mvapich2 is an MPI implmenetation for infiniband networks."""
+ """MVAPICH2 is an MPI implementation for Infiniband networks."""
homepage = "http://mvapich.cse.ohio-state.edu/"
- version('1.9', '5dc58ed08fd3142c260b70fe297e127c',
- url="http://mvapich.cse.ohio-state.edu/download/mvapich2/mv2/mvapich2-1.9.tgz")
- patch('ad_lustre_rwcontig_open_source.patch', when='@1.9')
+ version('2.2a', 'b8ceb4fc5f5a97add9b3ff1b9cbe39d2',
+ url='http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.2a.tar.gz')
version('2.0', '9fbb68a4111a8b6338e476dc657388b4',
url='http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.0.tar.gz')
- provides('mpi@:2.2', when='@1.9') # MVAPICH2-1.9 supports MPI 2.2
- provides('mpi@:3.0', when='@2.0') # MVAPICH2-2.0 supports MPI 3.0
-
-
- def install(self, spec, prefix):
- # we'll set different configure flags depending on our environment
- configure_args = []
-
- # TODO: The MPICH*_FLAGS have a different name for 1.9
+ version('1.9', '5dc58ed08fd3142c260b70fe297e127c',
+ url="http://mvapich.cse.ohio-state.edu/download/mvapich2/mv2/mvapich2-1.9.tgz")
+ patch('ad_lustre_rwcontig_open_source.patch', when='@1.9')
+ provides('mpi@:2.2', when='@1.9') # MVAPICH2-1.9 supports MPI 2.2
+ provides('mpi@:3.0', when='@2.0:') # MVAPICH2-2.0 supports MPI 3.0
+
+ variant('debug', default=False, description='Enables debug information and error messages at run-time')
+
+ ##########
+ # TODO : Process managers should be grouped into the same variant, as soon as variant capabilities will be extended
+ # See https://groups.google.com/forum/#!topic/spack/F8-f8B4_0so
+ SLURM = 'slurm'
+ HYDRA = 'hydra'
+ GFORKER = 'gforker'
+ REMSHELL = 'remshell'
+ SLURM_INCOMPATIBLE_PMS = (HYDRA, GFORKER, REMSHELL)
+ variant(SLURM, default=False, description='Sets slurm as the only process manager')
+ variant(HYDRA, default=False, description='Sets hydra as one of the process managers')
+ variant(GFORKER, default=False, description='Sets gforker as one of the process managers')
+ variant(REMSHELL, default=False, description='Sets remshell as one of the process managers')
+ ##########
+
+ ##########
+ # TODO : Network types should be grouped into the same variant, as soon as variant capabilities will be extended
+ PSM = 'psm'
+ SOCK = 'sock'
+ NEMESISIBTCP = 'nemesisibtcp'
+ NEMESISIB = 'nemesisib'
+ NEMESIS = 'nemesis'
+ SUPPORTED_NETWORKS = (PSM, SOCK, NEMESIS, NEMESISIB, NEMESISIBTCP)
+ variant(PSM, default=False, description='Configures a build for QLogic PSM-CH3')
+ variant(SOCK, default=False, description='Configures a build for TCP/IP-CH3')
+ variant(NEMESISIBTCP, default=False, description='Configures a build for both OFA-IB-Nemesis and TCP/IP-Nemesis')
+ variant(NEMESISIB, default=False, description='Configures a build for OFA-IB-Nemesis')
+ variant(NEMESIS, default=False, description='Configures a build for TCP/IP-Nemesis')
+ ##########
+
+ # FIXME : CUDA support is missing
+
+ @staticmethod
+ def enabled(x):
+ """
+ Given a variant name returns the string that means the variant is enabled
+
+ :param x: variant name
+ :return:
+ """
+ return '+' + x
+
+ def set_build_type(self, spec, configure_args):
+ """
+ Appends to configure_args the flags that depends only on the build type (i.e. release or debug)
+
+ :param spec: spec
+ :param configure_args: list of current configure arguments
+ """
if '+debug' in spec:
- # set configure flags for debug build
- configure_args.append("--disable-fast")
- configure_args.append("--enable-g=dbg")
- configure_args.append("--enable-error-checking=runtime")
- configure_args.append("--enable-error-messages=all")
- configure_args.append("--enable-nmpi-as-mpi")
-
- if "%gnu" in spec:
- # set variables for GNU compilers
- os.environ['MPICHLIB_CFLAGS'] = "-g -O0"
- os.environ['MPICHLIB_CXXFLAGS'] = "-g -O0"
- os.environ['MPICHLIB_FFLAGS'] = "-g -O0 -fno-second-underscore"
- os.environ['MPICHLIB_F90FLAGS'] = "-g -O0 -fno-second-underscore"
- elif "%intel" in spec:
- # set variables for Inel compilers
- os.environ['MPICHLIB_CFLAGS'] = "-g -O0"
- os.environ['MPICHLIB_CXXFLAGS'] = "-g -O0"
- os.environ['MPICHLIB_FFLAGS'] = "-g -O0"
- os.environ['MPICHLIB_F90FLAGS'] = "-g -O0"
- elif "%pgi" in spec:
- # set variables for PGI compilers
- os.environ['MPICHLIB_CFLAGS'] = "-g -O0 -fPIC"
- os.environ['MPICHLIB_CXXFLAGS'] = "-g -O0 -fPIC"
- os.environ['MPICHLIB_FFLAGS'] = "-g -O0 -fPIC"
- os.environ['MPICHLIB_F90FLAGS'] = "-g -O0 -fPIC"
-
+ build_type_options = [
+ "--disable-fast",
+ "--enable-error-checking=runtime",
+ "--enable-error-messages=all",
+ "--enable-g=dbg", "--enable-debuginfo" # Permits debugging with TotalView
+ ]
else:
- # set configure flags for normal optimizations
- configure_args.append("--enable-fast=all")
- configure_args.append("--enable-g=dbg")
- configure_args.append("--enable-nmpi-as-mpi")
-
- if "%gnu" in spec:
- # set variables for what compilers
- os.environ['MPICHLIB_CFLAGS'] = "-g -O2"
- os.environ['MPICHLIB_CXXFLAGS'] = "-g -O2"
- os.environ['MPICHLIB_FFLAGS'] = "-g -O2 -fno-second-underscore"
- os.environ['MPICHLIB_F90FLAGS'] = "-g -O2 -fno-second-underscore"
- elif "%intel" in spec:
- # set variables for Inel compilers
- os.environ['MPICHLIB_CFLAGS'] = "-g -O2"
- os.environ['MPICHLIB_CXXFLAGS'] = "-g -O2"
- os.environ['MPICHLIB_FFLAGS'] = "-g -O2"
- os.environ['MPICHLIB_F90FLAGS'] = "-g -O2"
- elif "%pgi" in spec:
- # set variables for PGI compilers
- os.environ['MPICHLIB_CFLAGS'] = "-g -O2 -fPIC"
- os.environ['MPICHLIB_CXXFLAGS'] = "-g -O2 -fPIC"
- os.environ['MPICHLIB_FFLAGS'] = "-g -O2 -fPIC"
- os.environ['MPICHLIB_F90FLAGS'] = "-g -O2 -fPIC"
-
- # determine network type by variant
- if "+psm" in spec:
- # throw this flag on QLogic systems to use PSM
- configure_args.append("--with-device=ch3:psm")
+ build_type_options = ["--enable-fast=all"]
+
+ configure_args.extend(build_type_options)
+
+ def set_process_manager(self, spec, configure_args):
+ """
+ Appends to configure_args the flags that will enable the appropriate process managers
+
+ :param spec: spec
+ :param configure_args: list of current configure arguments
+ """
+ # Check that slurm variant is not activated together with other pm variants
+ has_slurm_incompatible_variants = any(self.enabled(x) in spec for x in Mvapich2.SLURM_INCOMPATIBLE_PMS)
+ if self.enabled(Mvapich2.SLURM) in spec and has_slurm_incompatible_variants:
+ raise RuntimeError(" %s : 'slurm' cannot be activated together with other process managers" % self.name)
+
+ process_manager_options = []
+ if self.enabled(Mvapich2.SLURM) in spec:
+ process_manager_options = [
+ "--with-pm=slurm"
+ ]
+ elif has_slurm_incompatible_variants:
+ pms = []
+ # The variant name is equal to the process manager name in the configuration options
+ for x in Mvapich2.SLURM_INCOMPATIBLE_PMS:
+ if self.enabled(x) in spec:
+ pms.append(x)
+ process_manager_options = [
+ "--with-pm=%s" % ':'.join(pms)
+ ]
+ configure_args.extend(process_manager_options)
+
+ def set_network_type(self, spec, configure_args):
+ # Check that at most one variant has been activated
+ count = 0
+ for x in Mvapich2.SUPPORTED_NETWORKS:
+ if self.enabled(x) in spec:
+ count += 1
+ if count > 1:
+ raise RuntimeError('network variants are mutually exclusive (only one can be selected at a time)')
+
+ # From here on I can suppose that ony one variant has been selected
+ if self.enabled(Mvapich2.PSM) in spec:
+ network_options = ["--with-device=ch3:psm"]
+ elif self.enabled(Mvapich2.SOCK) in spec:
+ network_options = ["--with-device=ch3:sock"]
+ elif self.enabled(Mvapich2.NEMESISIBTCP) in spec:
+ network_options = ["--with-device=ch3:nemesis:ib,tcp"]
+ elif self.enabled(Mvapich2.NEMESISIB) in spec:
+ network_options = ["--with-device=ch3:nemesis:ib"]
+ elif self.enabled(Mvapich2.NEMESIS) in spec:
+ network_options = ["--with-device=ch3:nemesis"]
else:
- # throw this flag on IB systems
- configure_args.append("--with-device=ch3:mrail", "--with-rdma=gen2")
-
- # TODO: shared-memory build
-
- # TODO: CUDA
+ network_options = ["--with-device=ch3:mrail", "--with-rdma=gen2"]
- # TODO: other file systems like panasis
+ configure_args.extend(network_options)
- configure(
- "--prefix=" + prefix,
- "--enable-f77", "--enable-fc", "--enable-cxx",
- "--enable-shared", "--enable-sharedlibs=gcc",
- "--enable-debuginfo",
- "--with-pm=no", "--with-pmi=slurm",
- "--enable-romio", "--with-file-system=lustre+nfs+ufs",
- "--disable-mpe", "--without-mpe",
+ def install(self, spec, prefix):
+ # we'll set different configure flags depending on our environment
+ configure_args = [
+ "--prefix=%s" % prefix,
+ "--enable-shared",
+ "--enable-romio",
"--disable-silent-rules",
- *configure_args)
-
+ ]
+ if not self.compiler.f77 and not self.compiler.fc:
+ configure_args.append("--enable-fortran=none")
+
+ # Set the type of the build (debug, release)
+ self.set_build_type(spec, configure_args)
+ # Set the process manager
+ self.set_process_manager(spec, configure_args)
+ # Determine network type by variant
+ self.set_network_type(spec, configure_args)
+
+ configure(*configure_args)
make()
-
make("install")