Skip to content
Merged
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
23 changes: 3 additions & 20 deletions .github/workflows/build-wheel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -223,19 +223,14 @@ jobs:

- name: Build cuda.bindings wheel
if: ${{ env.BUILD_BINDINGS == 'true' }}
uses: pypa/cibuildwheel@4726cd35bb13f7bde50cf2761f2499ac7b3aa32c # v4.1.1
uses: pypa/cibuildwheel@e090b81e30c4d855ea63bf4b6e59204c09a101ae # v4.2.1
with:
package-dir: ./cuda_bindings/
output-dir: ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}
env:
CIBW_BUILD: ${{ env.CIBW_BUILD }}
CIBW_BEFORE_BUILD_LINUX: 'python -m pip install --upgrade "pip>=25.3"'
CIBW_BEFORE_BUILD_WINDOWS: 'python -m pip install --upgrade "pip>=25.3" delvewheel'
# TODO: remove cpython-prerelease once 3.15 is officially supported
# Allow CPython pre-release builds (currently 3.15 / 3.15t). This is a
# no-op for stable Python versions because CIBW_BUILD still filters
# the target version.
CIBW_ENABLE: cpython-prerelease
# CIBW mounts the host filesystem under /host
CIBW_ENVIRONMENT_LINUX: >
CUDA_PATH=/host/${{ env.CUDA_PATH }}
Expand Down Expand Up @@ -330,19 +325,14 @@ jobs:

- name: Build cuda.core wheel
if: ${{ env.BUILD_CORE == 'true' }}
uses: pypa/cibuildwheel@4726cd35bb13f7bde50cf2761f2499ac7b3aa32c # v4.1.1
uses: pypa/cibuildwheel@e090b81e30c4d855ea63bf4b6e59204c09a101ae # v4.2.1
with:
package-dir: ./cuda_core/
output-dir: ${{ env.CUDA_CORE_ARTIFACTS_DIR }}
env:
CIBW_BUILD: ${{ env.CIBW_BUILD }}
CIBW_BEFORE_BUILD_LINUX: 'python -m pip install --upgrade "pip>=25.3"'
CIBW_BEFORE_BUILD_WINDOWS: 'python -m pip install --upgrade "pip>=25.3" delvewheel'
# TODO: remove cpython-prerelease once 3.15 is officially supported
# Allow CPython pre-release builds (currently 3.15 / 3.15t). This is a
# no-op for stable Python versions because CIBW_BUILD still filters
# the target version.
CIBW_ENABLE: cpython-prerelease
# CIBW mounts the host filesystem under /host
CIBW_ENVIRONMENT_LINUX: >
CUDA_PATH=/host/${{ env.CUDA_PATH }}
Expand Down Expand Up @@ -459,8 +449,6 @@ jobs:
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.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') }}
Expand Down Expand Up @@ -624,19 +612,14 @@ jobs:

