summaryrefslogblamecommitdiff
path: root/var/spack/repos/builtin/packages/care/package.py
blob: 01b11ed3ac0e97ba9559977f9860f326e7d5f0b2 (plain) (tree)
1
2
3
4
5
6
                                                                         



                                                                         
                           







                                                   


                                            

                               

                                                           





                                                                                                   














                                                                                     
                                          




                                                     




                                                                               




                                                  


                                                                       



                                                
                                          



                                                                                  
 

                                      


                         
                                               

                    













                                                                         


                                                                              

                                                                              
             
                                               
 

                                                                                                
 

                                                             
                                          
                                                                                        
             












                                                                                         
 


                                                                             
                                                                 




                                                                              

                                                                            
 

                                                                        
 

                                                                

                      
# 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