Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/actions/check-doc-links/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ inputs:
description: "check allows up to 10 rate-limited URLs; cache-warm warns on all link failures"
default: check

# Callers provide Python 3.10+ on PATH; the helpers use only its standard library.
# Callers provide Python 3.11+ on PATH; the helpers use only its standard library.
runs:
using: composite
steps:
Expand Down
9 changes: 1 addition & 8 deletions .github/workflows/build-wheel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -442,14 +442,7 @@ jobs:
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: ${{ matrix.python-version }}
# TODO: remove allow-prereleases once 3.15 is officially supported
allow-prereleases: ${{ startsWith(matrix.python-version, '3.15') }}

- name: Enable Scientific Python Nightly Wheels for Python 3.15
if: ${{ (env.TEST_BINDINGS == 'true' || env.TEST_CORE == 'true') && startsWith(matrix.python-version, '3.15') }}
run: |
echo "PIP_EXTRA_INDEX_URL=https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" >> "$GITHUB_ENV"
echo "PIP_ONLY_BINARY=numpy" >> "$GITHUB_ENV"
allow-prereleases: ${{ startsWith(matrix.python-version, '3.16') }}

- name: verify free-threaded build
if: ${{ (env.TEST_BINDINGS == 'true' || env.TEST_CORE == 'true') && endsWith(matrix.python-version, 't') }}
Expand Down
12 changes: 1 addition & 11 deletions .github/workflows/test-wheel-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,6 @@ jobs:
fail-fast: false
matrix: ${{ fromJSON(needs.compute-matrix.outputs.MATRIX) }}
runs-on: "${{ matrix.FLAVOR || 'linux' }}-${{ matrix.ARCH }}-gpu-${{ matrix.GPU }}-${{ matrix.RUNNER_DRIVER }}-${{ matrix.GPU_COUNT }}"
# TODO: remove continue-on-error once 3.15 is officially supported
continue-on-error: ${{ startsWith(matrix.PY_VER, '3.15') }}
# The build stage could fail but we want the CI to keep moving.
if: ${{ github.repository_owner == 'nvidia' && !cancelled() }}
# Our self-hosted runners require a container
Expand Down Expand Up @@ -329,19 +327,11 @@ jobs:
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: ${{ matrix.PY_VER }}
# TODO: remove allow-prereleases once 3.15 is officially supported
allow-prereleases: ${{ startsWith(matrix.PY_VER, '3.15') }}
allow-prereleases: ${{ startsWith(matrix.PY_VER, '3.16') }}
env:
# we use self-hosted runners on which setup-python behaves weirdly (Python include can't be found)...
AGENT_TOOLSDIRECTORY: "/opt/hostedtoolcache"

- name: Enable Scientific Python Nightly Wheels for Python 3.15
if: ${{ (env.TEST_BINDINGS == 'true' || env.TEST_CORE == 'true' || env.TEST_PYTHON == 'true') &&
startsWith(matrix.PY_VER, '3.15') }}
run: |
echo "PIP_EXTRA_INDEX_URL=https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" >> "$GITHUB_ENV"
echo "PIP_ONLY_BINARY=numpy" >> "$GITHUB_ENV"

- name: Set up mini CTK
if: ${{ matrix.LOCAL_CTK == '1' }}
uses: ./.github/actions/fetch_ctk
Expand Down
13 changes: 1 addition & 12 deletions .github/workflows/test-wheel-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,6 @@ jobs:
fail-fast: false
matrix: ${{ fromJSON(needs.compute-matrix.outputs.MATRIX) }}
if: ${{ github.repository_owner == 'nvidia' && !cancelled() }}
# TODO: remove continue-on-error once 3.15 is officially supported
continue-on-error: ${{ startsWith(matrix.PY_VER, '3.15') }}
runs-on: "windows-${{ matrix.ARCH }}-gpu-${{ matrix.GPU }}-${{ matrix.RUNNER_DRIVER }}-${{ matrix.GPU_COUNT }}"
steps:
- name: Enable Git symlinks (Windows, must precede checkout)
Expand Down Expand Up @@ -311,16 +309,7 @@ jobs:
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: ${{ matrix.PY_VER }}
# TODO: remove allow-prereleases once 3.15 is officially supported
allow-prereleases: ${{ startsWith(matrix.PY_VER, '3.15') }}

