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,217 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
BLAS function wrapper utilities for dynamically loading and wrapping Level-3 matrix
|
|
7
|
+
multiplication functions from cuBLAS and NVPL BLAS backends. Handles data type to BLAS
|
|
8
|
+
abbreviation mapping, function name generation, and provides unified access with proper
|
|
9
|
+
handle and stream management.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import typing
|
|
13
|
+
|
|
14
|
+
import nvmath.bindings.cublas as cublas
|
|
15
|
+
import nvmath.bindings.nvpl.blas as blas
|
|
16
|
+
from nvmath._internal.templates import ExecutionCPU, ExecutionCUDA
|
|
17
|
+
from nvmath._internal.utils import LoggerLike
|
|
18
|
+
from nvmath.bindings._internal.utils import FunctionNotFoundError
|
|
19
|
+
from nvmath.internal import typemaps, utils
|
|
20
|
+
from nvmath.linalg._internal.utils import get_handle
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def get_value_zeroth_element(array):
|
|
24
|
+
"""Returns the value of zeroth element."""
|
|
25
|
+
return array[0]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_address_zeroth_element(array):
|
|
29
|
+
"""Returns the memory address of the zeroth element."""
|
|
30
|
+
return array.ctypes.data
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _blas_dtype_abbreviation(dtype: typemaps.cudaDataType) -> str:
|
|
34
|
+
"""Return the BLAS Level-3 API abbreviation of a dtype."""
|
|
35
|
+
match dtype:
|
|
36
|
+
case typemaps.cudaDataType.CUDA_R_32F:
|
|
37
|
+
return "s"
|
|
38
|
+
case typemaps.cudaDataType.CUDA_R_64F:
|
|
39
|
+
return "d"
|
|
40
|
+
case typemaps.cudaDataType.CUDA_C_32F:
|
|
41
|
+
return "c"
|
|
42
|
+
case typemaps.cudaDataType.CUDA_C_64F:
|
|
43
|
+
return "z"
|
|
44
|
+
case typemaps.cudaDataType.CUDA_R_16F:
|
|
45
|
+
return "h"
|
|
46
|
+
case _:
|
|
47
|
+
msg = f"'{dtype.name}' has no known BLAS abbreviation."
|
|
48
|
+
raise ValueError(msg)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _netlib_mm_function_name(dtype: typemaps.cudaDataType, matrix_descr_abbreviation: str) -> str:
|
|
52
|
+
"""Return a netlib API Level-3 function name based on the parameters."""
|
|
53
|
+
return f"{_blas_dtype_abbreviation(dtype)}{matrix_descr_abbreviation}mm"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _cublas_mm_function_name(
|
|
57
|
+
dtype: typemaps.cudaDataType,
|
|
58
|
+
matrix_descr_abbreviation: str,
|
|
59
|
+
batch_type: typing.Literal["", "stride", "group"] = "",
|
|
60
|
+
) -> str:
|
|
61
|
+
"""Return a cuBLAS API Level-3 function name based on the parameters."""
|
|
62
|
+
match batch_type:
|
|
63
|
+
case "stride":
|
|
64
|
+
suffix = "_strided_batched"
|
|
65
|
+
case "group":
|
|
66
|
+
suffix = "_grouped_batched"
|
|
67
|
+
case "":
|
|
68
|
+
suffix = ""
|
|
69
|
+
case _:
|
|
70
|
+
raise ValueError("batch_type is invalid.")
|
|
71
|
+
return _netlib_mm_function_name(dtype, matrix_descr_abbreviation) + suffix
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def cublas_mm_function(
|
|
75
|
+
execution: ExecutionCUDA | ExecutionCPU,
|
|
76
|
+
dtype: typemaps.cudaDataType,
|
|
77
|
+
matrix_descr_abbreviation: str,
|
|
78
|
+
logger: LoggerLike,
|
|
79
|
+
batch_type: typing.Literal["", "stride", "group"] = "",
|
|
80
|
+
) -> typing.Callable:
|
|
81
|
+
"""Return a cublas API Level-3 function from nvmath.bindings.cublas."""
|
|
82
|
+
# We get the cublas handle and set the stream here because other BLAS implementations do
|
|
83
|
+
# not have these constructs
|
|
84
|
+
assert isinstance(execution, ExecutionCUDA)
|
|
85
|
+
handle = get_handle(device_id=execution.device_id, binding="cublas")
|
|
86
|
+
function_name = _cublas_mm_function_name(dtype, matrix_descr_abbreviation, batch_type)
|
|
87
|
+
try:
|
|
88
|
+
function = getattr(cublas, function_name)
|
|
89
|
+
try:
|
|
90
|
+
function()
|
|
91
|
+
except TypeError:
|
|
92
|
+
pass
|
|
93
|
+
|
|
94
|
+
def wrapped_with_handle_and_stream(*args, stream_holder: utils.StreamHolder):
|
|
95
|
+
cublas.set_stream(handle, stream_holder.ptr)
|
|
96
|
+
function(handle, *args)
|
|
97
|
+
|
|
98
|
+
wrapped_with_handle_and_stream.__name__ = function.__name__
|
|
99
|
+
|
|
100
|
+
logger.debug("Loaded a cuBLAS API function named %s", function.__name__)
|
|
101
|
+
return wrapped_with_handle_and_stream
|
|
102
|
+
except (AttributeError, FunctionNotFoundError) as e:
|
|
103
|
+
# The user may try to call a newer function with older cuBLAS.
|
|
104
|
+
cublas_version = cublas.get_version(handle)
|
|
105
|
+
msg = (
|
|
106
|
+
f"{function_name}() is an unknown cuBLAS function "
|
|
107
|
+
f"for cuBLAS version {cublas_version}. Please check the cuBLAS Level-3 Function Reference "
|
|
108
|
+
f"to see whether this function should exists for cuBLAS version {cublas_version}."
|
|
109
|
+
)
|
|
110
|
+
raise NotImplementedError(msg) from e
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def cublas_enum_mapper(enum):
|
|
114
|
+
"""Maps cuBLAS enums to cuBLAS enum."""
|
|
115
|
+
return enum
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _nvpl_mm_function_name(
|
|
119
|
+
dtype: typemaps.cudaDataType,
|
|
120
|
+
matrix_descr_abbreviation: str,
|
|
121
|
+
batch_type: typing.Literal["", "stride", "group"] = "",
|
|
122
|
+
) -> str:
|
|
123
|
+
"""Return an NVPL API Level-3 function name based on the parameters."""
|
|
124
|
+
match batch_type:
|
|
125
|
+
case "stride":
|
|
126
|
+
suffix = "_batch_strided"
|
|
127
|
+
case "group":
|
|
128
|
+
suffix = "_batch"
|
|
129
|
+
case "":
|
|
130
|
+
suffix = ""
|
|
131
|
+
case _:
|
|
132
|
+
raise ValueError("batch_type is invalid.")
|
|
133
|
+
return _netlib_mm_function_name(dtype, matrix_descr_abbreviation) + suffix
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def nvpl_mm_function(
|
|
137
|
+
execution: ExecutionCUDA | ExecutionCPU,
|
|
138
|
+
dtype: typemaps.cudaDataType,
|
|
139
|
+
matrix_descr_abbreviation: str,
|
|
140
|
+
logger: LoggerLike,
|
|
141
|
+
batch_type: typing.Literal["", "stride", "group"] = "",
|
|
142
|
+
) -> typing.Callable:
|
|
143
|
+
"""Return an NVPL API Level-3 function from nvmath.bindings.nvpl.blas."""
|
|
144
|
+
if matrix_descr_abbreviation == "tr":
|
|
145
|
+
# FIXME: Reconcile API differences
|
|
146
|
+
raise NotImplementedError("trmm on CPU is unsupported at this time because the cuBLAS API differs.")
|
|
147
|
+
assert isinstance(execution, ExecutionCPU)
|
|
148
|
+
function_name = _nvpl_mm_function_name(dtype, matrix_descr_abbreviation, batch_type)
|
|
149
|
+
try:
|
|
150
|
+
function = getattr(blas, function_name)
|
|
151
|
+
try:
|
|
152
|
+
function()
|
|
153
|
+
except TypeError:
|
|
154
|
+
pass
|
|
155
|
+
|
|
156
|
+
new_num_threads = 0 if execution.num_threads is None else execution.num_threads
|
|
157
|
+
|
|
158
|
+
for set_num_threads_local_name in [
|
|
159
|
+
"set_num_threads_local",
|
|
160
|
+
"mkl_set_num_threads_local",
|
|
161
|
+
"openblas_set_num_threads_local",
|
|
162
|
+
]:
|
|
163
|
+
try:
|
|
164
|
+
set_num_threads_local = getattr(blas, set_num_threads_local_name)
|
|
165
|
+
old_num_threads = set_num_threads_local(new_num_threads)
|
|
166
|
+
set_num_threads_local(old_num_threads)
|
|
167
|
+
except FunctionNotFoundError as e:
|
|
168
|
+
logger.debug(e)
|
|
169
|
+
pass
|
|
170
|
+
else:
|
|
171
|
+
logger.debug(f"function {set_num_threads_local_name} is valid.")
|
|
172
|
+
break
|
|
173
|
+
else:
|
|
174
|
+
# If none of the local setting functions are valid, implement a dummy function
|
|
175
|
+
def set_num_threads_local(x):
|
|
176
|
+
pass
|
|
177
|
+
|
|
178
|
+
def wrapped_with_threads_and_stream(*args, stream_holder: None):
|
|
179
|
+
old_num_threads = set_num_threads_local(new_num_threads)
|
|
180
|
+
function(blas.ORDER.ColMajor, *args)
|
|
181
|
+
set_num_threads_local(old_num_threads)
|
|
182
|
+
|
|
183
|
+
wrapped_with_threads_and_stream.__name__ = function.__name__
|
|
184
|
+
|
|
185
|
+
logger.debug("Loaded a NVPL BLAS API function named %s", function.__name__)
|
|
186
|
+
return wrapped_with_threads_and_stream
|
|
187
|
+
except (AttributeError, FunctionNotFoundError) as e:
|
|
188
|
+
# The user may try to call a newer function with older cuBLAS.
|
|
189
|
+
try:
|
|
190
|
+
blas_version = blas.get_version()
|
|
191
|
+
except FunctionNotFoundError:
|
|
192
|
+
blas_version = "unknown"
|
|
193
|
+
msg = (
|
|
194
|
+
f"{function_name}() is an unknown NVPL BLAS function "
|
|
195
|
+
f"for NVPL BLAS version {blas_version}. Please check the BLAS Level-3 Function Reference "
|
|
196
|
+
f"to see whether this function should exists for NVPL BLAS version {blas_version}."
|
|
197
|
+
)
|
|
198
|
+
raise NotImplementedError(msg) from e
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
# NOTE: We have to map from name (str) to enum because of value collisions in the enums
|
|
202
|
+
_CUBLAS_ENUM_TO_NVPL_ENUM: dict[str, int] = {
|
|
203
|
+
cublas.DiagType.NON_UNIT.name: blas.DIAG.NonUnit,
|
|
204
|
+
cublas.DiagType.UNIT.name: blas.DIAG.Unit,
|
|
205
|
+
cublas.FillMode.LOWER.name: blas.UPLO.Lower,
|
|
206
|
+
cublas.FillMode.UPPER.name: blas.UPLO.Upper,
|
|
207
|
+
cublas.Operation.C.name: blas.TRANSPOSE.ConjTrans,
|
|
208
|
+
cublas.Operation.N.name: blas.TRANSPOSE.NoTrans,
|
|
209
|
+
cublas.Operation.T.name: blas.TRANSPOSE.Trans,
|
|
210
|
+
cublas.SideMode.LEFT.name: blas.SIDE.Left,
|
|
211
|
+
cublas.SideMode.RIGHT.name: blas.SIDE.Right,
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def nvpl_enum_mapper(enum):
|
|
216
|
+
"""Maps cuBLAS enums to BLAS enums."""
|
|
217
|
+
return _CUBLAS_ENUM_TO_NVPL_ENUM[enum.name]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
SUPPORTED_TYPES = [
|
|
6
|
+
"float32",
|
|
7
|
+
"float64",
|
|
8
|
+
"complex64",
|
|
9
|
+
"complex128",
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def check_dtype(dtype, operand_name):
|
|
14
|
+
if dtype not in SUPPORTED_TYPES:
|
|
15
|
+
raise ValueError(f"The dtype of operand {operand_name} ({dtype}) is not supported.")
|