# Copyright 2013-2024 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.package import *
class Care(CMakePackage, CudaPackage, ROCmPackage):
"""
Algorithms for chai managed arrays.
"""
homepage = "https://github.com/LLNL/CARE"
git = "https://github.com/LLNL/CARE.git"
tags = ["radiuss"]
license("GPL-2.0-or-later")
version("develop", branch="develop", submodules="True")
version("master", branch="main", submodules="True")
version(
"0.3.0", tag="v0.3.0", commit="5e2b69b2836c9f2215207ca9a36a690cb77eea33", submodules="True"
)
version(
"0.2.0", tag="v0.2.0", commit="30135e03b14b1dc753634e9147dafede0663906f", submodules="True"
)
variant("openmp", default=False, description="Build Shared Libs")
variant(
"implicit_conversions",
default=True,
description="Enable implicit" "conversions to/from raw pointers",
)
variant("benchmarks", default=True, description="Build benchmarks.")
variant("examples", default=True, description="Build examples.")
variant("docs", default=False, description="Build documentation")
variant("tests", default=False, description="Build tests")
variant("loop_fuser", default=False, description="Enable loop fusion capability")
depends_on("blt@0.4.0:", type="build", when="@0.3.1:")
depends_on("blt@:0.3.6", type="build", when="@:0.3.0")
conflicts("^blt@:0.3.6", when="+rocm")
depends_on("camp")
depends_on("umpire@develop")
depends_on("raja@develop")
depends_on("chai@develop+enable_pick~benchmarks")
# WARNING: this package currently only supports an internal cub
# package. This will cause a race condition if compiled with another
# package that uses cub. TODO: have all packages point to the same external
# cub package.
depends_on("camp+cuda", when="+cuda")
depends_on("umpire+cuda~shared", when="+cuda")
depends_on("cub", when="+cuda")
depends_on("raja+cuda~openmp", when="+cuda")
depends_on("chai+cuda~shared", when="+cuda")
# variants +rocm and amdgpu_targets are not automatically passed to
# dependencies, so do it manually.
depends_on("camp+rocm", when="+rocm")
depends_on("umpire+rocm", when="+rocm")
depends_on("raja+rocm~openmp", when="+rocm")
depends_on("chai+rocm", when="+rocm")
for val in ROCmPackage.amdgpu_targets:
depends_on("camp amdgpu_target=%s" % val, when="amdgpu_target=%s" % val)
depends_on("umpire amdgpu_target=%s" % val, when="amdgpu_target=%s" % val)
depends_on("raja amdgpu_target=%s" % val, when="amdgpu_target=%s" % val)
depends_on("chai amdgpu_target=%s" % val, when="amdgpu_target=%s" % val)
conflicts("+openmp", when="+rocm")
conflicts("+openmp", when="+cuda")
def cmake_args(self):
spec = self.spec
from_variant = self.define_from_variant
options = []
options.append("-DBLT_SOURCE_DIR={0}".format(spec["blt"].prefix))
if "+cuda" in spec:
options.extend(
[
"-DENABLE_CUDA=ON",
"-DCUDA_TOOLKIT_ROOT_DIR=" + spec["cuda"].prefix,
"-DNVTOOLSEXT_DIR=" + spec["cuda"].prefix,
"-DCUB_DIR=" + spec["cub"].prefix,
]
)
if not spec.satisfies("cuda_arch=none"):
cuda_arch = spec.variants["cuda_arch"].value
# Please note that within care, CUDA_ARCH is assigned to -code
# and likewise CUDA_CODE is assigned to -arch, so these are
# intentionally flipped here.
options.append("-DCUDA_ARCH=sm_{0}".format(cuda_arch[0]))
options.append("-DCUDA_CODE=compute_{0}".format(cuda_arch[0]))
else:
options.append("-DENABLE_CUDA=OFF")
if "+rocm" in spec:
options.extend(["-DENABLE_HIP=ON", "-DHIP_ROOT_DIR={0}".format(spec["hip"].prefix)])
archs = self.spec.variants["amdgpu_target"].value
if archs != "none":
arch_str = ",".join(archs)
options.append("-DHIP_HIPCC_FLAGS=--amdgpu-target={0}".format(arch_str))
else:
options.append("-DENABLE_HIP=OFF")
options.extend(
[
from_variant("CARE_ENABLE_IMPLICIT_CONVERSIONS", "implicit_conversions"),
from_variant("CARE_ENABLE_LOOP_FUSER", "loop_fuser"),
self.define("CAMP_DIR", spec["camp"].prefix.share.camp.cmake),
self.define("UMPIRE_DIR", spec["umpire"].prefix.share.umpire.cmake),
self.define("RAJA_DIR", spec["raja"].prefix.share.raja.cmake),
self.define("CHAI_DIR", spec["chai"].prefix.share.chai.cmake),
from_variant("CARE_ENABLE_TESTS", "tests"),
]
)
# For tests to work, we also need BLT_ENABLE_TESTS to be on.
# This will take care of the gtest dependency. CARE developers should
# consider consolidating these flags in the future.
options.append(from_variant("BLT_ENABLE_TESTS", "tests"))
# There are both CARE_ENABLE_* and ENABLE_* variables in here because
# one controls the BLT infrastructure and the other controls the CARE
# infrastructure. The goal is to just be able to use the CARE_ENABLE_*
# variables, but CARE isn't set up correctly for that yet.
options.append(from_variant("ENABLE_BENCHMARKS", "benchmarks"))
options.append(from_variant("CARE_ENABLE_BENCHMARKS", "benchmarks"))
options.append(from_variant("ENABLE_EXAMPLES", "examples"))
options.append(from_variant("CARE_ENABLE_EXAMPLES", "examples"))
options.append(from_variant("ENABLE_DOCS", "docs"))
options.append(from_variant("CARE_ENABLE_DOCS", "docs"))
return options