1{
2 addDriverRunpath,
3 autoAddDriverRunpath,
4 autoPatchelfHook,
5 backendStdenv,
6 cmake,
7 cuda_cccl ? null,
8 cuda_cudart ? null,
9 cuda_nvcc ? null,
10 cudaAtLeast,
11 cudaOlder,
12 cudatoolkit,
13 cusparselt ? null,
14 cutensor ? null,
15 fetchFromGitHub,
16 lib,
17 libcusparse ? null,
18 setupCudaHook,
19}:
20
21let
22 base = backendStdenv.mkDerivation (finalAttrs: {
23 src = fetchFromGitHub {
24 owner = "NVIDIA";
25 repo = "CUDALibrarySamples";
26 rev = "e57b9c483c5384b7b97b7d129457e5a9bdcdb5e1";
27 sha256 = "0g17afsmb8am0darxchqgjz1lmkaihmnn7k1x4ahg5gllcmw8k3l";
28 };
29 version =
30 lib.strings.substring 0 7 finalAttrs.src.rev + "-" + lib.versions.majorMinor cudatoolkit.version;
31 nativeBuildInputs = [
32 cmake
33 addDriverRunpath
34 ];
35 buildInputs = [ cudatoolkit ];
36 postFixup = ''
37 for exe in $out/bin/*; do
38 addDriverRunpath $exe
39 done
40 '';
41 meta = {
42 description = "examples of using libraries using CUDA";
43 longDescription = ''
44 CUDA Library Samples contains examples demonstrating the use of
45 features in the math and image processing libraries cuBLAS, cuTENSOR,
46 cuSPARSE, cuSOLVER, cuFFT, cuRAND, NPP and nvJPEG.
47 '';
48 license = lib.licenses.bsd3;
49 platforms = [ "x86_64-linux" ];
50 maintainers = with lib.maintainers; [ obsidian-systems-maintenance ];
51 teams = [ lib.teams.cuda ];
52 };
53 });
54in
55
56{
57 cublas = base.overrideAttrs (
58 finalAttrs: _: {
59 pname = "cuda-library-samples-cublas";
60 sourceRoot = "${finalAttrs.src.name}/cuBLASLt";
61 }
62 );
63
64 cusolver = base.overrideAttrs (
65 finalAttrs: _: {
66 pname = "cuda-library-samples-cusolver";
67 sourceRoot = "${finalAttrs.src.name}/cuSOLVER/gesv";
68 }
69 );
70
71 cutensor = base.overrideAttrs (
72 finalAttrs: prevAttrs: {
73 pname = "cuda-library-samples-cutensor";
74
75 sourceRoot = "${finalAttrs.src.name}/cuTENSOR";
76
77 buildInputs = prevAttrs.buildInputs or [ ] ++ [ cutensor ];
78
79 cmakeFlags = prevAttrs.cmakeFlags or [ ] ++ [
80 "-DCUTENSOR_EXAMPLE_BINARY_INSTALL_DIR=${builtins.placeholder "out"}/bin"
81 ];
82
83 # CUTENSOR_ROOT is double escaped
84 postPatch = prevAttrs.postPatch or "" + ''
85 substituteInPlace CMakeLists.txt \
86 --replace-fail "\''${CUTENSOR_ROOT}/include" "${lib.getDev cutensor}/include"
87 '';
88
89 CUTENSOR_ROOT = cutensor;
90
91 meta = prevAttrs.meta or { } // {
92 broken = cutensor == null;
93 };
94 }
95 );
96
97 cusparselt = base.overrideAttrs (
98 finalAttrs: prevAttrs: {
99 pname = "cuda-library-samples-cusparselt";
100
101 sourceRoot = "${finalAttrs.src.name}/cuSPARSELt/matmul";
102
103 buildInputs = prevAttrs.buildInputs or [ ] ++ lib.optionals (cudaOlder "11.4") [ cudatoolkit ];
104
105 nativeBuildInputs =
106 prevAttrs.nativeBuildInputs or [ ]
107 ++ [
108 cmake
109 addDriverRunpath
110 (lib.getDev cusparselt)
111 (lib.getDev libcusparse)
112 ]
113 ++ lib.optionals (cudaOlder "11.4") [ cudatoolkit ]
114 ++ lib.optionals (cudaAtLeast "11.4") [
115 cuda_nvcc
116 (lib.getDev cuda_cudart) # <cuda_runtime_api.h>
117 ]
118 ++ lib.optionals (cudaAtLeast "12.0") [
119 cuda_cccl # <nv/target>
120 ];
121
122 postPatch = prevAttrs.postPatch or "" + ''
123 substituteInPlace CMakeLists.txt \
124 --replace-fail "''${CUSPARSELT_ROOT}/lib64/libcusparseLt.so" "${lib.getLib cusparselt}/lib/libcusparseLt.so" \
125 --replace-fail "''${CUSPARSELT_ROOT}/lib64/libcusparseLt_static.a" "${lib.getStatic cusparselt}/lib/libcusparseLt_static.a"
126 '';
127
128 postInstall = prevAttrs.postInstall or "" + ''
129 mkdir -p $out/bin
130 cp matmul_example $out/bin/
131 cp matmul_example_static $out/bin/
132 '';
133
134 CUDA_TOOLKIT_PATH = lib.getLib cudatoolkit;
135 CUSPARSELT_PATH = lib.getLib cusparselt;
136
137 meta = prevAttrs.meta or { } // {
138 broken =
139 # Base dependencies
140 (cusparselt == null || libcusparse == null)
141 # CUDA 11.4+ dependencies
142 || (cudaAtLeast "11.4" && (cuda_nvcc == null || cuda_cudart == null))
143 # CUDA 12.0+ dependencies
144 || (cudaAtLeast "12.0" && cuda_cccl == null);
145 };
146 }
147 );
148}