summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/nvhpc/package.py
blob: 768305a9fbb8daba83f7922e0034eb3a2aea2e3e (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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# Copyright 2013-2021 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)
#
# Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved.

import os
import platform

from spack import *
from spack.util.prefix import Prefix

# FIXME Remove hack for polymorphic versions
# This package uses a ugly hack to be able to dispatch, given the same
# version, to different binary packages based on the platform that is
# running spack. See #13827 for context.
# If you need to add a new version, please be aware that:
#  - versions in the following dict are automatically added to the package
#  - version tuple must be in the form (checksum, url)
#  - checksum must be sha256
#  - package key must be in the form '{os}-{arch}' where 'os' is in the
#    format returned by platform.system() and 'arch' by platform.machine()
_versions = {
    '21.5': {
        'Linux-aarch64': ('1a1748cd7cf538199d92ab3b1208935fa4a62708ba21125aeadb328ddc7380d4', 'https://developer.download.nvidia.com/hpc-sdk/21.5/nvhpc_2021_215_Linux_aarch64_cuda_multi.tar.gz'),
        'Linux-ppc64le': ('4674931a5ce28724308cb9cebd546eefa3f0646d3d08adbea28ba5ad27f0c163', 'https://developer.download.nvidia.com/hpc-sdk/21.5/nvhpc_2021_215_Linux_ppc64le_cuda_multi.tar.gz'),
        'Linux-x86_64': ('21989e52c58a6914743631c8200de1fec7e10b3449c6c1833f3032ee74b85f8e', 'https://developer.download.nvidia.com/hpc-sdk/21.5/nvhpc_2021_215_Linux_x86_64_cuda_multi.tar.gz')},
    '21.3': {
        'Linux-aarch64': ('88e0dbf8fcdd06a2ba06aacf65ae1625b8683688f6593ed3bf8ce129ce1b17b7', 'https://developer.download.nvidia.com/hpc-sdk/21.3/nvhpc_2021_213_Linux_aarch64_cuda_multi.tar.gz'),
        'Linux-ppc64le': ('08cd0cd6c80d633f107b44f88685ada7f014fbf6eac19ef5ae4a7952cabe4037', 'https://developer.download.nvidia.com/hpc-sdk/21.3/nvhpc_2021_213_Linux_ppc64le_cuda_multi.tar.gz'),
        'Linux-x86_64': ('391d5604a70f61bdd4ca6a3e4692f6f2391948990c8a35c395b6867341890031', 'https://developer.download.nvidia.com/hpc-sdk/21.3/nvhpc_2021_213_Linux_x86_64_cuda_multi.tar.gz')},
    '21.2': {
        'Linux-aarch64': ('fe19c0232f7c9534f8699b7432483c9cc649f1e92e7f0961d1aa7c54d83297ff', 'https://developer.download.nvidia.com/hpc-sdk/21.2/nvhpc_2021_212_Linux_aarch64_cuda_multi.tar.gz'),
        'Linux-ppc64le': ('6b69b6e4ebec6a91b9f1627384c50adad79ebdd25dfb20a5f64cf01c3a07f11a', 'https://developer.download.nvidia.com/hpc-sdk/21.2/nvhpc_2021_212_Linux_ppc64le_cuda_multi.tar.gz'),
        'Linux-x86_64': ('a3e3393040185ae844002fbc6c8eb4ffdfb97ce8b2ce29d796fe7e9a521fdc59', 'https://developer.download.nvidia.com/hpc-sdk/21.2/nvhpc_2021_212_Linux_x86_64_cuda_multi.tar.gz')},
    '21.1': {
        'Linux-aarch64': ('b276e7c0ff78cee837a597d9136cd1d8ded27a9d1fdae1e7d674e2a072a9a6aa', 'https://developer.download.nvidia.com/hpc-sdk/21.1/nvhpc_2021_211_Linux_aarch64_cuda_multi.tar.gz'),
        'Linux-ppc64le': ('bc236c212097bac6b7d04d627d9cc6b75bb6cd473a0b6a1bf010559ce328a2b0', 'https://developer.download.nvidia.com/hpc-sdk/21.1/nvhpc_2021_211_Linux_ppc64le_cuda_multi.tar.gz'),
        'Linux-x86_64': ('d529daf46404724ac3f005be4239f2c30e53f5220bb9453f367dccc3a74d6b41', 'https://developer.download.nvidia.com/hpc-sdk/21.1/nvhpc_2021_211_Linux_x86_64_cuda_multi.tar.gz')},
    '20.11': {
        'Linux-aarch64': ('2f26ca45b07b694b8669e4f761760d4f7faa8d032b21e430adee1af0a27032c1', 'https://developer.download.nvidia.com/hpc-sdk/20.11/nvhpc_2020_2011_Linux_aarch64_cuda_multi.tar.gz'),
        'Linux-ppc64le': ('99e5a5437e82f3914e0fe81feb761a5b599a3fe8b31f3c2cac8ae47e8cdc7b0f', 'https://developer.download.nvidia.com/hpc-sdk/20.11/nvhpc_2020_2011_Linux_ppc64le_cuda_multi.tar.gz'),
        'Linux-x86_64': ('c80fc26e5ba586696f7030f03054c1aaca0752a891c7923faf47eb23b66857ec', 'https://developer.download.nvidia.com/hpc-sdk/20.11/nvhpc_2020_2011_Linux_x86_64_cuda_multi.tar.gz')},
    '20.9': {
        'Linux-aarch64': ('3bfb3d17f5ee99998bcc30d738e818d3b94b828e2d8da7db48bf152a01e22023', 'https://developer.download.nvidia.com/hpc-sdk/20.9/nvhpc_2020_209_Linux_aarch64_cuda_11.0.tar.gz'),
        'Linux-ppc64le': ('b2966d4047e1dfd981ce63b333ab9c0acbdc2a6a505fa217456ac9fa3b8e7474', 'https://developer.download.nvidia.com/hpc-sdk/20.9/nvhpc_2020_209_Linux_ppc64le_cuda_multi.tar.gz'),
        'Linux-x86_64': ('fe665ab611b03846a90bd70ca4e08c1e59ab527364b971ed0304e0ae73c778d8', 'https://developer.download.nvidia.com/hpc-sdk/20.9/nvhpc_2020_209_Linux_x86_64_cuda_multi.tar.gz')},
    '20.7': {
        'Linux-aarch64': ('5b83ca1919199ac0aa609309b31c345c5a6453dd3131fddeef9e3ee9059a0e9b', 'https://developer.download.nvidia.com/hpc-sdk/20.7/nvhpc_2020_207_Linux_aarch64_cuda_11.0.tar.gz'),
        'Linux-ppc64le': ('800ead240bdf61611910b2f6df24ee1d7359377ff3767c923738dd81fcea9312', 'https://developer.download.nvidia.com/hpc-sdk/20.7/nvhpc_2020_207_Linux_ppc64le_cuda_multi.tar.gz'),
        'Linux-x86_64': ('a5c5c8726d2210f2310a852c6d6e03c9ef8c75e3643e9c94e24909f5e9c2ea7a', 'https://developer.download.nvidia.com/hpc-sdk/20.7/nvhpc_2020_207_Linux_x86_64_cuda_multi.tar.gz')}
}


class Nvhpc(Package):
    """The NVIDIA HPC SDK is a comprehensive suite of compilers, libraries
    and tools essential to maximizing developer productivity and the
    performance and portability of HPC applications. The NVIDIA HPC
    SDK C, C++, and Fortran compilers support GPU acceleration of HPC
    modeling and simulation applications with standard C++ and
    Fortran, OpenACC directives, and CUDA. GPU-accelerated math
    libraries maximize performance on common HPC algorithms, and
    optimized communications libraries enable standards-based
    multi-GPU and scalable systems programming. Performance profiling
    and debugging tools simplify porting and optimization of HPC
    applications."""

    homepage = "http://developer.nvidia.com/hpc-sdk"

    maintainers = ['samcmill']

    for ver, packages in _versions.items():
        key = "{0}-{1}".format(platform.system(), platform.machine())
        pkg = packages.get(key)
        if pkg:
            version(ver, sha256=pkg[0], url=pkg[1])

    variant('blas',         default=True,
            description="Enable BLAS")
    variant('install_type', default='single',
            values=('single', 'network'), multi=False,
            description='Network installs are for installations shared '
                        'by different operating systems')
    variant('lapack',       default=True,
            description="Enable LAPACK")
    variant('mpi',          default=False,
            description="Enable MPI")

    provides('blas',        when='+blas')
    provides('lapack',      when='+lapack')
    provides('mpi',         when='+mpi')

    def install(self, spec, prefix):
        # Enable the silent installation feature
        os.environ['NVHPC_SILENT'] = "true"
        os.environ['NVHPC_ACCEPT_EULA'] = "accept"
        os.environ['NVHPC_INSTALL_DIR'] = prefix

        if spec.variants['install_type'].value == 'network':
            os.environ['NVHPC_INSTALL_TYPE'] = "network"
            os.environ['NVHPC_INSTALL_LOCAL_DIR'] = \
                "%s/%s/%s/share_objects" % \
                (prefix, 'Linux_%s' % spec.target.family, self.version)
        else:
            os.environ['NVHPC_INSTALL_TYPE'] = "single"

        # Run install script
        os.system("./install")

    def setup_run_environment(self, env):
        prefix = Prefix(join_path(self.prefix,
                                  'Linux_%s' % self.spec.target.family,
                                  self.version, 'compilers'))

        env.set('CC',  join_path(prefix.bin, 'nvc'))
        env.set('CXX', join_path(prefix.bin, 'nvc++'))
        env.set('F77', join_path(prefix.bin, 'nvfortran'))
        env.set('FC',  join_path(prefix.bin, 'nvfortran'))

        env.prepend_path('PATH',            prefix.bin)
        env.prepend_path('LIBRARY_PATH',    prefix.lib)
        env.prepend_path('LD_LIBRARY_PATH', prefix.lib)
        env.prepend_path('MANPATH',         prefix.man)

        if '+mpi' in self.spec:
            mpi_prefix = Prefix(join_path(self.prefix,
                                          'Linux_%s' % self.spec.target.family,
                                          self.version, 'comm_libs', 'mpi'))
            env.prepend_path('PATH', mpi_prefix.bin)
            env.prepend_path('LD_LIBRARY_PATH', mpi_prefix.lib)

    def setup_dependent_build_environment(self, env, dependent_spec):
        prefix = Prefix(join_path(self.prefix,
                                  'Linux_%s' % self.spec.target.family,
                                  self.version, 'compilers'))

        env.prepend_path('LIBRARY_PATH',    prefix.lib)
        env.prepend_path('LD_LIBRARY_PATH', prefix.lib)

        if '+mpi' in self.spec:
            mpi_prefix = Prefix(join_path(self.prefix,
                                          'Linux_%s' % self.spec.target.family,
                                          self.version, 'comm_libs', 'mpi'))

            env.prepend_path('LD_LIBRARY_PATH', mpi_prefix.lib)

    def setup_dependent_package(self, module, dependent_spec):
        if '+mpi' in self.spec or self.provides('mpi'):
            mpi_prefix = Prefix(join_path(self.prefix,
                                          'Linux_%s' % self.spec.target.family,
                                          self.version, 'comm_libs', 'mpi'))

            self.spec.mpicc  = join_path(mpi_prefix.bin, 'mpicc')
            self.spec.mpicxx = join_path(mpi_prefix.bin, 'mpicxx')
            self.spec.mpif77 = join_path(mpi_prefix.bin, 'mpif77')
            self.spec.mpifc  = join_path(mpi_prefix.bin, 'mpif90')

    @property
    def libs(self):
        prefix = Prefix(join_path(self.prefix,
                                  'Linux_%s' % self.spec.target.family,
                                  self.version, 'compilers'))
        libs = []

        if '+blas' in self.spec:
            libs.append('libblas')

        if '+lapack' in self.spec:
            libs.append('liblapack')
            libs.append('libnvf')

        return find_libraries(libs, root=prefix, recursive=True)