diff --git a/cuda_bindings/cuda/bindings/_utils/__init__.py b/cuda_bindings/cuda/bindings/_utils/__init__.py new file mode 100644 index 0000000000..830c1bf0de --- /dev/null +++ b/cuda_bindings/cuda/bindings/_utils/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE diff --git a/cuda_core/cuda/core/_utils/driver_cu_result_explanations.py b/cuda_bindings/cuda/bindings/_utils/driver_cu_result_explanations.py similarity index 100% rename from cuda_core/cuda/core/_utils/driver_cu_result_explanations.py rename to cuda_bindings/cuda/bindings/_utils/driver_cu_result_explanations.py diff --git a/cuda_core/cuda/core/_utils/runtime_cuda_error_explanations.py b/cuda_bindings/cuda/bindings/_utils/runtime_cuda_error_explanations.py similarity index 100% rename from cuda_core/cuda/core/_utils/runtime_cuda_error_explanations.py rename to cuda_bindings/cuda/bindings/_utils/runtime_cuda_error_explanations.py diff --git a/cuda_bindings/tests/test_enum_explanations.py b/cuda_bindings/tests/test_enum_explanations.py new file mode 100644 index 0000000000..01dc66719b --- /dev/null +++ b/cuda_bindings/tests/test_enum_explanations.py @@ -0,0 +1,38 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE + +import importlib +import importlib.metadata + +import pytest + +from cuda.bindings import driver, runtime + +_EXPLANATION_MODULES = [ + ("driver_cu_result_explanations", "DRIVER_CU_RESULT_EXPLANATIONS", driver.CUresult), + ("runtime_cuda_error_explanations", "RUNTIME_CUDA_ERROR_EXPLANATIONS", runtime.cudaError_t), +] + + +def _get_binding_version(): + try: + major_minor = importlib.metadata.version("cuda-bindings").split(".")[:2] + except importlib.metadata.PackageNotFoundError: + major_minor = importlib.metadata.version("cuda-python").split(".")[:2] + return tuple(int(v) for v in major_minor) + + +@pytest.mark.parametrize("module_name,dict_name,enum_type", _EXPLANATION_MODULES) +def test_explanations_health(module_name, dict_name, enum_type): + mod = importlib.import_module(f"cuda.bindings._utils.{module_name}") + expl_dict = getattr(mod, dict_name) + + known_codes = set() + for error in enum_type: + code = int(error) + assert code in expl_dict + known_codes.add(code) + + if _get_binding_version() >= (13, 0): + extra_expl = sorted(set(expl_dict.keys()) - known_codes) + assert not extra_expl diff --git a/cuda_core/cuda/core/_utils/cuda_utils.pyx b/cuda_core/cuda/core/_utils/cuda_utils.pyx index 867d066ce2..726f8b4aba 100644 --- a/cuda_core/cuda/core/_utils/cuda_utils.pyx +++ b/cuda_core/cuda/core/_utils/cuda_utils.pyx @@ -26,8 +26,15 @@ from cpython.buffer cimport PyObject_GetBuffer, PyBuffer_Release, Py_buffer, PyB from cuda.bindings cimport cynvrtc, cynvvm, cynvjitlink -from cuda.core._utils.driver_cu_result_explanations import DRIVER_CU_RESULT_EXPLANATIONS -from cuda.core._utils.runtime_cuda_error_explanations import RUNTIME_CUDA_ERROR_EXPLANATIONS +try: + from cuda.bindings._utils.driver_cu_result_explanations import DRIVER_CU_RESULT_EXPLANATIONS +except ModuleNotFoundError: + DRIVER_CU_RESULT_EXPLANATIONS = {} + +try: + from cuda.bindings._utils.runtime_cuda_error_explanations import RUNTIME_CUDA_ERROR_EXPLANATIONS +except ModuleNotFoundError: + RUNTIME_CUDA_ERROR_EXPLANATIONS = {} class CUDAError(Exception): diff --git a/cuda_core/tests/test_cuda_utils.py b/cuda_core/tests/test_cuda_utils.py index f218182766..59b6369815 100644 --- a/cuda_core/tests/test_cuda_utils.py +++ b/cuda_core/tests/test_cuda_utils.py @@ -11,42 +11,6 @@ from cuda.core._utils.clear_error_support import assert_type_str_or_bytes_like, raise_code_path_meant_to_be_unreachable -def test_driver_cu_result_explanations_health(): - expl_dict = cuda_utils.DRIVER_CU_RESULT_EXPLANATIONS - - # Ensure all CUresult enums are in expl_dict - known_codes = set() - for error in driver.CUresult: - code = int(error) - assert code in expl_dict - known_codes.add(code) - - from cuda.core._utils.version import binding_version - - if binding_version() >= (13, 0, 0): - # Ensure expl_dict has no codes not known as a CUresult enum - extra_expl = sorted(set(expl_dict.keys()) - known_codes) - assert not extra_expl - - -def test_runtime_cuda_error_explanations_health(): - expl_dict = cuda_utils.RUNTIME_CUDA_ERROR_EXPLANATIONS - - # Ensure all cudaError_t enums are in expl_dict - known_codes = set() - for error in runtime.cudaError_t: - code = int(error) - assert code in expl_dict - known_codes.add(code) - - from cuda.core._utils.version import binding_version - - if binding_version() >= (13, 0, 0): - # Ensure expl_dict has no codes not known as a cudaError_t enum - extra_expl = sorted(set(expl_dict.keys()) - known_codes) - assert not extra_expl - - def test_check_driver_error(): num_unexpected = 0 for error in driver.CUresult: