nvidia-nsight-systems: new package (#47355)

Co-authored-by: Scot Halverson <shalverson@nvidia.com>
This commit is contained in:
Mosè Giordano 2024-11-01 00:32:43 +00:00 committed by GitHub
parent b4b3320f71
commit 8076134c91
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -0,0 +1,127 @@
# 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)
import os
import platform
import re
import shutil
from glob import glob
from spack.package import *
# 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 = {
"2024.6.1": {
"Linux-aarch64": (
"24700c28dfda9f95d4e93de218b86ab1ba0ee8b74cb61c3c581767296159c75c",
"https://developer.nvidia.com/downloads/assets/tools/secure/nsight-systems/2024_6/nsight-systems-2024.6.1-2024.6.1.90_3490548-0.aarch64.rpm",
),
"Linux-x86_64": (
"dd4359a47ff3857395c55a0da483b64f5c0c3a1a2e57dd543a512dc3d2cd2674",
"https://developer.nvidia.com/downloads/assets/tools/secure/nsight-systems/2024_6/nsight-systems-2024.6.1-2024.6.1.90_3490548-0.x86_64.rpm",
),
},
"2024.1.1": {
"Linux-aarch64": (
"41dc15ae128ef1de8e582b66bb465ac6bd67b9d20ef77fc70528b735d80fb3ec",
"https://developer.download.nvidia.com/devtools/repos/rhel8/arm64/nsight-systems-2024.1.1-2024.1.1.59_3380207-0.aarch64.rpm",
),
"Linux-ppc64le": (
"8c98b511df1747c4c782430504ae6fa4b3fce6fa72623083a828fc0a1e11f1b8",
"https://developer.download.nvidia.com/devtools/repos/rhel8/ppc64le/nsight-systems-cli-2024.1.1-2024.1.1.59_3380207-0.ppc64le.rpm",
),
"Linux-x86_64": (
"96f57548e0bd69cb02cd1fe8c70ed4a650636ecb3a5ea5ec490c8049adc2beb5",
"https://developer.download.nvidia.com/devtools/repos/rhel8/x86_64/nsight-systems-2024.1.1-2024.1.1.59_3380207-0.x86_64.rpm",
),
},
}
class NvidiaNsightSystems(Package):
"""NVIDIA Nsight™ Systems is a system-wide performance analysis tool designed
to visualize an applications algorithms, identify the largest opportunities
to optimize, and tune to scale efficiently across any quantity or size of CPUs
and GPUs, from large servers to the smallest system on a chip"""
homepage = "https://developer.nvidia.com/nsight-systems"
url = "https://developer.download.nvidia.com/devtools/repos/"
maintainers("scothalverson")
license("NVIDIA Software License Agreement")
executables = ["^nsys$"]
# Used to unpack the source RPM archives.
depends_on("libarchive programs='bsdtar'", type="build")
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], expand=False)
@classmethod
def determine_version(cls, exe):
output = Executable(exe)("--version", output=str, error=str)
# Example output:
# NVIDIA Nsight Systems version 2024.1.1.59-241133802077v0
# but we only want to match 2024.1.1
match = re.search(r"NVIDIA Nsight Systems version ((?:[0-9]+.){2}[0-9])", output)
return match.group(1) if match else None
def install(self, spec, prefix):
bsdtar = which("bsdtar")
rpm_file = glob(join_path(self.stage.source_path, "nsight-systems*.rpm"))[0]
params = ["-x", "-f", rpm_file]
ver = prefix.split("/")[-1].split("-")[-2]
bsdtar(*params)
arch = self.spec.target.family
if arch == "aarch64":
folders = ["documentation", "host-linux-armv8", "target-linux-sbsa-armv8"]
elif arch == "ppc64le":
folders = ["documentation", "host-linux-ppc64le", "target-linux-ppc64le"]
elif arch == "x86_64":
folders = ["documentation", "host-linux-x64", "target-linux-x64"]
if os.path.exists(join_path("opt", "nvidia", "nsight-systems-cli")):
base_path = join_path("opt", "nvidia", "nsight-systems-cli")
elif os.path.exists(join_path("opt", "nvidia", "nsight-systems")):
base_path = join_path("opt", "nvidia", "nsight-systems")
else:
raise InstallError("Couldn't determine subdirectories to install.")
for sd in folders:
shutil.copytree(join_path(base_path, ver, sd), join_path(prefix, sd))
os.mkdir(join_path(prefix, "bin"))
if arch == "aarch64":
os.symlink(
join_path(prefix, "host-linux-armv8", "nsys-ui"),
join_path(prefix, "bin", "nsys-ui"),
)
os.symlink(
join_path(prefix, "target-linux-sbsa-armv8", "nsys"),
join_path(prefix, "bin", "nsys"),
)
elif arch == "ppc64le":
# `nsys-ui` is missing in the PowerPC version of the package.
os.symlink(
join_path(prefix, "target-linux-ppc64le", "nsys"), join_path(prefix, "bin", "nsys")
)
elif arch == "x86_64":
os.symlink(
join_path(prefix, "host-linux-x64", "nsys-ui"), join_path(prefix, "bin", "nsys-ui")
)
os.symlink(
join_path(prefix, "target-linux-x64", "nsys"), join_path(prefix, "bin", "nsys")
)