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
|
# 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.
from spack import *
from spack.util.prefix import Prefix
import os
import platform
# 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)
|