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.
- nvmath/__init__.pxd +0 -0
- nvmath/__init__.py +45 -0
- nvmath/_internal/__init__.py +0 -0
- nvmath/_internal/attribute_ifc_factory.py +330 -0
- nvmath/_internal/layout.py +70 -0
- nvmath/_internal/templates.py +130 -0
- nvmath/_internal/threadsafe.py +106 -0
- nvmath/_internal/utils.py +43 -0
- nvmath/_internal/workspace.py +490 -0
- nvmath/_utils.py +147 -0
- nvmath/bindings/__init__.py +60 -0
- nvmath/bindings/_internal/__init__.pxd +0 -0
- nvmath/bindings/_internal/__init__.py +0 -0
- nvmath/bindings/_internal/common_types.pxd +31 -0
- nvmath/bindings/_internal/cublas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cublas.pxd +530 -0
- nvmath/bindings/_internal/cublasLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cublasLt.pxd +59 -0
- nvmath/bindings/_internal/cublasMp.pxd +52 -0
- nvmath/bindings/_internal/cudss.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cudss.pxd +54 -0
- nvmath/bindings/_internal/cufft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cufft.pxd +70 -0
- nvmath/bindings/_internal/cufftMp.pxd +77 -0
- nvmath/bindings/_internal/curand.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/curand.pxd +42 -0
- nvmath/bindings/_internal/cusolver.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cusolver.pxd +15 -0
- nvmath/bindings/_internal/cusolverDn.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cusolverDn.pxd +406 -0
- nvmath/bindings/_internal/cusolverMp.pxd +71 -0
- nvmath/bindings/_internal/cusolverSp.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cusolverSp.pxd +75 -0
- nvmath/bindings/_internal/cusparse.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cusparse.pxd +471 -0
- nvmath/bindings/_internal/cusparseLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cusparseLt.pxd +48 -0
- nvmath/bindings/_internal/cutensor.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/cutensor.pxd +58 -0
- nvmath/bindings/_internal/mathdx.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/mathdx.pxd +116 -0
- nvmath/bindings/_internal/nvshmem.pxd +29 -0
- nvmath/bindings/_internal/utils.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/_internal/utils.pxd +174 -0
- nvmath/bindings/_internal/utils.pyi +10 -0
- nvmath/bindings/cublas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cublas.pxd +558 -0
- nvmath/bindings/cublas.pyi +812 -0
- nvmath/bindings/cublasLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cublasLt.pxd +109 -0
- nvmath/bindings/cublasLt.pyi +1461 -0
- nvmath/bindings/cublasMp.pxd +85 -0
- nvmath/bindings/cublasMp.pyi +267 -0
- nvmath/bindings/cudss.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cudss.pxd +98 -0
- nvmath/bindings/cudss.pyi +443 -0
- nvmath/bindings/cufft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cufft.pxd +118 -0
- nvmath/bindings/cufft.pyi +301 -0
- nvmath/bindings/cufftMp.pxd +124 -0
- nvmath/bindings/cufftMp.pyi +326 -0
- nvmath/bindings/curand.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/curand.pxd +71 -0
- nvmath/bindings/curand.pyi +189 -0
- nvmath/bindings/cusolver.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cusolver.pxd +62 -0
- nvmath/bindings/cusolver.pyi +320 -0
- nvmath/bindings/cusolverDn.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cusolverDn.pxd +430 -0
- nvmath/bindings/cusolverDn.pyi +422 -0
- nvmath/bindings/cusolverMp.pxd +98 -0
- nvmath/bindings/cusolverMp.pyi +114 -0
- nvmath/bindings/cusolverSp.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cusolverSp.pxd +95 -0
- nvmath/bindings/cusolverSp.pyi +70 -0
- nvmath/bindings/cusparse.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cusparse.pxd +546 -0
- nvmath/bindings/cusparse.pyi +1017 -0
- nvmath/bindings/cusparseLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cusparseLt.pxd +99 -0
- nvmath/bindings/cusparseLt.pyi +252 -0
- nvmath/bindings/cutensor.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cutensor.pxd +98 -0
- nvmath/bindings/cutensor.pyi +324 -0
- nvmath/bindings/cycublas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycublas.pxd +664 -0
- nvmath/bindings/cycublasLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycublasLt.pxd +1045 -0
- nvmath/bindings/cycublasMp.pxd +171 -0
- nvmath/bindings/cycudss.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycudss.pxd +277 -0
- nvmath/bindings/cycufft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycufft.pxd +333 -0
- nvmath/bindings/cycufftMp.pxd +342 -0
- nvmath/bindings/cycurand.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycurand.pxd +141 -0
- nvmath/bindings/cycusolver.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycusolver.pxd +137 -0
- nvmath/bindings/cycusolverDn.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycusolverDn.pxd +443 -0
- nvmath/bindings/cycusolverMp.pxd +107 -0
- nvmath/bindings/cycusolverSp.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycusolverSp.pxd +93 -0
- nvmath/bindings/cycusparse.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycusparse.pxd +679 -0
- nvmath/bindings/cycusparseLt.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycusparseLt.pxd +135 -0
- nvmath/bindings/cycutensor.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cycutensor.pxd +189 -0
- nvmath/bindings/cymathdx.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/cymathdx.pxd +552 -0
- nvmath/bindings/cynvshmem.pxd +118 -0
- nvmath/bindings/mathdx.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/mathdx.pxd +182 -0
- nvmath/bindings/mathdx.pyi +1562 -0
- nvmath/bindings/nvpl/__init__.pxd +0 -0
- nvmath/bindings/nvpl/__init__.py +13 -0
- nvmath/bindings/nvpl/_internal/__init__.pxd +0 -0
- nvmath/bindings/nvpl/_internal/__init__.py +0 -0
- nvmath/bindings/nvpl/_internal/blas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/_internal/blas.pxd +237 -0
- nvmath/bindings/nvpl/_internal/fft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/_internal/fft.pxd +36 -0
- nvmath/bindings/nvpl/blas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/blas.pxd +131 -0
- nvmath/bindings/nvpl/blas.pyi +168 -0
- nvmath/bindings/nvpl/cyblas.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/cyblas.pxd +280 -0
- nvmath/bindings/nvpl/cyfft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/cyfft.pxd +93 -0
- nvmath/bindings/nvpl/fft.cp314t-win_amd64.pyd +0 -0
- nvmath/bindings/nvpl/fft.pxd +100 -0
- nvmath/bindings/nvpl/fft.pyi +168 -0
- nvmath/bindings/nvshmem.pxd +54 -0
- nvmath/bindings/nvshmem.pyi +191 -0
- nvmath/device/__init__.py +38 -0
- nvmath/device/_deprecated.py +33 -0
- nvmath/device/common.py +315 -0
- nvmath/device/common_backend.py +131 -0
- nvmath/device/common_cuda.py +201 -0
- nvmath/device/common_numba.py +300 -0
- nvmath/device/common_numba_cuda_mlir.py +202 -0
- nvmath/device/common_opaque_tensor.py +201 -0
- nvmath/device/cublasdx.py +1606 -0
- nvmath/device/cublasdx_backend.py +860 -0
- nvmath/device/cublasdx_numba.py +1534 -0
- nvmath/device/cublasdx_numba_cuda_mlir.py +208 -0
- nvmath/device/cufftdx.py +373 -0
- nvmath/device/cufftdx_backend.py +220 -0
- nvmath/device/cufftdx_numba.py +140 -0
- nvmath/device/cufftdx_numba_cuda_mlir.py +79 -0
- nvmath/device/curand_kernel.py +9147 -0
- nvmath/device/cusolverdx.py +2708 -0
- nvmath/device/cusolverdx_backend.py +440 -0
- nvmath/device/cusolverdx_numba.py +567 -0
- nvmath/device/cusolverdx_numba_cuda_mlir.py +604 -0
- nvmath/device/cusolverdx_overload_backend.py +1029 -0
- nvmath/device/llvm_array.py +29 -0
- nvmath/device/random.py +441 -0
- nvmath/device/random_helpers.py +23 -0
- nvmath/device/random_states.py +187 -0
- nvmath/device/types.py +138 -0
- nvmath/device/vector_types_numba.py +259 -0
- nvmath/distributed/__init__.py +200 -0
- nvmath/distributed/_internal/__init__.py +0 -0
- nvmath/distributed/_internal/nccl.py +86 -0
- nvmath/distributed/_internal/nvshmem.py +307 -0
- nvmath/distributed/_internal/symmetric_memory.py +35 -0
- nvmath/distributed/_internal/tensor_ifc.py +70 -0
- nvmath/distributed/_internal/tensor_ifc_cupy.py +68 -0
- nvmath/distributed/_internal/tensor_ifc_host_device.py +172 -0
- nvmath/distributed/_internal/tensor_ifc_numpy.py +46 -0
- nvmath/distributed/_internal/tensor_ifc_torch.py +162 -0
- nvmath/distributed/_internal/tensor_wrapper.py +81 -0
- nvmath/distributed/_utils.py +167 -0
- nvmath/distributed/distribution/__init__.py +30 -0
- nvmath/distributed/distribution/_configuration.py +39 -0
- nvmath/distributed/distribution/distributions.py +1024 -0
- nvmath/distributed/distribution/redistribute.py +1284 -0
- nvmath/distributed/fft/__init__.py +7 -0
- nvmath/distributed/fft/_configuration.py +82 -0
- nvmath/distributed/fft/fft.py +2742 -0
- nvmath/distributed/linalg/__init__.py +22 -0
- nvmath/distributed/linalg/_internal/__init__.py +3 -0
- nvmath/distributed/linalg/_internal/epilog_protocol.py +586 -0
- nvmath/distributed/linalg/_internal/matmul_desc_ifc.py +28 -0
- nvmath/distributed/linalg/advanced/__init__.py +8 -0
- nvmath/distributed/linalg/advanced/_configuration.py +171 -0
- nvmath/distributed/linalg/advanced/matmulmod.py +3573 -0
- nvmath/distributed/linalg/generic/__init__.py +8 -0
- nvmath/distributed/linalg/generic/_caching.py +66 -0
- nvmath/distributed/linalg/generic/_configuration.py +61 -0
- nvmath/distributed/linalg/generic/_factorization.py +172 -0
- nvmath/distributed/linalg/generic/_initialization.py +966 -0
- nvmath/distributed/linalg/generic/_problem_spec.py +511 -0
- nvmath/distributed/linalg/generic/solvermod.py +1368 -0
- nvmath/distributed/process_group.py +408 -0
- nvmath/fft/__init__.py +7 -0
- nvmath/fft/_configuration.py +189 -0
- nvmath/fft/_exec_utils.py +82 -0
- nvmath/fft/_helpers.py +237 -0
- nvmath/fft/fft.py +3122 -0
- nvmath/internal/__init__.pxd +3 -0
- nvmath/internal/__init__.py +10 -0
- nvmath/internal/_bindings.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/_bindings.pxd +18 -0
- nvmath/internal/_device_utils.py +45 -0
- nvmath/internal/_layout/__init__.pxd +3 -0
- nvmath/internal/_layout/__init__.py +7 -0
- nvmath/internal/_layout/_layout.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/_layout/_layout.pxd +1303 -0
- nvmath/internal/_layout/_layout.pyi +1145 -0
- nvmath/internal/enum_utils.py +142 -0
- nvmath/internal/formatters.py +87 -0
- nvmath/internal/mem_limit.py +51 -0
- nvmath/internal/memory.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/memory.pxd +13 -0
- nvmath/internal/memory.pyi +50 -0
- nvmath/internal/ndbuffer/__init__.pxd +3 -0
- nvmath/internal/ndbuffer/__init__.py +9 -0
- nvmath/internal/ndbuffer/_copy_kernel.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/ndbuffer/_copy_kernel.pxd +10 -0
- nvmath/internal/ndbuffer/_jit.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/ndbuffer/_jit.pxd +7 -0
- nvmath/internal/ndbuffer/_ndbuffer.cp314t-win_amd64.pyd +0 -0
- nvmath/internal/ndbuffer/_ndbuffer.pxd +40 -0
- nvmath/internal/ndbuffer/_ndbuffer.pyi +463 -0
- nvmath/internal/ndbuffer/copy_kernel/args.h +34 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/array_view.h +52 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/elementwise.h +68 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/grid_indexer.h +69 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/transposed.h +242 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/type_utils.h +39 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/utils.h +132 -0
- nvmath/internal/ndbuffer/copy_kernel/copy_kernel_impl/vec.h +159 -0
- nvmath/internal/ndbuffer/copy_kernel/elementwise.h +53 -0
- nvmath/internal/ndbuffer/copy_kernel/transposed.h +58 -0
- nvmath/internal/package_ifc.py +168 -0
- nvmath/internal/package_ifc_cuda.py +57 -0
- nvmath/internal/package_ifc_cupy.py +67 -0
- nvmath/internal/package_ifc_torch.py +69 -0
- nvmath/internal/package_wrapper.py +14 -0
- nvmath/internal/tensor_ifc.py +179 -0
- nvmath/internal/tensor_ifc_cupy.py +234 -0
- nvmath/internal/tensor_ifc_ndbuffer.py +147 -0
- nvmath/internal/tensor_ifc_numpy.py +184 -0
- nvmath/internal/tensor_ifc_torch.py +178 -0
- nvmath/internal/tensor_wrapper.py +160 -0
- nvmath/internal/typemaps.py +113 -0
- nvmath/internal/utils.py +805 -0
- nvmath/linalg/__init__.py +56 -0
- nvmath/linalg/_internal/__init__.py +3 -0
- nvmath/linalg/_internal/algo_cap_ifc.py +82 -0
- nvmath/linalg/_internal/algo_config_ifc.py +43 -0
- nvmath/linalg/_internal/batch.py +234 -0
- nvmath/linalg/_internal/enum_to_tuples.py +64 -0
- nvmath/linalg/_internal/epilog_protocol.py +766 -0
- nvmath/linalg/_internal/layout.py +624 -0
- nvmath/linalg/_internal/matmul_desc_ifc.py +28 -0
- nvmath/linalg/_internal/matmul_pref_ifc.py +27 -0
- nvmath/linalg/_internal/matrix_layout_ifc.py +26 -0
- nvmath/linalg/_internal/solver_utils.py +432 -0
- nvmath/linalg/_internal/typemaps.py +144 -0
- nvmath/linalg/_internal/utils.py +157 -0
- nvmath/linalg/advanced/__init__.py +8 -0
- nvmath/linalg/advanced/_algorithmmod.py +170 -0
- nvmath/linalg/advanced/_configuration.py +351 -0
- nvmath/linalg/advanced/helpers/__init__.py +5 -0
- nvmath/linalg/advanced/helpers/matmul.py +1316 -0
- nvmath/linalg/advanced/matmulmod.py +3734 -0
- nvmath/linalg/generic/__init__.py +53 -0
- nvmath/linalg/generic/_configuration/__init__.py +39 -0
- nvmath/linalg/generic/_configuration/layout.py +263 -0
- nvmath/linalg/generic/_configuration/match.py +734 -0
- nvmath/linalg/generic/_configuration/qualifiers.py +493 -0
- nvmath/linalg/generic/_configuration/solver_configuration.py +59 -0
- nvmath/linalg/generic/_configuration/wrap.py +217 -0
- nvmath/linalg/generic/_dtype.py +15 -0
- nvmath/linalg/generic/matmulmod.py +2094 -0
- nvmath/linalg/generic/solvermod.py +1301 -0
- nvmath/memory.py +279 -0
- nvmath/sparse/__init__.py +38 -0
- nvmath/sparse/_internal/__init__.py +21 -0
- nvmath/sparse/_internal/common_utils.py +147 -0
- nvmath/sparse/_internal/cudss_config_ifc.py +702 -0
- nvmath/sparse/_internal/cudss_data_ifc.py +399 -0
- nvmath/sparse/_internal/cudss_utils.py +506 -0
- nvmath/sparse/_internal/cusparse_utils.py +382 -0
- nvmath/sparse/_internal/sparse_bsc_ifc.py +303 -0
- nvmath/sparse/_internal/sparse_bsr_ifc.py +305 -0
- nvmath/sparse/_internal/sparse_coo_ifc.py +256 -0
- nvmath/sparse/_internal/sparse_csc_ifc.py +268 -0
- nvmath/sparse/_internal/sparse_csr_ifc.py +288 -0
- nvmath/sparse/_internal/sparse_dia_ifc.py +242 -0
- nvmath/sparse/_internal/sparse_format_helpers.py +601 -0
- nvmath/sparse/_internal/sparse_tensor_ifc.py +133 -0
- nvmath/sparse/_internal/sparse_ust_ifc.py +141 -0
- nvmath/sparse/_internal/utils.py +56 -0
- nvmath/sparse/advanced/__init__.py +7 -0
- nvmath/sparse/advanced/_configuration.py +227 -0
- nvmath/sparse/advanced/direct_solver.py +2069 -0
- nvmath/sparse/generic/__init__.py +7 -0
- nvmath/sparse/generic/_configuration.py +129 -0
- nvmath/sparse/generic/_helpers.py +137 -0
- nvmath/sparse/generic/_thunks.py +21 -0
- nvmath/sparse/generic/matmulmod.py +2353 -0
- nvmath/sparse/ust/__init__.py +7 -0
- nvmath/sparse/ust/_converters.py +422 -0
- nvmath/sparse/ust/_cpp.py +28 -0
- nvmath/sparse/ust/_drawer.py +565 -0
- nvmath/sparse/ust/_emitter.py +1033 -0
- nvmath/sparse/ust/_jit.py +188 -0
- nvmath/sparse/ust/_kernel.py +282 -0
- nvmath/sparse/ust/_utils.py +149 -0
- nvmath/sparse/ust/interfaces/__init__.py +0 -0
- nvmath/sparse/ust/interfaces/torch_interface.py +476 -0
- nvmath/sparse/ust/tensor.py +1016 -0
- nvmath/sparse/ust/tensor_format.py +957 -0
- nvmath/tensor/__init__.py +6 -0
- nvmath/tensor/_configuration.py +120 -0
- nvmath/tensor/_internal/__init__.py +3 -0
- nvmath/tensor/_internal/cutensor_config_ifc.py +279 -0
- nvmath/tensor/_internal/cutensor_utils.py +230 -0
- nvmath/tensor/_internal/data.py +43 -0
- nvmath/tensor/_internal/einsum_parser.py +444 -0
- nvmath/tensor/_internal/typemaps.py +96 -0
- nvmath/tensor/contract.py +1900 -0
- nvmath_python-1.0.0.dist-info/METADATA +134 -0
- nvmath_python-1.0.0.dist-info/RECORD +332 -0
- nvmath_python-1.0.0.dist-info/WHEEL +5 -0
- nvmath_python-1.0.0.dist-info/licenses/LICENSE +177 -0
- 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
|