cusparselt: init at 0.7.1 (#270446)

This commit is contained in:
Suwon Park 2025-03-18 15:02:11 +09:00
parent f286888520
commit 4d30832419
7 changed files with 232 additions and 0 deletions

View File

@ -0,0 +1,144 @@
# Support matrix can be found at
# https://docs.nvidia.com/deeplearning/cudnn/archives/cudnn-880/support-matrix/index.html
{
lib,
stdenv,
cudaVersion,
flags,
mkVersionedPackageName,
}:
let
inherit (lib)
attrsets
lists
modules
versions
strings
trivial
;
inherit (stdenv) hostPlatform;
redistName = "cusparselt";
pname = "libcusparse_lt";
cusparseltVersions = [
"0.7.1"
];
# Manifests :: { redistrib, feature }
# Each release of cusparselt gets mapped to an evaluated module for that release.
# From there, we can get the min/max CUDA versions supported by that release.
# listOfManifests :: List Manifests
listOfManifests =
let
configEvaluator =
fullCusparseltVersion:
modules.evalModules {
modules = [
../modules
# We need to nest the manifests in a config.cusparselt.manifests attribute so the
# module system can evaluate them.
{
cusparselt.manifests = {
redistrib = trivial.importJSON (./manifests + "/redistrib_${fullCusparseltVersion}.json");
feature = trivial.importJSON (./manifests + "/feature_${fullCusparseltVersion}.json");
};
}
];
};
# Un-nest the manifests attribute set.
releaseGrabber = evaluatedModules: evaluatedModules.config.cusparselt.manifests;
in
lists.map (trivial.flip trivial.pipe [
configEvaluator
releaseGrabber
]) cusparseltVersions;
# Our cudaVersion tells us which version of CUDA we're building against.
# The subdirectories in lib/ tell us which versions of CUDA are supported.
# Typically the names will look like this:
#
# - 10.2
# - 11
# - 11.0
# - 12
# libPath :: String
libPath =
let
cudaMajorMinor = versions.majorMinor cudaVersion;
cudaMajor = versions.major cudaVersion;
in
if cudaMajorMinor == "10.2" then cudaMajorMinor else cudaMajor;
# A release is supported if it has a libPath that matches our CUDA version for our platform.
# LibPath are not constant across the same release -- one platform may support fewer
# CUDA versions than another.
# redistArch :: String
redistArch = flags.getRedistArch hostPlatform.system;
# platformIsSupported :: Manifests -> Boolean
platformIsSupported =
{ feature, redistrib, ... }:
(attrsets.attrByPath [
pname
redistArch
] null feature) != null;
# TODO(@connorbaker): With an auxiliary file keeping track of the CUDA versions each release supports,
# we could filter out releases that don't support our CUDA version.
# However, we don't have that currently, so we make a best-effort to try to build TensorRT with whatever
# libPath corresponds to our CUDA version.
# supportedManifests :: List Manifests
supportedManifests = builtins.filter platformIsSupported listOfManifests;
# Compute versioned attribute name to be used in this package set
# Patch version changes should not break the build, so we only use major and minor
# computeName :: RedistribRelease -> String
computeName = { version, ... }: mkVersionedPackageName redistName version;
in
final: _:
let
# buildCusparseltPackage :: Manifests -> AttrSet Derivation
buildCusparseltPackage =
{ redistrib, feature }:
let
drv = final.callPackage ../generic-builders/manifest.nix {
inherit pname redistName;
redistribRelease = redistrib.${pname};
featureRelease = feature.${pname};
};
fixedDrv = drv.overrideAttrs (prevAttrs: {
buildInputs =
prevAttrs.buildInputs
++ lists.optionals (strings.versionOlder cudaVersion "11.4") [ final.cudatoolkit ]
++ lists.optionals (strings.versionAtLeast cudaVersion "11.4") (
[ final.libcublas.lib ]
# For some reason, the 1.4.x release of cusparselt requires the cudart library.
++ lists.optionals (strings.hasPrefix "1.4" redistrib.${pname}.version) [ final.cuda_cudart.lib ]
);
meta = prevAttrs.meta // {
description = "cuSPARSELt: A High-Performance CUDA Library for Sparse Matrix-Matrix Multiplication";
homepage = "https://developer.nvidia.com/cusparselt-downloads";
maintainers = prevAttrs.meta.maintainers ++ [ lib.maintainers.sepiabrown ];
license = lib.licenses.unfreeRedistributable // {
shortName = "cuSPARSELt EULA";
fullName = "cuSPARSELt SUPPLEMENT TO SOFTWARE LICENSE AGREEMENT FOR NVIDIA SOFTWARE DEVELOPMENT KITS";
url = "https://docs.nvidia.com/cuda/cusparselt/license.html";
};
};
});
in
attrsets.nameValuePair (computeName redistrib.${pname}) fixedDrv;
extension =
let
nameOfNewest = computeName (lists.last supportedManifests).redistrib.${pname};
drvs = builtins.listToAttrs (lists.map buildCusparseltPackage supportedManifests);
containsDefault = attrsets.optionalAttrs (drvs != { }) { cusparselt = drvs.${nameOfNewest}; };
in
drvs // containsDefault;
in
extension

