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,129 @@
|
|
|
1
|
+
# Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"ExecutionCUDA",
|
|
7
|
+
"MatmulOptions",
|
|
8
|
+
"matrix_qualifiers_dtype",
|
|
9
|
+
"ComputeType",
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
import dataclasses
|
|
13
|
+
from enum import IntEnum
|
|
14
|
+
from logging import Logger
|
|
15
|
+
from typing import Literal
|
|
16
|
+
|
|
17
|
+
import numpy as _np
|
|
18
|
+
|
|
19
|
+
from nvmath._internal import templates
|
|
20
|
+
from nvmath._utils import CudaDataType
|
|
21
|
+
from nvmath.internal.mem_limit import check_memory_str
|
|
22
|
+
from nvmath.memory import BaseCUDAMemoryManager, BaseCUDAMemoryManagerAsync
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclasses.dataclass(frozen=True, slots=True, kw_only=True)
|
|
26
|
+
class ExecutionCUDA(templates.ExecutionCUDA):
|
|
27
|
+
"""
|
|
28
|
+
A data class for providing GPU execution options.
|
|
29
|
+
|
|
30
|
+
Attributes:
|
|
31
|
+
device_id: CUDA device ordinal (only used if the operand resides on the CPU). The
|
|
32
|
+
default value is 0.
|
|
33
|
+
|
|
34
|
+
.. seealso::
|
|
35
|
+
:class:`ExecutionCPU`, :class:`Matmul`, :func:`matmul`
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclasses.dataclass(frozen=True, slots=True, kw_only=True)
|
|
42
|
+
class ExecutionCPU(templates.ExecutionCPU):
|
|
43
|
+
"""
|
|
44
|
+
A data class for providing CPU execution options.
|
|
45
|
+
|
|
46
|
+
Attributes:
|
|
47
|
+
num_threads: The number of CPU threads used to execute the operation.
|
|
48
|
+
If not specified, defaults to the number of CPU cores available to the
|
|
49
|
+
process.
|
|
50
|
+
|
|
51
|
+
.. seealso::
|
|
52
|
+
:class:`ExecutionCUDA`, :class:`Matmul`, :func:`matmul`,
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclasses.dataclass
|
|
59
|
+
class MatmulOptions:
|
|
60
|
+
"""A data class for providing options to the :class:`Matmul` object and the wrapper
|
|
61
|
+
function :func:`matmul`.
|
|
62
|
+
|
|
63
|
+
Attributes:
|
|
64
|
+
codegen (bool): If ``True`` the operation will not be dispatched to cuSPARSE
|
|
65
|
+
(even if it is supported) for UST operands. Instead, the kernel will be
|
|
66
|
+
generated, compiled just-in-time, and used. The default is ``False``.
|
|
67
|
+
|
|
68
|
+
compute_type (nvmath.sparse.ComputeType): CUDA compute type. A suitable compute type
|
|
69
|
+
will be selected if not specified.
|
|
70
|
+
|
|
71
|
+
logger (logging.Logger): Python Logger object. The root logger will be used if a
|
|
72
|
+
logger object is not provided.
|
|
73
|
+
|
|
74
|
+
memory_limit: Maximum memory available to the MM operation. It can be specified as a
|
|
75
|
+
value (with optional suffix like K[iB], M[iB], G[iB]) or as a percentage. The
|
|
76
|
+
default is 80% of the device memory.
|
|
77
|
+
|
|
78
|
+
blocking: A flag specifying the behavior of the execution functions and methods,
|
|
79
|
+
such as :func:`matmul` and :meth:`Matmul.execute`. When ``blocking`` is `True`,
|
|
80
|
+
the execution methods do not return until the operation is complete. When
|
|
81
|
+
``blocking`` is ``"auto"``, the methods return immediately when the inputs are
|
|
82
|
+
on the GPU. The execution methods always block when the operands are on the CPU
|
|
83
|
+
to ensure that the user doesn't inadvertently use the result before it becomes
|
|
84
|
+
available. The default is ``"auto"``.
|
|
85
|
+
|
|
86
|
+
allocator: An object that supports the :class:`BaseCUDAMemoryManager` protocol, used
|
|
87
|
+
to draw device memory. If an allocator is not provided, a memory allocator from
|
|
88
|
+
the library package will be used (:func:`torch.cuda.caching_allocator_alloc` for
|
|
89
|
+
PyTorch operands, :func:`cupy.cuda.alloc` otherwise).
|
|
90
|
+
|
|
91
|
+
.. seealso::
|
|
92
|
+
:class:`Matmul`, :func:`matmul`
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
codegen: bool = False
|
|
96
|
+
compute_type: int | None = None
|
|
97
|
+
logger: Logger | None = None
|
|
98
|
+
memory_limit: int | str | None = r"80%"
|
|
99
|
+
blocking: Literal[True, "auto"] = "auto"
|
|
100
|
+
allocator: BaseCUDAMemoryManager | None = None
|
|
101
|
+
|
|
102
|
+
def __post_init__(self):
|
|
103
|
+
# Defer computing the memory limit till we know the device the operands are on.
|
|
104
|
+
|
|
105
|
+
if self.compute_type is not None:
|
|
106
|
+
self.compute_type = ComputeType(self.compute_type)
|
|
107
|
+
|
|
108
|
+
if self.memory_limit is None:
|
|
109
|
+
self.memory_limit = MatmulOptions.memory_limit
|
|
110
|
+
|
|
111
|
+
check_memory_str(self.memory_limit, "memory limit")
|
|
112
|
+
|
|
113
|
+
if self.blocking not in (True, "auto"):
|
|
114
|
+
raise ValueError("The value specified for blocking must be either True or 'auto'.")
|
|
115
|
+
|
|
116
|
+
if self.allocator is not None and not isinstance(self.allocator, BaseCUDAMemoryManager | BaseCUDAMemoryManagerAsync):
|
|
117
|
+
raise TypeError("The allocator must be an object of type that fulfills the BaseCUDAMemoryManager protocol.")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
matrix_qualifiers_dtype = _np.dtype([("is_transpose", "<i4"), ("is_conjugate", "<i4")])
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class ComputeType(IntEnum):
|
|
124
|
+
"""The subset of `cudaDataType_t` that is supported by the generic sparse APIs."""
|
|
125
|
+
|
|
126
|
+
CUDA_R_32F = CudaDataType.CUDA_R_32F
|
|
127
|
+
CUDA_C_32F = CudaDataType.CUDA_C_32F
|
|
128
|
+
CUDA_R_64F = CudaDataType.CUDA_R_64F
|
|
129
|
+
CUDA_C_64F = CudaDataType.CUDA_C_64F
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
__all__ = ["compile_prolog", "compile_epilog", "compile_add", "compile_atomic_add", "compile_mul"]
|
|
6
|
+
|
|
7
|
+
from nvmath.sparse.ust._jit import compile_python_function
|
|
8
|
+
|
|
9
|
+
VALID_DTYPES = "float32", "float64", "double", "complex64", "complex128"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def compile_prolog(prolog, *, operand_label, dtype, compute_capability=None):
|
|
13
|
+
"""
|
|
14
|
+
Compile a unary Python function with argument type ``dtype`` returning a value
|
|
15
|
+
of type ``dtype`` to device code.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
prolog: The unary Python function to compile to device code.
|
|
19
|
+
operand_label: The operand to which the prolog applies ("a", "b").
|
|
20
|
+
dtype: The dtype of the prolog's argument. Any scalar Numba type can be provided.
|
|
21
|
+
compute_capability: The target compute capability, specified as a string
|
|
22
|
+
(``'80'``, ``'89'``, ...). The default is the compute capability of the
|
|
23
|
+
current device.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
The compiled device code as a bytes object.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
valid_operand_labels = "a", "b", "c"
|
|
30
|
+
if operand_label not in valid_operand_labels:
|
|
31
|
+
raise ValueError(f"The operand label '{operand_label}' is invalid. It must one of {valid_operand_labels}.")
|
|
32
|
+
|
|
33
|
+
# TODO: any type supported by numba-cuda can be provided.
|
|
34
|
+
if dtype not in VALID_DTYPES:
|
|
35
|
+
raise ValueError(f"The dtype '{dtype}' is invalid. It must one of {VALID_DTYPES}.")
|
|
36
|
+
|
|
37
|
+
ltoir = compile_python_function(prolog, "prolog_" + operand_label, (dtype, dtype), compute_capability=compute_capability)
|
|
38
|
+
return ltoir
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def compile_epilog(epilog, *, dtype, compute_capability=None):
|
|
42
|
+
"""
|
|
43
|
+
Compile a unary Python function with argument type ``dtype`` returning a value
|
|
44
|
+
of type ``dtype`` to device code.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
epilog: The unary Python function to compile to device code.
|
|
48
|
+
dtype: The dtype of the epilog's argument. Any scalar Numba type can be provided.
|
|
49
|
+
compute_capability: The target compute capability, specified as a string
|
|
50
|
+
(``'80'``, ``'89'``, ...). The default is the compute capability of the
|
|
51
|
+
current device.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
The compiled device code as a bytes object.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
# TODO: any type supported by numba-cuda can be provided.
|
|
58
|
+
if dtype not in VALID_DTYPES:
|
|
59
|
+
raise ValueError(f"The dtype '{dtype}' is invalid. It must one of {VALID_DTYPES}.")
|
|
60
|
+
|
|
61
|
+
ltoir = compile_python_function(epilog, "epilog", (dtype, dtype), compute_capability=compute_capability)
|
|
62
|
+
return ltoir
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def compile_add(add, *, dtype, compute_capability=None):
|
|
66
|
+
"""
|
|
67
|
+
Compile a binary Python function with arguments of type ``dtype`` returning a value
|
|
68
|
+
of type ``dtype`` to device code. This function must satisfy the mathematical
|
|
69
|
+
requirements of a semiring addition operator.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
add: The binary Python function to compile to device code.
|
|
73
|
+
dtype: The dtype of the epilog's argument. Any scalar Numba type can be provided.
|
|
74
|
+
compute_capability: The target compute capability, specified as a string
|
|
75
|
+
(``'80'``, ``'89'``, ...). The default is the compute capability of the
|
|
76
|
+
current device.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
The compiled device code as a bytes object.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
# TODO: any type supported by numba-cuda can be provided.
|
|
83
|
+
if dtype not in VALID_DTYPES:
|
|
84
|
+
raise ValueError(f"The dtype '{dtype}' is invalid. It must one of {VALID_DTYPES}.")
|
|
85
|
+
|
|
86
|
+
ltoir = compile_python_function(add, "add", (dtype, dtype, dtype), compute_capability=compute_capability)
|
|
87
|
+
return ltoir
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def compile_atomic_add(add, *, dtype, compute_capability=None):
|
|
91
|
+
"""
|
|
92
|
+
Compile a binary Python function with arguments of type ``dtype`` returning a value
|
|
93
|
+
of type ``dtype`` to device code. This function must satisfy the mathematical
|
|
94
|
+
requirements of a semiring addition operator and must perform an **atomic** addition.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
add: The binary Python function to compile to device code.
|
|
98
|
+
dtype: The dtype of the epilog's argument. Any scalar Numba type can be provided.
|
|
99
|
+
compute_capability: The target compute capability, specified as a string
|
|
100
|
+
(``'80'``, ``'89'``, ...). The default is the compute capability of the
|
|
101
|
+
current device.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
The compiled device code as a bytes object.
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
# TODO: any type supported by numba-cuda can be provided.
|
|
108
|
+
if dtype not in VALID_DTYPES:
|
|
109
|
+
raise ValueError(f"The dtype '{dtype}' is invalid. It must one of {VALID_DTYPES}.")
|
|
110
|
+
|
|
111
|
+
ltoir = compile_python_function(add, "atomic_add", (dtype, f"{dtype}*", dtype), compute_capability=compute_capability)
|
|
112
|
+
return ltoir
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def compile_mul(add, *, dtype, compute_capability=None):
|
|
116
|
+
"""
|
|
117
|
+
Compile a binary Python function with arguments of type ``dtype`` returning a value
|
|
118
|
+
of type ``dtype`` to device code. This function must satisfy the mathematical
|
|
119
|
+
requirements of a semiring multiplication operator.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
add: The binary Python function to compile to device code.
|
|
123
|
+
dtype: The dtype of the epilog's argument. Any scalar Numba type can be provided.
|
|
124
|
+
compute_capability: The target compute capability, specified as a string
|
|
125
|
+
(``'80'``, ``'89'``, ...). The default is the compute capability of the
|
|
126
|
+
current device.
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
The compiled device code as a bytes object.
|
|
130
|
+
"""
|
|
131
|
+
|
|
132
|
+
# TODO: any type supported by numba-cuda can be provided.
|
|
133
|
+
if dtype not in VALID_DTYPES:
|
|
134
|
+
raise ValueError(f"The dtype '{dtype}' is invalid. It must one of {VALID_DTYPES}.")
|
|
135
|
+
|
|
136
|
+
ltoir = compile_python_function(add, "mul", (dtype, dtype, dtype), compute_capability=compute_capability)
|
|
137
|
+
return ltoir
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"default_prolog",
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def default_prolog(multiplier, *, is_conjugate):
|
|
11
|
+
if is_conjugate:
|
|
12
|
+
|
|
13
|
+
def prolog(a):
|
|
14
|
+
return multiplier * a.conjugate()
|
|
15
|
+
|
|
16
|
+
return prolog
|
|
17
|
+
|
|
18
|
+
def prolog(a):
|
|
19
|
+
return multiplier * a
|
|
20
|
+
|
|
21
|
+
return prolog
|