diff --git a/kernel_tuner/backends/cupy.py b/kernel_tuner/backends/cupy.py index 51613be7..6b0c19b0 100644 --- a/kernel_tuner/backends/cupy.py +++ b/kernel_tuner/backends/cupy.py @@ -10,8 +10,10 @@ # and run tests without cupy installed try: import cupy as cp + import cupyx except ImportError: cp = None + cupyx = None class CupyFunctions(GPUBackend): @@ -68,7 +70,7 @@ def __init__(self, device=0, iterations=7, compiler_options=None, observers=None # collect environment information env = dict() - cupy_info = str(cp._cupyx.get_runtime_info()).split("\n")[:-1] + cupy_info = str(cupyx.get_runtime_info()).split("\n")[:-1] info_dict = { s.split(":")[0].strip(): s.split(":")[1].strip() for s in cupy_info } diff --git a/test/test_cupy_functions.py b/test/test_cupy_functions.py index 4bb4d16f..9bd328dd 100644 --- a/test/test_cupy_functions.py +++ b/test/test_cupy_functions.py @@ -1,4 +1,11 @@ +import numpy as np + +try: + from unittest.mock import patch, Mock, MagicMock +except ImportError: + from mock import patch, Mock, MagicMock + import kernel_tuner from .context import skip_if_no_cupy @@ -10,3 +17,25 @@ def test_tune_kernel(env): result, _ = kernel_tuner.tune_kernel(*env, lang="cupy", verbose=True) assert len(result) > 0 + +@patch('kernel_tuner.backends.cupy.cupyx') +@patch('kernel_tuner.backends.cupy.cp') +def test_cupy_init_uses_cupyx_not_private_attr(cp_mock, cupyx_mock): + """Regression test: CupyFunctions should use cupyx.get_runtime_info(), not cp._cupyx.""" + # Setup cp mock + dev_mock = MagicMock() + dev_mock.attributes = {"MaxThreadsPerBlock": 1024} + dev_mock.compute_capability = "75" + cp_mock.cuda.Device.return_value = dev_mock + cp_mock.cuda.runtime.driverGetVersion.return_value = 11000 + + # Setup cupyx mock to return runtime info string + runtime_info = "CuPy Version : 14.0.1\nCUDA Root : /usr/local/cuda\nDevice 0 Name : Tesla T4\n" + cupyx_mock.get_runtime_info.return_value = runtime_info + + from kernel_tuner.backends.cupy import CupyFunctions + dev = CupyFunctions(device=0) + + # Verify cupyx.get_runtime_info() was called, not cp._cupyx.get_runtime_info() + cupyx_mock.get_runtime_info.assert_called_once() + assert dev.name == "Tesla T4"