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