nvmath-python 1.0.0__cp314-cp314t-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. nvmath/__init__.pxd +0 -0
  2. nvmath/__init__.py +45 -0
  3. nvmath/_internal/__init__.py +0 -0
  4. nvmath/_internal/attribute_ifc_factory.py +330 -0
  5. nvmath/_internal/layout.py +70 -0
  6. nvmath/_internal/templates.py +130 -0
  7. nvmath/_internal/threadsafe.py +106 -0
  8. nvmath/_internal/utils.py +43 -0
  9. nvmath/_internal/workspace.py +490 -0
  10. nvmath/_utils.py +147 -0
  11. nvmath/bindings/__init__.py +60 -0
  12. nvmath/bindings/_internal/__init__.pxd +0 -0
  13. nvmath/bindings/_internal/__init__.py +0 -0
  14. nvmath/bindings/_internal/common_types.pxd +31 -0
  15. nvmath/bindings/_internal/cublas.cp314t-win_amd64.pyd +0 -0
  16. nvmath/bindings/_internal/cublas.pxd +530 -0
  17. nvmath/bindings/_internal/cublasLt.cp314t-win_amd64.pyd +0 -0
  18. nvmath/bindings/_internal/cublasLt.pxd +59 -0
  19. nvmath/bindings/_internal/cublasMp.pxd +52 -0
  20. nvmath/bindings/_internal/cudss.cp314t-win_amd64.pyd +0 -0
  21. nvmath/bindings/_internal/cudss.pxd +54 -0
  22. nvmath/bindings/_internal/cufft.cp314t-win_amd64.pyd +0 -0
  23. nvmath/bindings/_internal/cufft.pxd +70 -0
  24. nvmath/bindings/_internal/cufftMp.pxd +77 -0
  25. nvmath/bindings/_internal/curand.cp314t-win_amd64.pyd +0 -0
  26. nvmath/bindings/_internal/curand.pxd +42 -0
  27. nvmath/bindings/_internal/cusolver.cp314t-win_amd64.pyd +0 -0
  28. nvmath/bindings/_internal/cusolver.pxd +15 -0
  29. nvmath/bindings/_internal/cusolverDn.cp314t-win_amd64.pyd +0 -0
  30. nvmath/bindings/_internal/cusolverDn.pxd +406 -0
  31. nvmath/bindings/_internal/cusolverMp.pxd +71 -0
  32. nvmath/bindings/_internal/cusolverSp.cp314t-win_amd64.pyd +0 -0
  33. nvmath/bindings/_internal/cusolverSp.pxd +75 -0
  34. nvmath/bindings/_internal/cusparse.cp314t-win_amd64.pyd +0 -0
  35. nvmath/bindings/_internal/cusparse.pxd +471 -0
  36. nvmath/bindings/_internal/cusparseLt.cp314t-win_amd64.pyd +0 -0
  37. nvmath/bindings/_internal/cusparseLt.pxd +48 -0
  38. nvmath/bindings/_internal/cutensor.cp314t-win_amd64.pyd +0 -0
  39. nvmath/bindings/_internal/cutensor.pxd +58 -0
  40. nvmath/bindings/_internal/mathdx.cp314t-win_amd64.pyd +0 -0
  41. nvmath/bindings/_internal/mathdx.pxd +116 -0
  42. nvmath/bindings/_internal/nvshmem.pxd +29 -0
  43. nvmath/bindings/_internal/utils.cp314t-win_amd64.pyd +0 -0
  44. nvmath/bindings/_internal/utils.pxd +174 -0
  45. nvmath/bindings/_internal/utils.pyi +10 -0
  46. nvmath/bindings/cublas.cp314t-win_amd64.pyd +0 -0
  47. nvmath/bindings/cublas.pxd +558 -0
  48. nvmath/bindings/cublas.pyi +812 -0
  49. nvmath/bindings/cublasLt.cp314t-win_amd64.pyd +0 -0
  50. nvmath/bindings/cublasLt.pxd +109 -0
  51. nvmath/bindings/cublasLt.pyi +1461 -0
  52. nvmath/bindings/cublasMp.pxd +85 -0
  53. nvmath/bindings/cublasMp.pyi +267 -0
  54. nvmath/bindings/cudss.cp314t-win_amd64.pyd +0 -0
  55. nvmath/bindings/cudss.pxd +98 -0
  56. nvmath/bindings/cudss.pyi +443 -0
  57. nvmath/bindings/cufft.cp314t-win_amd64.pyd +0 -0
  58. nvmath/bindings/cufft.pxd +118 -0
  59. nvmath/bindings/cufft.pyi +301 -0
  60. nvmath/bindings/cufftMp.pxd +124 -0
  61. nvmath/bindings/cufftMp.pyi +326 -0
  62. nvmath/bindings/curand.cp314t-win_amd64.pyd +0 -0
  63. nvmath/bindings/curand.pxd +71 -0
  64. nvmath/bindings/curand.pyi +189 -0
  65. nvmath/bindings/cusolver.cp314t-win_amd64.pyd +0 -0
  66. nvmath/bindings/cusolver.pxd +62 -0
  67. nvmath/bindings/cusolver.pyi +320 -0
  68. nvmath/bindings/cusolverDn.cp314t-win_amd64.pyd +0 -0
  69. nvmath/bindings/cusolverDn.pxd +430 -0
  70. nvmath/bindings/cusolverDn.pyi +422 -0
  71. nvmath/bindings/cusolverMp.pxd +98 -0
  72. nvmath/bindings/cusolverMp.pyi +114 -0
  73. nvmath/bindings/cusolverSp.cp314t-win_amd64.pyd +0 -0
  74. nvmath/bindings/cusolverSp.pxd +95 -0
  75. nvmath/bindings/cusolverSp.pyi +70 -0
  76. nvmath/bindings/cusparse.cp314t-win_amd64.pyd +0 -0
  77. nvmath/bindings/cusparse.pxd +546 -0
  78. nvmath/bindings/cusparse.pyi +1017 -0
  79. nvmath/bindings/cusparseLt.cp314t-win_amd64.pyd +0 -0
  80. nvmath/bindings/cusparseLt.pxd +99 -0
  81. nvmath/bindings/cusparseLt.pyi +252 -0
  82. nvmath/bindings/cutensor.cp314t-win_amd64.pyd +0 -0
  83. nvmath/bindings/cutensor.pxd +98 -0
  84. nvmath/bindings/cutensor.pyi +324 -0
  85. nvmath/bindings/cycublas.cp314t-win_amd64.pyd +0 -0
  86. nvmath/bindings/cycublas.pxd +664 -0
  87. nvmath/bindings/cycublasLt.cp314t-win_amd64.pyd +0 -0
  88. nvmath/bindings/cycublasLt.pxd +1045 -0
  89. nvmath/bindings/cycublasMp.pxd +171 -0
  90. nvmath/bindings/cycudss.cp314t-win_amd64.pyd +0 -0
  91. nvmath/bindings/cycudss.pxd +277 -0
  92. nvmath/bindings/cycufft.cp314t-win_amd64.pyd +0 -0
  93. nvmath/bindings/cycufft.pxd +333 -0
  94. nvmath/bindings/cycufftMp.pxd +342 -0
  95. nvmath/bindings/cycurand.cp314t-win_amd64.pyd +0 -0
  96. nvmath/bindings/cycurand.pxd +141 -0
  97. nvmath/bindings/cycusolver.cp314t-win_amd64.pyd +0 -0
  98. nvmath/bindings/cycusolver.pxd +137 -0
  99. nvmath/bindings/cycusolverDn.cp314t-win_amd64.pyd +0 -0
  100. nvmath/bindings/cycusolverDn.pxd +443 -0
  101. nvmath/bindings/cycusolverMp.pxd +107 -0
  102. nvmath/bindings/cycusolverSp.cp314t-win_amd64.pyd +0 -0
  103. nvmath/bindings/cycusolverSp.pxd +93 -0
  104. nvmath/bindings/cycusparse.cp314t-win_amd64.pyd +0 -0
  105. nvmath/bindings/cycusparse.pxd +679 -0
  106. nvmath/bindings/cycusparseLt.cp314t-win_amd64.pyd +0 -0
  107. nvmath/bindings/cycusparseLt.pxd +135 -0
  108. nvmath/bindings/cycutensor.cp314t-win_amd64.pyd +0 -0
  109. nvmath/bindings/cycutensor.pxd +189 -0
  110. nvmath/bindings/cymathdx.cp314t-win_amd64.pyd +0 -0
  111. nvmath/bindings/cymathdx.pxd +552 -0
  112. nvmath/bindings/cynvshmem.pxd +118 -0
  113. nvmath/bindings/mathdx.cp314t-win_amd64.pyd +0 -0
  114. nvmath/bindings/mathdx.pxd +182 -0
  115. nvmath/bindings/mathdx.pyi +1562 -0
  116. nvmath/bindings/nvpl/__init__.pxd +0 -0
  117. nvmath/bindings/nvpl/__init__.py +13 -0
  118. nvmath/bindings/nvpl/_internal/__init__.pxd +0 -0
  119. nvmath/bindings/nvpl/_internal/__init__.py +0 -0
  120. nvmath/bindings/nvpl/_internal/blas.cp314t-win_amd64.pyd +0 -0
  121. nvmath/bindings/nvpl/_internal/blas.pxd +237 -0
  122. nvmath/bindings/nvpl/_internal/fft.cp314t-win_amd64.pyd +0 -0
  123. nvmath/bindings/nvpl/_internal/fft.pxd +36 -0
  124. nvmath/bindings/nvpl/blas.cp314t-win_amd64.pyd +0 -0
  125. nvmath/bindings/nvpl/blas.pxd +131 -0
  126. nvmath/bindings/nvpl/blas.pyi +168 -0
  127. nvmath/bindings/nvpl/cyblas.cp314t-win_amd64.pyd +0 -0
  128. nvmath/bindings/nvpl/cyblas.pxd +280 -0
  129. nvmath/bindings/nvpl/cyfft.cp314t-win_amd64.pyd +0 -0
  130. nvmath/bindings/nvpl/cyfft.pxd +93 -0
  131. nvmath/bindings/nvpl/fft.cp314t-win_amd64.pyd +0 -0
  132. nvmath/bindings/nvpl/fft.pxd +100 -0
  133. nvmath/bindings/nvpl/fft.pyi +168 -0
  134. nvmath/bindings/nvshmem.pxd +54 -0
  135. nvmath/bindings/nvshmem.pyi +191 -0
  136. nvmath/device/__init__.py +38 -0
  137. nvmath/device/_deprecated.py +33 -0
  138. nvmath/device/common.py +315 -0
  139. nvmath/device/common_backend.py +131 -0
  140. nvmath/device/common_cuda.py +201 -0
  141. nvmath/device/common_numba.py +300 -0
  142. nvmath/device/common_numba_cuda_mlir.py +202 -0
  143. nvmath/device/common_opaque_tensor.py +201 -0
  144. nvmath/device/cublasdx.py +1606 -0
  145. nvmath/device/cublasdx_backend.py +860 -0
  146. nvmath/device/cublasdx_numba.py +1534 -0
  147. nvmath/device/cublasdx_numba_cuda_mlir.py +208 -0
  148. nvmath/device/cufftdx.py +373 -0
  149. nvmath/device/cufftdx_backend.py +220 -0
  150. nvmath/device/cufftdx_numba.py +140 -0
  151. nvmath/device/cufftdx_numba_cuda_mlir.py +79 -0
  152. nvmath/device/curand_kernel.py +9147 -0
  153. nvmath/device/cusolverdx.py +2708 -0
  154. nvmath/device/cusolverdx_backend.py +440 -0
  155. nvmath/device/cusolverdx_numba.py +567 -0
  156. nvmath/device/cusolverdx_numba_cuda_mlir.py +604 -0
  157. nvmath/device/cusolverdx_overload_backend.py +1029 -0
  158. nvmath/device/llvm_array.py +29 -0
  159. nvmath/device/random.py +441 -0
  160. nvmath/device/random_helpers.py +23 -0
  161. nvmath/device/random_states.py +187 -0
  162. nvmath/device/types.py +138 -0
  163. nvmath/device/vector_types_numba.py +259 -0
  164. nvmath/distributed/__init__.py +200 -0
  165. nvmath/distributed/_internal/__init__.py +0 -0
  166. nvmath/distributed/_internal/nccl.py +86 -0
  167. nvmath/distributed/_internal/nvshmem.py +307 -0
  168. nvmath/distributed/_internal/symmetric_memory.py +35 -0
  169. nvmath/distributed/_internal/tensor_ifc.py +70 -0
  170. nvmath/distributed/_internal/tensor_ifc_cupy.py +68 -0
  171. nvmath/distributed/_internal/tensor_ifc_host_device.py +172 -0
  172. nvmath/distributed/_internal/tensor_ifc_numpy.py +46 -0
  173. nvmath/distributed/_internal/tensor_ifc_torch.py +162 -0
  174. nvmath/distributed/_internal/tensor_wrapper.py +81 -0
  175. nvmath/distributed/_utils.py +167 -0
  176. nvmath/distributed/distribution/__init__.py +30 -0
  177. nvmath/distributed/distribution/_configuration.py +39 -0
  178. nvmath/distributed/distribution/distributions.py +1024 -0
  179. nvmath/distributed/distribution/redistribute.py +1284 -0
  180. nvmath/distributed/fft/__init__.py +7 -0
  181. nvmath/distributed/fft/_configuration.py +82 -0
  182. nvmath/distributed/fft/fft.py +2742 -0
  183. nvmath/distributed/linalg/__init__.py +22 -0
  184. nvmath/distributed/linalg/_internal/__init__.py +3 -0
  185. nvmath/distributed/linalg/_internal/epilog_protocol.py +586 -0
  186. nvmath/distributed/linalg/_internal/matmul_desc_ifc.py +28 -0
  187. nvmath/distributed/linalg/advanced/__init__.py +8 -0
  188. nvmath/distributed/linalg/advanced/_configuration.py +171 -0
  189. nvmath/distributed/linalg/advanced/matmulmod.py +3573 -0
  190. nvmath/distributed/linalg/generic/__init__.py +8 -0
  191. nvmath/distributed/linalg/generic/_caching.py +66 -0
  192. nvmath/distributed/linalg/generic/_configuration.py +61 -0
  193. nvmath/distributed/linalg/generic/_factorization.py +172 -0
  194. nvmath/distributed/linalg/generic/_initialization.py +966 -0
  195. nvmath/distributed/linalg/generic/_problem_spec.py +511 -0
  196. nvmath/distributed/linalg/generic/solvermod.py +1368 -0
  197. nvmath/distributed/process_group.py +408 -0
  198. nvmath/fft/__init__.py +7 -0
  199. nvmath/fft/_configuration.py +189 -0
  200. nvmath/fft/_exec_utils.py +82 -0
  201. nvmath/fft/_helpers.py +237 -0
  202. nvmath/fft/fft.py +3122 -0
  203. nvmath/internal/__init__.pxd +3 -0
  204. nvmath/internal/__init__.py +10 -0
  205. nvmath/internal/_bindings.cp314t-win_amd64.pyd +0 -0
  206. nvmath/internal/_bindings.pxd +18 -0
  207. nvmath/internal/_device_utils.py +45 -0
  208. nvmath/internal/_layout/__init__.pxd +3 -0
  209. nvmath/internal/_layout/__init__.py +7 -0
  210. nvmath/internal/_layout/_layout.cp314t-win_amd64.pyd +0 -0
  211. nvmath/internal/_layout/_layout.pxd +1303 -0
  212. nvmath/internal/_layout/_layout.pyi +1145 -0
  213. nvmath/internal/enum_utils.py +142 -0
  214. nvmath/internal/formatters.py +87 -0
  215. nvmath/internal/mem_limit.py +51 -0
  216. nvmath/internal/memory.cp314t-win_amd64.pyd +0 -0
  217. nvmath/internal/memory.pxd +13 -0
  218. nvmath/internal/memory.pyi +50 -0
  219. nvmath/internal/ndbuffer/__init__.pxd +3 -0
  220. nvmath/internal/ndbuffer/__init__.py +9 -0
  221. nvmath/internal/ndbuffer/_copy_kernel.cp314t-win_amd64.pyd +0 -0
  222. nvmath/internal/ndbuffer/_copy_kernel.pxd +10 -0
  223. nvmath/internal/ndbuffer/_jit.cp314t-win_amd64.pyd +0 -0
  224. nvmath/internal/ndbuffer/_jit.pxd +7 -0
  225. nvmath/internal/ndbuffer/_ndbuffer.cp314t-win_amd64.pyd +0 -0
  226. nvmath/internal/ndbuffer/_ndbuffer.pxd +40 -0
  227. nvmath/internal/ndbuffer/_ndbuffer.pyi +463 -0
  228. nvmath/internal/ndbuffer/copy_kernel/args.h +34 -0
  229. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/array_view.h +52 -0
  230. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/elementwise.h +68 -0
  231. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/grid_indexer.h +69 -0
  232. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/transposed.h +242 -0
  233. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/type_utils.h +39 -0
  234. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/utils.h +132 -0
  235. nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/vec.h +159 -0
  236. nvmath/internal/ndbuffer/copy_kernel/elementwise.h +53 -0
  237. nvmath/internal/ndbuffer/copy_kernel/transposed.h +58 -0
  238. nvmath/internal/package_ifc.py +168 -0
  239. nvmath/internal/package_ifc_cuda.py +57 -0
  240. nvmath/internal/package_ifc_cupy.py +67 -0
  241. nvmath/internal/package_ifc_torch.py +69 -0
  242. nvmath/internal/package_wrapper.py +14 -0
  243. nvmath/internal/tensor_ifc.py +179 -0
  244. nvmath/internal/tensor_ifc_cupy.py +234 -0
  245. nvmath/internal/tensor_ifc_ndbuffer.py +147 -0
  246. nvmath/internal/tensor_ifc_numpy.py +184 -0
  247. nvmath/internal/tensor_ifc_torch.py +178 -0
  248. nvmath/internal/tensor_wrapper.py +160 -0
  249. nvmath/internal/typemaps.py +113 -0
  250. nvmath/internal/utils.py +805 -0
  251. nvmath/linalg/__init__.py +56 -0
  252. nvmath/linalg/_internal/__init__.py +3 -0
  253. nvmath/linalg/_internal/algo_cap_ifc.py +82 -0
  254. nvmath/linalg/_internal/algo_config_ifc.py +43 -0
  255. nvmath/linalg/_internal/batch.py +234 -0
  256. nvmath/linalg/_internal/enum_to_tuples.py +64 -0
  257. nvmath/linalg/_internal/epilog_protocol.py +766 -0
  258. nvmath/linalg/_internal/layout.py +624 -0
  259. nvmath/linalg/_internal/matmul_desc_ifc.py +28 -0
  260. nvmath/linalg/_internal/matmul_pref_ifc.py +27 -0
  261. nvmath/linalg/_internal/matrix_layout_ifc.py +26 -0
  262. nvmath/linalg/_internal/solver_utils.py +432 -0
  263. nvmath/linalg/_internal/typemaps.py +144 -0
  264. nvmath/linalg/_internal/utils.py +157 -0
  265. nvmath/linalg/advanced/__init__.py +8 -0
  266. nvmath/linalg/advanced/_algorithmmod.py +170 -0
  267. nvmath/linalg/advanced/_configuration.py +351 -0
  268. nvmath/linalg/advanced/helpers/__init__.py +5 -0
  269. nvmath/linalg/advanced/helpers/matmul.py +1316 -0
  270. nvmath/linalg/advanced/matmulmod.py +3734 -0
  271. nvmath/linalg/generic/__init__.py +53 -0
  272. nvmath/linalg/generic/_configuration/__init__.py +39 -0
  273. nvmath/linalg/generic/_configuration/layout.py +263 -0
  274. nvmath/linalg/generic/_configuration/match.py +734 -0
  275. nvmath/linalg/generic/_configuration/qualifiers.py +493 -0
  276. nvmath/linalg/generic/_configuration/solver_configuration.py +59 -0
  277. nvmath/linalg/generic/_configuration/wrap.py +217 -0
  278. nvmath/linalg/generic/_dtype.py +15 -0
  279. nvmath/linalg/generic/matmulmod.py +2094 -0
  280. nvmath/linalg/generic/solvermod.py +1301 -0
  281. nvmath/memory.py +279 -0
  282. nvmath/sparse/__init__.py +38 -0
  283. nvmath/sparse/_internal/__init__.py +21 -0
  284. nvmath/sparse/_internal/common_utils.py +147 -0
  285. nvmath/sparse/_internal/cudss_config_ifc.py +702 -0
  286. nvmath/sparse/_internal/cudss_data_ifc.py +399 -0
  287. nvmath/sparse/_internal/cudss_utils.py +506 -0
  288. nvmath/sparse/_internal/cusparse_utils.py +382 -0
  289. nvmath/sparse/_internal/sparse_bsc_ifc.py +303 -0
  290. nvmath/sparse/_internal/sparse_bsr_ifc.py +305 -0
  291. nvmath/sparse/_internal/sparse_coo_ifc.py +256 -0
  292. nvmath/sparse/_internal/sparse_csc_ifc.py +268 -0
  293. nvmath/sparse/_internal/sparse_csr_ifc.py +288 -0
  294. nvmath/sparse/_internal/sparse_dia_ifc.py +242 -0
  295. nvmath/sparse/_internal/sparse_format_helpers.py +601 -0
  296. nvmath/sparse/_internal/sparse_tensor_ifc.py +133 -0
  297. nvmath/sparse/_internal/sparse_ust_ifc.py +141 -0
  298. nvmath/sparse/_internal/utils.py +56 -0
  299. nvmath/sparse/advanced/__init__.py +7 -0
  300. nvmath/sparse/advanced/_configuration.py +227 -0
  301. nvmath/sparse/advanced/direct_solver.py +2069 -0
  302. nvmath/sparse/generic/__init__.py +7 -0
  303. nvmath/sparse/generic/_configuration.py +129 -0
  304. nvmath/sparse/generic/_helpers.py +137 -0
  305. nvmath/sparse/generic/_thunks.py +21 -0
  306. nvmath/sparse/generic/matmulmod.py +2353 -0
  307. nvmath/sparse/ust/__init__.py +7 -0
  308. nvmath/sparse/ust/_converters.py +422 -0
  309. nvmath/sparse/ust/_cpp.py +28 -0
  310. nvmath/sparse/ust/_drawer.py +565 -0
  311. nvmath/sparse/ust/_emitter.py +1033 -0
  312. nvmath/sparse/ust/_jit.py +188 -0
  313. nvmath/sparse/ust/_kernel.py +282 -0
  314. nvmath/sparse/ust/_utils.py +149 -0
  315. nvmath/sparse/ust/interfaces/__init__.py +0 -0
  316. nvmath/sparse/ust/interfaces/torch_interface.py +476 -0
  317. nvmath/sparse/ust/tensor.py +1016 -0
  318. nvmath/sparse/ust/tensor_format.py +957 -0
  319. nvmath/tensor/__init__.py +6 -0
  320. nvmath/tensor/_configuration.py +120 -0
  321. nvmath/tensor/_internal/__init__.py +3 -0
  322. nvmath/tensor/_internal/cutensor_config_ifc.py +279 -0
  323. nvmath/tensor/_internal/cutensor_utils.py +230 -0
  324. nvmath/tensor/_internal/data.py +43 -0
  325. nvmath/tensor/_internal/einsum_parser.py +444 -0
  326. nvmath/tensor/_internal/typemaps.py +96 -0
  327. nvmath/tensor/contract.py +1900 -0
  328. nvmath_python-1.0.0.dist-info/METADATA +134 -0
  329. nvmath_python-1.0.0.dist-info/RECORD +332 -0
  330. nvmath_python-1.0.0.dist-info/WHEEL +5 -0
  331. nvmath_python-1.0.0.dist-info/licenses/LICENSE +177 -0
  332. nvmath_python-1.0.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,440 @@
