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,46 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Interface to seamlessly use distributed Numpy ndarray objects.
7
+ """
8
+
9
+ from __future__ import annotations # allows typehint of class methods to return the self class
10
+
11
+ __all__ = ["NumpyDistributedTensor", "CudaDistributedTensor"]
12
+
13
+ from nvmath.internal.ndbuffer import NDBuffer
14
+ from nvmath.internal.tensor_ifc_numpy import CudaTensor, NumpyTensor
15
+
16
+ from .tensor_ifc import DistributedTensor
17
+ from .tensor_ifc_host_device import CudaDistributedTensorMixIn, HostDistributedTensorMixIn
18
+
19
+
20
+ class CudaDistributedTensor(CudaDistributedTensorMixIn, CudaTensor, DistributedTensor):
21
+ """
22
+ Tensor wrapper for distributed cuda ndarrays.
23
+ """
24
+
25
+ host_tensor_class: type[NumpyDistributedTensor] # set at the end of the file
26
+ device_tensor_class: type[CudaDistributedTensor] # set at the end of the file
27
+
28
+ @classmethod
29
+ def wrap_ndbuffer(cls, ndbuffer: NDBuffer) -> CudaDistributedTensor:
30
+ return cls(ndbuffer)
31
+
32
+
33
+ # Most methods aren't redefined, because they simply act on the local array
34
+ class NumpyDistributedTensor(HostDistributedTensorMixIn, NumpyTensor, DistributedTensor):
35
+ """
36
+ Tensor wrapper for distributed numpy ndarrays.
37
+ """
38
+
39
+ host_tensor_class: type[NumpyDistributedTensor] # set at the end of the file
40
+ device_tensor_class: type[CudaDistributedTensor] # set at the end of the file
41
+
42
+
43
+ NumpyDistributedTensor.host_tensor_class = NumpyDistributedTensor
44
+ CudaDistributedTensor.host_tensor_class = NumpyDistributedTensor
45
+ NumpyDistributedTensor.device_tensor_class = CudaDistributedTensor
46
+ CudaDistributedTensor.device_tensor_class = CudaDistributedTensor
@@ -0,0 +1,162 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Interface to seamlessly use distributed Torch tensor objects.
7
+ """
8
+
9
+ from __future__ import annotations # allows typehint of class methods to return the self class
10
+
11
+ __all__ = ["TorchDistributedTensor"]
12
+
13
+ import math
14
+
15
+ try:
16
+ import torch
17
+ except ImportError:
18
+ torch = None # type: ignore
19
+
20
+ from collections.abc import Sequence
21
+ from typing import Literal
22
+
23
+ import nvmath.distributed
24
+ from nvmath.distributed._internal.nccl import nccl_empty_dlpack
25
+ from nvmath.distributed._internal.nvshmem import nvshmem_empty_dlpack
26
+ from nvmath.internal.package_ifc import StreamHolder
27
+ from nvmath.internal.tensor_ifc_torch import TorchTensor
28
+ from nvmath.internal.utils import device_ctx
29
+
30
+ from .tensor_ifc import DistributedTensor
31
+
32
+
33
+ def _get_symmetric_memory_allocator(backend: Literal["nvshmem", "nccl"]):
34
+ if backend == "nvshmem":
35
+ return nvshmem_empty_dlpack
36
+ elif backend == "nccl":
37
+ return nccl_empty_dlpack
38
+ raise AssertionError(f"Internal error: unsupported backend {backend}.")
39
+
40
+
41
+ # Most methods aren't redefined, because they simply act on the local array
42
+ class TorchDistributedTensor(TorchTensor, DistributedTensor):
43
+ """
44
+ TensorHolder for distributed torch tensors.
45
+ """
46
+
47
+ host_tensor_class: type[TorchDistributedTensor] # set at the end of the file
48
+ device_tensor_class: type[TorchDistributedTensor] # set at the end of the file
49
+
50
+ def __init__(self, tensor):
51
+ super().__init__(tensor)
52
+
53
+ @classmethod
54
+ def empty(
55
+ cls, shape, device_id="cpu", *, dtype="float32", strides=None, stream_holder: StreamHolder | None = None, **context
56
+ ) -> TorchDistributedTensor:
57
+ """
58
+ Create an empty tensor of the specified shape and data type on the specified device
59
+ (None, 'cpu', or device id).
60
+
61
+ Note, that the strides, if specified, should correspond to a dense
62
+ (possibly permuted) tensor and MUST NOT overlap.
63
+ Otherwise, the behaviour is not defined.
64
+ """
65
+ symmetric_memory = context.pop("symmetric_memory", None)
66
+ make_symmetric = context.pop("make_symmetric", False)
67
+ skip_symmetric_check = context.pop("skip_symmetric_check", False)
68
+
69
+ if device_id == "cpu":
70
+ if symmetric_memory or make_symmetric or skip_symmetric_check:
71
+ raise ValueError("symmetric memory options cannot be used when allocating tensor on CPU")
72
+ return super().empty(shape, device_id, dtype=dtype, strides=strides, **context)
73
+
74
+ ctx = nvmath.distributed.get_context()
75
+ assert ctx is not None, "nvmath.distributed has not been initialized"
76
+
77
+ logger = context.get("logger")
78
+
79
+ if not symmetric_memory:
80
+ if make_symmetric or skip_symmetric_check:
81
+ raise ValueError("Use of symmetric memory option with symmetric_memory=None")
82
+ return super().empty(
83
+ shape, device_id=device_id, dtype=dtype, strides=strides, stream_holder=stream_holder, **context
84
+ )
85
+
86
+ dtype = TorchTensor.name_to_dtype[dtype]
87
+
88
+ symmetric_memory_allocator = _get_symmetric_memory_allocator(symmetric_memory)
89
+
90
+ with device_ctx(device_id):
91
+ size = math.prod(shape, start=dtype.itemsize)
92
+ # TODO: ideally strides should be set in DLPack, but cuda.core doesn't support
93
+ # ndarray yet and instead returns a flat buffer.
94
+ dlpack_buf = symmetric_memory_allocator(
95
+ size,
96
+ device_id,
97
+ ctx.process_group,
98
+ make_symmetric=make_symmetric,
99
+ skip_symmetric_check=skip_symmetric_check,
100
+ logger=logger,
101
+ )
102
+ tensor = torch.from_dlpack(dlpack_buf)
103
+ # Buffer may be padded if make_symmetric=True.
104
+ tensor = tensor[:size]
105
+ if strides is None:
106
+ tensor = tensor.view(dtype).view(shape)
107
+ else:
108
+ tensor = torch.as_strided(tensor.view(dtype), shape, strides)
109
+
110
+ return cls(tensor)
111
+
112
+ def to(
113
+ self, device_id, stream_holder, symmetric_memory: None | Literal["nvshmem", "nccl"] = None
114
+ ) -> TorchDistributedTensor:
115
+ """
116
+ In addition to the base class semantics:
117
+ - Source or target device must be the one used to initialize NVSHMEM on this
118
+ process. This implies that copy from one CUDA device to another is not allowed.
119
+ - Memory layout is preserved.
120
+ - Strides must be non-overlapping.
121
+ """
122
+ if not (device_id == "cpu" or isinstance(device_id, int)):
123
+ raise ValueError(f"The device must be specified as an integer or 'cpu', not '{device_id}'.")
124
+
125
+ blocking = (device_id == "cpu") or (self.device_id == "cpu")
126
+
127
+ # To CPU or same device
128
+ if device_id == "cpu" or self.device_id == device_id:
129
+ with stream_holder.ctx:
130
+ tensor = self.tensor.to(device=device_id, non_blocking=not blocking)
131
+ result = TorchDistributedTensor(tensor)
132
+ assert result.is_symmetric_memory == (symmetric_memory == "nvshmem")
133
+ return result
134
+
135
+ # Currently we don't allow copy from one device to another for distributed
136
+ # tensors (see comment in CupyDistributedTensor.to()).
137
+ if self.device_id != "cpu" and self.device_id != device_id:
138
+ raise ValueError("Cannot copy distributed tensor to a different CUDA device")
139
+
140
+ # CPU to GPU
141
+ with stream_holder.ctx:
142
+ tensor_device = TorchDistributedTensor.empty(
143
+ self.shape,
144
+ device_id=device_id,
145
+ dtype=self.dtype,
146
+ strides=self.strides,
147
+ stream_holder=stream_holder,
148
+ make_symmetric=symmetric_memory is not None,
149
+ symmetric_memory=symmetric_memory,
150
+ )
151
+ tensor_device.tensor.copy_(self.tensor, non_blocking=not blocking)
152
+ assert tensor_device.is_symmetric_memory == (symmetric_memory == "nvshmem")
153
+ return tensor_device
154
+
155
+ def reshape(self, shape: Sequence[int], *, copy: bool | None = None) -> TorchDistributedTensor:
156
+ if copy and self.device_id != "cpu":
157
+ raise NotImplementedError("reshape with copy=True is not supported for TorchDistributedTensor on GPU")
158
+ return super().reshape(shape, copy=copy)
159
+
160
+
161
+ TorchDistributedTensor.host_tensor_class = TorchDistributedTensor
162
+ TorchDistributedTensor.device_tensor_class = TorchDistributedTensor
@@ -0,0 +1,81 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ """
6
+ Entry point to using tensors from different libraries seamlessly.
7
+ """
8
+
9
+ __all__ = ["wrap_operand", "copy_"]
10
+
11
+ import warnings
12
+ from collections.abc import Sequence
13
+
14
+ from nvmath.internal.tensor_ifc import Tensor, TensorHolder
15
+ from nvmath.internal.tensor_wrapper import (
16
+ infer_tensor_package as base_infer_tensor_package,
17
+ )
18
+ from nvmath.internal.tensor_wrapper import (
19
+ maybe_register_package as base_maybe_register_package,
20
+ )
21
+
22
+ from .tensor_ifc import DistributedTensor
23
+ from .tensor_ifc_numpy import CudaDistributedTensor, NumpyDistributedTensor
24
+
25
+ _TENSOR_TYPES: dict[str, type[DistributedTensor]] = {"numpy": NumpyDistributedTensor, "cuda": CudaDistributedTensor}
26
+
27
+
28
+ def infer_tensor_package(tensor):
29
+ """
30
+ Infer the package that defines this tensor.
31
+ """
32
+ package = base_infer_tensor_package(tensor)
33
+ # Use call_base=False because base_infer_tensor_package already
34
+ # called base_maybe_register_package
35
+ maybe_register_package(package, call_base=False)
36
+ return package
37
+
38
+
39
+ def maybe_register_package(package, call_base=True):
40
+ if call_base:
41
+ base_maybe_register_package(package)
42
+
43
+ if package in _TENSOR_TYPES:
44
+ return
45
+ elif package == "torch":
46
+ from .tensor_ifc_torch import TorchDistributedTensor
47
+
48
+ _TENSOR_TYPES[package] = TorchDistributedTensor
49
+ elif package == "cupy":
50
+ from .tensor_ifc_cupy import CupyDistributedTensor, HostDistributedTensor
51
+
52
+ _TENSOR_TYPES["cupy"] = CupyDistributedTensor
53
+ _TENSOR_TYPES["cupy_host"] = HostDistributedTensor
54
+ else:
55
+ raise AssertionError(f"Internal error: unrecognized package {package}")
56
+
57
+
58
+ def wrap_operand(native_operand: Tensor) -> DistributedTensor[Tensor]:
59
+ """
60
+ Wrap one "native" operand so that package-agnostic API can be used.
61
+ """
62
+ if isinstance(native_operand, TensorHolder):
63
+ msg = (
64
+ "wrap_operand() is being called unnecessarily because the input is already a TensorHolder. "
65
+ "Only public facing APIs should call wrap_operand(). "
66
+ "Internal APIs should assume the operands are TensorHolder already."
67
+ "Trying to wrap a TensorHolder will become an error in the future."
68
+ )
69
+ warnings.warn(msg, DeprecationWarning)
70
+ assert isinstance(native_operand, DistributedTensor)
71
+ return native_operand
72
+ wrapped_operand = _TENSOR_TYPES[infer_tensor_package(native_operand)](native_operand)
73
+ return wrapped_operand
74
+
75
+
76
+ def copy_(src: Sequence[TensorHolder], dest: Sequence[TensorHolder], stream_holder):
77
+ """
78
+ Copy the wrapped operands in dest to the corresponding wrapped operands in src.
79
+ """
80
+ for s, d in zip(src, dest, strict=True):
81
+ d.copy_(s, stream_holder=stream_holder)
@@ -0,0 +1,167 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from __future__ import annotations
6
+
7
+ __all__ = ["allocate_symmetric_memory", "free_symmetric_memory"]
8
+
9
+ from collections.abc import Iterable, Sequence
10
+ from logging import Logger
11
+ from types import ModuleType
12
+ from typing import TYPE_CHECKING, Literal
13
+
14
+ if TYPE_CHECKING:
15
+ import torch
16
+
17
+ import numpy as np
18
+ from numpy.typing import DTypeLike
19
+
20
+ import nvmath.distributed
21
+ from nvmath.distributed._internal import tensor_wrapper
22
+ from nvmath.internal.utils import device_ctx
23
+
24
+ # Supported packages for tensors backed by symmetric memory.
25
+ _SUPPORTED_PACKAGES = ("cupy", "torch")
26
+
27
+
28
+ # TODO: do a general refactor of this function in nvmath
29
+ def calculate_strides(shape: Sequence[int], axis_order: Iterable[int]):
30
+ """
31
+ Calculate the strides for the provided shape and axis order.
32
+ """
33
+ strides = [0] * len(shape)
34
+
35
+ stride = 1
36
+ for axis in axis_order:
37
+ strides[axis] = stride
38
+ stride *= shape[axis]
39
+
40
+ return strides
41
+
42
+
43
+ def allocate_symmetric_memory(
44
+ shape: int | Sequence[int],
45
+ package: ModuleType,
46
+ *,
47
+ dtype: DTypeLike | torch.dtype | None = None,
48
+ axis_order: Literal["C", "F"] | Sequence[int] = "C",
49
+ make_symmetric: bool = False,
50
+ skip_symmetric_check: bool = False,
51
+ logger: Logger | None = None,
52
+ ):
53
+ """Return uninitialized tensor of given shape and type, allocated from the NVSHMEM
54
+ symmetric heap, on the device on which nvmath.distributed was initialized. The
55
+ tensor type is determined by the provided package (e.g. cupy, torch).
56
+ **This is a collective operation and must be called by all processes**.
57
+ Note that the buffer size must be the same on all processes, or you can
58
+ use ``make_symmetric=True`` to pad all buffers to the same max size.
59
+
60
+ Args:
61
+ shape: Shape of the tensor to allocate.
62
+
63
+ package: Python package determining the tensor type (e.g. cupy, torch).
64
+
65
+ dtype: Tensor dtype in a form recognized by the package. If None, will use the
66
+ package's default dtype.
67
+
68
+ axis_order: Axis order. The default is 'C' (row-major ordering).
69
+
70
+ make_symmetric: If buffer sizes do not match across processes, will allocate
71
+ the maximum size on every process to ensure the allocation is symmetric.
72
+ The default is False.
73
+
74
+ skip_symmetric_check: Skip checking that the allocation is symmetric (which
75
+ requires inter-process communication). The default is False.
76
+
77
+ logger (logging.Logger): Python Logger object. The root logger will be used if a
78
+ logger object is not provided.
79
+ """
80
+
81
+ if package.__name__ not in _SUPPORTED_PACKAGES:
82
+ raise ValueError(f"The package must be one of {_SUPPORTED_PACKAGES}. Got {package}.")
83
+
84
+ distributed_ctx = nvmath.distributed.get_context()
85
+ if distributed_ctx is None:
86
+ raise RuntimeError(
87
+ "nvmath.distributed has not been initialized. Refer to "
88
+ "https://docs.nvidia.com/cuda/nvmath-python/latest/distributed-apis/runtime.html"
89
+ " for more information."
90
+ )
91
+ if not distributed_ctx.nvshmem_available:
92
+ raise RuntimeError("nvmath.distributed wasn't initialized with NVSHMEM backend")
93
+
94
+ device_id = distributed_ctx.device_id
95
+
96
+ if isinstance(shape, int):
97
+ shape = (shape,)
98
+
99
+ strides = None
100
+ if axis_order is not None:
101
+ if axis_order == "C":
102
+ strides = calculate_strides(shape, reversed(range(len(shape))))
103
+ elif axis_order == "F":
104
+ strides = calculate_strides(shape, range(len(shape)))
105
+ else:
106
+ strides = calculate_strides(shape, axis_order)
107
+
108
+ if package.__name__ == "cupy":
109
+ from ._internal.tensor_ifc_cupy import CupyDistributedTensor
110
+
111
+ if dtype is None:
112
+ # This mimics numpy and cupy
113
+ dtype = np.float64
114
+
115
+ dtype = np.dtype(dtype).name # type: ignore
116
+ return CupyDistributedTensor.empty(
117
+ shape,
118
+ dtype=dtype,
119
+ device_id=device_id,
120
+ strides=strides,
121
+ symmetric_memory="nvshmem",
122
+ make_symmetric=make_symmetric,
123
+ skip_symmetric_check=skip_symmetric_check,
124
+ logger=logger,
125
+ ).tensor
126
+ elif package.__name__ == "torch":
127
+ from ._internal.tensor_ifc_torch import TorchDistributedTensor
128
+
129
+ if dtype is None:
130
+ import torch
131
+
132
+ dtype = torch.get_default_dtype()
133
+
134
+ dtype = str(dtype).split(".")[1]
135
+ return TorchDistributedTensor.empty(
136
+ shape,
137
+ dtype=dtype,
138
+ device_id=device_id,
139
+ strides=strides,
140
+ symmetric_memory="nvshmem",
141
+ make_symmetric=make_symmetric,
142
+ skip_symmetric_check=skip_symmetric_check,
143
+ logger=logger,
144
+ ).tensor
145
+
146
+
147
+ def free_symmetric_memory(*tensors) -> None:
148
+ """Frees tensors' data buffer where the buffer was allocated on the NVSHMEM
149
+ symmetric heap. Note that this is only meant to be called on tensors returned
150
+ by ``allocate_symmetric_memory()``.
151
+
152
+ **This is a collective operation and must be called by all processes, with tensors
153
+ in the same order**."""
154
+
155
+ device_id = tensor_wrapper.wrap_operand(tensors[0]).device_id
156
+ if device_id == "cpu":
157
+ raise TypeError("free_symmetric_memory called on CPU array/tensor")
158
+
159
+ with device_ctx(device_id):
160
+ for tensor in tensors:
161
+ wrapped_tensor = tensor_wrapper.wrap_operand(tensor)
162
+ if wrapped_tensor.device_id == "cpu":
163
+ raise TypeError("free_symmetric_memory called on CPU array/tensor")
164
+
165
+ assert wrapped_tensor.device_id == device_id, "Internal error: symmetric memory tensors are not on the same device"
166
+
167
+ wrapped_tensor.free_symmetric()
@@ -0,0 +1,30 @@
1
+ # Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from ._configuration import RedistributeOptions
6
+ from .distributions import (
7
+ BindDistributionError,
8
+ BlockCyclic,
9
+ BlockNonCyclic,
10
+ Box,
11
+ ConvertDistributionError,
12
+ Distribution,
13
+ ProcessGrid,
14
+ Slab,
15
+ )
16
+ from .redistribute import Redistribute, redistribute
17
+
18
+ __all__ = [
19
+ "ProcessGrid",
20
+ "Distribution",
21
+ "Slab",
22
+ "Box",
23
+ "BlockCyclic",
24
+ "BlockNonCyclic",
25
+ "BindDistributionError",
26
+ "ConvertDistributionError",
27
+ "RedistributeOptions",
28
+ "Redistribute",
29
+ "redistribute",
30
+ ]
@@ -0,0 +1,39 @@
1
+ # Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ __all__ = ["RedistributeOptions"]
6
+
7
+ from dataclasses import dataclass
8
+ from logging import Logger
9
+ from typing import Literal
10
+
11
+
12
+ @dataclass
13
+ class RedistributeOptions:
14
+ """
15
+ A data class for providing options to the :class:`Redistribute` object and the wrapper
16
+ function :func:`redistribute`.
17
+
18
+ Attributes:
19
+ logger (logging.Logger): Python Logger object. The root logger will be used if a
20
+ logger object is not provided.
21
+
22
+ blocking: A flag specifying the behavior of the execution functions and methods,
23
+ such as :func:`redistribute` and :meth:`Redistribute.execute`. When ``blocking``
24
+ is `True`, the execution methods do not return until the operation is complete.
25
+ When ``blocking`` is ``"auto"``, the methods return immediately when the input
26
+ tensor is on the GPU. The execution methods always block when the input tensor
27
+ is on the CPU to ensure that the user doesn't inadvertently use the result
28
+ before it becomes available. The default is ``"auto"``.
29
+
30
+ .. seealso::
31
+ :class:`Redistribute` and :func:`redistribute`.
32
+ """
33
+
34
+ logger: Logger | None = None
35
+ blocking: Literal[True, "auto"] = "auto"
36
+
37
+ def __post_init__(self):
38
+ if self.blocking not in (True, "auto"):
39
+ raise ValueError("The value specified for 'blocking' must be either True or 'auto'.")