|
1 | 1 | { |
2 | | - lib, |
3 | | - backendStdenv, |
4 | | - fetchFromGitHub, |
5 | | - cmake, |
6 | 2 | addDriverRunpath, |
7 | 3 | autoAddDriverRunpath, |
| 4 | + autoPatchelfHook, |
| 5 | + backendStdenv, |
| 6 | + cmake, |
| 7 | + cuda_cccl ? null, |
| 8 | + cuda_cudart ? null, |
| 9 | + cuda_nvcc ? null, |
| 10 | + cudaAtLeast, |
| 11 | + cudaOlder, |
8 | 12 | cudatoolkit, |
9 | | - cutensor, |
10 | | - cusparselt, |
11 | | - cudaPackages, |
| 13 | + cusparselt ? null, |
| 14 | + cutensor ? null, |
| 15 | + fetchFromGitHub, |
| 16 | + lib, |
| 17 | + libcusparse ? null, |
12 | 18 | setupCudaHook, |
13 | | - autoPatchelfHook, |
14 | 19 | }: |
15 | 20 |
|
16 | 21 | let |
17 | | - inherit (cudaPackages) |
18 | | - cuda_cccl |
19 | | - cuda_cudart |
20 | | - cuda_nvcc |
21 | | - libcusparse |
22 | | - cudaAtLeast |
23 | | - cudaOlder |
24 | | - ; |
25 | | - rev = "e57b9c483c5384b7b97b7d129457e5a9bdcdb5e1"; |
26 | | - src = fetchFromGitHub { |
27 | | - owner = "NVIDIA"; |
28 | | - repo = "CUDALibrarySamples"; |
29 | | - inherit rev; |
30 | | - sha256 = "0g17afsmb8am0darxchqgjz1lmkaihmnn7k1x4ahg5gllcmw8k3l"; |
31 | | - }; |
32 | | - commonAttrs = { |
33 | | - version = lib.strings.substring 0 7 rev + "-" + lib.versions.majorMinor cudatoolkit.version; |
| 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; |
34 | 31 | nativeBuildInputs = [ |
35 | 32 | cmake |
36 | 33 | addDriverRunpath |
|
53 | 50 | maintainers = with lib.maintainers; [ obsidian-systems-maintenance ]; |
54 | 51 | teams = [ lib.teams.cuda ]; |
55 | 52 | }; |
56 | | - }; |
| 53 | + }); |
57 | 54 | in |
58 | 55 |
|
59 | 56 | { |
60 | | - cublas = backendStdenv.mkDerivation ( |
61 | | - commonAttrs |
62 | | - // { |
| 57 | + cublas = base.overrideAttrs ( |
| 58 | + finalAttrs: _: { |
63 | 59 | pname = "cuda-library-samples-cublas"; |
64 | | - |
65 | | - src = "${src}/cuBLASLt"; |
| 60 | + sourceRoot = "${finalAttrs.src.name}/cuBLASLt"; |
66 | 61 | } |
67 | 62 | ); |
68 | 63 |
|
69 | | - cusolver = backendStdenv.mkDerivation ( |
70 | | - commonAttrs |
71 | | - // { |
| 64 | + cusolver = base.overrideAttrs ( |
| 65 | + finalAttrs: _: { |
72 | 66 | pname = "cuda-library-samples-cusolver"; |
73 | | - |
74 | | - src = "${src}/cuSOLVER"; |
75 | | - |
76 | | - sourceRoot = "cuSOLVER/gesv"; |
| 67 | + sourceRoot = "${finalAttrs.src.name}/cuSOLVER/gesv"; |
77 | 68 | } |
78 | 69 | ); |
79 | 70 |
|
80 | | - cutensor = backendStdenv.mkDerivation ( |
81 | | - commonAttrs |
82 | | - // { |
| 71 | + cutensor = base.overrideAttrs ( |
| 72 | + finalAttrs: prevAttrs: { |
83 | 73 | pname = "cuda-library-samples-cutensor"; |
84 | 74 |
|
85 | | - src = "${src}/cuTENSOR"; |
| 75 | + sourceRoot = "${finalAttrs.src.name}/cuTENSOR"; |
86 | 76 |
|
87 | | - buildInputs = [ cutensor ]; |
| 77 | + buildInputs = prevAttrs.buildInputs or [ ] ++ [ cutensor ]; |
88 | 78 |
|
89 | | - cmakeFlags = [ "-DCUTENSOR_EXAMPLE_BINARY_INSTALL_DIR=${builtins.placeholder "out"}/bin" ]; |
| 79 | + cmakeFlags = prevAttrs.cmakeFlags or [ ] ++ [ |
| 80 | + "-DCUTENSOR_EXAMPLE_BINARY_INSTALL_DIR=${builtins.placeholder "out"}/bin" |
| 81 | + ]; |
90 | 82 |
|
91 | 83 | # CUTENSOR_ROOT is double escaped |
92 | | - postPatch = '' |
93 | | - substituteInPlace CMakeLists.txt \ |
94 | | - --replace-fail "\''${CUTENSOR_ROOT}/include" "${cutensor.dev}/include" |
95 | | - ''; |
| 84 | + postPatch = |
| 85 | + prevAttrs.postPatch or "" |
| 86 | + + '' |
| 87 | + substituteInPlace CMakeLists.txt \ |
| 88 | + --replace-fail "\''${CUTENSOR_ROOT}/include" "${lib.getDev cutensor}/include" |
| 89 | + ''; |
96 | 90 |
|
97 | 91 | CUTENSOR_ROOT = cutensor; |
| 92 | + |
| 93 | + meta = prevAttrs.meta or { } // { |
| 94 | + broken = cutensor == null; |
| 95 | + }; |
98 | 96 | } |
99 | 97 | ); |
100 | 98 |
|
101 | | - cusparselt = backendStdenv.mkDerivation ( |
102 | | - commonAttrs |
103 | | - // { |
| 99 | + cusparselt = base.overrideAttrs ( |
| 100 | + finalAttrs: prevAttrs: { |
104 | 101 | pname = "cuda-library-samples-cusparselt"; |
105 | 102 |
|
106 | | - src = "${src}/cuSPARSELt"; |
| 103 | + sourceRoot = "${finalAttrs.src.name}/cuSPARSELt/matmul"; |
107 | 104 |
|
108 | | - sourceRoot = "cuSPARSELt/matmul"; |
109 | | - |
110 | | - buildInputs = lib.optionals (cudaOlder "11.4") [ cudatoolkit ]; |
| 105 | + buildInputs = prevAttrs.buildInputs or [ ] ++ lib.optionals (cudaOlder "11.4") [ cudatoolkit ]; |
111 | 106 |
|
112 | 107 | nativeBuildInputs = |
113 | | - [ |
| 108 | + prevAttrs.nativeBuildInputs or [ ] |
| 109 | + ++ [ |
114 | 110 | cmake |
115 | 111 | addDriverRunpath |
116 | 112 | (lib.getDev cusparselt) |
|
125 | 121 | cuda_cccl # <nv/target> |
126 | 122 | ]; |
127 | 123 |
|
128 | | - postPatch = '' |
129 | | - substituteInPlace CMakeLists.txt \ |
130 | | - --replace-fail "''${CUSPARSELT_ROOT}/lib64/libcusparseLt.so" "${lib.getLib cusparselt}/lib/libcusparseLt.so" \ |
131 | | - --replace-fail "''${CUSPARSELT_ROOT}/lib64/libcusparseLt_static.a" "${lib.getStatic cusparselt}/lib/libcusparseLt_static.a" |
132 | | - ''; |
133 | | - |
134 | | - installPhase = '' |
135 | | - runHook preInstall |
136 | | - mkdir -p $out/bin |
137 | | - cp matmul_example $out/bin/ |
138 | | - cp matmul_example_static $out/bin/ |
139 | | - runHook postInstall |
140 | | - ''; |
| 124 | + postPatch = |
| 125 | + prevAttrs.postPatch or "" |
| 126 | + + '' |
| 127 | + substituteInPlace CMakeLists.txt \ |
| 128 | + --replace-fail "''${CUSPARSELT_ROOT}/lib64/libcusparseLt.so" "${lib.getLib cusparselt}/lib/libcusparseLt.so" \ |
| 129 | + --replace-fail "''${CUSPARSELT_ROOT}/lib64/libcusparseLt_static.a" "${lib.getStatic cusparselt}/lib/libcusparseLt_static.a" |
| 130 | + ''; |
| 131 | + |
| 132 | + postInstall = |
| 133 | + prevAttrs.postInstall or "" |
| 134 | + + '' |
| 135 | + mkdir -p $out/bin |
| 136 | + cp matmul_example $out/bin/ |
| 137 | + cp matmul_example_static $out/bin/ |
| 138 | + ''; |
141 | 139 |
|
142 | 140 | CUDA_TOOLKIT_PATH = lib.getLib cudatoolkit; |
143 | 141 | CUSPARSELT_PATH = lib.getLib cusparselt; |
| 142 | + |
| 143 | + meta = prevAttrs.meta or { } // { |
| 144 | + broken = |
| 145 | + # Base dependencies |
| 146 | + (cusparselt == null || libcusparse == null) |
| 147 | + # CUDA 11.4+ dependencies |
| 148 | + || (cudaAtLeast "11.4" && (cuda_nvcc == null || cuda_cudart == null)) |
| 149 | + # CUDA 12.0+ dependencies |
| 150 | + || (cudaAtLeast "12.0" && cuda_cccl == null); |
| 151 | + }; |
144 | 152 | } |
145 | 153 | ); |
146 | 154 | } |
0 commit comments