Adds a package for LvArray (#19221)

* RAJA and CHAI changes.

* Added LvArray package.
This commit is contained in:
Ben Corbett 2020-10-29 11:52:10 -07:00 committed by GitHub
parent e2a720930a
commit 305d8d9b1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 347 additions and 8 deletions

View File

@ -25,6 +25,8 @@ class Chai(CMakePackage, CudaPackage):
variant('shared', default=True, description='Build Shared Libs')
variant('raja', default=False, description='Build plugin for RAJA')
variant('benchmarks', default=True, description='Build benchmarks.')
variant('examples', default=True, description='Build examples.')
depends_on('cmake@3.8:', type='build')
depends_on('umpire')
@ -42,7 +44,7 @@ def cmake_args(self):
if '+cuda' in spec:
options.extend([
'-DENABLE_CUDA=ON',
'-DCUDA_TOOLKIT_ROOT_DIR=%s' % (spec['cuda'].prefix)])
'-DCUDA_TOOLKIT_ROOT_DIR=' + spec['cuda'].prefix])
if not spec.satisfies('cuda_arch=none'):
cuda_arch = spec.variants['cuda_arch'].value
@ -52,10 +54,20 @@ def cmake_args(self):
else:
options.append('-DENABLE_CUDA=OFF')
if '+raja' in spec:
options.extend(['-DENABLE_RAJA_PLUGIN=ON',
'-DRAJA_DIR=' + spec['raja'].prefix])
options.append('-Dumpire_DIR:PATH='
+ spec['umpire'].prefix.share.umpire.cmake)
options.append('-DENABLE_TESTS={0}'.format(
'ON' if self.run_tests else 'OFF'))
options.append('-DENABLE_BENCHMARKS={0}'.format(
'ON' if '+benchmarks' in spec else 'OFF'))
options.append('-DENABLE_EXAMPLES={0}'.format(
'ON' if '+examples' in spec else 'OFF'))
return options

View File

