summaryrefslogtreecommitdiff
path: root/var
diff options
context:
space:
mode:
authoracastanedam <acastanedam@gmail.com>2021-09-25 08:58:46 +0200
committerGitHub <noreply@github.com>2021-09-25 00:58:46 -0600
commitb67cfc0fd1e1c5265a631d0e48e4a116c8ba6f31 (patch)
tree7c5ddb08ea8c59e8159023be39461cfffa412762 /var
parente3dc586064cc1e95615e99832ca785f64e202038 (diff)
downloadspack-b67cfc0fd1e1c5265a631d0e48e4a116c8ba6f31.tar.gz
spack-b67cfc0fd1e1c5265a631d0e48e4a116c8ba6f31.tar.bz2
spack-b67cfc0fd1e1c5265a631d0e48e4a116c8ba6f31.tar.xz
spack-b67cfc0fd1e1c5265a631d0e48e4a116c8ba6f31.zip
gpi-2: improve GPI-2 installation (#25808)
Based on the original script of R. Mijakovic further improvements of GPI-2 installation, in particular different official versions, configuration setups and even testing. Importantly, the non-autotools way of installation for older versions is also considered, which is relevant for some packages using GPI-2. Co-authored-by: Arcesio Castaneda Medina <arcesio.castaneda.medina@itwm.fraunhofer.de>
Diffstat (limited to 'var')
-rw-r--r--var/spack/repos/builtin/packages/gpi-2/package.py149
1 files changed, 118 insertions, 31 deletions
diff --git a/var/spack/repos/builtin/packages/gpi-2/package.py b/var/spack/repos/builtin/packages/gpi-2/package.py
index b004318ac3..20ebe86a32 100644
--- a/var/spack/repos/builtin/packages/gpi-2/package.py
+++ b/var/spack/repos/builtin/packages/gpi-2/package.py
@@ -3,77 +3,164 @@
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+from os import environ
from spack import *
class Gpi2(AutotoolsPackage):
- """GPI-2 is an API for the development of scalable, asynchronous and fault
- tolerant parallel applications. It implements the GASPI specification
- (www.gaspi.de)"""
+ """GPI-2 implements GASPI specification, an API specification for
+ asynchronous communication. It provides a flexible, scalable and
+ fault tolerant interface for parallel applications.
+ """
- homepage = "http://www.gpi-site.com"
- url = "https://github.com/cc-hpc-itwm/GPI-2/archive/v1.4.0.tar.gz"
- git = "https://github.com/cc-hpc-itwm/GPI-2.git"
- maintainers = ['robert-mijakovic']
+ homepage = 'http://www.gpi-site.com'
+ url = 'https://github.com/cc-hpc-itwm/GPI-2/archive/refs/tags/v1.5.1.tar.gz'
+ git = 'https://github.com/cc-hpc-itwm/GPI-2.git'
+
+ maintainers = ['robert-mijakovic', 'acastanedam']
version('develop', branch='next')
version('master', branch='master')
- version('1.4.0', sha256='3b8ffb45346b2fe56aaa7ba15a515e62f9dff45a28e6a014248e20094bbe50a1')
+ version('1.5.1', sha256='4dac7e9152694d2ec4aefd982a52ecc064a8cb8f2c9eab0425428127c3719e2e')
+ version('1.5.0', sha256='ee299ac1c08c38c9e7871d4af745f1075570ddbb708bb62d82257244585e5183')
+ version('1.4.0', sha256='3b8ffb45346b2fe56aaa7ba15a515e62f9dff45a28e6a014248e20094bbe50a1')
+ version('1.3.2', sha256='83dbfb2e4bed28ef4e2ae430d30505874b4b50252e2f31dc422b3bc191a87ab0')
+ version('1.3.1', sha256='414fa352e7b478442e6f5d0b51ff00deeb4fc705de805676c0e68829f3f30967')
+ version('1.3.0', sha256='ffaa5c6abfbf79aec6389ab7caaa2c8a91bce24fd046d9741418ff815cd445d2')
+ version('1.2.0', sha256='0a1411276aa0787382573df5e0f60cc38ca8079f2353fb7a7e8dc57050a7d2cb')
+ version('1.1.0', sha256='626727565a8b78be0dc8883539b01aaff2bb3bd42395899643bc4d6cc2313773')
+ version('1.0.2', sha256='b03b4ac9f0715279b2a5e064fd85047cb640a85c2361d732930307f8bbf2aeb8')
+ version('1.0.1', sha256='b1341bb39e7e70334d7acf831fe7f2061376e7516b44d18b31797748c2a169a3')
+
+ variant('fortran', default=False, description='Enable Fortran modules')
variant('mpi', default=False, description='Enable MPI support')
- variant('fortran', default=True, description='Enable Fortran modules')
variant(
'fabrics',
values=disjoint_sets(
- ('auto',), ('verbs',), ('ethernet',),
+ ('auto',), ('infiniband',), ('ethernet',),
).with_non_feature_values('auto', 'none'),
description="List of fabrics that are enabled; "
- "'auto' lets gpi-2 determine",
+ "'none' use GPI-2 default (infiniband), "
+ "'infiniband' will use 'rdma-core' from Spack",
)
-
variant(
'schedulers',
values=disjoint_sets(
('auto',), ('loadleveler',), ('pbs',), ('slurm',)
).with_non_feature_values('auto', 'none'),
- description="List of schedulers for which support is enabled; "
- "'auto' lets gpi-2 determine",
+ description="List of lauchers for which support is enabled; "
+ "'auto', 'none' or 'pbs' use 'gaspi_run.ssh'",
)
- depends_on('autoconf', type='build') # autogen.sh - autoreconf
- depends_on('automake', type='build') # autogen.sh - automake
- depends_on('libtool', type='build')
- depends_on('m4', type='build')
- depends_on('mpi', when='+mpi')
+ depends_on('autoconf', type='build', when='@1.4.0:') # autogen.sh - autoreconf
+ depends_on('automake', type='build', when='@1.4.0:') # autogen.sh - automake
+ depends_on('libtool', type='build', when='@1.4.0:')
+ depends_on('m4', type='build', when='@1.4.0:')
- depends_on('rdma-core', when='fabrics=verbs')
+ depends_on('gawk', type='run')
+ depends_on('openssh', type='run')
+ depends_on('mpi', when='+mpi')
+ depends_on('rdma-core', when='fabrics=infiniband')
depends_on('slurm', when='schedulers=slurm')
- def with_or_without_verbs(self, activated):
- opt = 'infiniband'
- # If the option has not been activated return
- # --without-infiniband
- if not activated:
- return '--without-{0}'.format(opt)
- return '--with-{0}={1}'.format(opt, self.spec['rdma-core'].prefix)
+ conflicts('%gcc@10:', when='@:1.3.2', msg='gcc>10 is not supported')
+ conflicts('schedulers=slurm', when='@:1.3.2', msg='Slurm is not supported')
+
+ def set_specific_cflags(self, spec):
+ if spec.satisfies('@:1.4.0%gcc@10.1.0:'):
+ environ['CFLAGS'] = '-fcommon'
+
+ # GPI-2 without autotools
+ @when('@:1.3.2')
+ def autoreconf(self, spec, prefix):
+ touch = which('touch')
+ touch('configure')
+ pass
+ @when('@:1.3.2')
+ def configure(self, spec, prefix):
+ pass
+
+ @when('@:1.3.2')
+ def build(self, spec, prefix):
+ self.old_install(spec, prefix)
+ pass
+
+ @when('@:1.3.2')
+ def old_install(self, spec, prefix):
+ spec = self.spec
+
+ self.set_specific_cflags(spec)
+
+ config_args = ['-p {0}'.format(prefix)]
+ if 'fabrics=ethernet' in spec:
+ config_args += ['--with-ethernet']
+ elif 'fabrics=infiniband' in spec:
+ config_args += ['--with-infiniband={0}'.format(spec['rdma-core'].prefix)]
+ if 'schedulers=loadleveler' in spec:
+ config_args += ['--with-ll']
+ if '+fortran' in spec:
+ config_args += ['--with-fortran=true']
+ else:
+ config_args += ['--with-fortran=false']
+ if '+mpi' in spec:
+ config_args += ['--with-mpi={0}'.format(spec['mpi'].prefix)]
+
+ with working_dir(self.build_directory):
+ install = which('./install.sh')
+ install(*config_args)
+
+ @when('@:1.3.2')
+ def install(self, spec, prefix):
+ pass
+
+ # GPI-2 with autotools
+ @when('@1.4.0:')
def autoreconf(self, spec, prefix):
bash = which('bash')
bash('./autogen.sh')
+ def with_or_without_infiniband(self, activated):
+ opt = 'infiniband'
+ if not activated:
+ return '--without-{0}'.format(opt)
+ return '--with-{0}={1}'.format(opt, self.spec['rdma-core'].prefix)
+
+ @when('@1.4.0:')
def configure_args(self):
spec = self.spec
config_args = []
- config_args.extend(self.with_or_without('mpi'))
- config_args.extend(self.with_or_without('fortran'))
+ self.set_specific_cflags(spec)
+
+ config_args.extend(self.with_or_without('fortran'))
+ # Mpi
+ if '+mpi' in spec:
+ config_args += ['--with-mpi={0}'.format(spec['mpi'].prefix)]
# Fabrics
- if 'fabrics=auto' not in spec:
+ if 'fabrics=none' not in spec:
config_args.extend(self.with_or_without('fabrics'))
# Schedulers
- if 'schedulers=auto' not in spec:
+ if 'schedulers=none' not in spec:
config_args.extend(self.with_or_without('schedulers'))
return config_args
+
+ def set_machines(self):
+ with open('{0}/tests/machines'.format(self.build_directory), 'w') as mfile:
+ hostname = environ['HOSTNAME']
+ mfile.write('{0}\n{0}\n'.format(hostname))
+
+ # In principle it is possible to run tests for lower versions, but
+ # for them NUMA is set by default, thus the number of processes is
+ # limited by the number of sockets, i.e., it there is just one,
+ # the machine file can not contain more than one host
+ @when('@1.4.0:')
+ def check(self):
+ self.set_machines()
+ with working_dir('{0}/tests'.format(self.build_directory)):
+ bash = which('bash')
+ bash('./runtests.sh')