- name: Enable Scientific Python Nightly Wheels for Python 3.15
if: ${{ (env.TEST_BINDINGS == 'true' || env.TEST_CORE == 'true' || env.TEST_PYTHON == 'true') &&
startsWith(matrix.PY_VER, '3.15') }}
shell: bash --noprofile --norc -xeuo pipefail {0}
run: |
echo "PIP_EXTRA_INDEX_URL=https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" >> "$GITHUB_ENV"
echo "PIP_ONLY_BINARY=numpy" >> "$GITHUB_ENV"
allow-prereleases: ${{ startsWith(matrix.PY_VER, '3.16') }}

- name: Verify LongPathsEnabled
run: |
Expand Down
2 changes: 1 addition & 1 deletion ci/ci-pipeline.mmd
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ flowchart TB
direction LR
B1["linux-64<br/>(Self-hosted)"] ~~~ B2["linux-aarch64<br/>(Self-hosted)"] ~~~ B3["win-64<br/>(GitHub-hosted)"]
end
BUILD_DETAILS["Python versions: 3.10, 3.11, 3.12, 3.13, 3.14<br/>CUDA version: 13.0.0 (build-time)<br/>Components: cuda-core, cuda-bindings,<br/>cuda-pathfinder, cuda-python"]
BUILD_DETAILS["Python versions: 3.11, 3.12, 3.13, 3.14, 3.15<br/>CUDA version: 13.0.0 (build-time)<br/>Components: cuda-core, cuda-bindings,<br/>cuda-pathfinder, cuda-python"]
end

subgraph ARTIFACTS["ARTIFACT STORAGE"]
Expand Down
9 changes: 1 addition & 8 deletions ci/tools/download-wheels
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env bash

# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0

Expand Down Expand Up @@ -56,13 +56,6 @@ do
continue
fi

# TODO: remove the Python 3.15 exclusion once 3.15 is officially supported
# exclude pre-release Python (3.15) wheels from releasing
if [[ "${p}" == *python315* ]]; then
echo "Skipping pre-release Python artifact: $p"
continue
fi

# If we're not downloading "all", only process matching component
if [[ "$COMPONENT" != "all" && "$p" != ${COMPONENT}* ]]; then
continue
Expand Down
1 change: 0 additions & 1 deletion cuda_bindings/pixi.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ pytest-repeat = "*"
pyglet = ">=2.1.9"
numpy = "*"
packaging = "*"
tomli = "*"
matplotlib = "*"