- name: Build cuda.core wheel
if: ${{ !inputs.single-cuda-major && env.BUILD_CORE == 'true' }}
uses: pypa/cibuildwheel@4726cd35bb13f7bde50cf2761f2499ac7b3aa32c # v4.1.1
uses: pypa/cibuildwheel@e090b81e30c4d855ea63bf4b6e59204c09a101ae # v4.2.1
with:
package-dir: ./cuda_core/
output-dir: ${{ env.CUDA_CORE_ARTIFACTS_DIR }}
env:
CIBW_BUILD: ${{ env.CIBW_BUILD }}
CIBW_BEFORE_BUILD_LINUX: 'python -m pip install --upgrade "pip>=25.3"'
CIBW_BEFORE_BUILD_WINDOWS: 'python -m pip install --upgrade "pip>=25.3" delvewheel'
# TODO: remove cpython-prerelease once 3.15 is officially supported
# Allow CPython pre-release builds (currently 3.15 / 3.15t). This is a
# no-op for stable Python versions because CIBW_BUILD still filters
# the target version.
CIBW_ENABLE: cpython-prerelease
# CIBW mounts the host filesystem under /host
CIBW_ENVIRONMENT_LINUX: >
CUDA_PATH=/host/${{ env.CUDA_PATH }}
Expand Down
4 changes: 0 additions & 4 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 @@ -324,8 +322,6 @@ jobs:
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.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') }}
env:
# we use self-hosted runners on which setup-python behaves weirdly (Python include can't be found)...
AGENT_TOOLSDIRECTORY: "/opt/hostedtoolcache"
Expand Down
4 changes: 0 additions & 4 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: Checkout ${{ github.event.repository.name }}
Expand Down Expand Up @@ -304,8 +302,6 @@ jobs:
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.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') &&
Expand Down
18 changes: 14 additions & 4 deletions ci/test-matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,17 @@ linux:
- { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '12.9.1', LOCAL_CTK: '1', GPU: 't4', GPU_COUNT: '1', DRIVER: 'latest' }
- { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '13.0.2', LOCAL_CTK: '1', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' }
- { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '13.3.0', LOCAL_CTK: '1', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' }
# No Python 3.15 test jobs on this release branch: the build uses CUDA 13.4.2
# while these jobs test on 13.3.0, so they install published cuda-bindings
# 13.3.x, which has no cp315 wheels. 1.2.1 ships no 3.15 wheels either.
# Python 3.15 jobs test against published cuda-bindings, like every other
# job on this branch. cuda-bindings 12.9.10 and 13.4.4 are the first
# releases with cp315 wheels. For these test versions, env-vars would select
# the bindings built in this run (13.4 matches the build version) or the
# 12.9.x branch's CI bindings (12.9). The ENV values below select the
# published 12.9.* or 13.4.* release instead, with the settings that
# env-vars uses for published bindings.
- { ARCH: 'amd64', PY_VER: '3.15', CUDA_VER: '12.9.1', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest', ENV: { BINDINGS_SOURCE: 'published', SKIP_CUDA_BINDINGS_TEST: '1', SKIP_CYTHON_TEST: '1' } }
- { ARCH: 'amd64', PY_VER: '3.15', CUDA_VER: '13.4.2', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest', ENV: { BINDINGS_SOURCE: 'published', SKIP_CUDA_BINDINGS_TEST: '1', SKIP_CYTHON_TEST: '1' } }
- { ARCH: 'amd64', PY_VER: '3.15t', CUDA_VER: '12.9.1', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest', ENV: { BINDINGS_SOURCE: 'published', SKIP_CUDA_BINDINGS_TEST: '1', SKIP_CYTHON_TEST: '1' } }
- { ARCH: 'amd64', PY_VER: '3.15t', CUDA_VER: '13.4.2', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest', ENV: { BINDINGS_SOURCE: 'published', SKIP_CUDA_BINDINGS_TEST: '1', SKIP_CYTHON_TEST: '1' } }
Comment on lines +62 to +72

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just to flag: is there anything like this we need to do on main? Or will be ok there?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I think we're okay without anything like this. On main, the bindings built in the same CI run are the right thing to test, and main's env-vars already selects them for its 13.4.2 jobs.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is what codex thinks (I didn't think this through myself):

  • CUDA 13 is already covered. Main has Python 3.15/3.15t jobs that select the bindings built in that CI run. Those should continue exercising the new bindings and Cython tests. Matrix
  • CUDA 12 lacks Python 3.15 runtime jobs. Add the corresponding Linux 3.15/3.15t and Windows 3.15 rows to main, without ENV overrides. Main automatically selects the 12.9.x CI artifacts and appropriate skip flags. Those Python versions are already built on that branch. Selection logic
  • Copying BINDINGS_SOURCE=published would be wrong on main. Main now uses main, backport, and floor; published would fall through to local-wheel handling despite skipping the artifact download. Installation logic

# linux-aarch64
- { ARCH: 'arm64', PY_VER: '3.10', CUDA_VER: '12.9.1', LOCAL_CTK: '1', GPU: 'a100', GPU_COUNT: '1', DRIVER: 'latest' }
- { ARCH: 'arm64', PY_VER: '3.10', CUDA_VER: '13.0.2', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest' }
Expand Down Expand Up @@ -135,7 +143,9 @@ windows:
- { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '12.9.1', LOCAL_CTK: '1', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest', DRIVER_MODE: 'TCC' }
- { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '13.0.2', LOCAL_CTK: '0', GPU: 'a100', GPU_COUNT: '1', DRIVER: 'latest', DRIVER_MODE: 'MCDM' }
- { ARCH: 'amd64', PY_VER: '3.14t', CUDA_VER: '13.3.0', LOCAL_CTK: '0', GPU: 'a100', GPU_COUNT: '1', DRIVER: 'latest', DRIVER_MODE: 'MCDM' }
# No Python 3.15 test job here either; see the linux-64 note above.
# Python 3.15 tests against published cuda-bindings; see the linux-64 note above.
- { ARCH: 'amd64', PY_VER: '3.15', CUDA_VER: '12.9.1', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest', DRIVER_MODE: 'MCDM', ENV: { BINDINGS_SOURCE: 'published', SKIP_CUDA_BINDINGS_TEST: '1', SKIP_CYTHON_TEST: '1' } }
- { ARCH: 'amd64', PY_VER: '3.15', CUDA_VER: '13.4.2', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest', DRIVER_MODE: 'MCDM', ENV: { BINDINGS_SOURCE: 'published', SKIP_CUDA_BINDINGS_TEST: '1', SKIP_CYTHON_TEST: '1' } }
# special runners
- { ARCH: 'amd64', PY_VER: '3.14', CUDA_VER: '13.3.0', LOCAL_CTK: '1', GPU: 't4', GPU_COUNT: '2', DRIVER: 'latest', DRIVER_MODE: 'TCC' }
- { ARCH: 'amd64', PY_VER: '3.14', CUDA_VER: '13.3.0', LOCAL_CTK: '0', GPU: 'h100', GPU_COUNT: '2', DRIVER: 'latest', DRIVER_MODE: 'MCDM' }
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
2 changes: 1 addition & 1 deletion cuda_core/docs/source/install.rst
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ dependencies are as follows:
.. [#f1] Including ``cuda-python``.


``cuda.core`` supports Python 3.10 - 3.14, on Linux (x86-64, arm64) and Windows (x86-64, arm64). Windows on ARM (arm64) wheels are provided for CUDA 13 only and for Python 3.11 and newer, and require ``cuda.bindings`` 13.4.1 or newer. **Experimental** free-threaded builds for Python 3.14 are also provided.
``cuda.core`` supports Python 3.10 - 3.15, on Linux (x86-64, arm64) and Windows (x86-64, arm64). Windows on ARM (arm64) wheels are provided for CUDA 13 only and for Python 3.11 and newer, and require ``cuda.bindings`` 13.4.1 or newer. Python 3.15 requires ``cuda.bindings`` 12.9.10 or newer for CUDA 12, or 13.4.4 or newer for CUDA 13, the first releases with Python 3.15 wheels. **Experimental** free-threaded builds for Python 3.14 and 3.15 are also provided.


Free-threading Build Support
Expand Down
15 changes: 15 additions & 0 deletions cuda_core/docs/source/release/1.2.2-notes.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
.. SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
.. SPDX-License-Identifier: Apache-2.0

.. currentmodule:: cuda.core

``cuda.core`` 1.2.2 Release Notes
=================================

New features
------------

- Added wheels for Python 3.15, including the experimental free-threaded
build. On Python 3.15, ``cuda.core`` requires ``cuda.bindings`` 12.9.10 or
newer for CUDA 12, or 13.4.4 or newer for CUDA 13, the first releases with
Python 3.15 wheels. Python 3.10 remains supported.
2 changes: 1 addition & 1 deletion cuda_core/docs/source/support.rst
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Python Version Support
----------------------

``cuda.core`` supports all Python versions following the `CPython EOL schedule
<https://devguide.python.org/versions/>`_. As of writing, Python 3.10 – 3.14 are supported.
<https://devguide.python.org/versions/>`_. As of writing, Python 3.10 – 3.15 are supported.

When a new Python feature version is released and the oldest supported version reaches EOL,
``cuda.core`` will bump its minor version accordingly.
Expand Down
1 change: 1 addition & 0 deletions cuda_core/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,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
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,7 @@ class DescriptorSpec:
packaged_with="ctk",
linux_sonames=("libcupti.so.13", "libcupti.so.12"),
windows_dlls=(
"cupti64_2026.3.1.dll",
"cupti64_2026.3.0.dll",
"cupti64_2026.2.1.dll",
"cupti64_2026.2.0.dll",
Expand Down Expand Up @@ -480,7 +481,7 @@ class DescriptorSpec:
name="cusparseLt",
packaged_with="other",
linux_sonames=("libcusparseLt.so.0",),
windows_dlls=("cusparseLt.dll",),
windows_dlls=("cusparseLt_13.dll", "cusparseLt.dll"),
supported_windows_arch=("x64", "arm64"),
site_packages_linux=("nvidia/cu13/lib", "nvidia/cusparselt/lib"),
site_packages_windows=WindowsSearchDirs(
Expand Down
Loading