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,220 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from collections.abc import Sequence
6
+ from functools import lru_cache
7
+ from typing import Protocol
8
+
9
+ import numpy
10
+
11
+ from nvmath.bindings import mathdx
12
+ from nvmath.device.common_backend import DescriptorWrapper
13
+ from nvmath.device.common_cuda import ComputeCapability
14
+
15
+ from .common import check_contains, check_in, check_not_in, check_sm
16
+ from .common_backend import (
17
+ EXECUTION_STR_TO_MATHDX,
18
+ NP_TYPES_TO_MATHDX_PRECISION,
19
+ NVARG_GEN_OPT_LTO,
20
+ build_get_int_traits,
21
+ build_get_str_trait,
22
+ set_code_target_sm,
23
+ )
24
+ from .types import REAL_NP_TYPES
25
+
26
+ _FFT_TYPE_TO_MATHDX = {t.name.lower(): t for t in mathdx.CufftdxType}
27
+
28
+ _FFT_DIRECTION_TO_MATHDX = {d.name.lower(): d for d in mathdx.CufftdxDirection}
29
+
30
+ _FFT_COMPLEX_LAYOUT_TO_MATHDX = {cl.name.lower(): cl for cl in mathdx.CufftdxComplexLayout}
31
+
32
+ _FFT_REAL_MODE_TO_MATHDX = {m.name.lower(): m for m in mathdx.CufftdxRealMode}
33
+
34
+ _FFT_API_STR_TO_MATHDX = {
35
+ "register_memory": mathdx.CufftdxApi.LMEM,
36
+ "shared_memory": mathdx.CufftdxApi.SMEM,
37
+ }
38
+
39
+ _FFT_KNOB_TYPE_TO_MATHDX = {t.name.lower(): t for t in mathdx.CufftdxKnobType}
40
+
41
+
42
+ _FFT_DEFINITION_ARGS = [
43
+ "size",
44
+ "precision",
45
+ "fft_type",
46
+ "execution",
47
+ "sm",
48
+ "direction",
49
+ "ffts_per_block",
50
+ "elements_per_thread",
51
+ "real_fft_options",
52
+ ]
53
+
54
+ _FFT_COMPILED_ARGS = [
55
+ "value_type",
56
+ "input_type",
57
+ "output_type",
58
+ "storage_size",
59
+ "shared_memory_size",
60
+ "stride",
61
+ "block_dim",
62
+ "implicit_type_batching",
63
+ ]
64
+
65
+
66
+ class CallableGetIntTraits(Protocol):
67
+ def __call__(self, handle: int, trait_type: mathdx.CufftdxTraitType, size: int) -> tuple: ...
68
+
69
+
70
+ class CallableGetStrTrait(Protocol):
71
+ def __call__(self, handle: int, trait_type: mathdx.CufftdxTraitType) -> str: ...
72
+
73
+
74
+ get_int_traits: CallableGetIntTraits = build_get_int_traits(mathdx.cufftdx_get_trait_int64s)
75
+
76
+ get_str_trait: CallableGetStrTrait = build_get_str_trait(mathdx.cufftdx_get_trait_str_size, mathdx.cufftdx_get_trait_str)
77
+
78
+
79
+ def get_int_trait(handle: int, trait_type: mathdx.CufftdxTraitType) -> int:
80
+ return int(mathdx.cufftdx_get_trait_int64(handle, trait_type))
81
+
82
+
83
+ def get_data_type_trait(handle: int, trait_type: mathdx.CufftdxTraitType) -> mathdx.CommondxValueType:
84
+ return mathdx.CommondxValueType(mathdx.cufftdx_get_trait_commondx_data_type(handle, trait_type))
85
+
86
+
87
+ def validate(
88
+ size,
89
+ precision,
90
+ fft_type,
91
+ execution,
92
+ direction,
93
+ ffts_per_block,
94
+ elements_per_thread,
95
+ real_fft_options,
96
+ sm,
97
+ ):
98
+ if size <= 0:
99
+ raise ValueError(f"size must be > 0. Got {size}")
100
+ check_in("precision", precision, REAL_NP_TYPES)
101
+ check_in("fft_type", fft_type, ["c2c", "c2r", "r2c"])
102
+ check_in("execution", execution, ["Block", "Thread"])
103
+ if direction is not None:
104
+ check_in("direction", direction, ["forward", "inverse"])
105
+ if ffts_per_block in (None, "suggested"):
106
+ pass
107
+ else:
108
+ if ffts_per_block <= 0:
109
+ raise ValueError(
110
+ f"ffts_per_block must be None, 'suggested' or a positive integer ; got ffts_per_block = {ffts_per_block}"
111
+ )
112
+ if elements_per_thread in (None, "suggested"):
113
+ pass
114
+ else:
115
+ if elements_per_thread <= 0:
116
+ raise ValueError(
117
+ f"elements_per_thread must be None, 'suggested' or a positive integer ; "
118
+ f"got elements_per_thread = {elements_per_thread}"
119
+ )
120
+ if real_fft_options is None:
121
+ pass
122
+ else:
123
+ check_contains(real_fft_options, "complex_layout")
124
+ check_contains(real_fft_options, "real_mode")
125
+ check_in("real_fft_options['complex_layout']", real_fft_options["complex_layout"], ["natural", "packed", "full"])
126
+ check_in("real_fft_options['real_mode']", real_fft_options["real_mode"], ["normal", "folded"])
127
+ check_sm(sm, "cuFFTDx")
128
+
129
+
130
+ def validate_execute_api(execution: str, execute_api: str | None):
131
+ """
132
+ Validate the execute_api argument.
133
+ """
134
+ if execution == "Block":
135
+ check_in("execute_api", execute_api, list(_FFT_API_STR_TO_MATHDX.keys()) + [None])
136
+ else:
137
+ if execute_api is not None:
138
+ raise ValueError(f"execute_api may be set only for 'Block' execution; got execution = {execution}")
139
+
140
+
141
+ @lru_cache
142
+ def generate_FFT(
143
+ size,
144
+ precision,
145
+ fft_type,
146
+ direction,
147
+ sm,
148
+ execution,
149
+ ffts_per_block,
150
+ elements_per_thread,
151
+ real_fft_options,
152
+ execute_api=None,
153
+ ):
154
+ check_not_in("ffts_per_block", ffts_per_block, ["suggested"])
155
+ check_not_in("elements_per_thread", elements_per_thread, ["suggested"])
156
+
157
+ h = mathdx.cufftdx_create_descriptor()
158
+
159
+ # TODO: remove after migrating to libmathdx 0.2.4+
160
+ if execute_api is None:
161
+ execute_api = "register_memory"
162
+
163
+ if execute_api is not None:
164
+ mathdx.cufftdx_set_operator_int64(h, mathdx.CufftdxOperatorType.API, _FFT_API_STR_TO_MATHDX[execute_api])
165
+
166
+ mathdx.cufftdx_set_operator_int64(h, mathdx.CufftdxOperatorType.SM, sm.major * 100 + sm.minor * 10)
167
+ mathdx.cufftdx_set_operator_int64(h, mathdx.CufftdxOperatorType.SIZE, size)
168
+ mathdx.cufftdx_set_operator_int64(h, mathdx.CufftdxOperatorType.PRECISION, NP_TYPES_TO_MATHDX_PRECISION[precision])
169
+ mathdx.cufftdx_set_operator_int64(h, mathdx.CufftdxOperatorType.TYPE, _FFT_TYPE_TO_MATHDX[fft_type])
170
+ mathdx.cufftdx_set_operator_int64(h, mathdx.CufftdxOperatorType.DIRECTION, _FFT_DIRECTION_TO_MATHDX[direction])
171
+
172
+ if real_fft_options:
173
+ real_fft_options = dict(real_fft_options)
174
+ ll = real_fft_options["complex_layout"]
175
+ mm = real_fft_options["real_mode"]
176
+ mathdx.cufftdx_set_operator_int64s(
177
+ h, mathdx.CufftdxOperatorType.REAL_FFT_OPTIONS, 2, [_FFT_COMPLEX_LAYOUT_TO_MATHDX[ll], _FFT_REAL_MODE_TO_MATHDX[mm]]
178
+ )
179
+
180
+ mathdx.cufftdx_set_operator_int64(h, mathdx.CufftdxOperatorType.EXECUTION, EXECUTION_STR_TO_MATHDX[execution])
181
+
182
+ if ffts_per_block:
183
+ mathdx.cufftdx_set_operator_int64(h, mathdx.CufftdxOperatorType.FFTS_PER_BLOCK, ffts_per_block)
184
+
185
+ if elements_per_thread:
186
+ mathdx.cufftdx_set_operator_int64(h, mathdx.CufftdxOperatorType.ELEMENTS_PER_THREAD, elements_per_thread)
187
+
188
+ return DescriptorWrapper(h, mathdx.cufftdx_destroy_descriptor)
189
+
190
+
191
+ @lru_cache
192
+ def generate_code(handle, version: ComputeCapability):
193
+ code = mathdx.commondx_create_code()
194
+
195
+ set_code_target_sm(code, version)
196
+ mathdx.commondx_set_code_option_str(code, mathdx.CommondxOption.EXTRA_NVRTC_ARGS, NVARG_GEN_OPT_LTO)
197
+ mathdx.cufftdx_finalize_code(code, handle)
198
+
199
+ return DescriptorWrapper(code, mathdx.commondx_destroy_code)
200
+
201
+
202
+ @lru_cache
203
+ def get_knobs(handle, knobs: Sequence[str]):
204
+ knobs_dx: list[mathdx.CufftdxKnobType] = [_FFT_KNOB_TYPE_TO_MATHDX[k] for k in knobs]
205
+ knobs_size = mathdx.cufftdx_get_knob_int64size(handle, len(knobs), knobs_dx)
206
+
207
+ knobs_result_dx = numpy.empty(knobs_size, dtype=numpy.int64)
208
+ mathdx.cufftdx_get_knob_int64s(
209
+ handle,
210
+ len(knobs),
211
+ knobs_dx,
212
+ knobs_size,
213
+ knobs_result_dx.ctypes.data,
214
+ )
215
+
216
+ knobs_result = [
217
+ tuple(int(knobs_result_dx[j]) for j in range(i, i + len(knobs))) for i in range(0, len(knobs_result_dx), len(knobs))
218
+ ]
219
+
220
+ return knobs_result
@@ -0,0 +1,140 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from numba import cuda
6
+ from numba.core import cgutils, typing
7
+ from numba.cuda.cudaimpl import lower_constant
8
+ from numba.cuda.extending import overload_method, typeof_impl
9
+ from numba.cuda.models import register_model
10
+ from numba.extending import types
11
+
12
+ from nvmath.device.common_cuda import get_default_code_type
13
+ from nvmath.device.cufftdx import FFT, compile_fft_execute
14
+
15
+ from .common_numba import (
16
+ NUMBA_FE_TYPES_TO_NUMBA_IR,
17
+ EmptyStructModel,
18
+ declare_cabi_device,
19
+ get_array_ptr,
20
+ overload_type_attribute,
21
+ )
22
+ from .cufftdx_backend import _FFT_COMPILED_ARGS, _FFT_DEFINITION_ARGS
23
+
24
+
25
+ class FFTType(types.Type):
26
+ """
27
+ Type class associated with the `cufftdx.FFT`.
28
+ """
29
+
30
+ def __init__(self, fft: FFT):
31
+ assert isinstance(fft, FFT)
32
+ self._fft = fft
33
+ attributes = [f"{attr}={getattr(fft, attr)}" for attr in _FFT_DEFINITION_ARGS if getattr(fft, attr)]
34
+ attributes.sort()
35
+
36
+ self.name = "FFT(" + ",".join(attributes) + ")"
37
+
38
+ @property
39
+ def fft(self) -> FFT:
40
+ return self._fft
41
+
42
+
43
+ register_model(FFTType)(EmptyStructModel)
44
+
45
+
46
+ @lower_constant(FFTType)
47
+ def constant_dummy(context, builder, typ, pyval):
48
+ struct_ptr = cgutils.create_struct_proxy(typ)(context, builder)
49
+ return struct_ptr._getvalue()
50
+
51
+
52
+ @typeof_impl.register(FFT)
53
+ def typeof_fft_numba(val: FFT, c: typing.Context) -> FFTType:
54
+ return FFTType(val)
55
+
56
+
57
+ for attribute in _FFT_DEFINITION_ARGS + _FFT_COMPILED_ARGS:
58
+ overload_type_attribute(FFTType, "fft", attribute)
59
+
60
+
61
+ # Numba does not support method overload or variadic arguments, so we using
62
+ # default values as a workaround
63
+ # https://github.com/numba/numba/issues/9980
64
+ # https://github.com/numba/numba/issues/9979
65
+ # https://github.com/numba/numba/issues/10143
66
+ @overload_method(FFTType, "execute", jit_options={"forceinline": True}, strict=False)
67
+ def ol_fft_numba_execute(fft_numba: FFTType, _arg1, _arg2=None):
68
+ if _arg2 in {None, types.Omitted(None), types.none}:
69
+ return ol_fft_type_execute_rmem(fft_numba, _arg1)
70
+ return ol_fft_type_execute_smem(fft_numba, _arg1, _arg2)
71
+
72
+
73
+ def ol_fft_type_execute_rmem(
74
+ fft_numba: FFTType,
75
+ thread_data: types.Array,
76
+ ):
77
+ if not isinstance(fft_numba, FFTType):
78
+ return
79
+ if not isinstance(thread_data, types.Array):
80
+ return
81
+
82
+ FFT = fft_numba.fft
83
+ value_type = NUMBA_FE_TYPES_TO_NUMBA_IR[FFT.value_type]
84
+ if thread_data.dtype != value_type:
85
+ return
86
+
87
+ code, symbol = compile_fft_execute(
88
+ FFT,
89
+ code_type=get_default_code_type(),
90
+ execute_api="shared_memory" if FFT.execution == "Block" else None,
91
+ )
92
+
93
+ lto = cuda.LTOIR(code.data)
94
+
95
+ sig = types.void(types.CPointer(value_type))
96
+ fft_device_func = declare_cabi_device(symbol, sig, link=lto)
97
+
98
+ def impl(_, thread_data, _arg2=None):
99
+ tptr = get_array_ptr(thread_data)
100
+ fft_device_func(tptr)
101
+
102
+ return impl
103
+
104
+
105
+ def ol_fft_type_execute_smem(
106
+ fft_numba: FFTType,
107
+ thread_data: types.Array,
108
+ smem: types.Array,
109
+ ):
110
+ if not isinstance(fft_numba, FFTType):
111
+ return
112
+ if not isinstance(thread_data, types.Array):
113
+ return
114
+ if not isinstance(smem, types.Array):
115
+ return
116
+ FFT = fft_numba.fft
117
+ value_type = NUMBA_FE_TYPES_TO_NUMBA_IR[FFT.value_type]
118
+ if smem.dtype != value_type:
119
+ return
120
+ if thread_data.dtype != value_type:
121
+ return
122
+
123
+ code, symbol = compile_fft_execute(
124
+ FFT,
125
+ code_type=get_default_code_type(),
126
+ execute_api="register_memory" if FFT.execution == "Block" else None,
127
+ )
128
+
129
+ lto = cuda.LTOIR(code.data)
130
+
131
+ value_type = NUMBA_FE_TYPES_TO_NUMBA_IR[FFT.value_type]
132
+ sig = types.void(types.CPointer(value_type), types.CPointer(value_type))
133
+ fft_device_func = declare_cabi_device(symbol, sig, link=lto)
134
+
135
+ def impl(_, thread_data, smem):
136
+ tptr = get_array_ptr(thread_data)
137
+ sptr = get_array_ptr(smem)
138
+ fft_device_func(tptr, sptr)
139
+
140
+ return impl
@@ -0,0 +1,79 @@
1
+ # Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from numba_cuda_mlir.compiler import declare_device
6
+ from numba_cuda_mlir.extending import overload_method, typing_registry
7
+ from numba_cuda_mlir.lowering_utilities.type_conversions import to_numba_type
8
+ from numba_cuda_mlir.numba_cuda import types
9
+ from numba_cuda_mlir.numba_cuda.cudadrv.linkable_code import LTOIR
10
+
11
+ from nvmath.device.common_cuda import get_default_code_type
12
+ from nvmath.device.common_numba_cuda_mlir import HostDescriptorBase, get_array_pointer, register_dummy_type
13
+ from nvmath.device.cufftdx import FFT, compile_fft_execute
14
+
15
+ from .cufftdx_backend import _FFT_COMPILED_ARGS, _FFT_DEFINITION_ARGS
16
+
17
+
18
+ class FFTType(HostDescriptorBase):
19
+ """
20
+ Type class associated with the `cufftdx.FFT`.
21
+ """
22
+
23
+ def __init__(self, fft: FFT) -> None:
24
+ assert isinstance(fft, FFT)
25
+ super().__init__(fft, _FFT_DEFINITION_ARGS, "FFT")
26
+
27
+
28
+ register_dummy_type(FFTType, FFT, _FFT_DEFINITION_ARGS + _FFT_COMPILED_ARGS)
29
+
30
+
31
+ @overload_method(FFTType, "execute", strict=False, typing_registry=typing_registry)
32
+ def ol_execute(fft_numba, thread_data, smem=None):
33
+ if not isinstance(fft_numba, FFTType):
34
+ return
35
+ if not isinstance(thread_data, types.Array):
36
+ return
37
+ if smem is not None and not isinstance(smem, (types.Array, types.Omitted)):
38
+ return
39
+
40
+ fft = fft_numba.host_descriptor
41
+
42
+ value_type = to_numba_type(fft.value_type)
43
+
44
+ if thread_data.dtype != value_type:
45
+ raise ValueError(f"Thread data dtype {thread_data.dtype} does not match value type {value_type}")
46
+
47
+ is_smem = smem is not None and not isinstance(smem, types.Omitted)
48
+ if is_smem and smem.dtype != value_type:
49
+ raise ValueError(f"Smem dtype {smem.dtype} does not match value type {value_type}")
50
+
51
+ execute_api = (
52
+ "register_memory" if fft.execution == "Block" and is_smem else "shared_memory" if fft.execution == "Block" else None
53
+ )
54
+
55
+ code, symbol = compile_fft_execute(
56
+ fft,
57
+ code_type=get_default_code_type(),
58
+ execute_api=execute_api,
59
+ )
60
+
61
+ if not is_smem:
62
+ sig = types.void(types.CPointer(value_type))
63
+ device_func = declare_device(symbol, sig, link=LTOIR(code.data), abi="c")
64
+
65
+ def impl(fft_numba, thread_data, smem=None):
66
+ ptr = get_array_pointer(thread_data)
67
+ device_func(ptr)
68
+
69
+ return impl
70
+ else:
71
+ sig = types.void(types.CPointer(value_type), types.CPointer(value_type))
72
+ device_func = declare_device(symbol, sig, link=LTOIR(code.data), abi="c")
73
+
74
+ def impl(fft_numba, thread_data, smem=None):
75
+ tptr = get_array_pointer(thread_data)
76
+ sptr = get_array_pointer(smem)
77
+ device_func(tptr, sptr)
78
+
79
+ return impl