@ -0,0 +1,326 @@
# 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)
from spack import *
import warnings
import socket
import os
from os import environ as env
from os.path import join as pjoin
def cmake_cache_entry(name, value, comment=""):
"""Generate a string for a cmake cache variable"""
return 'set(%s "%s" CACHE PATH "%s")\n\n' % (name, value, comment)
def cmake_cache_string(name, string, comment=""):
"""Generate a string for a cmake cache variable"""
return 'set(%s "%s" CACHE STRING "%s")\n\n' % (name, string, comment)
def cmake_cache_option(name, boolean_value, comment=""):
"""Generate a string for a cmake configuration option"""
value = "ON" if boolean_value else "OFF"
return 'set(%s %s CACHE BOOL "%s")\n\n' % (name, value, comment)
class Lvarray(CMakePackage, CudaPackage):
"""LvArray portable HPC containers."""
homepage = "https://github.com/GEOSX/lvarray"
git = "https://github.com/GEOSX/LvArray.git"
version('develop', branch='develop', submodules='True')
version('main', branch='main', submodules='True')
version('0.1.0', tag='v0.1.0', submodules='True')
variant('shared', default=True, description='Build Shared Libs')
variant('umpire', default=False, description='Build Umpire support')
variant('chai', default=False, description='Build Chai support')
variant('caliper', default=False, description='Build Caliper support')
variant('tests', default=True, description='Build tests')
variant('benchmarks', default=False, description='Build benchmarks')
variant('examples', default=False, description='Build examples')
variant('docs', default=False, description='Build docs')
variant('addr2line', default=True,
description='Build support for addr2line.')
depends_on('cmake@3.8:', type='build')
depends_on('cmake@3.9:', when='+cuda', type='build')
depends_on('raja')
depends_on('raja+cuda', when='+cuda')
depends_on('umpire', when='+umpire')
depends_on('umpire+cuda', when='+umpire+cuda')
depends_on('chai+raja', when='+chai')
depends_on('chai+raja+cuda', when='+chai+cuda')
depends_on('caliper', when='+caliper')
depends_on('doxygen@1.8.13:', when='+docs', type='build')
depends_on('py-sphinx@1.6.3:', when='+docs', type='build')
phases = ['hostconfig', 'cmake', 'build', 'install']
@run_after('build')
@on_package_attributes(run_tests=True)
def check(self):
"""Searches the CMake-generated Makefile for the target ``test``
and runs it if found.
"""
with working_dir(self.build_directory):
ctest('-V', '--force-new-ctest-process', '-j 1')
@run_after('build')
def build_docs(self):
if '+docs' in self.spec:
with working_dir(self.build_directory):
make('docs')
def _get_sys_type(self, spec):
sys_type = str(spec.architecture)
# if on llnl systems, we can use the SYS_TYPE
if "SYS_TYPE" in env:
sys_type = env["SYS_TYPE"]
return sys_type
def _get_host_config_path(self, spec):
var = ''
if '+cuda' in spec:
var = '-'.join([var, 'cuda'])
hostname = socket.gethostname().rstrip('1234567890')
host_config_path = "%s-%s-%s%s.cmake" % (hostname,
self._get_sys_type(spec),
spec.compiler, var)
dest_dir = self.stage.source_path
host_config_path = os.path.abspath(pjoin(dest_dir, host_config_path))
return host_config_path
def hostconfig(self, spec, prefix, py_site_pkgs_dir=None):
"""
This method creates a 'host-config' file that specifies
all of the options used to configure and build Umpire.
For more details about 'host-config' files see:
http://software.llnl.gov/conduit/building.html
Note:
The `py_site_pkgs_dir` arg exists to allow a package that
subclasses this package provide a specific site packages
dir when calling this function. `py_site_pkgs_dir` should
be an absolute path or `None`.
This is necessary because the spack `site_packages_dir`
var will not exist in the base class. For more details
on this issue see: https://github.com/spack/spack/issues/6261
"""
#######################
# Compiler Info
#######################
c_compiler = env["SPACK_CC"]
cpp_compiler = env["SPACK_CXX"]
#######################################################################
# By directly fetching the names of the actual compilers we appear
# to doing something evil here, but this is necessary to create a
# 'host config' file that works outside of the spack install env.
#######################################################################
sys_type = self._get_sys_type(spec)
##############################################
# Find and record what CMake is used
##############################################
cmake_exe = spec['cmake'].command.path
cmake_exe = os.path.realpath(cmake_exe)
host_config_path = self._get_host_config_path(spec)
cfg = open(host_config_path, "w")
cfg.write("#{0}\n".format("#" * 80))
cfg.write("# Generated host-config - Edit at own risk!\n")
cfg.write("#{0}\n".format("#" * 80))
cfg.write("#{0}\n".format("-" * 80))
cfg.write("# SYS_TYPE: {0}\n".format(sys_type))
cfg.write("# Compiler Spec: {0}\n".format(spec.compiler))
cfg.write("# CMake executable path: %s\n" % cmake_exe)
cfg.write("#{0}\n\n".format("-" * 80))
#######################
# Compiler Settings
#######################
cfg.write("#{0}\n".format("-" * 80))
cfg.write("# Compilers\n")
cfg.write("#{0}\n\n".format("-" * 80))
cfg.write(cmake_cache_entry("CMAKE_C_COMPILER", c_compiler))
cfg.write(cmake_cache_entry("CMAKE_CXX_COMPILER", cpp_compiler))
# use global spack compiler flags
cflags = ' '.join(spec.compiler_flags['cflags'])
if cflags:
cfg.write(cmake_cache_entry("CMAKE_C_FLAGS", cflags))
cxxflags = ' '.join(spec.compiler_flags['cxxflags'])
if cxxflags:
cfg.write(cmake_cache_entry("CMAKE_CXX_FLAGS", cxxflags))
release_flags = "-O3 -DNDEBUG"
cfg.write(cmake_cache_string("CMAKE_CXX_FLAGS_RELEASE",
release_flags))
reldebinf_flags = "-O3 -g -DNDEBUG"
cfg.write(cmake_cache_string("CMAKE_CXX_FLAGS_RELWITHDEBINFO",
reldebinf_flags))
debug_flags = "-O0 -g"
cfg.write(cmake_cache_string("CMAKE_CXX_FLAGS_DEBUG", debug_flags))
if "+cuda" in spec:
cfg.write("#{0}\n".format("-" * 80))
cfg.write("# Cuda\n")
cfg.write("#{0}\n\n".format("-" * 80))
cfg.write(cmake_cache_option("ENABLE_CUDA", True))
cfg.write(cmake_cache_entry("CMAKE_CUDA_STANDARD", 14))
cudatoolkitdir = spec['cuda'].prefix
cfg.write(cmake_cache_entry("CUDA_TOOLKIT_ROOT_DIR",
cudatoolkitdir))
cudacompiler = "${CUDA_TOOLKIT_ROOT_DIR}/bin/nvcc"
cfg.write(cmake_cache_entry("CMAKE_CUDA_COMPILER", cudacompiler))
cmake_cuda_flags = ('-restrict --expt-extended-lambda -Werror '
'cross-execution-space-call,reorder,'
'deprecated-declarations')
archSpecifiers = ("-mtune", "-mcpu", "-march", "-qtune", "-qarch")
for archSpecifier in archSpecifiers:
for compilerArg in spec.compiler_flags['cxxflags']:
if compilerArg.startswith(archSpecifier):
cmake_cuda_flags += ' -Xcompiler ' + compilerArg
if not spec.satisfies('cuda_arch=none'):
cuda_arch = spec.variants['cuda_arch'].value
cmake_cuda_flags += ' -arch sm_{0}'.format(cuda_arch[0])
cfg.write(cmake_cache_string("CMAKE_CUDA_FLAGS", cmake_cuda_flags))
cfg.write(cmake_cache_string("CMAKE_CUDA_FLAGS_RELEASE",
"-O3 -Xcompiler -O3 -DNDEBUG"))
cfg.write(cmake_cache_string("CMAKE_CUDA_FLAGS_RELWITHDEBINFO",
"-O3 -g -lineinfo -Xcompiler -O3"))
cfg.write(cmake_cache_string("CMAKE_CUDA_FLAGS_DEBUG",
"-O0 -Xcompiler -O0 -g -G"))
else:
cfg.write(cmake_cache_option("ENABLE_CUDA", False))
cfg.write("#{0}\n".format("-" * 80))
cfg.write("# RAJA\n")
cfg.write("#{0}\n\n".format("-" * 80))
raja_dir = spec['raja'].prefix
cfg.write(cmake_cache_entry("RAJA_DIR", raja_dir))
cfg.write("#{0}\n".format("-" * 80))
cfg.write("# Umpire\n")
cfg.write("#{0}\n\n".format("-" * 80))
if "+umpire" in spec:
cfg.write(cmake_cache_option("ENABLE_UMPIRE", True))
umpire_dir = spec['umpire'].prefix
cfg.write(cmake_cache_entry("UMPIRE_DIR", umpire_dir))
else:
cfg.write(cmake_cache_option("ENABLE_UMPIRE", False))
cfg.write("#{0}\n".format("-" * 80))
cfg.write("# CHAI\n")
cfg.write("#{0}\n\n".format("-" * 80))
if "+chai" in spec:
cfg.write(cmake_cache_option("ENABLE_CHAI", True))
chai_dir = spec['chai'].prefix
cfg.write(cmake_cache_entry("CHAI_DIR", chai_dir))
else:
cfg.write(cmake_cache_option("ENABLE_CHAI", False))
cfg.write("#{0}\n".format("-" * 80))
cfg.write("# Caliper\n")
cfg.write("#{0}\n\n".format("-" * 80))
if "+caliper" in spec:
cfg.write("#{0}\n".format("-" * 80))
cfg.write("# Caliper\n")
cfg.write("#{0}\n\n".format("-" * 80))
cfg.write(cmake_cache_option("ENABLE_CALIPER", True))
caliper_dir = spec['caliper'].prefix
cfg.write(cmake_cache_entry("CALIPER_DIR", caliper_dir))
else:
cfg.write(cmake_cache_option("ENABLE_CALIPER", False))
cfg.write("#{0}\n".format("-" * 80))
cfg.write("# Documentation\n")
cfg.write("#{0}\n\n".format("-" * 80))
if "+docs" in spec:
sphinx_dir = spec['py-sphinx'].prefix
cfg.write(cmake_cache_string('SPHINX_EXECUTABLE',
os.path.join(sphinx_dir,
'bin',
'sphinx-build')))
doxygen_dir = spec['doxygen'].prefix
cfg.write(cmake_cache_string('DOXYGEN_EXECUTABLE',
os.path.join(doxygen_dir,
'bin',
'doxygen')))
cfg.write("#{0}\n".format("-" * 80))
cfg.write("# addr2line\n")
cfg.write("#{0}\n\n".format("-" * 80))
cfg.write(cmake_cache_option('ENABLE_ADDR2LINE', '+addr2line' in spec))
cfg.write("#{0}\n".format("-" * 80))
cfg.write("# Other\n")
cfg.write("#{0}\n\n".format("-" * 80))
def cmake_args(self):
spec = self.spec
host_config_path = self._get_host_config_path(spec)
options = []
options.extend(['-C', host_config_path])
# Shared libs
options.append(self.define_from_variant('BUILD_SHARED_LIBS', 'shared'))
if '~tests~examples~benchmarks' in spec:
options.append('-DENABLE_TESTS=OFF')
else:
options.append('-DENABLE_TESTS=ON')
if '~test' in spec:
options.append('-DDISABLE_UNIT_TESTS=ON')
elif "+tests" in spec and ('%intel' in spec or '%xl' in spec):
warnings.warn('The LvArray unit tests take an excessive amount of'
' time to build with the Intel or IBM compilers.')
options.append(self.define_from_variant('ENABLE_EXAMPLES', 'examples'))
options.append(self.define_from_variant('ENABLE_BENCHMARKS',
'benchmarks'))
options.append(self.define_from_variant('ENABLE_DOCS', 'docs'))
return options

