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
nvmath/memory.py
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""Interface for pluggable memory handlers."""
|
|
6
|
+
|
|
7
|
+
__all__ = ["BaseCUDAMemoryManager", "MemoryPointer"]
|
|
8
|
+
|
|
9
|
+
import weakref
|
|
10
|
+
from abc import abstractmethod
|
|
11
|
+
from collections.abc import Callable
|
|
12
|
+
from typing import Protocol, runtime_checkable
|
|
13
|
+
|
|
14
|
+
from cuda.core import Stream
|
|
15
|
+
|
|
16
|
+
from nvmath._internal.utils import LoggerLike
|
|
17
|
+
from nvmath.internal import utils
|
|
18
|
+
from nvmath.internal.memory import allocate_from_mr, get_device_memory_resource
|
|
19
|
+
from nvmath.internal.package_ifc_cuda import CUDAPackage
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MemoryPointer:
|
|
23
|
+
"""
|
|
24
|
+
An RAII class for a device memory buffer.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
device_ptr: The address of the device memory buffer.
|
|
28
|
+
size: The size of the memory buffer in bytes.
|
|
29
|
+
finalizer: A nullary callable that will be called when the buffer is to be freed.
|
|
30
|
+
|
|
31
|
+
.. seealso:: :class:`numba.cuda.MemoryPointer`
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(self, device_ptr: int, size: int, finalizer: None | Callable[[], None]):
|
|
35
|
+
self.device_ptr = device_ptr
|
|
36
|
+
self.size = size
|
|
37
|
+
self._finalizer: weakref.finalize | None
|
|
38
|
+
if finalizer is not None:
|
|
39
|
+
self._finalizer = weakref.finalize(self, finalizer)
|
|
40
|
+
else:
|
|
41
|
+
self._finalizer = None
|
|
42
|
+
|
|
43
|
+
def free(self):
|
|
44
|
+
"""
|
|
45
|
+
"Frees" the memory buffer by calling the finalizer.
|
|
46
|
+
"""
|
|
47
|
+
if self._finalizer is None:
|
|
48
|
+
return
|
|
49
|
+
|
|
50
|
+
if not self._finalizer.alive:
|
|
51
|
+
raise RuntimeError("The buffer has already been freed.")
|
|
52
|
+
self._finalizer()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class _UnmanagedMemoryPointer:
|
|
56
|
+
"""
|
|
57
|
+
An alternative to :class:`MemoryPointer` to wrap objects that already implements
|
|
58
|
+
its own RAII semantics.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
device_ptr: The address of the device memory buffer.
|
|
62
|
+
size: The size of the memory buffer in bytes.
|
|
63
|
+
owner: An object that owns the memory buffer and releases the allocation
|
|
64
|
+
on object deletion.
|
|
65
|
+
|
|
66
|
+
.. seealso:: :class:`MemoryPointer`
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
__slots__ = ("device_ptr", "size", "_owner")
|
|
70
|
+
|
|
71
|
+
def __init__(self, device_ptr: int, size: int, owner: object):
|
|
72
|
+
self.device_ptr = device_ptr
|
|
73
|
+
self.size = size
|
|
74
|
+
self._owner = owner
|
|
75
|
+
|
|
76
|
+
def free(self):
|
|
77
|
+
"""
|
|
78
|
+
"Frees" by removing the reference to the owner.
|
|
79
|
+
"""
|
|
80
|
+
self._owner = None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@runtime_checkable
|
|
84
|
+
class BaseCUDAMemoryManager(Protocol):
|
|
85
|
+
"""
|
|
86
|
+
Protocol for memory manager plugins.
|
|
87
|
+
|
|
88
|
+
.. seealso:: :class:`numba.cuda.BaseCUDAMemoryManager`
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
@abstractmethod
|
|
92
|
+
def __init__(self, device_id: int, logger: LoggerLike):
|
|
93
|
+
raise NotImplementedError
|
|
94
|
+
|
|
95
|
+
@abstractmethod
|
|
96
|
+
def memalloc(self, size: int) -> MemoryPointer:
|
|
97
|
+
"""
|
|
98
|
+
Allocate device memory synchronously or on the current stream.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
size: The size of the memory buffer in bytes.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
An object that owns the allocated memory and is responsible for releasing it (to
|
|
105
|
+
the OS or a pool). The object must have an attribute named ``device_ptr``,
|
|
106
|
+
``device_pointer``, or ``ptr`` specifying the pointer to the allocated memory
|
|
107
|
+
buffer. See :class:`MemoryPointer` for an example interface.
|
|
108
|
+
|
|
109
|
+
Note:
|
|
110
|
+
Objects of type :class:`numba.cuda.MemoryPointer` as well as
|
|
111
|
+
:class:`cupy.cuda.MemoryPointer` meet the requirements listed above for the
|
|
112
|
+
device memory pointer object.
|
|
113
|
+
"""
|
|
114
|
+
raise NotImplementedError
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@runtime_checkable
|
|
118
|
+
class BaseCUDAMemoryManagerAsync(Protocol):
|
|
119
|
+
"""
|
|
120
|
+
Protocol for async memory manager plugins.
|
|
121
|
+
|
|
122
|
+
.. seealso:: :class:`BaseCUDAMemoryManager`
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
@abstractmethod
|
|
126
|
+
def __init__(self, device_id: int, logger: LoggerLike):
|
|
127
|
+
raise NotImplementedError
|
|
128
|
+
|
|
129
|
+
@abstractmethod
|
|
130
|
+
def memalloc_async(self, size: int, stream: Stream) -> MemoryPointer:
|
|
131
|
+
"""
|
|
132
|
+
Allocate device memory asynchronously on the provided stream.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
size: The size of the memory buffer in bytes.
|
|
136
|
+
stream: A cuda.core.Stream object on which the allocation will be performed.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
An object that owns the allocated memory and is responsible for releasing it (to
|
|
140
|
+
the OS or a pool). The object must have an attribute named ``device_ptr``,
|
|
141
|
+
``device_pointer``, or ``ptr`` specifying the pointer to the allocated memory
|
|
142
|
+
buffer. See :class:`MemoryPointer` for an example interface.
|
|
143
|
+
|
|
144
|
+
Note:
|
|
145
|
+
Objects of type :class:`numba.cuda.MemoryPointer` as well as
|
|
146
|
+
:class:`cupy.cuda.MemoryPointer` meet the requirements listed above for the
|
|
147
|
+
device memory pointer object.
|
|
148
|
+
"""
|
|
149
|
+
raise NotImplementedError
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class _RawCUDAMemoryManager(BaseCUDAMemoryManagerAsync):
|
|
153
|
+
"""
|
|
154
|
+
Raw device memory allocator.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
device_id: The ID (int) of the device on which memory is to be allocated.
|
|
158
|
+
logger (logging.Logger): Python Logger object.
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
def __init__(self, device_id: int, logger: LoggerLike):
|
|
162
|
+
"""
|
|
163
|
+
__init__(device_id)
|
|
164
|
+
"""
|
|
165
|
+
self.device_id = device_id
|
|
166
|
+
self.logger = logger
|
|
167
|
+
self._pool = get_device_memory_resource(device_id)
|
|
168
|
+
|
|
169
|
+
def memalloc_async(self, size: int, stream: Stream) -> MemoryPointer:
|
|
170
|
+
buffer = allocate_from_mr(self._pool, size, stream, self.device_id, self.logger)
|
|
171
|
+
device_ptr = int(buffer.handle)
|
|
172
|
+
|
|
173
|
+
return _UnmanagedMemoryPointer(device_ptr, size, buffer) # type: ignore[return-value]
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
_MEMORY_MANAGER: dict[str, type[BaseCUDAMemoryManager] | type[BaseCUDAMemoryManagerAsync]] = {
|
|
177
|
+
"_raw": _RawCUDAMemoryManager,
|
|
178
|
+
"cuda": _RawCUDAMemoryManager,
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def lazy_load_cupy():
|
|
183
|
+
global _MEMORY_MANAGER
|
|
184
|
+
import cupy as cp
|
|
185
|
+
|
|
186
|
+
from nvmath.internal.package_ifc_cupy import CupyPackage
|
|
187
|
+
|
|
188
|
+
class _CupyCUDAMemoryManager(BaseCUDAMemoryManagerAsync):
|
|
189
|
+
"""
|
|
190
|
+
CuPy device memory allocator.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
device_id: The ID (int) of the device on which memory is to be allocated.
|
|
194
|
+
logger (logging.Logger): Python Logger object.
|
|
195
|
+
"""
|
|
196
|
+
|
|
197
|
+
def __init__(self, device_id: int, logger: LoggerLike):
|
|
198
|
+
"""
|
|
199
|
+
__init__(device_id)
|
|
200
|
+
"""
|
|
201
|
+
self.device_id = device_id
|
|
202
|
+
self.logger = logger
|
|
203
|
+
|
|
204
|
+
def memalloc_async(self, size: int, stream: Stream) -> MemoryPointer:
|
|
205
|
+
stream_ptr = CUDAPackage.to_stream_pointer(stream)
|
|
206
|
+
external = CupyPackage.create_external_stream(self.device_id, stream_ptr)
|
|
207
|
+
stream_ctx = CupyPackage.to_stream_context(external)
|
|
208
|
+
with utils.device_ctx(self.device_id), stream_ctx:
|
|
209
|
+
cp_mem_ptr = cp.cuda.alloc(size)
|
|
210
|
+
device_ptr = cp_mem_ptr.ptr
|
|
211
|
+
|
|
212
|
+
self.logger.debug(
|
|
213
|
+
"_CupyCUDAMemoryManager (allocate memory): size = %d, ptr = %d, device_id = %d, stream = %s",
|
|
214
|
+
size,
|
|
215
|
+
device_ptr,
|
|
216
|
+
self.device_id,
|
|
217
|
+
stream,
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
def finalizer():
|
|
221
|
+
# The cupy MemoryPointer object is RAII, so we keep a reference to it
|
|
222
|
+
# until we don't need it anymore.
|
|
223
|
+
nonlocal cp_mem_ptr, device_ptr
|
|
224
|
+
self.logger.debug("_CupyCUDAMemoryManager (release memory): ptr = %d", device_ptr)
|
|
225
|
+
del cp_mem_ptr
|
|
226
|
+
|
|
227
|
+
return MemoryPointer(device_ptr, size, finalizer=finalizer)
|
|
228
|
+
|
|
229
|
+
_MEMORY_MANAGER["cupy"] = _CupyCUDAMemoryManager
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def lazy_load_torch():
|
|
233
|
+
global _MEMORY_MANAGER
|
|
234
|
+
|
|
235
|
+
from torch.cuda import caching_allocator_alloc, caching_allocator_delete
|
|
236
|
+
|
|
237
|
+
from nvmath.internal.package_ifc_torch import TorchPackage
|
|
238
|
+
|
|
239
|
+
class _TorchCUDAMemoryManager(BaseCUDAMemoryManagerAsync):
|
|
240
|
+
"""
|
|
241
|
+
Torch caching memory allocator.
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
device_id: The ID (int) of the device on which memory is to be allocated.
|
|
245
|
+
logger (logging.Logger): Python Logger object.
|
|
246
|
+
"""
|
|
247
|
+
|
|
248
|
+
def __init__(self, device_id: int, logger: LoggerLike):
|
|
249
|
+
"""
|
|
250
|
+
__init__(device_id)
|
|
251
|
+
"""
|
|
252
|
+
self.device_id = device_id
|
|
253
|
+
self.logger = logger
|
|
254
|
+
|
|
255
|
+
def memalloc_async(self, size: int, stream: Stream) -> MemoryPointer:
|
|
256
|
+
torch_stream = TorchPackage.create_external_stream(self.device_id, CUDAPackage.to_stream_pointer(stream))
|
|
257
|
+
device_ptr = caching_allocator_alloc(size, device=self.device_id, stream=torch_stream)
|
|
258
|
+
|
|
259
|
+
self.logger.debug(
|
|
260
|
+
"_TorchCUDAMemoryManager (allocate memory): size = %d, ptr = %d, device_id = %d, stream = %s",
|
|
261
|
+
size,
|
|
262
|
+
device_ptr,
|
|
263
|
+
self.device_id,
|
|
264
|
+
stream,
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
def finalizer():
|
|
268
|
+
nonlocal device_ptr, stream
|
|
269
|
+
self.logger.debug(
|
|
270
|
+
"_TorchCUDAMemoryManager (release memory): ptr = %d, device_id = %d, stream = %s",
|
|
271
|
+
device_ptr,
|
|
272
|
+
self.device_id,
|
|
273
|
+
stream,
|
|
274
|
+
)
|
|
275
|
+
caching_allocator_delete(device_ptr)
|
|
276
|
+
|
|
277
|
+
return MemoryPointer(device_ptr, size, finalizer=finalizer)
|
|
278
|
+
|
|
279
|
+
_MEMORY_MANAGER["torch"] = _TorchCUDAMemoryManager
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from . import advanced, ust # noqa: E402
|
|
6
|
+
from .generic import ComputeType, ExecutionCUDA, Matmul, MatmulOptions, matmul
|
|
7
|
+
from .generic import (
|
|
8
|
+
compile_add as compile_matmul_add,
|
|
9
|
+
)
|
|
10
|
+
from .generic import (
|
|
11
|
+
compile_atomic_add as compile_matmul_atomic_add,
|
|
12
|
+
)
|
|
13
|
+
from .generic import (
|
|
14
|
+
compile_epilog as compile_matmul_epilog,
|
|
15
|
+
)
|
|
16
|
+
from .generic import (
|
|
17
|
+
compile_mul as compile_matmul_mul,
|
|
18
|
+
)
|
|
19
|
+
from .generic import (
|
|
20
|
+
compile_prolog as compile_matmul_prolog,
|
|
21
|
+
)
|
|
22
|
+
from .generic import matrix_qualifiers_dtype as matmul_matrix_qualifiers_dtype
|
|
23
|
+
|
|
24
|
+
__all__ = [
|
|
25
|
+
"advanced",
|
|
26
|
+
"ust",
|
|
27
|
+
"ExecutionCUDA",
|
|
28
|
+
"MatmulOptions",
|
|
29
|
+
"matmul_matrix_qualifiers_dtype",
|
|
30
|
+
"compile_matmul_prolog",
|
|
31
|
+
"compile_matmul_epilog",
|
|
32
|
+
"compile_matmul_add",
|
|
33
|
+
"compile_matmul_atomic_add",
|
|
34
|
+
"compile_matmul_mul",
|
|
35
|
+
"Matmul",
|
|
36
|
+
"matmul",
|
|
37
|
+
"ComputeType",
|
|
38
|
+
]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from . import common_utils as common_utils
|
|
6
|
+
from . import cudss_config_ifc as cudss_config_ifc
|
|
7
|
+
from . import cudss_data_ifc as cudss_data_ifc
|
|
8
|
+
from . import cudss_utils as cudss_utils
|
|
9
|
+
from . import sparse_csr_ifc as sparse_csr_ifc
|
|
10
|
+
from . import sparse_format_helpers as sparse_format_helpers
|
|
11
|
+
from . import sparse_tensor_ifc as sparse_tensor_ifc
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"common_utils",
|
|
15
|
+
"cudss_config_ifc",
|
|
16
|
+
"cudss_data_ifc",
|
|
17
|
+
"cudss_utils",
|
|
18
|
+
"sparse_csr_ifc",
|
|
19
|
+
"sparse_format_helpers",
|
|
20
|
+
"sparse_tensor_ifc",
|
|
21
|
+
]
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
A collection of sparse utilities.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import importlib
|
|
10
|
+
from collections.abc import Sequence
|
|
11
|
+
|
|
12
|
+
from nvmath.internal.ndbuffer import NDBuffer
|
|
13
|
+
from nvmath.internal.utils import infer_object_package
|
|
14
|
+
from nvmath.sparse._internal.sparse_format_helpers import PACKAGE_HELPER_MAP
|
|
15
|
+
|
|
16
|
+
RECOGNIZED_NAMED_FORMATS = {"BSR", "BSC", "CSR", "CSC", "COO", "DIA"}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def check_supported_package(native_operands):
|
|
20
|
+
"""
|
|
21
|
+
Check if the operands belong to one of the supported packages.
|
|
22
|
+
"""
|
|
23
|
+
package = {infer_object_package(o) for o in native_operands}
|
|
24
|
+
if len(package) != 1:
|
|
25
|
+
raise ValueError(f"The sparse operands do not belong to the same package: {package}.")
|
|
26
|
+
|
|
27
|
+
package = package.pop()
|
|
28
|
+
if package not in PACKAGE_HELPER_MAP:
|
|
29
|
+
raise TypeError(f"The sparse operand package {package} is not supported.")
|
|
30
|
+
|
|
31
|
+
return package
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def wrap_sparse_operand(native_operand):
|
|
35
|
+
"""
|
|
36
|
+
Wrap one "native" sparse operand so that package-agnostic API can be used.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
package = infer_object_package(native_operand)
|
|
40
|
+
helper = PACKAGE_HELPER_MAP[package]
|
|
41
|
+
sparse_format = helper.sparse_format_name(native_operand)
|
|
42
|
+
|
|
43
|
+
# The sparse format should be a recognized named format or an UST.
|
|
44
|
+
if sparse_format not in RECOGNIZED_NAMED_FORMATS:
|
|
45
|
+
if package == "nvmath":
|
|
46
|
+
from nvmath.sparse._internal.sparse_ust_ifc import USTensorHolder
|
|
47
|
+
|
|
48
|
+
return USTensorHolder(native_operand)
|
|
49
|
+
|
|
50
|
+
raise TypeError(f"The sparse format {sparse_format} is not currently supported.")
|
|
51
|
+
|
|
52
|
+
# Recognized named format.
|
|
53
|
+
attr_name_map = getattr(helper, f"{sparse_format.lower()}_attribute_names")()
|
|
54
|
+
|
|
55
|
+
module_name = f"nvmath.sparse._internal.sparse_{sparse_format.lower()}_ifc"
|
|
56
|
+
module = importlib.import_module(module_name)
|
|
57
|
+
SparseHolder = getattr(module, f"{sparse_format}TensorHolder")
|
|
58
|
+
|
|
59
|
+
return SparseHolder.create_from_tensor(native_operand, attr_name_map=attr_name_map)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def wrap_sparse_operands(native_operands):
|
|
63
|
+
"""
|
|
64
|
+
Wrap each "native" sparse operand so that package-agnostic API can be used.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
if not isinstance(native_operands, Sequence):
|
|
68
|
+
return wrap_sparse_operand(native_operands)
|
|
69
|
+
|
|
70
|
+
package = check_supported_package(native_operands)
|
|
71
|
+
helper = PACKAGE_HELPER_MAP[package]
|
|
72
|
+
|
|
73
|
+
sparse_format = {helper.sparse_format_name(o) for o in native_operands}
|
|
74
|
+
if len(sparse_format) != 1:
|
|
75
|
+
raise ValueError(f"The sparse operands do not have the same sparse format: {sparse_format}")
|
|
76
|
+
sparse_format = sparse_format.pop()
|
|
77
|
+
|
|
78
|
+
# The sparse format should be a recognized named format or an UST.
|
|
79
|
+
if sparse_format not in RECOGNIZED_NAMED_FORMATS:
|
|
80
|
+
if package == "nvmath":
|
|
81
|
+
from nvmath.sparse._internal.sparse_ust_ifc import USTensorHolder
|
|
82
|
+
|
|
83
|
+
return [USTensorHolder(o) for o in native_operands]
|
|
84
|
+
|
|
85
|
+
raise TypeError(f"The sparse format {sparse_format} is not currently supported.")
|
|
86
|
+
|
|
87
|
+
attr_name_map = getattr(helper, f"{sparse_format.lower()}_attribute_names")()
|
|
88
|
+
|
|
89
|
+
module_name = f"nvmath.sparse._internal.sparse_{sparse_format.lower()}_ifc"
|
|
90
|
+
module = importlib.import_module(module_name)
|
|
91
|
+
SparseHolder = getattr(module, f"{sparse_format}TensorHolder")
|
|
92
|
+
|
|
93
|
+
return [SparseHolder.create_from_tensor(o, attr_name_map=attr_name_map) for o in native_operands]
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# TODO: Unify all the get_attribute functions in internal.utils
|
|
97
|
+
# as get(operands, attribute, attribute_desc).
|
|
98
|
+
def get_operands_index_type(operands):
|
|
99
|
+
"""
|
|
100
|
+
Return the index type name of the tensors.
|
|
101
|
+
"""
|
|
102
|
+
index_type = operands[0].index_type
|
|
103
|
+
if not all(operand.index_type == index_type for operand in operands):
|
|
104
|
+
index_types = {operand.index_type for operand in operands}
|
|
105
|
+
raise ValueError(f"All operands must have the same index type. The index types found = {index_types}.")
|
|
106
|
+
return index_type
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def sparse_or_dense(operand):
|
|
110
|
+
"""
|
|
111
|
+
Determine if the operand is sparse or dense.
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
dense_tensor_modules = {"cupy", "numpy", "torch"}
|
|
115
|
+
sparse_tensor_modules = set(PACKAGE_HELPER_MAP.keys())
|
|
116
|
+
|
|
117
|
+
module = infer_object_package(operand)
|
|
118
|
+
|
|
119
|
+
if module == "torch":
|
|
120
|
+
import torch
|
|
121
|
+
|
|
122
|
+
if not torch.is_tensor(operand):
|
|
123
|
+
raise TypeError(f"The operand '{operand}' is not a tensor object.")
|
|
124
|
+
|
|
125
|
+
if operand.layout == torch.strided:
|
|
126
|
+
return "dense"
|
|
127
|
+
|
|
128
|
+
return "sparse"
|
|
129
|
+
|
|
130
|
+
# TODO: use the level spec instead of format name to infer if dense.
|
|
131
|
+
if module == "nvmath":
|
|
132
|
+
if type(operand) is NDBuffer:
|
|
133
|
+
return "dense"
|
|
134
|
+
name = operand.tensor_format.name
|
|
135
|
+
if name == "Scalar" or "Dense" in name:
|
|
136
|
+
return "dense"
|
|
137
|
+
return "sparse"
|
|
138
|
+
|
|
139
|
+
# We'll check if the object is a tensor later, we'll assume here that it is
|
|
140
|
+
# solely based on the package.
|
|
141
|
+
if module in sparse_tensor_modules:
|
|
142
|
+
return "sparse"
|
|
143
|
+
|
|
144
|
+
if module in dense_tensor_modules:
|
|
145
|
+
return "dense"
|
|
146
|
+
|
|
147
|
+
raise TypeError(f"The package '{module}' is not supported.")
|