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,702 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Interface classes to encapsulate low-level calls to get or set configuration information.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
__all__ = ["FactorizationConfig", "PlanConfig", "SolutionConfig"]
|
|
10
|
+
|
|
11
|
+
import re
|
|
12
|
+
import threading
|
|
13
|
+
from typing import TypeAlias
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
from nvmath.bindings import cudss
|
|
18
|
+
from nvmath.internal import utils
|
|
19
|
+
|
|
20
|
+
ConfigParamEnum: TypeAlias = cudss.ConfigParam
|
|
21
|
+
|
|
22
|
+
# Future-proofing - cuDSS is currently not thread-safe.
|
|
23
|
+
# https://docs.nvidia.com/cuda/cudss/general.html#thread-safety
|
|
24
|
+
_tls = threading.local()
|
|
25
|
+
_tls.size_written = np.empty((1,), dtype=np.uint64)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _get_scalar_attribute(config_ptr, name, attribute):
|
|
29
|
+
"""
|
|
30
|
+
name = cudss enumerator for the attribute.
|
|
31
|
+
attribute = numpy ndarray object into which the value is stored.
|
|
32
|
+
"""
|
|
33
|
+
cudss.config_get(config_ptr, name, attribute.ctypes.data, attribute.dtype.itemsize, _tls.size_written.ctypes.data)
|
|
34
|
+
assert _tls.size_written[0] <= attribute.dtype.itemsize, "Internal error."
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _set_scalar_attribute(config_ptr, name, attribute, value):
|
|
38
|
+
"""
|
|
39
|
+
name = cudss enumerator for the attribute.
|
|
40
|
+
attribute = numpy ndarray object into which the value is stored.
|
|
41
|
+
value = the value to set the attribute to.
|
|
42
|
+
"""
|
|
43
|
+
attribute[0] = value
|
|
44
|
+
cudss.config_set(config_ptr, name, attribute.ctypes.data, attribute.dtype.itemsize)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _check_valid_solver(config):
|
|
48
|
+
"""
|
|
49
|
+
Check if the configuration points to a valid DirectSolver object.
|
|
50
|
+
"""
|
|
51
|
+
if not config._solver.valid_state:
|
|
52
|
+
m = re.match(r"<nvmath\..*\.(.*Config) object at (.*)>$", str(config))
|
|
53
|
+
assert m is not None, "Internal error."
|
|
54
|
+
name = m.group(1)
|
|
55
|
+
address = m.group(2)
|
|
56
|
+
|
|
57
|
+
raise RuntimeError(f"The {name} object at {address} cannot be used after its solver object is free'd.")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# TODO: Set user permutation as part of PlanConfig, even though it sets the data object.
|
|
61
|
+
class PlanConfig:
|
|
62
|
+
"""
|
|
63
|
+
An interface to configure :meth:`nvmath.sparse.advanced.DirectSolver.plan`. The
|
|
64
|
+
current configuration can also be queried.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
__slots__ = (
|
|
68
|
+
"_solver",
|
|
69
|
+
"_config_ptr",
|
|
70
|
+
"_host_nthreads",
|
|
71
|
+
"_reordering_alg",
|
|
72
|
+
"_pivot_type",
|
|
73
|
+
"_pivot_threshold",
|
|
74
|
+
"_max_lu_nnz",
|
|
75
|
+
"_matching_alg",
|
|
76
|
+
"_nd_nlevels",
|
|
77
|
+
"_use_superpanels",
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
def __init__(self, solver):
|
|
81
|
+
"""
|
|
82
|
+
ctor for internal use only.
|
|
83
|
+
"""
|
|
84
|
+
self._solver = solver
|
|
85
|
+
self._config_ptr = self._solver.config_ptr
|
|
86
|
+
assert self._config_ptr is not None, "Internal error"
|
|
87
|
+
|
|
88
|
+
get_dtype = cudss.get_config_param_dtype
|
|
89
|
+
|
|
90
|
+
self._host_nthreads = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.HOST_NTHREADS))
|
|
91
|
+
self._reordering_alg = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.REORDERING_ALG))
|
|
92
|
+
self._pivot_type = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.PIVOT_TYPE))
|
|
93
|
+
self._pivot_threshold = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.PIVOT_THRESHOLD))
|
|
94
|
+
self._max_lu_nnz = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.MAX_LU_NNZ))
|
|
95
|
+
self._matching_alg = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.MATCHING_ALG))
|
|
96
|
+
self._nd_nlevels = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.ND_NLEVELS))
|
|
97
|
+
self._use_superpanels = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.USE_SUPERPANELS))
|
|
98
|
+
|
|
99
|
+
def _check_valid_solver_wrapper(self, *args, **kwargs):
|
|
100
|
+
_check_valid_solver(self)
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
104
|
+
def host_nthreads(self):
|
|
105
|
+
"""
|
|
106
|
+
Query or set the number of host threads. See the
|
|
107
|
+
`cuDSS documentation
|
|
108
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
109
|
+
for more information.
|
|
110
|
+
"""
|
|
111
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.HOST_NTHREADS, self._host_nthreads)
|
|
112
|
+
|
|
113
|
+
return self._host_nthreads.item()
|
|
114
|
+
|
|
115
|
+
@host_nthreads.setter
|
|
116
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
117
|
+
def host_nthreads(self, nthreads):
|
|
118
|
+
"""
|
|
119
|
+
Set the number of host threads. See the
|
|
120
|
+
`cuDSS documentation
|
|
121
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
122
|
+
for more information.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
nthreads: The number of host threads as Python `int`.
|
|
126
|
+
|
|
127
|
+
"""
|
|
128
|
+
if not self._solver.multithreading:
|
|
129
|
+
raise ValueError(
|
|
130
|
+
"The number of host threads cannot be set if a multithreading library was not provided during problem \
|
|
131
|
+
specification."
|
|
132
|
+
)
|
|
133
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.HOST_NTHREADS, self._host_nthreads, nthreads)
|
|
134
|
+
|
|
135
|
+
@property
|
|
136
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
137
|
+
def reordering_algorithm(self):
|
|
138
|
+
"""
|
|
139
|
+
Query or set the reordering algorithm used. See
|
|
140
|
+
:class:`nvmath.bindings.cudss.ReorderingAlg` and the `cuDSS documentation
|
|
141
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_ for more
|
|
142
|
+
information.
|
|
143
|
+
"""
|
|
144
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.REORDERING_ALG, self._reordering_alg)
|
|
145
|
+
|
|
146
|
+
return cudss.ReorderingAlg(self._reordering_alg.item())
|
|
147
|
+
|
|
148
|
+
@reordering_algorithm.setter
|
|
149
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
150
|
+
def reordering_algorithm(self, algorithm):
|
|
151
|
+
"""
|
|
152
|
+
Set the reordering algorithm to use. See
|
|
153
|
+
:class:`nvmath.bindings.cudss.ReorderingAlg` and the `cuDSS documentation
|
|
154
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_ for more
|
|
155
|
+
information.
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
algorithm: The reordering algorithm of type
|
|
159
|
+
:class:`nvmath.bindings.cudss.ReorderingAlg` or Python `int`.
|
|
160
|
+
|
|
161
|
+
"""
|
|
162
|
+
algorithm = cudss.ReorderingAlg(algorithm)
|
|
163
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.REORDERING_ALG, self._reordering_alg, algorithm)
|
|
164
|
+
|
|
165
|
+
@property
|
|
166
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
167
|
+
def matching_algorithm(self):
|
|
168
|
+
"""
|
|
169
|
+
Query or set the matching algorithm used. See
|
|
170
|
+
:class:`nvmath.bindings.cudss.MatchingAlg` and the `cuDSS documentation
|
|
171
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_ for more
|
|
172
|
+
information.
|
|
173
|
+
"""
|
|
174
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.MATCHING_ALG, self._matching_alg)
|
|
175
|
+
|
|
176
|
+
return cudss.MatchingAlg(self._matching_alg.item())
|
|
177
|
+
|
|
178
|
+
@matching_algorithm.setter
|
|
179
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
180
|
+
def matching_algorithm(self, algorithm):
|
|
181
|
+
"""
|
|
182
|
+
Set the matching algorithm to use. See
|
|
183
|
+
:class:`nvmath.bindings.cudss.MatchingAlg` and the `cuDSS documentation
|
|
184
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_ for more
|
|
185
|
+
information.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
algorithm: The matching algorithm of type
|
|
189
|
+
:class:`nvmath.bindings.cudss.MatchingAlg` or Python `int`.
|
|
190
|
+
|
|
191
|
+
"""
|
|
192
|
+
algorithm = cudss.MatchingAlg(algorithm)
|
|
193
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.MATCHING_ALG, self._matching_alg, algorithm)
|
|
194
|
+
|
|
195
|
+
@property
|
|
196
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
197
|
+
def pivot_type(self):
|
|
198
|
+
"""
|
|
199
|
+
Query or set the type of pivoting. See
|
|
200
|
+
:class:`nvmath.bindings.cudss.PivotType` and the `cuDSS documentation
|
|
201
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
202
|
+
for more information.
|
|
203
|
+
"""
|
|
204
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.PIVOT_TYPE, self._pivot_type)
|
|
205
|
+
|
|
206
|
+
return cudss.PivotType(self._pivot_type.item())
|
|
207
|
+
|
|
208
|
+
@pivot_type.setter
|
|
209
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
210
|
+
def pivot_type(self, pivot_type):
|
|
211
|
+
"""
|
|
212
|
+
Set the type of pivoting. See :class:`nvmath.bindings.cudss.PivotType` and the
|
|
213
|
+
`cuDSS documentation
|
|
214
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_ for more
|
|
215
|
+
information.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
pivot_type: The type of pivoting (:class:`nvmath.bindings.cudss.PivotType` or
|
|
219
|
+
Python `int`).
|
|
220
|
+
|
|
221
|
+
"""
|
|
222
|
+
pivot_type = cudss.PivotType(pivot_type)
|
|
223
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.PIVOT_TYPE, self._pivot_type, pivot_type)
|
|
224
|
+
|
|
225
|
+
@property
|
|
226
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
227
|
+
def pivot_threshold(self):
|
|
228
|
+
"""
|
|
229
|
+
Query or set the pivot threshold. See the
|
|
230
|
+
`cuDSS documentation
|
|
231
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
232
|
+
for more information.
|
|
233
|
+
"""
|
|
234
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.PIVOT_THRESHOLD, self._pivot_threshold)
|
|
235
|
+
|
|
236
|
+
return self._pivot_threshold.item()
|
|
237
|
+
|
|
238
|
+
@pivot_threshold.setter
|
|
239
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
240
|
+
def pivot_threshold(self, pivot_threshold):
|
|
241
|
+
"""
|
|
242
|
+
Set the pivot threshold. See the
|
|
243
|
+
`cuDSS documentation
|
|
244
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
245
|
+
for more information.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
pivot_threshold: The threshold for pivoting (Python `float`).
|
|
249
|
+
|
|
250
|
+
"""
|
|
251
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.PIVOT_THRESHOLD, self._pivot_threshold, pivot_threshold)
|
|
252
|
+
|
|
253
|
+
@property
|
|
254
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
255
|
+
def max_nnz(self):
|
|
256
|
+
"""
|
|
257
|
+
Query or set the maximum limit for non-zero factors in the LU decomposition. See the
|
|
258
|
+
`cuDSS documentation
|
|
259
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
260
|
+
for more information.
|
|
261
|
+
"""
|
|
262
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.MAX_LU_NNZ, self._max_lu_nnz)
|
|
263
|
+
|
|
264
|
+
return self._max_lu_nnz.item()
|
|
265
|
+
|
|
266
|
+
@max_nnz.setter
|
|
267
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
268
|
+
def max_nnz(self, max_nnz):
|
|
269
|
+
"""
|
|
270
|
+
Set the maximum limit for non-zero factors in the LU decomposition. See the
|
|
271
|
+
`cuDSS documentation
|
|
272
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
273
|
+
for more information.
|
|
274
|
+
|
|
275
|
+
Args:
|
|
276
|
+
max_nnz: The maximum limit for non-zero factors in the LU decomposition
|
|
277
|
+
(Python `int`).
|
|
278
|
+
|
|
279
|
+
"""
|
|
280
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.MAX_LU_NNZ, self._max_lu_nnz, max_nnz)
|
|
281
|
+
|
|
282
|
+
@property
|
|
283
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
284
|
+
def nd_min_levels(self):
|
|
285
|
+
"""
|
|
286
|
+
Query or set the minimum number of levels for the nested dissection reordering. See
|
|
287
|
+
the `cuDSS documentation
|
|
288
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
289
|
+
for more information.
|
|
290
|
+
"""
|
|
291
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.ND_NLEVELS, self._nd_nlevels)
|
|
292
|
+
|
|
293
|
+
return self._nd_nlevels.item()
|
|
294
|
+
|
|
295
|
+
@nd_min_levels.setter
|
|
296
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
297
|
+
def nd_min_levels(self, min_levels):
|
|
298
|
+
"""
|
|
299
|
+
Set the minimum number of levels for the nested dissection reordering. See the
|
|
300
|
+
`cuDSS documentation
|
|
301
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
302
|
+
for more information.
|
|
303
|
+
|
|
304
|
+
Args:
|
|
305
|
+
min_levels: The minimum number of levels for the nested dissection reordering
|
|
306
|
+
(Python `int`).
|
|
307
|
+
|
|
308
|
+
"""
|
|
309
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.ND_NLEVELS, self._nd_nlevels, min_levels)
|
|
310
|
+
|
|
311
|
+
@property
|
|
312
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
313
|
+
def use_superpanels(self):
|
|
314
|
+
"""
|
|
315
|
+
Query or set the option to enable or disable superpanel optimization. See the
|
|
316
|
+
`cuDSS documentation
|
|
317
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
318
|
+
for more information.
|
|
319
|
+
"""
|
|
320
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.USE_SUPERPANELS, self._use_superpanels)
|
|
321
|
+
|
|
322
|
+
return self._use_superpanels.item()
|
|
323
|
+
|
|
324
|
+
@use_superpanels.setter
|
|
325
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
326
|
+
def use_superpanels(self, superpanels_flag):
|
|
327
|
+
"""
|
|
328
|
+
Set the option to enable or disable superpanel optimization. See the
|
|
329
|
+
`cuDSS documentation
|
|
330
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
331
|
+
for more information.
|
|
332
|
+
|
|
333
|
+
Args:
|
|
334
|
+
superpanels_flag: The flag to enable or disable superpanel optimization
|
|
335
|
+
(Python `int` or `bool`, 0 to disable).
|
|
336
|
+
|
|
337
|
+
"""
|
|
338
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.USE_SUPERPANELS, self._use_superpanels, superpanels_flag)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
class FactorizationConfig:
|
|
342
|
+
"""
|
|
343
|
+
An interface to configure :meth:`nvmath.sparse.advanced.DirectSolver.factorize`. The
|
|
344
|
+
current configuration can also be queried.
|
|
345
|
+
"""
|
|
346
|
+
|
|
347
|
+
__slots__ = (
|
|
348
|
+
"_solver",
|
|
349
|
+
"_config_ptr",
|
|
350
|
+
"_factorization_alg",
|
|
351
|
+
"_pivot_epsilon_alg",
|
|
352
|
+
"_pivot_epsilon",
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
def __init__(self, solver):
|
|
356
|
+
"""
|
|
357
|
+
ctor for internal use only.
|
|
358
|
+
"""
|
|
359
|
+
self._solver = solver
|
|
360
|
+
self._config_ptr = self._solver.config_ptr
|
|
361
|
+
assert self._config_ptr is not None, "Internal error"
|
|
362
|
+
|
|
363
|
+
get_dtype = cudss.get_config_param_dtype
|
|
364
|
+
|
|
365
|
+
self._factorization_alg = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.FACTORIZATION_ALG))
|
|
366
|
+
self._pivot_epsilon_alg = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.PIVOT_EPSILON_ALG))
|
|
367
|
+
self._pivot_epsilon = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.PIVOT_EPSILON))
|
|
368
|
+
|
|
369
|
+
def _check_valid_solver_wrapper(self, *args, **kwargs):
|
|
370
|
+
_check_valid_solver(self)
|
|
371
|
+
|
|
372
|
+
@property
|
|
373
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
374
|
+
def factorization_algorithm(self):
|
|
375
|
+
"""
|
|
376
|
+
Query or set the factorization algorithm used. See
|
|
377
|
+
:class:`nvmath.bindings.cudss.FactorizationAlg` and the `cuDSS documentation
|
|
378
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_ for more
|
|
379
|
+
information.
|
|
380
|
+
"""
|
|
381
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.FACTORIZATION_ALG, self._factorization_alg)
|
|
382
|
+
|
|
383
|
+
return cudss.FactorizationAlg(self._factorization_alg.item())
|
|
384
|
+
|
|
385
|
+
@factorization_algorithm.setter
|
|
386
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
387
|
+
def factorization_algorithm(self, algorithm):
|
|
388
|
+
"""
|
|
389
|
+
Set the factorization algorithm to use. See
|
|
390
|
+
:class:`nvmath.bindings.cudss.FactorizationAlg` and the `cuDSS documentation
|
|
391
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_ for more
|
|
392
|
+
information.
|
|
393
|
+
|
|
394
|
+
Args:
|
|
395
|
+
algorithm: The factorization algorithm of type
|
|
396
|
+
:class:`nvmath.bindings.cudss.FactorizationAlg` or Python `int`.
|
|
397
|
+
|
|
398
|
+
"""
|
|
399
|
+
algorithm = cudss.FactorizationAlg(algorithm)
|
|
400
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.FACTORIZATION_ALG, self._factorization_alg, algorithm)
|
|
401
|
+
|
|
402
|
+
@property
|
|
403
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
404
|
+
def pivot_eps_algorithm(self):
|
|
405
|
+
"""
|
|
406
|
+
Query or set the algorithm used for pivot epsilon calculation. See
|
|
407
|
+
:class:`nvmath.bindings.cudss.PivotEpsilonAlg` and the `cuDSS documentation
|
|
408
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_ for more
|
|
409
|
+
information.
|
|
410
|
+
"""
|
|
411
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.PIVOT_EPSILON_ALG, self._pivot_epsilon_alg)
|
|
412
|
+
|
|
413
|
+
return cudss.PivotEpsilonAlg(self._pivot_epsilon_alg.item())
|
|
414
|
+
|
|
415
|
+
@pivot_eps_algorithm.setter
|
|
416
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
417
|
+
def pivot_eps_algorithm(self, algorithm):
|
|
418
|
+
"""
|
|
419
|
+
Set the algorithm to use for pivot epsilon calculation. See
|
|
420
|
+
:class:`nvmath.bindings.cudss.PivotEpsilonAlg` and the `cuDSS documentation
|
|
421
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_ for more
|
|
422
|
+
information.
|
|
423
|
+
|
|
424
|
+
Args:
|
|
425
|
+
algorithm: The pivot epsilon algorithm of type
|
|
426
|
+
:class:`nvmath.bindings.cudss.PivotEpsilonAlg` or Python `int`.
|
|
427
|
+
|
|
428
|
+
"""
|
|
429
|
+
algorithm = cudss.PivotEpsilonAlg(algorithm)
|
|
430
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.PIVOT_EPSILON_ALG, self._pivot_epsilon_alg, algorithm)
|
|
431
|
+
|
|
432
|
+
@property
|
|
433
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
434
|
+
def pivot_eps(self):
|
|
435
|
+
"""
|
|
436
|
+
Query or set the pivot epsilon value. See the
|
|
437
|
+
`cuDSS documentation
|
|
438
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
439
|
+
for more information.
|
|
440
|
+
"""
|
|
441
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.PIVOT_EPSILON, self._pivot_epsilon)
|
|
442
|
+
|
|
443
|
+
return self._pivot_epsilon.item()
|
|
444
|
+
|
|
445
|
+
@pivot_eps.setter
|
|
446
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
447
|
+
def pivot_eps(self, epsilon):
|
|
448
|
+
"""
|
|
449
|
+
Set the pivot epsilon value. See the
|
|
450
|
+
`cuDSS documentation
|
|
451
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
452
|
+
for more information.
|
|
453
|
+
|
|
454
|
+
Args:
|
|
455
|
+
epsilon: The pivot epsilon value (Python numerical type).
|
|
456
|
+
|
|
457
|
+
"""
|
|
458
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.PIVOT_EPSILON, self._pivot_epsilon, epsilon)
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
class SolutionConfig:
|
|
462
|
+
"""
|
|
463
|
+
An interface to configure :meth:`nvmath.sparse.advanced.DirectSolver.solve`. The
|
|
464
|
+
current configuration can also be queried.
|
|
465
|
+
"""
|
|
466
|
+
|
|
467
|
+
__slots__ = (
|
|
468
|
+
"_solver",
|
|
469
|
+
"_config_ptr",
|
|
470
|
+
"_solve_alg",
|
|
471
|
+
"_ir_n_steps",
|
|
472
|
+
)
|
|
473
|
+
|
|
474
|
+
def __init__(self, solver):
|
|
475
|
+
"""
|
|
476
|
+
ctor for internal use only.
|
|
477
|
+
"""
|
|
478
|
+
self._solver = solver
|
|
479
|
+
self._config_ptr = self._solver.config_ptr
|
|
480
|
+
assert self._config_ptr is not None, "Internal error"
|
|
481
|
+
|
|
482
|
+
get_dtype = cudss.get_config_param_dtype
|
|
483
|
+
|
|
484
|
+
self._solve_alg = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.SOLVE_ALG))
|
|
485
|
+
self._ir_n_steps = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.IR_N_STEPS))
|
|
486
|
+
|
|
487
|
+
def _check_valid_solver_wrapper(self, *args, **kwargs):
|
|
488
|
+
_check_valid_solver(self)
|
|
489
|
+
|
|
490
|
+
@property
|
|
491
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
492
|
+
def solution_algorithm(self):
|
|
493
|
+
"""
|
|
494
|
+
Query or set the solution algorithm used. See
|
|
495
|
+
:class:`nvmath.bindings.cudss.SolveAlg` and the `cuDSS documentation
|
|
496
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_ for more
|
|
497
|
+
information.
|
|
498
|
+
"""
|
|
499
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.SOLVE_ALG, self._solve_alg)
|
|
500
|
+
|
|
501
|
+
return cudss.SolveAlg(self._solve_alg.item())
|
|
502
|
+
|
|
503
|
+
@solution_algorithm.setter
|
|
504
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
505
|
+
def solution_algorithm(self, algorithm):
|
|
506
|
+
"""
|
|
507
|
+
Set the algorithm to use for solving. See :class:`nvmath.bindings.cudss.SolveAlg`
|
|
508
|
+
and the `cuDSS documentation
|
|
509
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_ for more
|
|
510
|
+
information.
|
|
511
|
+
|
|
512
|
+
Args:
|
|
513
|
+
algorithm: The solution algorithm of type
|
|
514
|
+
:class:`nvmath.bindings.cudss.SolveAlg` or Python `int`.
|
|
515
|
+
|
|
516
|
+
"""
|
|
517
|
+
algorithm = cudss.SolveAlg(algorithm)
|
|
518
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.SOLVE_ALG, self._solve_alg, algorithm)
|
|
519
|
+
|
|
520
|
+
@property
|
|
521
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
522
|
+
def ir_num_steps(self):
|
|
523
|
+
"""
|
|
524
|
+
Query or set the number of steps used for iterative refinement. See the
|
|
525
|
+
`cuDSS documentation
|
|
526
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
527
|
+
for more information.
|
|
528
|
+
"""
|
|
529
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.IR_N_STEPS, self._ir_n_steps)
|
|
530
|
+
|
|
531
|
+
return self._ir_n_steps.item()
|
|
532
|
+
|
|
533
|
+
@ir_num_steps.setter
|
|
534
|
+
@utils.precondition(_check_valid_solver_wrapper)
|
|
535
|
+
def ir_num_steps(self, num_steps):
|
|
536
|
+
"""
|
|
537
|
+
Set the number of steps to use for iterative refinement. See the
|
|
538
|
+
`cuDSS documentation
|
|
539
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
540
|
+
for more information.
|
|
541
|
+
|
|
542
|
+
Args:
|
|
543
|
+
num_steps: The number of steps to use for iterative refinement as a
|
|
544
|
+
Python `int`.
|
|
545
|
+
|
|
546
|
+
"""
|
|
547
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.IR_N_STEPS, self._ir_n_steps, num_steps)
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
class InternalConfig:
|
|
551
|
+
"""
|
|
552
|
+
Interface class for internal use only. No precondition for `@property` since this is
|
|
553
|
+
used in the ctor before `solver.valid_state` is set.
|
|
554
|
+
"""
|
|
555
|
+
|
|
556
|
+
def __init__(self, solver):
|
|
557
|
+
"""
|
|
558
|
+
ctor for internal use only.
|
|
559
|
+
"""
|
|
560
|
+
self._solver = solver
|
|
561
|
+
self._config_ptr = self._solver.config_ptr
|
|
562
|
+
assert self._config_ptr is not None, "Internal error"
|
|
563
|
+
|
|
564
|
+
get_dtype = cudss.get_config_param_dtype
|
|
565
|
+
|
|
566
|
+
self._hybrid_memory_mode = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.HYBRID_MEMORY_MODE))
|
|
567
|
+
self._hybrid_device_memory_limit = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.HYBRID_DEVICE_MEMORY_LIMIT))
|
|
568
|
+
self._use_cuda_register_memory = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.USE_CUDA_REGISTER_MEMORY))
|
|
569
|
+
self._host_nthreads = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.HOST_NTHREADS))
|
|
570
|
+
self._hybrid_execute_mode = np.zeros((1,), dtype=get_dtype(ConfigParamEnum.HYBRID_EXECUTE_MODE))
|
|
571
|
+
|
|
572
|
+
@property
|
|
573
|
+
def hybrid_memory_mode(self):
|
|
574
|
+
"""
|
|
575
|
+
Query or set the hybrid memory mode. See the
|
|
576
|
+
`cuDSS documentation
|
|
577
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
578
|
+
for more information.
|
|
579
|
+
"""
|
|
580
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.HYBRID_MEMORY_MODE, self._hybrid_memory_mode)
|
|
581
|
+
|
|
582
|
+
return self._hybrid_memory_mode.item()
|
|
583
|
+
|
|
584
|
+
@hybrid_memory_mode.setter
|
|
585
|
+
def hybrid_memory_mode(self, mode):
|
|
586
|
+
"""
|
|
587
|
+
Set the hybrid memory mode. See the
|
|
588
|
+
`cuDSS documentation
|
|
589
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
590
|
+
for more information.
|
|
591
|
+
|
|
592
|
+
Args:
|
|
593
|
+
mode: The hybrid memory mode as Python `int` (0=device or 1=hybrid).
|
|
594
|
+
|
|
595
|
+
"""
|
|
596
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.HYBRID_MEMORY_MODE, self._hybrid_memory_mode, mode)
|
|
597
|
+
|
|
598
|
+
@property
|
|
599
|
+
def hybrid_device_memory_limit(self):
|
|
600
|
+
"""
|
|
601
|
+
Query or set the hybrid device memory limit. See the
|
|
602
|
+
`cuDSS documentation
|
|
603
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
604
|
+
for more information.
|
|
605
|
+
"""
|
|
606
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.HYBRID_DEVICE_MEMORY_LIMIT, self._hybrid_device_memory_limit)
|
|
607
|
+
|
|
608
|
+
return self._hybrid_device_memory_limit.item()
|
|
609
|
+
|
|
610
|
+
@hybrid_device_memory_limit.setter
|
|
611
|
+
def hybrid_device_memory_limit(self, limit):
|
|
612
|
+
"""
|
|
613
|
+
Set the hybrid device memory limit. See the
|
|
614
|
+
`cuDSS documentation
|
|
615
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
616
|
+
for more information.
|
|
617
|
+
|
|
618
|
+
Args:
|
|
619
|
+
limit: The hybrid memory limit as Python `int`.
|
|
620
|
+
|
|
621
|
+
"""
|
|
622
|
+
_set_scalar_attribute(
|
|
623
|
+
self._config_ptr, ConfigParamEnum.HYBRID_DEVICE_MEMORY_LIMIT, self._hybrid_device_memory_limit, limit
|
|
624
|
+
)
|
|
625
|
+
|
|
626
|
+
@property
|
|
627
|
+
def use_cuda_register_memory(self):
|
|
628
|
+
"""
|
|
629
|
+
Query or set the CUDA memory registration flag. See the
|
|
630
|
+
`cuDSS documentation
|
|
631
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
632
|
+
for more information.
|
|
633
|
+
"""
|
|
634
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.USE_CUDA_REGISTER_MEMORY, self._use_cuda_register_memory)
|
|
635
|
+
|
|
636
|
+
return self._use_cuda_register_memory.item()
|
|
637
|
+
|
|
638
|
+
@use_cuda_register_memory.setter
|
|
639
|
+
def use_cuda_register_memory(self, flag):
|
|
640
|
+
"""
|
|
641
|
+
Set the CUDA memory registration flag. See the
|
|
642
|
+
`cuDSS documentation
|
|
643
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
644
|
+
for more information.
|
|
645
|
+
|
|
646
|
+
Args:
|
|
647
|
+
flag: The memory registration flag as Python `int` (0 or 1).
|
|
648
|
+
|
|
649
|
+
"""
|
|
650
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.USE_CUDA_REGISTER_MEMORY, self._use_cuda_register_memory, flag)
|
|
651
|
+
|
|
652
|
+
@property
|
|
653
|
+
def host_nthreads(self):
|
|
654
|
+
"""
|
|
655
|
+
Query or set the number of host threads. See the
|
|
656
|
+
`cuDSS documentation
|
|
657
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
658
|
+
for more information.
|
|
659
|
+
"""
|
|
660
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.HOST_NTHREADS, self._host_nthreads)
|
|
661
|
+
|
|
662
|
+
return self._host_nthreads.item()
|
|
663
|
+
|
|
664
|
+
@host_nthreads.setter
|
|
665
|
+
def host_nthreads(self, nthreads):
|
|
666
|
+
"""
|
|
667
|
+
Set the number of host threads. See the
|
|
668
|
+
`cuDSS documentation
|
|
669
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
670
|
+
for more information.
|
|
671
|
+
|
|
672
|
+
Args:
|
|
673
|
+
nthreads: The number of host threads as Python `int`.
|
|
674
|
+
|
|
675
|
+
"""
|
|
676
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.HOST_NTHREADS, self._host_nthreads, nthreads)
|
|
677
|
+
|
|
678
|
+
@property
|
|
679
|
+
def hybrid_execute_mode(self):
|
|
680
|
+
"""
|
|
681
|
+
Query or set the hybrid execution mode. See the
|
|
682
|
+
`cuDSS documentation
|
|
683
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
684
|
+
for more information.
|
|
685
|
+
"""
|
|
686
|
+
_get_scalar_attribute(self._config_ptr, ConfigParamEnum.HYBRID_EXECUTE_MODE, self._hybrid_execute_mode)
|
|
687
|
+
|
|
688
|
+
return self._hybrid_execute_mode.item()
|
|
689
|
+
|
|
690
|
+
@hybrid_execute_mode.setter
|
|
691
|
+
def hybrid_execute_mode(self, mode):
|
|
692
|
+
"""
|
|
693
|
+
Set the hybrid execution mode. See the
|
|
694
|
+
`cuDSS documentation
|
|
695
|
+
<https://docs.nvidia.com/cuda/cudss/types.html#cudssconfigparam-t>`_
|
|
696
|
+
for more information.
|
|
697
|
+
|
|
698
|
+
Args:
|
|
699
|
+
mode: The hybrid execution mode as Python `int` (0=device or 1=hybrid).
|
|
700
|
+
|
|
701
|
+
"""
|
|
702
|
+
_set_scalar_attribute(self._config_ptr, ConfigParamEnum.HYBRID_EXECUTE_MODE, self._hybrid_execute_mode, mode)
|