[feature.test.pypi-dependencies]
Expand Down
2 changes: 1 addition & 1 deletion cuda_bindings/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ classifiers = [
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python :: 3.15",
"Environment :: GPU :: NVIDIA CUDA",
]
dynamic = ["version", "readme"]
Expand Down Expand Up @@ -54,7 +55,6 @@ test = [
"pytest-github-actions-annotate-failures==0.4.2",
"pyglet==2.1.14",
"packaging>=24",
"tomli>=2; python_version < '3.11'",
]
test-ft = [
"pytest-run-parallel==0.10.0",
Expand Down
4 changes: 2 additions & 2 deletions cuda_core/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,8 @@ below are for contributors. Reviewers and agents should flag violations.
lock, and when a lock must stay held call `p_`, keep the status, and report
after the lock is released (`deviceptr_import_ipc` is the model).
- **Rollback failure**: the original exception propagates; the failed rollback
is attached to it with `attach_rollback_failure()` (a PEP 678 note on
Python 3.11+, reported out-of-band on 3.10), or chained with
is attached to it with `attach_rollback_failure()` (a PEP 678 note),
or chained with
`raise ... from` when a second exception must be raised. Catching everything
(bare `except:` or `except BaseException:`) is acceptable only for
rollback-then-`raise` blocks, where the rollback must also run for
Expand Down
5 changes: 2 additions & 3 deletions cuda_core/cuda/core/_cpp/rt/DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -388,8 +388,7 @@ observes the caller's context. When restoration fails after the operation
succeeded, the creation is undone and the restoration status is returned. When both fail, the
operation status is returned. Either way the helper records a thread-local
detail keyed to the returned status (`take_last_error_detail(status)`) that
`_check_driver_error` attaches to the raised `CUDAError` as a PEP 678 note
(appended to the message on Python 3.10), so the user learns that the caller's
`_check_driver_error` attaches to the raised `CUDAError` as a PEP 678 note, so the user learns that the caller's
context was not restored, which context is current and, for a double failure,
why restoration failed. Keying the detail to its status narrows, but does not
remove, misattribution: a caller that drops the status (an empty handle raised
Expand Down Expand Up @@ -428,7 +427,7 @@ exactly one of these; none is ever dropped.
| Cython, on a path that can raise | `HANDLE_RETURN(status)` | Raises `CUDAError`. A restoration detail recorded by the C++ helper becomes a note on the exception. |
| Cython, after a handle constructor returned an empty handle | `HANDLE_RETURN(get_last_error())`, immediately | Same. Transitional: #2760 makes constructors return the status instead. |
| C++, a helper that runs an operation in another context | Return the `CUresult`; `exit_context` records the restoration detail | Cython raises it. Transitional: #2760 returns the restoration status as a second out-parameter. |
| Cython, inside an `except` block whose rollback failed | `attach_rollback_failure(op, status, detail)` | Adds a note to the exception being handled. Reports instead if nothing is being handled or notes do not exist (Python 3.10). |
| Cython, inside an `except` block whose rollback failed | `attach_rollback_failure(op, status, detail)` | Adds a note to the exception being handled. Reports instead if nothing is being handled. |
| C++, a deleter or deferred cleanup | A `pw_*` wrapper, or `report_cuda_error()` / `report_message()` | Emits `CUDAWarning`. Never raises. |
| Cython or Python, a `__dealloc__` or destructor-path callback | `warnings.warn(msg, CUDAWarning, stacklevel=2)` | Same. |
| A CUDA callback thread | Nothing that needs the GIL. Hand the work to the deferred-cleanup queue with `Py_AddPendingCall` | CUDA forbids driver calls there, and acquiring the GIL there can deadlock with a GIL holder blocked in a driver call. GIL-free C API that only schedules work is fine. |
Expand Down
2 changes: 1 addition & 1 deletion cuda_core/cuda/core/_memory/_copy_enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

import dataclasses
from collections.abc import Sequence
from enum import StrEnum

from cuda.core._device import Device
from cuda.core._host import Host
from cuda.core._utils.cuda_utils import driver
from cuda.core._utils.pycompat import StrEnum

__all__ = ["CopyOptions", "MemcpyOverlapMode", "MemcpySrcAccessOrder"]

Expand Down
9 changes: 2 additions & 7 deletions cuda_core/cuda/core/_utils/cuda_utils.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -167,13 +167,8 @@ cdef object _NVRTC_SUCCESS = nvrtc.nvrtcResult.NVRTC_SUCCESS


cdef inline void _attach_detail(exc, str detail):
# PEP 678 notes (Python 3.11+) keep the detail separable from the message;
# older interpreters get it appended to the message instead.
add_note = getattr(exc, "add_note", None)
if add_note is not None:
add_note(detail)
else:
exc.args = (f"{exc.args[0]} ({detail})", *exc.args[1:])
# PEP 678 notes keep the detail separable from the message.
exc.add_note(detail)


cpdef inline int _check_driver_error(cydriver.CUresult error) except?-1 nogil:
Expand Down
3 changes: 1 addition & 2 deletions cuda_core/cuda/core/_utils/pycompat.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@
"""

import sys
from enum import StrEnum

__all__ = ["BufferProtocol", "StrEnum"]
__all__ = ["BufferProtocol"]


if sys.version_info >= (3, 12):
Expand Down
3 changes: 2 additions & 1 deletion cuda_core/cuda/core/system/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
#
# SPDX-License-Identifier: Apache-2.0

from enum import StrEnum

from cuda.bindings import nvml as _nvml
from cuda.bindings._internal._fast_enum import FastEnum as _FastEnum
from cuda.core._utils.pycompat import StrEnum

__all__ = [
"AddressingMode",
Expand Down
5 changes: 0 additions & 5 deletions cuda_core/pixi.toml
Original file line number Diff line number Diff line change
Expand Up @@ -292,11 +292,6 @@ cuda-version = "*"
numpy = "*"
cuda-bindings = "*"
cuda-pathfinder = "*"
# Conda-forge ships per-Python variants of backports.strenum (real impl on
# <3.11, no-op stub on >=3.12); pixi-build doesn't accept PEP 508-style
# `python_version` selectors in [package.target.<X>], so list it
# unconditionally and let the solver pick the right variant.
"backports.strenum" = "*"

[target.linux.tasks.build-cython-tests]
cmd = ["$PIXI_PROJECT_ROOT/tests/cython/build_tests.sh"]
Expand Down
4 changes: 2 additions & 2 deletions cuda_core/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ classifiers = [
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python :: 3.15",
"Programming Language :: Python :: Implementation :: CPython",
"Environment :: GPU :: NVIDIA CUDA",
"Environment :: GPU :: NVIDIA CUDA :: 12",
Expand Down Expand Up @@ -78,8 +79,7 @@ test = [
"docutils==0.23",
# Required by tests/test_graphics.py; pinned to match cuda_bindings.
"pyglet==2.1.14",
# TODO: remove the Python 3.15 guard once 3.15 is officially supported
"cffi==2.0.0; python_version < '3.15'",
"cffi==2.0.0",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🔎 Supported by static analysis

🏁 Script executed:

set -eu
printf '%s\n' '--- pyproject dependency context ---'
nl -ba cuda_core/pyproject.toml | sed -n '1,125p'
printf '%s\n' '--- Python 3.15 and cffi references ---'
rg -n -F --glob '!**/.git/**' -e '3.15' -e 'cffi' . || test "$?" -eq 1
printf '%s\n' '--- diff against supplied merge base ---'
git diff --unified=20 1cd41eabda2bc83e76cbf32ee82495352d08417c 189ae81a2ea6a1272342bb2490cd08084b3dc5c1 -- cuda_core/pyproject.toml

Repository: NVIDIA/cuda-python

Length of output: 24480


🌐 Web query:

official CFFI 2.0.0 Python 3.15 support release documentation

💡 Result:

**CFFI 2.0.0 does not list Python 3.15 support.** Its official release notes say it supports Python 3.14 and free-threaded Python; Python 3.15 support was added in **CFFI 2.1.0**. ([cffi.readthedocs.io](https://cffi.readthedocs.io/en/latest/whatsnew.html))

Official documentation: the [CFFI “What’s New” release notes](https://cffi.readthedocs.io/en/latest/whatsnew.html). The current docs say CFFI is tested with Python 3.10–3.15, but that describes the newer documentation version—not 2.0.0. ([cffi.readthedocs.io](https://cffi.readthedocs.io/en/stable/installation.html))

Citations:

- 1: https://cffi.readthedocs.io/en/latest/whatsnew.html
- 2: https://cffi.readthedocs.io/en/stable/installation.html

important: Use a Python 3.15-compatible CFFI pin.

The test group applies cffi==2.0.0 to the Python 3.15 environments. CFFI 2.0.0 supports Python 3.14, but Python 3.15 support starts with CFFI 2.1.0. The current pin can make dependency installation or CFFI-based tests fail.

Suggested fix
--- "a/cuda_core/pyproject.toml"
+++ "b/cuda_core/pyproject.toml"
@@ -79,7 +79,7 @@
     "docutils==0.23",
     # Required by tests/test_graphics.py; pinned to match cuda_bindings.
     "pyglet==2.1.14",
-    "cffi==2.0.0",
+    "cffi==2.1.0",
 ]
 # TODO: drop the Windows 3.15 guard once ml-dtypes publishes cp315 Windows wheels
 ml-dtypes = ["ml-dtypes>=0.5.4,<0.6.0; sys_platform != 'win32' or python_version < '3.15'"]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"cffi==2.0.0",
"cffi==2.1.0",

]
# TODO: drop the Windows 3.15 guard once ml-dtypes publishes cp315 Windows wheels
ml-dtypes = ["ml-dtypes>=0.5.4,<0.6.0; sys_platform != 'win32' or python_version < '3.15'"]
Expand Down
18 changes: 5 additions & 13 deletions cuda_core/tests/graph/test_graph_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
"""GraphBuilder stream capture tests."""

import gc
import sys
import time
import weakref

Expand Down Expand Up @@ -273,26 +272,19 @@ def test_graph_join_failure_survives_failing_close(init_cuda):
Joining a builder from another capture is refused by the driver, which
also invalidates that capture, so closing it afterwards fails. The cleanup
must still close the remaining builders and raise the join error; the
failed close is attached to it as a note (Python 3.11+) or reported as a
CUDAWarning (Python 3.10).
failed close is attached to it as a note.
"""
has_notes = sys.version_info >= (3, 11)
root = Device().create_graph_builder().begin_building()
root, fork = root.split(2)
other1 = Device().create_graph_builder().begin_building()
other2 = Device().create_graph_builder().begin_building()

with pytest.raises(CUDAError, match="^CUDA_ERROR_STREAM_CAPTURE_MERGE") as excinfo:
if has_notes:
GraphBuilder.join(root, other1, other2, fork)
else:
with pytest.warns(CUDAWarning, match="CUDA_ERROR_STREAM_CAPTURE_INVALIDATED"):
GraphBuilder.join(root, other1, other2, fork)
GraphBuilder.join(root, other1, other2, fork)
assert other1.is_closed and other2.is_closed and fork.is_closed
if has_notes:
(note,) = excinfo.value.__notes__
assert "cuStreamEndCapture failed while closing a graph builder" in note
assert "CUDA_ERROR_STREAM_CAPTURE_INVALIDATED" in note
(note,) = excinfo.value.__notes__
assert "cuStreamEndCapture failed while closing a graph builder" in note
assert "CUDA_ERROR_STREAM_CAPTURE_INVALIDATED" in note

# The refused wait invalidated the root's capture as well; ending it
# raises the driver error and the builder still closes cleanly.
Expand Down
2 changes: 0 additions & 2 deletions cuda_core/tests/test_enum_coverage.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
# compatible cuda.bindings version.

import inspect
import sys
from enum import StrEnum
from typing import Any

Expand Down Expand Up @@ -387,7 +386,6 @@ def test_wrapper_covers_all_binding_members(binding, str_enum, mapping, binding_
)


@pytest.mark.skipif(sys.version_info < (3, 11), reason="Requires Python 3.11+ for StrEnum")
@pytest.mark.parametrize(
"module",
_MODULES,
Expand Down
29 changes: 8 additions & 21 deletions cuda_core/tests/test_error_handling.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
"""

import ctypes
import sys
import warnings
from contextlib import contextmanager

Expand Down Expand Up @@ -43,9 +42,6 @@
INVALID_VALUE = int(driver.CUresult.CUDA_ERROR_INVALID_VALUE)
DEINITIALIZED = int(driver.CUresult.CUDA_ERROR_DEINITIALIZED)

# PEP 678 exception notes; on 3.10 the same information lands in the message.
HAS_NOTES = sys.version_info >= (3, 11)

thread_unsafe_context_fault = pytest.mark.thread_unsafe(
reason="injects a thread-local restoration fault and mutates the CUDA context stack"
)
Expand Down Expand Up @@ -101,10 +97,9 @@ def test_create_stream_raises_when_context_cannot_be_restored(init_cuda):
assert "could not be restored" in text
assert "CUDA_ERROR_INVALID_CONTEXT" in text
assert "Device.set_current()" in text
if HAS_NOTES:
# The explanation is a note, separable from the driver error message.
assert "could not be restored" not in str(excinfo.value)
assert any("could not be restored" in note for note in excinfo.value.__notes__)
# The explanation is a note, separable from the driver error message.
assert "could not be restored" not in str(excinfo.value)
assert any("could not be restored" in note for note in excinfo.value.__notes__)
# As documented, a failed restoration leaves the device's context current.
assert current_context_handle() == int(dev.context.handle)
assert current_context_handle() == int(dev.context.handle)
Expand Down Expand Up @@ -303,28 +298,20 @@ def as_bytes(buffer):
@pytest.mark.agent_authored(model="claude-fable-5-1")
def test_rollback_failure_is_attached_to_the_propagating_exception():
"""A failed rollback inside an except block becomes a note on the exception being
handled (Python 3.11+); on 3.10, or with no exception being handled, it is reported
as a CUDAWarning. CUDA_ERROR_DEINITIALIZED is neither attached nor reported."""
handled; with no exception being handled, it is reported as a CUDAWarning. CUDA_ERROR_DEINITIALIZED is neither attached nor reported."""
with pytest.raises(RuntimeError) as excinfo:
try:
raise RuntimeError("primary failure")
except RuntimeError:
if HAS_NOTES:
with assert_no_cuda_warning():
_attach_rollback_failure_for_testing(INVALID_VALUE)
else:
with pytest.warns(CUDAWarning, match="cuTestOperation failed while testing"):
_attach_rollback_failure_for_testing(INVALID_VALUE)
with assert_no_cuda_warning():
_attach_rollback_failure_for_testing(INVALID_VALUE)
with assert_no_cuda_warning():
_attach_rollback_failure_for_testing(DEINITIALIZED)
raise
exc = excinfo.value
assert str(exc) == "primary failure"
if HAS_NOTES:
assert len(exc.__notes__) == 1
assert "cuTestOperation failed while testing: CUDA_ERROR_INVALID_VALUE" in exc.__notes__[0]
else:
assert not hasattr(exc, "__notes__")
assert len(exc.__notes__) == 1
assert "cuTestOperation failed while testing: CUDA_ERROR_INVALID_VALUE" in exc.__notes__[0]
# With no exception being handled there is nothing to attach to.
with pytest.warns(CUDAWarning, match="cuTestOperation failed while testing"):
_attach_rollback_failure_for_testing(INVALID_VALUE)
3 changes: 1 addition & 2 deletions cuda_pathfinder/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,7 @@ cu13 = [
"nvidia-nvshmem-cu13<3.7; sys_platform != 'win32'",
]
host = [
# TODO: remove the Python 3.15 guard once 3.15 is officially supported
"nvidia-cutlass; python_version < '3.15'",
"nvidia-cutlass",
"nvpl-fft; platform_system == 'Linux' and platform_machine == 'aarch64'",
]

Expand Down
Loading
Loading