summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/mkl/package.py
blob: 71a233ff3e1b69c188077d1b0bd6c3450a89bd1c (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
from spack import *
import os

from spack.pkg.builtin.intel import IntelInstaller


class Mkl(IntelInstaller):
    """Intel Math Kernel Library.

    Note: You will have to add the download file to a
    mirror so that Spack can find it. For instructions on how to set up a
    mirror, see http://software.llnl.gov/spack/mirrors.html.

    To set the threading layer at run time set MKL_THREADING_LAYER
    variable to one of the following values: INTEL (default), SEQUENTIAL, PGI.
    To set interface layer at run time, use set the MKL_INTERFACE_LAYER
    variable to LP64 (default) or ILP64.
    """

    homepage = "https://software.intel.com/en-us/intel-mkl"

    version('11.3.2.181', '536dbd82896d6facc16de8f961d17d65',
            url="file://%s/l_mkl_11.3.2.181.tgz" % os.getcwd())
    version('11.3.3.210', 'f72546df27f5ebb0941b5d21fd804e34',
            url="file://%s/l_mkl_11.3.3.210.tgz" % os.getcwd())

    # virtual dependency
    provides('blas')
    provides('lapack')
    # TODO: MKL also provides implementation of Scalapack.

    def install(self, spec, prefix):

        self.intel_prefix = os.path.join(prefix, "pkg")
        IntelInstaller.install(self, spec, prefix)

        mkl_dir = os.path.join(self.intel_prefix, "mkl")
        for f in os.listdir(mkl_dir):
            os.symlink(os.path.join(mkl_dir, f), os.path.join(self.prefix, f))

        # Unfortunately MKL libs are natively distrubted in prefix/lib/intel64.
        # To make MKL play nice with Spack, symlink all files to prefix/lib:
        mkl_lib_dir = os.path.join(prefix, "lib", "intel64")
        for f in os.listdir(mkl_lib_dir):
            os.symlink(os.path.join(mkl_lib_dir, f),
                       os.path.join(self.prefix, "lib", f))

    def setup_dependent_package(self, module, dspec):
        # For now use Single Dynamic Library:
        # To set the threading layer at run time, use the
        # mkl_set_threading_layer function or set MKL_THREADING_LAYER
        # variable to one of the following values: INTEL, SEQUENTIAL, PGI.
        # To set interface layer at run time, use the mkl_set_interface_layer
        # function or set the MKL_INTERFACE_LAYER variable to LP64 or ILP64.

        # Otherwise one would need to specify several libraries
        # (e.g. mkl_intel_lp64;mkl_sequential;mkl_core), which reflect
        # different interface and threading layers.

        name = 'libmkl_rt.%s' % dso_suffix
        libdir = find_library_path(name, self.prefix.lib64, self.prefix.lib)

        # Now set blas/lapack libs:
        self.spec.blas_shared_lib   = join_path(libdir, name)
        self.spec.lapack_shared_lib = self.spec.blas_shared_lib

    def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
        # set up MKLROOT for everyone using MKL package
        spack_env.set('MKLROOT', self.prefix)

    def setup_environment(self, spack_env, env):
        env.set('MKLROOT', self.prefix)