Ecp hdf5 vol (#35195)

* ECP-SDK: enable hdf5 VOL adapters
- When +hdf5, enable VOL adapters suitable for the SDK.
- Each VOL package must prepend to the HDF5_PLUGIN_PATH.
- hdf5: 1.13.3 will break existing VOL packages, constrain
  VOLs related to SDK and add note to keep 1.13.2 available.
- hdf5-vol-async:
    - Do not set HDF5_VOL_CONNECTOR, consumers must opt-in.
    - Enforce DAG constraints on MPI to require threaded version.
    - Depend on an explicit version of argbots to relax
      concretization issues in other spack environments.
- paraview: fix compiler flag usage for the 110 ABI (followup to #33617).
* ECP Data and ViS: Add constraits for HDF5 VOLS
* CI: HDF5 1.14 builds without VisIt
* hdf5-vol-async: Update docs string

---------

Co-authored-by: Stephen McDowell <stephen.mcdowell@kitware.com>
This commit is contained in:
kwryankrattiger 2023-04-06 17:21:11 -05:00 committed by GitHub
parent 12eff8daad
commit 4ace1e660a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 43 additions and 8 deletions

View file

@ -52,6 +52,7 @@ spack:
- matrix:
- [$sdk_base_spec]
- [$^paraview_specs]
- - ^hdf5@1.14 # Non-VisIt can build HDF5 1.14
# Test ParaView builds with differnt GL backends
- matrix:
- [$sdk_base_spec]

View file

@ -112,16 +112,31 @@ class EcpDataVisSdk(BundlePackage, CudaPackage, ROCmPackage):
dav_sdk_depends_on("faodel+shared+mpi network=libfabric", when="+faodel", propagate=["hdf5"])
# HDF5 1.14 is a soft requirement for the ECP Data and Vis SDK.
# When building with VisIt and CinemaSci in the same SDK environment there is a conflict
# in the build dependency of py-setuptools which prevents building a py-h5py that is
# compatible with 'hdf5@1.14:'. Until there is a version of VisIt with an updated VTK or Spack
# allows the concretization of multiple versions of the same build only dependency
# concretization with VisIt and Cinema variants will not allow building VOLs.
dav_sdk_depends_on("hdf5@1.12: +shared+mpi", when="+hdf5", propagate=["fortran"])
# HDF5 VOL Adapters require hdf5@1.14:
# hdf5-vfd-gds needs cuda@11.7.1 or later, only enable when 11.7.1+ available.
depends_on("hdf5-vfd-gds@1.0.2:", when="+cuda+hdf5^cuda@11.7.1:")
depends_on("hdf5-vfd-gds@1.0.2:", when="+cuda+hdf5 ^cuda@11.7.1: ^hdf5@1.14:")
for cuda_arch in cuda_arch_variants:
depends_on(
"hdf5-vfd-gds@1.0.2: {0}".format(cuda_arch),
when="+cuda+hdf5 {0} ^cuda@11.7.1:".format(cuda_arch),
when="+cuda+hdf5 {0} ^cuda@11.7.1: ^hdf5@1.14:".format(cuda_arch),
)
conflicts("~cuda", when="^hdf5-vfd-gds@1.0.2:")
conflicts("~hdf5", when="^hdf5-vfd-gds@1.0.2:")
conflicts("~hdf5", when="^hdf5-vol-async")
conflicts("~hdf5", when="^hdf5-vol-cache")
conflicts("~hdf5", when="^hdf5-vol-log")
depends_on("hdf5-vol-async", when="+hdf5 ^hdf5@1.14:")
depends_on("hdf5-vol-cache", when="+hdf5 ^hdf5@1.14:")
depends_on("hdf5-vol-log", when="+hdf5 ^hdf5@1.14:")
dav_sdk_depends_on("parallel-netcdf+shared", when="+pnetcdf", propagate=["fortran"])

View file

@ -7,7 +7,14 @@
class Hdf5VolAsync(CMakePackage):
"""This package enables asynchronous IO in HDF5."""
"""This package enables asynchronous IO in HDF5.
Usage: Set the HDF5_VOL_CONNECTOR environment variable to enable this adaptor, i.e.
$export HDF5_VOL_CONNECTOR="async under_vol=0;under_info={}"
ref. https://hdf5-vol-async.readthedocs.io/en/latest/gettingstarted.html#set-environmental-variables
"""
homepage = "https://hdf5-vol-async.readthedocs.io"
git = "https://github.com/hpc-io/vol-async.git"
@ -27,15 +34,17 @@ class Hdf5VolAsync(CMakePackage):
variant("memcpy", default=False, description="Enable buffer copy for dataset write")
depends_on("mpi")
depends_on("argobots@main")
depends_on("argobots@1.1:")
depends_on("hdf5 +mpi +threadsafe")
depends_on("hdf5@1.13.0:1.13.2", when="@:1.3")
depends_on("hdf5@1.13.3:", when="@1.4:")
# Require MPI_THREAD_MULTIPLE.
depends_on("openmpi +thread_multiple", when="^openmpi")
depends_on("mvapich2 threads=multiple", when="^mvapich2")
def setup_run_environment(self, env):
env.set("HDF5_PLUGIN_PATH", self.spec.prefix.lib)
vol_connector = "async under_vol=0;under_info=[]"
env.set("HDF5_VOL_CONNECTOR", vol_connector)
env.prepend_path("HDF5_PLUGIN_PATH", self.spec.prefix.lib)
env.set("MPICH_MAX_THREAD_SAFETY", "multiple")
def cmake_args(self):

View file

@ -17,8 +17,12 @@ class Hdf5VolCache(CMakePackage):
version("v1.1", tag="v1.1")
version("v1.0", tag="v1.0")
depends_on("hdf5@1.13: +mpi +threadsafe")
depends_on("hdf5-vol-async")
def setup_run_environment(self, env):
env.prepend_path("HDF5_PLUGIN_PATH", self.spec.prefix.lib)
def cmake_args(self):
"""Populate cmake arguments for HDF5 VOL."""
args = [

View file

@ -22,12 +22,16 @@ class Hdf5VolLog(AutotoolsPackage):
version("1.2.0", tag="logvol.1.2.0")
version("1.1.0", tag="logvol.1.1.0")
depends_on("hdf5@1.13.2:")
depends_on("hdf5@1.14.0:", when="@1.4.0:")
depends_on("hdf5@1.13.2", when="@:1.3.0")
depends_on("autoconf", type="build")
depends_on("automake", type="build")
depends_on("libtool", type="build")
depends_on("m4", type="build")
def setup_run_environment(self, env):
env.prepend_path("HDF5_PLUGIN_PATH", self.spec.prefix.lib)
def configure_args(self):
args = []

View file

@ -39,6 +39,8 @@ class Hdf5(CMakePackage):
version("develop-1.8", branch="hdf5_1_8")
# Odd versions are considered experimental releases
# Note: These are still required to build some VOL adapters, but even releases should be
# preferred.
version("1.13.3", sha256="83c7c06671f975cee6944b0b217f95005faa55f79ea5532cf4ac268989866af4")
version("1.13.2", sha256="01643fa5b37dba7be7c4db6bbf3c5d07adf5c1fa17dbfaaa632a279b1b2f06da")