1
+ # Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ import os
6
+ from collections.abc import Sequence
7
+ from functools import lru_cache, partial
8
+
9
+ import numpy as np
10
+ from numba import cuda
11
+
12
+ from nvmath.bindings import mathdx
13
+ from nvmath.device.common_cuda import ComputeCapability
14
+
15
+ from .common import check_in, check_not_in, check_positive_integer_sequence, check_sm
16
+ from .common_backend import (
17
+ EXECUTION_STR_TO_MATHDX,
18
+ NP_TYPES_TO_MATHDX_PRECISION,
19
+ NVARG_GEN_OPT_LTO,
20
+ DescriptorWrapper,
21
+ build_get_int_traits,
22
+ build_get_str_trait,
23
+ )
24
+
25
+ _ENABLE_CUSOLVERDX_0_3 = mathdx.get_version_ex() >= (0, 3, 2)
26
+
27
+ # =======================================================
28
+ # Python to mathdx translation
29
+ # =======================================================
30
+
31
+ _SOLVER_FUNCTION_TO_MATHDX = {f.name.lower(): f for f in mathdx.CusolverdxFunction}
32
+ _SOLVER_SIDE_TO_MATHDX = {s.name.lower(): s for s in mathdx.CusolverdxSide}
33
+ _SOLVER_DIAG_TO_MATHDX = {d.name.lower(): d for d in mathdx.CusolverdxDiag}
34
+ _SOLVER_FILL_MODE_TO_MATHDX = {f.name.lower(): f for f in mathdx.CusolverdxFillMode}
35
+ _SOLVER_DATA_TYPE_TO_MATHDX = {t.name.lower(): t for t in mathdx.CusolverdxType}
36
+ _SOLVER_ARRANGEMENT_TO_MATHDX = {a.name.lower(): a for a in mathdx.CusolverdxArrangement}
37
+ _SOLVER_TRANSPOSE_MODE_TO_MATHDX = {t.name.lower(): t for t in mathdx.CusolverdxTransposeMode}
38
+ _SOLVER_EXECUTION_API_TO_MATHDX = {
39
+ "compiled_leading_dim": mathdx.CusolverdxApi.SMEM,
40
+ "runtime_leading_dim": mathdx.CusolverdxApi.SMEM_DYNAMIC_LD,
41
+ }
42
+ _SOLVER_JOB_TO_MATHDX = {j.name.lower(): j for j in mathdx.CusolverdxJob}
43
+
44
+ # =======================================================
45
+ # Allowed input arguments
46
+ # =======================================================
47
+
48
+ ALLOWED_CUSOLVERDX_FUNCTIONS = {
49
+ # Cholesky
50
+ "potrf": "Cholesky factorization",
51
+ "potrs": "Linear system solve after Cholesky factorization",
52
+ "posv": "Fused Cholesky factorization with solve",
53
+ # LU without pivoting
54
+ "getrf_no_pivot": "LU factorization without pivoting",
55
+ "getrs_no_pivot": "LU solve without pivoting",
56
+ "gesv_no_pivot": "Fused LU without pivoting factorization with solve",
57
+ # LU with partial pivoting
58
+ "getrf_partial_pivot": "LU factorization with partial pivoting",
59
+ "getrs_partial_pivot": "LU solve with partial pivoting",
60
+ "gesv_partial_pivot": "Fused LU with partial pivoting factorization with solve",
61
+ # QR
62
+ "geqrf": "QR factorization",
63
+ "unmqr": "Multiplication of Q from QR factorization",
64
+ # LQ
65
+ "gelqf": "LQ factorization",
66
+ "unmlq": "Multiplication of Q from LQ factorization",
67
+ # Triangular solve
68
+ "trsm": "Triangular matrix-matrix solve",
69
+ # Least squares
70
+ "gels": "Overdetermined or underdetermined least squares problems",
71
+ # ======= libmathdx 0.3.2 functions =======
72
+ # QR
73
+ "ungqr": "Q matrix generation from geqrf factorization",
74
+ # LQ
75
+ "unglq": "Q matrix generation from gelqf factorization",
76
+ # Eigenvalues
77
+ "htev": "Eigenvalue solver for Hermitian tridiagonal matrices",
78
+ "heev": "Eigenvalue solver for Hermitian dense matrices",
79
+ # Tridiagonal matrices
80
+ "gtsv_no_pivot": "General tridiagonal matrix solve without pivoting",
81
+ }
82
+
83
+ CUSOLVERDX_0_3_ALLOWED_FUNCTIONS = ("ungqr", "unglq", "htev", "heev", "gtsv_no_pivot")
84
+
85
+ ALLOWED_REAL_NP_TYPES = [np.float32, np.float64]
86
+ ALLOWED_ARRANGEMENT = [a.name.lower() for a in mathdx.CusolverdxArrangement]
87
+ ALLOWED_DATA_TYPE = [d.name.lower() for d in mathdx.CusolverdxType]
88
+ ALLOWED_EXECUTION = ["Block"]
89
+ ALLOWED_TRANSPOSE_MODE = [t.name.lower() for t in mathdx.CusolverdxTransposeMode]
90
+ ALLOWED_SIDE = [s.name.lower() for s in mathdx.CusolverdxSide]
91
+ ALLOWED_DIAG = [d.name.lower() for d in mathdx.CusolverdxDiag]
92
+ ALLOWED_FILL_MODE = [f.name.lower() for f in mathdx.CusolverdxFillMode]
93
+ ALLOWED_EXECUTION_API = ["compiled_leading_dim", "runtime_leading_dim"]
94
+ ALLOWED_JOB = [j.name.lower() for j in mathdx.CusolverdxJob]
95
+
96
+ # =======================================================
97
+ # Supported/Unsupported functions for arguments
98
+ # =======================================================
99
+
100
+ TRANSPOSE_SUPPORTED_FUNCTIONS = [
101
+ "getrf_no_pivot",
102
+ "getrs_no_pivot",
103
+ "gesv_no_pivot",
104
+ "getrf_partial_pivot",
105
+ "getrs_partial_pivot",
106
+ "gesv_partial_pivot",
107
+ "geqrf",
108
+ "gelqf",
109
+ "unmqr",
110
+ "unmlq",
111
+ "gels",
112
+ "trsm",
113
+ ]
114
+ SIDE_SUPPORTED_FUNCTIONS = ["unmqr", "unmlq", "trsm"]
115
+ FILL_MODE_SUPPORTED_FUNCTIONS = ["potrf", "potrs", "posv", "trsm", "heev"]
116
+ DIAG_SUPPORTED_FUNCTIONS = ["trsm"]
117
+ JOB_SUPPORTED_FUNCTIONS = ["htev", "heev"]
118
+ JOB_SUPPORT_MAP = {
119
+ "htev": ["no_vectors", "all_vectors", "multiply_vectors"],
120
+ "heev": ["no_vectors", "overwrite_vectors"],
121
+ }
122
+
123
+ # =======================================================
124
+ # Helper functions
125
+ # =======================================================
126
+
127
+ check_arg_supported = partial(
128
+ check_in,
129
+ format='For function: "{value}", parameter "{name}" is not supported. It is only supported for functions: {coll_str}',
130
+ )
131
+
132
+
133
+ def check_required_optional_provided(function, required_for, arg, arg_name):
134
+ if arg is None:
135
+ check_not_in(
136
+ name=arg_name, value=function, coll=required_for, format='Parameter "{name}" is required for function "{value}".'
137
+ )
138
+
139
+
140
+ get_str_trait = build_get_str_trait(mathdx.cusolverdx_get_trait_str_size, mathdx.cusolverdx_get_trait_str)
141
+ get_int_traits = build_get_int_traits(mathdx.cusolverdx_get_trait_int64s)
142
+
143
+ # =======================================================
144
+ # validate()
145
+ # =======================================================
146
+
147
+
148
+ def _validate_types_and_values(
149
+ function,
150
+ size,
151
+ precision,
152
+ execution,
153
+ sm,
154
+ arrangement,
155
+ transpose_mode,
156
+ side,
157
+ diag,
158
+ fill_mode,
159
+ batches_per_block,
160
+ data_type,
161
+ leading_dimensions,
162
+ block_dim,
163
+ job,
164
+ ):
165
+ check_in("function", function, ALLOWED_CUSOLVERDX_FUNCTIONS.keys())
166
+ check_positive_integer_sequence(size, "size", 1, 3)
167
+ check_in("precision", precision, ALLOWED_REAL_NP_TYPES)
168
+ check_in("execution", execution, ALLOWED_EXECUTION)
169
+ check_sm(sm, "cuSOLVERDx")
170
+
171
+ if arrangement is not None:
172
+ if not isinstance(arrangement, Sequence):
173
+ raise ValueError(f'Parameter "arrangement" must be a sequence. Got: {type(arrangement).__name__}.')
174
+ if len(arrangement) != 2 and len(arrangement) != 1:
175
+ raise ValueError(f'Parameter "arrangement" must be a sequence of length 1 or 2. Got length: {len(arrangement)}.')
176
+ check_in("arrangement[0]", arrangement[0], ALLOWED_ARRANGEMENT)
177
+
178
+ if len(arrangement) == 2:
179
+ check_in("arrangement[1]", arrangement[1], ALLOWED_ARRANGEMENT)
180
+
181
+ if transpose_mode is not None:
182
+ check_in("transpose_mode", transpose_mode, ALLOWED_TRANSPOSE_MODE)
183
+
184
+ if side is not None:
185
+ check_in("side", side, ALLOWED_SIDE)
186
+
187
+ if diag is not None:
188
+ check_in("diag", diag, ALLOWED_DIAG)
189
+
190
+ if fill_mode is not None:
191
+ check_in("fill_mode", fill_mode, ALLOWED_FILL_MODE)
192
+
193
+ if data_type is not None:
194
+ check_in("data_type", data_type, ALLOWED_DATA_TYPE)
195
+
196
+ if batches_per_block is not None and batches_per_block != "suggested":
197
+ if not isinstance(batches_per_block, int):
198
+ raise ValueError(
199
+ 'Parameter "batches_per_block" must be a positive integer or "suggested". '
200
+ + f"Got: {type(batches_per_block).__name__}."
201
+ )
202
+ if batches_per_block < 1:
203
+ raise ValueError(f'Parameter "batches_per_block" must be a positive integer. Got: {batches_per_block}.')
204
+
205
+ if leading_dimensions is not None:
206
+ check_positive_integer_sequence(leading_dimensions, "leading_dimensions", 1, 2)
207
+
208
+ if block_dim is not None and block_dim != "suggested":
209
+ check_positive_integer_sequence(block_dim, "block_dim", 1, 3)
210
+
211
+ if job is not None:
212
+ check_in("job", job, ALLOWED_JOB)
213
+
214
+
215
+ def _validate_logic(
216
+ function,
217
+ transpose_mode,
218
+ side,
219
+ diag,
220
+ fill_mode,
221
+ job,
222
+ ):
223
+ if not _ENABLE_CUSOLVERDX_0_3 and job is not None:
224
+ raise RuntimeError("job operator requires libmathdx 0.3.2 or later")
225
+
226
+ if transpose_mode is not None:
227
+ check_arg_supported("transpose_mode", function, TRANSPOSE_SUPPORTED_FUNCTIONS)
228
+ if function in {"geqrf", "gelqf", "getrf_no_pivot", "getrf_partial_pivot"}:
229
+ check_in(
230
+ name="transpose_mode",
231
+ value=transpose_mode,
232
+ coll={"non_transposed"},
233
+ format=f'For function "{function}", parameter "transpose_mode" only supports: {{coll_str}}. Got: "{{value}}".',
234
+ )
235
+
236
+ if side is not None:
237
+ check_arg_supported("side", function, SIDE_SUPPORTED_FUNCTIONS)
238
+
239
+ if fill_mode is not None:
240
+ check_arg_supported("fill_mode", function, FILL_MODE_SUPPORTED_FUNCTIONS)
241
+
242
+ if diag is not None:
243
+ check_arg_supported("diag", function, DIAG_SUPPORTED_FUNCTIONS)
244
+
245
+ if job is not None:
246
+ check_arg_supported("job", function, JOB_SUPPORTED_FUNCTIONS)
247
+
248
+ check_in(
249
+ name="job",
250
+ value=job,
251
+ coll=JOB_SUPPORT_MAP[function],
252
+ format=f'For function "{function}", parameter "job" only supports: {{coll_str}}. Got: "{{value}}".',
253
+ )
254
+
255
+ check_required_optional_provided(function, SIDE_SUPPORTED_FUNCTIONS, side, "side")
256
+ check_required_optional_provided(function, FILL_MODE_SUPPORTED_FUNCTIONS, fill_mode, "fill_mode")
257
+ check_required_optional_provided(function, DIAG_SUPPORTED_FUNCTIONS, diag, "diag")
258
+ check_required_optional_provided(function, JOB_SUPPORTED_FUNCTIONS, job, "job")
259
+
260
+
261
+ def validate(
262
+ function,
263
+ size,
264
+ precision,
265
+ execution,
266
+ sm,
267
+ arrangement,
268
+ transpose_mode,
269
+ side,
270
+ diag,
271
+ fill_mode,
272
+ batches_per_block,
273
+ data_type,
274
+ leading_dimensions,
275
+ block_dim,
276
+ job,
277
+ ):
278
+ if function in CUSOLVERDX_0_3_ALLOWED_FUNCTIONS and not _ENABLE_CUSOLVERDX_0_3:
279
+ raise RuntimeError(f'Function "{function}" requires libmathdx 0.3.2 or later.')
280
+
281
+ if (
282
+ function == "gesv_no_pivot"
283
+ and sm.major == 12
284
+ and sm.minor == 0
285
+ and (data_type == "real" or data_type is None)
286
+ and "NVMATH_CUSOLVERDX_IGNORE_NVBUG_5288270_ASSERT" not in os.environ
287
+ ):
288
+ raise RuntimeError(
289
+ "NVBUG 5288270: CUDA 12.8, 12.9 and 13.0 could miscompile kernels using "
290
+ "'gesv_no_pivot' function with high register pressure when SM is set to 1200 "
291
+ "and Type is set to 'real'. To ignore this assertion and verify correctness "
292
+ "of the results, set the NVMATH_CUSOLVERDX_IGNORE_NVBUG_5288270_ASSERT environment variable."
293
+ )
294
+
295
+ _validate_types_and_values(
296
+ function=function,
297
+ size=size,
298
+ precision=precision,
299
+ execution=execution,
300
+ sm=sm,
301
+ arrangement=arrangement,
302
+ transpose_mode=transpose_mode,
303
+ side=side,
304
+ diag=diag,
305
+ fill_mode=fill_mode,
306
+ batches_per_block=batches_per_block,
307
+ data_type=data_type,
308
+ leading_dimensions=leading_dimensions,
309
+ block_dim=block_dim,
310
+ job=job,
311
+ )
312
+
313
+ _validate_logic(
314
+ function=function,
315
+ transpose_mode=transpose_mode,
316
+ side=side,
317
+ diag=diag,
318
+ fill_mode=fill_mode,
319
+ job=job,
320
+ )
321
+
322
+
323
+ # =======================================================
324
+ # generate_SOLVER()
325
+ # =======================================================
326
+
327
+
328
+ @lru_cache
329
+ def generate_SOLVER(
330
+ function,
331
+ size,
332
+ precision,
333
+ execution,
334
+ sm,
335
+ arrangement,
336
+ transpose_mode,
337
+ side,
338
+ diag,
339
+ fill_mode,
340
+ batches_per_block,
341
+ data_type,
342
+ leading_dimensions,
343
+ block_dim,
344
+ execution_api,
345
+ job,
346
+ ):
347
+ check_not_in("leading_dimensions", leading_dimensions, ["suggested"])
348
+ check_not_in("batches_per_block", batches_per_block, ["suggested"])
349
+ check_not_in("block_dim", block_dim, ["suggested"])
350
+ check_in("execution_api", execution_api, ALLOWED_EXECUTION_API)
351
+
352
+ h = mathdx.cusolverdx_create_descriptor()
353
+
354
+ assert _ENABLE_CUSOLVERDX_0_3 or function not in CUSOLVERDX_0_3_ALLOWED_FUNCTIONS
355
+ mathdx.cusolverdx_set_operator_int64(h, mathdx.CusolverdxOperatorType.FUNCTION, _SOLVER_FUNCTION_TO_MATHDX[function])
356
+ mathdx.cusolverdx_set_operator_int64s(h, mathdx.CusolverdxOperatorType.SIZE, 3, list(size))
357
+ mathdx.cusolverdx_set_operator_int64(h, mathdx.CusolverdxOperatorType.PRECISION, NP_TYPES_TO_MATHDX_PRECISION[precision])
358
+ mathdx.cusolverdx_set_operator_int64(h, mathdx.CusolverdxOperatorType.EXECUTION, EXECUTION_STR_TO_MATHDX[execution])
359
+ mathdx.cusolverdx_set_operator_int64(h, mathdx.CusolverdxOperatorType.SM, sm.major * 100 + sm.minor * 10)
360
+
361
+ if arrangement is not None:
362
+ converted_arrangement = [_SOLVER_ARRANGEMENT_TO_MATHDX[a] for a in list(arrangement)]
363
+ mathdx.cusolverdx_set_operator_int64s(
364
+ h, mathdx.CusolverdxOperatorType.ARRANGEMENT, len(arrangement), converted_arrangement
365
+ )
366
+
367
+ if side is not None:
368
+ mathdx.cusolverdx_set_operator_int64(h, mathdx.CusolverdxOperatorType.SIDE, _SOLVER_SIDE_TO_MATHDX[side])
369
+
370
+ if diag is not None:
371
+ mathdx.cusolverdx_set_operator_int64(h, mathdx.CusolverdxOperatorType.DIAG, _SOLVER_DIAG_TO_MATHDX[diag])
372
+
373
+ if fill_mode is not None:
374
+ mathdx.cusolverdx_set_operator_int64(h, mathdx.CusolverdxOperatorType.FILL_MODE, _SOLVER_FILL_MODE_TO_MATHDX[fill_mode])
375
+
376
+ if data_type is not None:
377
+ mathdx.cusolverdx_set_operator_int64(h, mathdx.CusolverdxOperatorType.TYPE, _SOLVER_DATA_TYPE_TO_MATHDX[data_type])
378
+
379
+ if block_dim is not None:
380
+ mathdx.cusolverdx_set_operator_int64s(h, mathdx.CusolverdxOperatorType.BLOCK_DIM, 3, list(block_dim))
381
+
382
+ if transpose_mode is not None:
383
+ mathdx.cusolverdx_set_operator_int64(
384
+ h, mathdx.CusolverdxOperatorType.TRANSPOSE_MODE, _SOLVER_TRANSPOSE_MODE_TO_MATHDX[transpose_mode]
385
+ )
386
+
387
+ if leading_dimensions is not None:
388
+ mathdx.cusolverdx_set_operator_int64s(
389
+ h, mathdx.CusolverdxOperatorType.LEADING_DIMENSION, len(leading_dimensions), list(leading_dimensions)
390
+ )
391
+
392
+ if batches_per_block is not None:
393
+ mathdx.cusolverdx_set_operator_int64(h, mathdx.CusolverdxOperatorType.BATCHES_PER_BLOCK, batches_per_block)
394
+
395
+ if job is not None:
396
+ assert _ENABLE_CUSOLVERDX_0_3
397
+ mathdx.cusolverdx_set_operator_int64(h, mathdx.CusolverdxOperatorType.JOB, _SOLVER_JOB_TO_MATHDX[job])
398
+
399
+ mathdx.cusolverdx_set_operator_int64(h, mathdx.CusolverdxOperatorType.API, _SOLVER_EXECUTION_API_TO_MATHDX[execution_api])
400
+
401
+ return DescriptorWrapper(h, mathdx.cusolverdx_destroy_descriptor)
402
+
403
+
404
+ # =======================================================
405
+ # generate_code()
406
+ # =======================================================
407
+
408
+
409
+ @lru_cache
410
+ def generate_code(handle, version: ComputeCapability):
411
+ code = mathdx.commondx_create_code()
412
+
413
+ mathdx.commondx_set_code_option_int64(code, mathdx.CommondxOption.TARGET_SM, version.integer)
414
+
415
+ mathdx.commondx_set_code_option_str(code, mathdx.CommondxOption.EXTRA_NVRTC_ARGS, NVARG_GEN_OPT_LTO)
416
+ if "NVMATH_CUSOLVERDX_IGNORE_NVBUG_5288270_ASSERT" in os.environ:
417
+ # TODO: use commondx_set_code_option_strs: currently limited to 1 argument
418
+ mathdx.commondx_set_code_option_str(
419
+ code, mathdx.CommondxOption.EXTRA_NVRTC_ARGS, "-DCUSOLVERDX_IGNORE_NVBUG_5288270_ASSERT"
420
+ )
421
+
422
+ mathdx.cusolverdx_finalize_code(code, handle)
423
+
424
+ return DescriptorWrapper(code, mathdx.commondx_destroy_code)
425
+
426
+
427
+ # =======================================================
428
+ # get_universal_fatbin()
429
+ # =======================================================
430
+
431
+
432
+ @lru_cache
433
+ def get_universal_fatbin():
434
+ h = mathdx.cusolverdx_create_descriptor()
435
+ fatbin_size = mathdx.cusolverdx_get_universal_fatbin_size(h)
436
+ fatbin = bytearray(fatbin_size)
437
+ mathdx.cusolverdx_get_universal_fatbin(h, fatbin_size, fatbin)
438
+ mathdx.cusolverdx_destroy_descriptor(h)
439
+
440
+ return cuda.Fatbin(bytes(fatbin))