| from __future__ import annotations | |
| import importlib as _importlib | |
| import os as _os | |
| from cupy_backends.cuda.api import runtime as _runtime | |
| if not _runtime.is_hip: | |
| from cuda import pathfinder as _pathfinder | |
| # All submodules are already made lazily loaded (and they should continue | |
| # remaining so). The problem we are solving is we want to load the required | |
| # C library before the submodule that needs it is imported. This list of | |
| # submodules are supported by the pathfinder. | |
| # | |
| # Note: Do NOT add "nvrtc" here. It is run-time linked instead of dynamically | |
| # linked, so its loading is further deferred (to inside SoftLink). | |
| _submodules = ( | |
| 'cublas', 'cusolver', 'cusparse', 'curand', 'nccl', 'cutensor', | |
| 'cusparselt', | |
| ) | |
| _submodules_runtime_link = ( | |
| 'nvrtc', 'nvtx' | |
| ) | |
| def __getattr__(name): | |
| if not _runtime.is_hip and name in _submodules: | |
| try: | |
| pathfinder_name = name | |
| if name == 'cusparselt': | |
| pathfinder_name = 'cusparseLt' | |
| _pathfinder.load_nvidia_dynamic_lib(pathfinder_name) | |
| except _pathfinder.DynamicLibNotFoundError as e: | |
| if (not (_os.environ.get('READTHEDOCS') == 'True') and | |
| not (_os.environ.get('CUPY_CI') is not None)): | |
| raise ImportError(str(e)) from e | |
| if name in (_submodules + _submodules_runtime_link): | |
| return _importlib.import_module(f'cupy_backends.cuda.libs.{name}') | |
| raise AttributeError( | |
| f"module {__name__!r} has no attribute {name!r}") | |