diff options
author | Veselin Dobrev <v-dobrev@users.noreply.github.com> | 2022-10-29 13:22:25 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-29 13:22:25 -0700 |
commit | 82470f880aea5f47a4887fd82563486e0e2131df (patch) | |
tree | 4eb53459b8f5dc56c867a2570f9b7851c136072b | |
parent | e5274de7eccc54fa94a197c9d3f5b6b9ce16820a (diff) | |
download | spack-82470f880aea5f47a4887fd82563486e0e2131df.tar.gz spack-82470f880aea5f47a4887fd82563486e0e2131df.tar.bz2 spack-82470f880aea5f47a4887fd82563486e0e2131df.tar.xz spack-82470f880aea5f47a4887fd82563486e0e2131df.zip |
New MFEM version: 4.5 (#33480)
* New MFEM version: 4.5
Add new MFEM variants: ginkgo, hiop
* mfem: small tweaks
* mfem: tweak testing script
* mfem: try to resolve issue #30483
* mfem: fix style
* mfem: tweak for Spack-built hipsparse
Co-authored-by: eugeneswalker <38933153+eugeneswalker@users.noreply.github.com>
-rw-r--r-- | var/spack/repos/builtin/packages/mfem/package.py | 110 | ||||
-rwxr-xr-x | var/spack/repos/builtin/packages/mfem/test_builds.sh | 55 |
2 files changed, 124 insertions, 41 deletions
diff --git a/var/spack/repos/builtin/packages/mfem/package.py b/var/spack/repos/builtin/packages/mfem/package.py index dab89f9550..d188c2fc88 100644 --- a/var/spack/repos/builtin/packages/mfem/package.py +++ b/var/spack/repos/builtin/packages/mfem/package.py @@ -49,6 +49,13 @@ class Mfem(Package, CudaPackage, ROCmPackage): version("develop", branch="master") version( + "4.5.0", + sha256="4f201bec02fc5460a902596697b6c1deb7b15ac57c71f615b2ab4a8eb65665f7", + url="https://bit.ly/mfem-4-5", + extension="tar.gz", + ) + + version( "4.4.0", sha256="37250dbef6e97b16dc9ab50973e8d68bc165bb4afcdaf91b3b72c8972c87deef", url="https://bit.ly/mfem-4-4", @@ -171,7 +178,9 @@ class Mfem(Package, CudaPackage, ROCmPackage): "libunwind", default=False, description="Enable backtrace on error support using Libunwind" ) variant("fms", default=False, when="@4.3.0:", description="Enable FMS I/O support") - # TODO: SIMD, Ginkgo, ADIOS2, HiOp, MKL CPardiso, Axom/Sidre + variant("ginkgo", default=False, when="@4.3.0:", description="Enable Ginkgo support") + variant("hiop", default=False, when="@4.4.0:", description="Enable HiOp support") + # TODO: SIMD, ADIOS2, MKL CPardiso, Axom/Sidre variant( "timer", default="auto", @@ -229,6 +238,7 @@ class Mfem(Package, CudaPackage, ROCmPackage): conflicts("^mpich@4:", when="@:4.3+mpi") depends_on("mpi", when="+mpi") + depends_on("hipsparse", when="@4.4.0:+rocm") depends_on("hypre@2.10.0:2.13", when="@:3.3+mpi") depends_on("hypre@:2.20.0", when="@3.4:4.2+mpi") depends_on("hypre@:2.23.0", when="@4.3.0+mpi") @@ -256,11 +266,13 @@ class Mfem(Package, CudaPackage, ROCmPackage): depends_on("sundials@2.7.0+mpi+hypre", when="@:3.3.0+sundials+mpi") depends_on("sundials@2.7.0:", when="@3.3.2:+sundials~mpi") depends_on("sundials@2.7.0:+mpi+hypre", when="@3.3.2:+sundials+mpi") - depends_on("sundials@5.0.0:5", when="@4.0.1-xsdk:+sundials~mpi") - depends_on("sundials@5.0.0:5+mpi+hypre", when="@4.0.1-xsdk:+sundials+mpi") + depends_on("sundials@5.0.0:5", when="@4.0.1-xsdk:4.4+sundials~mpi") + depends_on("sundials@5.0.0:5+mpi+hypre", when="@4.0.1-xsdk:4.4+sundials+mpi") + depends_on("sundials@5.0.0:", when="@4.5.0:+sundials~mpi") + depends_on("sundials@5.0.0:+mpi+hypre", when="@4.5.0:+sundials+mpi") for sm_ in CudaPackage.cuda_arch_values: depends_on( - "sundials@5.4.0:5+cuda cuda_arch={0}".format(sm_), + "sundials@5.4.0:+cuda cuda_arch={0}".format(sm_), when="@4.2.0:+sundials+cuda cuda_arch={0}".format(sm_), ) depends_on("pumi", when="+pumi~shared") @@ -320,6 +332,29 @@ class Mfem(Package, CudaPackage, ROCmPackage): depends_on("conduit@0.3.1:,master:", when="+conduit") depends_on("conduit+mpi", when="+conduit+mpi") depends_on("libfms@0.2.0:", when="+fms") + depends_on("ginkgo@1.4.0:", when="+ginkgo") + for sm_ in CudaPackage.cuda_arch_values: + depends_on( + "ginkgo+cuda cuda_arch={0}".format(sm_), + when="+ginkgo+cuda cuda_arch={0}".format(sm_), + ) + for gfx in ROCmPackage.amdgpu_targets: + depends_on( + "ginkgo+rocm amdgpu_target={0}".format(gfx), + when="+ginkgo+rocm amdgpu_target={0}".format(gfx), + ) + depends_on("hiop@0.4.6:~mpi", when="+hiop~mpi") + depends_on("hiop@0.4.6:+mpi", when="+hiop+mpi") + for sm_ in CudaPackage.cuda_arch_values: + depends_on( + "hiop+cuda cuda_arch={0}".format(sm_), + when="+hiop+cuda cuda_arch={0}".format(sm_), + ) + for gfx in ROCmPackage.amdgpu_targets: + depends_on( + "hiop+rocm amdgpu_target={0}".format(gfx), + when="+hiop+rocm amdgpu_target={0}".format(gfx), + ) # The MFEM 4.0.0 SuperLU interface fails when using hypre@2.16.0 and # superlu-dist@6.1.1. See https://github.com/mfem/mfem/issues/983. @@ -488,6 +523,9 @@ class Mfem(Package, CudaPackage, ROCmPackage): else: mfem_mpiexec = "jsrun" mfem_mpiexec_np = "-p" + elif "FLUX_JOB_ID" in os.environ: + mfem_mpiexec = "flux mini run" + mfem_mpiexec_np = "-n" metis5_str = "NO" if ("+metis" in spec) and spec["metis"].satisfies("@5:"): @@ -530,11 +568,32 @@ class Mfem(Package, CudaPackage, ROCmPackage): "MFEM_USE_CEED=%s" % yes_no("+libceed"), "MFEM_USE_UMPIRE=%s" % yes_no("+umpire"), "MFEM_USE_FMS=%s" % yes_no("+fms"), + "MFEM_USE_GINKGO=%s" % yes_no("+ginkgo"), + "MFEM_USE_HIOP=%s" % yes_no("+hiop"), "MFEM_MPIEXEC=%s" % mfem_mpiexec, "MFEM_MPIEXEC_NP=%s" % mfem_mpiexec_np, "MFEM_USE_EXCEPTIONS=%s" % yes_no("+exceptions"), ] + # Determine C++ standard to use: + cxxstd = None + if self.spec.satisfies("@4.0.0:"): + cxxstd = "11" + if self.spec.satisfies("^raja@2022.03.0:"): + cxxstd = "14" + if self.spec.satisfies("^umpire@2022.03.0:"): + cxxstd = "14" + if self.spec.satisfies("^sundials@6.4.0:"): + cxxstd = "14" + if self.spec.satisfies("^ginkgo"): + cxxstd = "14" + cxxstd_flag = None + if cxxstd: + if "+cuda" in spec: + cxxstd_flag = "-std=c++" + cxxstd + else: + cxxstd_flag = getattr(self.compiler, "cxx" + cxxstd + "_flag") + cxxflags = spec.compiler_flags["cxxflags"] if cxxflags: @@ -557,16 +616,16 @@ class Mfem(Package, CudaPackage, ROCmPackage): "-x=cu --expt-extended-lambda -arch=sm_%s" % cuda_arch, "-ccbin %s" % (spec["mpi"].mpicxx if "+mpi" in spec else env["CXX"]), ] - if self.spec.satisfies("@4.0.0:"): - if "+cuda" in spec: - cxxflags.append("-std=c++11") - else: - cxxflags.append(self.compiler.cxx11_flag) + if cxxstd_flag: + cxxflags.append(cxxstd_flag) # The cxxflags are set by the spack c++ compiler wrapper. We also # set CXXFLAGS explicitly, for clarity, and to properly export the # cxxflags in the variable MFEM_CXXFLAGS in config.mk. options += ["CXXFLAGS=%s" % " ".join(cxxflags)] + elif cxxstd_flag: + options += ["BASE_FLAGS=%s" % cxxstd_flag] + # Treat any 'CXXFLAGS' in the environment as extra c++ flags which are # handled through the 'CPPFLAGS' makefile variable in MFEM. Also, unset # 'CXXFLAGS' from the environment to prevent it from overriding the @@ -589,9 +648,12 @@ class Mfem(Package, CudaPackage, ROCmPackage): if "+cuda" in hypre: hypre_gpu_libs = " -lcusparse -lcurand" elif "+rocm" in hypre: - hypre_gpu_libs = " " + ld_flags_from_dirs( - [env["ROCM_PATH"] + "/lib"], ["rocsparse", "rocrand"] - ) + hypre_rocm_libs = LibraryList([]) + if "^rocsparse" in hypre: + hypre_rocm_libs += hypre["rocsparse"].libs + if "^rocrand" in hypre: + hypre_rocm_libs += hypre["rocrand"].libs + hypre_gpu_libs = " " + ld_flags_from_library_list(hypre_rocm_libs) options += [ "HYPRE_OPT=-I%s" % hypre.prefix.include, "HYPRE_LIB=%s%s" % (ld_flags_from_library_list(all_hypre_libs), hypre_gpu_libs), @@ -804,6 +866,15 @@ class Mfem(Package, CudaPackage, ROCmPackage): if "+rocm" in spec: amdgpu_target = ",".join(spec.variants["amdgpu_target"].value) options += ["HIP_CXX=%s" % spec["hip"].hipcc, "HIP_ARCH=%s" % amdgpu_target] + if "^hipsparse" in spec: # hipsparse is needed @4.4.0:+rocm + # Note: MFEM's defaults.mk want to find librocsparse.* in + # $(HIP_DIR)/lib, so we set HIP_DIR to be the prefix of + # rocsparse (which is a dependency of hipsparse). + options += [ + "HIP_DIR=%s" % spec["rocsparse"].prefix, + "HIP_OPT=%s" % spec["hipsparse"].headers.cpp_flags, + "HIP_LIB=%s" % ld_flags_from_library_list(spec["hipsparse"].libs), + ] if "+occa" in spec: options += [ @@ -895,6 +966,21 @@ class Mfem(Package, CudaPackage, ROCmPackage): "FMS_LIB=%s" % ld_flags_from_library_list(libfms.libs), ] + if "+ginkgo" in spec: + ginkgo = spec["ginkgo"] + options += [ + "GINKGO_DIR=%s" % ginkgo.prefix, + "GINKGO_BUILD_TYPE=%s" % ginkgo.variants["build_type"].value, + ] + + if "+hiop" in spec: + hiop = spec["hiop"] + lapack_blas = spec["lapack"].libs + spec["blas"].libs + options += [ + "HIOP_OPT=-I%s" % hiop.prefix.include, + "HIOP_LIB=%s" % ld_flags_from_library_list(hiop.libs + lapack_blas), + ] + make("config", *options, parallel=False) make("info", parallel=False) diff --git a/var/spack/repos/builtin/packages/mfem/test_builds.sh b/var/spack/repos/builtin/packages/mfem/test_builds.sh index 9b534836ec..5c43f87512 100755 --- a/var/spack/repos/builtin/packages/mfem/test_builds.sh +++ b/var/spack/repos/builtin/packages/mfem/test_builds.sh @@ -8,7 +8,7 @@ rocm_arch="gfx908" spack_jobs='' # spack_jobs='-j 128' -mfem='mfem@4.4.0'${compiler} +mfem='mfem@4.5.0'${compiler} mfem_dev='mfem@develop'${compiler} backends='+occa+raja+libceed' @@ -28,32 +28,29 @@ builds=( # preferred version: ${mfem} ${mfem}'~mpi~metis~zlib' - # TODO: add back '+gslib' when the gslib test is fixed. - # TODO: add back '+slepc' when its build is fixed. - ${mfem}"$backends"'+superlu-dist+strumpack+suite-sparse+petsc \ - +sundials+pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit \ + ${mfem}"$backends"'+superlu-dist+strumpack+suite-sparse+petsc+slepc+gslib \ + +sundials+pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit+ginkgo+hiop \ '"$backends_specs $strumpack_spec $petsc_spec $hdf5_spec" ${mfem}'~mpi \ '"$backends"'+suite-sparse+sundials+gslib+mpfr+netcdf \ - +zlib+gnutls+libunwind+conduit \ + +zlib+gnutls+libunwind+conduit+ginkgo+hiop \ '"$backends_specs $hdf5_spec"' ^sundials~mpi' # develop version, shared builds: ${mfem_dev}'+shared~static' ${mfem_dev}'+shared~static~mpi~metis~zlib' # NOTE: Shared build with +gslib works on mac but not on linux - # TODO: add back '+gslib' when the gslib test is fixed and the above NOTE + # TODO: add back '+gslib' when the above NOTE # is addressed. - # TODO: add back '+slepc' when its build is fixed. ${mfem_dev}'+shared~static \ - '"$backends"'+superlu-dist+strumpack+suite-sparse+petsc \ - +sundials+pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit \ + '"$backends"'+superlu-dist+strumpack+suite-sparse+petsc+slepc \ + +sundials+pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit+ginkgo+hiop \ '"$backends_specs $strumpack_spec $petsc_spec $hdf5_spec" # NOTE: Shared build with +gslib works on mac but not on linux # TODO: add back '+gslib' when the above NOTE is addressed. ${mfem_dev}'+shared~static~mpi \ '"$backends"'+suite-sparse+sundials+mpfr+netcdf \ - +zlib+gnutls+libunwind+conduit \ + +zlib+gnutls+libunwind+conduit+ginkgo+hiop \ '"$backends_specs $hdf5_spec"' ^sundials~mpi' ) @@ -67,8 +64,7 @@ builds2=( ${mfem}'+sundials~mpi ^sundials~mpi' ${mfem}'+sundials' ${mfem}'+pumi' - # TODO: uncomment the next line when the gslib test is fixed. - # ${mfem}'+gslib' + ${mfem}'+gslib' ${mfem}'+netcdf~mpi' ${mfem}'+netcdf' ${mfem}'+mpfr' @@ -77,10 +73,11 @@ builds2=( ${mfem}'+conduit' ${mfem}'+umpire' ${mfem}'+petsc'" $petsc_spec" - # TODO: uncomment the next line when the slepc build is fixed. - # ${mfem}'+petsc+slepc'" $petsc_spec" - # TODO: uncomment the next line when the threadsafe build is fixed. - # ${mfem}'+threadsafe' + ${mfem}'+petsc+slepc'" $petsc_spec" + ${mfem}'+ginkgo' + ${mfem}'+hiop' + ${mfem}'+threadsafe' + # # develop version ${mfem_dev}"$backends $backends_specs" ${mfem_dev}'+superlu-dist' @@ -90,8 +87,7 @@ builds2=( ${mfem_dev}'+sundials~mpi ^sundials~mpi' ${mfem_dev}'+sundials' ${mfem_dev}'+pumi' - # TODO: uncomment the next line when the gslib test is fixed. - # ${mfem_dev}'+gslib' + ${mfem_dev}'+gslib' ${mfem_dev}'+netcdf~mpi' ${mfem_dev}'+netcdf' ${mfem_dev}'+mpfr' @@ -101,8 +97,9 @@ builds2=( ${mfem_dev}'+umpire' ${mfem_dev}'+petsc'" $petsc_spec" ${mfem_dev}'+petsc+slepc'" $petsc_spec" - # TODO: uncomment the next line when the threadsafe build is fixed. - # ${mfem_dev}'+threadsafe' + ${mfem_dev}'+ginkgo' + ${mfem_dev}'+hiop' + ${mfem_dev}'+threadsafe' ) @@ -125,7 +122,7 @@ builds_cuda=( # TODO: add back "+petsc+slepc $petsc_spec_cuda" when it works. ${mfem}'+cuda+openmp+raja+occa cuda_arch='"${cuda_arch}"' \ +strumpack+suite-sparse \ - +sundials+pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit \ + +sundials+pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit+ginkgo+hiop \ ^raja+cuda+openmp'" $strumpack_cuda_spec"' \ '"$hdf5_spec" @@ -138,7 +135,7 @@ builds_cuda=( # TODO: add back "+sundials" when it's supported with '^hypre+cuda'. ${mfem}'+cuda+openmp+raja+occa cuda_arch='"${cuda_arch}"' \ +suite-sparse \ - +pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit \ + +pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit+ginkgo+hiop \ ^raja+cuda+openmp ^hypre+cuda \ '"$hdf5_spec" @@ -164,7 +161,7 @@ builds_cuda=( # TODO: add back "+petsc+slepc $petsc_spec_cuda" when it works. ${mfem_dev}'+cuda+openmp+raja+occa cuda_arch='"${cuda_arch}"' \ +strumpack+suite-sparse \ - +sundials+pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit \ + +sundials+pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit+ginkgo+hiop \ ^raja+cuda+openmp'" $strumpack_cuda_spec"' \ '"$hdf5_spec" @@ -177,7 +174,7 @@ builds_cuda=( # TODO: add back "+sundials" when it's supported with '^hypre+cuda'. ${mfem_dev}'+cuda+openmp+raja+occa cuda_arch='"${cuda_arch}"' \ +suite-sparse \ - +pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit \ + +pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit+ginkgo+hiop \ ^raja+cuda+openmp ^hypre+cuda \ '"$hdf5_spec" ) @@ -200,7 +197,7 @@ builds_rocm=( # TODO: add "+petsc+slepc $petsc_spec_rocm" when it is supported. ${mfem}'+rocm+openmp+raja+occa+libceed amdgpu_target='"${rocm_arch}"' \ +strumpack+suite-sparse \ - +sundials+pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit \ + +sundials+pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit+ginkgo+hiop \ ^raja+rocm~openmp ^occa~cuda'" $strumpack_rocm_spec"' \ '"$hdf5_spec" @@ -212,7 +209,7 @@ builds_rocm=( # TODO: add back "+sundials" when it's supported with '^hypre+rocm'. ${mfem}'+rocm+openmp+raja+occa+libceed amdgpu_target='"${rocm_arch}"' \ +suite-sparse \ - +pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit \ + +pumi+mpfr+netcdf+zlib+gnutls+libunwind+conduit+ginkgo+hiop \ ^raja+rocm~openmp ^occa~cuda ^hypre+rocm \ '"$hdf5_spec" @@ -238,9 +235,9 @@ for bld in "${run_builds[@]}"; do printf " %s\n" "${bld}" printf "%s\n" "${SEP}" eval bbb="\"${bld}\"" - spack spec -I $bbb || exit 1 + spack spec --fresh -I $bbb || exit 1 printf "%s\n" "${sep}" - spack install $spack_jobs --test=root $bbb || exit 2 + spack install $spack_jobs --fresh --test=root $bbb || exit 2 done # Uninstall all mfem builds: |