View File

@ -32,6 +32,8 @@ class Raja(CMakePackage, CudaPackage):
variant('openmp', default=True, description='Build OpenMP backend')
variant('shared', default=True, description='Build Shared Libs')
variant('examples', default=True, description='Build examples.')
variant('exercises', default=True, description='Build exercises.')
depends_on('cmake@3.8:', type='build')
depends_on('cmake@3.9:', when='+cuda', type='build')
@ -41,7 +43,7 @@ def cmake_args(self):
options = []
options.append('-DENABLE_OPENMP={0}'.format(
'ON' if '+openmp' in spec else 'Off'))
'ON' if '+openmp' in spec else 'OFF'))
if '+cuda' in spec:
options.extend([
@ -57,8 +59,11 @@ def cmake_args(self):
options.append('-DBUILD_SHARED_LIBS={0}'.format(
'ON' if '+shared' in spec else 'OFF'))
options.append('-DENABLE_CHAI={0}'.format(
'ON' if '+chai' in spec else 'OFF'))
options.append('-DENABLE_EXAMPLES={0}'.format(
'ON' if '+examples' in spec else 'OFF'))
options.append('-DENABLE_EXERCISES={0}'.format(
'ON' if '+exercises' in spec else 'OFF'))
# Work around spack adding -march=ppc64le to SPACK_TARGET_ARGS which
# is used by the spack compiler wrapper. This can go away when BLT
@ -68,8 +73,4 @@ def cmake_args(self):
else:
options.append('-DENABLE_TESTS=ON')
if '+chai' in spec:
options.extend([
'-DENABLE_CHAI=ON'])
return options