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
nvmath/memory.py ADDED
@@ -0,0 +1,279 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """Interface for pluggable memory handlers."""
6
+
7
+ __all__ = ["BaseCUDAMemoryManager", "MemoryPointer"]
8
+
9
+ import weakref
10
+ from abc import abstractmethod
11
+ from collections.abc import Callable
12
+ from typing import Protocol, runtime_checkable
13
+
14
+ from cuda.core import Stream
15
+
16
+ from nvmath._internal.utils import LoggerLike
17
+ from nvmath.internal import utils
18
+ from nvmath.internal.memory import allocate_from_mr, get_device_memory_resource
19
+ from nvmath.internal.package_ifc_cuda import CUDAPackage
20
+
21
+
22
+ class MemoryPointer:
23
+ """
24
+ An RAII class for a device memory buffer.
25
+
26
+ Args:
27
+ device_ptr: The address of the device memory buffer.
28
+ size: The size of the memory buffer in bytes.
29
+ finalizer: A nullary callable that will be called when the buffer is to be freed.
30
+
31
+ .. seealso:: :class:`numba.cuda.MemoryPointer`
32
+ """
33
+
34
+ def __init__(self, device_ptr: int, size: int, finalizer: None | Callable[[], None]):
35
+ self.device_ptr = device_ptr
36
+ self.size = size
37
+ self._finalizer: weakref.finalize | None
38
+ if finalizer is not None:
39
+ self._finalizer = weakref.finalize(self, finalizer)
40
+ else:
41
+ self._finalizer = None
42
+
43
+ def free(self):
44
+ """
45
+ "Frees" the memory buffer by calling the finalizer.
46
+ """
47
+ if self._finalizer is None:
48
+ return
49
+
50
+ if not self._finalizer.alive:
51
+ raise RuntimeError("The buffer has already been freed.")
52
+ self._finalizer()
53
+
54
+
55
+ class _UnmanagedMemoryPointer:
56
+ """
57
+ An alternative to :class:`MemoryPointer` to wrap objects that already implements
58
+ its own RAII semantics.
59
+
60
+ Args:
61
+ device_ptr: The address of the device memory buffer.
62
+ size: The size of the memory buffer in bytes.
63
+ owner: An object that owns the memory buffer and releases the allocation
64
+ on object deletion.
65
+
66
+ .. seealso:: :class:`MemoryPointer`
67
+ """
68
+
69
+ __slots__ = ("device_ptr", "size", "_owner")
70
+
71
+ def __init__(self, device_ptr: int, size: int, owner: object):
72
+ self.device_ptr = device_ptr
73
+ self.size = size
74
+ self._owner = owner
75
+
76
+ def free(self):
77
+ """
78
+ "Frees" by removing the reference to the owner.
79
+ """
80
+ self._owner = None
81
+
82
+
83
+ @runtime_checkable
84
+ class BaseCUDAMemoryManager(Protocol):
85
+ """
86
+ Protocol for memory manager plugins.
87
+
88
+ .. seealso:: :class:`numba.cuda.BaseCUDAMemoryManager`
89
+ """
90
+
91
+ @abstractmethod
92
+ def __init__(self, device_id: int, logger: LoggerLike):
93
+ raise NotImplementedError
94
+
95
+ @abstractmethod
96
+ def memalloc(self, size: int) -> MemoryPointer:
97
+ """
98
+ Allocate device memory synchronously or on the current stream.
99
+
100
+ Args:
101
+ size: The size of the memory buffer in bytes.
102
+
103
+ Returns:
104
+ An object that owns the allocated memory and is responsible for releasing it (to
105
+ the OS or a pool). The object must have an attribute named ``device_ptr``,
106
+ ``device_pointer``, or ``ptr`` specifying the pointer to the allocated memory
107
+ buffer. See :class:`MemoryPointer` for an example interface.
108
+
109
+ Note:
110
+ Objects of type :class:`numba.cuda.MemoryPointer` as well as
111
+ :class:`cupy.cuda.MemoryPointer` meet the requirements listed above for the
112
+ device memory pointer object.
113
+ """
114
+ raise NotImplementedError
115
+
116
+
117
+ @runtime_checkable
118
+ class BaseCUDAMemoryManagerAsync(Protocol):
119
+ """
120
+ Protocol for async memory manager plugins.
121
+
122
+ .. seealso:: :class:`BaseCUDAMemoryManager`
123
+ """
124
+
125
+ @abstractmethod
126
+ def __init__(self, device_id: int, logger: LoggerLike):
127
+ raise NotImplementedError
128
+
129
+ @abstractmethod
130
+ def memalloc_async(self, size: int, stream: Stream) -> MemoryPointer:
131
+ """
132
+ Allocate device memory asynchronously on the provided stream.
133
+
134
+ Args:
135
+ size: The size of the memory buffer in bytes.
136
+ stream: A cuda.core.Stream object on which the allocation will be performed.
137
+
138
+ Returns:
139
+ An object that owns the allocated memory and is responsible for releasing it (to
140
+ the OS or a pool). The object must have an attribute named ``device_ptr``,
141
+ ``device_pointer``, or ``ptr`` specifying the pointer to the allocated memory
142
+ buffer. See :class:`MemoryPointer` for an example interface.
143
+
144
+ Note:
145
+ Objects of type :class:`numba.cuda.MemoryPointer` as well as
146
+ :class:`cupy.cuda.MemoryPointer` meet the requirements listed above for the
147
+ device memory pointer object.
148
+ """
149
+ raise NotImplementedError
150
+
151
+
152
+ class _RawCUDAMemoryManager(BaseCUDAMemoryManagerAsync):
153
+ """
154
+ Raw device memory allocator.
155
+
156
+ Args:
157
+ device_id: The ID (int) of the device on which memory is to be allocated.
158
+ logger (logging.Logger): Python Logger object.
159
+ """
160
+
161
+ def __init__(self, device_id: int, logger: LoggerLike):
162
+ """
163
+ __init__(device_id)
164
+ """
165
+ self.device_id = device_id
166
+ self.logger = logger
167
+ self._pool = get_device_memory_resource(device_id)
168
+
169
+ def memalloc_async(self, size: int, stream: Stream) -> MemoryPointer:
170
+ buffer = allocate_from_mr(self._pool, size, stream, self.device_id, self.logger)
171
+ device_ptr = int(buffer.handle)
172
+
173
+ return _UnmanagedMemoryPointer(device_ptr, size, buffer) # type: ignore[return-value]
174
+
175
+
176
+ _MEMORY_MANAGER: dict[str, type[BaseCUDAMemoryManager] | type[BaseCUDAMemoryManagerAsync]] = {
177
+ "_raw": _RawCUDAMemoryManager,
178
+ "cuda": _RawCUDAMemoryManager,
179
+ }
180
+
181
+
182
+ def lazy_load_cupy():
183
+ global _MEMORY_MANAGER
184
+ import cupy as cp
185
+
186
+ from nvmath.internal.package_ifc_cupy import CupyPackage
187
+
188
+ class _CupyCUDAMemoryManager(BaseCUDAMemoryManagerAsync):
189
+ """
190
+ CuPy device memory allocator.
191
+
192
+ Args:
193
+ device_id: The ID (int) of the device on which memory is to be allocated.
194
+ logger (logging.Logger): Python Logger object.
195
+ """
196
+
197
+ def __init__(self, device_id: int, logger: LoggerLike):
198
+ """
199
+ __init__(device_id)
200
+ """
201
+ self.device_id = device_id
202
+ self.logger = logger
203
+
204
+ def memalloc_async(self, size: int, stream: Stream) -> MemoryPointer:
205
+ stream_ptr = CUDAPackage.to_stream_pointer(stream)
206
+ external = CupyPackage.create_external_stream(self.device_id, stream_ptr)
207
+ stream_ctx = CupyPackage.to_stream_context(external)
208
+ with utils.device_ctx(self.device_id), stream_ctx:
209
+ cp_mem_ptr = cp.cuda.alloc(size)
210
+ device_ptr = cp_mem_ptr.ptr
211
+
212
+ self.logger.debug(
213
+ "_CupyCUDAMemoryManager (allocate memory): size = %d, ptr = %d, device_id = %d, stream = %s",
214
+ size,
215
+ device_ptr,
216
+ self.device_id,
217
+ stream,
218
+ )
219
+
220
+ def finalizer():
221
+ # The cupy MemoryPointer object is RAII, so we keep a reference to it
222
+ # until we don't need it anymore.
223
+ nonlocal cp_mem_ptr, device_ptr
224
+ self.logger.debug("_CupyCUDAMemoryManager (release memory): ptr = %d", device_ptr)
225
+ del cp_mem_ptr
226
+
227
+ return MemoryPointer(device_ptr, size, finalizer=finalizer)
228
+
229
+ _MEMORY_MANAGER["cupy"] = _CupyCUDAMemoryManager
230
+
231
+
232
+ def lazy_load_torch():
233
+ global _MEMORY_MANAGER
234
+
235
+ from torch.cuda import caching_allocator_alloc, caching_allocator_delete
236
+
237
+ from nvmath.internal.package_ifc_torch import TorchPackage
238
+
239
+ class _TorchCUDAMemoryManager(BaseCUDAMemoryManagerAsync):
240
+ """
241
+ Torch caching memory allocator.
242
+
243
+ Args:
244
+ device_id: The ID (int) of the device on which memory is to be allocated.
245
+ logger (logging.Logger): Python Logger object.
246
+ """
247
+
248
+ def __init__(self, device_id: int, logger: LoggerLike):
249
+ """
250
+ __init__(device_id)
251
+ """
252
+ self.device_id = device_id
253
+ self.logger = logger
254
+
255
+ def memalloc_async(self, size: int, stream: Stream) -> MemoryPointer:
256
+ torch_stream = TorchPackage.create_external_stream(self.device_id, CUDAPackage.to_stream_pointer(stream))
257
+ device_ptr = caching_allocator_alloc(size, device=self.device_id, stream=torch_stream)
258
+
259
+ self.logger.debug(
260
+ "_TorchCUDAMemoryManager (allocate memory): size = %d, ptr = %d, device_id = %d, stream = %s",
261
+ size,
262
+ device_ptr,
263
+ self.device_id,
264
+ stream,
265
+ )
266
+
267
+ def finalizer():
268
+ nonlocal device_ptr, stream
269
+ self.logger.debug(
270
+ "_TorchCUDAMemoryManager (release memory): ptr = %d, device_id = %d, stream = %s",
271
+ device_ptr,
272
+ self.device_id,
273
+ stream,
274
+ )
275
+ caching_allocator_delete(device_ptr)
276
+
277
+ return MemoryPointer(device_ptr, size, finalizer=finalizer)
278
+
279
+ _MEMORY_MANAGER["torch"] = _TorchCUDAMemoryManager
@@ -0,0 +1,38 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from . import advanced, ust # noqa: E402
6
+ from .generic import ComputeType, ExecutionCUDA, Matmul, MatmulOptions, matmul
7
+ from .generic import (
8
+ compile_add as compile_matmul_add,
9
+ )
10
+ from .generic import (
11
+ compile_atomic_add as compile_matmul_atomic_add,
12
+ )
13
+ from .generic import (
14
+ compile_epilog as compile_matmul_epilog,
15
+ )
16
+ from .generic import (
17
+ compile_mul as compile_matmul_mul,
18
+ )
19
+ from .generic import (
20
+ compile_prolog as compile_matmul_prolog,
21
+ )
22
+ from .generic import matrix_qualifiers_dtype as matmul_matrix_qualifiers_dtype
23
+
24
+ __all__ = [
25
+ "advanced",
26
+ "ust",
27
+ "ExecutionCUDA",
28
+ "MatmulOptions",
29
+ "matmul_matrix_qualifiers_dtype",
30
+ "compile_matmul_prolog",
31
+ "compile_matmul_epilog",
32
+ "compile_matmul_add",
33
+ "compile_matmul_atomic_add",
34
+ "compile_matmul_mul",
35
+ "Matmul",
36
+ "matmul",
37
+ "ComputeType",
38
+ ]
@@ -0,0 +1,21 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from . import common_utils as common_utils
6
+ from . import cudss_config_ifc as cudss_config_ifc
7
+ from . import cudss_data_ifc as cudss_data_ifc
8
+ from . import cudss_utils as cudss_utils
9
+ from . import sparse_csr_ifc as sparse_csr_ifc
10
+ from . import sparse_format_helpers as sparse_format_helpers
11
+ from . import sparse_tensor_ifc as sparse_tensor_ifc
12
+
13
+ __all__ = [
14
+ "common_utils",
15
+ "cudss_config_ifc",
16
+ "cudss_data_ifc",
17
+ "cudss_utils",
18
+ "sparse_csr_ifc",
19
+ "sparse_format_helpers",
20
+ "sparse_tensor_ifc",
21
+ ]
@@ -0,0 +1,147 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ A collection of sparse utilities.
7
+ """
8
+
9
+ import importlib
10
+ from collections.abc import Sequence
11
+
12
+ from nvmath.internal.ndbuffer import NDBuffer
13
+ from nvmath.internal.utils import infer_object_package
14
+ from nvmath.sparse._internal.sparse_format_helpers import PACKAGE_HELPER_MAP
15
+
16
+ RECOGNIZED_NAMED_FORMATS = {"BSR", "BSC", "CSR", "CSC", "COO", "DIA"}
17
+
18
+
19
+ def check_supported_package(native_operands):
20
+ """
21
+ Check if the operands belong to one of the supported packages.
22
+ """
23
+ package = {infer_object_package(o) for o in native_operands}
24
+ if len(package) != 1:
25
+ raise ValueError(f"The sparse operands do not belong to the same package: {package}.")
26
+
27
+ package = package.pop()
28
+ if package not in PACKAGE_HELPER_MAP:
29
+ raise TypeError(f"The sparse operand package {package} is not supported.")
30
+
31
+ return package
32
+
33
+
34
+ def wrap_sparse_operand(native_operand):
35
+ """
36
+ Wrap one "native" sparse operand so that package-agnostic API can be used.
37
+ """
38
+
39
+ package = infer_object_package(native_operand)
40
+ helper = PACKAGE_HELPER_MAP[package]
41
+ sparse_format = helper.sparse_format_name(native_operand)
42
+
43
+ # The sparse format should be a recognized named format or an UST.
44
+ if sparse_format not in RECOGNIZED_NAMED_FORMATS:
45
+ if package == "nvmath":
46
+ from nvmath.sparse._internal.sparse_ust_ifc import USTensorHolder
47
+
48
+ return USTensorHolder(native_operand)
49
+
50
+ raise TypeError(f"The sparse format {sparse_format} is not currently supported.")
51
+
52
+ # Recognized named format.
53
+ attr_name_map = getattr(helper, f"{sparse_format.lower()}_attribute_names")()
54
+
55
+ module_name = f"nvmath.sparse._internal.sparse_{sparse_format.lower()}_ifc"
56
+ module = importlib.import_module(module_name)
57
+ SparseHolder = getattr(module, f"{sparse_format}TensorHolder")
58
+
59
+ return SparseHolder.create_from_tensor(native_operand, attr_name_map=attr_name_map)
60
+
61
+
62
+ def wrap_sparse_operands(native_operands):
63
+ """
64
+ Wrap each "native" sparse operand so that package-agnostic API can be used.
65
+ """
66
+
67
+ if not isinstance(native_operands, Sequence):
68
+ return wrap_sparse_operand(native_operands)
69
+
70
+ package = check_supported_package(native_operands)
71
+ helper = PACKAGE_HELPER_MAP[package]
72
+
73
+ sparse_format = {helper.sparse_format_name(o) for o in native_operands}
74
+ if len(sparse_format) != 1:
75
+ raise ValueError(f"The sparse operands do not have the same sparse format: {sparse_format}")
76
+ sparse_format = sparse_format.pop()
77
+
78
+ # The sparse format should be a recognized named format or an UST.
79
+ if sparse_format not in RECOGNIZED_NAMED_FORMATS:
80
+ if package == "nvmath":
81
+ from nvmath.sparse._internal.sparse_ust_ifc import USTensorHolder
82
+
83
+ return [USTensorHolder(o) for o in native_operands]
84
+
85
+ raise TypeError(f"The sparse format {sparse_format} is not currently supported.")
86
+
87
+ attr_name_map = getattr(helper, f"{sparse_format.lower()}_attribute_names")()
88
+
89
+ module_name = f"nvmath.sparse._internal.sparse_{sparse_format.lower()}_ifc"
90
+ module = importlib.import_module(module_name)
91
+ SparseHolder = getattr(module, f"{sparse_format}TensorHolder")
92
+
93
+ return [SparseHolder.create_from_tensor(o, attr_name_map=attr_name_map) for o in native_operands]
94
+
95
+
96
+ # TODO: Unify all the get_attribute functions in internal.utils
97
+ # as get(operands, attribute, attribute_desc).
98
+ def get_operands_index_type(operands):
99
+ """
100
+ Return the index type name of the tensors.
101
+ """
102
+ index_type = operands[0].index_type
103
+ if not all(operand.index_type == index_type for operand in operands):
104
+ index_types = {operand.index_type for operand in operands}
105
+ raise ValueError(f"All operands must have the same index type. The index types found = {index_types}.")
106
+ return index_type
107
+
108
+
109
+ def sparse_or_dense(operand):
110
+ """
111
+ Determine if the operand is sparse or dense.
112
+ """
113
+
114
+ dense_tensor_modules = {"cupy", "numpy", "torch"}
115
+ sparse_tensor_modules = set(PACKAGE_HELPER_MAP.keys())
116
+
117
+ module = infer_object_package(operand)
118
+
119
+ if module == "torch":
120
+ import torch
121
+
122
+ if not torch.is_tensor(operand):
123
+ raise TypeError(f"The operand '{operand}' is not a tensor object.")
124
+
125
+ if operand.layout == torch.strided:
126
+ return "dense"
127
+
128
+ return "sparse"
129
+
130
+ # TODO: use the level spec instead of format name to infer if dense.
131
+ if module == "nvmath":
132
+ if type(operand) is NDBuffer:
133
+ return "dense"
134
+ name = operand.tensor_format.name
135
+ if name == "Scalar" or "Dense" in name:
136
+ return "dense"
137
+ return "sparse"
138
+
139
+ # We'll check if the object is a tensor later, we'll assume here that it is
140
+ # solely based on the package.
141
+ if module in sparse_tensor_modules:
142
+ return "sparse"
143
+
144
+ if module in dense_tensor_modules:
145
+ return "dense"
146
+
147
+ raise TypeError(f"The package '{module}' is not supported.")