From 4ace1e660a3ab60a2e510308d700e251126f8c0e Mon Sep 17 00:00:00 2001 From: kwryankrattiger <80296582+kwryankrattiger@users.noreply.github.com> Date: Thu, 6 Apr 2023 17:21:11 -0500 Subject: 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 --- .../cloud_pipelines/stacks/data-vis-sdk/spack.yaml | 1 + .../builtin/packages/ecp-data-vis-sdk/package.py | 19 +++++++++++++++++-- .../repos/builtin/packages/hdf5-vol-async/package.py | 19 ++++++++++++++----- .../repos/builtin/packages/hdf5-vol-cache/package.py | 4 ++++ .../repos/builtin/packages/hdf5-vol-log/package.py | 6 +++++- var/spack/repos/builtin/packages/hdf5/package.py | 2 ++ 6 files changed, 43 insertions(+), 8 deletions(-) diff --git a/share/spack/gitlab/cloud_pipelines/stacks/data-vis-sdk/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/data-vis-sdk/spack.yaml index 452077c15b..af76f5a746 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/data-vis-sdk/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/data-vis-sdk/spack.yaml @@ -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] diff --git a/var/spack/repos/builtin/packages/ecp-data-vis-sdk/package.py b/var/spack/repos/builtin/packages/ecp-data-vis-sdk/package.py index 47c42aeb7f..4706e85344 100644 --- a/var/spack/repos/builtin/packages/ecp-data-vis-sdk/package.py +++ b/var/spack/repos/builtin/packages/ecp-data-vis-sdk/package.py @@ -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"]) diff --git a/var/spack/repos/builtin/packages/hdf5-vol-async/package.py b/var/spack/repos/builtin/packages/hdf5-vol-async/package.py index 964bae79aa..0d4490b3b1 100644 --- a/var/spack/repos/builtin/packages/hdf5-vol-async/package.py +++ b/var/spack/repos/builtin/packages/hdf5-vol-async/package.py @@ -7,7 +7,14 @@ from spack.package import * 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): diff --git a/var/spack/repos/builtin/packages/hdf5-vol-cache/package.py b/var/spack/repos/builtin/packages/hdf5-vol-cache/package.py index 1010d540b1..39ff9d71ca 100644 --- a/var/spack/repos/builtin/packages/hdf5-vol-cache/package.py +++ b/var/spack/repos/builtin/packages/hdf5-vol-cache/package.py @@ -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 = [ diff --git a/var/spack/repos/builtin/packages/hdf5-vol-log/package.py b/var/spack/repos/builtin/packages/hdf5-vol-log/package.py index cbf9d7804c..6a5216db51 100644 --- a/var/spack/repos/builtin/packages/hdf5-vol-log/package.py +++ b/var/spack/repos/builtin/packages/hdf5-vol-log/package.py @@ -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 = [] diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py index 7de1672306..7b948087c9 100644 --- a/var/spack/repos/builtin/packages/hdf5/package.py +++ b/var/spack/repos/builtin/packages/hdf5/package.py @@ -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") -- cgit v1.2.3-60-g2f50