summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAxel Huebl <axel.huebl@plasma.ninja>2020-03-25 14:54:13 -0700
committerGitHub <noreply@github.com>2020-03-25 14:54:13 -0700
commit9c0b1974606e03e9a780d2a8208aeb041e191d79 (patch)
tree5ec4666568e1df3d310670bff8955f95dea04737
parentb42a96df980458602c6c5314b3d3fac08f2d7442 (diff)
downloadspack-9c0b1974606e03e9a780d2a8208aeb041e191d79.tar.gz
spack-9c0b1974606e03e9a780d2a8208aeb041e191d79.tar.bz2
spack-9c0b1974606e03e9a780d2a8208aeb041e191d79.tar.xz
spack-9c0b1974606e03e9a780d2a8208aeb041e191d79.zip
WarpX: MPI, Backends, Ascent (#15647)
Expose serial/parallel build (MPI), CUDA/OpenMP backends, Clang, and Ascent bindings. Interestingly, `warpx +ascent` currently leads to an infinite loop in the Spack concretizer.
-rw-r--r--var/spack/repos/builtin/packages/warpx/package.py65
1 files changed, 45 insertions, 20 deletions
diff --git a/var/spack/repos/builtin/packages/warpx/package.py b/var/spack/repos/builtin/packages/warpx/package.py
index a729f9ac28..55cdf3cb13 100644
--- a/var/spack/repos/builtin/packages/warpx/package.py
+++ b/var/spack/repos/builtin/packages/warpx/package.py
@@ -24,21 +24,32 @@ class Warpx(MakefilePackage):
variant('dims',
default='3',
- values=('2', '3'),
+ values=('2', '3', 'rz'),
multi=False,
description='Number of spatial dimensions')
-
+ variant('backend',
+ default='openmp',
+ values=('openmp', 'cuda', 'hip'),
+ multi=True,
+ description='Programming model for compute kernels')
+ variant('mpi', default=True, description='Enable MPI support')
variant('psatd', default=False, description='Enable PSATD solver')
variant('debug', default=False, description='Enable debugging features')
variant('tprof', default=True, description='Enable tiny profiling features')
- variant('openmp', default=True, description='Enable OpenMP features')
variant('openpmd', default=True, description='Enable openPMD I/O')
+ variant('ascent', default=False, description='Enable Ascent in situ vis')
- depends_on('mpi')
+ depends_on('cuda', when='backend=cuda')
+ depends_on('mpi', when='+mpi')
depends_on('fftw@3:', when='+psatd')
+ depends_on('fftw +mpi', when='+psatd +mpi')
depends_on('pkgconfig', type='build', when='+openpmd')
- depends_on('python', type='build') # FIXME upstream
- depends_on('openpmd-api@0.11.0:,dev +mpi', when='+openpmd')
+ depends_on('python', type='build') # AMReX' build system info
+ depends_on('openpmd-api@0.11.0:,dev', when='+openpmd')
+ depends_on('openpmd-api +mpi', when='+openpmd +mpi')
+ depends_on('ascent', when='+ascent')
+ depends_on('ascent +cuda', when='+ascent backend=cuda')
+ depends_on('ascent +mpi ^conduit~hdf5', when='+ascent +mpi')
resource(name='amrex',
git='https://github.com/AMReX-Codes/amrex.git',
@@ -49,36 +60,50 @@ class Warpx(MakefilePackage):
git='https://bitbucket.org/berkeleylab/picsar.git',
tag='master')
+ conflicts('backend=cuda', when='backend=hip',
+ msg='WarpX can be compiled with either CUDA or HIP backend')
+ conflicts('backend=hip', msg='WarpX\' HIP backend is not yet implemented')
+
def edit(self, spec, prefix):
comp = 'gcc'
- vendors = {'%gcc': 'gcc', '%intel': 'intel'}
+ vendors = {'%gcc': 'gcc', '%intel': 'intel', '%clang': 'llvm'}
for key, value in vendors.items():
if self.spec.satisfies(key):
comp = value
- def torf(s):
- "Returns the string TRUE or FALSE"
- return repr(s in spec).upper()
+ # Returns the string TRUE or FALSE
+ torf = lambda s: repr(s in spec).upper()
+
+ try:
+ self.compiler.openmp_flag
+ except UnsupportedCompilerFlag:
+ use_omp = 'FALSE'
+ else:
+ use_omp = torf('backend=openmp')
makefile = FileFilter('GNUmakefile')
makefile.filter('AMREX_HOME .*', 'AMREX_HOME = amrex')
makefile.filter('PICSAR_HOME .*', 'PICSAR_HOME = picsar')
makefile.filter('COMP .*', 'COMP = {0}'.format(comp))
- makefile.filter('DIM .*',
- 'DIM = {0}'.format(int(spec.variants['dims'].value)))
+ makefile.filter('USE_MPI .*',
+ 'USE_MPI = {0}'.format(torf('+mpi')))
+ if 'dims=rz' in spec:
+ makefile.filter('USE_RZ .*', 'USE_RZ = TRUE')
+ else:
+ makefile.filter('DIM .*', 'DIM = {0}'.format(
+ int(spec.variants['dims'].value)))
makefile.filter('USE_PSATD .*',
'USE_PSATD = {0}'.format(torf('+psatd')))
- try:
- self.compiler.openmp_flag
- except UnsupportedCompilerFlag:
- use_omp = 'FALSE'
- else:
- use_omp = torf('+openmp')
- use_openpmd = torf('+openpmd')
makefile.filter('USE_OMP .*',
'USE_OMP = {0}'.format(use_omp))
+ makefile.filter('USE_GPU .*',
+ 'USE_GPU = {0}'.format(torf('backend=cuda')))
+ makefile.filter('USE_HIP .*',
+ 'USE_HIP = {0}'.format(torf('backend=hip')))
makefile.filter('USE_OPENPMD .*',
- 'USE_OPENPMD = {0}'.format(use_openpmd))
+ 'USE_OPENPMD = {0}'.format(torf('+openpmd')))
+ makefile.filter('USE_ASCENT_INSITU .*',
+ 'USE_ASCENT_INSITU = {0}'.format(torf('+ascent')))
makefile.filter('DEBUG .*',
'DEBUG = {0}'.format(torf('+debug')))
makefile.filter('TINY_PROFILE .*',