From 7a687adcb54ebf31c7b8700c07059f5bca1be1f0 Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Mon, 31 Aug 2026 11:53:47 -0700 Subject: [PATCH 1/3] fix(cuda.pathfinder): discover ptxas from NVIDIA wheels --- .../cuda/pathfinder/_binaries/supported_nvidia_binaries.py | 1 + cuda_pathfinder/tests/test_find_nvidia_binaries.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cuda_pathfinder/cuda/pathfinder/_binaries/supported_nvidia_binaries.py b/cuda_pathfinder/cuda/pathfinder/_binaries/supported_nvidia_binaries.py index 78621b63e8b..9839c03de3e 100644 --- a/cuda_pathfinder/cuda/pathfinder/_binaries/supported_nvidia_binaries.py +++ b/cuda_pathfinder/cuda/pathfinder/_binaries/supported_nvidia_binaries.py @@ -13,6 +13,7 @@ SITE_PACKAGES_BINDIRS = { # Core compilation tools "nvcc": (_CUDA13_BIN, _CUDA_NVCC_BIN), + "ptxas": (_CUDA13_BIN, _CUDA_NVCC_BIN), "nvdisasm": (_CUDA13_BIN, _CUDA_NVCC_BIN), "cuobjdump": (_CUDA13_BIN, _CUDA_NVCC_BIN), "nvprune": (_CUDA_NVCC_BIN,), diff --git a/cuda_pathfinder/tests/test_find_nvidia_binaries.py b/cuda_pathfinder/tests/test_find_nvidia_binaries.py index 8979d8cb1e1..1fc9cb29906 100644 --- a/cuda_pathfinder/tests/test_find_nvidia_binaries.py +++ b/cuda_pathfinder/tests/test_find_nvidia_binaries.py @@ -16,7 +16,7 @@ ) CUDA13_WHEEL_BINARIES = frozenset( - ("nvcc", "nvdisasm", "cuobjdump", "fatbinary", "bin2c", "nvlink", "compute-sanitizer") + ("nvcc", "ptxas", "nvdisasm", "cuobjdump", "fatbinary", "bin2c", "nvlink", "compute-sanitizer") ) @@ -40,7 +40,7 @@ def test_supported_binaries_consistency(): @pytest.mark.agent_authored(model="claude-opus-5") def test_cuda13_wheel_layout_is_declared_and_preferred(): - """Every utility shipped in nvidia/cu13/bin must declare that layout first. + """Every supported utility shipped in nvidia/cu13/bin must declare that layout first. Omitting it makes the site-packages search step skip an installed CUDA 13 wheel entirely, which is only visible on hosts without a local CTK to fall From 3527cdf41215302255fb82aa757b6e9fd8b716af Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Mon, 31 Aug 2026 12:02:00 -0700 Subject: [PATCH 2/3] test(cuda.pathfinder): add pytest-run-parallel dependency --- cuda_pathfinder/pixi.lock | 20 ++++++++++++++++++++ cuda_pathfinder/pixi.toml | 1 + cuda_pathfinder/pyproject.toml | 1 + 3 files changed, 22 insertions(+) diff --git a/cuda_pathfinder/pixi.lock b/cuda_pathfinder/pixi.lock index bc46282b4ad..d621d6a9d22 100644 --- a/cuda_pathfinder/pixi.lock +++ b/cuda_pathfinder/pixi.lock @@ -98,6 +98,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-3.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-run-parallel-0.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -136,6 +137,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-3.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-run-parallel-0.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -156,6 +158,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-3.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-run-parallel-0.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -214,6 +217,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-3.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-run-parallel-0.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -252,6 +256,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-3.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-run-parallel-0.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -272,6 +277,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-3.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-run-parallel-0.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -330,6 +336,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-3.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-run-parallel-0.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -368,6 +375,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-3.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-run-parallel-0.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -388,6 +396,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-3.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-run-parallel-0.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -4309,6 +4318,17 @@ packages: license_family: MOZILLA size: 10537 timestamp: 1744061283541 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-run-parallel-0.10.0-pyhd8ed1ab_0.conda + sha256: e69fc1d40c3ad22ad4b664143916ccb2f5d57cdb70879c371b8905e4f51c82bb + md5: 79c30c544dd76bd4f81d7e975efaca4b + depends: + - pytest >=6.2.0 + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 24875 + timestamp: 1785909313088 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 md5: 5b8d21249ff20967101ffa321cab24e8 diff --git a/cuda_pathfinder/pixi.toml b/cuda_pathfinder/pixi.toml index c38c08c3f2e..6236aead9b9 100644 --- a/cuda_pathfinder/pixi.toml +++ b/cuda_pathfinder/pixi.toml @@ -15,6 +15,7 @@ pytest = ">=6.2.4" pytest-mock = "*" pytest-repeat = "*" pytest-randomly = "*" +pytest-run-parallel = ">=0.4.1" # Keep this dependency set aligned with cuda_python/docs/environment-docs.yml. [feature.docs.dependencies] diff --git a/cuda_pathfinder/pyproject.toml b/cuda_pathfinder/pyproject.toml index c5840e70ec9..51c3968c10f 100644 --- a/cuda_pathfinder/pyproject.toml +++ b/cuda_pathfinder/pyproject.toml @@ -16,6 +16,7 @@ test = [ "pytest-mock==3.15.1", "pytest-repeat==0.9.4", "pytest-randomly==4.1.0", + "pytest-run-parallel>=0.4.1", ] # Internal organization of test dependencies. cu12 = [ From 4f6d16eefd3a9b83bd6d993e61204d0b034fd828 Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Mon, 31 Aug 2026 13:21:23 -0700 Subject: [PATCH 3/3] docs(pathfinder): add 1.8.1 release notes --- cuda_pathfinder/docs/nv-versions.json | 4 +++ .../docs/source/release/1.8.1-notes.rst | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 cuda_pathfinder/docs/source/release/1.8.1-notes.rst diff --git a/cuda_pathfinder/docs/nv-versions.json b/cuda_pathfinder/docs/nv-versions.json index 513e3086f2e..175716889da 100644 --- a/cuda_pathfinder/docs/nv-versions.json +++ b/cuda_pathfinder/docs/nv-versions.json @@ -3,6 +3,10 @@ "version": "latest", "url": "https://nvidia.github.io/cuda-python/cuda-pathfinder/latest/" }, + { + "version": "1.8.1", + "url": "https://nvidia.github.io/cuda-python/cuda-pathfinder/1.8.1/" + }, { "version": "1.8.0", "url": "https://nvidia.github.io/cuda-python/cuda-pathfinder/1.8.0/" diff --git a/cuda_pathfinder/docs/source/release/1.8.1-notes.rst b/cuda_pathfinder/docs/source/release/1.8.1-notes.rst new file mode 100644 index 00000000000..b43fcdb0cf5 --- /dev/null +++ b/cuda_pathfinder/docs/source/release/1.8.1-notes.rst @@ -0,0 +1,33 @@ +.. SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +.. SPDX-License-Identifier: Apache-2.0 + +.. py:currentmodule:: cuda.pathfinder + +``cuda-pathfinder`` 1.8.1 Release notes +======================================= + +Highlights +---------- + +* Add ``ptxas`` to ``SUPPORTED_BINARY_UTILITIES``. The + :func:`find_nvidia_binary_utility` function can now locate it on Linux and + Windows through the existing NVIDIA wheel, Conda, and CUDA Toolkit search + pipeline. NVIDIA wheel discovery prefers the CUDA 13 ``nvidia/cu13/bin`` + layout while retaining the legacy ``nvidia/cuda_nvcc/bin`` fallback. + (`PR #2741 `_) + +Bugfixes +-------- + +* Find ``cuobjdump`` in the CUDA 13 ``nvidia/cu13/bin`` NVIDIA wheel layout + while retaining discovery from the legacy ``nvidia/cuda_nvcc/bin`` layout. + (`PR #2739 `_) + +Internal maintenance +-------------------- + +* Add ``pytest-run-parallel>=0.4.1`` to the normal test dependencies so the + existing ``thread_unsafe`` marker and ``thread_unsafe_fixtures`` + configuration option are registered in standard test environments. This is + test-only and does not add a runtime dependency. + (`PR #2741 `_)