summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/aml/package.py
blob: 113d2896fc903478afe281f4db252c3b18db6439 (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
# Copyright 2013-2023 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)

import os

from spack.package import *


class Aml(AutotoolsPackage):
    """AML is a memory management library designed to ease the use of complex
    memory topologies and complex data layout optimizations for
    high-performance computing applications.
    """

    homepage = "https://argo-aml.readthedocs.io/"

    maintainers("perarnau")

    test_requires_compiler = True

    tags = ["e4s"]

    # Package sources
    ###################################

    url = "https://github.com/anlsys/aml/releases/download/v0.2.0/aml-0.2.0.tar.gz"
    git = "https://github.com/anlsys/aml.git"

    license("ISC")

    # version string is generated from git tags, requires entire repo
    version("master", branch="master", submodules=True, get_full_repo=True)

    version("0.2.1", sha256="bae49e89ed0f2a2ad3547430e79b7e4c018d6228c6ed951a12d59afd0b35f71c")
    version("0.2.0", sha256="2044a2f3f1d7a19827dd9c0726172b690189b4d3fe938656c4160c022468cc4a")
    version(
        "0.1.0",
        sha256="cc89a8768693f1f11539378b21cdca9f0ce3fc5cb564f9b3e4154a051dcea69b",
        deprecated=True,
    )

    # Generate possible variants.
    #############################

    variant("opencl", default=False, description="Support for memory operations on top of OpenCL.")
    variant("ze", default=False, description="Support for memory operations on top of Level Zero.")
    variant("hip", default=False, description="Support for memory operations on top of HIP.")
    variant("cuda", default=False, description="Support for memory operations on top of CUDA.")
    variant("hwloc", default=True, description="Enable feature related to topology management")
    variant(
        "hip-platform",
        values=("none", conditional("amd", when="+hip"), conditional("nvidia", when="+cuda")),
        default="none",
        multi=False,
        description="HIP backend platform.",
    )

    # Dependencies management
    #########################

    # aml always depends on libnuma
    depends_on("numactl")

    # - cuda dependency. We use the environment variable CUDA_HOME in the configure.
    depends_on("cuda", when="+cuda")
    # - hip dependency. We use the environment variable HIP_PATH in the configure.
    depends_on("hip", when="+hip")
    # - level_zero loader is the dependency for the oneAPI variant
    depends_on("oneapi-level-zero", when="+ze")
    # - hwloc >= 2.1 becomes a dependency when +hwloc variant is used.
    depends_on("hwloc@2.1:", when="+hwloc")
    # - ocl-icd >= 2.1 becomes a dependency when +opencl variant is used.
    depends_on("ocl-icd@2.1:", when="+opencl")
    # Required on master for autoconf pull the right pkg.m4 macros,
    # and on other builds to detect dependencies
    # Note: This does NOT work with pkg-config but requires pkgconf!
    depends_on("pkgconf", type="build")

    # when on master, we need all the autotools and extras to generate files.
    with when("@master"):
        depends_on("m4", type="build")
        depends_on("autoconf", type="build")
        depends_on("automake", type="build")
        depends_on("libtool", type="build")
        # Required to generate AML version in configure.
        depends_on("git", type="build")

    # Configure options management
    ###########################################

    # This is the function to overload to pass all hwloc flag.
    def configure_args(self):
        config_args = []
        for b in ["opencl", "hwloc", "ze", "hip", "cuda"]:
            config_args.extend(self.with_or_without(b))
        if self.spec.satisfies("%oneapi"):
            config_args += ["--with-openmp-flags=-fiopenmp -fopenmp-targets=spir64"]
        if self.spec.variants["hip-platform"].value == "amd":
            config_args += ["--with-hip-platform=amd"]
        if self.spec.variants["hip-platform"].value == "nvidia":
            config_args += ["--with-hip-platform=nvidia"]
        return config_args

    # Tests
    #########################

    smoke_test = "0_hello"
    smoke_test_src = join_path("doc", "tutorials", "hello_world", smoke_test + ".c")

    @run_after("install")
    def cache_test_sources(self):
        """Copy the example source files after the package is installed to an
        install test subdirectory for use during `spack test run`."""
        self.cache_extra_test_sources(self.smoke_test_src)

    def test_check_tutorial(self):
        """Compile and run the tutorial tests as install checks"""
        cc = which(os.environ["CC"])
        cc_options = [
            "-o",
            self.smoke_test,
            join_path(self.test_suite.current_test_cache_dir, self.smoke_test_src),
            "-I{0}".format(self.prefix.include),
            "-I{0}".format(self.spec["numactl"].prefix.include),
            "-L{0}".format(self.prefix.lib),
            "-laml",
            "-lexcit",
            "-lpthread",
        ]
        cc(*cc_options)

        smoke_test = which(self.smoke_test)
        out = smoke_test(output=str.split, error=str.split)
        assert "Hello world" in out