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,56 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from nvmath.bindings.cublas import ComputeType # type: ignore
|
|
6
|
+
|
|
7
|
+
from . import advanced
|
|
8
|
+
from .generic import (
|
|
9
|
+
DiagonalMatrixQualifier,
|
|
10
|
+
DiagType,
|
|
11
|
+
ExecutionCPU,
|
|
12
|
+
ExecutionCUDA,
|
|
13
|
+
FillMode,
|
|
14
|
+
GeneralMatrixQualifier,
|
|
15
|
+
HermitianMatrixQualifier,
|
|
16
|
+
InvalidMatmulState,
|
|
17
|
+
Matmul,
|
|
18
|
+
MatmulOptions,
|
|
19
|
+
MatrixQualifier,
|
|
20
|
+
SideMode,
|
|
21
|
+
SymmetricMatrixQualifier,
|
|
22
|
+
TriangularMatrixQualifier,
|
|
23
|
+
matmul,
|
|
24
|
+
matrix_qualifiers_dtype,
|
|
25
|
+
)
|
|
26
|
+
from .generic.solvermod import (
|
|
27
|
+
DirectSolver,
|
|
28
|
+
DirectSolverOptions,
|
|
29
|
+
InvalidDirectSolverState,
|
|
30
|
+
direct_solver,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
__all__ = [
|
|
34
|
+
"advanced",
|
|
35
|
+
"ComputeType",
|
|
36
|
+
"DiagonalMatrixQualifier",
|
|
37
|
+
"ExecutionCPU",
|
|
38
|
+
"ExecutionCUDA",
|
|
39
|
+
"GeneralMatrixQualifier",
|
|
40
|
+
"HermitianMatrixQualifier",
|
|
41
|
+
"InvalidMatmulState",
|
|
42
|
+
"InvalidDirectSolverState",
|
|
43
|
+
"DirectSolver",
|
|
44
|
+
"DirectSolverOptions",
|
|
45
|
+
"matmul",
|
|
46
|
+
"Matmul",
|
|
47
|
+
"MatmulOptions",
|
|
48
|
+
"MatrixQualifier",
|
|
49
|
+
"matrix_qualifiers_dtype",
|
|
50
|
+
"direct_solver",
|
|
51
|
+
"SymmetricMatrixQualifier",
|
|
52
|
+
"TriangularMatrixQualifier",
|
|
53
|
+
"SideMode",
|
|
54
|
+
"FillMode",
|
|
55
|
+
"DiagType",
|
|
56
|
+
]
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Interface class to encapsulate low-level calls to get algorithm capabilities information.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
__all__ = ["AlgoCapInterface"]
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
|
|
13
|
+
from nvmath._internal.attribute_ifc_factory import make_cublas_attribute_interface
|
|
14
|
+
from nvmath.bindings import cublasLt as cublaslt
|
|
15
|
+
|
|
16
|
+
from .enum_to_tuples import ENUM_TO_MATMUL_STAGE, ENUM_TO_MATMUL_TILE
|
|
17
|
+
|
|
18
|
+
CapEnum = cublaslt.MatmulAlgoCapAttribute
|
|
19
|
+
|
|
20
|
+
# Create a base class, _AlgoCapBase, such that each enum member in
|
|
21
|
+
# MatmulAlgoCapAttribute (except TILE_IDS and STAGES_IDS) is exposed
|
|
22
|
+
# as a read-only lowercase property. For example, if the class instance
|
|
23
|
+
# is stored as ``cap_ifc``, then the enum member ``ATOMIC_SYNC``
|
|
24
|
+
# becomes the property ``cap_ifc.atomic_sync``.
|
|
25
|
+
#
|
|
26
|
+
# The C binding expects a raw pointer to the algo sub-buffer, not the
|
|
27
|
+
# handle dict. _get_attribute bridges that gap by extracting
|
|
28
|
+
# `handle["algo"].ctypes.data` before forwarding the call.
|
|
29
|
+
_raw_get = cublaslt.matmul_algo_cap_get_attribute
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _get_attribute(handle, enum_value, buf_addr, buf_size, size_written_addr):
|
|
33
|
+
_raw_get(handle["algo"].ctypes.data, enum_value, buf_addr, buf_size, size_written_addr)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# TILE_IDS and STAGES_IDS are excluded because they are variable-length
|
|
37
|
+
# arrays that require a two-phase size-then-read query. They are implemented
|
|
38
|
+
# as extra properties on the AlgoCapInterface subclass below.
|
|
39
|
+
_AlgoCapBase = make_cublas_attribute_interface(
|
|
40
|
+
class_module=__name__,
|
|
41
|
+
class_name="_AlgoCapBase",
|
|
42
|
+
attribute_enum=CapEnum,
|
|
43
|
+
get_attribute_dtype_fn=cublaslt.get_matmul_algo_cap_attribute_dtype,
|
|
44
|
+
get_attribute_fn=_get_attribute,
|
|
45
|
+
exclude={"TILE_IDS", "STAGES_IDS"},
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class AlgoCapInterface(_AlgoCapBase): # type: ignore[valid-type, misc]
|
|
50
|
+
"""The factory base class is extended with two extra properties:
|
|
51
|
+
``tile_ids`` and ``stages_ids`` are added here because they return
|
|
52
|
+
variable-length arrays via a two-phase size-then-read query."""
|
|
53
|
+
|
|
54
|
+
def _get_array_attribute(self, name, enum_to_value_map):
|
|
55
|
+
dtype = cublaslt.get_matmul_algo_cap_attribute_dtype(CapEnum[name])
|
|
56
|
+
size_written = np.zeros((1,), dtype=np.uint64)
|
|
57
|
+
|
|
58
|
+
_raw_get(self._handle["algo"].ctypes.data, CapEnum[name].value, 0, 0, size_written.ctypes.data)
|
|
59
|
+
|
|
60
|
+
size = size_written[0]
|
|
61
|
+
if size == 0:
|
|
62
|
+
return ()
|
|
63
|
+
|
|
64
|
+
num = int(size // dtype().itemsize)
|
|
65
|
+
attribute_buffer = np.zeros((num,), dtype=dtype)
|
|
66
|
+
_raw_get(
|
|
67
|
+
self._handle["algo"].ctypes.data,
|
|
68
|
+
CapEnum[name].value,
|
|
69
|
+
attribute_buffer.ctypes.data,
|
|
70
|
+
size,
|
|
71
|
+
size_written.ctypes.data,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
return tuple(enum_to_value_map[e] for e in attribute_buffer)
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def tile_ids(self):
|
|
78
|
+
return self._get_array_attribute("TILE_IDS", ENUM_TO_MATMUL_TILE)
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def stages_ids(self):
|
|
82
|
+
return self._get_array_attribute("STAGES_IDS", ENUM_TO_MATMUL_STAGE)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Interface class to encapsulate low-level calls to get and set algorithm configuration
|
|
7
|
+
attributes.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
__all__ = ["AlgoConfigInterface"]
|
|
11
|
+
|
|
12
|
+
from nvmath._internal.attribute_ifc_factory import make_cublas_attribute_interface
|
|
13
|
+
from nvmath.bindings import cublasLt as cublaslt
|
|
14
|
+
|
|
15
|
+
# Create a class, AlgoConfigInterface, such that each enum member in
|
|
16
|
+
# MatmulAlgoConfigAttribute is exposed as a lowercase property (getter + setter).
|
|
17
|
+
# For example, if the class instance is stored as ``config_ifc``,
|
|
18
|
+
# then the enum member ``CLUSTER_SHAPE_ID`` becomes the property
|
|
19
|
+
# ``config_ifc.cluster_shape_id``.
|
|
20
|
+
#
|
|
21
|
+
# The C bindings expect a raw pointer to the algo sub-buffer, not the
|
|
22
|
+
# handle dict. _get_attribute and _set_attribute bridge that gap by
|
|
23
|
+
# extracting `handle["algo"].ctypes.data` before forwarding the call.
|
|
24
|
+
_raw_get = cublaslt.matmul_algo_config_get_attribute
|
|
25
|
+
_raw_set = cublaslt.matmul_algo_config_set_attribute
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _get_attribute(handle, enum_value, buf_addr, buf_size, size_written_addr):
|
|
29
|
+
_raw_get(handle["algo"].ctypes.data, enum_value, buf_addr, buf_size, size_written_addr)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _set_attribute(handle, enum_value, buf_addr, buf_size):
|
|
33
|
+
_raw_set(handle["algo"].ctypes.data, enum_value, buf_addr, buf_size)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
AlgoConfigInterface = make_cublas_attribute_interface(
|
|
37
|
+
class_module=__name__,
|
|
38
|
+
class_name="AlgoConfigInterface",
|
|
39
|
+
attribute_enum=cublaslt.MatmulAlgoConfigAttribute,
|
|
40
|
+
get_attribute_dtype_fn=cublaslt.get_matmul_algo_config_attribute_dtype,
|
|
41
|
+
get_attribute_fn=_get_attribute,
|
|
42
|
+
set_attribute_fn=_set_attribute,
|
|
43
|
+
)
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations # allows typehint of class methods to return the self class
|
|
6
|
+
|
|
7
|
+
import math
|
|
8
|
+
from collections.abc import Sequence
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
|
|
11
|
+
from nvmath._internal.layout import is_overlapping_layout
|
|
12
|
+
from nvmath.linalg._internal.utils import axis_order_in_memory, calculate_strides, check_batch_tileable
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(slots=True, frozen=True)
|
|
16
|
+
class BatchTraits:
|
|
17
|
+
"""Represents the traits of a batched data.
|
|
18
|
+
|
|
19
|
+
A BatchTraits is valid if the non-batch dimensions are contiguous and dense (the data
|
|
20
|
+
span the entire extent of the tensor and there are no gaps between adjacent elements).
|
|
21
|
+
The batch dimensions may be optionally overlapping.
|
|
22
|
+
|
|
23
|
+
Attributes:
|
|
24
|
+
shape: The dimensions of the batch. An empty tuple `()` indicates no batching.
|
|
25
|
+
strides: The memory strides for each dimension of the batch.
|
|
26
|
+
overlap_allowed: Whether the batch dimensions are allowed to overlap in memory.
|
|
27
|
+
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
shape: Sequence[int]
|
|
31
|
+
strides: Sequence[int]
|
|
32
|
+
overlap_allowed: bool = False
|
|
33
|
+
|
|
34
|
+
@classmethod
|
|
35
|
+
def from_full_shape_and_strides(
|
|
36
|
+
cls,
|
|
37
|
+
shape: Sequence[int],
|
|
38
|
+
strides: Sequence[int],
|
|
39
|
+
num_trailing_dims: int,
|
|
40
|
+
overlap_allowed: bool = False,
|
|
41
|
+
) -> BatchTraits:
|
|
42
|
+
"""Create BatchTraits from the shape and strides of a tensor.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
shape: The full shape of the tensor including both batch and non-batch
|
|
46
|
+
dimensions.
|
|
47
|
+
strides: The memory strides for each dimension of the full tensor.
|
|
48
|
+
num_trailing_dims: The number of trailing (non-batch) dimensions to exclude from
|
|
49
|
+
the batch. For example, for a batched matrix with shape (B1, B2, M, N),
|
|
50
|
+
num_trailing_dims=2 would extract (B1, B2) as batch dimensions.
|
|
51
|
+
overlap_allowed: Whether the batch dimensions are allowed to overlap in memory.
|
|
52
|
+
If False, raises ValueError if overlapping layout is detected. Defaults to
|
|
53
|
+
False.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
BatchTraits with the extracted batch shape and strides.
|
|
57
|
+
|
|
58
|
+
Raises:
|
|
59
|
+
ValueError: If the batch layout is not tileable (cannot be efficiently
|
|
60
|
+
processed).
|
|
61
|
+
ValueError: If overlap_allowed is False and the batch layout has overlapping
|
|
62
|
+
memory.
|
|
63
|
+
|
|
64
|
+
Example:
|
|
65
|
+
>>> # Extract batch info from a tensor of shape (3, 4, 5, 6)
|
|
66
|
+
>>> # treating last 2 dimensions as non-batch
|
|
67
|
+
>>> batch = BatchTraits.from_full_shape_and_strides(
|
|
68
|
+
... shape=(3, 4, 5, 6),
|
|
69
|
+
... strides=(120, 30, 6, 1), # Row-major strides
|
|
70
|
+
... num_trailing_dims=2, # Last 2 dims are non-batch
|
|
71
|
+
... )
|
|
72
|
+
>>> batch.shape
|
|
73
|
+
(3, 4)
|
|
74
|
+
>>> batch.strides
|
|
75
|
+
(120, 30)
|
|
76
|
+
"""
|
|
77
|
+
assert len(shape) == len(strides), (shape, strides)
|
|
78
|
+
num_dims = len(shape)
|
|
79
|
+
leading_shape = shape[: num_dims - num_trailing_dims]
|
|
80
|
+
leading_strides = strides[: num_dims - num_trailing_dims]
|
|
81
|
+
# Check for valid batching
|
|
82
|
+
# The samples in the batch must be tileable.
|
|
83
|
+
if leading_shape and not check_batch_tileable(leading_shape, leading_strides):
|
|
84
|
+
message = (
|
|
85
|
+
f"The batch layout for shape = {leading_shape} and strides = "
|
|
86
|
+
f"{leading_strides} is currently not supported because it is not tileable."
|
|
87
|
+
)
|
|
88
|
+
raise ValueError(message)
|
|
89
|
+
|
|
90
|
+
if not overlap_allowed and is_overlapping_layout(leading_shape, leading_strides):
|
|
91
|
+
raise ValueError(
|
|
92
|
+
"Only non-overlapping tensors are valid for batching. "
|
|
93
|
+
f"Shape {leading_shape} with strides {leading_strides} is not valid for batching."
|
|
94
|
+
)
|
|
95
|
+
# It's OK if we prune off the information about the trailing dimensions because the
|
|
96
|
+
# strides should already contain information about them.
|
|
97
|
+
return BatchTraits(
|
|
98
|
+
shape=leading_shape,
|
|
99
|
+
strides=leading_strides,
|
|
100
|
+
overlap_allowed=overlap_allowed,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
@classmethod
|
|
104
|
+
def from_batch_shape_and_size(
|
|
105
|
+
cls,
|
|
106
|
+
shape: Sequence[int],
|
|
107
|
+
axis_order: Sequence[int],
|
|
108
|
+
batch_stride: int,
|
|
109
|
+
) -> BatchTraits:
|
|
110
|
+
"""Create BatchTraits from a batch shape and the size of one batch sample.
|
|
111
|
+
|
|
112
|
+
This method constructs BatchTraits by calculating the appropriate strides for a new
|
|
113
|
+
tensor with the given batch `shape`. The strides are computed based on the number of
|
|
114
|
+
elements of one batch sample and the desired layout order specified via
|
|
115
|
+
`axis_order`.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
shape: The shape of the batch dimensions
|
|
119
|
+
axis_order: The order of batch axes in memory
|
|
120
|
+
batch_stride: Number of elements of one batch sample (e.g., M*N
|
|
121
|
+
for an MxN matrix)
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
BatchTraits with the specified batch shape and computed strides.
|
|
125
|
+
|
|
126
|
+
Example:
|
|
127
|
+
>>> # Creating batch info for tensor of shape (3, 4, 5, 5)
|
|
128
|
+
>>> batch = BatchTraits.from_batch_shape_and_size(
|
|
129
|
+
... shape=(3, 4), # 2D batch
|
|
130
|
+
... axis_order=(1, 0), # ROW order,inner dimension (axis 1) comes first
|
|
131
|
+
... batch_stride=25, # Each 5x5 matrix = 25 elements
|
|
132
|
+
... )
|
|
133
|
+
>>> batch.shape
|
|
134
|
+
(3, 4)
|
|
135
|
+
>>> batch.strides
|
|
136
|
+
(100, 25) # Jump 100 for outer dim, 25 for inner dim
|
|
137
|
+
"""
|
|
138
|
+
strides = calculate_strides(
|
|
139
|
+
shape,
|
|
140
|
+
axis_order,
|
|
141
|
+
batch_stride,
|
|
142
|
+
)
|
|
143
|
+
return BatchTraits.from_full_shape_and_strides(
|
|
144
|
+
shape=shape,
|
|
145
|
+
strides=strides,
|
|
146
|
+
num_trailing_dims=0,
|
|
147
|
+
overlap_allowed=False,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
@property
|
|
151
|
+
def count(self) -> int:
|
|
152
|
+
"""The total number of elements in the batch. Returns 0 if non-batched."""
|
|
153
|
+
return 0 if not self.shape else math.prod(self.shape)
|
|
154
|
+
|
|
155
|
+
@property
|
|
156
|
+
def stride(self) -> int:
|
|
157
|
+
"""The stride between elements the batch. Returns 0 if non-batched."""
|
|
158
|
+
return 0 if not self.shape else min(self.strides)
|
|
159
|
+
|
|
160
|
+
@property
|
|
161
|
+
def axis_order(self) -> tuple[int, ...]:
|
|
162
|
+
"""The axis order of the batch. Returns an empty tuple if non-batched."""
|
|
163
|
+
return axis_order_in_memory(self.strides)
|
|
164
|
+
|
|
165
|
+
def __eq__(self, other) -> bool:
|
|
166
|
+
"""Return whether two BatchTraits are equal.
|
|
167
|
+
|
|
168
|
+
Two BatchTraits are equal only if both the shape and strides of the batches are
|
|
169
|
+
equal.
|
|
170
|
+
"""
|
|
171
|
+
if not isinstance(other, BatchTraits):
|
|
172
|
+
raise TypeError("Unsupported operand type(s) for ==.")
|
|
173
|
+
return self.shape == other.shape and self.strides == other.strides
|
|
174
|
+
|
|
175
|
+
def combine(
|
|
176
|
+
self,
|
|
177
|
+
other: BatchTraits | tuple[Sequence[int], Sequence[int]],
|
|
178
|
+
*,
|
|
179
|
+
allow_mixed_axis_order: bool = False,
|
|
180
|
+
) -> tuple[Sequence[int], Sequence[int]]:
|
|
181
|
+
"""Return the combined shape of two BatchTraits.
|
|
182
|
+
|
|
183
|
+
Currently two BatchTraits are only combinable if they have the same shape and axis
|
|
184
|
+
order or if one is an empty batch.
|
|
185
|
+
|
|
186
|
+
Parameters
|
|
187
|
+
----------
|
|
188
|
+
other: The other BatchTraits or (shape, axis_order) tuple to combine with.
|
|
189
|
+
allow_mixed_axis_order: If True, skip the axis_order compatibility check and pick
|
|
190
|
+
the first non-empty axis_order. Useful for explicit batching where each
|
|
191
|
+
operand's pointer array is computed independently.
|
|
192
|
+
|
|
193
|
+
Returns
|
|
194
|
+
-------
|
|
195
|
+
shape: The combined shape of the two BatchTraits.
|
|
196
|
+
axis_order: The combined axis order of the two BatchTraits.
|
|
197
|
+
|
|
198
|
+
Raises
|
|
199
|
+
------
|
|
200
|
+
ValueError: if the dimensions and strides are incompatible.
|
|
201
|
+
"""
|
|
202
|
+
if isinstance(other, BatchTraits):
|
|
203
|
+
shape, axis_order = other.shape, other.axis_order
|
|
204
|
+
else:
|
|
205
|
+
shape, axis_order = other # type: ignore[assignment]
|
|
206
|
+
if not self.shape or self.shape == shape:
|
|
207
|
+
new_shape = shape
|
|
208
|
+
elif not shape:
|
|
209
|
+
new_shape = self.shape
|
|
210
|
+
else:
|
|
211
|
+
msg = (
|
|
212
|
+
f"Batch dimensions {self.shape} and {shape} are not compatible. "
|
|
213
|
+
"Dimensions must be the same OR one input must be non-batched."
|
|
214
|
+
)
|
|
215
|
+
raise ValueError(msg)
|
|
216
|
+
if not self.axis_order or self.axis_order == axis_order:
|
|
217
|
+
new_axis_order = axis_order
|
|
218
|
+
elif not axis_order:
|
|
219
|
+
new_axis_order = self.axis_order
|
|
220
|
+
elif allow_mixed_axis_order:
|
|
221
|
+
new_axis_order = self.axis_order # pick self's order; D will be allocated fresh anyway
|
|
222
|
+
else:
|
|
223
|
+
msg = (
|
|
224
|
+
f"Batch order {self.axis_order} and {axis_order} are not compatible. "
|
|
225
|
+
"Batch orders must be the same OR one input must be non-batched."
|
|
226
|
+
)
|
|
227
|
+
raise ValueError(msg)
|
|
228
|
+
return new_shape, new_axis_order
|
|
229
|
+
|
|
230
|
+
def __mul__(self, other: BatchTraits | tuple[Sequence[int], Sequence[int]]) -> tuple[Sequence[int], Sequence[int]]:
|
|
231
|
+
return self.combine(other)
|
|
232
|
+
|
|
233
|
+
def __str__(self) -> str:
|
|
234
|
+
return f"shape {self.shape} and strides {self.strides}"
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Utilities to convert tuple like enumerators to tuples, along with forward and inverse maps.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"CLUSTER_SHAPES",
|
|
11
|
+
"CLUSTER_SHAPE_TO_ENUM",
|
|
12
|
+
"ENUM_TO_CLUSTER_SHAPE",
|
|
13
|
+
"MATMUL_STAGES",
|
|
14
|
+
"MATMUL_STAGE_TO_ENUM",
|
|
15
|
+
"ENUM_TO_MATMUL_STAGE",
|
|
16
|
+
"MATMUL_TILES",
|
|
17
|
+
"MATMUL_TILE_TO_ENUM",
|
|
18
|
+
"ENUM_TO_MATMUL_TILE",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
import re
|
|
22
|
+
|
|
23
|
+
from nvmath.bindings import cublasLt as cublaslt
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def integer_or_string(value):
|
|
27
|
+
try:
|
|
28
|
+
value = int(value)
|
|
29
|
+
except ValueError:
|
|
30
|
+
...
|
|
31
|
+
return value
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def create_valid_tuples_from_enum(enum, prefix, *, expr=r"(?:(\d+)x(\d+|\w+)(?:x(\d+))?|(AUTO|UNDEFINED))"):
|
|
35
|
+
"""
|
|
36
|
+
Create a sequence of tuples representing the allowed combinations for the given
|
|
37
|
+
enumeration.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
combinations = []
|
|
41
|
+
enumerator_to_value = {}
|
|
42
|
+
value_to_enumerator = {}
|
|
43
|
+
expr = prefix + expr
|
|
44
|
+
for e in enum:
|
|
45
|
+
m = re.match(expr, e.name)
|
|
46
|
+
if m:
|
|
47
|
+
# print(m.groups())
|
|
48
|
+
if m.group(4):
|
|
49
|
+
v = m.group(4)
|
|
50
|
+
else:
|
|
51
|
+
groups = m.groups()[: m.groups().index(None)]
|
|
52
|
+
v = tuple(map(integer_or_string, (g for g in groups)))
|
|
53
|
+
combinations.append(v)
|
|
54
|
+
value_to_enumerator[v] = e
|
|
55
|
+
enumerator_to_value[e] = v
|
|
56
|
+
|
|
57
|
+
return tuple(combinations), value_to_enumerator, enumerator_to_value
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
CLUSTER_SHAPES, CLUSTER_SHAPE_TO_ENUM, ENUM_TO_CLUSTER_SHAPE = create_valid_tuples_from_enum(cublaslt.ClusterShape, "SHAPE_")
|
|
61
|
+
|
|
62
|
+
MATMUL_STAGES, MATMUL_STAGE_TO_ENUM, ENUM_TO_MATMUL_STAGE = create_valid_tuples_from_enum(cublaslt.MatmulStages, "STAGES_")
|
|
63
|
+
|
|
64
|
+
MATMUL_TILES, MATMUL_TILE_TO_ENUM, ENUM_TO_MATMUL_TILE = create_valid_tuples_from_enum(cublaslt.MatmulTile, "TILE_")
|