From 252f5c2acd5487730158a96dcbbda2ff33d8fd15 Mon Sep 17 00:00:00 2001 From: Jinfeng Date: Thu, 5 Nov 2026 20:29:05 +0000 Subject: [PATCH] [no-ci] fix(driver): correct cuLogs* introduced version to 12.9 in cuda_bindings_12 Apply the changes from #2978 to cuda_bindings_12/ on main: pin the cuGetProcAddress_v2 version for cuLogs* to 12090 (was 12080) and add a regression test. This fixes the cuLogs* FunctionNotFoundError. Matches the 12.9.x backport in #3377. Co-Authored-By: Claude Sonnet 5.5 --- .../cuda/bindings/_internal/driver_linux.pyx | 12 +++---- .../bindings/_internal/driver_windows.pyx | 12 +++---- cuda_bindings_12/tests/test_cuda.py | 36 +++++++++++++++++++ 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/cuda_bindings_12/cuda/bindings/_internal/driver_linux.pyx b/cuda_bindings_12/cuda/bindings/_internal/driver_linux.pyx index 34c448c5cc5..f2234b4d3b6 100644 --- a/cuda_bindings_12/cuda/bindings/_internal/driver_linux.pyx +++ b/cuda_bindings_12/cuda/bindings/_internal/driver_linux.pyx @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated with version 12.9.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=c4957d188c7c3258823fd50e2eb0cba162810911af7294ab726f1e49769642c8 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=d382464130e581b718a589e652053c30057e65ddc824b2c79a903341858f1e88 # <<<< PREAMBLE CONTENT >>>> @@ -1894,19 +1894,19 @@ cdef int _init_driver() except -1 nogil: cuGetProcAddress_v2('cuGreenCtxStreamCreate', &__cuGreenCtxStreamCreate, 12050, ptds_mode, NULL) global __cuLogsRegisterCallback - cuGetProcAddress_v2('cuLogsRegisterCallback', &__cuLogsRegisterCallback, 12080, ptds_mode, NULL) + cuGetProcAddress_v2('cuLogsRegisterCallback', &__cuLogsRegisterCallback, 12090, ptds_mode, NULL) global __cuLogsUnregisterCallback - cuGetProcAddress_v2('cuLogsUnregisterCallback', &__cuLogsUnregisterCallback, 12080, ptds_mode, NULL) + cuGetProcAddress_v2('cuLogsUnregisterCallback', &__cuLogsUnregisterCallback, 12090, ptds_mode, NULL) global __cuLogsCurrent - cuGetProcAddress_v2('cuLogsCurrent', &__cuLogsCurrent, 12080, ptds_mode, NULL) + cuGetProcAddress_v2('cuLogsCurrent', &__cuLogsCurrent, 12090, ptds_mode, NULL) global __cuLogsDumpToFile - cuGetProcAddress_v2('cuLogsDumpToFile', &__cuLogsDumpToFile, 12080, ptds_mode, NULL) + cuGetProcAddress_v2('cuLogsDumpToFile', &__cuLogsDumpToFile, 12090, ptds_mode, NULL) global __cuLogsDumpToMemory - cuGetProcAddress_v2('cuLogsDumpToMemory', &__cuLogsDumpToMemory, 12080, ptds_mode, NULL) + cuGetProcAddress_v2('cuLogsDumpToMemory', &__cuLogsDumpToMemory, 12090, ptds_mode, NULL) global __cuCheckpointProcessGetRestoreThreadId cuGetProcAddress_v2('cuCheckpointProcessGetRestoreThreadId', &__cuCheckpointProcessGetRestoreThreadId, 12080, ptds_mode, NULL) diff --git a/cuda_bindings_12/cuda/bindings/_internal/driver_windows.pyx b/cuda_bindings_12/cuda/bindings/_internal/driver_windows.pyx index 02669fc2bc7..fe3b6976886 100644 --- a/cuda_bindings_12/cuda/bindings/_internal/driver_windows.pyx +++ b/cuda_bindings_12/cuda/bindings/_internal/driver_windows.pyx @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated with version 12.9.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=d36a59b7d4c8939f88b07a4600cbd4251a2ed69571b425bb6009a626cfd4dc3e +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=895c345db6512915d2c6c9f27757175413ce053e7356b6eeb890478159cdc918 # <<<< PREAMBLE CONTENT >>>> @@ -1897,19 +1897,19 @@ cdef int _init_driver() except -1 nogil: cuGetProcAddress_v2('cuGreenCtxStreamCreate', &__cuGreenCtxStreamCreate, 12050, ptds_mode, NULL) global __cuLogsRegisterCallback - cuGetProcAddress_v2('cuLogsRegisterCallback', &__cuLogsRegisterCallback, 12080, ptds_mode, NULL) + cuGetProcAddress_v2('cuLogsRegisterCallback', &__cuLogsRegisterCallback, 12090, ptds_mode, NULL) global __cuLogsUnregisterCallback - cuGetProcAddress_v2('cuLogsUnregisterCallback', &__cuLogsUnregisterCallback, 12080, ptds_mode, NULL) + cuGetProcAddress_v2('cuLogsUnregisterCallback', &__cuLogsUnregisterCallback, 12090, ptds_mode, NULL) global __cuLogsCurrent - cuGetProcAddress_v2('cuLogsCurrent', &__cuLogsCurrent, 12080, ptds_mode, NULL) + cuGetProcAddress_v2('cuLogsCurrent', &__cuLogsCurrent, 12090, ptds_mode, NULL) global __cuLogsDumpToFile - cuGetProcAddress_v2('cuLogsDumpToFile', &__cuLogsDumpToFile, 12080, ptds_mode, NULL) + cuGetProcAddress_v2('cuLogsDumpToFile', &__cuLogsDumpToFile, 12090, ptds_mode, NULL) global __cuLogsDumpToMemory - cuGetProcAddress_v2('cuLogsDumpToMemory', &__cuLogsDumpToMemory, 12080, ptds_mode, NULL) + cuGetProcAddress_v2('cuLogsDumpToMemory', &__cuLogsDumpToMemory, 12090, ptds_mode, NULL) global __cuCheckpointProcessGetRestoreThreadId cuGetProcAddress_v2('cuCheckpointProcessGetRestoreThreadId', &__cuCheckpointProcessGetRestoreThreadId, 12080, ptds_mode, NULL) diff --git a/cuda_bindings_12/tests/test_cuda.py b/cuda_bindings_12/tests/test_cuda.py index 09a77646b6f..a03844a2b84 100644 --- a/cuda_bindings_12/tests/test_cuda.py +++ b/cuda_bindings_12/tests/test_cuda.py @@ -2,8 +2,10 @@ # SPDX-License-Identifier: Apache-2.0 import ctypes +import os import platform import shutil +import tempfile import textwrap import numpy as np @@ -11,6 +13,7 @@ import cuda.cuda as cuda from cuda.bindings import driver +from cuda.bindings._internal.utils import FunctionNotFoundError from cuda_python_test_helpers import driver_version_less_than from cuda_python_test_helpers.memory import ( POOL_SIZE, @@ -1153,6 +1156,39 @@ def test_cuCheckpointProcessGetState_failure(): assert state is None +@pytest.mark.skipif( + driver_version_less_than(12090), + reason="cuLogs* functions were introduced in CUDA 12.9", +) +def test_culogs_functions(): + try: + err, callback_handle = cuda.cuLogsRegisterCallback(0, None) + assert err == cuda.CUresult.CUDA_SUCCESS + + err, _ = cuda.cuLogsCurrent(0) + assert err == cuda.CUresult.CUDA_SUCCESS + + with tempfile.NamedTemporaryFile(delete=False) as f: + log_path = f.name + try: + err, _ = cuda.cuLogsDumpToFile(None, log_path.encode(), 0) + assert err == cuda.CUresult.CUDA_SUCCESS + finally: + os.remove(log_path) + + # cuLogsDumpToMemory's own docstring states the driver's internal log + # buffer is capped at 25600 bytes, so a buffer of that size is always + # large enough to hold the dump without risking a buffer overrun. + buf = bytearray(25600) + err, _, _ = cuda.cuLogsDumpToMemory(None, buf, len(buf), 0) + assert err == cuda.CUresult.CUDA_SUCCESS + + (err,) = cuda.cuLogsUnregisterCallback(callback_handle) + assert err == cuda.CUresult.CUDA_SUCCESS + except FunctionNotFoundError as e: + pytest.fail(f"cuLogs* function unexpectedly not found on the driver: {e}") + + def test_private_function_pointer_inspector(): from cuda.bindings._internal.driver import _inspect_function_pointer