summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/care/package.py
blob: 01b11ed3ac0e97ba9559977f9860f326e7d5f0b2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# 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