View File

@ -0,0 +1,44 @@
{
"libcusparse_lt": {
"linux-aarch64": {
"outputs": {
"bin": false,
"dev": true,
"doc": false,
"lib": true,
"sample": false,
"static": true
}
},
"linux-sbsa": {
"outputs": {
"bin": false,
"dev": true,
"doc": false,
"lib": true,
"sample": false,
"static": true
}
},
"linux-x86_64": {
"outputs": {
"bin": false,
"dev": true,
"doc": false,
"lib": true,
"sample": false,
"static": true
}
},
"windows-x86_64": {
"outputs": {
"bin": false,
"dev": true,
"doc": false,
"lib": false,
"sample": false,
"static": false
}
}
}
}

View File

@ -0,0 +1,35 @@
{
"release_date": "2025-02-25",
"release_label": "0.7.1",
"release_product": "cusparselt",
"libcusparse_lt": {
"name": "NVIDIA cuSPARSELt",
"license": "cuSPARSELt",
"license_path": "libcusparse_lt/LICENSE.txt",
"version": "0.7.1.0",
"linux-x86_64": {
"relative_path": "libcusparse_lt/linux-x86_64/libcusparse_lt-linux-x86_64-0.7.1.0-archive.tar.xz",
"sha256": "a0d885837887c73e466a31b4e86aaae2b7d0cc9c5de0d40921dbe2a15dbd6a88",
"md5": "b2e5f3c9b9d69e1e0b55b16de33fdc6e",
"size": "353151840"
},
"linux-sbsa": {
"relative_path": "libcusparse_lt/linux-sbsa/libcusparse_lt-linux-sbsa-0.7.1.0-archive.tar.xz",
"sha256": "4a131d0a54728e53ba536b50bb65380603456f1656e7df8ee52e285618a0b57c",
"md5": "612a712c7da6e801ee773687e99af87e",
"size": "352406784"
},
"windows-x86_64": {
"relative_path": "libcusparse_lt/windows-x86_64/libcusparse_lt-windows-x86_64-0.7.1.0-archive.zip",
"sha256": "004bcb1b700c24ca8d60a8ddd2124640f61138a6c29914d2afaa0bfa0d0e3cf2",
"md5": "a1d8df8dc8ff4b3bd0e859f992f8f392",
"size": "268594665"
},
"linux-aarch64": {
"relative_path": "libcusparse_lt/linux-aarch64/libcusparse_lt-linux-aarch64-0.7.1.0-archive.tar.xz",
"sha256": "d3b0a660fd552e0bd9a4491b15299d968674833483d5f164cfea35e70646136c",
"md5": "54e3f3b28c94118991ce54ec38f531fb",
"size": "5494380"
}
}
}

View File

@ -0,0 +1,4 @@
{ options, ... }:
{
options.cusparselt.manifests = options.generic.manifests;
}

View File

@ -4,6 +4,7 @@
# Always after generic
./cuda
./cudnn
./cusparselt
./cutensor
./tensorrt
];

View File

@ -148,6 +148,9 @@ let
(callPackage ../development/cuda-modules/cutensor/extension.nix {
inherit cudaVersion flags mkVersionedPackageName;
})
(callPackage ../development/cuda-modules/cusparselt/extension.nix {
inherit cudaVersion flags mkVersionedPackageName;
})
(callPackage ../development/cuda-modules/generic-builders/multiplex.nix {
inherit cudaVersion flags mkVersionedPackageName;
pname = "tensorrt";

View File

@ -23,6 +23,7 @@ let
|| builtins.elem license.shortName [
"CUDA EULA"
"cuDNN EULA"
"cuSPARSELt EULA"
"cuTENSOR EULA"
"NVidia OptiX EULA"
]