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,142 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Factories for create options dataclasses, as well as utilities to add docstring to enum
|
|
7
|
+
classes.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import dataclasses
|
|
11
|
+
import re
|
|
12
|
+
from collections.abc import Callable
|
|
13
|
+
from enum import IntEnum
|
|
14
|
+
from typing import Any, ClassVar
|
|
15
|
+
|
|
16
|
+
import numpy
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def create_options_class_from_enum(
|
|
20
|
+
options_class_name: str,
|
|
21
|
+
enum_class: IntEnum,
|
|
22
|
+
get_attr_dtype: Callable,
|
|
23
|
+
description: str,
|
|
24
|
+
filter_re: str = r"(?P<option_name>.*)",
|
|
25
|
+
):
|
|
26
|
+
"""
|
|
27
|
+
Create an options dataclass from a Python enum class. Names can be filtered if desired.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
options_class_name: Name of the dataclass that will be created.
|
|
31
|
+
|
|
32
|
+
enum_class: The IntEnum class that contains the options for the dataclass.
|
|
33
|
+
|
|
34
|
+
get_attr_dtype: A callable that takes in an enum value as the argument and returns
|
|
35
|
+
the size in bytes of the cuTensorNet.
|
|
36
|
+
|
|
37
|
+
filter_re: A re definition that defines the match named 'option_name'.
|
|
38
|
+
"""
|
|
39
|
+
if r"(?P<option_name>" not in filter_re:
|
|
40
|
+
message = """Incorrect re.
|
|
41
|
+
The re for the filter must contain the named group 'option_name'."""
|
|
42
|
+
raise ValueError(message)
|
|
43
|
+
|
|
44
|
+
# Helper vars for creating attribute docstring.
|
|
45
|
+
doc = f"""A data class for capturing the {description} options.
|
|
46
|
+
|
|
47
|
+
Attributes:
|
|
48
|
+
"""
|
|
49
|
+
indent = " " * 8
|
|
50
|
+
prefix = determine_enum_prefix(enum_class, "_ATTRIBUTE")
|
|
51
|
+
|
|
52
|
+
filter_pattern = re.compile(filter_re)
|
|
53
|
+
option_to_enum: dict[str, IntEnum] = {}
|
|
54
|
+
option_to_dtype: dict[str, Any] = {}
|
|
55
|
+
# mypy claims that IntEnum is not iterable
|
|
56
|
+
for e in enum_class: # type: ignore
|
|
57
|
+
m = filter_pattern.match(e.name)
|
|
58
|
+
if not m:
|
|
59
|
+
continue
|
|
60
|
+
option_name = m.group("option_name").lower()
|
|
61
|
+
option_to_enum[option_name] = e
|
|
62
|
+
option_to_dtype[option_name] = get_attr_dtype(e)
|
|
63
|
+
|
|
64
|
+
# Add docstring for this attribute.
|
|
65
|
+
doc += indent + option_name + ":" + f" See `{prefix + '_' + m.group(0)}`.\n"
|
|
66
|
+
|
|
67
|
+
field: tuple[str, Any, None | dict]
|
|
68
|
+
fields: list[tuple[str, Any, None | dict]] = []
|
|
69
|
+
for option_name, dtype in option_to_dtype.items():
|
|
70
|
+
if numpy.issubdtype(dtype, numpy.integer):
|
|
71
|
+
field = option_name, int | None, dataclasses.field(default=None)
|
|
72
|
+
else:
|
|
73
|
+
field = option_name, Any | None, dataclasses.field(default=None)
|
|
74
|
+
fields.append(field)
|
|
75
|
+
|
|
76
|
+
# Add class attributes.
|
|
77
|
+
|
|
78
|
+
field = "option_to_enum", ClassVar[dict], dataclasses.field(default=option_to_enum)
|
|
79
|
+
fields.append(field)
|
|
80
|
+
|
|
81
|
+
field = "option_to_dtype", ClassVar[dict], dataclasses.field(default=option_to_dtype)
|
|
82
|
+
fields.append(field)
|
|
83
|
+
|
|
84
|
+
# Create the options class.
|
|
85
|
+
options_class = dataclasses.make_dataclass(options_class_name, fields, slots=True)
|
|
86
|
+
options_class.__doc__ = doc
|
|
87
|
+
|
|
88
|
+
return options_class
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def snake_to_camel(names):
|
|
92
|
+
name = ""
|
|
93
|
+
for i, sub_name in enumerate(names):
|
|
94
|
+
if i == 0:
|
|
95
|
+
name += sub_name.lower()
|
|
96
|
+
else:
|
|
97
|
+
name += sub_name[0].upper() + sub_name[1:]
|
|
98
|
+
name += "_t"
|
|
99
|
+
return name
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def camel_to_snake(name, upper=True):
|
|
103
|
+
"""
|
|
104
|
+
Convert string from camel case to snake style.
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
def transformer(m):
|
|
108
|
+
prefix = iter(("", "_", ""))
|
|
109
|
+
for i in 1, 3, 5:
|
|
110
|
+
first, second = i, i + 1
|
|
111
|
+
s = next(prefix)
|
|
112
|
+
if m.group(second):
|
|
113
|
+
if m.group(first): # If the second group doesn't exist, the first won't either by the design of the RE.
|
|
114
|
+
s += m.group(first).lower() + "_"
|
|
115
|
+
s += m.group(second).lower()
|
|
116
|
+
break
|
|
117
|
+
return s
|
|
118
|
+
|
|
119
|
+
name = re.sub(r"^([A-Z]*)([A-Z])|(?<!_)([A-Z]*)([A-Z])|([A-Z]*)([A-Z])", transformer, name)
|
|
120
|
+
if upper:
|
|
121
|
+
name = name.upper()
|
|
122
|
+
return name
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def determine_enum_prefix(enum_class, chomp):
|
|
126
|
+
"""
|
|
127
|
+
This function assumes that the convention used to translate C enumerators to Python enum
|
|
128
|
+
names holds.
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
prefix = enum_class.__module__.split(".")[-1].upper()
|
|
132
|
+
prefix += "_" + camel_to_snake(enum_class.__name__)
|
|
133
|
+
prefix = re.sub(chomp, "", prefix)
|
|
134
|
+
return prefix
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def add_enum_class_doc(enum_class, chomp):
|
|
138
|
+
"""
|
|
139
|
+
Add docstring to enum classes.
|
|
140
|
+
"""
|
|
141
|
+
for e in enum_class:
|
|
142
|
+
e.__doc__ = f"See `{determine_enum_prefix(enum_class, chomp) + '_' + e.name.upper()}`."
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Formatters for printing data.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class MemoryStr:
|
|
13
|
+
"""
|
|
14
|
+
A simple type to pretty-print memory-like values.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, memory, base_unit="B"):
|
|
18
|
+
self.memory = memory
|
|
19
|
+
self.base_unit = base_unit
|
|
20
|
+
self.base = 1024
|
|
21
|
+
|
|
22
|
+
def __str__(self):
|
|
23
|
+
"""
|
|
24
|
+
Convert large values to powers of 1024 for readability.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
base, base_unit, memory = self.base, self.base_unit, self.memory
|
|
28
|
+
|
|
29
|
+
if memory < base:
|
|
30
|
+
value, unit = memory, base_unit
|
|
31
|
+
elif memory < base**2:
|
|
32
|
+
value, unit = memory / base, f"Ki{base_unit}"
|
|
33
|
+
elif memory < base**3:
|
|
34
|
+
value, unit = memory / base**2, f"Mi{base_unit}"
|
|
35
|
+
else:
|
|
36
|
+
value, unit = memory / base**3, f"Gi{base_unit}"
|
|
37
|
+
|
|
38
|
+
return f"{value:0.2f} {unit}"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class FLOPSStr:
|
|
42
|
+
"""
|
|
43
|
+
A simple type to pretty-print FLOP count and FLOP/s-like values.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, flops, base_unit):
|
|
47
|
+
self.flops = flops
|
|
48
|
+
self.base_unit = base_unit
|
|
49
|
+
self.base = 1000
|
|
50
|
+
|
|
51
|
+
def __str__(self):
|
|
52
|
+
"""
|
|
53
|
+
Convert large values to powers of 1000 for readability.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
base, base_unit, flops = self.base, self.base_unit, self.flops
|
|
57
|
+
|
|
58
|
+
if flops < base:
|
|
59
|
+
value, unit = flops, base_unit
|
|
60
|
+
elif flops < base**2:
|
|
61
|
+
value, unit = flops / base, f"K{base_unit}"
|
|
62
|
+
elif flops < base**3:
|
|
63
|
+
value, unit = flops / base**2, f"M{base_unit}"
|
|
64
|
+
elif flops < base**4:
|
|
65
|
+
value, unit = flops / base**3, f"G{base_unit}"
|
|
66
|
+
elif flops < base**5:
|
|
67
|
+
value, unit = flops / base**4, f"T{base_unit}"
|
|
68
|
+
else:
|
|
69
|
+
value, unit = flops / base**5, f"P{base_unit}"
|
|
70
|
+
|
|
71
|
+
return f"{value:0.3f} {unit}"
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def array2string(array_like):
|
|
75
|
+
"""
|
|
76
|
+
String representation of an array-like object with possible truncation of "interior"
|
|
77
|
+
values to limit string size.
|
|
78
|
+
|
|
79
|
+
The NumPy function "set_printoptions" can be used to control the display of the array.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
return np.array2string(
|
|
83
|
+
np.asanyarray(array_like, dtype=object),
|
|
84
|
+
separator=", ",
|
|
85
|
+
# NumPy hates empty strings so we print 'None' instead.
|
|
86
|
+
formatter={"object": lambda s: s if s != "" else "None"},
|
|
87
|
+
)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Memory specification regular expression.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
__all__ = ["MEM_LIMIT_RE_PCT", "MEM_LIMIT_RE_VAL", "MEM_LIMIT_DOC", "check_memory_str"]
|
|
10
|
+
|
|
11
|
+
import re
|
|
12
|
+
|
|
13
|
+
MEM_LIMIT_RE_PCT = re.compile(r"(?P<value>[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)\s*%\s*$")
|
|
14
|
+
MEM_LIMIT_RE_VAL = re.compile(
|
|
15
|
+
r"(?P<value>[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)\s*(?P<units>[kmg])?(?P<binary>(?<=[kmg])i)?b\s*$",
|
|
16
|
+
re.IGNORECASE,
|
|
17
|
+
)
|
|
18
|
+
MEM_LIMIT_DOC = """The {kind} must be specified in one of the following forms:
|
|
19
|
+
(1) A number (int or float). If the number is a float between 0 and 1 inclusive, the
|
|
20
|
+
{kind} is interpreted as a fraction of the total device memory; otherwise it is
|
|
21
|
+
interpreted as the number of bytes of memory, with float value being cast to int.
|
|
22
|
+
Examples: 0.75, 50E6, 50000000, ...
|
|
23
|
+
(2) A string containing a positive value followed by B, kB, MB, or GB for powers of 1000.
|
|
24
|
+
Examples: "0.05 GB", "50 MB", "50000000 B" ...
|
|
25
|
+
(3) A string containing a positive value followed by kiB, MiB, or GiB for powers of 1024.
|
|
26
|
+
Examples: "0.05 GiB", "51.2 MiB", "53687091 B" ...
|
|
27
|
+
(4) A string with value in the range [0, 100] followed by a % symbol.
|
|
28
|
+
Examples: "26%","82%", ...
|
|
29
|
+
|
|
30
|
+
Whitespace between values and units is optional.
|
|
31
|
+
|
|
32
|
+
The provided {kind} is "{value}".
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def check_memory_str(value, kind):
|
|
37
|
+
"""
|
|
38
|
+
Check if the memory specification string is valid.
|
|
39
|
+
|
|
40
|
+
value = the memory specification string.
|
|
41
|
+
kind = a string denoting the type of memory being checked, used in error messages.
|
|
42
|
+
"""
|
|
43
|
+
if not isinstance(value, int | float):
|
|
44
|
+
m1 = MEM_LIMIT_RE_PCT.match(value)
|
|
45
|
+
if m1:
|
|
46
|
+
factor = float(m1.group("value"))
|
|
47
|
+
if factor < 0 or factor > 100:
|
|
48
|
+
raise ValueError(f"The {kind} percentage must be in the range [0, 100].")
|
|
49
|
+
m2 = MEM_LIMIT_RE_VAL.match(value)
|
|
50
|
+
if not (m1 or m2):
|
|
51
|
+
raise ValueError(MEM_LIMIT_DOC.format(kind=kind, value=value))
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
cimport cython
|
|
6
|
+
from libc.stdint cimport int64_t, intptr_t, uint64_t
|
|
7
|
+
|
|
8
|
+
cpdef get_device_memory_resource(int device_id)
|
|
9
|
+
cpdef get_pinned_async_memory_resource(int device_id)
|
|
10
|
+
cpdef get_legacy_pinned_memory_resource(int device_id)
|
|
11
|
+
cpdef allocate_from_mr(mr, int64_t size, stream, int device_id, logger=*)
|
|
12
|
+
cpdef free_reserved_memory(bint sync=*)
|
|
13
|
+
cdef get_default_stream(int device_id)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
import _cython_3_2_5
|
|
6
|
+
from typing import Any, ClassVar
|
|
7
|
+
|
|
8
|
+
__pyx_capi__: dict
|
|
9
|
+
__test__: dict
|
|
10
|
+
allocate_from_mr: _cython_3_2_5.cython_function_or_method
|
|
11
|
+
free_reserved_memory: _cython_3_2_5.cython_function_or_method
|
|
12
|
+
get_device_memory_resource: _cython_3_2_5.cython_function_or_method
|
|
13
|
+
get_legacy_pinned_memory_resource: _cython_3_2_5.cython_function_or_method
|
|
14
|
+
get_pinned_async_memory_resource: _cython_3_2_5.cython_function_or_method
|
|
15
|
+
|
|
16
|
+
class _MemoryPointer:
|
|
17
|
+
"""
|
|
18
|
+
Temporary internal NDBuffer allocation adapter class. NDBuffer expects
|
|
19
|
+
custom allocator to return a cuda.core.Buffer instance. Until all supported
|
|
20
|
+
cuda.core versions have unified support for wrapping external allocations
|
|
21
|
+
with Buffer.from_handle, this class servers as an adapter/workaround.
|
|
22
|
+
|
|
23
|
+
WARNING: This is internal tool subject to change/removal without notice.
|
|
24
|
+
|
|
25
|
+
Internally, it is used conditionally if any of the following is needed:
|
|
26
|
+
* wrap external allocations that don't come as cuda.core.Buffer (e.g. from cupy).
|
|
27
|
+
This is needed because prior to cuda.core 0.5.0, it's not possible to
|
|
28
|
+
pass reference to externall RAII object as ``owner`` parameter to Buffer.from_handle.
|
|
29
|
+
* provide debug logging on deallocation. In the future, we can use
|
|
30
|
+
Buffer.from_handle(owner=...) to inject deallocation callback (cuda.core >= 0.5.0)
|
|
31
|
+
or weakref.finalize for Buffer (cuda.core >= 0.6.0).
|
|
32
|
+
|
|
33
|
+
The only publicly exposed field is the handle - a base pointer to the allocated memory.
|
|
34
|
+
"""
|
|
35
|
+
from_handle: ClassVar[method] = ...
|
|
36
|
+
__pyx_vtable__: ClassVar[PyCapsule] = ...
|
|
37
|
+
handle: handle
|
|
38
|
+
owner: owner
|
|
39
|
+
@classmethod
|
|
40
|
+
def __init__(cls, *args, **kwargs) -> None:
|
|
41
|
+
"""Create and return a new object. See help(type) for accurate signature."""
|
|
42
|
+
def close(self, stream) -> Any:
|
|
43
|
+
"""_MemoryPointer.close(self, stream)"""
|
|
44
|
+
def __del__(self, *args, **kwargs) -> None: ...
|
|
45
|
+
def __reduce__(self):
|
|
46
|
+
"""_MemoryPointer.__reduce_cython__(self)"""
|
|
47
|
+
def __reduce_cython__(self) -> Any:
|
|
48
|
+
"""_MemoryPointer.__reduce_cython__(self)"""
|
|
49
|
+
def __setstate_cython__(self, __pyx_state) -> Any:
|
|
50
|
+
"""_MemoryPointer.__setstate_cython__(self, __pyx_state)"""
|
|
Binary file
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
cimport cython
|
|
6
|
+
from libc.stdint cimport intptr_t
|
|
7
|
+
from .._layout._layout cimport StridedLayout
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
cdef int launch_copy_kernel(StridedLayout dst, StridedLayout src, intptr_t dst_ptr, intptr_t src_ptr, int device_id, intptr_t stream_ptr, object logger) except -1
|
|
Binary file
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from libc.stdint cimport intptr_t
|
|
6
|
+
|
|
7
|
+
cdef intptr_t get_kernel(str kernel_code, str kernel_name, int device_id, include_path, object logger=*) except? 0
|
|
Binary file
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
cimport cython
|
|
6
|
+
from libc.stdint cimport intptr_t
|
|
7
|
+
from .._layout._layout cimport StridedLayout
|
|
8
|
+
|
|
9
|
+
# cdef class Exporting
|
|
10
|
+
|
|
11
|
+
@cython.final
|
|
12
|
+
cdef class NDBuffer:
|
|
13
|
+
cdef readonly StridedLayout layout
|
|
14
|
+
cdef readonly object data
|
|
15
|
+
cdef int data_device_id
|
|
16
|
+
cdef readonly intptr_t data_ptr
|
|
17
|
+
cdef readonly str dtype_name
|
|
18
|
+
|
|
19
|
+
cdef readonly NDBuffer base
|
|
20
|
+
|
|
21
|
+
# We use numpy_view internally to dispatch host memory
|
|
22
|
+
# operations to numpy (e.g. h2h copy).
|
|
23
|
+
# If the dtype_name is not supported by numpy, we still
|
|
24
|
+
# create a numpy view for internal use with any dtype
|
|
25
|
+
# of the corresponding itemsize, but such a view
|
|
26
|
+
# should not be returned to the user
|
|
27
|
+
cdef object numpy_view
|
|
28
|
+
cdef bint has_supported_dtype
|
|
29
|
+
|
|
30
|
+
# lazy evaluated properties
|
|
31
|
+
cdef str prop_device # "cpu" or "cuda"
|
|
32
|
+
cdef object prop_device_id # "cpu" or int
|
|
33
|
+
|
|
34
|
+
cdef inline int init_from_data(NDBuffer self, StridedLayout layout, object data, intptr_t data_ptr, str dtype_name, int data_device_id) except -1:
|
|
35
|
+
self.layout = layout
|
|
36
|
+
self.data = data
|
|
37
|
+
self.data_ptr = data_ptr
|
|
38
|
+
self.data_device_id = data_device_id
|
|
39
|
+
self.dtype_name = dtype_name
|
|
40
|
+
return 0
|