diff --git a/.github/actions/griffe-api-check/action.yml b/.github/actions/griffe-api-check/action.yml new file mode 100644 index 00000000000..6c090ddeb43 --- /dev/null +++ b/.github/actions/griffe-api-check/action.yml @@ -0,0 +1,44 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +name: griffe API check + +description: >- + Check a package's public API (as defined by `__all__`) for changes using + griffe. + +inputs: + package-name: + description: "Importable package name to check, e.g. cuda.core" + required: true + package-dir: + description: "Directory to search for the package sources, e.g. cuda_core" + required: true + merge-base: + description: >- + Git ref/sha to compare the current code against, typically the PR's + merge-base with its target branch. + required: true + +runs: + using: composite + steps: + - name: Install uv + uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0 + with: + enable-cache: false + + - name: Check API + shell: bash --noprofile --norc -euo pipefail {0} + env: + PACKAGE_NAME: ${{ inputs.package-name }} + PACKAGE_DIR: ${{ inputs.package-dir }} + MERGE_BASE: ${{ inputs.merge-base }} + run: | + uvx griffe check "$PACKAGE_NAME" \ + --search "$PACKAGE_DIR" \ + --find-stubs-packages \ + --against "$MERGE_BASE" \ + --format github \ + 2>&1 diff --git a/.github/workflows/build-wheel.yml b/.github/workflows/build-wheel.yml index 4dac9c8eca9..390d6f88ae2 100644 --- a/.github/workflows/build-wheel.yml +++ b/.github/workflows/build-wheel.yml @@ -14,12 +14,45 @@ on: prev-cuda-version: required: true type: string + build-pathfinder: + required: false + type: boolean + default: true + build-bindings: + required: false + type: boolean + default: true + build-core: + required: false + type: boolean + default: true + build-python: + required: false + type: boolean + default: true + test-bindings: + required: false + type: boolean + default: true + test-core: + required: false + type: boolean + default: true + baseline-run-id: + required: false + type: string + default: "" + baseline-sha: + required: false + type: string + default: "" defaults: run: shell: bash --noprofile --norc -xeuo pipefail {0} permissions: + actions: read contents: read # This is required for actions/checkout jobs: @@ -50,7 +83,7 @@ jobs: filter: blob:none - name: Install latest rapidsai/sccache - if: ${{ startsWith(inputs.host-platform, 'linux') }} + if: ${{ startsWith(inputs.host-platform, 'linux') && (inputs.build-bindings || inputs.build-core) }} run: | curl -fsSL "https://github.com/rapidsai/sccache/releases/latest/download/sccache-$(uname -m)-unknown-linux-musl.tar.gz" \ | sudo tar -C /usr/local/bin -xvzf - --wildcards --strip-components=1 -x '*/sccache' @@ -58,6 +91,7 @@ jobs: # xref: https://github.com/orgs/community/discussions/42856#discussioncomment-7678867 - name: Adding addtional GHA cache-related env vars + if: ${{ inputs.build-bindings || inputs.build-core }} uses: actions/github-script@v9 with: script: | @@ -84,13 +118,13 @@ jobs: python-version: "3.12" - name: Set up MSVC - if: ${{ startsWith(inputs.host-platform, 'win') }} + if: ${{ startsWith(inputs.host-platform, 'win') && (inputs.build-bindings || inputs.build-core || inputs.test-bindings || inputs.test-core) }} uses: step-security/msvc-dev-cmd@22c98154b708dbd743e6f27a933cf6ceba3305c4 # v1.13.1 - name: Set up yq # GitHub made an unprofessional decision to not provide it in their Windows VMs, # see https://github.com/actions/runner-images/issues/7443. - if: ${{ startsWith(inputs.host-platform, 'win') }} + if: ${{ startsWith(inputs.host-platform, 'win') && inputs.build-core }} env: YQ_VERSION: v4.52.5 YQ_SHA256: 47594981f3848a4b4447494adeca9555f908f7cf0a89c4da3fd0243a4631da1c @@ -128,11 +162,21 @@ jobs: # To keep the build workflow simple, all matrix jobs will build a wheel for later use within this workflow. - name: Build and check cuda.pathfinder wheel + if: ${{ inputs.build-pathfinder }} run: | pushd cuda_pathfinder pip wheel -v --no-deps . popd + - name: Download reusable cuda.pathfinder wheel + if: ${{ !inputs.build-pathfinder }} + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: cuda-pathfinder-wheel + path: cuda_pathfinder + github-token: ${{ github.token }} + run-id: ${{ inputs.baseline-run-id }} + - name: List the cuda.pathfinder artifacts directory run: | if [[ "${{ inputs.host-platform }}" == win* ]]; then @@ -146,10 +190,24 @@ jobs: # We only need/want a single pure python wheel, pick linux-64 index 0. # This is what we will use for testing & releasing. - name: Check cuda.pathfinder wheel - if: ${{ strategy.job-index == 0 && inputs.host-platform == 'linux-64' }} + if: ${{ inputs.build-pathfinder && strategy.job-index == 0 && inputs.host-platform == 'linux-64' }} run: | twine check --strict cuda_pathfinder/*.whl + - name: Constrain builds to the local cuda.pathfinder wheel + if: ${{ inputs.build-bindings }} + run: | + pathfinder_wheels=(cuda_pathfinder/cuda_pathfinder-*.whl) + test "${#pathfinder_wheels[@]}" -eq 1 + test -f "${pathfinder_wheels[0]}" + mkdir -p wheel-constraints + if [[ "${{ inputs.host-platform }}" == win* ]]; then + pathfinder_uri="file:///$(cygpath -am "${pathfinder_wheels[0]}")" + else + pathfinder_uri="file:///host$(realpath "${pathfinder_wheels[0]}")" + fi + printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" | tee wheel-constraints/cuda-bindings.txt + - name: Upload cuda.pathfinder build artifacts if: ${{ strategy.job-index == 0 && inputs.host-platform == 'linux-64' }} uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 @@ -159,6 +217,7 @@ jobs: if-no-files-found: error - name: Set up mini CTK + if: ${{ inputs.build-bindings || inputs.build-core || inputs.test-bindings || inputs.test-core }} uses: ./.github/actions/fetch_ctk continue-on-error: false with: @@ -166,12 +225,15 @@ jobs: cuda-version: ${{ inputs.cuda-version }} - name: Build cuda.bindings wheel - uses: pypa/cibuildwheel@294735312765b09d24a2fbec22660ce817587d55 # v4.1.0 + if: ${{ inputs.build-bindings }} + uses: pypa/cibuildwheel@4726cd35bb13f7bde50cf2761f2499ac7b3aa32c # v4.1.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 @@ -181,6 +243,8 @@ jobs: CIBW_ENVIRONMENT_LINUX: > CUDA_PATH=/host/${{ env.CUDA_PATH }} CUDA_PYTHON_PARALLEL_LEVEL=${{ env.CUDA_PYTHON_PARALLEL_LEVEL }} + PIP_BUILD_CONSTRAINT=/host/${{ github.workspace }}/wheel-constraints/cuda-bindings.txt + PIP_CONSTRAINT=/host/${{ github.workspace }}/wheel-constraints/cuda-bindings.txt CC="/host/${{ env.SCCACHE_PATH }} cc" CXX="/host/${{ env.SCCACHE_PATH }} c++" SCCACHE_GHA_ENABLED=true @@ -194,6 +258,8 @@ jobs: CIBW_ENVIRONMENT_WINDOWS: > CUDA_PATH="$(cygpath -w ${{ env.CUDA_PATH }})" CUDA_PYTHON_PARALLEL_LEVEL=${{ env.CUDA_PYTHON_PARALLEL_LEVEL }} + PIP_BUILD_CONSTRAINT="$(cygpath -w ./wheel-constraints/cuda-bindings.txt)" + PIP_CONSTRAINT="$(cygpath -w ./wheel-constraints/cuda-bindings.txt)" # check cache stats before leaving cibuildwheel CIBW_BEFORE_TEST_LINUX: > "/host/${{ env.SCCACHE_PATH }}" --show-adv-stats && @@ -205,13 +271,22 @@ jobs: echo "ok!" - name: Report sccache stats (cuda.bindings) - if: ${{ inputs.host-platform != 'win-64' }} + if: ${{ inputs.build-bindings && inputs.host-platform != 'win-64' }} uses: ./.github/actions/sccache-summary with: json-file: sccache_bindings.json label: "cuda.bindings" build-step: "Build cuda.bindings wheel" + - name: Download reusable cuda.bindings wheel + if: ${{ !inputs.build-bindings }} + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: ${{ env.CUDA_BINDINGS_ARTIFACT_BASENAME }}-${{ inputs.baseline-sha }} + path: ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }} + github-token: ${{ github.token }} + run-id: ${{ inputs.baseline-run-id }} + - name: List the cuda.bindings artifacts directory run: | if [[ "${{ inputs.host-platform }}" == win* ]]; then @@ -223,9 +298,32 @@ jobs: ls -lahR ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }} - name: Check cuda.bindings wheel + if: ${{ inputs.build-bindings }} run: | twine check --strict ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}/*.whl + - name: Constrain cuda.core to the local cuda.bindings wheel + if: ${{ inputs.build-core }} + run: | + pathfinder_wheels=(cuda_pathfinder/cuda_pathfinder-*.whl) + bindings_wheels=("${CUDA_BINDINGS_ARTIFACTS_DIR}"/cuda_bindings-"${BUILD_CUDA_MAJOR}".*.whl) + test "${#pathfinder_wheels[@]}" -eq 1 + test "${#bindings_wheels[@]}" -eq 1 + test -f "${pathfinder_wheels[0]}" + test -f "${bindings_wheels[0]}" + mkdir -p wheel-constraints + if [[ "${{ inputs.host-platform }}" == win* ]]; then + pathfinder_uri="file:///$(cygpath -am "${pathfinder_wheels[0]}")" + bindings_uri="file:///$(cygpath -am "${bindings_wheels[0]}")" + else + pathfinder_uri="file:///host$(realpath "${pathfinder_wheels[0]}")" + bindings_uri="file:///host$(realpath "${bindings_wheels[0]}")" + fi + { + printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" + printf 'cuda-bindings @ %s\n' "${bindings_uri}" + } | tee wheel-constraints/cuda-core.txt + - name: Upload cuda.bindings build artifacts uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: @@ -234,12 +332,15 @@ jobs: if-no-files-found: error - name: Build cuda.core wheel - uses: pypa/cibuildwheel@294735312765b09d24a2fbec22660ce817587d55 # v4.1.0 + if: ${{ inputs.build-core }} + uses: pypa/cibuildwheel@4726cd35bb13f7bde50cf2761f2499ac7b3aa32c # v4.1.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 @@ -250,7 +351,8 @@ jobs: CUDA_PATH=/host/${{ env.CUDA_PATH }} CUDA_PYTHON_PARALLEL_LEVEL=${{ env.CUDA_PYTHON_PARALLEL_LEVEL }} CUDA_CORE_BUILD_MAJOR=${{ env.BUILD_CUDA_MAJOR }} - PIP_FIND_LINKS=/host/${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }} + PIP_BUILD_CONSTRAINT=/host/${{ github.workspace }}/wheel-constraints/cuda-core.txt + PIP_CONSTRAINT=/host/${{ github.workspace }}/wheel-constraints/cuda-core.txt CC="/host/${{ env.SCCACHE_PATH }} cc" CXX="/host/${{ env.SCCACHE_PATH }} c++" SCCACHE_GHA_ENABLED=true @@ -265,7 +367,8 @@ jobs: CUDA_PATH="$(cygpath -w ${{ env.CUDA_PATH }})" CUDA_PYTHON_PARALLEL_LEVEL=${{ env.CUDA_PYTHON_PARALLEL_LEVEL }} CUDA_CORE_BUILD_MAJOR=${{ env.BUILD_CUDA_MAJOR }} - PIP_FIND_LINKS="$(cygpath -w ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }})" + PIP_BUILD_CONSTRAINT="$(cygpath -w ./wheel-constraints/cuda-core.txt)" + PIP_CONSTRAINT="$(cygpath -w ./wheel-constraints/cuda-core.txt)" # check cache stats before leaving cibuildwheel CIBW_BEFORE_TEST_LINUX: > "/host${{ env.SCCACHE_PATH }}" --show-adv-stats && @@ -277,7 +380,7 @@ jobs: echo "ok!" - name: Report sccache stats (cuda.core) - if: ${{ inputs.host-platform != 'win-64' }} + if: ${{ inputs.build-core && inputs.host-platform != 'win-64' }} uses: ./.github/actions/sccache-summary with: json-file: sccache_core.json @@ -285,6 +388,7 @@ jobs: build-step: "Build cuda.core wheel" - name: List the cuda.core artifacts directory and rename + if: ${{ inputs.build-core }} run: | if [[ "${{ inputs.host-platform }}" == win* ]]; then export CHOWN=chown @@ -306,15 +410,33 @@ jobs: ls -lahR ${{ env.CUDA_CORE_ARTIFACTS_DIR }} + - name: Download reusable cuda.core wheel + if: ${{ !inputs.build-core }} + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: ${{ env.CUDA_CORE_ARTIFACT_BASENAME }}-${{ inputs.baseline-sha }} + path: ${{ env.CUDA_CORE_ARTIFACTS_DIR }} + github-token: ${{ github.token }} + run-id: ${{ inputs.baseline-run-id }} + # We only need/want a single pure python wheel, pick linux-64 index 0. - name: Build and check cuda-python wheel - if: ${{ strategy.job-index == 0 && inputs.host-platform == 'linux-64' }} + if: ${{ inputs.build-python && strategy.job-index == 0 && inputs.host-platform == 'linux-64' }} run: | pushd cuda_python pip wheel -v --no-deps . twine check --strict *.whl popd + - name: Download reusable cuda-python wheel + if: ${{ !inputs.build-python && strategy.job-index == 0 && inputs.host-platform == 'linux-64' }} + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: cuda-python-wheel + path: cuda_python + github-token: ${{ github.token }} + run-id: ${{ inputs.baseline-run-id }} + - name: List the cuda-python artifacts directory if: ${{ strategy.job-index == 0 && inputs.host-platform == 'linux-64' }} run: | @@ -336,17 +458,25 @@ jobs: - name: Set up Python id: setup-python2 + if: ${{ inputs.test-bindings || inputs.test-core }} 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: ${{ (inputs.test-bindings || inputs.test-core) && 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" + - name: verify free-threaded build - if: endsWith(matrix.python-version, 't') + if: ${{ (inputs.test-bindings || inputs.test-core) && endsWith(matrix.python-version, 't') }} run: python -c 'import sys; assert not sys._is_gil_enabled()' - name: Set up Python include paths + if: ${{ inputs.test-bindings || inputs.test-core }} run: | if [[ "${{ inputs.host-platform }}" == linux* ]]; then echo "CPLUS_INCLUDE_PATH=${Python3_ROOT_DIR}/include/python${{ matrix.python-version }}" >> $GITHUB_ENV @@ -357,75 +487,19 @@ jobs: echo "PY_EXT_SUFFIX=$(python -c "import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))")" >> $GITHUB_ENV - name: Install cuda.pathfinder (required for next step) + if: ${{ inputs.test-bindings || inputs.test-core }} run: | pip install cuda_pathfinder/*.whl - name: Hide GNU link.exe so Meson finds MSVC link.exe - if: ${{ startsWith(inputs.host-platform, 'win') }} + if: ${{ startsWith(inputs.host-platform, 'win') && (inputs.test-bindings || inputs.test-core) }} run: | if [ -f "/c/Program Files/Git/usr/bin/link.exe" ]; then mv "/c/Program Files/Git/usr/bin/link.exe" "/c/Program Files/Git/usr/bin/link.exe.bak" fi - # TODO: remove the numpy pre-build steps once 3.15 is officially supported - # (numpy will publish pre-built 3.15 wheels at that point) - - name: Download and patch numpy sdist (pre-release Python) - if: ${{ startsWith(matrix.python-version, '3.15') }} - run: | - pip download --no-binary numpy --no-deps "numpy>=1.21.1" -d numpy-sdist/ - cd numpy-sdist && tar xf numpy-*.tar.gz && rm numpy-*.tar.gz - # WAR: numpy 2.4.x ships [tool.cibuildwheel] config that is - # incompatible with cibuildwheel v4.0 (cpython-freethreading enable - # group, OpenBLAS before-build scripts, etc.). Strip the cibuildwheel - # sections but preserve [tool.meson-python] (vendored meson path). - python -c " - import glob - for f in glob.glob('numpy-*/pyproject.toml'): - lines, skip = open(f).readlines(), False - out = [] - for line in lines: - hdr = line.strip() - if hdr.startswith('[tool.cibuildwheel') or hdr.startswith('[[tool.cibuildwheel'): - skip = True - continue - if skip and hdr.startswith('[') and 'cibuildwheel' not in hdr: - skip = False - if not skip: - out.append(line) - open(f, 'w').writelines(out) - " - echo "NUMPY_SRC_DIR=$(pwd)/$(ls -d numpy-*/)" >> $GITHUB_ENV - - - name: Build numpy wheel (pre-release Python) - if: ${{ startsWith(matrix.python-version, '3.15') }} - uses: pypa/cibuildwheel@294735312765b09d24a2fbec22660ce817587d55 # v4.1.0 - env: - CIBW_BUILD: ${{ env.CIBW_BUILD }} - CIBW_SKIP: "*-musllinux* *-win32" - CIBW_ARCHS_LINUX: "native" - CIBW_BUILD_VERBOSITY: 1 - CIBW_CONFIG_SETTINGS: "setup-args=-Dallow-noblas=true" - CIBW_CONFIG_SETTINGS_WINDOWS: "setup-args=--vsenv setup-args=-Dallow-noblas=true" - CIBW_BEFORE_BUILD_WINDOWS: "pip install delvewheel" - CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "delvewheel repair -w {dest_dir} {wheel}" - CIBW_ENABLE: "cpython-prerelease" - with: - package-dir: ${{ env.NUMPY_SRC_DIR }} - output-dir: numpy-wheel/ - - - name: Upload numpy wheel - if: ${{ startsWith(matrix.python-version, '3.15') }} - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 - with: - name: numpy-python${{ env.PYTHON_VERSION_FORMATTED }}-${{ inputs.host-platform }} - path: numpy-wheel/*.whl - if-no-files-found: error - - - name: Install numpy wheel - if: ${{ startsWith(matrix.python-version, '3.15') }} - run: pip install numpy-wheel/*.whl - - name: Build cuda.bindings Cython tests + if: ${{ inputs.test-bindings }} run: | pip install ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}/*.whl --group ./cuda_bindings/pyproject.toml:test pushd ${{ env.CUDA_BINDINGS_CYTHON_TESTS_DIR }} @@ -433,6 +507,7 @@ jobs: popd - name: Upload cuda.bindings Cython tests + if: ${{ inputs.test-bindings }} uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }}-tests @@ -440,13 +515,25 @@ jobs: if-no-files-found: error - name: Build cuda.core Cython tests + if: ${{ inputs.test-core }} run: | - pip install ${{ env.CUDA_CORE_ARTIFACTS_DIR }}/"cu${BUILD_CUDA_MAJOR}"/*.whl --group ./cuda_core/pyproject.toml:test + pip install ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}/*.whl + if ${{ inputs.build-core }}; then + core_wheel=$(find "${{ env.CUDA_CORE_ARTIFACTS_DIR }}/cu${BUILD_CUDA_MAJOR}" -maxdepth 1 -type f -name '*.whl' -print -quit) + else + core_wheel=$(find "${{ env.CUDA_CORE_ARTIFACTS_DIR }}" -maxdepth 1 -type f -name '*.whl' -print -quit) + fi + if [[ -z "${core_wheel}" ]]; then + echo "No cuda.core wheel found" >&2 + exit 1 + fi + pip install "${core_wheel}" --group ./cuda_core/pyproject.toml:test pushd ${{ env.CUDA_CORE_CYTHON_TESTS_DIR }} bash build_tests.sh popd - name: Upload cuda.core Cython tests + if: ${{ inputs.test-core }} uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: ${{ env.CUDA_CORE_ARTIFACT_NAME }}-tests @@ -455,6 +542,7 @@ jobs: # Note: This overwrites CUDA_PATH etc - name: Set up mini CTK + if: ${{ inputs.build-core || inputs.test-core }} uses: ./.github/actions/fetch_ctk continue-on-error: false with: @@ -463,11 +551,13 @@ jobs: cuda-path: "./cuda_toolkit_prev" - name: Build cuda.core test binaries + if: ${{ inputs.test-core }} run: | nvcc --version python "${{ env.CUDA_CORE_TEST_BINARIES_DIR }}/build_test_binaries.py" - name: Upload cuda.core test binaries + if: ${{ inputs.test-core }} uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: ${{ env.CUDA_CORE_ARTIFACT_NAME }}-test-binaries @@ -478,6 +568,7 @@ jobs: if-no-files-found: error - name: Download cuda.bindings build artifacts from the prior branch + if: ${{ inputs.build-core }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | @@ -496,21 +587,47 @@ jobs: OLD_BRANCH=$(yq '.backport_branch' ci/versions.yml) OLD_BASENAME="cuda-bindings-python${PYTHON_VERSION_FORMATTED}-cuda*-${{ inputs.host-platform }}*" LATEST_PRIOR_RUN_ID=$(./ci/tools/lookup-run-id --branch "${OLD_BRANCH}" NVIDIA/cuda-python "CI") + PREV_BINDINGS_DIR="cuda_bindings/dist-prev" gh run download $LATEST_PRIOR_RUN_ID -p ${OLD_BASENAME} -R NVIDIA/cuda-python rm -rf ${OLD_BASENAME}-tests # exclude cython test artifacts ls -al $OLD_BASENAME - mkdir -p "${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}" - mv $OLD_BASENAME/*.whl "${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}" + mkdir -p "${PREV_BINDINGS_DIR}" + mv $OLD_BASENAME/*.whl "${PREV_BINDINGS_DIR}" rmdir $OLD_BASENAME + - name: Constrain previous cuda.core to the downloaded cuda.bindings wheel + if: ${{ inputs.build-core }} + run: | + pathfinder_wheels=(cuda_pathfinder/cuda_pathfinder-*.whl) + bindings_wheels=(cuda_bindings/dist-prev/cuda_bindings-"${BUILD_PREV_CUDA_MAJOR}".*.whl) + test "${#pathfinder_wheels[@]}" -eq 1 + test "${#bindings_wheels[@]}" -eq 1 + test -f "${pathfinder_wheels[0]}" + test -f "${bindings_wheels[0]}" + mkdir -p wheel-constraints + if [[ "${{ inputs.host-platform }}" == win* ]]; then + pathfinder_uri="file:///$(cygpath -am "${pathfinder_wheels[0]}")" + bindings_uri="file:///$(cygpath -am "${bindings_wheels[0]}")" + else + pathfinder_uri="file:///host$(realpath "${pathfinder_wheels[0]}")" + bindings_uri="file:///host$(realpath "${bindings_wheels[0]}")" + fi + { + printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" + printf 'cuda-bindings @ %s\n' "${bindings_uri}" + } | tee wheel-constraints/cuda-core-prev.txt + - name: Build cuda.core wheel - uses: pypa/cibuildwheel@294735312765b09d24a2fbec22660ce817587d55 # v4.1.0 + if: ${{ inputs.build-core }} + uses: pypa/cibuildwheel@4726cd35bb13f7bde50cf2761f2499ac7b3aa32c # v4.1.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 @@ -521,7 +638,8 @@ jobs: CUDA_PATH=/host/${{ env.CUDA_PATH }} CUDA_PYTHON_PARALLEL_LEVEL=${{ env.CUDA_PYTHON_PARALLEL_LEVEL }} CUDA_CORE_BUILD_MAJOR=${{ env.BUILD_PREV_CUDA_MAJOR }} - PIP_FIND_LINKS=/host/${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }} + PIP_BUILD_CONSTRAINT=/host/${{ github.workspace }}/wheel-constraints/cuda-core-prev.txt + PIP_CONSTRAINT=/host/${{ github.workspace }}/wheel-constraints/cuda-core-prev.txt CC="/host/${{ env.SCCACHE_PATH }} cc" CXX="/host/${{ env.SCCACHE_PATH }} c++" SCCACHE_GHA_ENABLED=true @@ -536,7 +654,8 @@ jobs: CUDA_PATH="$(cygpath -w ${{ env.CUDA_PATH }})" CUDA_PYTHON_PARALLEL_LEVEL=${{ env.CUDA_PYTHON_PARALLEL_LEVEL }} CUDA_CORE_BUILD_MAJOR=${{ env.BUILD_PREV_CUDA_MAJOR }} - PIP_FIND_LINKS="$(cygpath -w ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }})" + PIP_BUILD_CONSTRAINT="$(cygpath -w ./wheel-constraints/cuda-core-prev.txt)" + PIP_CONSTRAINT="$(cygpath -w ./wheel-constraints/cuda-core-prev.txt)" # check cache stats before leaving cibuildwheel CIBW_BEFORE_TEST_LINUX: > "/host${{ env.SCCACHE_PATH }}" --show-adv-stats && @@ -548,7 +667,7 @@ jobs: echo "ok!" - name: Report sccache stats (cuda.core prev) - if: ${{ inputs.host-platform != 'win-64' }} + if: ${{ inputs.build-core && inputs.host-platform != 'win-64' }} uses: ./.github/actions/sccache-summary with: json-file: sccache_core_prev.json @@ -556,6 +675,7 @@ jobs: build-step: "Build cuda.core wheel" - name: List the cuda.core artifacts directory and rename + if: ${{ inputs.build-core }} run: | if [[ "${{ inputs.host-platform }}" == win* ]]; then export CHOWN=chown @@ -579,6 +699,7 @@ jobs: ls -lahR ${{ env.CUDA_CORE_ARTIFACTS_DIR }} - name: Merge cuda.core wheels + if: ${{ inputs.build-core }} run: | pip install wheel python ci/tools/merge_cuda_core_wheels.py \ @@ -587,6 +708,7 @@ jobs: --output-dir "${{ env.CUDA_CORE_ARTIFACTS_DIR }}" - name: Check cuda.core wheel + if: ${{ inputs.build-core }} run: | twine check --strict ${{ env.CUDA_CORE_ARTIFACTS_DIR }}/*.whl diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fe43b52d01a..24b81f406f5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -103,6 +103,7 @@ jobs: test_bindings: ${{ steps.compose.outputs.test_bindings }} test_core: ${{ steps.compose.outputs.test_core }} test_pathfinder: ${{ steps.compose.outputs.test_pathfinder }} + pr_merge_base: ${{ steps.filter.outputs.merge_base }} steps: - name: Checkout repository uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 @@ -156,6 +157,7 @@ jobs: echo "python_meta=$(has_match '^cuda_python/')" echo "test_helpers=$(has_match '^cuda_python_test_helpers/')" echo "shared=$(has_match '^(\.github/|ci/|scripts/|toolshed/|conftest\.py$|pyproject\.toml$|pixi\.(toml|lock)$|pytest\.ini$|ruff\.toml$)')" + echo "merge_base=${base}" } >> "$GITHUB_OUTPUT" - name: Compose gating outputs @@ -228,6 +230,89 @@ jobs: echo "test_pathfinder=${test_pathfinder}" } >> "$GITHUB_OUTPUT" + api-check-core-vs-release: + name: API check (cuda_core vs. latest release) + if: >- + ${{ !fromJSON(needs.should-skip.outputs.skip) && + fromJSON(needs.detect-changes.outputs.core) }} + runs-on: ubuntu-latest + needs: + - should-skip + - detect-changes + permissions: + contents: read + steps: + - name: Checkout repository + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + fetch-depth: 1 + filter: blob:none + + - name: Find latest release tag + id: latest-tag + shell: bash --noprofile --norc -euo pipefail {0} + env: + GH_TOKEN: ${{ github.token }} + run: | + # --paginate fetches all pages; jq outputs one name per line per page; + # sed prints the first (newest) match while consuming all pages, so + # gh can complete without SIGPIPE. Fails if no cuda-core-v* tag is found. + tag="$(gh api "repos/$GITHUB_REPOSITORY/tags" --paginate \ + --jq '.[] | select(.name | startswith("cuda-core-v")) | .name' \ + | sed -n '1p')" + if [[ -z "${tag}" ]]; then + echo "::error::No cuda-core-v* tag found in the repository." >&2 + exit 1 + fi + echo "tag=${tag}" >> "$GITHUB_OUTPUT" + + - name: Fetch release tag + shell: bash --noprofile --norc -euo pipefail {0} + run: | + git fetch --depth=1 --filter=blob:none origin \ + "refs/tags/${{ steps.latest-tag.outputs.tag }}:refs/tags/${{ steps.latest-tag.outputs.tag }}" + + - name: Check cuda_core public API + id: griffe + uses: ./.github/actions/griffe-api-check + with: + package-name: cuda.core + package-dir: cuda_core + merge-base: ${{ steps.latest-tag.outputs.tag }} + + api-check-core-vs-base: + name: API check (cuda_core vs. merge base) + if: >- + ${{ startsWith(github.ref_name, 'pull-request/') && + !fromJSON(needs.should-skip.outputs.skip) && + fromJSON(needs.detect-changes.outputs.core) }} + runs-on: ubuntu-latest + needs: + - should-skip + - detect-changes + permissions: + contents: read + steps: + - name: Checkout repository + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + fetch-depth: 1 + filter: blob:none + + - name: Fetch merge base commit + shell: bash --noprofile --norc -euo pipefail {0} + run: | + git fetch --depth=1 --filter=blob:none origin \ + "${{ needs.detect-changes.outputs.pr_merge_base }}" + + - name: Check cuda_core public API + id: griffe + uses: ./.github/actions/griffe-api-check + with: + package-name: cuda.core + package-dir: cuda_core + merge-base: ${{ needs.detect-changes.outputs.pr_merge_base }} + # NOTE: Build jobs are intentionally split by platform rather than using a single # matrix. This allows each test job to depend only on its corresponding build, # so faster platforms can proceed through build & test without waiting for slower @@ -416,6 +501,38 @@ jobs: with: is-release: ${{ github.ref_type == 'tag' }} + precommit-windows: + name: Pre-commit on Windows + runs-on: windows-latest + if: ${{ github.repository_owner == 'nvidia' && !fromJSON(needs.should-skip.outputs.skip) }} + needs: + - should-skip + permissions: + contents: read + steps: + - name: Checkout repository + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + fetch-depth: 1 + persist-credentials: false + + - name: Set up Python + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 + with: + python-version: '3.13' + + - name: Install pre-commit + shell: bash + run: | + set -euxo pipefail + python -m pip install --upgrade pip pre-commit + + - name: Run pre-commit + shell: bash + run: | + set -euxo pipefail + SKIP=lychee pre-commit run --all-files + checks: name: Check job status if: always() @@ -429,6 +546,7 @@ jobs: - test-linux-aarch64 - test-windows - doc + - precommit-windows steps: - name: Exit run: | @@ -461,6 +579,7 @@ jobs: check_result "should-skip" "success" "${{ needs.should-skip.result }}" check_result "detect-changes" "success" "${{ needs.detect-changes.result }}" check_result "doc" "success" "${{ needs.doc.result }}" + check_result "precommit-windows" "success" "${{ needs.precommit-windows.result }}" # [doc-only] flips these from 'success' to 'skipped' if [[ "$doc_only" == "true" ]]; then expected="skipped"; else expected="success"; fi diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index 87bcd8e58d5..00000000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,46 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# -# SPDX-License-Identifier: Apache-2.0 - -name: "Static Analysis: CodeQL Scan" - -on: - push: - branches: - - "pull-request/[0-9]+" - - "ctk-next" - - "main" -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} - cancel-in-progress: true - -jobs: - analyze: - name: Analyze (${{ matrix.language }}) - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - include: - - language: python - build-mode: none - steps: - - name: Checkout repository - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - - - name: Initialize CodeQL - uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 - with: - languages: ${{ matrix.language }} - build-mode: ${{ matrix.build-mode }} - queries: security-extended - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 - with: - category: "/language:${{matrix.language}}" diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index f1b8eb9f3a2..fc234999fca 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -118,18 +118,51 @@ jobs: run: | python -m venv .venv - - name: Build cuda-pathfinder - run: | - cd cuda_pathfinder - ../.venv/bin/pip install -v . --group test - - - name: Build cuda-bindings - run: | - cd cuda_bindings - ../.venv/bin/pip install -v . --group test - - - name: Build cuda-core - run: | + - name: Install pip with build-constraint support + run: .venv/bin/python -m pip install "pip>=25.3" + + - name: Build and install cuda-pathfinder wheel + run: | + .venv/bin/pip wheel -v --no-deps ./cuda_pathfinder -w ./wheels/ + .venv/bin/pip install -v ./wheels/cuda_pathfinder*.whl --group ./cuda_pathfinder/pyproject.toml:test + + - name: Constrain builds to the local cuda-pathfinder wheel + run: | + pathfinder_wheels=(wheels/cuda_pathfinder-*.whl) + test "${#pathfinder_wheels[@]}" -eq 1 + test -f "${pathfinder_wheels[0]}" + mkdir -p wheel-constraints + pathfinder_uri="file://$(realpath "${pathfinder_wheels[0]}")" + printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" | tee wheel-constraints/cuda-bindings.txt + + - name: Build and install cuda-bindings wheel + run: | + export PIP_BUILD_CONSTRAINT="$(pwd)/wheel-constraints/cuda-bindings.txt" + export PIP_CONSTRAINT="${PIP_BUILD_CONSTRAINT}" + .venv/bin/pip wheel -v --no-deps ./cuda_bindings -w ./wheels/ + .venv/bin/pip install -v ./wheels/cuda_bindings*.whl --group ./cuda_bindings/pyproject.toml:test + + - name: Constrain cuda-core to the local cuda-bindings wheel + run: | + CUDA_MAJOR="${CUDA_VER%%.*}" + pathfinder_wheels=(wheels/cuda_pathfinder-*.whl) + bindings_wheels=(wheels/cuda_bindings-"${CUDA_MAJOR}".*.whl) + test "${#pathfinder_wheels[@]}" -eq 1 + test "${#bindings_wheels[@]}" -eq 1 + test -f "${pathfinder_wheels[0]}" + test -f "${bindings_wheels[0]}" + mkdir -p wheel-constraints + pathfinder_uri="file://$(realpath "${pathfinder_wheels[0]}")" + bindings_uri="file://$(realpath "${bindings_wheels[0]}")" + { + printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" + printf 'cuda-bindings @ %s\n' "${bindings_uri}" + } | tee wheel-constraints/cuda-core.txt + + - name: Build and install cuda-core + run: | + export PIP_BUILD_CONSTRAINT="$(pwd)/wheel-constraints/cuda-core.txt" + export PIP_CONSTRAINT="${PIP_BUILD_CONSTRAINT}" cd cuda_core ../.venv/bin/pip install -v . --group test @@ -225,23 +258,65 @@ jobs: run: | python -m venv .venv - - name: Build and install cuda.pathfinder + - name: Build cuda.pathfinder wheel run: | - .venv/Scripts/pip install wheel setuptools Cython + .venv/Scripts/python -m pip install "pip>=25.3" wheel setuptools Cython .venv/Scripts/pip wheel -v --no-deps ./cuda_pathfinder -w ./wheels/ + - name: Constrain builds to the local cuda.pathfinder wheel + run: | + pathfinder_wheels=(wheels/cuda_pathfinder-*.whl) + test "${#pathfinder_wheels[@]}" -eq 1 + test -f "${pathfinder_wheels[0]}" + mkdir -p wheel-constraints + pathfinder_uri="file:///$(cygpath -am "${pathfinder_wheels[0]}")" + printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" | tee wheel-constraints/cuda-bindings.txt + - name: Build cuda.bindings wheel run: | + export PIP_BUILD_CONSTRAINT="$(cygpath -w "$(pwd)/wheel-constraints/cuda-bindings.txt")" + export PIP_CONSTRAINT="${PIP_BUILD_CONSTRAINT}" cd cuda_bindings ../.venv/Scripts/pip wheel -v --no-deps . -w ../wheels/ + - name: Constrain cuda.core to the local cuda.bindings wheel + run: | + CUDA_MAJOR="${CUDA_VER%%.*}" + pathfinder_wheels=(wheels/cuda_pathfinder-*.whl) + bindings_wheels=(wheels/cuda_bindings-"${CUDA_MAJOR}".*.whl) + test "${#pathfinder_wheels[@]}" -eq 1 + test "${#bindings_wheels[@]}" -eq 1 + test -f "${pathfinder_wheels[0]}" + test -f "${bindings_wheels[0]}" + mkdir -p wheel-constraints + pathfinder_uri="file:///$(cygpath -am "${pathfinder_wheels[0]}")" + bindings_uri="file:///$(cygpath -am "${bindings_wheels[0]}")" + { + printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" + printf 'cuda-bindings @ %s\n' "${bindings_uri}" + } | tee wheel-constraints/cuda-core.txt + - name: Build cuda.core wheel run: | - export PIP_FIND_LINKS="$(pwd)/wheels" - export PIP_PRE=1 + export PIP_BUILD_CONSTRAINT="$(cygpath -w "$(pwd)/wheel-constraints/cuda-core.txt")" + export PIP_CONSTRAINT="${PIP_BUILD_CONSTRAINT}" cd cuda_core ../.venv/Scripts/pip wheel -v --no-deps . -w ../wheels/ + # Vendor the DLLs these wheels were built against, the way cibuildwheel + # does for every other Windows build. --namespace-pkg is needed because + # `cuda` is a namespace package. + - name: Repair the Windows wheels + run: | + .venv/Scripts/pip install delvewheel + mkdir -p wheels-repaired + for whl in ./wheels/cuda_bindings-*.whl ./wheels/cuda_core-*.whl; do + .venv/Scripts/delvewheel repair --namespace-pkg cuda \ + --exclude "torch_cpu.dll;torch_python.dll" \ + -w ./wheels-repaired "$whl" + done + mv -f ./wheels-repaired/*.whl ./wheels/ + - name: List wheel artifacts run: | echo "=== Windows wheel artifacts ===" @@ -335,7 +410,6 @@ jobs: - name: Install test dependencies and coverage tools run: | - .venv/Scripts/pip install -v ./cuda_python_test_helpers .venv/Scripts/pip install coverage pytest-cov Cython .venv/Scripts/pip install --group ./cuda_pathfinder/pyproject.toml:test .venv/Scripts/pip install --group ./cuda_bindings/pyproject.toml:test diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 37322974a02..4f2c54f4509 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -158,6 +158,8 @@ jobs: steps: - name: Checkout Source uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + ref: ${{ inputs.git-tag }} - name: Set up Python uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 diff --git a/.github/workflows/security-suite.yml b/.github/workflows/security-suite.yml new file mode 100644 index 00000000000..0902db6119a --- /dev/null +++ b/.github/workflows/security-suite.yml @@ -0,0 +1,47 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# +# CI security scanning via the NVIDIA/security-workflows suite: Pulse secret scan + CodeQL SAST. +# Pulse runs on Linux nv-gha-runners (Docker image + OIDC/Vault) — Linux-only by design. +# The local secret-scan-trufflehog pre-commit hook is cross-platform (Linux/macOS/Windows). +# Pinned to a reviewed commit SHA. + +name: Security Suite (Pulse + CodeQL) + +on: + push: + branches: + - main + - ctk-next + - "pull-request/[0-9]+" + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-on-${{ github.event_name }}-from-${{ github.ref_name }} + cancel-in-progress: true + +# Caller must grant every permission the reusable workflow declares, including scans it disables. +permissions: + contents: read + id-token: write # OIDC -> Vault -> nvcr.io image pull + security-events: write # publish redacted SARIF to code scanning + actions: read + +jobs: + security-suite: + name: Security Suite + # Pulse needs nv-gha-runners + Vault/nvcr vars; skip on forks. + if: github.repository == 'NVIDIA/cuda-python' + uses: NVIDIA/security-workflows/.github/workflows/security-suite.yml@711025b090f2aa728da576700750b195d1e816dc # v0.3.0 + with: + enable-secret-scan: true + enable-sast-scan: true + secret-runs-on: linux-amd64-cpu4 + # Set failure_policy explicitly so enforcement can't drift with upstream defaults. + # unverified — fail on verified/live secrets (183); warn on unverified (185) [default] + # strict — fail on any finding (verified or unverified) + # all — warn only; never fail the job on findings + secret-failure-policy: unverified + # Same analysis the retired codeql.yml performed: python, build-mode none, security-extended. + sast-languages: '["python"]' diff --git a/.github/workflows/test-sdist-linux.yml b/.github/workflows/test-sdist-linux.yml index 9d077912f3c..42262a8aa29 100644 --- a/.github/workflows/test-sdist-linux.yml +++ b/.github/workflows/test-sdist-linux.yml @@ -39,7 +39,7 @@ jobs: python-version: "3.12" - name: Install build tools - run: pip install build + run: python -m pip install "pip>=25.3" build # Pure Python packages -- no CTK needed. - name: Build cuda.pathfinder sdist and wheel-from-sdist @@ -52,6 +52,15 @@ jobs: python -m build --sdist cuda_python/ pip wheel --no-deps --wheel-dir cuda_python/dist cuda_python/dist/*.tar.gz + - name: Constrain builds to the local cuda.pathfinder wheel + run: | + pathfinder_wheels=(cuda_pathfinder/dist/cuda_pathfinder-*.whl) + test "${#pathfinder_wheels[@]}" -eq 1 + test -f "${pathfinder_wheels[0]}" + mkdir -p wheel-constraints + pathfinder_uri="file://$(realpath "${pathfinder_wheels[0]}")" + printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" | tee wheel-constraints/cuda-bindings.txt + # Cython packages need CTK + sccache. # The env vars ACTIONS_CACHE_SERVICE_V2, ACTIONS_RESULTS_URL, and ACTIONS_RUNTIME_TOKEN # are exposed by this action. @@ -88,10 +97,28 @@ jobs: export CUDA_PYTHON_PARALLEL_LEVEL=$(nproc) export CC="sccache cc" export CXX="sccache c++" - export PIP_FIND_LINKS="$(pwd)/cuda_pathfinder/dist" + export PIP_BUILD_CONSTRAINT="$(pwd)/wheel-constraints/cuda-bindings.txt" + export PIP_CONSTRAINT="${PIP_BUILD_CONSTRAINT}" python -m build --sdist cuda_bindings/ pip wheel --no-deps --wheel-dir cuda_bindings/dist cuda_bindings/dist/*.tar.gz + - name: Constrain cuda.core to the local cuda.bindings wheel + run: | + CUDA_MAJOR="$(echo '${{ inputs.cuda-version }}' | cut -d. -f1)" + pathfinder_wheels=(cuda_pathfinder/dist/cuda_pathfinder-*.whl) + bindings_wheels=(cuda_bindings/dist/cuda_bindings-"${CUDA_MAJOR}".*.whl) + test "${#pathfinder_wheels[@]}" -eq 1 + test "${#bindings_wheels[@]}" -eq 1 + test -f "${pathfinder_wheels[0]}" + test -f "${bindings_wheels[0]}" + mkdir -p wheel-constraints + pathfinder_uri="file://$(realpath "${pathfinder_wheels[0]}")" + bindings_uri="file://$(realpath "${bindings_wheels[0]}")" + { + printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" + printf 'cuda-bindings @ %s\n' "${bindings_uri}" + } | tee wheel-constraints/cuda-core.txt + # cuda_core sdist delegates to setuptools (no CTK needed), but # wheel-from-sdist needs CTK and cuda-bindings (dynamic build dep via # get_requires_for_build_wheel in build_hooks.py). @@ -101,7 +128,8 @@ jobs: export CUDA_CORE_BUILD_MAJOR="$(echo '${{ inputs.cuda-version }}' | cut -d. -f1)" export CC="sccache cc" export CXX="sccache c++" - export PIP_FIND_LINKS="$(pwd)/cuda_bindings/dist $(pwd)/cuda_pathfinder/dist" + export PIP_BUILD_CONSTRAINT="$(pwd)/wheel-constraints/cuda-core.txt" + export PIP_CONSTRAINT="${PIP_BUILD_CONSTRAINT}" python -m build --sdist cuda_core/ pip wheel --no-deps --wheel-dir cuda_core/dist cuda_core/dist/*.tar.gz diff --git a/.github/workflows/test-sdist-windows.yml b/.github/workflows/test-sdist-windows.yml index 043bacc1cad..eb4e25b5fc5 100644 --- a/.github/workflows/test-sdist-windows.yml +++ b/.github/workflows/test-sdist-windows.yml @@ -48,7 +48,7 @@ jobs: uses: step-security/msvc-dev-cmd@22c98154b708dbd743e6f27a933cf6ceba3305c4 # v1.13.1 - name: Install build tools - run: pip install build + run: python -m pip install "pip>=25.3" build # Pure Python packages -- no CTK needed. - name: Build cuda.pathfinder sdist and wheel-from-sdist @@ -61,6 +61,15 @@ jobs: python -m build --sdist cuda_python/ pip wheel --no-deps --wheel-dir cuda_python/dist cuda_python/dist/*.tar.gz + - name: Constrain builds to the local cuda.pathfinder wheel + run: | + pathfinder_wheels=(cuda_pathfinder/dist/cuda_pathfinder-*.whl) + test "${#pathfinder_wheels[@]}" -eq 1 + test -f "${pathfinder_wheels[0]}" + mkdir -p wheel-constraints + pathfinder_uri="file:///$(cygpath -am "${pathfinder_wheels[0]}")" + printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" | tee wheel-constraints/cuda-bindings.txt + # Cython packages need CTK. No sccache on Windows (this is a correctness # smoke test, not a production build; see build-wheel.yml which also # limits sccache to Linux). @@ -73,17 +82,33 @@ jobs: # cuda_bindings/setup.py parses CUDA headers at import time, so CUDA_PATH # (set by fetch_ctk) must be available for both sdist and wheel builds. - # PIP_FIND_LINKS is passed as a native Windows path via cygpath because - # pip on Windows treats space-separated entries as separators and is - # picky about mixed path styles (see build-wheel.yml for the same - # convention). + # Constraint paths are passed as native Windows paths because the pip + # subprocesses run outside Git Bash. - name: Build cuda.bindings sdist and wheel-from-sdist run: | export CUDA_PYTHON_PARALLEL_LEVEL=$(nproc) - export PIP_FIND_LINKS="$(cygpath -w "$(pwd)/cuda_pathfinder/dist")" + export PIP_BUILD_CONSTRAINT="$(cygpath -w "$(pwd)/wheel-constraints/cuda-bindings.txt")" + export PIP_CONSTRAINT="${PIP_BUILD_CONSTRAINT}" python -m build --sdist cuda_bindings/ pip wheel --no-deps --wheel-dir cuda_bindings/dist cuda_bindings/dist/*.tar.gz + - name: Constrain cuda.core to the local cuda.bindings wheel + run: | + CUDA_MAJOR="$(echo '${{ inputs.cuda-version }}' | cut -d. -f1)" + pathfinder_wheels=(cuda_pathfinder/dist/cuda_pathfinder-*.whl) + bindings_wheels=(cuda_bindings/dist/cuda_bindings-"${CUDA_MAJOR}".*.whl) + test "${#pathfinder_wheels[@]}" -eq 1 + test "${#bindings_wheels[@]}" -eq 1 + test -f "${pathfinder_wheels[0]}" + test -f "${bindings_wheels[0]}" + mkdir -p wheel-constraints + pathfinder_uri="file:///$(cygpath -am "${pathfinder_wheels[0]}")" + bindings_uri="file:///$(cygpath -am "${bindings_wheels[0]}")" + { + printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" + printf 'cuda-bindings @ %s\n' "${bindings_uri}" + } | tee wheel-constraints/cuda-core.txt + # cuda_core sdist delegates to setuptools (no CTK needed), but # wheel-from-sdist needs CTK and cuda-bindings (dynamic build dep via # get_requires_for_build_wheel in build_hooks.py). @@ -91,6 +116,7 @@ jobs: run: | export CUDA_PYTHON_PARALLEL_LEVEL=$(nproc) export CUDA_CORE_BUILD_MAJOR="$(echo '${{ inputs.cuda-version }}' | cut -d. -f1)" - export PIP_FIND_LINKS="$(cygpath -w "$(pwd)/cuda_bindings/dist") $(cygpath -w "$(pwd)/cuda_pathfinder/dist")" + export PIP_BUILD_CONSTRAINT="$(cygpath -w "$(pwd)/wheel-constraints/cuda-core.txt")" + export PIP_CONSTRAINT="${PIP_BUILD_CONSTRAINT}" python -m build --sdist cuda_core/ pip wheel --no-deps --wheel-dir cuda_core/dist cuda_core/dist/*.tar.gz diff --git a/.github/workflows/test-wheel-linux.yml b/.github/workflows/test-wheel-linux.yml index 4971d56f832..4235e01d321 100644 --- a/.github/workflows/test-wheel-linux.yml +++ b/.github/workflows/test-wheel-linux.yml @@ -303,6 +303,12 @@ jobs: # 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: ${{ 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 @@ -311,18 +317,6 @@ jobs: host-platform: ${{ inputs.host-platform }} cuda-version: ${{ matrix.CUDA_VER }} - # TODO: remove the numpy wheel steps once 3.15 is officially supported - - name: Download numpy wheel (pre-release Python) - if: ${{ startsWith(matrix.PY_VER, '3.15') }} - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - with: - name: numpy-python${{ env.PYTHON_VERSION_FORMATTED }}-${{ inputs.host-platform }} - path: numpy-wheel - - - name: Install numpy wheel (pre-release Python) - if: ${{ startsWith(matrix.PY_VER, '3.15') }} - run: pip install numpy-wheel/*.whl - - name: Set up latest cuda_sanitizer_api if: ${{ env.SETUP_SANITIZER == '1' }} uses: ./.github/actions/fetch_ctk @@ -352,9 +346,6 @@ jobs: env: CUDA_VER: ${{ matrix.CUDA_VER }} LOCAL_CTK: ${{ matrix.LOCAL_CTK }} - # #2299: BAR-size query returns CUDA_ERROR_NOT_SUPPORTED on G+H; - # skip the test on gh200 runners until upstream cufile guards it. - PYTEST_ADDOPTS: ${{ matrix.GPU == 'gh200' && '--deselect tests/test_cufile.py::test_get_bar_size_in_kb' || '' }} run: run-tests bindings - name: Run cuda.bindings benchmarks (smoke test) @@ -434,7 +425,7 @@ jobs: if: ${{ inputs.test-mode == 'nightly-pytorch' }} run: | pushd cuda_core - pytest -rxXs -v --durations=0 tests/test_utils.py tests/example_tests/ + pytest -rxXs -v tests/test_utils.py tests/example_tests/ popd - name: Run numba-cuda tests @@ -494,7 +485,7 @@ jobs: --deselect 'tests/numba_cuda_tests/cudadrv/test_nvjitlink.py::TestLinkerDumpAssembly::test_nvjitlink_jit_with_linkable_code_lto_dump_assembly_warn' ) fi - pytest -rxXs -v --durations=0 \ + pytest -rxXs -v \ --ignore=tests/benchmarks \ --ignore=tests/doc_examples \ "${DESELECTS[@]}" \ @@ -531,7 +522,7 @@ jobs: --deselect 'tests/test_enum_coverage.py::test_wrapper_covers_all_binding_members[NvlinkVersion]' ) fi - pytest -rxXs -v --durations=0 --randomly-dont-reorganize \ + pytest -rxXs -v --randomly-dont-reorganize \ "${DESELECTS[@]}" \ tests/ popd diff --git a/.github/workflows/test-wheel-windows.yml b/.github/workflows/test-wheel-windows.yml index e2ff59f39e5..91da06d9eac 100644 --- a/.github/workflows/test-wheel-windows.yml +++ b/.github/workflows/test-wheel-windows.yml @@ -277,6 +277,15 @@ 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: ${{ 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" - name: Verify LongPathsEnabled run: | @@ -295,19 +304,6 @@ jobs: host-platform: ${{ inputs.host-platform }} cuda-version: ${{ matrix.CUDA_VER }} - # TODO: remove the numpy wheel steps once 3.15 is officially supported - - name: Download numpy wheel (pre-release Python) - if: ${{ startsWith(matrix.PY_VER, '3.15') }} - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - with: - name: numpy-python${{ env.PYTHON_VERSION_FORMATTED }}-${{ inputs.host-platform }} - path: numpy-wheel - - - name: Install numpy wheel (pre-release Python) - if: ${{ startsWith(matrix.PY_VER, '3.15') }} - shell: bash --noprofile --norc -xeuo pipefail {0} - run: pip install numpy-wheel/*.whl - - name: Set up test repetition on nightly runs shell: bash --noprofile --norc -xeuo pipefail {0} run: echo "PYTEST_ADDOPTS=\"--count=${{ inputs.nruns }}\"" >> "$GITHUB_ENV" @@ -413,7 +409,7 @@ jobs: shell: bash --noprofile --norc -xeuo pipefail {0} run: | pushd cuda_core - pytest -rxXs -v --durations=0 tests/test_utils.py tests/example_tests/ + pytest -rxXs -v tests/test_utils.py tests/example_tests/ popd - name: Run numba-cuda tests @@ -456,7 +452,7 @@ jobs: --deselect 'tests/numba_cuda_tests/cudapy/test_cuda_array_interface.py::TestCudaArrayInterface::test_fortran_contiguous' ) fi - pytest -rxXs -v --durations=0 \ + pytest -rxXs -v \ --ignore=tests/benchmarks \ --ignore=tests/doc_examples \ "${DESELECTS[@]}" \ @@ -498,7 +494,7 @@ jobs: --deselect 'tests/test_memory.py::test_non_managed_resources_report_not_managed[pinned]' ) fi - pytest -rxXs -v --durations=0 --randomly-dont-reorganize \ + pytest -rxXs -v --randomly-dont-reorganize \ "${DESELECTS[@]}" \ tests/ popd diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 029e69da916..62220467b71 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,12 +9,20 @@ ci: autoupdate_branch: '' autoupdate_commit_msg: '[pre-commit.ci] pre-commit autoupdate' autoupdate_schedule: quarterly - skip: [lychee, check-precommit-installed] + skip: [lychee, check-precommit-installed, secret-scan-trufflehog] submodules: false # Please update the rev: SHAs below with this command: # pre-commit autoupdate --freeze repos: + # Runs first so a leaked credential blocks the commit before any formatter runs. + # Self-installing: the hook downloads a pinned, checksum-verified trufflehog on + # first use (no manual install). Skipped on pre-commit.ci; Pulse CI enforces server-side. + - repo: https://github.com/NVIDIA/security-workflows + rev: 711025b090f2aa728da576700750b195d1e816dc # frozen: v0.3.0 + hooks: + - id: secret-scan-trufflehog + - repo: https://github.com/astral-sh/ruff-pre-commit rev: c60c980e561ed3e73101667fe8365c609d19a438 # frozen: v0.15.9 hooks: @@ -50,6 +58,20 @@ repos: files: ^cuda_bindings/ types: [text] + - id: check-pixi-cuda-version + name: Check pixi cuda-version pins track ci/versions.yml + entry: python ./ci/tools/check_pixi_cuda_version.py + language: python + additional_dependencies: [pyyaml==6.0.3] + files: '^(ci/versions\.yml|cuda_bindings/pixi\.toml|cuda_core/pixi\.toml)$' + pass_filenames: false + + - id: check-mempool-hygiene + name: Check tests do not create uncapped memory pools + entry: python ./ci/tools/check_mempool_hygiene.py + language: python + files: '^cuda_core/tests/.*\.py$' + - id: no-markdown-in-docs-source name: Prevent markdown files in docs/source directories entry: bash -c @@ -61,13 +83,13 @@ repos: - id: stubgen-pyx-cuda-core name: Generate .pyi stubs for cuda_core - entry: stubgen-pyx cuda_core/cuda --continue-on-error --include-private + entry: python ./toolshed/run_stubgen_pyx.py language: python files: ^cuda_core/cuda/.*\.(pyx|pxd)$ pass_filenames: false additional_dependencies: - stubgen-pyx==0.2.6 - - Cython==3.2.4 + - Cython==3.2.9 # Link checking for authored documentation files - repo: https://github.com/lycheeverse/lychee @@ -95,7 +117,7 @@ repos: - id: check-yaml - id: debug-statements - id: end-of-file-fixer - exclude: &gen_exclude '^(?:cuda_python/README\.md|cuda_bindings/cuda/bindings/.*\.in?|cuda_bindings/docs/source/module/.*\.rst?|.*\.pyi)$' + exclude: &gen_exclude '^(?:cuda_python/README\.md|(?:.*/)?CLAUDE\.md|(?:.*/)?\.git_archival\.txt|cuda_bindings/cuda/bindings/.*\.in?|cuda_bindings/docs/source/module/.*\.rst?|.*\.pyi)$' - id: mixed-line-ending - id: trailing-whitespace exclude: | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 012126cc842..7474ac4d840 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,8 +19,13 @@ Thank you for your interest in contributing to CUDA Python! Based on the type of - [Contributing to CUDA Python](#contributing-to-cuda-python) - [Table of Contents](#table-of-contents) + - [Cloning the repository](#cloning-the-repository) + - [Recommended clone](#recommended-clone) + - [Fixing an existing clone](#fixing-an-existing-clone) + - [Symptoms of a bad clone](#symptoms-of-a-bad-clone) - [Type stubs for cuda.core](#type-stubs-for-cudacore) - [Pre-commit](#pre-commit) + - [Pre-commit on Windows](#pre-commit-on-windows) - [Signing Your Work](#signing-your-work) - [Code signing](#code-signing) - [Developer Certificate of Origin (DCO)](#developer-certificate-of-origin-dco) @@ -34,6 +39,94 @@ Thank you for your interest in contributing to CUDA Python! Based on the type of - [Code coverage](#code-coverage) +## Cloning the repository + +Every package in this repository derives its version from git tags using +[`setuptools-scm`](https://setuptools-scm.readthedocs.io/), so **how you clone +determines whether you can build at all, and whether the version you build is +correct.** Each package matches its own tag prefix: + +| Package | Tag pattern | +| --- | --- | +| `cuda-bindings`, `cuda-python` | `v*` (e.g. `v13.3.1`) | +| `cuda-core` | `cuda-core-v*` (e.g. `cuda-core-v1.1.0`) | +| `cuda-pathfinder` | `cuda-pathfinder-v*` (e.g. `cuda-pathfinder-v1.6.0`) | + +Each package sets `root = ".."` in its `[tool.setuptools_scm]` table, meaning the +version is read from the *repository root* rather than the package directory. A +working build therefore needs all of the following: + +1. **A real git clone.** Source zips and GitHub "Download ZIP" archives have no + git metadata and the build fails outright. (Tarballs produced by + `git archive` do work, thanks to the `.git_archival.txt` substitutions + configured in `.gitattributes`.) +2. **The full repository**, not just the package subdirectory, because the + version lookup walks up to the repository root. +3. **Tags, reaching back at least as far as the most recent tag** matching the + package you are building. `git describe` needs to find that tag; the history + between it and your checkout must be present too. + +### Recommended clone + +The default `git clone` gives you everything you need: + +```console +$ git clone https://github.com/NVIDIA/cuda-python.git +``` + + + +### Fixing an existing clone + +If you already have a shallow clone: + +```console +$ git fetch --unshallow --tags +``` + +If you are working from a personal fork, your fork's tags stop tracking upstream +the moment new releases are cut, which silently yields a stale version. Fetch +tags from upstream directly: + +```console +$ git remote add upstream https://github.com/NVIDIA/cuda-python.git +$ git fetch --tags upstream +``` + +Keep doing this periodically — a fork that was correct when you created it will +drift. + +### Symptoms of a bad clone + +Only case 3 below reports an error. The first two fail *silently*, producing a +wrong version that surfaces much later as a confusing dependency-resolution or +version-check failure: + +1. **No tags reachable.** The build succeeds and produces a version starting at + `0.1.dev`: a `--depth 1` clone yields `0.1.dev1+g0d22cb444`, a full clone made + with `--no-tags` yields `0.1.dev2114+g0d22cb444`. Installing `cuda-python` + built this way then fails, because its `install_requires` pins + `cuda-bindings` to that same bogus version. +2. **Stale tags** (a fork that has not fetched upstream in a while): you get a + plausible-looking but wrong version, e.g. `13.0.4.dev650+g0d22cb44` when the + real latest tag is `v13.3.1`. Nothing warns you. Note there is no leading + `v` — the tag prefix is stripped by `tag_regex`. +3. **No git metadata** (source zip): the build fails with + `LookupError: setuptools-scm was unable to detect version`. + +As a last resort — for example when building inside a container that has no git +history — you can bypass the lookup entirely: + +```console +$ SETUPTOOLS_SCM_PRETEND_VERSION_FOR_CUDA_CORE=1.1.0 pip install ./cuda_core +``` + +The environment variable is suffixed with the distribution name, uppercased with +hyphens replaced by underscores: `..._FOR_CUDA_BINDINGS`, `..._FOR_CUDA_CORE`, +`..._FOR_CUDA_PATHFINDER`, `..._FOR_CUDA_PYTHON`. Use this only when you +genuinely cannot provide tags; it is not a substitute for a correct clone. + + ## Type stubs for cuda.core `cuda.core` is a PEP 561-compliant package: it ships a `py.typed` marker and @@ -74,6 +167,22 @@ between commits, leaving stale headers or out-of-date stubs in the history. If the hook isn't installed, `pre-commit run` (and CI) will print a visible warning reminding you to run `pre-commit install`. +### Pre-commit on Windows + +For development on Windows (not WSL), the `lychee` pre-commit task will not work +when running `pre-commit run --all-files`. This problem does not occur if you +install the pre-commit hook and run it automatically as part of your `git +commit` workflow. To resolve this, you can either: + +1. Run `pre-commit` in Git Bash, rather than directly in PowerShell or cmd + +2. Skip it by setting the environment variable `SKIP` to `lychee`. This would + be `$env:SKIP = "lychee"` in PowerShell or `set SKIP=lychee` in cmd. + +## Secret Scanning + +The `secret-scan-trufflehog` pre-commit hook scans staged files and installs TruffleHog into its own environment on first run, on Linux, macOS, and Windows. If it flags a secret, remove it before committing, or contact a maintainer if it's a false positive. Secrets are also scanned server-side in CI. + ## Signing Your Work diff --git a/README.md b/README.md index 243669b69ee..10d0bc6a0cf 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,12 @@ CUDA Python is the home for accessing NVIDIA’s CUDA platform from Python. It c * [cuda.core](https://nvidia.github.io/cuda-python/cuda-core/latest): Pythonic access to CUDA Runtime and other core functionality * [cuda.bindings](https://nvidia.github.io/cuda-python/cuda-bindings/latest): Low-level Python bindings to CUDA C APIs * [cuda.pathfinder](https://nvidia.github.io/cuda-python/cuda-pathfinder/latest): Utilities for locating CUDA components installed in the user's Python environment -* [cuda.coop](https://nvidia.github.io/cccl/unstable/python/coop.html): A Python module providing CCCL's reusable block-wide and warp-wide *device* primitives for use within Numba CUDA kernels * [cuda.compute](https://nvidia.github.io/cccl/unstable/python/compute/index.html): A Python module for easy access to CCCL's highly efficient and customizable parallel algorithms, like `sort`, `scan`, `reduce`, `transform`, etc. that are callable on the *host* * [numba-cuda-mlir](https://nvidia.github.io/numba-cuda-mlir/): An evolution of Numba CUDA that improves upon its technical foundation and performance to provide the future of CUDA Python JIT compilation. It currently supports developing CUDA **SIMT** kernels in Python, providing Python bindings for accelerated device libraries, and serving as a compiler for user-defined functions in accelerated libraries. * [numba.cuda](https://nvidia.github.io/numba-cuda/): A Python DSL that exposes CUDA **SIMT** programming model and compiles a restricted subset of Python code into CUDA kernels and device functions * [cuda.tile](https://docs.nvidia.com/cuda/cutile-python/): A new Python DSL that exposes CUDA **Tile** programming model and allows users to write NumPy-like code in CUDA kernels * [nvmath-python](https://docs.nvidia.com/cuda/nvmath-python/latest): Pythonic access to NVIDIA CPU & GPU Math Libraries, with [*host*](https://docs.nvidia.com/cuda/nvmath-python/latest/overview.html#host-apis), [*device*](https://docs.nvidia.com/cuda/nvmath-python/latest/overview.html#device-apis), and [*distributed*](https://docs.nvidia.com/cuda/nvmath-python/latest/distributed-apis/index.html) APIs. It also provides low-level Python bindings to host C APIs ([nvmath.bindings](https://docs.nvidia.com/cuda/nvmath-python/latest/bindings/index.html)). -* [nvshmem4py](https://docs.nvidia.com/nvshmem/api/api/language_bindings/python/index.html): Pythonic interface to the NVSHMEM library, enabling Python applications to leverage NVSHMEM's high-performance PGAS (Partitioned Global Address Space) programming model for GPU-accelerated computing +* [nvshmem4py](https://docs.nvidia.com/nvshmem/api/latest/api/language_bindings/python/index.html): Pythonic interface to the NVSHMEM library, enabling Python applications to leverage NVSHMEM's high-performance PGAS (Partitioned Global Address Space) programming model for GPU-accelerated computing * [Nsight Python](https://docs.nvidia.com/nsight-python/index.html): Python kernel profiling interface that automates performance analysis across multiple kernel configurations using NVIDIA Nsight Tools * [CUPTI Python](https://docs.nvidia.com/cupti-python/): Python APIs for creation of profiling tools that target CUDA Python applications via the CUDA Profiling Tools Interface (CUPTI) * [Accelerated Computing Hub](https://github.com/NVIDIA/accelerated-computing-hub): Open-source learning materials related to GPU computing. You will find user guides, tutorials, and other works freely available for all learners interested in GPU computing. diff --git a/ci/test-matrix.yml b/ci/test-matrix.yml index 0adb0142ae7..563774494e9 100644 --- a/ci/test-matrix.yml +++ b/ci/test-matrix.yml @@ -128,6 +128,7 @@ 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' } + - { ARCH: 'amd64', PY_VER: '3.15', CUDA_VER: '13.3.0', LOCAL_CTK: '0', GPU: 'l4', GPU_COUNT: '1', DRIVER: 'latest', DRIVER_MODE: 'MCDM' } # 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' } diff --git a/ci/tools/check_mempool_hygiene.py b/ci/tools/check_mempool_hygiene.py new file mode 100644 index 00000000000..b200aba1ebb --- /dev/null +++ b/ci/tools/check_mempool_hygiene.py @@ -0,0 +1,113 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Check that tests do not create uncapped CUDA memory pools. + +A pool created without ``max_size`` reserves an address-space window sized from +installed device memory rather than from what the test allocates, and the whole +cuda_core suite shares one process. Enough of those reservations exhaust the +address space, after which the rest of the session fails with +CUDA_ERROR_OUT_OF_MEMORY on a device with free physical memory. + +See cuda_core/tests/AGENTS.md for the rule this enforces. +""" + +from __future__ import annotations + +import argparse +import ast +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +DEFAULT_TREE = ROOT / "cuda_core" / "tests" + +# Managed pools cannot be right-sized: cuMemPoolCreate requires maxSize == 0 for +# managed pools, so ManagedMemoryResourceOptions has no max_size to set. +CAPPABLE_OPTIONS = frozenset({"DeviceMemoryResourceOptions", "PinnedMemoryResourceOptions"}) +CAPPABLE_RESOURCES = frozenset({"DeviceMemoryResource", "PinnedMemoryResource"}) + +OPT_OUT_MARKER = "uncapped-pool-ok" + + +def _callee_name(node: ast.Call) -> str: + func = node.func + if isinstance(func, ast.Attribute): + return func.attr + if isinstance(func, ast.Name): + return func.id + return "" + + +def _is_capped(node: ast.Call) -> bool: + # ``**kwargs`` (arg is None) may carry max_size; do not guess. + return any(kw.arg is None or kw.arg == "max_size" for kw in node.keywords) + + +def _dict_is_capped(node: ast.Dict) -> bool: + for key in node.keys: + if key is None: # ``**other`` inside the literal + return True + if isinstance(key, ast.Constant) and key.value == "max_size": + return True + return False + + +def _opted_out(lines: list[str], node: ast.AST) -> bool: + """True if the call, or the line above it, carries the opt-out marker.""" + start = max(node.lineno - 2, 0) # -1 for 0-based, -1 more for a preceding comment + end = getattr(node, "end_lineno", node.lineno) + return any(OPT_OUT_MARKER in line for line in lines[start:end]) + + +def violations_in(path: Path) -> list[str]: + """Return one message per uncapped pool construction in ``path``.""" + source = path.read_text(encoding="utf-8") + lines = source.splitlines() + found = [] + for node in ast.walk(ast.parse(source, filename=str(path))): + if not isinstance(node, ast.Call): + continue + name = _callee_name(node) + if name in CAPPABLE_OPTIONS: + uncapped = not _is_capped(node) + elif name in CAPPABLE_RESOURCES: + # The options may also be given as a dict literal. + dicts = [arg for arg in [*node.args, *(kw.value for kw in node.keywords)] if isinstance(arg, ast.Dict)] + uncapped = any(not _dict_is_capped(d) for d in dicts) + else: + continue + if uncapped and not _opted_out(lines, node): + found.append(f"{path.as_posix()}:{node.lineno}: {name} without max_size") + return found + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "paths", + nargs="*", + type=Path, + help=f"Files to check. Defaults to every .py under {DEFAULT_TREE.relative_to(ROOT).as_posix()}.", + ) + args = parser.parse_args(argv) + + paths = args.paths or sorted(DEFAULT_TREE.rglob("*.py")) + violations = sorted(v for path in paths if path.suffix == ".py" for v in violations_in(path)) + if not violations: + return 0 + + print("error: memory pools created by tests must set max_size:", file=sys.stderr) + for violation in violations: + print(f" - {violation}", file=sys.stderr) + print( + f"Use the suite-wide POOL_SIZE from cuda_core/tests/helpers/constants.py, or annotate a\n" + f"deliberate exception with a '# {OPT_OUT_MARKER}: ' comment.\n" + f"See cuda_core/tests/AGENTS.md.", + file=sys.stderr, + ) + return 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ci/tools/check_pixi_cuda_version.py b/ci/tools/check_pixi_cuda_version.py new file mode 100644 index 00000000000..1ca931b9b48 --- /dev/null +++ b/ci/tools/check_pixi_cuda_version.py @@ -0,0 +1,91 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Check pixi cuda-version pins track ci/versions.yml (cuda.build.version).""" + +from __future__ import annotations + +import sys +from pathlib import Path + +import tomllib +import yaml + +ROOT = Path(__file__).resolve().parents[2] +VERSIONS_FILE_PATH = ROOT / "ci" / "versions.yml" +PIXI_FILES = [ROOT / d / "pixi.toml" for d in ("cuda_bindings", "cuda_core")] + + +def main() -> int: + """Verify cuda_bindings/cuda_core pixi pins match ci/versions.yml.""" + if not VERSIONS_FILE_PATH.is_file(): + print(f"error: {VERSIONS_FILE_PATH} not found", file=sys.stderr) + return 2 + try: + build_version = yaml.safe_load(VERSIONS_FILE_PATH.read_text(encoding="utf-8"))["cuda"]["build"]["version"] + except (KeyError, TypeError): + print(f"error: cuda.build.version not found in {VERSIONS_FILE_PATH}", file=sys.stderr) + return 2 + + major, minor, *_ = build_version.split(".") + expected = f"{major}.{minor}.*" + cuda_feature = f"cu{major}" + + errors: list[str] = [] + checked: list[str] = [] + for path in PIXI_FILES: + if not path.is_file(): + print(f"error: {path} not found", file=sys.stderr) + return 2 + with path.open("rb") as f: + data = tomllib.load(f) + rel = path.relative_to(ROOT) + try: + variants = data["workspace"]["build-variants"]["cuda-version"] + cuda_pin = data["feature"][cuda_feature]["dependencies"]["cuda-version"] + except KeyError as exc: + print( + f"error: {rel} missing feature {cuda_feature!r} or cuda-version key: {exc}", + file=sys.stderr, + ) + return 2 + if expected not in variants: + errors.append( + f"{rel}: workspace.build-variants.cuda-version={variants!r} " + f"does not include {expected!r} " + f"(from ci/versions.yml cuda.build.version={build_version!r})" + ) + if cuda_pin != expected: + errors.append( + f"{rel}: feature.{cuda_feature}.dependencies.cuda-version={cuda_pin!r} " + f"!= {expected!r} " + f"(from ci/versions.yml cuda.build.version={build_version!r})" + ) + + checked.append( + f"{rel} (workspace.build-variants.cuda-version={variants!r}, " + f"feature.{cuda_feature}.dependencies.cuda-version={cuda_pin!r})" + ) + + if errors: + print( + f"error: cuda_bindings/cuda_core pixi cuda-version pins out of sync with " + f"ci/versions.yml cuda.build.version={build_version!r} " + f"(expected pin {expected!r}):", + file=sys.stderr, + ) + for err in errors: + print(f" - {err}", file=sys.stderr) + return 1 + + print( + f"OK: pixi cuda-version pins match ci/versions.yml " + f"cuda.build.version={build_version!r} (expected pin {expected!r}):" + ) + for item in checked: + print(f" - {item}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ci/tools/merge_cuda_core_wheels.py b/ci/tools/merge_cuda_core_wheels.py index c66a1bfa2a8..23a8a21289f 100644 --- a/ci/tools/merge_cuda_core_wheels.py +++ b/ci/tools/merge_cuda_core_wheels.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 @@ -27,10 +27,9 @@ import tempfile import zipfile from pathlib import Path -from typing import List -def run_command(cmd: List[str], cwd: Path | None = None, env: dict = os.environ) -> subprocess.CompletedProcess: +def run_command(cmd: list[str], cwd: Path | None = None, env: dict = os.environ) -> subprocess.CompletedProcess: """Run a command with error handling.""" print(f"Running: {' '.join(cmd)}") if cwd: @@ -78,7 +77,7 @@ def print_wheel_directory_structure(wheel_path: Path, filter_prefix: str = "cuda print(f"Warning: Could not list wheel contents: {e}", file=sys.stderr) -def merge_wheels(wheels: List[Path], output_dir: Path, show_wheel_contents: bool = True) -> Path: +def merge_wheels(wheels: list[Path], output_dir: Path, show_wheel_contents: bool = True) -> Path: """Merge multiple wheels into a single wheel with version-specific binaries.""" print("\n=== Merging wheels ===", file=sys.stderr) print(f"Input wheels: {[w.name for w in wheels]}", file=sys.stderr) diff --git a/ci/tools/run-tests b/ci/tools/run-tests index c093ed9e4d2..f9cc5a9e870 100755 --- a/ci/tools/run-tests +++ b/ci/tools/run-tests @@ -36,7 +36,7 @@ if [[ "${test_module}" == "pathfinder" ]]; then "LD:${CUDA_PATHFINDER_TEST_LOAD_NVIDIA_DYNAMIC_LIB_STRICTNESS} " \ "FH:${CUDA_PATHFINDER_TEST_FIND_NVIDIA_HEADERS_STRICTNESS} " \ "BC:${CUDA_PATHFINDER_TEST_FIND_NVIDIA_BITCODE_LIB_STRICTNESS}" - pytest -ra -s -v --durations=0 tests/ |& tee /tmp/pathfinder_test_log.txt + pytest -ra -s -v tests/ |& tee /tmp/pathfinder_test_log.txt # Report the number of "INFO test_" lines (including zero) # to support quick validations based on GHA log archives. line_count=$(awk '/^INFO test_/ {count++} END {print count+0}' /tmp/pathfinder_test_log.txt) @@ -51,9 +51,9 @@ elif [[ "${test_module}" == "bindings" ]]; then pip install $(ls "${CUDA_BINDINGS_ARTIFACTS_DIR}"/*.whl)[all] --group test fi echo "Running bindings tests" - ${SANITIZER_CMD} pytest -rxXs -v --durations=0 --randomly-dont-reorganize tests/ + ${SANITIZER_CMD} pytest -rxXs -v --randomly-dont-reorganize tests/ if [[ "${SKIP_CYTHON_TEST}" == 0 ]]; then - ${SANITIZER_CMD} pytest -rxXs -v --durations=0 --randomly-dont-reorganize tests/cython + ${SANITIZER_CMD} pytest -rxXs -v --randomly-dont-reorganize tests/cython fi popd elif [[ "${test_module}" == "core" || "${test_module}" == nightly-* ]]; then @@ -105,11 +105,11 @@ elif [[ "${test_module}" == "core" || "${test_module}" == nightly-* ]]; then echo "Installed packages before core tests:" pip list echo "Running core tests" - ${SANITIZER_CMD} pytest -rxXs -v --durations=0 --randomly-dont-reorganize tests/ + ${SANITIZER_CMD} pytest -rxXs -v --randomly-dont-reorganize tests/ # Currently our CI always installs the latest bindings (from either major version). # This is not compatible with the test requirements. if [[ "${SKIP_CYTHON_TEST}" == 0 ]]; then - ${SANITIZER_CMD} pytest -rxXs -v --durations=0 --randomly-dont-reorganize tests/cython + ${SANITIZER_CMD} pytest -rxXs -v --randomly-dont-reorganize tests/cython fi popd elif [[ "${test_module}" == "nightly-cuda-core" ]]; then diff --git a/ci/tools/tests/test_check_mempool_hygiene.py b/ci/tools/tests/test_check_mempool_hygiene.py new file mode 100644 index 00000000000..5ff3562059b --- /dev/null +++ b/ci/tools/tests/test_check_mempool_hygiene.py @@ -0,0 +1,96 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +import os +import sys + +import pytest + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) +from check_mempool_hygiene import DEFAULT_TREE, main, violations_in + + +def write(tmp_path, source): + path = tmp_path / "test_sample.py" + path.write_text(source, encoding="utf-8") + return path + + +UNCAPPED = [ + pytest.param("DeviceMemoryResource(dev, DeviceMemoryResourceOptions(ipc_enabled=True))", id="options-kwarg"), + pytest.param("PinnedMemoryResource(PinnedMemoryResourceOptions())", id="options-empty"), + pytest.param('DeviceMemoryResource(dev, {"ipc_enabled": True})', id="options-dict"), +] + +CAPPED = [ + pytest.param("DeviceMemoryResource(dev, DeviceMemoryResourceOptions(max_size=POOL_SIZE))", id="capped-kwarg"), + pytest.param('DeviceMemoryResource(dev, {"max_size": POOL_SIZE})', id="capped-dict"), + pytest.param("DeviceMemoryResource(dev, DeviceMemoryResourceOptions(**opts))", id="opaque-kwargs"), + # No options at all wraps the device's default pool and reserves nothing, so + # capping it would convert a free wrapper into a new pool. + pytest.param("DeviceMemoryResource(dev)", id="default-pool-wrapper"), + # cuMemPoolCreate requires maxSize == 0 for managed pools, so these have no + # max_size to set. + pytest.param("ManagedMemoryResource(ManagedMemoryResourceOptions(preferred_location=0))", id="managed-exempt"), +] + + +@pytest.mark.agent_authored(model="claude-opus-5") +@pytest.mark.parametrize("source", UNCAPPED) +def test_uncapped_pool_is_reported(tmp_path, source): + assert violations_in(write(tmp_path, source)) + + +@pytest.mark.agent_authored(model="claude-opus-5") +@pytest.mark.parametrize("source", CAPPED) +def test_acceptable_construction_is_not_reported(tmp_path, source): + assert violations_in(write(tmp_path, source)) == [] + + +@pytest.mark.agent_authored(model="claude-opus-5") +@pytest.mark.parametrize("comment_line", [0, 1], ids=["marker-above", "marker-inline"]) +def test_marker_opts_a_call_out(tmp_path, comment_line): + # The escape hatch exists mainly for pytest.raises cases, where validation + # rejects the arguments before any pool is created. + call = "PinnedMemoryResource(PinnedMemoryResourceOptions())" + marker = "# uncapped-pool-ok: raises before the pool is created" + source = f"{marker}\n{call}" if comment_line == 0 else f"{call} {marker}" + + assert violations_in(write(tmp_path, source)) == [] + + +@pytest.mark.agent_authored(model="claude-opus-5") +def test_reported_message_names_file_line_and_symbol(tmp_path): + path = write(tmp_path, "x = 1\nDeviceMemoryResource(dev, DeviceMemoryResourceOptions())\n") + + (violation,) = violations_in(path) + + assert violation.startswith(path.as_posix()) + assert ":2:" in violation + assert "DeviceMemoryResourceOptions without max_size" in violation + + +@pytest.mark.agent_authored(model="claude-opus-5") +def test_main_reports_failure_for_the_files_it_is_given(tmp_path, capsys): + path = write(tmp_path, "DeviceMemoryResource(dev, DeviceMemoryResourceOptions())") + + assert main([str(path)]) == 1 + assert "must set max_size" in capsys.readouterr().err + + +@pytest.mark.agent_authored(model="claude-opus-5") +def test_main_ignores_non_python_files(tmp_path): + unrelated = tmp_path / "notes.txt" + unrelated.write_text("DeviceMemoryResourceOptions()", encoding="utf-8") + + assert main([str(unrelated)]) == 0 + + +@pytest.mark.agent_authored(model="claude-opus-5") +def test_the_live_test_suite_is_clean(): + # Without a default the hook would only ever see changed files, so a + # violation could ride in on a rename or a merge. + assert DEFAULT_TREE.is_dir() + assert main([]) == 0 diff --git a/cuda_bindings/build_hooks.py b/cuda_bindings/build_hooks.py index a50133f9777..99ad5c66268 100644 --- a/cuda_bindings/build_hooks.py +++ b/cuda_bindings/build_hooks.py @@ -16,6 +16,7 @@ import sys import sysconfig import tempfile +from pathlib import Path from warnings import warn from setuptools import build_meta as _build_meta @@ -50,9 +51,9 @@ def _import_get_cuda_path_or_home(): cuda = None for p in sys.path: - sp_cuda = os.path.join(p, "cuda") - if os.path.isdir(os.path.join(sp_cuda, "pathfinder")): - cuda.__path__ = list(cuda.__path__) + [sp_cuda] + sp_cuda = Path(p) / "cuda" + if (sp_cuda / "pathfinder").is_dir(): + cuda.__path__ = list(cuda.__path__) + [str(sp_cuda)] break else: raise ModuleNotFoundError( @@ -61,6 +62,11 @@ def _import_get_cuda_path_or_home(): ) import cuda.pathfinder + pathfinder_dir = Path(cuda.pathfinder.__file__).parent + print( + f"Using cuda-pathfinder {cuda.pathfinder.__version__} from {pathfinder_dir}", + file=sys.stderr, + ) return cuda.pathfinder.get_cuda_path_or_home diff --git a/cuda_bindings/cuda/bindings/_internal/cufile.pxd b/cuda_bindings/cuda/bindings/_internal/cufile.pxd index b8fe03b779d..41786b1f25b 100644 --- a/cuda_bindings/cuda/bindings/_internal/cufile.pxd +++ b/cuda_bindings/cuda/bindings/_internal/cufile.pxd @@ -3,8 +3,16 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=1788ebb3c332e99a6dc0dcd98c5af472bf42c1c960ba70cb65f294a81712491d + + +# <<<< PREAMBLE CONTENT >>>> + +from libcpp cimport bool as _cyb_bool + + +# <<<< END OF PREAMBLE CONTENT >>>> -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=b70fdd33eb00b70224c097fb28dd1031d82e8a2930356a4428c93e3bd1b52a86 from ..cycufile cimport * @@ -23,7 +31,7 @@ cdef CUfileError_t _cuFileDriverClose() except?CUFILE_LOADING_ERR cdef CUfileError_t _cuFileDriverClose_v2() except?CUFILE_LOADING_ERROR nogil cdef long _cuFileUseCount() except* nogil cdef CUfileError_t _cuFileDriverGetProperties(CUfileDrvProps_t* props) except?CUFILE_LOADING_ERROR nogil -cdef CUfileError_t _cuFileDriverSetPollMode(cpp_bool poll, size_t poll_threshold_size) except?CUFILE_LOADING_ERROR nogil +cdef CUfileError_t _cuFileDriverSetPollMode(_cyb_bool poll, size_t poll_threshold_size) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t _cuFileDriverSetMaxDirectIOSize(size_t max_direct_io_size) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t _cuFileDriverSetMaxCacheSize(size_t max_cache_size) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t _cuFileDriverSetMaxPinnedMemSize(size_t max_pinned_size) except?CUFILE_LOADING_ERROR nogil @@ -38,10 +46,10 @@ cdef CUfileError_t _cuFileStreamRegister(CUstream stream, unsigned flags) except cdef CUfileError_t _cuFileStreamDeregister(CUstream stream) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t _cuFileGetVersion(int* version) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t _cuFileGetParameterSizeT(CUFileSizeTConfigParameter_t param, size_t* value) except?CUFILE_LOADING_ERROR nogil -cdef CUfileError_t _cuFileGetParameterBool(CUFileBoolConfigParameter_t param, cpp_bool* value) except?CUFILE_LOADING_ERROR nogil +cdef CUfileError_t _cuFileGetParameterBool(CUFileBoolConfigParameter_t param, _cyb_bool* value) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t _cuFileGetParameterString(CUFileStringConfigParameter_t param, char* desc_str, int len) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t _cuFileSetParameterSizeT(CUFileSizeTConfigParameter_t param, size_t value) except?CUFILE_LOADING_ERROR nogil -cdef CUfileError_t _cuFileSetParameterBool(CUFileBoolConfigParameter_t param, cpp_bool value) except?CUFILE_LOADING_ERROR nogil +cdef CUfileError_t _cuFileSetParameterBool(CUFileBoolConfigParameter_t param, _cyb_bool value) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t _cuFileSetParameterString(CUFileStringConfigParameter_t param, const char* desc_str) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t _cuFileGetParameterMinMaxValue(CUFileSizeTConfigParameter_t param, size_t* min_value, size_t* max_value) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t _cuFileSetStatsLevel(int level) except?CUFILE_LOADING_ERROR nogil diff --git a/cuda_bindings/cuda/bindings/_internal/cufile_linux.pyx b/cuda_bindings/cuda/bindings/_internal/cufile_linux.pyx index 1491c4588aa..4bd16e9ec4a 100644 --- a/cuda_bindings/cuda/bindings/_internal/cufile_linux.pyx +++ b/cuda_bindings/cuda/bindings/_internal/cufile_linux.pyx @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=73d6889e33bb56f1e0e63be7a0ba1f176c5c09e6e1adf9c4360d23335e131260 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=5b6e0791dac3bac268169b02ebc748d7375de7189fe7114151716d47791519ad # <<<< PREAMBLE CONTENT >>>> @@ -45,7 +45,8 @@ cdef extern from "": const void * _cyb_RTLD_DEFAULT "RTLD_DEFAULT" cimport cython as _cyb_cython -from libc.stdint cimport intptr_t as _cyb_intptr_t +from libc.stdint cimport intptr_t +from libcpp cimport bool as _cyb_bool import threading as _cyb_threading @@ -435,133 +436,133 @@ cpdef dict _inspect_function_pointers(): _check_or_init_cufile() cdef dict data = {} global __cuFileHandleRegister - data["__cuFileHandleRegister"] = <_cyb_intptr_t>__cuFileHandleRegister + data["__cuFileHandleRegister"] = __cuFileHandleRegister global __cuFileHandleDeregister - data["__cuFileHandleDeregister"] = <_cyb_intptr_t>__cuFileHandleDeregister + data["__cuFileHandleDeregister"] = __cuFileHandleDeregister global __cuFileBufRegister - data["__cuFileBufRegister"] = <_cyb_intptr_t>__cuFileBufRegister + data["__cuFileBufRegister"] = __cuFileBufRegister global __cuFileBufDeregister - data["__cuFileBufDeregister"] = <_cyb_intptr_t>__cuFileBufDeregister + data["__cuFileBufDeregister"] = __cuFileBufDeregister global __cuFileRead - data["__cuFileRead"] = <_cyb_intptr_t>__cuFileRead + data["__cuFileRead"] = __cuFileRead global __cuFileWrite - data["__cuFileWrite"] = <_cyb_intptr_t>__cuFileWrite + data["__cuFileWrite"] = __cuFileWrite global __cuFileDriverOpen - data["__cuFileDriverOpen"] = <_cyb_intptr_t>__cuFileDriverOpen + data["__cuFileDriverOpen"] = __cuFileDriverOpen global __cuFileDriverClose - data["__cuFileDriverClose"] = <_cyb_intptr_t>__cuFileDriverClose + data["__cuFileDriverClose"] = __cuFileDriverClose global __cuFileDriverClose_v2 - data["__cuFileDriverClose_v2"] = <_cyb_intptr_t>__cuFileDriverClose_v2 + data["__cuFileDriverClose_v2"] = __cuFileDriverClose_v2 global __cuFileUseCount - data["__cuFileUseCount"] = <_cyb_intptr_t>__cuFileUseCount + data["__cuFileUseCount"] = __cuFileUseCount global __cuFileDriverGetProperties - data["__cuFileDriverGetProperties"] = <_cyb_intptr_t>__cuFileDriverGetProperties + data["__cuFileDriverGetProperties"] = __cuFileDriverGetProperties global __cuFileDriverSetPollMode - data["__cuFileDriverSetPollMode"] = <_cyb_intptr_t>__cuFileDriverSetPollMode + data["__cuFileDriverSetPollMode"] = __cuFileDriverSetPollMode global __cuFileDriverSetMaxDirectIOSize - data["__cuFileDriverSetMaxDirectIOSize"] = <_cyb_intptr_t>__cuFileDriverSetMaxDirectIOSize + data["__cuFileDriverSetMaxDirectIOSize"] = __cuFileDriverSetMaxDirectIOSize global __cuFileDriverSetMaxCacheSize - data["__cuFileDriverSetMaxCacheSize"] = <_cyb_intptr_t>__cuFileDriverSetMaxCacheSize + data["__cuFileDriverSetMaxCacheSize"] = __cuFileDriverSetMaxCacheSize global __cuFileDriverSetMaxPinnedMemSize - data["__cuFileDriverSetMaxPinnedMemSize"] = <_cyb_intptr_t>__cuFileDriverSetMaxPinnedMemSize + data["__cuFileDriverSetMaxPinnedMemSize"] = __cuFileDriverSetMaxPinnedMemSize global __cuFileBatchIOSetUp - data["__cuFileBatchIOSetUp"] = <_cyb_intptr_t>__cuFileBatchIOSetUp + data["__cuFileBatchIOSetUp"] = __cuFileBatchIOSetUp global __cuFileBatchIOSubmit - data["__cuFileBatchIOSubmit"] = <_cyb_intptr_t>__cuFileBatchIOSubmit + data["__cuFileBatchIOSubmit"] = __cuFileBatchIOSubmit global __cuFileBatchIOGetStatus - data["__cuFileBatchIOGetStatus"] = <_cyb_intptr_t>__cuFileBatchIOGetStatus + data["__cuFileBatchIOGetStatus"] = __cuFileBatchIOGetStatus global __cuFileBatchIOCancel - data["__cuFileBatchIOCancel"] = <_cyb_intptr_t>__cuFileBatchIOCancel + data["__cuFileBatchIOCancel"] = __cuFileBatchIOCancel global __cuFileBatchIODestroy - data["__cuFileBatchIODestroy"] = <_cyb_intptr_t>__cuFileBatchIODestroy + data["__cuFileBatchIODestroy"] = __cuFileBatchIODestroy global __cuFileReadAsync - data["__cuFileReadAsync"] = <_cyb_intptr_t>__cuFileReadAsync + data["__cuFileReadAsync"] = __cuFileReadAsync global __cuFileWriteAsync - data["__cuFileWriteAsync"] = <_cyb_intptr_t>__cuFileWriteAsync + data["__cuFileWriteAsync"] = __cuFileWriteAsync global __cuFileStreamRegister - data["__cuFileStreamRegister"] = <_cyb_intptr_t>__cuFileStreamRegister + data["__cuFileStreamRegister"] = __cuFileStreamRegister global __cuFileStreamDeregister - data["__cuFileStreamDeregister"] = <_cyb_intptr_t>__cuFileStreamDeregister + data["__cuFileStreamDeregister"] = __cuFileStreamDeregister global __cuFileGetVersion - data["__cuFileGetVersion"] = <_cyb_intptr_t>__cuFileGetVersion + data["__cuFileGetVersion"] = __cuFileGetVersion global __cuFileGetParameterSizeT - data["__cuFileGetParameterSizeT"] = <_cyb_intptr_t>__cuFileGetParameterSizeT + data["__cuFileGetParameterSizeT"] = __cuFileGetParameterSizeT global __cuFileGetParameterBool - data["__cuFileGetParameterBool"] = <_cyb_intptr_t>__cuFileGetParameterBool + data["__cuFileGetParameterBool"] = __cuFileGetParameterBool global __cuFileGetParameterString - data["__cuFileGetParameterString"] = <_cyb_intptr_t>__cuFileGetParameterString + data["__cuFileGetParameterString"] = __cuFileGetParameterString global __cuFileSetParameterSizeT - data["__cuFileSetParameterSizeT"] = <_cyb_intptr_t>__cuFileSetParameterSizeT + data["__cuFileSetParameterSizeT"] = __cuFileSetParameterSizeT global __cuFileSetParameterBool - data["__cuFileSetParameterBool"] = <_cyb_intptr_t>__cuFileSetParameterBool + data["__cuFileSetParameterBool"] = __cuFileSetParameterBool global __cuFileSetParameterString - data["__cuFileSetParameterString"] = <_cyb_intptr_t>__cuFileSetParameterString + data["__cuFileSetParameterString"] = __cuFileSetParameterString global __cuFileGetParameterMinMaxValue - data["__cuFileGetParameterMinMaxValue"] = <_cyb_intptr_t>__cuFileGetParameterMinMaxValue + data["__cuFileGetParameterMinMaxValue"] = __cuFileGetParameterMinMaxValue global __cuFileSetStatsLevel - data["__cuFileSetStatsLevel"] = <_cyb_intptr_t>__cuFileSetStatsLevel + data["__cuFileSetStatsLevel"] = __cuFileSetStatsLevel global __cuFileGetStatsLevel - data["__cuFileGetStatsLevel"] = <_cyb_intptr_t>__cuFileGetStatsLevel + data["__cuFileGetStatsLevel"] = __cuFileGetStatsLevel global __cuFileStatsStart - data["__cuFileStatsStart"] = <_cyb_intptr_t>__cuFileStatsStart + data["__cuFileStatsStart"] = __cuFileStatsStart global __cuFileStatsStop - data["__cuFileStatsStop"] = <_cyb_intptr_t>__cuFileStatsStop + data["__cuFileStatsStop"] = __cuFileStatsStop global __cuFileStatsReset - data["__cuFileStatsReset"] = <_cyb_intptr_t>__cuFileStatsReset + data["__cuFileStatsReset"] = __cuFileStatsReset global __cuFileGetStatsL1 - data["__cuFileGetStatsL1"] = <_cyb_intptr_t>__cuFileGetStatsL1 + data["__cuFileGetStatsL1"] = __cuFileGetStatsL1 global __cuFileGetStatsL2 - data["__cuFileGetStatsL2"] = <_cyb_intptr_t>__cuFileGetStatsL2 + data["__cuFileGetStatsL2"] = __cuFileGetStatsL2 global __cuFileGetStatsL3 - data["__cuFileGetStatsL3"] = <_cyb_intptr_t>__cuFileGetStatsL3 + data["__cuFileGetStatsL3"] = __cuFileGetStatsL3 global __cuFileGetBARSizeInKB - data["__cuFileGetBARSizeInKB"] = <_cyb_intptr_t>__cuFileGetBARSizeInKB + data["__cuFileGetBARSizeInKB"] = __cuFileGetBARSizeInKB global __cuFileSetParameterPosixPoolSlabArray - data["__cuFileSetParameterPosixPoolSlabArray"] = <_cyb_intptr_t>__cuFileSetParameterPosixPoolSlabArray + data["__cuFileSetParameterPosixPoolSlabArray"] = __cuFileSetParameterPosixPoolSlabArray global __cuFileGetParameterPosixPoolSlabArray - data["__cuFileGetParameterPosixPoolSlabArray"] = <_cyb_intptr_t>__cuFileGetParameterPosixPoolSlabArray + data["__cuFileGetParameterPosixPoolSlabArray"] = __cuFileGetParameterPosixPoolSlabArray _cyb_func_ptrs = data return data @@ -694,13 +695,13 @@ cdef CUfileError_t _cuFileDriverGetProperties(CUfileDrvProps_t* props) except?CUFILE_LOADING_ERROR nogil: +cdef CUfileError_t _cuFileDriverSetPollMode(_cyb_bool poll, size_t poll_threshold_size) except?CUFILE_LOADING_ERROR nogil: global __cuFileDriverSetPollMode _check_or_init_cufile() if __cuFileDriverSetPollMode == NULL: with gil: raise FunctionNotFoundError("function cuFileDriverSetPollMode is not found") - return (__cuFileDriverSetPollMode)( + return (__cuFileDriverSetPollMode)( poll, poll_threshold_size) @@ -845,13 +846,13 @@ cdef CUfileError_t _cuFileGetParameterSizeT(CUFileSizeTConfigParameter_t param, param, value) -cdef CUfileError_t _cuFileGetParameterBool(CUFileBoolConfigParameter_t param, cpp_bool* value) except?CUFILE_LOADING_ERROR nogil: +cdef CUfileError_t _cuFileGetParameterBool(CUFileBoolConfigParameter_t param, _cyb_bool* value) except?CUFILE_LOADING_ERROR nogil: global __cuFileGetParameterBool _check_or_init_cufile() if __cuFileGetParameterBool == NULL: with gil: raise FunctionNotFoundError("function cuFileGetParameterBool is not found") - return (__cuFileGetParameterBool)( + return (__cuFileGetParameterBool)( param, value) @@ -875,13 +876,13 @@ cdef CUfileError_t _cuFileSetParameterSizeT(CUFileSizeTConfigParameter_t param, param, value) -cdef CUfileError_t _cuFileSetParameterBool(CUFileBoolConfigParameter_t param, cpp_bool value) except?CUFILE_LOADING_ERROR nogil: +cdef CUfileError_t _cuFileSetParameterBool(CUFileBoolConfigParameter_t param, _cyb_bool value) except?CUFILE_LOADING_ERROR nogil: global __cuFileSetParameterBool _check_or_init_cufile() if __cuFileSetParameterBool == NULL: with gil: raise FunctionNotFoundError("function cuFileSetParameterBool is not found") - return (__cuFileSetParameterBool)( + return (__cuFileSetParameterBool)( param, value) diff --git a/cuda_bindings/cuda/bindings/_internal/nvml.pxd b/cuda_bindings/cuda/bindings/_internal/nvml.pxd index eea80739f07..272a77d24db 100644 --- a/cuda_bindings/cuda/bindings/_internal/nvml.pxd +++ b/cuda_bindings/cuda/bindings/_internal/nvml.pxd @@ -4,7 +4,7 @@ # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=ed4c433854399c2e4f1adc3ffcfc37901e1be29c5aa50728498c87225edf92b1 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=c2cc3cd086b5aeea5fad7ca17600d0102691a3cb354b916f5c086c383d77df19 from ..cynvml cimport * @@ -363,3 +363,7 @@ cdef nvmlReturn_t _nvmlDeviceGetVgpuSchedulerLog_v2(nvmlDevice_t device, nvmlVgp cdef nvmlReturn_t _nvmlGpuInstanceGetVgpuSchedulerLog_v2(nvmlGpuInstance_t gpuInstance, nvmlVgpuSchedulerLogInfo_v2_t* pSchedulerLogInfo) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil cdef nvmlReturn_t _nvmlDeviceSetVgpuSchedulerState_v2(nvmlDevice_t device, nvmlVgpuSchedulerState_v2_t* pSchedulerState) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil cdef nvmlReturn_t _nvmlGpuInstanceSetVgpuSchedulerState_v2(nvmlGpuInstance_t gpuInstance, nvmlVgpuSchedulerState_v2_t* pSchedulerState) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil +cdef nvmlReturn_t _nvmlSystemGetCPER_v1(nvmlGetCPER_v1_t* cper) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil +cdef nvmlReturn_t _nvmlDeviceGetBBXTimeData_v1(nvmlDevice_t device, nvmlBBXTimeData_v1_t* timeData) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil +cdef nvmlReturn_t _nvmlDeviceGetAccountingStats_v2(nvmlDevice_t device, nvmlAccountingStats_v2_t* stats) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil +cdef nvmlReturn_t _nvmlDeviceGetRemappedRows_v2(nvmlDevice_t device, nvmlRemappedRowsInfo_v2_t* info) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil diff --git a/cuda_bindings/cuda/bindings/_internal/nvml_linux.pyx b/cuda_bindings/cuda/bindings/_internal/nvml_linux.pyx index d2882b251b0..be534de181d 100644 --- a/cuda_bindings/cuda/bindings/_internal/nvml_linux.pyx +++ b/cuda_bindings/cuda/bindings/_internal/nvml_linux.pyx @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=646d902675de6987cff08e5702d3b2bff889e6a827273e57413aa5de45a5897a +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=45cd03eeb8717b33a1e11d83ae99ac8d6b580e4c57fad99d185614bd0047faf3 # <<<< PREAMBLE CONTENT >>>> @@ -415,6 +415,10 @@ cdef void* __nvmlDeviceGetVgpuSchedulerLog_v2 = NULL cdef void* __nvmlGpuInstanceGetVgpuSchedulerLog_v2 = NULL cdef void* __nvmlDeviceSetVgpuSchedulerState_v2 = NULL cdef void* __nvmlGpuInstanceSetVgpuSchedulerState_v2 = NULL +cdef void* __nvmlSystemGetCPER_v1 = NULL +cdef void* __nvmlDeviceGetBBXTimeData_v1 = NULL +cdef void* __nvmlDeviceGetAccountingStats_v2 = NULL +cdef void* __nvmlDeviceGetRemappedRows_v2 = NULL cdef int _init_nvml() except -1 nogil: global _cyb___py_nvml_init @@ -2879,6 +2883,34 @@ cdef int _init_nvml() except -1 nogil: handle = load_library() __nvmlGpuInstanceSetVgpuSchedulerState_v2 = _cyb_dlsym(handle, 'nvmlGpuInstanceSetVgpuSchedulerState_v2') + global __nvmlSystemGetCPER_v1 + __nvmlSystemGetCPER_v1 = _cyb_dlsym(_cyb_RTLD_DEFAULT, 'nvmlSystemGetCPER_v1') + if __nvmlSystemGetCPER_v1 == NULL: + if handle == NULL: + handle = load_library() + __nvmlSystemGetCPER_v1 = _cyb_dlsym(handle, 'nvmlSystemGetCPER_v1') + + global __nvmlDeviceGetBBXTimeData_v1 + __nvmlDeviceGetBBXTimeData_v1 = _cyb_dlsym(_cyb_RTLD_DEFAULT, 'nvmlDeviceGetBBXTimeData_v1') + if __nvmlDeviceGetBBXTimeData_v1 == NULL: + if handle == NULL: + handle = load_library() + __nvmlDeviceGetBBXTimeData_v1 = _cyb_dlsym(handle, 'nvmlDeviceGetBBXTimeData_v1') + + global __nvmlDeviceGetAccountingStats_v2 + __nvmlDeviceGetAccountingStats_v2 = _cyb_dlsym(_cyb_RTLD_DEFAULT, 'nvmlDeviceGetAccountingStats_v2') + if __nvmlDeviceGetAccountingStats_v2 == NULL: + if handle == NULL: + handle = load_library() + __nvmlDeviceGetAccountingStats_v2 = _cyb_dlsym(handle, 'nvmlDeviceGetAccountingStats_v2') + + global __nvmlDeviceGetRemappedRows_v2 + __nvmlDeviceGetRemappedRows_v2 = _cyb_dlsym(_cyb_RTLD_DEFAULT, 'nvmlDeviceGetRemappedRows_v2') + if __nvmlDeviceGetRemappedRows_v2 == NULL: + if handle == NULL: + handle = load_library() + __nvmlDeviceGetRemappedRows_v2 = _cyb_dlsym(handle, 'nvmlDeviceGetRemappedRows_v2') + _cyb_atomic_int_store(&_cyb___py_nvml_init, 1) return 0 @@ -3948,6 +3980,18 @@ cpdef dict _inspect_function_pointers(): global __nvmlGpuInstanceSetVgpuSchedulerState_v2 data["__nvmlGpuInstanceSetVgpuSchedulerState_v2"] = <_cyb_intptr_t>__nvmlGpuInstanceSetVgpuSchedulerState_v2 + + global __nvmlSystemGetCPER_v1 + data["__nvmlSystemGetCPER_v1"] = <_cyb_intptr_t>__nvmlSystemGetCPER_v1 + + global __nvmlDeviceGetBBXTimeData_v1 + data["__nvmlDeviceGetBBXTimeData_v1"] = <_cyb_intptr_t>__nvmlDeviceGetBBXTimeData_v1 + + global __nvmlDeviceGetAccountingStats_v2 + data["__nvmlDeviceGetAccountingStats_v2"] = <_cyb_intptr_t>__nvmlDeviceGetAccountingStats_v2 + + global __nvmlDeviceGetRemappedRows_v2 + data["__nvmlDeviceGetRemappedRows_v2"] = <_cyb_intptr_t>__nvmlDeviceGetRemappedRows_v2 _cyb_func_ptrs = data return data @@ -7478,3 +7522,43 @@ cdef nvmlReturn_t _nvmlGpuInstanceSetVgpuSchedulerState_v2(nvmlGpuInstance_t gpu raise FunctionNotFoundError("function nvmlGpuInstanceSetVgpuSchedulerState_v2 is not found") return (__nvmlGpuInstanceSetVgpuSchedulerState_v2)( gpuInstance, pSchedulerState) + + +cdef nvmlReturn_t _nvmlSystemGetCPER_v1(nvmlGetCPER_v1_t* cper) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + global __nvmlSystemGetCPER_v1 + _check_or_init_nvml() + if __nvmlSystemGetCPER_v1 == NULL: + with gil: + raise FunctionNotFoundError("function nvmlSystemGetCPER_v1 is not found") + return (__nvmlSystemGetCPER_v1)( + cper) + + +cdef nvmlReturn_t _nvmlDeviceGetBBXTimeData_v1(nvmlDevice_t device, nvmlBBXTimeData_v1_t* timeData) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + global __nvmlDeviceGetBBXTimeData_v1 + _check_or_init_nvml() + if __nvmlDeviceGetBBXTimeData_v1 == NULL: + with gil: + raise FunctionNotFoundError("function nvmlDeviceGetBBXTimeData_v1 is not found") + return (__nvmlDeviceGetBBXTimeData_v1)( + device, timeData) + + +cdef nvmlReturn_t _nvmlDeviceGetAccountingStats_v2(nvmlDevice_t device, nvmlAccountingStats_v2_t* stats) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + global __nvmlDeviceGetAccountingStats_v2 + _check_or_init_nvml() + if __nvmlDeviceGetAccountingStats_v2 == NULL: + with gil: + raise FunctionNotFoundError("function nvmlDeviceGetAccountingStats_v2 is not found") + return (__nvmlDeviceGetAccountingStats_v2)( + device, stats) + + +cdef nvmlReturn_t _nvmlDeviceGetRemappedRows_v2(nvmlDevice_t device, nvmlRemappedRowsInfo_v2_t* info) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + global __nvmlDeviceGetRemappedRows_v2 + _check_or_init_nvml() + if __nvmlDeviceGetRemappedRows_v2 == NULL: + with gil: + raise FunctionNotFoundError("function nvmlDeviceGetRemappedRows_v2 is not found") + return (__nvmlDeviceGetRemappedRows_v2)( + device, info) diff --git a/cuda_bindings/cuda/bindings/_internal/nvml_windows.pyx b/cuda_bindings/cuda/bindings/_internal/nvml_windows.pyx index f7ae66ae98e..ce46586baf5 100644 --- a/cuda_bindings/cuda/bindings/_internal/nvml_windows.pyx +++ b/cuda_bindings/cuda/bindings/_internal/nvml_windows.pyx @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=831330186c4a7bb029b953be6dd3cda119a7f10c56fa9378ab621fbc4374f9d1 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=d7b5ba031ed135b60903431812f9883efdd554268990e04003d5ead5674466eb # <<<< PREAMBLE CONTENT >>>> @@ -412,6 +412,10 @@ cdef void* __nvmlDeviceGetVgpuSchedulerLog_v2 = NULL cdef void* __nvmlGpuInstanceGetVgpuSchedulerLog_v2 = NULL cdef void* __nvmlDeviceSetVgpuSchedulerState_v2 = NULL cdef void* __nvmlGpuInstanceSetVgpuSchedulerState_v2 = NULL +cdef void* __nvmlSystemGetCPER_v1 = NULL +cdef void* __nvmlDeviceGetBBXTimeData_v1 = NULL +cdef void* __nvmlDeviceGetAccountingStats_v2 = NULL +cdef void* __nvmlDeviceGetRemappedRows_v2 = NULL cdef int _init_nvml() except -1 nogil: global _cyb___py_nvml_init @@ -1475,6 +1479,18 @@ cdef int _init_nvml() except -1 nogil: global __nvmlGpuInstanceSetVgpuSchedulerState_v2 __nvmlGpuInstanceSetVgpuSchedulerState_v2 = _cyb_GetProcAddress(handle, 'nvmlGpuInstanceSetVgpuSchedulerState_v2') + global __nvmlSystemGetCPER_v1 + __nvmlSystemGetCPER_v1 = _cyb_GetProcAddress(handle, 'nvmlSystemGetCPER_v1') + + global __nvmlDeviceGetBBXTimeData_v1 + __nvmlDeviceGetBBXTimeData_v1 = _cyb_GetProcAddress(handle, 'nvmlDeviceGetBBXTimeData_v1') + + global __nvmlDeviceGetAccountingStats_v2 + __nvmlDeviceGetAccountingStats_v2 = _cyb_GetProcAddress(handle, 'nvmlDeviceGetAccountingStats_v2') + + global __nvmlDeviceGetRemappedRows_v2 + __nvmlDeviceGetRemappedRows_v2 = _cyb_GetProcAddress(handle, 'nvmlDeviceGetRemappedRows_v2') + _cyb_atomic_int_store(&_cyb___py_nvml_init, 1) return 0 @@ -2544,6 +2560,18 @@ cpdef dict _inspect_function_pointers(): global __nvmlGpuInstanceSetVgpuSchedulerState_v2 data["__nvmlGpuInstanceSetVgpuSchedulerState_v2"] = <_cyb_intptr_t>__nvmlGpuInstanceSetVgpuSchedulerState_v2 + + global __nvmlSystemGetCPER_v1 + data["__nvmlSystemGetCPER_v1"] = <_cyb_intptr_t>__nvmlSystemGetCPER_v1 + + global __nvmlDeviceGetBBXTimeData_v1 + data["__nvmlDeviceGetBBXTimeData_v1"] = <_cyb_intptr_t>__nvmlDeviceGetBBXTimeData_v1 + + global __nvmlDeviceGetAccountingStats_v2 + data["__nvmlDeviceGetAccountingStats_v2"] = <_cyb_intptr_t>__nvmlDeviceGetAccountingStats_v2 + + global __nvmlDeviceGetRemappedRows_v2 + data["__nvmlDeviceGetRemappedRows_v2"] = <_cyb_intptr_t>__nvmlDeviceGetRemappedRows_v2 _cyb_func_ptrs = data return data @@ -6073,3 +6101,43 @@ cdef nvmlReturn_t _nvmlGpuInstanceSetVgpuSchedulerState_v2(nvmlGpuInstance_t gpu raise FunctionNotFoundError("function nvmlGpuInstanceSetVgpuSchedulerState_v2 is not found") return (__nvmlGpuInstanceSetVgpuSchedulerState_v2)( gpuInstance, pSchedulerState) + + +cdef nvmlReturn_t _nvmlSystemGetCPER_v1(nvmlGetCPER_v1_t* cper) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + global __nvmlSystemGetCPER_v1 + _check_or_init_nvml() + if __nvmlSystemGetCPER_v1 == NULL: + with gil: + raise FunctionNotFoundError("function nvmlSystemGetCPER_v1 is not found") + return (__nvmlSystemGetCPER_v1)( + cper) + + +cdef nvmlReturn_t _nvmlDeviceGetBBXTimeData_v1(nvmlDevice_t device, nvmlBBXTimeData_v1_t* timeData) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + global __nvmlDeviceGetBBXTimeData_v1 + _check_or_init_nvml() + if __nvmlDeviceGetBBXTimeData_v1 == NULL: + with gil: + raise FunctionNotFoundError("function nvmlDeviceGetBBXTimeData_v1 is not found") + return (__nvmlDeviceGetBBXTimeData_v1)( + device, timeData) + + +cdef nvmlReturn_t _nvmlDeviceGetAccountingStats_v2(nvmlDevice_t device, nvmlAccountingStats_v2_t* stats) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + global __nvmlDeviceGetAccountingStats_v2 + _check_or_init_nvml() + if __nvmlDeviceGetAccountingStats_v2 == NULL: + with gil: + raise FunctionNotFoundError("function nvmlDeviceGetAccountingStats_v2 is not found") + return (__nvmlDeviceGetAccountingStats_v2)( + device, stats) + + +cdef nvmlReturn_t _nvmlDeviceGetRemappedRows_v2(nvmlDevice_t device, nvmlRemappedRowsInfo_v2_t* info) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + global __nvmlDeviceGetRemappedRows_v2 + _check_or_init_nvml() + if __nvmlDeviceGetRemappedRows_v2 == NULL: + with gil: + raise FunctionNotFoundError("function nvmlDeviceGetRemappedRows_v2 is not found") + return (__nvmlDeviceGetRemappedRows_v2)( + device, info) diff --git a/cuda_bindings/cuda/bindings/_lib/param_packer.h b/cuda_bindings/cuda/bindings/_lib/param_packer.h index 160ef5f7c92..8d4833bb200 100644 --- a/cuda_bindings/cuda/bindings/_lib/param_packer.h +++ b/cuda_bindings/cuda/bindings/_lib/param_packer.h @@ -7,6 +7,28 @@ #include #include #include +#include +#include + +// PyLong_AsInt entered the public/stable CPython API in 3.13. cuda.bindings +// supports Python 3.10+, so provide a file-local backport for older builds. +// This is a copy of the CPython implementation; it is `static` (unlike the +// original) because this header is compiled into every extension module that +// includes it, mirroring the other helpers below. +#if PY_VERSION_HEX < 0x030D0000 +static int +PyLong_AsInt(PyObject *obj) +{ + int overflow; + long result = PyLong_AsLongAndOverflow(obj, &overflow); + if (overflow || result > INT_MAX || result < INT_MIN) { + PyErr_SetString(PyExc_OverflowError, + "Python int too large to convert to C int"); + return -1; + } + return (int)result; +} +#endif static PyObject* ctypes_module = nullptr; @@ -69,7 +91,13 @@ static void populate_feeders(PyTypeObject* target_t, PyTypeObject* source_t) { m_feeders[{target_t,source_t}] = [](void* ptr, PyObject* value) -> int { - *((int*)ptr) = (int)PyLong_AsLong(value); + // PyLong_AsInt range-checks against the 32-bit int slot and raises + // OverflowError itself, so an out-of-range value is rejected rather + // than silently truncated. + int v = PyLong_AsInt(value); + if (v == -1 && PyErr_Occurred()) + return -1; + *((int*)ptr) = v; return sizeof(int); }; return; @@ -89,7 +117,23 @@ static void populate_feeders(PyTypeObject* target_t, PyTypeObject* source_t) { m_feeders[{target_t,source_t}] = [](void* ptr, PyObject* value) -> int { - *((int8_t*)ptr) = (int8_t)PyLong_AsLong(value); + // c_byte is an 8-bit slot with no dedicated CPython converter, so + // range-check explicitly against INT8_MIN/INT8_MAX. AsLongAndOverflow's + // `overflow` only flags values outside `long` (64-bit on LP64), so a + // value in that range would be silently truncated by (int8_t)v without + // the explicit bounds check. When overflow!=0, v is the -1 sentinel + // (not the real value), so that case must be caught before trusting v. + int overflow = 0; + long v = PyLong_AsLongAndOverflow(value, &overflow); + if (overflow == 0 && v == -1 && PyErr_Occurred()) + return -1; // non-overflow conversion error; exception already set + if (overflow != 0 || v < INT8_MIN || v > INT8_MAX) + { + PyErr_SetString(PyExc_OverflowError, + "Python int is out of range for a c_byte (8-bit) kernel argument"); + return -1; + } + *((int8_t*)ptr) = (int8_t)v; return sizeof(int8_t); }; return; diff --git a/cuda_bindings/cuda/bindings/_lib/param_packer.pxd b/cuda_bindings/cuda/bindings/_lib/param_packer.pxd index 1c0ad690be4..d1f84059db1 100644 --- a/cuda_bindings/cuda/bindings/_lib/param_packer.pxd +++ b/cuda_bindings/cuda/bindings/_lib/param_packer.pxd @@ -4,4 +4,4 @@ # Include "param_packer.h" so its contents get compiled into every # Cython extension module that depends on param_packer.pxd. cdef extern from "param_packer.h": - int feed(void* ptr, object o, object ct) + int feed(void* ptr, object o, object ct) except? -1 diff --git a/cuda_bindings/cuda/bindings/_lib/utils.pxd b/cuda_bindings/cuda/bindings/_lib/utils.pxd index 24b0ae8de93..0d8af74b4ff 100644 --- a/cuda_bindings/cuda/bindings/_lib/utils.pxd +++ b/cuda_bindings/cuda/bindings/_lib/utils.pxd @@ -162,6 +162,7 @@ cdef class _HelperCUcoredumpSettings: cdef cydriver.CUcoredumpSettings_enum _attrib cdef bint _is_getter cdef size_t _size + cdef object _references # keeps caller bytes alive so _charstar stays valid # Return values cdef bint _bool diff --git a/cuda_bindings/cuda/bindings/_lib/utils.pxi b/cuda_bindings/cuda/bindings/_lib/utils.pxi index 2dd4d5c1a27..2796f910798 100644 --- a/cuda_bindings/cuda/bindings/_lib/utils.pxi +++ b/cuda_bindings/cuda/bindings/_lib/utils.pxi @@ -664,6 +664,8 @@ cdef class _HelperCUcoredumpSettings: self._cptr = self._charstar self._size = 1024 else: + # Keep a reference so the borrowed _charstar buffer stays alive. + self._references = init_value self._charstar = init_value self._cptr = self._charstar self._size = len(init_value) @@ -680,7 +682,11 @@ cdef class _HelperCUcoredumpSettings: raise TypeError('Unsupported attribute: {}'.format(attr.name)) def __dealloc__(self): - pass + # Only the getter path owns heap (the calloc'd 1024-byte buffer). The + # setter borrows caller bytes and the bool path points at &self._bool, + # so only free for the getter. + if self._is_getter: + free(self._charstar) @property def cptr(self): diff --git a/cuda_bindings/cuda/bindings/_test_helpers/__init__.py b/cuda_bindings/cuda/bindings/_test_helpers/__init__.py deleted file mode 100644 index 2cfab242d2a..00000000000 --- a/cuda_bindings/cuda/bindings/_test_helpers/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - - -# This package contains test helper utilities that may also be useful for other libraries outside of `cuda.bindings`, -# such as `cuda.core`. These utilities are not part of the public API of `cuda.bindings` and may change without notice. diff --git a/cuda_bindings/cuda/bindings/_test_helpers/arch_check.py b/cuda_bindings/cuda/bindings/_test_helpers/arch_check.py deleted file mode 100644 index 3ab48be6e02..00000000000 --- a/cuda_bindings/cuda/bindings/_test_helpers/arch_check.py +++ /dev/null @@ -1,70 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - - -from contextlib import contextmanager -from functools import cache - -import pytest - -from cuda.bindings import nvml -from cuda.bindings._internal.utils import FunctionNotFoundError as NvmlSymbolNotFoundError - - -@cache -def hardware_supports_nvml(): - """ - Tries to call the simplest NVML API possible to see if just the basics - works. If not we are probably on one of the platforms where NVML is not - supported at all (e.g. Jetson Orin). - """ - nvml.init_v2() - try: - nvml.system_get_driver_branch() - except (nvml.NotSupportedError, nvml.UnknownError): - return False - else: - return True - finally: - nvml.shutdown() - - -@contextmanager -def unsupported_before(device: int, expected_device_arch: nvml.DeviceArch | str | None): - device_arch = nvml.device_get_architecture(device) - - if isinstance(expected_device_arch, nvml.DeviceArch): - expected_device_arch_int = int(expected_device_arch) - elif expected_device_arch == "FERMI": - expected_device_arch_int = 1 - else: - expected_device_arch_int = 0 - - if expected_device_arch is None or expected_device_arch == "HAS_INFOROM" or device_arch == nvml.DeviceArch.UNKNOWN: - # In this case, we don't /know/ if it will fail, but we are ok if it - # does or does not. - - # TODO: There are APIs that are documented as supported only if the - # device has an InfoROM, but I couldn't find a way to detect that. For - # now, they are just handled as "possibly failing". - - try: - yield - except (nvml.NotSupportedError, nvml.FunctionNotFoundError, NvmlSymbolNotFoundError): - # The API call raised NotSupportedError, NVML status FunctionNotFoundError, - # or NvmlSymbolNotFoundError (symbol absent from the loaded NVML DLL), so we - # skip the test but don't fail it - pytest.skip( - f"Unsupported call for device architecture {nvml.DeviceArch(device_arch).name} " - f"on device '{nvml.device_get_name(device)}'" - ) - # If the API call worked, just continue - elif int(device_arch) < expected_device_arch_int: - # In this case, we /know/ if will fail, and we want to assert that it does. - with pytest.raises(nvml.NotSupportedError): - yield - # The above call was unsupported, so the rest of the test is skipped - pytest.skip(f"Unsupported before {expected_device_arch.name}, got {nvml.device_get_name(device)}") - else: - # In this case, we /know/ it should work, and if it fails, the test should fail. - yield diff --git a/cuda_bindings/cuda/bindings/cudla.pyx b/cuda_bindings/cuda/bindings/cudla.pyx index 175a6ba0d22..6ef2cba32e9 100644 --- a/cuda_bindings/cuda/bindings/cudla.pyx +++ b/cuda_bindings/cuda/bindings/cudla.pyx @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 # This code was automatically generated across versions from 1.5.0 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=3ee237ed16e651bae93e2bc6d4d63dcf99b309ad7a74cb3e2bd5b9e540e714f4 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=b793aebd0586162e23d26c82e2bd54c21675584e3c23d6e443f3a83c61a8674c # <<<< PREAMBLE CONTENT >>>> @@ -768,13 +768,19 @@ cdef class Fence: return obj -dev_attribute_dtype = _numpy.dtype(( - _numpy.dtype((_numpy.void, sizeof(cudlaDevAttribute))), - { - "unified_addressing_supported": (_numpy.uint8, 0), - "device_version": (_numpy.uint32, 0), - } - )) +cdef _get_dev_attribute_dtype_offsets(): + cdef cudlaDevAttribute pod + return _numpy.dtype({ + 'names': ['unified_addressing_supported', 'device_version'], + 'formats': [_numpy.uint8, _numpy.uint32], + 'offsets': [ + (&(pod.unifiedAddressingSupported)) - (&pod), + (&(pod.deviceVersion)) - (&pod), + ], + 'itemsize': sizeof(cudlaDevAttribute), + }) + +dev_attribute_dtype = _get_dev_attribute_dtype_offsets() cdef class DevAttribute: """Empty-initialize an instance of `cudlaDevAttribute`. @@ -905,15 +911,21 @@ cdef class DevAttribute: return obj -module_attribute_dtype = _numpy.dtype(( - _numpy.dtype((_numpy.void, sizeof(cudlaModuleAttribute))), - { - "num_input_tensors": (_numpy.uint32, 0), - "num_output_tensors": (_numpy.uint32, 0), - "input_tensor_desc": (_numpy.intp, 0), - "output_tensor_desc": (_numpy.intp, 0), - } - )) +cdef _get_module_attribute_dtype_offsets(): + cdef cudlaModuleAttribute pod + return _numpy.dtype({ + 'names': ['num_input_tensors', 'num_output_tensors', 'input_tensor_desc', 'output_tensor_desc'], + 'formats': [_numpy.uint32, _numpy.uint32, _numpy.intp, _numpy.intp], + 'offsets': [ + (&(pod.numInputTensors)) - (&pod), + (&(pod.numOutputTensors)) - (&pod), + (&(pod.inputTensorDesc)) - (&pod), + (&(pod.outputTensorDesc)) - (&pod), + ], + 'itemsize': sizeof(cudlaModuleAttribute), + }) + +module_attribute_dtype = _get_module_attribute_dtype_offsets() cdef class ModuleAttribute: """Empty-initialize an instance of `cudlaModuleAttribute`. @@ -1153,7 +1165,12 @@ cdef class WaitEvents: """int: """ if self._ptr[0].preFences == NULL or self._ptr[0].numEvents == 0: return [] - return Fence.from_ptr((self._ptr[0].preFences), self._ptr[0].numEvents) + return Fence.from_ptr( + (self._ptr[0].preFences), + self._ptr[0].numEvents, + owner=self, + readonly=self._readonly + ) @pre_fences.setter def pre_fences(self, val): @@ -1319,7 +1336,12 @@ cdef class SignalEvents: """int: """ if self._ptr[0].eofFences == NULL or self._ptr[0].numEvents == 0: return [] - return Fence.from_ptr((self._ptr[0].eofFences), self._ptr[0].numEvents) + return Fence.from_ptr( + (self._ptr[0].eofFences), + self._ptr[0].numEvents, + owner=self, + readonly=self._readonly + ) @eof_fences.setter def eof_fences(self, val): diff --git a/cuda_bindings/cuda/bindings/cufile.pxd b/cuda_bindings/cuda/bindings/cufile.pxd index 2bd8c7489ca..74633880658 100644 --- a/cuda_bindings/cuda/bindings/cufile.pxd +++ b/cuda_bindings/cuda/bindings/cufile.pxd @@ -3,9 +3,17 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=b10e4f1751ee5423db23c6fc953cb0ae37bff7e8937bf1d39ac5fd6eeb0e4e87 + + + +# <<<< PREAMBLE CONTENT >>>> -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=232df43b5a8960f10286c172abc71222a3822087a1f6134e12d9341f3b53886c from libc.stdint cimport intptr_t +from libcpp cimport bool as _cyb_bool + + +# <<<< END OF PREAMBLE CONTENT >>>> from .cycufile cimport * diff --git a/cuda_bindings/cuda/bindings/cufile.pyx b/cuda_bindings/cuda/bindings/cufile.pyx index fbc9c20dc47..8130a9b6297 100644 --- a/cuda_bindings/cuda/bindings/cufile.pyx +++ b/cuda_bindings/cuda/bindings/cufile.pyx @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=4567ca64d02631fc8d6ed11af8164d72c86b4686c105fd733d186e6c92512749 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=1ca8c2d672c5799154a85a73ac7f0f3661943ece8f4d7c1d2e11649a0a537c81 # <<<< PREAMBLE CONTENT >>>> @@ -12,6 +12,10 @@ cimport cpython as _cyb_cpython cimport cpython.buffer as _cyb_cpython_buffer cimport cpython.memoryview as _cyb_cpython_memoryview from cython cimport view as _cyb_view +from libc.stdint cimport ( + intptr_t, + uint64_t, +) from libc.stdlib cimport ( calloc as _cyb_calloc, free as _cyb_free, @@ -21,6 +25,7 @@ from libc.string cimport ( memcmp as _cyb_memcmp, memcpy as _cyb_memcpy, ) +from libcpp cimport bool as _cyb_bool from cuda.bindings._internal._fast_enum import FastEnum as _cyb_FastEnum @@ -80,13 +85,19 @@ from cuda.bindings.driver import CUresult as pyCUresult # POD ############################################################################### -_py_anon_pod1_dtype = _numpy.dtype(( - _numpy.dtype((_numpy.void, sizeof((NULL).handle))), - { - "fd": (_numpy.int32, 0), - "handle": (_numpy.intp, 0), - } - )) +cdef _get__py_anon_pod1_dtype_offsets(): + cdef cuda_bindings_cufile__anon_pod1 pod + return _numpy.dtype({ + 'names': ['fd', 'handle'], + 'formats': [_numpy.int32, _numpy.intp], + 'offsets': [ + (&(pod.fd)) - (&pod), + (&(pod.handle)) - (&pod), + ], + 'itemsize': sizeof((NULL).handle), + }) + +_py_anon_pod1_dtype = _get__py_anon_pod1_dtype_offsets() cdef class _py_anon_pod1: """Empty-initialize an instance of `cuda_bindings_cufile__anon_pod1`. @@ -411,6 +422,7 @@ cdef class IOEvents: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=io_events_dtype) @@ -529,13 +541,15 @@ cdef class IOEvents: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an IOEvents instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -545,6 +559,7 @@ cdef class IOEvents: ptr, sizeof(CUfileIOEvents_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=io_events_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -746,6 +761,7 @@ cdef class PerGpuStats: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=per_gpu_stats_dtype) @@ -1159,13 +1175,15 @@ cdef class PerGpuStats: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an PerGpuStats instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -1175,6 +1193,7 @@ cdef class PerGpuStats: ptr, sizeof(CUfilePerGpuStats_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=per_gpu_stats_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -1206,6 +1225,7 @@ cdef class Descr: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=descr_dtype) @@ -1322,13 +1342,15 @@ cdef class Descr: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an Descr instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -1338,16 +1360,23 @@ cdef class Descr: ptr, sizeof(CUfileDescr_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=descr_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj -_py_anon_pod2_dtype = _numpy.dtype(( - _numpy.dtype((_numpy.void, sizeof((NULL).u))), - { - "batch": (_py_anon_pod3_dtype, 0), - } - )) +cdef _get__py_anon_pod2_dtype_offsets(): + cdef cuda_bindings_cufile__anon_pod2 pod + return _numpy.dtype({ + 'names': ['batch'], + 'formats': [_py_anon_pod3_dtype], + 'offsets': [ + (&(pod.batch)) - (&pod), + ], + 'itemsize': sizeof((NULL).u), + }) + +_py_anon_pod2_dtype = _get__py_anon_pod2_dtype_offsets() cdef class _py_anon_pod2: """Empty-initialize an instance of `cuda_bindings_cufile__anon_pod2`. @@ -1418,7 +1447,11 @@ cdef class _py_anon_pod2: @property def batch(self): """_py_anon_pod3: """ - return _py_anon_pod3.from_ptr(&(self._ptr[0].batch), self._readonly, self) + return _py_anon_pod3.from_ptr( + &(self._ptr[0].batch), + readonly=self._readonly, + owner=self, + ) @batch.setter def batch(self, val): @@ -1592,7 +1625,11 @@ cdef class StatsLevel1: @property def read_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].read_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].read_ops), + readonly=self._readonly, + owner=self, + ) @read_ops.setter def read_ops(self, val): @@ -1604,7 +1641,11 @@ cdef class StatsLevel1: @property def write_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].write_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].write_ops), + readonly=self._readonly, + owner=self, + ) @write_ops.setter def write_ops(self, val): @@ -1616,7 +1657,11 @@ cdef class StatsLevel1: @property def hdl_register_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].hdl_register_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].hdl_register_ops), + readonly=self._readonly, + owner=self, + ) @hdl_register_ops.setter def hdl_register_ops(self, val): @@ -1628,7 +1673,11 @@ cdef class StatsLevel1: @property def hdl_deregister_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].hdl_deregister_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].hdl_deregister_ops), + readonly=self._readonly, + owner=self, + ) @hdl_deregister_ops.setter def hdl_deregister_ops(self, val): @@ -1640,7 +1689,11 @@ cdef class StatsLevel1: @property def buf_register_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].buf_register_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].buf_register_ops), + readonly=self._readonly, + owner=self, + ) @buf_register_ops.setter def buf_register_ops(self, val): @@ -1652,7 +1705,11 @@ cdef class StatsLevel1: @property def buf_deregister_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].buf_deregister_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].buf_deregister_ops), + readonly=self._readonly, + owner=self, + ) @buf_deregister_ops.setter def buf_deregister_ops(self, val): @@ -1664,7 +1721,11 @@ cdef class StatsLevel1: @property def batch_submit_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_submit_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_submit_ops), + readonly=self._readonly, + owner=self, + ) @batch_submit_ops.setter def batch_submit_ops(self, val): @@ -1676,7 +1737,11 @@ cdef class StatsLevel1: @property def batch_complete_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_complete_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_complete_ops), + readonly=self._readonly, + owner=self, + ) @batch_complete_ops.setter def batch_complete_ops(self, val): @@ -1688,7 +1753,11 @@ cdef class StatsLevel1: @property def batch_setup_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_setup_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_setup_ops), + readonly=self._readonly, + owner=self, + ) @batch_setup_ops.setter def batch_setup_ops(self, val): @@ -1700,7 +1769,11 @@ cdef class StatsLevel1: @property def batch_cancel_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_cancel_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_cancel_ops), + readonly=self._readonly, + owner=self, + ) @batch_cancel_ops.setter def batch_cancel_ops(self, val): @@ -1712,7 +1785,11 @@ cdef class StatsLevel1: @property def batch_destroy_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_destroy_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_destroy_ops), + readonly=self._readonly, + owner=self, + ) @batch_destroy_ops.setter def batch_destroy_ops(self, val): @@ -1724,7 +1801,11 @@ cdef class StatsLevel1: @property def batch_enqueued_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_enqueued_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_enqueued_ops), + readonly=self._readonly, + owner=self, + ) @batch_enqueued_ops.setter def batch_enqueued_ops(self, val): @@ -1736,7 +1817,11 @@ cdef class StatsLevel1: @property def batch_posix_enqueued_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_posix_enqueued_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_posix_enqueued_ops), + readonly=self._readonly, + owner=self, + ) @batch_posix_enqueued_ops.setter def batch_posix_enqueued_ops(self, val): @@ -1748,7 +1833,11 @@ cdef class StatsLevel1: @property def batch_processed_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_processed_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_processed_ops), + readonly=self._readonly, + owner=self, + ) @batch_processed_ops.setter def batch_processed_ops(self, val): @@ -1760,7 +1849,11 @@ cdef class StatsLevel1: @property def batch_posix_processed_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_posix_processed_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_posix_processed_ops), + readonly=self._readonly, + owner=self, + ) @batch_posix_processed_ops.setter def batch_posix_processed_ops(self, val): @@ -1772,7 +1865,11 @@ cdef class StatsLevel1: @property def batch_nvfs_submit_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_nvfs_submit_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_nvfs_submit_ops), + readonly=self._readonly, + owner=self, + ) @batch_nvfs_submit_ops.setter def batch_nvfs_submit_ops(self, val): @@ -1784,7 +1881,11 @@ cdef class StatsLevel1: @property def batch_p2p_submit_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_p2p_submit_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_p2p_submit_ops), + readonly=self._readonly, + owner=self, + ) @batch_p2p_submit_ops.setter def batch_p2p_submit_ops(self, val): @@ -1796,7 +1897,11 @@ cdef class StatsLevel1: @property def batch_aio_submit_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_aio_submit_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_aio_submit_ops), + readonly=self._readonly, + owner=self, + ) @batch_aio_submit_ops.setter def batch_aio_submit_ops(self, val): @@ -1808,7 +1913,11 @@ cdef class StatsLevel1: @property def batch_iouring_submit_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_iouring_submit_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_iouring_submit_ops), + readonly=self._readonly, + owner=self, + ) @batch_iouring_submit_ops.setter def batch_iouring_submit_ops(self, val): @@ -1820,7 +1929,11 @@ cdef class StatsLevel1: @property def batch_mixed_io_submit_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_mixed_io_submit_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_mixed_io_submit_ops), + readonly=self._readonly, + owner=self, + ) @batch_mixed_io_submit_ops.setter def batch_mixed_io_submit_ops(self, val): @@ -1832,7 +1945,11 @@ cdef class StatsLevel1: @property def batch_total_submit_ops(self): """OpCounter: """ - return OpCounter.from_ptr(&(self._ptr[0].batch_total_submit_ops), self._readonly, self) + return OpCounter.from_ptr( + &(self._ptr[0].batch_total_submit_ops), + readonly=self._readonly, + owner=self, + ) @batch_total_submit_ops.setter def batch_total_submit_ops(self, val): @@ -2153,6 +2270,7 @@ cdef class IOParams: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=io_params_dtype) @@ -2291,13 +2409,15 @@ cdef class IOParams: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an IOParams instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -2307,6 +2427,7 @@ cdef class IOParams: ptr, sizeof(CUfileIOParams_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=io_params_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -2395,7 +2516,11 @@ cdef class StatsLevel2: @property def basic(self): """StatsLevel1: """ - return StatsLevel1.from_ptr(&(self._ptr[0].basic), self._readonly, self) + return StatsLevel1.from_ptr( + &(self._ptr[0].basic), + readonly=self._readonly, + owner=self, + ) @basic.setter def basic(self, val): @@ -2563,7 +2688,11 @@ cdef class StatsLevel3: @property def detailed(self): """StatsLevel2: """ - return StatsLevel2.from_ptr(&(self._ptr[0].detailed), self._readonly, self) + return StatsLevel2.from_ptr( + &(self._ptr[0].detailed), + readonly=self._readonly, + owner=self, + ) @detailed.setter def detailed(self, val): @@ -2575,7 +2704,12 @@ cdef class StatsLevel3: @property def per_gpu_stats(self): """PerGpuStats: """ - return PerGpuStats.from_ptr(&(self._ptr[0].per_gpu_stats), 16, self._readonly) + return PerGpuStats.from_ptr( + &(self._ptr[0].per_gpu_stats), + 16, + readonly=self._readonly, + owner=self, + ) @per_gpu_stats.setter def per_gpu_stats(self, val): @@ -2857,9 +2991,12 @@ class cuFileError(Exception): @cython.profile(False) cdef int check_status(ReturnT status) except 1 nogil: if ReturnT is CUfileError_t: - if status.err != 0 or status.cu_err != 0: + if IS_CUDA_ERR(status): with gil: raise cuFileError(status.err, status.cu_err) + elif IS_CUFILE_ERR(status.err): + with gil: + raise cuFileError(status.err) elif ReturnT is ssize_t: if status == -1: # note: this assumes cuFile already properly resets errno in each API @@ -2876,10 +3013,12 @@ cpdef intptr_t handle_register(intptr_t descr) except? 0: """cuFileHandleRegister is required, and performs extra checking that is memoized to provide increased performance on later cuFile operations. Args: - descr (intptr_t): ``CUfileDescr_t`` file descriptor (OS agnostic). + descr (intptr_t): ``CUfileDescr_t`` file descriptor (OS + agnostic). Returns: - intptr_t: ``CUfileHandle_t`` opaque file handle for IO operations. + intptr_t: ``CUfileHandle_t`` opaque file handle for IO + operations. .. seealso:: `cuFileHandleRegister` """ @@ -2907,7 +3046,8 @@ cpdef buf_register(intptr_t buf_ptr_base, size_t length, int flags): Args: buf_ptr_base (intptr_t): buffer pointer allocated. - length (size_t): size of memory region from the above specified bufPtr. + length (size_t): size of memory region from the above + specified bufPtr. flags (int): CU_FILE_RDMA_REGISTER. .. seealso:: `cuFileBufRegister` @@ -2967,13 +3107,15 @@ cpdef driver_set_poll_mode(bint poll, size_t poll_threshold_size): """Sets whether the Read/Write APIs use polling to do IO operations This takes place before the driver is opened. No-op if driver is already open. Args: - poll (bint): boolean to indicate whether to use poll mode or not. - poll_threshold_size (size_t): max IO size to use for POLLING mode in KB. + poll (bint): boolean to indicate whether to use poll mode or + not. + poll_threshold_size (size_t): max IO size to use for POLLING + mode in KB. .. seealso:: `cuFileDriverSetPollMode` """ with nogil: - __status__ = cuFileDriverSetPollMode(poll, poll_threshold_size) + __status__ = cuFileDriverSetPollMode(<_cyb_bool>poll, poll_threshold_size) check_status(__status__) @@ -2981,7 +3123,8 @@ cpdef driver_set_max_direct_io_size(size_t max_direct_io_size): """Control parameter to set max IO size(KB) used by the library to talk to nvidia-fs driver This takes place before the driver is opened. No-op if driver is already open. Args: - max_direct_io_size (size_t): maximum allowed direct io size in KB. + max_direct_io_size (size_t): maximum allowed direct io size in + KB. .. seealso:: `cuFileDriverSetMaxDirectIOSize` """ @@ -2994,7 +3137,8 @@ cpdef driver_set_max_cache_size(size_t max_cache_size): """Control parameter to set maximum GPU memory reserved per device by the library for internal buffering This takes place before the driver is opened. No-op if driver is already open. Args: - max_cache_size (size_t): The maximum GPU buffer space per device used for internal use in KB. + max_cache_size (size_t): The maximum GPU buffer space per + device used for internal use in KB. .. seealso:: `cuFileDriverSetMaxCacheSize` """ @@ -3007,7 +3151,8 @@ cpdef driver_set_max_pinned_mem_size(size_t max_pinned_size): """Sets maximum buffer space that is pinned in KB for use by ``cuFileBufRegister`` This takes place before the driver is opened. No-op if driver is already open. Args: - max_pinned_size (size_t): maximum buffer space that is pinned in KB. + max_pinned_size (size_t): maximum buffer space that is pinned + in KB. .. seealso:: `cuFileDriverSetMaxPinnedMemSize` """ @@ -3095,7 +3240,7 @@ cpdef size_t get_parameter_size_t(int param) except? 0: cpdef bint get_parameter_bool(int param) except? 0: - cdef cpp_bool value + cdef _cyb_bool value with nogil: __status__ = cuFileGetParameterBool(<_BoolConfigParameter>param, &value) check_status(__status__) @@ -3119,7 +3264,7 @@ cpdef set_parameter_size_t(int param, size_t value): cpdef set_parameter_bool(int param, bint value): with nogil: - __status__ = cuFileSetParameterBool(<_BoolConfigParameter>param, value) + __status__ = cuFileSetParameterBool(<_BoolConfigParameter>param, <_cyb_bool>value) check_status(__status__) @@ -3133,7 +3278,8 @@ cpdef tuple get_parameter_min_max_value(int param): """Get both the minimum and maximum settable values for a given size_t parameter in a single call. Args: - param (SizeTConfigParameter): CUfile SizeT configuration parameter. + param (SizeTConfigParameter): CUfile SizeT configuration + parameter. Returns: A 2-tuple containing: @@ -3155,7 +3301,8 @@ cpdef set_stats_level(int level): """Set the level of statistics collection for cuFile operations. This will override the cufile.json settings for stats. Args: - level (int): Statistics level (0 = disabled, 1 = basic, 2 = detailed, 3 = verbose). + level (int): Statistics level (0 = disabled, 1 = basic, 2 = + detailed, 3 = verbose). .. seealso:: `cuFileSetStatsLevel` """ @@ -3213,7 +3360,8 @@ cpdef get_stats_l1(intptr_t stats): """Get Level 1 cuFile statistics. Args: - stats (intptr_t): Pointer to ``CUfileStatsLevel1_t`` structure to be filled. + stats (intptr_t): Pointer to ``CUfileStatsLevel1_t`` structure + to be filled. .. seealso:: `cuFileGetStatsL1` """ @@ -3226,7 +3374,8 @@ cpdef get_stats_l2(intptr_t stats): """Get Level 2 cuFile statistics. Args: - stats (intptr_t): Pointer to ``CUfileStatsLevel2_t`` structure to be filled. + stats (intptr_t): Pointer to ``CUfileStatsLevel2_t`` structure + to be filled. .. seealso:: `cuFileGetStatsL2` """ @@ -3239,7 +3388,8 @@ cpdef get_stats_l3(intptr_t stats): """Get Level 3 cuFile statistics. Args: - stats (intptr_t): Pointer to ``CUfileStatsLevel3_t`` structure to be filled. + stats (intptr_t): Pointer to ``CUfileStatsLevel3_t`` structure + to be filled. .. seealso:: `cuFileGetStatsL3` """ @@ -3277,7 +3427,8 @@ cpdef get_parameter_posix_pool_slab_array(intptr_t size_values, intptr_t count_v Args: size_values (intptr_t): Buffer to receive slab sizes in KB. count_values (intptr_t): Buffer to receive slab counts. - len (int): Buffer size (must match the actual parameter length). + len (int): Buffer size (must match the actual parameter + length). .. seealso:: `cuFileGetParameterPosixPoolSlabArray` """ @@ -3346,4 +3497,6 @@ cpdef write(intptr_t fh, intptr_t buf_ptr_base, size_t size, off_t file_offset, status = cuFileWrite(fh, buf_ptr_base, size, file_offset, buf_ptr_offset) check_status(status) return status + + del _cyb_FastEnum diff --git a/cuda_bindings/cuda/bindings/cycufile.pxd b/cuda_bindings/cuda/bindings/cycufile.pxd index b5a0c9cb884..ac614bf80da 100644 --- a/cuda_bindings/cuda/bindings/cycufile.pxd +++ b/cuda_bindings/cuda/bindings/cycufile.pxd @@ -3,11 +3,21 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=1051fa856de24c84b3c8d3b2996adb28c5db2530a86f49c240b05eb0dab0954d + + +# <<<< PREAMBLE CONTENT >>>> + +from libc.stdint cimport ( + uint32_t, + uint64_t, +) +from libcpp cimport bool as _cyb_bool + + +# <<<< END OF PREAMBLE CONTENT >>>> -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=f840820f160e36eebe6e052b5a5d3a35b55704060301ee2ab7d5cd7a7d580418 -from libc.stdint cimport uint32_t, uint64_t from libc.time cimport time_t -from libcpp cimport bool as cpp_bool from posix.types cimport off_t cimport cuda.bindings.cydriver @@ -371,6 +381,13 @@ cdef extern from 'cufile.h': CUfilePerGpuStats_t per_gpu_stats[16] +# Error-inspection macros from cufile.h (declared as functions so Cython +# emits calls that the C preprocessor expands). +cdef extern from 'cufile.h' nogil: + bint IS_CUDA_ERR(CUfileError_t status) + bint IS_CUFILE_ERR(CUfileOpError err) + + cdef extern from *: """ // This is the missing piece we need to supply to help Cython & C++ compilers. @@ -400,7 +417,7 @@ cdef CUfileError_t cuFileDriverClose() except?CUFILE_LOADING_ERRO cdef CUfileError_t cuFileDriverClose_v2() except?CUFILE_LOADING_ERROR nogil cdef long cuFileUseCount() except* nogil cdef CUfileError_t cuFileDriverGetProperties(CUfileDrvProps_t* props) except?CUFILE_LOADING_ERROR nogil -cdef CUfileError_t cuFileDriverSetPollMode(cpp_bool poll, size_t poll_threshold_size) except?CUFILE_LOADING_ERROR nogil +cdef CUfileError_t cuFileDriverSetPollMode(_cyb_bool poll, size_t poll_threshold_size) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t cuFileDriverSetMaxDirectIOSize(size_t max_direct_io_size) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t cuFileDriverSetMaxCacheSize(size_t max_cache_size) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t cuFileDriverSetMaxPinnedMemSize(size_t max_pinned_size) except?CUFILE_LOADING_ERROR nogil @@ -415,10 +432,10 @@ cdef CUfileError_t cuFileStreamRegister(CUstream stream, unsigned flags) except? cdef CUfileError_t cuFileStreamDeregister(CUstream stream) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t cuFileGetVersion(int* version) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t cuFileGetParameterSizeT(CUFileSizeTConfigParameter_t param, size_t* value) except?CUFILE_LOADING_ERROR nogil -cdef CUfileError_t cuFileGetParameterBool(CUFileBoolConfigParameter_t param, cpp_bool* value) except?CUFILE_LOADING_ERROR nogil +cdef CUfileError_t cuFileGetParameterBool(CUFileBoolConfigParameter_t param, _cyb_bool* value) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t cuFileGetParameterString(CUFileStringConfigParameter_t param, char* desc_str, int len) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t cuFileSetParameterSizeT(CUFileSizeTConfigParameter_t param, size_t value) except?CUFILE_LOADING_ERROR nogil -cdef CUfileError_t cuFileSetParameterBool(CUFileBoolConfigParameter_t param, cpp_bool value) except?CUFILE_LOADING_ERROR nogil +cdef CUfileError_t cuFileSetParameterBool(CUFileBoolConfigParameter_t param, _cyb_bool value) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t cuFileSetParameterString(CUFileStringConfigParameter_t param, const char* desc_str) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t cuFileGetParameterMinMaxValue(CUFileSizeTConfigParameter_t param, size_t* min_value, size_t* max_value) except?CUFILE_LOADING_ERROR nogil cdef CUfileError_t cuFileSetStatsLevel(int level) except?CUFILE_LOADING_ERROR nogil diff --git a/cuda_bindings/cuda/bindings/cycufile.pyx b/cuda_bindings/cuda/bindings/cycufile.pyx index c8d240560b0..ef94b75c02e 100644 --- a/cuda_bindings/cuda/bindings/cycufile.pyx +++ b/cuda_bindings/cuda/bindings/cycufile.pyx @@ -3,12 +3,13 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=a68ff13250f4b5131f4b4adf8a37a4283b27749e8429b5f6e57bfc68bf656b00 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=21f23d353f9a8d02c92a5c5740cfa8bed67c952fbf262b8181fdfb6f65e52a73 # <<<< PREAMBLE CONTENT >>>> cimport cython as _cyb_cython +from libcpp cimport bool as _cyb_bool # <<<< END OF PREAMBLE CONTENT >>>> @@ -66,7 +67,7 @@ cdef CUfileError_t cuFileDriverGetProperties(CUfileDrvProps_t* props) except?CUFILE_LOADING_ERROR nogil: +cdef CUfileError_t cuFileDriverSetPollMode(_cyb_bool poll, size_t poll_threshold_size) except?CUFILE_LOADING_ERROR nogil: return _cufile._cuFileDriverSetPollMode(poll, poll_threshold_size) @@ -127,7 +128,7 @@ cdef CUfileError_t cuFileGetParameterSizeT(CUFileSizeTConfigParameter_t param, s return _cufile._cuFileGetParameterSizeT(param, value) -cdef CUfileError_t cuFileGetParameterBool(CUFileBoolConfigParameter_t param, cpp_bool* value) except?CUFILE_LOADING_ERROR nogil: +cdef CUfileError_t cuFileGetParameterBool(CUFileBoolConfigParameter_t param, _cyb_bool* value) except?CUFILE_LOADING_ERROR nogil: return _cufile._cuFileGetParameterBool(param, value) @@ -139,7 +140,7 @@ cdef CUfileError_t cuFileSetParameterSizeT(CUFileSizeTConfigParameter_t param, s return _cufile._cuFileSetParameterSizeT(param, value) -cdef CUfileError_t cuFileSetParameterBool(CUFileBoolConfigParameter_t param, cpp_bool value) except?CUFILE_LOADING_ERROR nogil: +cdef CUfileError_t cuFileSetParameterBool(CUFileBoolConfigParameter_t param, _cyb_bool value) except?CUFILE_LOADING_ERROR nogil: return _cufile._cuFileSetParameterBool(param, value) diff --git a/cuda_bindings/cuda/bindings/cydriver.pxd b/cuda_bindings/cuda/bindings/cydriver.pxd index 43f9d031e24..cde96a903c2 100644 --- a/cuda_bindings/cuda/bindings/cydriver.pxd +++ b/cuda_bindings/cuda/bindings/cydriver.pxd @@ -4,7 +4,7 @@ # # This code was automatically generated across versions from 12.9.0 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=cccb0572002cd20232f2b9f5c7acf559c92813d33dfc364136d57c8f453e50c6 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=3d716616a92d8ac919b59eccac24b84cb45d655dfb75436b7f9714c71d6f39e6 from libc.stdint cimport uint32_t, uint64_t @@ -3716,6 +3716,7 @@ cdef enum: CU_MEM_CREATE_USAGE_TILE_POOL = 1 cdef enum: CU_MEM_CREATE_USAGE_HW_DECOMPRESS = 2 + cdef enum: CU_MEM_POOL_CREATE_USAGE_HW_DECOMPRESS = 2 cdef enum: CUDA_COOPERATIVE_LAUNCH_MULTI_DEVICE_NO_PRE_LAUNCH_SYNC = 1 diff --git a/cuda_bindings/cuda/bindings/cynvml.pxd b/cuda_bindings/cuda/bindings/cynvml.pxd index 61ac3fa0da7..59d2d8286d6 100644 --- a/cuda_bindings/cuda/bindings/cynvml.pxd +++ b/cuda_bindings/cuda/bindings/cynvml.pxd @@ -4,7 +4,7 @@ # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=5e55307c8ff89e076c29fc7c2a36bf0af7ecf3162693a4c94d7fca65454d6a9e +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=f4f48bbdecd36a33b5561334a2c33ce79322a49091f8ac6cfea40ec71c94287a from libc.stdint cimport int64_t @@ -2357,3 +2357,7 @@ cdef nvmlReturn_t nvmlDeviceGetVgpuSchedulerLog_v2(nvmlDevice_t device, nvmlVgpu cdef nvmlReturn_t nvmlGpuInstanceGetVgpuSchedulerLog_v2(nvmlGpuInstance_t gpuInstance, nvmlVgpuSchedulerLogInfo_v2_t* pSchedulerLogInfo) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil cdef nvmlReturn_t nvmlDeviceSetVgpuSchedulerState_v2(nvmlDevice_t device, nvmlVgpuSchedulerState_v2_t* pSchedulerState) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil cdef nvmlReturn_t nvmlGpuInstanceSetVgpuSchedulerState_v2(nvmlGpuInstance_t gpuInstance, nvmlVgpuSchedulerState_v2_t* pSchedulerState) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil +cdef nvmlReturn_t nvmlSystemGetCPER_v1(nvmlGetCPER_v1_t* cper) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil +cdef nvmlReturn_t nvmlDeviceGetBBXTimeData_v1(nvmlDevice_t device, nvmlBBXTimeData_v1_t* timeData) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil +cdef nvmlReturn_t nvmlDeviceGetAccountingStats_v2(nvmlDevice_t device, nvmlAccountingStats_v2_t* stats) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil +cdef nvmlReturn_t nvmlDeviceGetRemappedRows_v2(nvmlDevice_t device, nvmlRemappedRowsInfo_v2_t* info) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil diff --git a/cuda_bindings/cuda/bindings/cynvml.pyx b/cuda_bindings/cuda/bindings/cynvml.pyx index 612368c7736..9b2f7df7c54 100644 --- a/cuda_bindings/cuda/bindings/cynvml.pyx +++ b/cuda_bindings/cuda/bindings/cynvml.pyx @@ -4,7 +4,7 @@ # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=ec221879a459b2de9b3dfe54cba58613e9c08b279a95f782a450c98fd7cea532 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=b30ca4e9dfac73d38cb872e4dc7d80d69cbb7e516c50e048cb34234a6c0198a6 from ._internal cimport nvml as _nvml @@ -1414,3 +1414,19 @@ cdef nvmlReturn_t nvmlDeviceSetVgpuSchedulerState_v2(nvmlDevice_t device, nvmlVg cdef nvmlReturn_t nvmlGpuInstanceSetVgpuSchedulerState_v2(nvmlGpuInstance_t gpuInstance, nvmlVgpuSchedulerState_v2_t* pSchedulerState) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: return _nvml._nvmlGpuInstanceSetVgpuSchedulerState_v2(gpuInstance, pSchedulerState) + + +cdef nvmlReturn_t nvmlSystemGetCPER_v1(nvmlGetCPER_v1_t* cper) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + return _nvml._nvmlSystemGetCPER_v1(cper) + + +cdef nvmlReturn_t nvmlDeviceGetBBXTimeData_v1(nvmlDevice_t device, nvmlBBXTimeData_v1_t* timeData) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + return _nvml._nvmlDeviceGetBBXTimeData_v1(device, timeData) + + +cdef nvmlReturn_t nvmlDeviceGetAccountingStats_v2(nvmlDevice_t device, nvmlAccountingStats_v2_t* stats) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + return _nvml._nvmlDeviceGetAccountingStats_v2(device, stats) + + +cdef nvmlReturn_t nvmlDeviceGetRemappedRows_v2(nvmlDevice_t device, nvmlRemappedRowsInfo_v2_t* info) except?_NVMLRETURN_T_INTERNAL_LOADING_ERROR nogil: + return _nvml._nvmlDeviceGetRemappedRows_v2(device, info) diff --git a/cuda_bindings/cuda/bindings/cyruntime.pxd b/cuda_bindings/cuda/bindings/cyruntime.pxd index 58e0a14ca60..7eb76712237 100644 --- a/cuda_bindings/cuda/bindings/cyruntime.pxd +++ b/cuda_bindings/cuda/bindings/cyruntime.pxd @@ -4,7 +4,7 @@ # # This code was automatically generated across versions from 12.9.0 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=2b62a3b56226f5cf6953f578057af792369a100b7775328c5aa66d81d780d2ac +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=a7205ec1f1749acd8f9e32e85660d77d8ccb60a0d038bb63fb4b015496f23d07 from libc.stdint cimport uint32_t, uint64_t @@ -1254,6 +1254,20 @@ cdef extern from 'library_types.h': CUDA_EMULATION_STRATEGY_EAGER ctypedef cudaEmulationStrategy_t cudaEmulationStrategy +cdef extern from 'library_types.h': + cdef enum cudaEmulationMantissaControl_t: + CUDA_EMULATION_MANTISSA_CONTROL_DYNAMIC + CUDA_EMULATION_MANTISSA_CONTROL_FIXED + ctypedef cudaEmulationMantissaControl_t cudaEmulationMantissaControl + +cdef extern from 'library_types.h': + cdef enum cudaEmulationSpecialValuesSupport_t: + CUDA_EMULATION_SPECIAL_VALUES_SUPPORT_DEFAULT + CUDA_EMULATION_SPECIAL_VALUES_SUPPORT_NONE + CUDA_EMULATION_SPECIAL_VALUES_SUPPORT_INFINITY + CUDA_EMULATION_SPECIAL_VALUES_SUPPORT_NAN + ctypedef cudaEmulationSpecialValuesSupport_t cudaEmulationSpecialValuesSupport + cdef extern from 'driver_types.h': cdef enum cudaDevSmResourceGroup_flags: cudaDevSmResourceGroupDefault @@ -1276,20 +1290,6 @@ cdef extern from 'driver_types.h': cudaDevWorkqueueConfigScopeDeviceCtx cudaDevWorkqueueConfigScopeGreenCtxBalanced -cdef extern from 'library_types.h': - cdef enum cudaEmulationMantissaControl_t: - CUDA_EMULATION_MANTISSA_CONTROL_DYNAMIC - CUDA_EMULATION_MANTISSA_CONTROL_FIXED - ctypedef cudaEmulationMantissaControl_t cudaEmulationMantissaControl - -cdef extern from 'library_types.h': - cdef enum cudaEmulationSpecialValuesSupport_t: - CUDA_EMULATION_SPECIAL_VALUES_SUPPORT_DEFAULT - CUDA_EMULATION_SPECIAL_VALUES_SUPPORT_NONE - CUDA_EMULATION_SPECIAL_VALUES_SUPPORT_INFINITY - CUDA_EMULATION_SPECIAL_VALUES_SUPPORT_NAN - ctypedef cudaEmulationSpecialValuesSupport_t cudaEmulationSpecialValuesSupport - cdef extern from 'driver_types.h': cdef enum cudaHostTaskSyncMode: cudaHostTaskBlocking diff --git a/cuda_bindings/cuda/bindings/driver.pxd b/cuda_bindings/cuda/bindings/driver.pxd index 9f4d912a3c4..8c5e32e0f65 100644 --- a/cuda_bindings/cuda/bindings/driver.pxd +++ b/cuda_bindings/cuda/bindings/driver.pxd @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 # This code was automatically generated with version 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=f4b08b7f4b26966f9f462562819700500a100748c5b34ab47de79836e6bec3f2 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=3559a38253c9137d67c5955419f694d32429a7355b84c6e7e06ba1d43a296193 cimport cuda.bindings.cydriver as cydriver include "_lib/utils.pxd" @@ -545,13 +545,6 @@ cdef class CUipcEventHandle_st: """ CUDA IPC event handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -564,13 +557,6 @@ cdef class CUipcMemHandle_st: """ CUDA IPC mem handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -1538,11 +1524,6 @@ cdef class CUgraphEdgeData_st: See CUgraphDependencyType. - reserved : bytes - These bytes are unused and must be zeroed. This ensures - compatibility if additional fields are added in the future. - - Methods ------- getPtr() @@ -2336,10 +2317,6 @@ cdef class CUDA_MEMCPY3D_st: Source array reference - reserved0 : Any - Must be NULL - - srcPitch : size_t Source pitch (ignored when src is array) @@ -2380,10 +2357,6 @@ cdef class CUDA_MEMCPY3D_st: Destination array reference - reserved1 : Any - Must be NULL - - dstPitch : size_t Destination pitch (ignored when dst is array) @@ -2422,9 +2395,6 @@ cdef class CUDA_MEMCPY3D_st: cdef CUarray _srcArray - cdef _HelperInputVoidPtr _cyreserved0 - - cdef _HelperInputVoidPtr _cydstHost @@ -2434,9 +2404,6 @@ cdef class CUDA_MEMCPY3D_st: cdef CUarray _dstArray - cdef _HelperInputVoidPtr _cyreserved1 - - cdef class CUDA_MEMCPY3D_PEER_st: """ 3D memory cross-context copy parameters @@ -2589,10 +2556,6 @@ cdef class CUDA_MEMCPY_NODE_PARAMS_st: Must be zero - reserved : int - Must be zero - - copyCtx : CUcontext Context on which to run the node @@ -2733,10 +2696,6 @@ cdef class CUDA_ARRAY_SPARSE_PROPERTIES_st: CU_ARRAY_SPARSE_PROPERTIES_SINGLE_MIPTAIL - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -2763,10 +2722,6 @@ cdef class CUDA_ARRAY_MEMORY_REQUIREMENTS_st: alignment requirement - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -2885,13 +2840,6 @@ cdef class anon_struct10: cdef class anon_struct11: """ - Attributes - ---------- - - reserved : list[int] - - - Methods ------- getPtr() @@ -2920,10 +2868,6 @@ cdef class anon_union4: - reserved : anon_struct11 - - - Methods ------- getPtr() @@ -2943,9 +2887,6 @@ cdef class anon_union4: cdef anon_struct10 _pitch2D - cdef anon_struct11 _reserved - - cdef class CUDA_RESOURCE_DESC_st: """ CUDA Resource descriptor @@ -3019,10 +2960,6 @@ cdef class CUDA_TEXTURE_DESC_st: Border Color - reserved : list[int] - - - Methods ------- getPtr() @@ -3070,10 +3007,6 @@ cdef class CUDA_RESOURCE_VIEW_DESC_st: Last layer index - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -3268,10 +3201,6 @@ cdef class CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st: Flags must either be zero or CUDA_EXTERNAL_MEMORY_DEDICATED - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -3302,10 +3231,6 @@ cdef class CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st: Flags reserved for future use. Must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -3334,10 +3259,6 @@ cdef class CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st: Total number of levels in the mipmap chain - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -3424,10 +3345,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st: Flags reserved for the future. Must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -3464,10 +3381,6 @@ cdef class anon_union7: - reserved : unsigned long long - - - Methods ------- getPtr() @@ -3511,10 +3424,6 @@ cdef class anon_struct16: - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -3553,10 +3462,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st: For all other types of CUexternalSemaphore, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -3593,10 +3498,6 @@ cdef class anon_union8: - reserved : unsigned long long - - - Methods ------- getPtr() @@ -3644,10 +3545,6 @@ cdef class anon_struct19: - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -3686,10 +3583,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st: For all other types of CUexternalSemaphore, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -4032,10 +3925,6 @@ cdef class CUarrayMapInfo_st: flags for future use, must be zero now. - reserved : list[unsigned int] - Reserved for future use, must be zero now. - - Methods ------- getPtr() @@ -4095,10 +3984,6 @@ cdef class anon_struct22: - reserved : bytes - - - Methods ------- getPtr() @@ -4287,10 +4172,6 @@ cdef class CUmemPoolProps_st: Bitmask indicating intended usage for the pool. - reserved : bytes - reserved for future use, must be 0 - - Methods ------- getPtr() @@ -4309,13 +4190,6 @@ cdef class CUmemPoolPtrExportData_st: """ Opaque data for exporting a pool allocation - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -4779,14 +4653,6 @@ cdef class CUgraphNodeParams_st: Type of the node - reserved0 : list[int] - Reserved. Must be zero. - - - reserved1 : list[long long] - Padding. Unused bytes must be zero. - - kernel : CUDA_KERNEL_NODE_PARAMS_v3 Kernel node parameters. @@ -4843,10 +4709,6 @@ cdef class CUgraphNodeParams_st: Padding as bytes - reserved2 : long long - Reserved bytes. Must be zero. - - Methods ------- getPtr() @@ -4906,14 +4768,6 @@ cdef class CUcheckpointLockArgs_st: no timeout - reserved0 : unsigned int - Reserved for future use, must be zero - - - reserved1 : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -4926,13 +4780,6 @@ cdef class CUcheckpointCheckpointArgs_st: """ CUDA checkpoint optional checkpoint arguments - Attributes - ---------- - - reserved : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -4986,14 +4833,6 @@ cdef class CUcheckpointRestoreArgs_st: Number of gpu pairs to remap - reserved : bytes - Reserved for future use, must be zeroed - - - reserved : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -5010,13 +4849,6 @@ cdef class CUcheckpointUnlockArgs_st: """ CUDA checkpoint optional unlock arguments - Attributes - ---------- - - reserved : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -5066,10 +4898,6 @@ cdef class CUmemDecompressParams_st: The decompression algorithm to use. - padding : bytes - - - Methods ------- getPtr() @@ -5248,13 +5076,6 @@ cdef class CUdevWorkqueueConfigResource_st: cdef class CUdevWorkqueueResource_st: """ - Attributes - ---------- - - reserved : bytes - Reserved for future use - - Methods ------- getPtr() @@ -5287,10 +5108,6 @@ cdef class CU_DEV_SM_RESOURCE_GROUP_PARAMS_st: CUdevSmResourceGroup_flags. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -5565,13 +5382,6 @@ cdef class CUipcEventHandle_v1(CUipcEventHandle_st): """ CUDA IPC event handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -5583,13 +5393,6 @@ cdef class CUipcEventHandle(CUipcEventHandle_v1): """ CUDA IPC event handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -5601,13 +5404,6 @@ cdef class CUipcMemHandle_v1(CUipcMemHandle_st): """ CUDA IPC mem handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -5619,13 +5415,6 @@ cdef class CUipcMemHandle(CUipcMemHandle_v1): """ CUDA IPC mem handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -6509,11 +6298,6 @@ cdef class CUgraphEdgeData(CUgraphEdgeData_st): See CUgraphDependencyType. - reserved : bytes - These bytes are unused and must be zeroed. This ensures - compatibility if additional fields are added in the future. - - Methods ------- getPtr() @@ -7702,10 +7486,6 @@ cdef class CUDA_MEMCPY3D_v2(CUDA_MEMCPY3D_st): Source array reference - reserved0 : Any - Must be NULL - - srcPitch : size_t Source pitch (ignored when src is array) @@ -7746,10 +7526,6 @@ cdef class CUDA_MEMCPY3D_v2(CUDA_MEMCPY3D_st): Destination array reference - reserved1 : Any - Must be NULL - - dstPitch : size_t Destination pitch (ignored when dst is array) @@ -7817,10 +7593,6 @@ cdef class CUDA_MEMCPY3D(CUDA_MEMCPY3D_v2): Source array reference - reserved0 : Any - Must be NULL - - srcPitch : size_t Source pitch (ignored when src is array) @@ -7861,10 +7633,6 @@ cdef class CUDA_MEMCPY3D(CUDA_MEMCPY3D_v2): Destination array reference - reserved1 : Any - Must be NULL - - dstPitch : size_t Destination pitch (ignored when dst is array) @@ -8136,10 +7904,6 @@ cdef class CUDA_MEMCPY_NODE_PARAMS(CUDA_MEMCPY_NODE_PARAMS_st): Must be zero - reserved : int - Must be zero - - copyCtx : CUcontext Context on which to run the node @@ -8315,10 +8079,6 @@ cdef class CUDA_ARRAY_SPARSE_PROPERTIES_v1(CUDA_ARRAY_SPARSE_PROPERTIES_st): CU_ARRAY_SPARSE_PROPERTIES_SINGLE_MIPTAIL - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -8350,10 +8110,6 @@ cdef class CUDA_ARRAY_SPARSE_PROPERTIES(CUDA_ARRAY_SPARSE_PROPERTIES_v1): CU_ARRAY_SPARSE_PROPERTIES_SINGLE_MIPTAIL - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -8376,10 +8132,6 @@ cdef class CUDA_ARRAY_MEMORY_REQUIREMENTS_v1(CUDA_ARRAY_MEMORY_REQUIREMENTS_st): alignment requirement - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -8402,10 +8154,6 @@ cdef class CUDA_ARRAY_MEMORY_REQUIREMENTS(CUDA_ARRAY_MEMORY_REQUIREMENTS_v1): alignment requirement - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -8508,10 +8256,6 @@ cdef class CUDA_TEXTURE_DESC_v1(CUDA_TEXTURE_DESC_st): Border Color - reserved : list[int] - - - Methods ------- getPtr() @@ -8562,10 +8306,6 @@ cdef class CUDA_TEXTURE_DESC(CUDA_TEXTURE_DESC_v1): Border Color - reserved : list[int] - - - Methods ------- getPtr() @@ -8612,10 +8352,6 @@ cdef class CUDA_RESOURCE_VIEW_DESC_v1(CUDA_RESOURCE_VIEW_DESC_st): Last layer index - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -8662,10 +8398,6 @@ cdef class CUDA_RESOURCE_VIEW_DESC(CUDA_RESOURCE_VIEW_DESC_v1): Last layer index - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -8867,10 +8599,6 @@ cdef class CUDA_EXTERNAL_MEMORY_HANDLE_DESC_v1(CUDA_EXTERNAL_MEMORY_HANDLE_DESC_ Flags must either be zero or CUDA_EXTERNAL_MEMORY_DEDICATED - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -8901,10 +8629,6 @@ cdef class CUDA_EXTERNAL_MEMORY_HANDLE_DESC(CUDA_EXTERNAL_MEMORY_HANDLE_DESC_v1) Flags must either be zero or CUDA_EXTERNAL_MEMORY_DEDICATED - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -8931,10 +8655,6 @@ cdef class CUDA_EXTERNAL_MEMORY_BUFFER_DESC_v1(CUDA_EXTERNAL_MEMORY_BUFFER_DESC_ Flags reserved for future use. Must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -8961,10 +8681,6 @@ cdef class CUDA_EXTERNAL_MEMORY_BUFFER_DESC(CUDA_EXTERNAL_MEMORY_BUFFER_DESC_v1) Flags reserved for future use. Must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -8992,10 +8708,6 @@ cdef class CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_v1(CUDA_EXTERNAL_MEMORY_MIP Total number of levels in the mipmap chain - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -9023,10 +8735,6 @@ cdef class CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC(CUDA_EXTERNAL_MEMORY_MIPMAP Total number of levels in the mipmap chain - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -9053,10 +8761,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_v1(CUDA_EXTERNAL_SEMAPHORE_HANDLE Flags reserved for the future. Must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -9083,10 +8787,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC(CUDA_EXTERNAL_SEMAPHORE_HANDLE_DE Flags reserved for the future. Must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -9116,10 +8816,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_v1(CUDA_EXTERNAL_SEMAPHORE_SIGN For all other types of CUexternalSemaphore, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -9149,10 +8845,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS(CUDA_EXTERNAL_SEMAPHORE_SIGNAL_ For all other types of CUexternalSemaphore, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -9182,10 +8874,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_v1(CUDA_EXTERNAL_SEMAPHORE_WAIT_P For all other types of CUexternalSemaphore, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -9215,10 +8903,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS(CUDA_EXTERNAL_SEMAPHORE_WAIT_PARA For all other types of CUexternalSemaphore, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -9448,10 +9132,6 @@ cdef class CUarrayMapInfo_v1(CUarrayMapInfo_st): flags for future use, must be zero now. - reserved : list[unsigned int] - Reserved for future use, must be zero now. - - Methods ------- getPtr() @@ -9507,10 +9187,6 @@ cdef class CUarrayMapInfo(CUarrayMapInfo_v1): flags for future use, must be zero now. - reserved : list[unsigned int] - Reserved for future use, must be zero now. - - Methods ------- getPtr() @@ -9847,10 +9523,6 @@ cdef class CUmemPoolProps_v1(CUmemPoolProps_st): Bitmask indicating intended usage for the pool. - reserved : bytes - reserved for future use, must be 0 - - Methods ------- getPtr() @@ -9895,10 +9567,6 @@ cdef class CUmemPoolProps(CUmemPoolProps_v1): Bitmask indicating intended usage for the pool. - reserved : bytes - reserved for future use, must be 0 - - Methods ------- getPtr() @@ -9910,13 +9578,6 @@ cdef class CUmemPoolPtrExportData_v1(CUmemPoolPtrExportData_st): """ Opaque data for exporting a pool allocation - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -9928,13 +9589,6 @@ cdef class CUmemPoolPtrExportData(CUmemPoolPtrExportData_v1): """ Opaque data for exporting a pool allocation - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -10429,14 +10083,6 @@ cdef class CUgraphNodeParams(CUgraphNodeParams_st): Type of the node - reserved0 : list[int] - Reserved. Must be zero. - - - reserved1 : list[long long] - Padding. Unused bytes must be zero. - - kernel : CUDA_KERNEL_NODE_PARAMS_v3 Kernel node parameters. @@ -10493,10 +10139,6 @@ cdef class CUgraphNodeParams(CUgraphNodeParams_st): Padding as bytes - reserved2 : long long - Reserved bytes. Must be zero. - - Methods ------- getPtr() @@ -10516,14 +10158,6 @@ cdef class CUcheckpointLockArgs(CUcheckpointLockArgs_st): no timeout - reserved0 : unsigned int - Reserved for future use, must be zero - - - reserved1 : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -10535,13 +10169,6 @@ cdef class CUcheckpointCheckpointArgs(CUcheckpointCheckpointArgs_st): """ CUDA checkpoint optional checkpoint arguments - Attributes - ---------- - - reserved : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -10587,14 +10214,6 @@ cdef class CUcheckpointRestoreArgs(CUcheckpointRestoreArgs_st): Number of gpu pairs to remap - reserved : bytes - Reserved for future use, must be zeroed - - - reserved : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -10606,13 +10225,6 @@ cdef class CUcheckpointUnlockArgs(CUcheckpointUnlockArgs_st): """ CUDA checkpoint optional unlock arguments - Attributes - ---------- - - reserved : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -10661,10 +10273,6 @@ cdef class CUmemDecompressParams(CUmemDecompressParams_st): The decompression algorithm to use. - padding : bytes - - - Methods ------- getPtr() @@ -10800,13 +10408,6 @@ cdef class CUdevWorkqueueConfigResource(CUdevWorkqueueConfigResource_st): cdef class CUdevWorkqueueResource(CUdevWorkqueueResource_st): """ - Attributes - ---------- - - reserved : bytes - Reserved for future use - - Methods ------- getPtr() @@ -10838,10 +10439,6 @@ cdef class CU_DEV_SM_RESOURCE_GROUP_PARAMS(CU_DEV_SM_RESOURCE_GROUP_PARAMS_st): CUdevSmResourceGroup_flags. - reserved : list[unsigned int] - - - Methods ------- getPtr() diff --git a/cuda_bindings/cuda/bindings/driver.pyx b/cuda_bindings/cuda/bindings/driver.pyx index 44b7c4c567c..71c9d0d2f92 100644 --- a/cuda_bindings/cuda/bindings/driver.pyx +++ b/cuda_bindings/cuda/bindings/driver.pyx @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 # This code was automatically generated with version 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=4a70be46627269cff03a2b89504463158d6e50d738cfde91e8c3ed1bf88fd9e0 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=f62fe4f88ff8394acc48a14d465c00898f1f24f13fbd339862226a544cc8111a from typing import Any, Optional import cython import ctypes @@ -9724,13 +9724,6 @@ cdef class CUipcEventHandle_st: """ CUDA IPC event handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -9751,45 +9744,14 @@ cdef class CUipcEventHandle_st: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 64) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 64: - raise ValueError("reserved length must be 64, is " + str(len(reserved))) - if CHAR_MIN == 0: - for i, b in enumerate(reserved): - if b < 0 and b > -129: - b = b + 256 - self._pvt_ptr[0].reserved[i] = b - else: - for i, b in enumerate(reserved): - if b > 127 and b < 256: - b = b - 256 - self._pvt_ptr[0].reserved[i] = b - - cdef class CUipcMemHandle_st: """ CUDA IPC mem handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -9810,34 +9772,10 @@ cdef class CUipcMemHandle_st: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 64) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 64: - raise ValueError("reserved length must be 64, is " + str(len(reserved))) - if CHAR_MIN == 0: - for i, b in enumerate(reserved): - if b < 0 and b > -129: - b = b + 256 - self._pvt_ptr[0].reserved[i] = b - else: - for i, b in enumerate(reserved): - if b > 127 and b < 256: - b = b - 256 - self._pvt_ptr[0].reserved[i] = b - - cdef class CUstreamMemOpWaitValueParams_st: """ Attributes @@ -10810,6 +10748,7 @@ cdef class CUDA_BATCH_MEM_OP_NODE_PARAMS_v1_st: return [CUstreamBatchMemOpParams(_ptr=arr) for arr in arrs] @paramArray.setter def paramArray(self, val): + cdef cydriver.CUstreamBatchMemOpParams* _paramArray_new if len(val) == 0: free(self._paramArray) self._paramArray = NULL @@ -10817,14 +10756,22 @@ cdef class CUDA_BATCH_MEM_OP_NODE_PARAMS_v1_st: self._pvt_ptr[0].paramArray = NULL else: if self._paramArray_length != len(val): - free(self._paramArray) - self._paramArray = calloc(len(val), sizeof(cydriver.CUstreamBatchMemOpParams)) - if self._paramArray is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _paramArray_new = calloc(len(val), sizeof(cydriver.CUstreamBatchMemOpParams)) + if _paramArray_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUstreamBatchMemOpParams))) + for idx in range(len(val)): + string.memcpy(&_paramArray_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUstreamBatchMemOpParams)) + free(self._paramArray) + self._paramArray = _paramArray_new self._paramArray_length = len(val) - self._pvt_ptr[0].paramArray = self._paramArray - for idx in range(len(val)): - string.memcpy(&self._paramArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUstreamBatchMemOpParams)) + self._pvt_ptr[0].paramArray = _paramArray_new + else: + for idx in range(len(val)): + string.memcpy(&self._paramArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUstreamBatchMemOpParams)) @@ -10945,6 +10892,7 @@ cdef class CUDA_BATCH_MEM_OP_NODE_PARAMS_v2_st: return [CUstreamBatchMemOpParams(_ptr=arr) for arr in arrs] @paramArray.setter def paramArray(self, val): + cdef cydriver.CUstreamBatchMemOpParams* _paramArray_new if len(val) == 0: free(self._paramArray) self._paramArray = NULL @@ -10952,14 +10900,22 @@ cdef class CUDA_BATCH_MEM_OP_NODE_PARAMS_v2_st: self._pvt_ptr[0].paramArray = NULL else: if self._paramArray_length != len(val): - free(self._paramArray) - self._paramArray = calloc(len(val), sizeof(cydriver.CUstreamBatchMemOpParams)) - if self._paramArray is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _paramArray_new = calloc(len(val), sizeof(cydriver.CUstreamBatchMemOpParams)) + if _paramArray_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUstreamBatchMemOpParams))) + for idx in range(len(val)): + string.memcpy(&_paramArray_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUstreamBatchMemOpParams)) + free(self._paramArray) + self._paramArray = _paramArray_new self._paramArray_length = len(val) - self._pvt_ptr[0].paramArray = self._paramArray - for idx in range(len(val)): - string.memcpy(&self._paramArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUstreamBatchMemOpParams)) + self._pvt_ptr[0].paramArray = _paramArray_new + else: + for idx in range(len(val)): + string.memcpy(&self._paramArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUstreamBatchMemOpParams)) @@ -12977,11 +12933,6 @@ cdef class CUgraphEdgeData_st: See CUgraphDependencyType. - reserved : bytes - These bytes are unused and must be zeroed. This ensures - compatibility if additional fields are added in the future. - - Methods ------- getPtr() @@ -13019,12 +12970,6 @@ cdef class CUgraphEdgeData_st: except ValueError: str_list += ['type : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -13053,17 +12998,6 @@ cdef class CUgraphEdgeData_st: self._pvt_ptr[0].type = type - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 5) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 5: - raise ValueError("reserved length must be 5, is " + str(len(reserved))) - for i, b in enumerate(reserved): - self._pvt_ptr[0].reserved[i] = b - - cdef class CUDA_GRAPH_INSTANTIATE_PARAMS_st: """ Graph instantiation parameters @@ -14390,6 +14324,7 @@ cdef class CUlaunchConfig_st: return [CUlaunchAttribute(_ptr=arr) for arr in arrs] @attrs.setter def attrs(self, val): + cdef cydriver.CUlaunchAttribute* _attrs_new if len(val) == 0: free(self._attrs) self._attrs = NULL @@ -14397,14 +14332,22 @@ cdef class CUlaunchConfig_st: self._pvt_ptr[0].attrs = NULL else: if self._attrs_length != len(val): - free(self._attrs) - self._attrs = calloc(len(val), sizeof(cydriver.CUlaunchAttribute)) - if self._attrs is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _attrs_new = calloc(len(val), sizeof(cydriver.CUlaunchAttribute)) + if _attrs_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUlaunchAttribute))) + for idx in range(len(val)): + string.memcpy(&_attrs_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUlaunchAttribute)) + free(self._attrs) + self._attrs = _attrs_new self._attrs_length = len(val) - self._pvt_ptr[0].attrs = self._attrs - for idx in range(len(val)): - string.memcpy(&self._attrs[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUlaunchAttribute)) + self._pvt_ptr[0].attrs = _attrs_new + else: + for idx in range(len(val)): + string.memcpy(&self._attrs[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUlaunchAttribute)) @@ -14733,6 +14676,7 @@ cdef class CUctxCreateParams_st: return [CUexecAffinityParam(_ptr=arr) for arr in arrs] @execAffinityParams.setter def execAffinityParams(self, val): + cdef cydriver.CUexecAffinityParam* _execAffinityParams_new if len(val) == 0: free(self._execAffinityParams) self._execAffinityParams = NULL @@ -14740,14 +14684,22 @@ cdef class CUctxCreateParams_st: self._pvt_ptr[0].execAffinityParams = NULL else: if self._execAffinityParams_length != len(val): - free(self._execAffinityParams) - self._execAffinityParams = calloc(len(val), sizeof(cydriver.CUexecAffinityParam)) - if self._execAffinityParams is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _execAffinityParams_new = calloc(len(val), sizeof(cydriver.CUexecAffinityParam)) + if _execAffinityParams_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUexecAffinityParam))) + for idx in range(len(val)): + string.memcpy(&_execAffinityParams_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUexecAffinityParam)) + free(self._execAffinityParams) + self._execAffinityParams = _execAffinityParams_new self._execAffinityParams_length = len(val) - self._pvt_ptr[0].execAffinityParams = self._execAffinityParams - for idx in range(len(val)): - string.memcpy(&self._execAffinityParams[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUexecAffinityParam)) + self._pvt_ptr[0].execAffinityParams = _execAffinityParams_new + else: + for idx in range(len(val)): + string.memcpy(&self._execAffinityParams[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUexecAffinityParam)) @@ -14765,6 +14717,7 @@ cdef class CUctxCreateParams_st: return [CUctxCigParam(_ptr=arr) for arr in arrs] @cigParams.setter def cigParams(self, val): + cdef cydriver.CUctxCigParam* _cigParams_new if len(val) == 0: free(self._cigParams) self._cigParams = NULL @@ -14772,14 +14725,22 @@ cdef class CUctxCreateParams_st: self._pvt_ptr[0].cigParams = NULL else: if self._cigParams_length != len(val): - free(self._cigParams) - self._cigParams = calloc(len(val), sizeof(cydriver.CUctxCigParam)) - if self._cigParams is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _cigParams_new = calloc(len(val), sizeof(cydriver.CUctxCigParam)) + if _cigParams_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUctxCigParam))) + for idx in range(len(val)): + string.memcpy(&_cigParams_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUctxCigParam)) + free(self._cigParams) + self._cigParams = _cigParams_new self._cigParams_length = len(val) - self._pvt_ptr[0].cigParams = self._cigParams - for idx in range(len(val)): - string.memcpy(&self._cigParams[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUctxCigParam)) + self._pvt_ptr[0].cigParams = _cigParams_new + else: + for idx in range(len(val)): + string.memcpy(&self._cigParams[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUctxCigParam)) @@ -14904,6 +14865,7 @@ cdef class CUstreamCigCaptureParams_st: return [CUstreamCigParam(_ptr=arr) for arr in arrs] @streamCigParams.setter def streamCigParams(self, val): + cdef cydriver.CUstreamCigParam* _streamCigParams_new if len(val) == 0: free(self._streamCigParams) self._streamCigParams = NULL @@ -14911,14 +14873,22 @@ cdef class CUstreamCigCaptureParams_st: self._pvt_ptr[0].streamCigParams = NULL else: if self._streamCigParams_length != len(val): - free(self._streamCigParams) - self._streamCigParams = calloc(len(val), sizeof(cydriver.CUstreamCigParam)) - if self._streamCigParams is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _streamCigParams_new = calloc(len(val), sizeof(cydriver.CUstreamCigParam)) + if _streamCigParams_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUstreamCigParam))) + for idx in range(len(val)): + string.memcpy(&_streamCigParams_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUstreamCigParam)) + free(self._streamCigParams) + self._streamCigParams = _streamCigParams_new self._streamCigParams_length = len(val) - self._pvt_ptr[0].streamCigParams = self._streamCigParams - for idx in range(len(val)): - string.memcpy(&self._streamCigParams[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUstreamCigParam)) + self._pvt_ptr[0].streamCigParams = _streamCigParams_new + else: + for idx in range(len(val)): + string.memcpy(&self._streamCigParams[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUstreamCigParam)) @@ -15433,10 +15403,6 @@ cdef class CUDA_MEMCPY3D_st: Source array reference - reserved0 : Any - Must be NULL - - srcPitch : size_t Source pitch (ignored when src is array) @@ -15477,10 +15443,6 @@ cdef class CUDA_MEMCPY3D_st: Destination array reference - reserved1 : Any - Must be NULL - - dstPitch : size_t Destination pitch (ignored when dst is array) @@ -15582,12 +15544,6 @@ cdef class CUDA_MEMCPY3D_st: str_list += ['srcArray : '] - try: - str_list += ['reserved0 : ' + hex(self.reserved0)] - except ValueError: - str_list += ['reserved0 : '] - - try: str_list += ['srcPitch : ' + str(self.srcPitch)] except ValueError: @@ -15648,12 +15604,6 @@ cdef class CUDA_MEMCPY3D_st: str_list += ['dstArray : '] - try: - str_list += ['reserved1 : ' + hex(self.reserved1)] - except ValueError: - str_list += ['reserved1 : '] - - try: str_list += ['dstPitch : ' + str(self.dstPitch)] except ValueError: @@ -15771,15 +15721,6 @@ cdef class CUDA_MEMCPY3D_st: self._srcArray._pvt_ptr[0] = cysrcArray - @property - def reserved0(self): - return self._pvt_ptr[0].reserved0 - @reserved0.setter - def reserved0(self, reserved0): - self._cyreserved0 = _HelperInputVoidPtr(reserved0) - self._pvt_ptr[0].reserved0 = self._cyreserved0.cptr - - @property def srcPitch(self): return self._pvt_ptr[0].srcPitch @@ -15880,15 +15821,6 @@ cdef class CUDA_MEMCPY3D_st: self._dstArray._pvt_ptr[0] = cydstArray - @property - def reserved1(self): - return self._pvt_ptr[0].reserved1 - @reserved1.setter - def reserved1(self, reserved1): - self._cyreserved1 = _HelperInputVoidPtr(reserved1) - self._pvt_ptr[0].reserved1 = self._cyreserved1.cptr - - @property def dstPitch(self): return self._pvt_ptr[0].dstPitch @@ -16498,10 +16430,6 @@ cdef class CUDA_MEMCPY_NODE_PARAMS_st: Must be zero - reserved : int - Must be zero - - copyCtx : CUcontext Context on which to run the node @@ -16542,12 +16470,6 @@ cdef class CUDA_MEMCPY_NODE_PARAMS_st: str_list += ['flags : '] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - - try: str_list += ['copyCtx : ' + str(self.copyCtx)] except ValueError: @@ -16571,14 +16493,6 @@ cdef class CUDA_MEMCPY_NODE_PARAMS_st: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, int reserved): - self._pvt_ptr[0].reserved = reserved - - @property def copyCtx(self): return self._copyCtx @@ -16948,10 +16862,6 @@ cdef class CUDA_ARRAY_SPARSE_PROPERTIES_st: CU_ARRAY_SPARSE_PROPERTIES_SINGLE_MIPTAIL - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -16998,12 +16908,6 @@ cdef class CUDA_ARRAY_SPARSE_PROPERTIES_st: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -17040,14 +16944,6 @@ cdef class CUDA_ARRAY_SPARSE_PROPERTIES_st: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class CUDA_ARRAY_MEMORY_REQUIREMENTS_st: """ CUDA array memory requirements @@ -17063,10 +16959,6 @@ cdef class CUDA_ARRAY_MEMORY_REQUIREMENTS_st: alignment requirement - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -17098,12 +16990,6 @@ cdef class CUDA_ARRAY_MEMORY_REQUIREMENTS_st: except ValueError: str_list += ['alignment : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -17124,14 +17010,6 @@ cdef class CUDA_ARRAY_MEMORY_REQUIREMENTS_st: self._pvt_ptr[0].alignment = alignment - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class anon_struct7: """ Attributes @@ -17504,13 +17382,6 @@ cdef class anon_struct10: cdef class anon_struct11: """ - Attributes - ---------- - - reserved : list[int] - - - Methods ------- getPtr() @@ -17529,23 +17400,10 @@ cdef class anon_struct11: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return self._pvt_ptr[0].res.reserved.reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].res.reserved.reserved = reserved - - cdef class anon_union4: """ Attributes @@ -17567,10 +17425,6 @@ cdef class anon_union4: - reserved : anon_struct11 - - - Methods ------- getPtr() @@ -17593,9 +17447,6 @@ cdef class anon_union4: self._pitch2D = anon_struct10(_ptr=self._pvt_ptr) - - self._reserved = anon_struct11(_ptr=self._pvt_ptr) - def __dealloc__(self): pass def getPtr(self): @@ -17627,12 +17478,6 @@ cdef class anon_union4: except ValueError: str_list += ['pitch2D : '] - - try: - str_list += ['reserved :\n' + '\n'.join([' ' + line for line in str(self.reserved).splitlines()])] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -17669,14 +17514,6 @@ cdef class anon_union4: string.memcpy(&self._pvt_ptr[0].res.pitch2D, pitch2D.getPtr(), sizeof(self._pvt_ptr[0].res.pitch2D)) - @property - def reserved(self): - return self._reserved - @reserved.setter - def reserved(self, reserved not None : anon_struct11): - string.memcpy(&self._pvt_ptr[0].res.reserved, reserved.getPtr(), sizeof(self._pvt_ptr[0].res.reserved)) - - cdef class CUDA_RESOURCE_DESC_st: """ CUDA Resource descriptor @@ -17809,10 +17646,6 @@ cdef class CUDA_TEXTURE_DESC_st: Border Color - reserved : list[int] - - - Methods ------- getPtr() @@ -17886,12 +17719,6 @@ cdef class CUDA_TEXTURE_DESC_st: except ValueError: str_list += ['borderColor : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -17968,14 +17795,6 @@ cdef class CUDA_TEXTURE_DESC_st: self._pvt_ptr[0].borderColor = borderColor - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class CUDA_RESOURCE_VIEW_DESC_st: """ Resource view descriptor @@ -18015,10 +17834,6 @@ cdef class CUDA_RESOURCE_VIEW_DESC_st: Last layer index - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -18086,12 +17901,6 @@ cdef class CUDA_RESOURCE_VIEW_DESC_st: except ValueError: str_list += ['lastLayer : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -18160,14 +17969,6 @@ cdef class CUDA_RESOURCE_VIEW_DESC_st: self._pvt_ptr[0].lastLayer = lastLayer - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class CUtensorMap_st: """ Tensor map descriptor. Requires compiler support for aligning to @@ -18690,10 +18491,6 @@ cdef class CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st: Flags must either be zero or CUDA_EXTERNAL_MEMORY_DEDICATED - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -18742,12 +18539,6 @@ cdef class CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -18784,14 +18575,6 @@ cdef class CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st: """ External memory buffer descriptor @@ -18811,10 +18594,6 @@ cdef class CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st: Flags reserved for future use. Must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -18852,12 +18631,6 @@ cdef class CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -18886,14 +18659,6 @@ cdef class CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st: """ External memory mipmap descriptor @@ -18914,10 +18679,6 @@ cdef class CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st: Total number of levels in the mipmap chain - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -18958,12 +18719,6 @@ cdef class CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st: except ValueError: str_list += ['numLevels : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -18992,14 +18747,6 @@ cdef class CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st: self._pvt_ptr[0].numLevels = numLevels - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class anon_struct13: """ Attributes @@ -19167,10 +18914,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st: Flags reserved for the future. Must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -19213,12 +18956,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -19247,14 +18984,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class anon_struct14: """ Attributes @@ -19308,10 +19037,6 @@ cdef class anon_union7: - reserved : unsigned long long - - - Methods ------- getPtr() @@ -19335,12 +19060,6 @@ cdef class anon_union7: except ValueError: str_list += ['fence : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -19354,14 +19073,6 @@ cdef class anon_union7: self._pvt_ptr[0].params.nvSciSync.fence = self._cyfence.cptr - @property - def reserved(self): - return self._pvt_ptr[0].params.nvSciSync.reserved - @reserved.setter - def reserved(self, unsigned long long reserved): - self._pvt_ptr[0].params.nvSciSync.reserved = reserved - - cdef class anon_struct15: """ Attributes @@ -19423,10 +19134,6 @@ cdef class anon_struct16: - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -19471,12 +19178,6 @@ cdef class anon_struct16: except ValueError: str_list += ['keyedMutex : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -19505,14 +19206,6 @@ cdef class anon_struct16: string.memcpy(&self._pvt_ptr[0].params.keyedMutex, keyedMutex.getPtr(), sizeof(self._pvt_ptr[0].params.keyedMutex)) - @property - def reserved(self): - return self._pvt_ptr[0].params.reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].params.reserved = reserved - - cdef class CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st: """ External semaphore signal parameters @@ -19535,10 +19228,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st: For all other types of CUexternalSemaphore, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -19573,12 +19262,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -19599,14 +19282,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class anon_struct17: """ Attributes @@ -19660,10 +19335,6 @@ cdef class anon_union8: - reserved : unsigned long long - - - Methods ------- getPtr() @@ -19687,12 +19358,6 @@ cdef class anon_union8: except ValueError: str_list += ['fence : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -19706,14 +19371,6 @@ cdef class anon_union8: self._pvt_ptr[0].params.nvSciSync.fence = self._cyfence.cptr - @property - def reserved(self): - return self._pvt_ptr[0].params.nvSciSync.reserved - @reserved.setter - def reserved(self, unsigned long long reserved): - self._pvt_ptr[0].params.nvSciSync.reserved = reserved - - cdef class anon_struct18: """ Attributes @@ -19793,10 +19450,6 @@ cdef class anon_struct19: - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -19841,12 +19494,6 @@ cdef class anon_struct19: except ValueError: str_list += ['keyedMutex : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -19875,14 +19522,6 @@ cdef class anon_struct19: string.memcpy(&self._pvt_ptr[0].params.keyedMutex, keyedMutex.getPtr(), sizeof(self._pvt_ptr[0].params.keyedMutex)) - @property - def reserved(self): - return self._pvt_ptr[0].params.reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].params.reserved = reserved - - cdef class CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st: """ External semaphore wait parameters @@ -19905,10 +19544,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st: For all other types of CUexternalSemaphore, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -19943,12 +19578,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -19969,14 +19598,6 @@ cdef class CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_st: """ Semaphore signal node parameters @@ -20078,6 +19699,7 @@ cdef class CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_st: return [CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS(_ptr=arr) for arr in arrs] @paramsArray.setter def paramsArray(self, val): + cdef cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS* _paramsArray_new if len(val) == 0: free(self._paramsArray) self._paramsArray = NULL @@ -20085,14 +19707,22 @@ cdef class CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_st: self._pvt_ptr[0].paramsArray = NULL else: if self._paramsArray_length != len(val): - free(self._paramsArray) - self._paramsArray = calloc(len(val), sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS)) - if self._paramsArray is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _paramsArray_new = calloc(len(val), sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS)) + if _paramsArray_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS))) + for idx in range(len(val)): + string.memcpy(&_paramsArray_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS)) + free(self._paramsArray) + self._paramsArray = _paramsArray_new self._paramsArray_length = len(val) - self._pvt_ptr[0].paramsArray = self._paramsArray - for idx in range(len(val)): - string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS)) + self._pvt_ptr[0].paramsArray = _paramsArray_new + else: + for idx in range(len(val)): + string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS)) @@ -20205,6 +19835,7 @@ cdef class CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_v2_st: return [CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS(_ptr=arr) for arr in arrs] @paramsArray.setter def paramsArray(self, val): + cdef cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS* _paramsArray_new if len(val) == 0: free(self._paramsArray) self._paramsArray = NULL @@ -20212,14 +19843,22 @@ cdef class CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_v2_st: self._pvt_ptr[0].paramsArray = NULL else: if self._paramsArray_length != len(val): - free(self._paramsArray) - self._paramsArray = calloc(len(val), sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS)) - if self._paramsArray is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _paramsArray_new = calloc(len(val), sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS)) + if _paramsArray_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS))) + for idx in range(len(val)): + string.memcpy(&_paramsArray_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS)) + free(self._paramsArray) + self._paramsArray = _paramsArray_new self._paramsArray_length = len(val) - self._pvt_ptr[0].paramsArray = self._paramsArray - for idx in range(len(val)): - string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS)) + self._pvt_ptr[0].paramsArray = _paramsArray_new + else: + for idx in range(len(val)): + string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS)) @@ -20332,6 +19971,7 @@ cdef class CUDA_EXT_SEM_WAIT_NODE_PARAMS_st: return [CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS(_ptr=arr) for arr in arrs] @paramsArray.setter def paramsArray(self, val): + cdef cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS* _paramsArray_new if len(val) == 0: free(self._paramsArray) self._paramsArray = NULL @@ -20339,14 +19979,22 @@ cdef class CUDA_EXT_SEM_WAIT_NODE_PARAMS_st: self._pvt_ptr[0].paramsArray = NULL else: if self._paramsArray_length != len(val): - free(self._paramsArray) - self._paramsArray = calloc(len(val), sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS)) - if self._paramsArray is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _paramsArray_new = calloc(len(val), sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS)) + if _paramsArray_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS))) + for idx in range(len(val)): + string.memcpy(&_paramsArray_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS)) + free(self._paramsArray) + self._paramsArray = _paramsArray_new self._paramsArray_length = len(val) - self._pvt_ptr[0].paramsArray = self._paramsArray - for idx in range(len(val)): - string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS)) + self._pvt_ptr[0].paramsArray = _paramsArray_new + else: + for idx in range(len(val)): + string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS)) @@ -20459,6 +20107,7 @@ cdef class CUDA_EXT_SEM_WAIT_NODE_PARAMS_v2_st: return [CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS(_ptr=arr) for arr in arrs] @paramsArray.setter def paramsArray(self, val): + cdef cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS* _paramsArray_new if len(val) == 0: free(self._paramsArray) self._paramsArray = NULL @@ -20466,14 +20115,22 @@ cdef class CUDA_EXT_SEM_WAIT_NODE_PARAMS_v2_st: self._pvt_ptr[0].paramsArray = NULL else: if self._paramsArray_length != len(val): - free(self._paramsArray) - self._paramsArray = calloc(len(val), sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS)) - if self._paramsArray is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _paramsArray_new = calloc(len(val), sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS)) + if _paramsArray_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS))) + for idx in range(len(val)): + string.memcpy(&_paramsArray_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS)) + free(self._paramsArray) + self._paramsArray = _paramsArray_new self._paramsArray_length = len(val) - self._pvt_ptr[0].paramsArray = self._paramsArray - for idx in range(len(val)): - string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS)) + self._pvt_ptr[0].paramsArray = _paramsArray_new + else: + for idx in range(len(val)): + string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS)) @@ -20994,10 +20651,6 @@ cdef class CUarrayMapInfo_st: flags for future use, must be zero now. - reserved : list[unsigned int] - Reserved for future use, must be zero now. - - Methods ------- getPtr() @@ -21088,12 +20741,6 @@ cdef class CUarrayMapInfo_st: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -21178,14 +20825,6 @@ cdef class CUarrayMapInfo_st: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class CUmemLocation_st: """ Specifies a memory location. @@ -21273,10 +20912,6 @@ cdef class anon_struct22: - reserved : bytes - - - Methods ------- getPtr() @@ -21312,12 +20947,6 @@ cdef class anon_struct22: except ValueError: str_list += ['usage : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -21346,17 +20975,6 @@ cdef class anon_struct22: self._pvt_ptr[0].allocFlags.usage = usage - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].allocFlags.reserved, 4) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 4: - raise ValueError("reserved length must be 4, is " + str(len(reserved))) - for i, b in enumerate(reserved): - self._pvt_ptr[0].allocFlags.reserved[i] = b - - cdef class CUmemAllocationProp_st: """ Specifies the allocation properties for a allocation. @@ -21810,10 +21428,6 @@ cdef class CUmemPoolProps_st: Bitmask indicating intended usage for the pool. - reserved : bytes - reserved for future use, must be 0 - - Methods ------- getPtr() @@ -21872,12 +21486,6 @@ cdef class CUmemPoolProps_st: except ValueError: str_list += ['usage : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -21931,28 +21539,10 @@ cdef class CUmemPoolProps_st: self._pvt_ptr[0].usage = usage - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 54) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 54: - raise ValueError("reserved length must be 54, is " + str(len(reserved))) - for i, b in enumerate(reserved): - self._pvt_ptr[0].reserved[i] = b - - cdef class CUmemPoolPtrExportData_st: """ Opaque data for exporting a pool allocation - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -21973,26 +21563,10 @@ cdef class CUmemPoolPtrExportData_st: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 64) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 64: - raise ValueError("reserved length must be 64, is " + str(len(reserved))) - for i, b in enumerate(reserved): - self._pvt_ptr[0].reserved[i] = b - - cdef class CUmemcpyAttributes_st: """ Attributes specific to copies within a batch. For more details on @@ -22840,6 +22414,7 @@ cdef class CUDA_MEM_ALLOC_NODE_PARAMS_v1_st: return [CUmemAccessDesc(_ptr=arr) for arr in arrs] @accessDescs.setter def accessDescs(self, val): + cdef cydriver.CUmemAccessDesc* _accessDescs_new if len(val) == 0: free(self._accessDescs) self._accessDescs = NULL @@ -22847,14 +22422,22 @@ cdef class CUDA_MEM_ALLOC_NODE_PARAMS_v1_st: self._pvt_ptr[0].accessDescs = NULL else: if self._accessDescs_length != len(val): - free(self._accessDescs) - self._accessDescs = calloc(len(val), sizeof(cydriver.CUmemAccessDesc)) - if self._accessDescs is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _accessDescs_new = calloc(len(val), sizeof(cydriver.CUmemAccessDesc)) + if _accessDescs_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUmemAccessDesc))) + for idx in range(len(val)): + string.memcpy(&_accessDescs_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUmemAccessDesc)) + free(self._accessDescs) + self._accessDescs = _accessDescs_new self._accessDescs_length = len(val) - self._pvt_ptr[0].accessDescs = self._accessDescs - for idx in range(len(val)): - string.memcpy(&self._accessDescs[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUmemAccessDesc)) + self._pvt_ptr[0].accessDescs = _accessDescs_new + else: + for idx in range(len(val)): + string.memcpy(&self._accessDescs[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUmemAccessDesc)) @@ -23001,6 +22584,7 @@ cdef class CUDA_MEM_ALLOC_NODE_PARAMS_v2_st: return [CUmemAccessDesc(_ptr=arr) for arr in arrs] @accessDescs.setter def accessDescs(self, val): + cdef cydriver.CUmemAccessDesc* _accessDescs_new if len(val) == 0: free(self._accessDescs) self._accessDescs = NULL @@ -23008,14 +22592,22 @@ cdef class CUDA_MEM_ALLOC_NODE_PARAMS_v2_st: self._pvt_ptr[0].accessDescs = NULL else: if self._accessDescs_length != len(val): - free(self._accessDescs) - self._accessDescs = calloc(len(val), sizeof(cydriver.CUmemAccessDesc)) - if self._accessDescs is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _accessDescs_new = calloc(len(val), sizeof(cydriver.CUmemAccessDesc)) + if _accessDescs_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUmemAccessDesc))) + for idx in range(len(val)): + string.memcpy(&_accessDescs_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUmemAccessDesc)) + free(self._accessDescs) + self._accessDescs = _accessDescs_new self._accessDescs_length = len(val) - self._pvt_ptr[0].accessDescs = self._accessDescs - for idx in range(len(val)): - string.memcpy(&self._accessDescs[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUmemAccessDesc)) + self._pvt_ptr[0].accessDescs = _accessDescs_new + else: + for idx in range(len(val)): + string.memcpy(&self._accessDescs[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUmemAccessDesc)) @@ -23327,14 +22919,6 @@ cdef class CUgraphNodeParams_st: Type of the node - reserved0 : list[int] - Reserved. Must be zero. - - - reserved1 : list[long long] - Padding. Unused bytes must be zero. - - kernel : CUDA_KERNEL_NODE_PARAMS_v3 Kernel node parameters. @@ -23391,10 +22975,6 @@ cdef class CUgraphNodeParams_st: Padding as bytes - reserved2 : long long - Reserved bytes. Must be zero. - - Methods ------- getPtr() @@ -23462,18 +23042,6 @@ cdef class CUgraphNodeParams_st: str_list += ['type : '] - try: - str_list += ['reserved0 : ' + str(self.reserved0)] - except ValueError: - str_list += ['reserved0 : '] - - - try: - str_list += ['reserved1 : ' + str(self.reserved1)] - except ValueError: - str_list += ['reserved1 : '] - - try: str_list += ['kernel :\n' + '\n'.join([' ' + line for line in str(self.kernel).splitlines()])] except ValueError: @@ -23557,12 +23125,6 @@ cdef class CUgraphNodeParams_st: except ValueError: str_list += ['asBytes : '] - - try: - str_list += ['reserved2 : ' + str(self.reserved2)] - except ValueError: - str_list += ['reserved2 : '] - return '\n'.join(str_list) else: return '' @@ -23575,22 +23137,6 @@ cdef class CUgraphNodeParams_st: self._pvt_ptr[0].type = int(type) - @property - def reserved0(self): - return self._pvt_ptr[0].reserved0 - @reserved0.setter - def reserved0(self, reserved0): - self._pvt_ptr[0].reserved0 = reserved0 - - - @property - def reserved1(self): - return self._pvt_ptr[0].reserved1 - @reserved1.setter - def reserved1(self, reserved1): - self._pvt_ptr[0].reserved1 = reserved1 - - @property def kernel(self): return self._kernel @@ -23714,14 +23260,6 @@ cdef class CUgraphNodeParams_st: self._pvt_ptr[0].asBytes[i] = b - @property - def reserved2(self): - return self._pvt_ptr[0].reserved2 - @reserved2.setter - def reserved2(self, long long reserved2): - self._pvt_ptr[0].reserved2 = reserved2 - - cdef class CUcheckpointLockArgs_st: """ CUDA checkpoint optional lock arguments @@ -23734,14 +23272,6 @@ cdef class CUcheckpointLockArgs_st: no timeout - reserved0 : unsigned int - Reserved for future use, must be zero - - - reserved1 : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -23767,18 +23297,6 @@ cdef class CUcheckpointLockArgs_st: except ValueError: str_list += ['timeoutMs : '] - - try: - str_list += ['reserved0 : ' + str(self.reserved0)] - except ValueError: - str_list += ['reserved0 : '] - - - try: - str_list += ['reserved1 : ' + str(self.reserved1)] - except ValueError: - str_list += ['reserved1 : '] - return '\n'.join(str_list) else: return '' @@ -23791,34 +23309,10 @@ cdef class CUcheckpointLockArgs_st: self._pvt_ptr[0].timeoutMs = timeoutMs - @property - def reserved0(self): - return self._pvt_ptr[0].reserved0 - @reserved0.setter - def reserved0(self, unsigned int reserved0): - self._pvt_ptr[0].reserved0 = reserved0 - - - @property - def reserved1(self): - return [cuuint64_t(init_value=_reserved1) for _reserved1 in self._pvt_ptr[0].reserved1] - @reserved1.setter - def reserved1(self, reserved1): - self._pvt_ptr[0].reserved1 = reserved1 - - - cdef class CUcheckpointCheckpointArgs_st: """ CUDA checkpoint optional checkpoint arguments - Attributes - ---------- - - reserved : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -23839,24 +23333,10 @@ cdef class CUcheckpointCheckpointArgs_st: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return [cuuint64_t(init_value=_reserved) for _reserved in self._pvt_ptr[0].reserved] - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - - cdef class CUcheckpointGpuPair_st: """ CUDA checkpoint GPU UUID pairs for device remapping during restore @@ -23945,14 +23425,6 @@ cdef class CUcheckpointRestoreArgs_st: Number of gpu pairs to remap - reserved : bytes - Reserved for future use, must be zeroed - - - reserved : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -23989,12 +23461,6 @@ cdef class CUcheckpointRestoreArgs_st: except ValueError: str_list += ['gpuPairsCount : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -24005,6 +23471,7 @@ cdef class CUcheckpointRestoreArgs_st: return [CUcheckpointGpuPair(_ptr=arr) for arr in arrs] @gpuPairs.setter def gpuPairs(self, val): + cdef cydriver.CUcheckpointGpuPair* _gpuPairs_new if len(val) == 0: free(self._gpuPairs) self._gpuPairs = NULL @@ -24012,14 +23479,22 @@ cdef class CUcheckpointRestoreArgs_st: self._pvt_ptr[0].gpuPairs = NULL else: if self._gpuPairs_length != len(val): - free(self._gpuPairs) - self._gpuPairs = calloc(len(val), sizeof(cydriver.CUcheckpointGpuPair)) - if self._gpuPairs is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _gpuPairs_new = calloc(len(val), sizeof(cydriver.CUcheckpointGpuPair)) + if _gpuPairs_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUcheckpointGpuPair))) + for idx in range(len(val)): + string.memcpy(&_gpuPairs_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUcheckpointGpuPair)) + free(self._gpuPairs) + self._gpuPairs = _gpuPairs_new self._gpuPairs_length = len(val) - self._pvt_ptr[0].gpuPairs = self._gpuPairs - for idx in range(len(val)): - string.memcpy(&self._gpuPairs[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUcheckpointGpuPair)) + self._pvt_ptr[0].gpuPairs = _gpuPairs_new + else: + for idx in range(len(val)): + string.memcpy(&self._gpuPairs[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUcheckpointGpuPair)) @@ -24031,45 +23506,10 @@ cdef class CUcheckpointRestoreArgs_st: self._pvt_ptr[0].gpuPairsCount = gpuPairsCount - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, {{struct_field_array_lengths['CUcheckpointRestoreArgs_st.reserved']}}) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != {{struct_field_array_lengths['CUcheckpointRestoreArgs_st.reserved']}}: - raise ValueError("reserved length must be {{struct_field_array_lengths['CUcheckpointRestoreArgs_st.reserved']}}, is " + str(len(reserved))) - if CHAR_MIN == 0: - for i, b in enumerate(reserved): - if b < 0 and b > -129: - b = b + 256 - self._pvt_ptr[0].reserved[i] = b - else: - for i, b in enumerate(reserved): - if b > 127 and b < 256: - b = b - 256 - self._pvt_ptr[0].reserved[i] = b - - - @property - def reserved(self): - return [cuuint64_t(init_value=_reserved) for _reserved in self._pvt_ptr[0].reserved] - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - - cdef class CUcheckpointUnlockArgs_st: """ CUDA checkpoint optional unlock arguments - Attributes - ---------- - - reserved : list[cuuint64_t] - Reserved for future use, must be zeroed - - Methods ------- getPtr() @@ -24090,24 +23530,10 @@ cdef class CUcheckpointUnlockArgs_st: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return [cuuint64_t(init_value=_reserved) for _reserved in self._pvt_ptr[0].reserved] - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - - cdef class CUmemDecompressParams_st: """ Structure describing the parameters that compose a single @@ -24149,10 +23575,6 @@ cdef class CUmemDecompressParams_st: The decompression algorithm to use. - padding : bytes - - - Methods ------- getPtr() @@ -24208,12 +23630,6 @@ cdef class CUmemDecompressParams_st: except ValueError: str_list += ['algo : '] - - try: - str_list += ['padding : ' + str(self.padding)] - except ValueError: - str_list += ['padding : '] - return '\n'.join(str_list) else: return '' @@ -24265,17 +23681,6 @@ cdef class CUmemDecompressParams_st: self._pvt_ptr[0].algo = int(algo) - @property - def padding(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].padding, 20) - @padding.setter - def padding(self, padding): - if len(padding) != 20: - raise ValueError("padding length must be 20, is " + str(len(padding))) - for i, b in enumerate(padding): - self._pvt_ptr[0].padding[i] = b - - cdef class CUlogicalEndpointFabricHandle_st: """ Fabric handle for a logical endpoint @@ -24777,13 +24182,6 @@ cdef class CUdevWorkqueueConfigResource_st: cdef class CUdevWorkqueueResource_st: """ - Attributes - ---------- - - reserved : bytes - Reserved for future use - - Methods ------- getPtr() @@ -24804,26 +24202,10 @@ cdef class CUdevWorkqueueResource_st: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 40) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 40: - raise ValueError("reserved length must be 40, is " + str(len(reserved))) - for i, b in enumerate(reserved): - self._pvt_ptr[0].reserved[i] = b - - cdef class CU_DEV_SM_RESOURCE_GROUP_PARAMS_st: """ Attributes @@ -24848,10 +24230,6 @@ cdef class CU_DEV_SM_RESOURCE_GROUP_PARAMS_st: CUdevSmResourceGroup_flags. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -24895,12 +24273,6 @@ cdef class CU_DEV_SM_RESOURCE_GROUP_PARAMS_st: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -24937,14 +24309,6 @@ cdef class CU_DEV_SM_RESOURCE_GROUP_PARAMS_st: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class CUdevResource_st: """ Attributes @@ -25121,6 +24485,7 @@ cdef class CUdevResource_st: return [CUdevResource_st(_ptr=arr) for arr in arrs] @nextResource.setter def nextResource(self, val): + cdef cydriver.CUdevResource_st* _nextResource_new if len(val) == 0: free(self._nextResource) self._nextResource = NULL @@ -25128,14 +24493,22 @@ cdef class CUdevResource_st: self._pvt_ptr[0].nextResource = NULL else: if self._nextResource_length != len(val): - free(self._nextResource) - self._nextResource = calloc(len(val), sizeof(cydriver.CUdevResource_st)) - if self._nextResource is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _nextResource_new = calloc(len(val), sizeof(cydriver.CUdevResource_st)) + if _nextResource_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cydriver.CUdevResource_st))) + for idx in range(len(val)): + string.memcpy(&_nextResource_new[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUdevResource_st)) + free(self._nextResource) + self._nextResource = _nextResource_new self._nextResource_length = len(val) - self._pvt_ptr[0].nextResource = self._nextResource - for idx in range(len(val)): - string.memcpy(&self._nextResource[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUdevResource_st)) + self._pvt_ptr[0].nextResource = _nextResource_new + else: + for idx in range(len(val)): + string.memcpy(&self._nextResource[idx], (val[idx])._pvt_ptr, sizeof(cydriver.CUdevResource_st)) @@ -35463,7 +34836,7 @@ def cuMemSetAccess(ptr, size_t size, desc : Optional[tuple[CUmemAccessDesc] | li See Also -------- - :py:obj:`~.cuMemSetAccess`, :py:obj:`~.cuMemCreate`, :py:obj:`~.py`:obj:`~.cuMemMap` + :py:obj:`~.cuMemSetAccess`, :py:obj:`~.cuMemCreate`, :py:obj:`~.cuMemMap` """ desc = [] if desc is None else desc if not all(isinstance(_x, (CUmemAccessDesc,)) for _x in desc): @@ -36718,11 +36091,11 @@ def cuMulticastCreate(prop : Optional[CUmulticastObjectProp]): :py:obj:`~.cuMulticastBindAddr`, or :py:obj:`~.cuMulticastBindAddr_v2`. and can be unbound via :py:obj:`~.cuMulticastUnbind`. The total amount of memory that can be bound per device is specified by - :py:obj:`~.py`:obj:`~.CUmulticastObjectProp.size`. This size must be a - multiple of the value returned by :py:obj:`~.cuMulticastGetGranularity` - with the flag :py:obj:`~.CU_MULTICAST_GRANULARITY_MINIMUM`. For best - performance however, the size should be aligned to the value returned - by :py:obj:`~.cuMulticastGetGranularity` with the flag + :py:obj:`~.CUmulticastObjectProp.size`. This size must be a multiple of + the value returned by :py:obj:`~.cuMulticastGetGranularity` with the + flag :py:obj:`~.CU_MULTICAST_GRANULARITY_MINIMUM`. For best performance + however, the size should be aligned to the value returned by + :py:obj:`~.cuMulticastGetGranularity` with the flag :py:obj:`~.CU_MULTICAST_GRANULARITY_RECOMMENDED`. After all participating devices have been added, multicast objects can @@ -38081,13 +37454,12 @@ def cuPointerGetAttribute(attribute not None : CUpointer_attribute, ptr): :py:obj:`~.CUDA_POINTER_ATTRIBUTE_P2P_TOKENS`. - `ptr` must be a pointer to memory obtained from - :py:obj:`~.py`:obj:`~.cuMemAlloc()`. Note that p2pToken and - vaSpaceToken are only valid for the lifetime of the source - allocation. A subsequent allocation at the same address may return - completely different tokens. Querying this attribute has a side - effect of setting the attribute - :py:obj:`~.CU_POINTER_ATTRIBUTE_SYNC_MEMOPS` for the region of memory - that `ptr` points to. + :py:obj:`~.cuMemAlloc()`. Note that p2pToken and vaSpaceToken are + only valid for the lifetime of the source allocation. A subsequent + allocation at the same address may return completely different + tokens. Querying this attribute has a side effect of setting the + attribute :py:obj:`~.CU_POINTER_ATTRIBUTE_SYNC_MEMOPS` for the region + of memory that `ptr` points to. - :py:obj:`~.CU_POINTER_ATTRIBUTE_SYNC_MEMOPS`: diff --git a/cuda_bindings/cuda/bindings/nvfatbin.pyx b/cuda_bindings/cuda/bindings/nvfatbin.pyx index 309d2d751df..8b54e75e0f0 100644 --- a/cuda_bindings/cuda/bindings/nvfatbin.pyx +++ b/cuda_bindings/cuda/bindings/nvfatbin.pyx @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.4.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=22dd0937e8e243f48b06a24f0c1819e09360d102541b621dfe1cdeaa55c2154c +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=2be5849c140c1ab6fc0408c1df7e885b2edb2a952aef35fd1c62f7ad5ce7fcb7 # <<<< PREAMBLE CONTENT >>>> @@ -117,7 +117,8 @@ cpdef intptr_t create(options, size_t options_count) except -1: """nvFatbinCreate creates a new handle. Args: - options (object): An array of strings, each containing a single option. It can be: + options (object): An array of strings, each containing a + single option. It can be: - an :class:`int` as the pointer address to the nested sequence, or - a Python sequence of :class:`int`\s, each of which is a pointer address @@ -147,8 +148,10 @@ cpdef add_ptx(intptr_t handle, code, size_t size, arch, identifier, options_cmd_ handle (intptr_t): nvFatbin handle. code (bytes): The PTX code. size (size_t): The size of the PTX code. - arch (str): The numerical architecture that this PTX is for (the XX of any sm_XX, lto_XX, or compute_XX). - identifier (str): Name of the PTX, useful when extracting the fatbin with tools like cuobjdump. + arch (str): The numerical architecture that this PTX is for + (the XX of any sm_XX, lto_XX, or compute_XX). + identifier (str): Name of the PTX, useful when extracting the + fatbin with tools like cuobjdump. options_cmd_line (str): Options used during JIT compilation. .. seealso:: `nvFatbinAddPTX` @@ -178,8 +181,10 @@ cpdef add_cubin(intptr_t handle, code, size_t size, arch, identifier): handle (intptr_t): nvFatbin handle. code (bytes): The cubin. size (size_t): The size of the cubin. - arch (str): The numerical architecture that this cubin is for (the XX of any sm_XX, lto_XX, or compute_XX). - identifier (str): Name of the cubin, useful when extracting the fatbin with tools like cuobjdump. + arch (str): The numerical architecture that this cubin is for + (the XX of any sm_XX, lto_XX, or compute_XX). + identifier (str): Name of the cubin, useful when extracting + the fatbin with tools like cuobjdump. .. seealso:: `nvFatbinAddCubin` """ @@ -204,8 +209,10 @@ cpdef add_ltoir(intptr_t handle, code, size_t size, arch, identifier, options_cm handle (intptr_t): nvFatbin handle. code (bytes): The LTOIR code. size (size_t): The size of the LTOIR code. - arch (str): The numerical architecture that this LTOIR is for (the XX of any sm_XX, lto_XX, or compute_XX). - identifier (str): Name of the LTOIR, useful when extracting the fatbin with tools like cuobjdump. + arch (str): The numerical architecture that this LTOIR is for + (the XX of any sm_XX, lto_XX, or compute_XX). + identifier (str): Name of the LTOIR, useful when extracting + the fatbin with tools like cuobjdump. options_cmd_line (str): Options used during JIT compilation. .. seealso:: `nvFatbinAddLTOIR` @@ -314,7 +321,8 @@ cpdef add_tile_ir(intptr_t handle, code, size_t size, identifier, options_cmd_li handle (intptr_t): nvFatbin handle. code (bytes): The Tile IR. size (size_t): The size of the Tile IR. - identifier (str): Name of the Tile IR, useful when extracting the fatbin with tools like cuobjdump. + identifier (str): Name of the Tile IR, useful when extracting + the fatbin with tools like cuobjdump. options_cmd_line (str): Options used during JIT compilation. .. seealso:: `nvFatbinAddTileIR` diff --git a/cuda_bindings/cuda/bindings/nvjitlink.pyx b/cuda_bindings/cuda/bindings/nvjitlink.pyx index eee6cc33923..866a8a4213d 100644 --- a/cuda_bindings/cuda/bindings/nvjitlink.pyx +++ b/cuda_bindings/cuda/bindings/nvjitlink.pyx @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.0.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=85275f1596953f034c156776f8fe4f6e518dbb89ffedda994d8e78bfd9284246 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=73b6eb59cbe4fda520d37939d18d4625eb3818e37689796be45025a8aa877473 # <<<< PREAMBLE CONTENT >>>> @@ -117,7 +117,8 @@ cpdef intptr_t create(uint32_t num_options, options) except -1: Args: num_options (uint32_t): Number of options passed. - options (object): Array of size ``num_options`` of option strings. It can be: + options (object): Array of size ``num_options`` of option + strings. It can be: - an :class:`int` as the pointer address to the nested sequence, or - a Python sequence of :class:`int`\s, each of which is a pointer address diff --git a/cuda_bindings/cuda/bindings/nvml.pxd b/cuda_bindings/cuda/bindings/nvml.pxd index acc9900f069..f1ea7a144bc 100644 --- a/cuda_bindings/cuda/bindings/nvml.pxd +++ b/cuda_bindings/cuda/bindings/nvml.pxd @@ -4,7 +4,7 @@ # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=eb901f46ca6b6930935726541c32b3ea04f7f46b6090c4c2ad9cb62386c2028b +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=e1a348c4ffb12f72492093f32df3f186c11630337d891a567e92c266ecb80e88 from libc.stdint cimport intptr_t from .cynvml cimport * @@ -53,14 +53,10 @@ ctypedef nvmlMask255_t Mask255 ctypedef nvmlHostname_v1_t Hostname_v1 ctypedef nvmlUnrepairableMemoryStatus_v1_t UnrepairableMemoryStatus_v1 ctypedef nvmlRusdSettings_v1_t RusdSettings_v1 -ctypedef nvmlBBXTimeData_v1_t BBXTimeData_v1 -ctypedef nvmlRemappedRowsInfo_v2_t RemappedRowsInfo_v2 -ctypedef nvmlAccountingStats_v2_t AccountingStats_v2 ctypedef nvmlPowerValue_v2_t PowerValue_v2 ctypedef nvmlVgpuTypeMaxInstance_v1_t VgpuTypeMaxInstance_v1 ctypedef nvmlVgpuProcessUtilizationSample_t VgpuProcessUtilizationSample ctypedef nvmlGpuFabricInfo_t GpuFabricInfo -ctypedef nvmlCPERCursor_v1_t CPERCursor_v1 ctypedef nvmlSystemEventSetCreateRequest_v1_t SystemEventSetCreateRequest_v1 ctypedef nvmlSystemEventSetFreeRequest_v1_t SystemEventSetFreeRequest_v1 ctypedef nvmlSystemRegisterEventRequest_v1_t SystemRegisterEventRequest_v1 @@ -72,7 +68,6 @@ ctypedef nvmlWorkloadPowerProfileCurrentProfiles_v1_t WorkloadPowerProfileCurren ctypedef nvmlWorkloadPowerProfileRequestedProfiles_v1_t WorkloadPowerProfileRequestedProfiles_v1 ctypedef nvmlWorkloadPowerProfileUpdateProfiles_v1_t WorkloadPowerProfileUpdateProfiles_v1 ctypedef nvmlPRMTLV_v1_t PRMTLV_v1 -ctypedef nvmlGetCPER_v1_t GetCPER_v1 ctypedef nvmlVgpuSchedulerSetState_t VgpuSchedulerSetState ctypedef nvmlGpmMetricsGet_t GpmMetricsGet ctypedef nvmlPRMCounterList_v1_t PRMCounterList_v1 @@ -432,3 +427,7 @@ cpdef object device_get_vgpu_scheduler_log_v2(intptr_t device) cpdef object gpu_instance_get_vgpu_scheduler_log_v2(intptr_t gpu_instance) cpdef device_set_vgpu_scheduler_state_v2(intptr_t device, intptr_t p_scheduler_state) cpdef gpu_instance_set_vgpu_scheduler_state_v2(intptr_t gpu_instance, intptr_t p_scheduler_state) +cpdef object system_get_cper_v1() +cpdef object device_get_bbx_time_data_v1(intptr_t device) +cpdef object device_get_accounting_stats_v2(intptr_t device) +cpdef object device_get_remapped_rows_v2(intptr_t device) diff --git a/cuda_bindings/cuda/bindings/nvml.pyx b/cuda_bindings/cuda/bindings/nvml.pyx index a51d4264363..f1a8e70c7dc 100644 --- a/cuda_bindings/cuda/bindings/nvml.pyx +++ b/cuda_bindings/cuda/bindings/nvml.pyx @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.9.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=e47a16bd9956de14a991ded5d1aef667cdd26a141e27db5b2015b91be6918d3c +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=fa68fb618fdd8ebcac22c2bf0cee505ebcdacbc51c0ce60bd703b69a34a880cb # <<<< PREAMBLE CONTENT >>>> @@ -840,7 +840,7 @@ class GpmMetricId(_cyb_FastEnum): GPM_METRIC_HMMA_TENSOR_UTIL = (NVML_GPM_METRIC_HMMA_TENSOR_UTIL, "Percentage of time the GPU's SMs were doing HMMA tensor operations. 0.0 - 100.0.") GPM_METRIC_DMMA_TENSOR_UTIL = (NVML_GPM_METRIC_DMMA_TENSOR_UTIL, "Percentage of time the GPU's SMs were doing DMMA tensor operations. 0.0 - 100.0.") GPM_METRIC_IMMA_TENSOR_UTIL = (NVML_GPM_METRIC_IMMA_TENSOR_UTIL, "Percentage of time the GPU's SMs were doing IMMA tensor operations. 0.0 - 100.0.") - GPM_METRIC_DRAM_BW_UTIL = (NVML_GPM_METRIC_DRAM_BW_UTIL, 'Percentage of DRAM bw used vs theoretical maximum. 0.0 - 100.0 *\u200d/.') + GPM_METRIC_DRAM_BW_UTIL = (NVML_GPM_METRIC_DRAM_BW_UTIL, 'Percentage of DRAM bw used vs theoretical maximum. `0.0 - 100.0 */`.') GPM_METRIC_FP64_UTIL = (NVML_GPM_METRIC_FP64_UTIL, "Percentage of time the GPU's SMs were doing non-tensor FP64 math. 0.0 - 100.0.") GPM_METRIC_FP32_UTIL = (NVML_GPM_METRIC_FP32_UTIL, "Percentage of time the GPU's SMs were doing non-tensor FP32 math. 0.0 - 100.0.") GPM_METRIC_FP16_UTIL = (NVML_GPM_METRIC_FP16_UTIL, "Percentage of time the GPU's SMs were doing non-tensor FP16 math. 0.0 - 100.0.") @@ -1607,7 +1607,7 @@ class FieldId(_FastEnum): PWR_SMOOTHING_ADMIN_OVERRIDE_PRIMARY_FLOOR_TAR_WIN_MULT = (287, "Current primary floor target window multiplier value for admin override") PWR_SMOOTHING_ADMIN_OVERRIDE_PRIMARY_FLOOR_ACT_OFFSET = (288, "Current primary floor activation offset value in Watts for admin override") - MAX = 289 + NVLINK_MAX_LINKS = 18 @@ -3263,6 +3263,7 @@ cdef class ProcessInfo: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=process_info_dtype) @@ -3392,13 +3393,15 @@ cdef class ProcessInfo: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an ProcessInfo instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -3408,6 +3411,7 @@ cdef class ProcessInfo: ptr, sizeof(nvmlProcessInfo_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=process_info_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -3441,6 +3445,7 @@ cdef class ProcessDetail_v1: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=process_detail_v1_dtype) @@ -3581,13 +3586,15 @@ cdef class ProcessDetail_v1: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an ProcessDetail_v1 instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -3597,6 +3604,7 @@ cdef class ProcessDetail_v1: ptr, sizeof(nvmlProcessDetail_v1_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=process_detail_v1_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -4164,6 +4172,7 @@ cdef class BridgeChipInfo: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=bridge_chip_info_dtype) @@ -4271,13 +4280,15 @@ cdef class BridgeChipInfo: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an BridgeChipInfo instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -4287,22 +4298,29 @@ cdef class BridgeChipInfo: ptr, sizeof(nvmlBridgeChipInfo_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=bridge_chip_info_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj -value_dtype = _numpy.dtype(( - _numpy.dtype((_numpy.void, sizeof(nvmlValue_t))), - { - "d_val": (_numpy.float64, 0), - "si_val": (_numpy.int32, 0), - "ui_val": (_numpy.uint32, 0), - "ul_val": (_numpy.uint32, 0), - "ull_val": (_numpy.uint64, 0), - "sll_val": (_numpy.int64, 0), - "us_val": (_numpy.uint16, 0), - } - )) +cdef _get_value_dtype_offsets(): + cdef nvmlValue_t pod + return _numpy.dtype({ + 'names': ['d_val', 'si_val', 'ui_val', 'ul_val', 'ull_val', 'sll_val', 'us_val'], + 'formats': [_numpy.float64, _numpy.int32, _numpy.uint32, _numpy.uint32, _numpy.uint64, _numpy.int64, _numpy.uint16], + 'offsets': [ + (&(pod.dVal)) - (&pod), + (&(pod.siVal)) - (&pod), + (&(pod.uiVal)) - (&pod), + (&(pod.ulVal)) - (&pod), + (&(pod.ullVal)) - (&pod), + (&(pod.sllVal)) - (&pod), + (&(pod.usVal)) - (&pod), + ], + 'itemsize': sizeof(nvmlValue_t), + }) + +value_dtype = _get_value_dtype_offsets() cdef class Value: """Empty-initialize an instance of `nvmlValue_t`. @@ -4506,164 +4524,178 @@ cdef _get__py_anon_pod0_dtype_offsets(): _py_anon_pod0_dtype = _get__py_anon_pod0_dtype_offsets() cdef class _py_anon_pod0: - """Empty-initialize an instance of `cuda_bindings_nvml__anon_pod0`. + """Empty-initialize an array of `cuda_bindings_nvml__anon_pod0`. + The resulting object is of length `size` and of dtype `_py_anon_pod0_dtype`. + If default-constructed, the instance represents a single struct. + Args: + size (int): number of structs, default=1. .. seealso:: `cuda_bindings_nvml__anon_pod0` """ cdef: - cuda_bindings_nvml__anon_pod0 *_ptr + readonly object _data object _owner - bint _owned - bint _readonly - - def __init__(self): - self._ptr = _cyb_calloc(1, sizeof(cuda_bindings_nvml__anon_pod0)) - if self._ptr == NULL: - raise MemoryError("Error allocating _py_anon_pod0") - self._owner = None - self._owned = True - self._readonly = False - def __dealloc__(self): - cdef cuda_bindings_nvml__anon_pod0 *ptr - if self._owned and self._ptr != NULL: - ptr = self._ptr - self._ptr = NULL - _cyb_free(ptr) + def __init__(self, size=1): + arr = _numpy.empty(size, dtype=_py_anon_pod0_dtype) + self._data = arr.view(_numpy.recarray) + assert self._data.itemsize == sizeof(cuda_bindings_nvml__anon_pod0), \ + f"itemsize {self._data.itemsize} mismatches struct size { sizeof(cuda_bindings_nvml__anon_pod0) }" def __repr__(self): - return f"<{__name__}._py_anon_pod0 object at {hex(id(self))}>" + if self._data.size > 1: + return f"<{__name__}._py_anon_pod0_Array_{self._data.size} object at {hex(id(self))}>" + else: + return f"<{__name__}._py_anon_pod0 object at {hex(id(self))}>" @property def ptr(self): """Get the pointer address to the data as Python :class:`int`.""" - return (self._ptr) + return self._data.ctypes.data cdef intptr_t _get_ptr(self): - return (self._ptr) + return self._data.ctypes.data def __int__(self): - return (self._ptr) + if self._data.size > 1: + raise TypeError("int() argument must be a bytes-like object of size 1. " + "To get the pointer address of an array, use .ptr") + return self._data.ctypes.data + + def __len__(self): + return self._data.size def __eq__(self, other): - cdef _py_anon_pod0 other_ - if not isinstance(other, _py_anon_pod0): + cdef object self_data = self._data + if (not isinstance(other, _py_anon_pod0)) or self_data.size != other._data.size or self_data.dtype != other._data.dtype: return False - other_ = other - return (_cyb_memcmp((self._ptr), (other_._ptr), sizeof(cuda_bindings_nvml__anon_pod0)) == 0) + return bool((self_data == other._data).all()) - def __getbuffer__(self, _cyb_cpython.Py_buffer *buffer, int flags): - _cyb___getbuffer(self, buffer, self._ptr, sizeof(cuda_bindings_nvml__anon_pod0), self._readonly) + def __getbuffer__(self, Py_buffer *buffer, int flags): + _cyb_cpython.PyObject_GetBuffer(self._data, buffer, flags) def __releasebuffer__(self, Py_buffer *buffer): - pass - - def __setitem__(self, key, val): - if key == 0 and isinstance(val, _numpy.ndarray): - self._ptr = _cyb_malloc(sizeof(cuda_bindings_nvml__anon_pod0)) - if self._ptr == NULL: - raise MemoryError("Error allocating _py_anon_pod0") - _cyb_memcpy(self._ptr, val.ctypes.data, sizeof(cuda_bindings_nvml__anon_pod0)) - self._owner = None - self._owned = True - self._readonly = not val.flags.writeable - else: - setattr(self, key, val) + _cyb_cpython.PyBuffer_Release(buffer) @property def controller(self): - """int: """ - return (self._ptr[0].controller) + """Union[~_numpy.int32, int]: """ + if self._data.size == 1: + return int(self._data.controller[0]) + return self._data.controller @controller.setter def controller(self, val): - if self._readonly: - raise ValueError("This _py_anon_pod0 instance is read-only") - self._ptr[0].controller = val + self._data.controller = val @property def default_min_temp(self): - """int: """ - return self._ptr[0].defaultMinTemp + """Union[~_numpy.int32, int]: """ + if self._data.size == 1: + return int(self._data.default_min_temp[0]) + return self._data.default_min_temp @default_min_temp.setter def default_min_temp(self, val): - if self._readonly: - raise ValueError("This _py_anon_pod0 instance is read-only") - self._ptr[0].defaultMinTemp = val + self._data.default_min_temp = val @property def default_max_temp(self): - """int: """ - return self._ptr[0].defaultMaxTemp + """Union[~_numpy.int32, int]: """ + if self._data.size == 1: + return int(self._data.default_max_temp[0]) + return self._data.default_max_temp @default_max_temp.setter def default_max_temp(self, val): - if self._readonly: - raise ValueError("This _py_anon_pod0 instance is read-only") - self._ptr[0].defaultMaxTemp = val + self._data.default_max_temp = val @property def current_temp(self): - """int: """ - return self._ptr[0].currentTemp + """Union[~_numpy.int32, int]: """ + if self._data.size == 1: + return int(self._data.current_temp[0]) + return self._data.current_temp @current_temp.setter def current_temp(self, val): - if self._readonly: - raise ValueError("This _py_anon_pod0 instance is read-only") - self._ptr[0].currentTemp = val + self._data.current_temp = val @property def target(self): - """int: """ - return (self._ptr[0].target) + """Union[~_numpy.int32, int]: """ + if self._data.size == 1: + return int(self._data.target[0]) + return self._data.target @target.setter def target(self, val): - if self._readonly: - raise ValueError("This _py_anon_pod0 instance is read-only") - self._ptr[0].target = val + self._data.target = val + + def __getitem__(self, key): + cdef ssize_t key_ + cdef ssize_t size + if isinstance(key, int): + key_ = key + size = self._data.size + if key_ >= size or key_ <= -(size+1): + raise IndexError("index is out of bounds") + if key_ < 0: + key_ += size + return _py_anon_pod0.from_data(self._data[key_:key_+1]) + out = self._data[key] + if isinstance(out, _numpy.recarray) and out.dtype == _py_anon_pod0_dtype: + return _py_anon_pod0.from_data(out) + return out + + def __setitem__(self, key, val): + self._data[key] = val @staticmethod def from_buffer(buffer): """Create an _py_anon_pod0 instance with the memory from the given buffer.""" - return _cyb_from_buffer(buffer, sizeof(cuda_bindings_nvml__anon_pod0), _py_anon_pod0) + return _py_anon_pod0.from_data(_numpy.frombuffer(buffer, dtype=_py_anon_pod0_dtype)) @staticmethod def from_data(data): """Create an _py_anon_pod0 instance wrapping the given NumPy array. Args: - data (_numpy.ndarray): a single-element array of dtype `_py_anon_pod0_dtype` holding the data. + data (_numpy.ndarray): a 1D array of dtype `_py_anon_pod0_dtype` holding the data. """ - return _cyb_from_data(data, "_py_anon_pod0_dtype", _py_anon_pod0_dtype, _py_anon_pod0) + cdef _py_anon_pod0 obj = _py_anon_pod0.__new__(_py_anon_pod0) + if not isinstance(data, _numpy.ndarray): + raise TypeError("data argument must be a NumPy ndarray") + if data.ndim != 1: + raise ValueError("data array must be 1D") + if data.dtype != _py_anon_pod0_dtype: + raise ValueError("data array must be of dtype _py_anon_pod0_dtype") + obj._data = data.view(_numpy.recarray) + + return obj @staticmethod - def from_ptr(intptr_t ptr, bint readonly=False, object owner=None): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an _py_anon_pod0 instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. - owner (object): The Python object that owns the pointer. If not provided, data will be copied. + size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") cdef _py_anon_pod0 obj = _py_anon_pod0.__new__(_py_anon_pod0) - if owner is None: - obj._ptr = _cyb_malloc(sizeof(cuda_bindings_nvml__anon_pod0)) - if obj._ptr == NULL: - raise MemoryError("Error allocating _py_anon_pod0") - _cyb_memcpy((obj._ptr), ptr, sizeof(cuda_bindings_nvml__anon_pod0)) - obj._owner = None - obj._owned = True - else: - obj._ptr = ptr - obj._owner = owner - obj._owned = False - obj._readonly = readonly + cdef flag = _cyb_cpython_buffer.PyBUF_READ if readonly else _cyb_cpython_buffer.PyBUF_WRITE + cdef object buf = _cyb_cpython_memoryview.PyMemoryView_FromMemory( + ptr, sizeof(cuda_bindings_nvml__anon_pod0) * size, flag) + data = _numpy.ndarray(size, buffer=buf, dtype=_py_anon_pod0_dtype) + obj._data = data.view(_numpy.recarray) + obj._owner = owner + return obj @@ -4860,6 +4892,7 @@ cdef class ClkMonFaultInfo: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=clk_mon_fault_info_dtype) @@ -4967,13 +5000,15 @@ cdef class ClkMonFaultInfo: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an ClkMonFaultInfo instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -4983,6 +5018,7 @@ cdef class ClkMonFaultInfo: ptr, sizeof(nvmlClkMonFaultInfo_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=clk_mon_fault_info_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -5208,6 +5244,7 @@ cdef class ProcessUtilizationSample: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=process_utilization_sample_dtype) @@ -5359,13 +5396,15 @@ cdef class ProcessUtilizationSample: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an ProcessUtilizationSample instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -5375,6 +5414,7 @@ cdef class ProcessUtilizationSample: ptr, sizeof(nvmlProcessUtilizationSample_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=process_utilization_sample_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -5411,6 +5451,7 @@ cdef class ProcessUtilizationInfo_v1: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=process_utilization_info_v1_dtype) @@ -5584,13 +5625,15 @@ cdef class ProcessUtilizationInfo_v1: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an ProcessUtilizationInfo_v1 instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -5600,6 +5643,7 @@ cdef class ProcessUtilizationInfo_v1: ptr, sizeof(nvmlProcessUtilizationInfo_v1_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=process_utilization_info_v1_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -6350,153 +6394,167 @@ cdef _get__py_anon_pod1_dtype_offsets(): _py_anon_pod1_dtype = _get__py_anon_pod1_dtype_offsets() cdef class _py_anon_pod1: - """Empty-initialize an instance of `cuda_bindings_nvml__anon_pod1`. + """Empty-initialize an array of `cuda_bindings_nvml__anon_pod1`. + The resulting object is of length `size` and of dtype `_py_anon_pod1_dtype`. + If default-constructed, the instance represents a single struct. + Args: + size (int): number of structs, default=1. .. seealso:: `cuda_bindings_nvml__anon_pod1` """ cdef: - cuda_bindings_nvml__anon_pod1 *_ptr + readonly object _data object _owner - bint _owned - bint _readonly - def __init__(self): - self._ptr = _cyb_calloc(1, sizeof(cuda_bindings_nvml__anon_pod1)) - if self._ptr == NULL: - raise MemoryError("Error allocating _py_anon_pod1") - self._owner = None - self._owned = True - self._readonly = False - - def __dealloc__(self): - cdef cuda_bindings_nvml__anon_pod1 *ptr - if self._owned and self._ptr != NULL: - ptr = self._ptr - self._ptr = NULL - _cyb_free(ptr) + def __init__(self, size=1): + arr = _numpy.empty(size, dtype=_py_anon_pod1_dtype) + self._data = arr.view(_numpy.recarray) + assert self._data.itemsize == sizeof(cuda_bindings_nvml__anon_pod1), \ + f"itemsize {self._data.itemsize} mismatches struct size { sizeof(cuda_bindings_nvml__anon_pod1) }" def __repr__(self): - return f"<{__name__}._py_anon_pod1 object at {hex(id(self))}>" + if self._data.size > 1: + return f"<{__name__}._py_anon_pod1_Array_{self._data.size} object at {hex(id(self))}>" + else: + return f"<{__name__}._py_anon_pod1 object at {hex(id(self))}>" @property def ptr(self): """Get the pointer address to the data as Python :class:`int`.""" - return (self._ptr) + return self._data.ctypes.data cdef intptr_t _get_ptr(self): - return (self._ptr) + return self._data.ctypes.data def __int__(self): - return (self._ptr) + if self._data.size > 1: + raise TypeError("int() argument must be a bytes-like object of size 1. " + "To get the pointer address of an array, use .ptr") + return self._data.ctypes.data + + def __len__(self): + return self._data.size def __eq__(self, other): - cdef _py_anon_pod1 other_ - if not isinstance(other, _py_anon_pod1): + cdef object self_data = self._data + if (not isinstance(other, _py_anon_pod1)) or self_data.size != other._data.size or self_data.dtype != other._data.dtype: return False - other_ = other - return (_cyb_memcmp((self._ptr), (other_._ptr), sizeof(cuda_bindings_nvml__anon_pod1)) == 0) + return bool((self_data == other._data).all()) - def __getbuffer__(self, _cyb_cpython.Py_buffer *buffer, int flags): - _cyb___getbuffer(self, buffer, self._ptr, sizeof(cuda_bindings_nvml__anon_pod1), self._readonly) + def __getbuffer__(self, Py_buffer *buffer, int flags): + _cyb_cpython.PyObject_GetBuffer(self._data, buffer, flags) def __releasebuffer__(self, Py_buffer *buffer): - pass - - def __setitem__(self, key, val): - if key == 0 and isinstance(val, _numpy.ndarray): - self._ptr = _cyb_malloc(sizeof(cuda_bindings_nvml__anon_pod1)) - if self._ptr == NULL: - raise MemoryError("Error allocating _py_anon_pod1") - _cyb_memcpy(self._ptr, val.ctypes.data, sizeof(cuda_bindings_nvml__anon_pod1)) - self._owner = None - self._owned = True - self._readonly = not val.flags.writeable - else: - setattr(self, key, val) + _cyb_cpython.PyBuffer_Release(buffer) @property def b_is_present(self): - """int: """ - return self._ptr[0].bIsPresent + """Union[~_numpy.uint32, int]: """ + if self._data.size == 1: + return int(self._data.b_is_present[0]) + return self._data.b_is_present @b_is_present.setter def b_is_present(self, val): - if self._readonly: - raise ValueError("This _py_anon_pod1 instance is read-only") - self._ptr[0].bIsPresent = val + self._data.b_is_present = val @property def percentage(self): - """int: """ - return self._ptr[0].percentage + """Union[~_numpy.uint32, int]: """ + if self._data.size == 1: + return int(self._data.percentage[0]) + return self._data.percentage @percentage.setter def percentage(self, val): - if self._readonly: - raise ValueError("This _py_anon_pod1 instance is read-only") - self._ptr[0].percentage = val + self._data.percentage = val @property def inc_threshold(self): - """int: """ - return self._ptr[0].incThreshold + """Union[~_numpy.uint32, int]: """ + if self._data.size == 1: + return int(self._data.inc_threshold[0]) + return self._data.inc_threshold @inc_threshold.setter def inc_threshold(self, val): - if self._readonly: - raise ValueError("This _py_anon_pod1 instance is read-only") - self._ptr[0].incThreshold = val + self._data.inc_threshold = val @property def dec_threshold(self): - """int: """ - return self._ptr[0].decThreshold + """Union[~_numpy.uint32, int]: """ + if self._data.size == 1: + return int(self._data.dec_threshold[0]) + return self._data.dec_threshold @dec_threshold.setter def dec_threshold(self, val): - if self._readonly: - raise ValueError("This _py_anon_pod1 instance is read-only") - self._ptr[0].decThreshold = val + self._data.dec_threshold = val + + def __getitem__(self, key): + cdef ssize_t key_ + cdef ssize_t size + if isinstance(key, int): + key_ = key + size = self._data.size + if key_ >= size or key_ <= -(size+1): + raise IndexError("index is out of bounds") + if key_ < 0: + key_ += size + return _py_anon_pod1.from_data(self._data[key_:key_+1]) + out = self._data[key] + if isinstance(out, _numpy.recarray) and out.dtype == _py_anon_pod1_dtype: + return _py_anon_pod1.from_data(out) + return out + + def __setitem__(self, key, val): + self._data[key] = val @staticmethod def from_buffer(buffer): """Create an _py_anon_pod1 instance with the memory from the given buffer.""" - return _cyb_from_buffer(buffer, sizeof(cuda_bindings_nvml__anon_pod1), _py_anon_pod1) + return _py_anon_pod1.from_data(_numpy.frombuffer(buffer, dtype=_py_anon_pod1_dtype)) @staticmethod def from_data(data): """Create an _py_anon_pod1 instance wrapping the given NumPy array. Args: - data (_numpy.ndarray): a single-element array of dtype `_py_anon_pod1_dtype` holding the data. + data (_numpy.ndarray): a 1D array of dtype `_py_anon_pod1_dtype` holding the data. """ - return _cyb_from_data(data, "_py_anon_pod1_dtype", _py_anon_pod1_dtype, _py_anon_pod1) + cdef _py_anon_pod1 obj = _py_anon_pod1.__new__(_py_anon_pod1) + if not isinstance(data, _numpy.ndarray): + raise TypeError("data argument must be a NumPy ndarray") + if data.ndim != 1: + raise ValueError("data array must be 1D") + if data.dtype != _py_anon_pod1_dtype: + raise ValueError("data array must be of dtype _py_anon_pod1_dtype") + obj._data = data.view(_numpy.recarray) + + return obj @staticmethod - def from_ptr(intptr_t ptr, bint readonly=False, object owner=None): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an _py_anon_pod1 instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. - owner (object): The Python object that owns the pointer. If not provided, data will be copied. + size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") cdef _py_anon_pod1 obj = _py_anon_pod1.__new__(_py_anon_pod1) - if owner is None: - obj._ptr = _cyb_malloc(sizeof(cuda_bindings_nvml__anon_pod1)) - if obj._ptr == NULL: - raise MemoryError("Error allocating _py_anon_pod1") - _cyb_memcpy((obj._ptr), ptr, sizeof(cuda_bindings_nvml__anon_pod1)) - obj._owner = None - obj._owned = True - else: - obj._ptr = ptr - obj._owner = owner - obj._owned = False - obj._readonly = readonly + cdef flag = _cyb_cpython_buffer.PyBUF_READ if readonly else _cyb_cpython_buffer.PyBUF_WRITE + cdef object buf = _cyb_cpython_memoryview.PyMemoryView_FromMemory( + ptr, sizeof(cuda_bindings_nvml__anon_pod1) * size, flag) + data = _numpy.ndarray(size, buffer=buf, dtype=_py_anon_pod1_dtype) + obj._data = data.view(_numpy.recarray) + obj._owner = owner + return obj @@ -6856,6 +6914,7 @@ cdef class VgpuProcessUtilizationInfo_v1: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=vgpu_process_utilization_info_v1_dtype) @@ -7049,13 +7108,15 @@ cdef class VgpuProcessUtilizationInfo_v1: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an VgpuProcessUtilizationInfo_v1 instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -7065,6 +7126,7 @@ cdef class VgpuProcessUtilizationInfo_v1: ptr, sizeof(nvmlVgpuProcessUtilizationInfo_v1_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=vgpu_process_utilization_info_v1_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -7373,6 +7435,7 @@ cdef class VgpuSchedulerLogEntry: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=vgpu_scheduler_log_entry_dtype) @@ -7524,13 +7587,15 @@ cdef class VgpuSchedulerLogEntry: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an VgpuSchedulerLogEntry instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -7540,6 +7605,7 @@ cdef class VgpuSchedulerLogEntry: ptr, sizeof(nvmlVgpuSchedulerLogEntry_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=vgpu_scheduler_log_entry_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -8960,6 +9026,7 @@ cdef class HwbcEntry: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=hwbc_entry_dtype) @@ -9065,13 +9132,15 @@ cdef class HwbcEntry: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an HwbcEntry instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -9081,6 +9150,7 @@ cdef class HwbcEntry: ptr, sizeof(nvmlHwbcEntry_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=hwbc_entry_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -9612,6 +9682,7 @@ cdef class UnitFanInfo: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=unit_fan_info_dtype) @@ -9719,13 +9790,15 @@ cdef class UnitFanInfo: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an UnitFanInfo instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -9735,6 +9808,7 @@ cdef class UnitFanInfo: ptr, sizeof(nvmlUnitFanInfo_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=unit_fan_info_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -9944,6 +10018,7 @@ cdef class SystemEventData_v1: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=system_event_data_v1_dtype) @@ -10051,13 +10126,15 @@ cdef class SystemEventData_v1: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an SystemEventData_v1 instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -10067,6 +10144,7 @@ cdef class SystemEventData_v1: ptr, sizeof(nvmlSystemEventData_v1_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=system_event_data_v1_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -10295,6 +10373,7 @@ cdef class EncoderSessionInfo: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=encoder_session_info_dtype) @@ -10468,13 +10547,15 @@ cdef class EncoderSessionInfo: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an EncoderSessionInfo instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -10484,6 +10565,7 @@ cdef class EncoderSessionInfo: ptr, sizeof(nvmlEncoderSessionInfo_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=encoder_session_info_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -10679,6 +10761,7 @@ cdef class FBCSessionInfo: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=fbc_session_info_dtype) @@ -10896,13 +10979,15 @@ cdef class FBCSessionInfo: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an FBCSessionInfo instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -10912,6 +10997,7 @@ cdef class FBCSessionInfo: ptr, sizeof(nvmlFBCSessionInfo_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=fbc_session_info_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -13114,6 +13200,7 @@ cdef class GpuInstancePlacement: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=gpu_instance_placement_dtype) @@ -13221,13 +13308,15 @@ cdef class GpuInstancePlacement: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an GpuInstancePlacement instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -13237,6 +13326,7 @@ cdef class GpuInstancePlacement: ptr, sizeof(nvmlGpuInstancePlacement_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=gpu_instance_placement_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -13546,6 +13636,7 @@ cdef class ComputeInstancePlacement: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=compute_instance_placement_dtype) @@ -13653,13 +13744,15 @@ cdef class ComputeInstancePlacement: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an ComputeInstancePlacement instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -13669,6 +13762,7 @@ cdef class ComputeInstancePlacement: ptr, sizeof(nvmlComputeInstancePlacement_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=compute_instance_placement_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -14679,6 +14773,7 @@ cdef class EccSramUniqueUncorrectedErrorEntry_v1: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=ecc_sram_unique_uncorrected_error_entry_v1_dtype) @@ -14841,13 +14936,15 @@ cdef class EccSramUniqueUncorrectedErrorEntry_v1: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an EccSramUniqueUncorrectedErrorEntry_v1 instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -14857,6 +14954,7 @@ cdef class EccSramUniqueUncorrectedErrorEntry_v1: ptr, sizeof(nvmlEccSramUniqueUncorrectedErrorEntry_v1_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=ecc_sram_unique_uncorrected_error_entry_v1_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -15230,153 +15328,167 @@ cdef _get_nvlink_firmware_version_dtype_offsets(): nvlink_firmware_version_dtype = _get_nvlink_firmware_version_dtype_offsets() cdef class NvlinkFirmwareVersion: - """Empty-initialize an instance of `nvmlNvlinkFirmwareVersion_t`. + """Empty-initialize an array of `nvmlNvlinkFirmwareVersion_t`. + The resulting object is of length `size` and of dtype `nvlink_firmware_version_dtype`. + If default-constructed, the instance represents a single struct. + Args: + size (int): number of structs, default=1. .. seealso:: `nvmlNvlinkFirmwareVersion_t` """ cdef: - nvmlNvlinkFirmwareVersion_t *_ptr + readonly object _data object _owner - bint _owned - bint _readonly - - def __init__(self): - self._ptr = _cyb_calloc(1, sizeof(nvmlNvlinkFirmwareVersion_t)) - if self._ptr == NULL: - raise MemoryError("Error allocating NvlinkFirmwareVersion") - self._owner = None - self._owned = True - self._readonly = False - def __dealloc__(self): - cdef nvmlNvlinkFirmwareVersion_t *ptr - if self._owned and self._ptr != NULL: - ptr = self._ptr - self._ptr = NULL - _cyb_free(ptr) + def __init__(self, size=1): + arr = _numpy.empty(size, dtype=nvlink_firmware_version_dtype) + self._data = arr.view(_numpy.recarray) + assert self._data.itemsize == sizeof(nvmlNvlinkFirmwareVersion_t), \ + f"itemsize {self._data.itemsize} mismatches struct size { sizeof(nvmlNvlinkFirmwareVersion_t) }" def __repr__(self): - return f"<{__name__}.NvlinkFirmwareVersion object at {hex(id(self))}>" + if self._data.size > 1: + return f"<{__name__}.NvlinkFirmwareVersion_Array_{self._data.size} object at {hex(id(self))}>" + else: + return f"<{__name__}.NvlinkFirmwareVersion object at {hex(id(self))}>" @property def ptr(self): """Get the pointer address to the data as Python :class:`int`.""" - return (self._ptr) + return self._data.ctypes.data cdef intptr_t _get_ptr(self): - return (self._ptr) + return self._data.ctypes.data def __int__(self): - return (self._ptr) + if self._data.size > 1: + raise TypeError("int() argument must be a bytes-like object of size 1. " + "To get the pointer address of an array, use .ptr") + return self._data.ctypes.data + + def __len__(self): + return self._data.size def __eq__(self, other): - cdef NvlinkFirmwareVersion other_ - if not isinstance(other, NvlinkFirmwareVersion): + cdef object self_data = self._data + if (not isinstance(other, NvlinkFirmwareVersion)) or self_data.size != other._data.size or self_data.dtype != other._data.dtype: return False - other_ = other - return (_cyb_memcmp((self._ptr), (other_._ptr), sizeof(nvmlNvlinkFirmwareVersion_t)) == 0) + return bool((self_data == other._data).all()) - def __getbuffer__(self, _cyb_cpython.Py_buffer *buffer, int flags): - _cyb___getbuffer(self, buffer, self._ptr, sizeof(nvmlNvlinkFirmwareVersion_t), self._readonly) + def __getbuffer__(self, Py_buffer *buffer, int flags): + _cyb_cpython.PyObject_GetBuffer(self._data, buffer, flags) def __releasebuffer__(self, Py_buffer *buffer): - pass - - def __setitem__(self, key, val): - if key == 0 and isinstance(val, _numpy.ndarray): - self._ptr = _cyb_malloc(sizeof(nvmlNvlinkFirmwareVersion_t)) - if self._ptr == NULL: - raise MemoryError("Error allocating NvlinkFirmwareVersion") - _cyb_memcpy(self._ptr, val.ctypes.data, sizeof(nvmlNvlinkFirmwareVersion_t)) - self._owner = None - self._owned = True - self._readonly = not val.flags.writeable - else: - setattr(self, key, val) + _cyb_cpython.PyBuffer_Release(buffer) @property def ucode_type(self): - """int: """ - return self._ptr[0].ucodeType + """Union[~_numpy.uint8, int]: """ + if self._data.size == 1: + return int(self._data.ucode_type[0]) + return self._data.ucode_type @ucode_type.setter def ucode_type(self, val): - if self._readonly: - raise ValueError("This NvlinkFirmwareVersion instance is read-only") - self._ptr[0].ucodeType = val + self._data.ucode_type = val @property def major(self): - """int: """ - return self._ptr[0].major + """Union[~_numpy.uint32, int]: """ + if self._data.size == 1: + return int(self._data.major[0]) + return self._data.major @major.setter def major(self, val): - if self._readonly: - raise ValueError("This NvlinkFirmwareVersion instance is read-only") - self._ptr[0].major = val + self._data.major = val @property def minor(self): - """int: """ - return self._ptr[0].minor + """Union[~_numpy.uint32, int]: """ + if self._data.size == 1: + return int(self._data.minor[0]) + return self._data.minor @minor.setter def minor(self, val): - if self._readonly: - raise ValueError("This NvlinkFirmwareVersion instance is read-only") - self._ptr[0].minor = val + self._data.minor = val @property def sub_minor(self): - """int: """ - return self._ptr[0].subMinor + """Union[~_numpy.uint32, int]: """ + if self._data.size == 1: + return int(self._data.sub_minor[0]) + return self._data.sub_minor @sub_minor.setter def sub_minor(self, val): - if self._readonly: - raise ValueError("This NvlinkFirmwareVersion instance is read-only") - self._ptr[0].subMinor = val + self._data.sub_minor = val + + def __getitem__(self, key): + cdef ssize_t key_ + cdef ssize_t size + if isinstance(key, int): + key_ = key + size = self._data.size + if key_ >= size or key_ <= -(size+1): + raise IndexError("index is out of bounds") + if key_ < 0: + key_ += size + return NvlinkFirmwareVersion.from_data(self._data[key_:key_+1]) + out = self._data[key] + if isinstance(out, _numpy.recarray) and out.dtype == nvlink_firmware_version_dtype: + return NvlinkFirmwareVersion.from_data(out) + return out + + def __setitem__(self, key, val): + self._data[key] = val @staticmethod def from_buffer(buffer): """Create an NvlinkFirmwareVersion instance with the memory from the given buffer.""" - return _cyb_from_buffer(buffer, sizeof(nvmlNvlinkFirmwareVersion_t), NvlinkFirmwareVersion) + return NvlinkFirmwareVersion.from_data(_numpy.frombuffer(buffer, dtype=nvlink_firmware_version_dtype)) @staticmethod def from_data(data): """Create an NvlinkFirmwareVersion instance wrapping the given NumPy array. Args: - data (_numpy.ndarray): a single-element array of dtype `nvlink_firmware_version_dtype` holding the data. + data (_numpy.ndarray): a 1D array of dtype `nvlink_firmware_version_dtype` holding the data. """ - return _cyb_from_data(data, "nvlink_firmware_version_dtype", nvlink_firmware_version_dtype, NvlinkFirmwareVersion) + cdef NvlinkFirmwareVersion obj = NvlinkFirmwareVersion.__new__(NvlinkFirmwareVersion) + if not isinstance(data, _numpy.ndarray): + raise TypeError("data argument must be a NumPy ndarray") + if data.ndim != 1: + raise ValueError("data array must be 1D") + if data.dtype != nvlink_firmware_version_dtype: + raise ValueError("data array must be of dtype nvlink_firmware_version_dtype") + obj._data = data.view(_numpy.recarray) + + return obj @staticmethod - def from_ptr(intptr_t ptr, bint readonly=False, object owner=None): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an NvlinkFirmwareVersion instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. - owner (object): The Python object that owns the pointer. If not provided, data will be copied. + size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") cdef NvlinkFirmwareVersion obj = NvlinkFirmwareVersion.__new__(NvlinkFirmwareVersion) - if owner is None: - obj._ptr = _cyb_malloc(sizeof(nvmlNvlinkFirmwareVersion_t)) - if obj._ptr == NULL: - raise MemoryError("Error allocating NvlinkFirmwareVersion") - _cyb_memcpy((obj._ptr), ptr, sizeof(nvmlNvlinkFirmwareVersion_t)) - obj._owner = None - obj._owned = True - else: - obj._ptr = ptr - obj._owner = owner - obj._owned = False - obj._readonly = readonly + cdef flag = _cyb_cpython_buffer.PyBUF_READ if readonly else _cyb_cpython_buffer.PyBUF_WRITE + cdef object buf = _cyb_cpython_memoryview.PyMemoryView_FromMemory( + ptr, sizeof(nvmlNvlinkFirmwareVersion_t) * size, flag) + data = _numpy.ndarray(size, buffer=buf, dtype=nvlink_firmware_version_dtype) + obj._data = data.view(_numpy.recarray) + obj._owner = owner + return obj @@ -15709,6 +15821,7 @@ cdef class VgpuSchedulerLogEntry_v2: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=vgpu_scheduler_log_entry_v2_dtype) @@ -15871,13 +15984,15 @@ cdef class VgpuSchedulerLogEntry_v2: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an VgpuSchedulerLogEntry_v2 instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -15887,6 +16002,7 @@ cdef class VgpuSchedulerLogEntry_v2: ptr, sizeof(nvmlVgpuSchedulerLogEntry_v2_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=vgpu_scheduler_log_entry_v2_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -15985,55 +16101,775 @@ cdef class VgpuSchedulerState_v2: self._ptr[0].engineId = val @property - def scheduler_policy(self): - """int: IN: Scheduler policy.""" - return self._ptr[0].schedulerPolicy + def scheduler_policy(self): + """int: IN: Scheduler policy.""" + return self._ptr[0].schedulerPolicy + + @scheduler_policy.setter + def scheduler_policy(self, val): + if self._readonly: + raise ValueError("This VgpuSchedulerState_v2 instance is read-only") + self._ptr[0].schedulerPolicy = val + + @property + def avg_factor(self): + """int: IN: Average factor in compensating the timeslice for Adaptive Round Robin mode. 0 or unspecified uses default.""" + return self._ptr[0].avgFactor + + @avg_factor.setter + def avg_factor(self, val): + if self._readonly: + raise ValueError("This VgpuSchedulerState_v2 instance is read-only") + self._ptr[0].avgFactor = val + + @property + def frequency(self): + """int: IN: Frequency for Adaptive Round Robin mode. 0 or unspecified uses default.""" + return self._ptr[0].frequency + + @frequency.setter + def frequency(self, val): + if self._readonly: + raise ValueError("This VgpuSchedulerState_v2 instance is read-only") + self._ptr[0].frequency = val + + @staticmethod + def from_buffer(buffer): + """Create an VgpuSchedulerState_v2 instance with the memory from the given buffer.""" + return _cyb_from_buffer(buffer, sizeof(nvmlVgpuSchedulerState_v2_t), VgpuSchedulerState_v2) + + @staticmethod + def from_data(data): + """Create an VgpuSchedulerState_v2 instance wrapping the given NumPy array. + + Args: + data (_numpy.ndarray): a single-element array of dtype `vgpu_scheduler_state_v2_dtype` holding the data. + """ + return _cyb_from_data(data, "vgpu_scheduler_state_v2_dtype", vgpu_scheduler_state_v2_dtype, VgpuSchedulerState_v2) + + @staticmethod + def from_ptr(intptr_t ptr, bint readonly=False, object owner=None): + """Create an VgpuSchedulerState_v2 instance wrapping the given pointer. + + Args: + ptr (intptr_t): pointer address as Python :class:`int` to the data. + owner (object): The Python object that owns the pointer. If not provided, data will be copied. + readonly (bool): whether the data is read-only (to the user). default is `False`. + """ + if ptr == 0: + raise ValueError("ptr must not be null (0)") + cdef VgpuSchedulerState_v2 obj = VgpuSchedulerState_v2.__new__(VgpuSchedulerState_v2) + if owner is None: + obj._ptr = _cyb_malloc(sizeof(nvmlVgpuSchedulerState_v2_t)) + if obj._ptr == NULL: + raise MemoryError("Error allocating VgpuSchedulerState_v2") + _cyb_memcpy((obj._ptr), ptr, sizeof(nvmlVgpuSchedulerState_v2_t)) + obj._owner = None + obj._owned = True + else: + obj._ptr = ptr + obj._owner = owner + obj._owned = False + obj._readonly = readonly + return obj + + +cdef _get_bbx_time_data_v1_dtype_offsets(): + cdef nvmlBBXTimeData_v1_t pod + return _numpy.dtype({ + 'names': ['time_run'], + 'formats': [_numpy.uint32], + 'offsets': [ + (&(pod.timeRun)) - (&pod), + ], + 'itemsize': sizeof(nvmlBBXTimeData_v1_t), + }) + +bbx_time_data_v1_dtype = _get_bbx_time_data_v1_dtype_offsets() + +cdef class BBXTimeData_v1: + """Empty-initialize an instance of `nvmlBBXTimeData_v1_t`. + + + .. seealso:: `nvmlBBXTimeData_v1_t` + """ + cdef: + nvmlBBXTimeData_v1_t *_ptr + object _owner + bint _owned + bint _readonly + + def __init__(self): + self._ptr = _cyb_calloc(1, sizeof(nvmlBBXTimeData_v1_t)) + if self._ptr == NULL: + raise MemoryError("Error allocating BBXTimeData_v1") + self._owner = None + self._owned = True + self._readonly = False + + def __dealloc__(self): + cdef nvmlBBXTimeData_v1_t *ptr + if self._owned and self._ptr != NULL: + ptr = self._ptr + self._ptr = NULL + _cyb_free(ptr) + + def __repr__(self): + return f"<{__name__}.BBXTimeData_v1 object at {hex(id(self))}>" + + @property + def ptr(self): + """Get the pointer address to the data as Python :class:`int`.""" + return (self._ptr) + + cdef intptr_t _get_ptr(self): + return (self._ptr) + + def __int__(self): + return (self._ptr) + + def __eq__(self, other): + cdef BBXTimeData_v1 other_ + if not isinstance(other, BBXTimeData_v1): + return False + other_ = other + return (_cyb_memcmp((self._ptr), (other_._ptr), sizeof(nvmlBBXTimeData_v1_t)) == 0) + + def __getbuffer__(self, _cyb_cpython.Py_buffer *buffer, int flags): + _cyb___getbuffer(self, buffer, self._ptr, sizeof(nvmlBBXTimeData_v1_t), self._readonly) + + def __releasebuffer__(self, Py_buffer *buffer): + pass + + def __setitem__(self, key, val): + if key == 0 and isinstance(val, _numpy.ndarray): + self._ptr = _cyb_malloc(sizeof(nvmlBBXTimeData_v1_t)) + if self._ptr == NULL: + raise MemoryError("Error allocating BBXTimeData_v1") + _cyb_memcpy(self._ptr, val.ctypes.data, sizeof(nvmlBBXTimeData_v1_t)) + self._owner = None + self._owned = True + self._readonly = not val.flags.writeable + else: + setattr(self, key, val) + + @property + def time_run(self): + """int: [out] Cumulative number of seconds the GPU has had the driver loaded""" + return self._ptr[0].timeRun + + @time_run.setter + def time_run(self, val): + if self._readonly: + raise ValueError("This BBXTimeData_v1 instance is read-only") + self._ptr[0].timeRun = val + + @staticmethod + def from_buffer(buffer): + """Create an BBXTimeData_v1 instance with the memory from the given buffer.""" + return _cyb_from_buffer(buffer, sizeof(nvmlBBXTimeData_v1_t), BBXTimeData_v1) + + @staticmethod + def from_data(data): + """Create an BBXTimeData_v1 instance wrapping the given NumPy array. + + Args: + data (_numpy.ndarray): a single-element array of dtype `bbx_time_data_v1_dtype` holding the data. + """ + return _cyb_from_data(data, "bbx_time_data_v1_dtype", bbx_time_data_v1_dtype, BBXTimeData_v1) + + @staticmethod + def from_ptr(intptr_t ptr, bint readonly=False, object owner=None): + """Create an BBXTimeData_v1 instance wrapping the given pointer. + + Args: + ptr (intptr_t): pointer address as Python :class:`int` to the data. + owner (object): The Python object that owns the pointer. If not provided, data will be copied. + readonly (bool): whether the data is read-only (to the user). default is `False`. + """ + if ptr == 0: + raise ValueError("ptr must not be null (0)") + cdef BBXTimeData_v1 obj = BBXTimeData_v1.__new__(BBXTimeData_v1) + if owner is None: + obj._ptr = _cyb_malloc(sizeof(nvmlBBXTimeData_v1_t)) + if obj._ptr == NULL: + raise MemoryError("Error allocating BBXTimeData_v1") + _cyb_memcpy((obj._ptr), ptr, sizeof(nvmlBBXTimeData_v1_t)) + obj._owner = None + obj._owned = True + else: + obj._ptr = ptr + obj._owner = owner + obj._owned = False + obj._readonly = readonly + return obj + + +cdef _get_remapped_rows_info_v2_dtype_offsets(): + cdef nvmlRemappedRowsInfo_v2_t pod + return _numpy.dtype({ + 'names': ['corr_active_remaps', 'corr_inactive_remaps', 'unc_active_remaps', 'unc_inactive_remaps', 'b_pending', 'b_failure_occurred'], + 'formats': [_numpy.uint32, _numpy.uint32, _numpy.uint32, _numpy.uint32, _numpy.uint32, _numpy.uint32], + 'offsets': [ + (&(pod.corrActiveRemaps)) - (&pod), + (&(pod.corrInactiveRemaps)) - (&pod), + (&(pod.uncActiveRemaps)) - (&pod), + (&(pod.uncInactiveRemaps)) - (&pod), + (&(pod.bPending)) - (&pod), + (&(pod.bFailureOccurred)) - (&pod), + ], + 'itemsize': sizeof(nvmlRemappedRowsInfo_v2_t), + }) + +remapped_rows_info_v2_dtype = _get_remapped_rows_info_v2_dtype_offsets() + +cdef class RemappedRowsInfo_v2: + """Empty-initialize an instance of `nvmlRemappedRowsInfo_v2_t`. + + + .. seealso:: `nvmlRemappedRowsInfo_v2_t` + """ + cdef: + nvmlRemappedRowsInfo_v2_t *_ptr + object _owner + bint _owned + bint _readonly + + def __init__(self): + self._ptr = _cyb_calloc(1, sizeof(nvmlRemappedRowsInfo_v2_t)) + if self._ptr == NULL: + raise MemoryError("Error allocating RemappedRowsInfo_v2") + self._owner = None + self._owned = True + self._readonly = False + + def __dealloc__(self): + cdef nvmlRemappedRowsInfo_v2_t *ptr + if self._owned and self._ptr != NULL: + ptr = self._ptr + self._ptr = NULL + _cyb_free(ptr) + + def __repr__(self): + return f"<{__name__}.RemappedRowsInfo_v2 object at {hex(id(self))}>" + + @property + def ptr(self): + """Get the pointer address to the data as Python :class:`int`.""" + return (self._ptr) + + cdef intptr_t _get_ptr(self): + return (self._ptr) + + def __int__(self): + return (self._ptr) + + def __eq__(self, other): + cdef RemappedRowsInfo_v2 other_ + if not isinstance(other, RemappedRowsInfo_v2): + return False + other_ = other + return (_cyb_memcmp((self._ptr), (other_._ptr), sizeof(nvmlRemappedRowsInfo_v2_t)) == 0) + + def __getbuffer__(self, _cyb_cpython.Py_buffer *buffer, int flags): + _cyb___getbuffer(self, buffer, self._ptr, sizeof(nvmlRemappedRowsInfo_v2_t), self._readonly) + + def __releasebuffer__(self, Py_buffer *buffer): + pass + + def __setitem__(self, key, val): + if key == 0 and isinstance(val, _numpy.ndarray): + self._ptr = _cyb_malloc(sizeof(nvmlRemappedRowsInfo_v2_t)) + if self._ptr == NULL: + raise MemoryError("Error allocating RemappedRowsInfo_v2") + _cyb_memcpy(self._ptr, val.ctypes.data, sizeof(nvmlRemappedRowsInfo_v2_t)) + self._owner = None + self._owned = True + self._readonly = not val.flags.writeable + else: + setattr(self, key, val) + + @property + def corr_active_remaps(self): + """int: Number of active row remappings due to correctable errors.""" + return self._ptr[0].corrActiveRemaps + + @corr_active_remaps.setter + def corr_active_remaps(self, val): + if self._readonly: + raise ValueError("This RemappedRowsInfo_v2 instance is read-only") + self._ptr[0].corrActiveRemaps = val + + @property + def corr_inactive_remaps(self): + """int: Number of inactive row remappings due to correctable errors.""" + return self._ptr[0].corrInactiveRemaps + + @corr_inactive_remaps.setter + def corr_inactive_remaps(self, val): + if self._readonly: + raise ValueError("This RemappedRowsInfo_v2 instance is read-only") + self._ptr[0].corrInactiveRemaps = val + + @property + def unc_active_remaps(self): + """int: Number of active row remappings due to uncorrectable errors.""" + return self._ptr[0].uncActiveRemaps + + @unc_active_remaps.setter + def unc_active_remaps(self, val): + if self._readonly: + raise ValueError("This RemappedRowsInfo_v2 instance is read-only") + self._ptr[0].uncActiveRemaps = val + + @property + def unc_inactive_remaps(self): + """int: Number of inactive row remappings due to uncorrectable errors.""" + return self._ptr[0].uncInactiveRemaps + + @unc_inactive_remaps.setter + def unc_inactive_remaps(self, val): + if self._readonly: + raise ValueError("This RemappedRowsInfo_v2 instance is read-only") + self._ptr[0].uncInactiveRemaps = val + + @property + def b_pending(self): + """int: Whether or not there is any pending row remapping; 0 indicates not pending, 1 indicates pending.""" + return self._ptr[0].bPending + + @b_pending.setter + def b_pending(self, val): + if self._readonly: + raise ValueError("This RemappedRowsInfo_v2 instance is read-only") + self._ptr[0].bPending = val + + @property + def b_failure_occurred(self): + """int: Whether or not there's any row remapping failure in the past; 0 indicates no failure, 1 indicates failure occurred.""" + return self._ptr[0].bFailureOccurred + + @b_failure_occurred.setter + def b_failure_occurred(self, val): + if self._readonly: + raise ValueError("This RemappedRowsInfo_v2 instance is read-only") + self._ptr[0].bFailureOccurred = val + + @staticmethod + def from_buffer(buffer): + """Create an RemappedRowsInfo_v2 instance with the memory from the given buffer.""" + return _cyb_from_buffer(buffer, sizeof(nvmlRemappedRowsInfo_v2_t), RemappedRowsInfo_v2) + + @staticmethod + def from_data(data): + """Create an RemappedRowsInfo_v2 instance wrapping the given NumPy array. + + Args: + data (_numpy.ndarray): a single-element array of dtype `remapped_rows_info_v2_dtype` holding the data. + """ + return _cyb_from_data(data, "remapped_rows_info_v2_dtype", remapped_rows_info_v2_dtype, RemappedRowsInfo_v2) + + @staticmethod + def from_ptr(intptr_t ptr, bint readonly=False, object owner=None): + """Create an RemappedRowsInfo_v2 instance wrapping the given pointer. + + Args: + ptr (intptr_t): pointer address as Python :class:`int` to the data. + owner (object): The Python object that owns the pointer. If not provided, data will be copied. + readonly (bool): whether the data is read-only (to the user). default is `False`. + """ + if ptr == 0: + raise ValueError("ptr must not be null (0)") + cdef RemappedRowsInfo_v2 obj = RemappedRowsInfo_v2.__new__(RemappedRowsInfo_v2) + if owner is None: + obj._ptr = _cyb_malloc(sizeof(nvmlRemappedRowsInfo_v2_t)) + if obj._ptr == NULL: + raise MemoryError("Error allocating RemappedRowsInfo_v2") + _cyb_memcpy((obj._ptr), ptr, sizeof(nvmlRemappedRowsInfo_v2_t)) + obj._owner = None + obj._owned = True + else: + obj._ptr = ptr + obj._owner = owner + obj._owned = False + obj._readonly = readonly + return obj + + +cdef _get_accounting_stats_v2_dtype_offsets(): + cdef nvmlAccountingStats_v2_t pod + return _numpy.dtype({ + 'names': ['pid', 'is_running', 'gpu_utilization', 'memory_utilization', 'max_memory_usage', 'sample_count', 'sum_gpu_util', 'sum_fb_util', 'time', 'start_time'], + 'formats': [_numpy.uint32, _numpy.uint32, _numpy.uint32, _numpy.uint32, _numpy.uint64, _numpy.uint32, _numpy.uint64, _numpy.uint64, _numpy.uint64, _numpy.uint64], + 'offsets': [ + (&(pod.pid)) - (&pod), + (&(pod.isRunning)) - (&pod), + (&(pod.gpuUtilization)) - (&pod), + (&(pod.memoryUtilization)) - (&pod), + (&(pod.maxMemoryUsage)) - (&pod), + (&(pod.sampleCount)) - (&pod), + (&(pod.sumGpuUtil)) - (&pod), + (&(pod.sumFbUtil)) - (&pod), + (&(pod.time)) - (&pod), + (&(pod.startTime)) - (&pod), + ], + 'itemsize': sizeof(nvmlAccountingStats_v2_t), + }) + +accounting_stats_v2_dtype = _get_accounting_stats_v2_dtype_offsets() + +cdef class AccountingStats_v2: + """Empty-initialize an instance of `nvmlAccountingStats_v2_t`. + + + .. seealso:: `nvmlAccountingStats_v2_t` + """ + cdef: + nvmlAccountingStats_v2_t *_ptr + object _owner + bint _owned + bint _readonly + + def __init__(self): + self._ptr = _cyb_calloc(1, sizeof(nvmlAccountingStats_v2_t)) + if self._ptr == NULL: + raise MemoryError("Error allocating AccountingStats_v2") + self._owner = None + self._owned = True + self._readonly = False + + def __dealloc__(self): + cdef nvmlAccountingStats_v2_t *ptr + if self._owned and self._ptr != NULL: + ptr = self._ptr + self._ptr = NULL + _cyb_free(ptr) + + def __repr__(self): + return f"<{__name__}.AccountingStats_v2 object at {hex(id(self))}>" + + @property + def ptr(self): + """Get the pointer address to the data as Python :class:`int`.""" + return (self._ptr) + + cdef intptr_t _get_ptr(self): + return (self._ptr) + + def __int__(self): + return (self._ptr) + + def __eq__(self, other): + cdef AccountingStats_v2 other_ + if not isinstance(other, AccountingStats_v2): + return False + other_ = other + return (_cyb_memcmp((self._ptr), (other_._ptr), sizeof(nvmlAccountingStats_v2_t)) == 0) + + def __getbuffer__(self, _cyb_cpython.Py_buffer *buffer, int flags): + _cyb___getbuffer(self, buffer, self._ptr, sizeof(nvmlAccountingStats_v2_t), self._readonly) + + def __releasebuffer__(self, Py_buffer *buffer): + pass + + def __setitem__(self, key, val): + if key == 0 and isinstance(val, _numpy.ndarray): + self._ptr = _cyb_malloc(sizeof(nvmlAccountingStats_v2_t)) + if self._ptr == NULL: + raise MemoryError("Error allocating AccountingStats_v2") + _cyb_memcpy(self._ptr, val.ctypes.data, sizeof(nvmlAccountingStats_v2_t)) + self._owner = None + self._owned = True + self._readonly = not val.flags.writeable + else: + setattr(self, key, val) + + @property + def pid(self): + """int: Process Id of the target process to query stats for.""" + return self._ptr[0].pid + + @pid.setter + def pid(self, val): + if self._readonly: + raise ValueError("This AccountingStats_v2 instance is read-only") + self._ptr[0].pid = val + + @property + def is_running(self): + """int: Flag to represent if the process is running (1 for running, 0 for terminated).""" + return self._ptr[0].isRunning + + @is_running.setter + def is_running(self, val): + if self._readonly: + raise ValueError("This AccountingStats_v2 instance is read-only") + self._ptr[0].isRunning = val + + @property + def gpu_utilization(self): + """int: Percent of time over the process's lifetime during which one or more kernels was executing on the GPU. Utilization stats just like returned by nvmlDeviceGetUtilizationRates but for the life time of a process (not just the last sample period). Set to NVML_VALUE_NOT_AVAILABLE if nvmlDeviceGetUtilizationRates is not supported""" + return self._ptr[0].gpuUtilization + + @gpu_utilization.setter + def gpu_utilization(self, val): + if self._readonly: + raise ValueError("This AccountingStats_v2 instance is read-only") + self._ptr[0].gpuUtilization = val + + @property + def memory_utilization(self): + """int: Percent of time over the process's lifetime during which global (device) memory was being read or written. Set to NVML_VALUE_NOT_AVAILABLE if nvmlDeviceGetUtilizationRates is not supported""" + return self._ptr[0].memoryUtilization + + @memory_utilization.setter + def memory_utilization(self, val): + if self._readonly: + raise ValueError("This AccountingStats_v2 instance is read-only") + self._ptr[0].memoryUtilization = val + + @property + def max_memory_usage(self): + """int: Maximum total memory in bytes that was ever allocated by the process. Set to NVML_VALUE_NOT_AVAILABLE if nvmlProcessInfo_t->usedGpuMemory is not supported""" + return self._ptr[0].maxMemoryUsage + + @max_memory_usage.setter + def max_memory_usage(self, val): + if self._readonly: + raise ValueError("This AccountingStats_v2 instance is read-only") + self._ptr[0].maxMemoryUsage = val + + @property + def sample_count(self): + """int: The sample counts since the process starts.""" + return self._ptr[0].sampleCount + + @sample_count.setter + def sample_count(self, val): + if self._readonly: + raise ValueError("This AccountingStats_v2 instance is read-only") + self._ptr[0].sampleCount = val + + @property + def sum_gpu_util(self): + """int: The sum of process's GR engine utilization in unit of pct * 100.""" + return self._ptr[0].sumGpuUtil + + @sum_gpu_util.setter + def sum_gpu_util(self, val): + if self._readonly: + raise ValueError("This AccountingStats_v2 instance is read-only") + self._ptr[0].sumGpuUtil = val + + @property + def sum_fb_util(self): + """int: The sum of process's FB bandwidth utilization in unit of pct * 100.""" + return self._ptr[0].sumFbUtil + + @sum_fb_util.setter + def sum_fb_util(self, val): + if self._readonly: + raise ValueError("This AccountingStats_v2 instance is read-only") + self._ptr[0].sumFbUtil = val + + @property + def time(self): + """int: Amount of time in ms during which the compute context was active. The time is reported as 0 if the process is not terminated""" + return self._ptr[0].time + + @time.setter + def time(self, val): + if self._readonly: + raise ValueError("This AccountingStats_v2 instance is read-only") + self._ptr[0].time = val + + @property + def start_time(self): + """int: CPU Timestamp in usec representing start time for the process.""" + return self._ptr[0].startTime + + @start_time.setter + def start_time(self, val): + if self._readonly: + raise ValueError("This AccountingStats_v2 instance is read-only") + self._ptr[0].startTime = val + + @staticmethod + def from_buffer(buffer): + """Create an AccountingStats_v2 instance with the memory from the given buffer.""" + return _cyb_from_buffer(buffer, sizeof(nvmlAccountingStats_v2_t), AccountingStats_v2) + + @staticmethod + def from_data(data): + """Create an AccountingStats_v2 instance wrapping the given NumPy array. + + Args: + data (_numpy.ndarray): a single-element array of dtype `accounting_stats_v2_dtype` holding the data. + """ + return _cyb_from_data(data, "accounting_stats_v2_dtype", accounting_stats_v2_dtype, AccountingStats_v2) + + @staticmethod + def from_ptr(intptr_t ptr, bint readonly=False, object owner=None): + """Create an AccountingStats_v2 instance wrapping the given pointer. + + Args: + ptr (intptr_t): pointer address as Python :class:`int` to the data. + owner (object): The Python object that owns the pointer. If not provided, data will be copied. + readonly (bool): whether the data is read-only (to the user). default is `False`. + """ + if ptr == 0: + raise ValueError("ptr must not be null (0)") + cdef AccountingStats_v2 obj = AccountingStats_v2.__new__(AccountingStats_v2) + if owner is None: + obj._ptr = _cyb_malloc(sizeof(nvmlAccountingStats_v2_t)) + if obj._ptr == NULL: + raise MemoryError("Error allocating AccountingStats_v2") + _cyb_memcpy((obj._ptr), ptr, sizeof(nvmlAccountingStats_v2_t)) + obj._owner = None + obj._owned = True + else: + obj._ptr = ptr + obj._owner = owner + obj._owned = False + obj._readonly = readonly + return obj + + +cdef _get_cper_cursor_v1_dtype_offsets(): + cdef nvmlCPERCursor_v1_t pod + return _numpy.dtype({ + 'names': ['cper_type_mask', 'uuid', 'handle'], + 'formats': [_numpy.uint32, (_numpy.int8, 80), _numpy.uint64], + 'offsets': [ + (&(pod.cperTypeMask)) - (&pod), + (&(pod.uuid)) - (&pod), + (&(pod.handle)) - (&pod), + ], + 'itemsize': sizeof(nvmlCPERCursor_v1_t), + }) + +cper_cursor_v1_dtype = _get_cper_cursor_v1_dtype_offsets() + +cdef class CPERCursor_v1: + """Empty-initialize an instance of `nvmlCPERCursor_v1_t`. + + + .. seealso:: `nvmlCPERCursor_v1_t` + """ + cdef: + nvmlCPERCursor_v1_t *_ptr + object _owner + bint _owned + bint _readonly + + def __init__(self): + self._ptr = _cyb_calloc(1, sizeof(nvmlCPERCursor_v1_t)) + if self._ptr == NULL: + raise MemoryError("Error allocating CPERCursor_v1") + self._owner = None + self._owned = True + self._readonly = False + + def __dealloc__(self): + cdef nvmlCPERCursor_v1_t *ptr + if self._owned and self._ptr != NULL: + ptr = self._ptr + self._ptr = NULL + _cyb_free(ptr) + + def __repr__(self): + return f"<{__name__}.CPERCursor_v1 object at {hex(id(self))}>" + + @property + def ptr(self): + """Get the pointer address to the data as Python :class:`int`.""" + return (self._ptr) + + cdef intptr_t _get_ptr(self): + return (self._ptr) + + def __int__(self): + return (self._ptr) + + def __eq__(self, other): + cdef CPERCursor_v1 other_ + if not isinstance(other, CPERCursor_v1): + return False + other_ = other + return (_cyb_memcmp((self._ptr), (other_._ptr), sizeof(nvmlCPERCursor_v1_t)) == 0) + + def __getbuffer__(self, _cyb_cpython.Py_buffer *buffer, int flags): + _cyb___getbuffer(self, buffer, self._ptr, sizeof(nvmlCPERCursor_v1_t), self._readonly) + + def __releasebuffer__(self, Py_buffer *buffer): + pass + + def __setitem__(self, key, val): + if key == 0 and isinstance(val, _numpy.ndarray): + self._ptr = _cyb_malloc(sizeof(nvmlCPERCursor_v1_t)) + if self._ptr == NULL: + raise MemoryError("Error allocating CPERCursor_v1") + _cyb_memcpy(self._ptr, val.ctypes.data, sizeof(nvmlCPERCursor_v1_t)) + self._owner = None + self._owned = True + self._readonly = not val.flags.writeable + else: + setattr(self, key, val) + + @property + def cper_type_mask(self): + """int: [IN] Types of records to access. Bitmask of `nvmlCPERType_t` values. To change, reset `handle` to `NVML_CPER_CURSOR_HANDLE_INIT`.""" + return self._ptr[0].cperTypeMask - @scheduler_policy.setter - def scheduler_policy(self, val): + @cper_type_mask.setter + def cper_type_mask(self, val): if self._readonly: - raise ValueError("This VgpuSchedulerState_v2 instance is read-only") - self._ptr[0].schedulerPolicy = val + raise ValueError("This CPERCursor_v1 instance is read-only") + self._ptr[0].cperTypeMask = val @property - def avg_factor(self): - """int: IN: Average factor in compensating the timeslice for Adaptive Round Robin mode. 0 or unspecified uses default.""" - return self._ptr[0].avgFactor + def uuid(self): + """~_numpy.int8: (array of length 80).[IN] UUID of target to filter records for. Required for `NVML_CPER_ACCESS_TYPE_GPU`. To change, reset `handle` to `NVML_CPER_CURSOR_HANDLE_INIT`.""" + return _cyb_cpython.PyUnicode_FromString(self._ptr[0].uuid) - @avg_factor.setter - def avg_factor(self, val): + @uuid.setter + def uuid(self, val): if self._readonly: - raise ValueError("This VgpuSchedulerState_v2 instance is read-only") - self._ptr[0].avgFactor = val + raise ValueError("This CPERCursor_v1 instance is read-only") + cdef bytes buf = val.encode() + if len(buf) >= 80: + raise ValueError("String too long for field uuid, max length is 79") + cdef char *ptr = buf + _cyb_memcpy((self._ptr[0].uuid), ptr, 80) @property - def frequency(self): - """int: IN: Frequency for Adaptive Round Robin mode. 0 or unspecified uses default.""" - return self._ptr[0].frequency + def handle(self): + """int: [IN/OUT] Opaque handle tracking read position. Initialize to `NVML_CPER_CURSOR_HANDLE_INIT` on first call; pass the same ``nvmlCPERCursor_v1_t`` on the next call to continue. Caller must not interpret or modify.""" + return (self._ptr[0].handle) - @frequency.setter - def frequency(self, val): + @handle.setter + def handle(self, val): if self._readonly: - raise ValueError("This VgpuSchedulerState_v2 instance is read-only") - self._ptr[0].frequency = val + raise ValueError("This CPERCursor_v1 instance is read-only") + self._ptr[0].handle = val @staticmethod def from_buffer(buffer): - """Create an VgpuSchedulerState_v2 instance with the memory from the given buffer.""" - return _cyb_from_buffer(buffer, sizeof(nvmlVgpuSchedulerState_v2_t), VgpuSchedulerState_v2) + """Create an CPERCursor_v1 instance with the memory from the given buffer.""" + return _cyb_from_buffer(buffer, sizeof(nvmlCPERCursor_v1_t), CPERCursor_v1) @staticmethod def from_data(data): - """Create an VgpuSchedulerState_v2 instance wrapping the given NumPy array. + """Create an CPERCursor_v1 instance wrapping the given NumPy array. Args: - data (_numpy.ndarray): a single-element array of dtype `vgpu_scheduler_state_v2_dtype` holding the data. + data (_numpy.ndarray): a single-element array of dtype `cper_cursor_v1_dtype` holding the data. """ - return _cyb_from_data(data, "vgpu_scheduler_state_v2_dtype", vgpu_scheduler_state_v2_dtype, VgpuSchedulerState_v2) + return _cyb_from_data(data, "cper_cursor_v1_dtype", cper_cursor_v1_dtype, CPERCursor_v1) @staticmethod def from_ptr(intptr_t ptr, bint readonly=False, object owner=None): - """Create an VgpuSchedulerState_v2 instance wrapping the given pointer. + """Create an CPERCursor_v1 instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. @@ -16042,16 +16878,16 @@ cdef class VgpuSchedulerState_v2: """ if ptr == 0: raise ValueError("ptr must not be null (0)") - cdef VgpuSchedulerState_v2 obj = VgpuSchedulerState_v2.__new__(VgpuSchedulerState_v2) + cdef CPERCursor_v1 obj = CPERCursor_v1.__new__(CPERCursor_v1) if owner is None: - obj._ptr = _cyb_malloc(sizeof(nvmlVgpuSchedulerState_v2_t)) + obj._ptr = _cyb_malloc(sizeof(nvmlCPERCursor_v1_t)) if obj._ptr == NULL: - raise MemoryError("Error allocating VgpuSchedulerState_v2") - _cyb_memcpy((obj._ptr), ptr, sizeof(nvmlVgpuSchedulerState_v2_t)) + raise MemoryError("Error allocating CPERCursor_v1") + _cyb_memcpy((obj._ptr), ptr, sizeof(nvmlCPERCursor_v1_t)) obj._owner = None obj._owned = True else: - obj._ptr = ptr + obj._ptr = ptr obj._owner = owner obj._owned = False obj._readonly = readonly @@ -16141,7 +16977,11 @@ cdef class ExcludedDeviceInfo: @property def pci_info(self): """PciInfo: """ - return PciInfo.from_ptr(&(self._ptr[0].pciInfo), self._readonly, self) + return PciInfo.from_ptr( + &(self._ptr[0].pciInfo), + readonly=self._readonly, + owner=self, + ) @pci_info.setter def pci_info(self, val): @@ -16317,7 +17157,12 @@ cdef class ProcessDetailList_v1: """int: Process array.""" if self._ptr[0].procArray == NULL or self._ptr[0].numProcArrayEntries == 0: return [] - return ProcessDetail_v1.from_ptr((self._ptr[0].procArray), self._ptr[0].numProcArrayEntries) + return ProcessDetail_v1.from_ptr( + (self._ptr[0].procArray), + self._ptr[0].numProcArrayEntries, + owner=self, + readonly=self._readonly + ) @proc_array.setter def proc_array(self, val): @@ -16453,7 +17298,12 @@ cdef class BridgeChipHierarchy: @property def bridge_chip_info(self): """BridgeChipInfo: """ - return BridgeChipInfo.from_ptr(&(self._ptr[0].bridgeChipInfo), self._ptr[0].bridgeCount, self._readonly) + return BridgeChipInfo.from_ptr( + &(self._ptr[0].bridgeChipInfo), + self._ptr[0].bridgeCount, + readonly=self._readonly, + owner=self, + ) @bridge_chip_info.setter def bridge_chip_info(self, val): @@ -16534,6 +17384,7 @@ cdef class Sample: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=sample_dtype) @@ -16639,13 +17490,15 @@ cdef class Sample: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an Sample instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -16655,6 +17508,7 @@ cdef class Sample: ptr, sizeof(nvmlSample_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=sample_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -16689,6 +17543,7 @@ cdef class VgpuInstanceUtilizationSample: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=vgpu_instance_utilization_sample_dtype) @@ -16832,13 +17687,15 @@ cdef class VgpuInstanceUtilizationSample: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an VgpuInstanceUtilizationSample instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -16848,6 +17705,7 @@ cdef class VgpuInstanceUtilizationSample: ptr, sizeof(nvmlVgpuInstanceUtilizationSample_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=vgpu_instance_utilization_sample_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -16884,6 +17742,7 @@ cdef class VgpuInstanceUtilizationInfo_v1: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=vgpu_instance_utilization_info_v1_dtype) @@ -17045,13 +17904,15 @@ cdef class VgpuInstanceUtilizationInfo_v1: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an VgpuInstanceUtilizationInfo_v1 instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -17061,6 +17922,7 @@ cdef class VgpuInstanceUtilizationInfo_v1: ptr, sizeof(nvmlVgpuInstanceUtilizationInfo_v1_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=vgpu_instance_utilization_info_v1_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -17096,6 +17958,7 @@ cdef class FieldValue: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=field_value_dtype) @@ -17256,13 +18119,15 @@ cdef class FieldValue: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an FieldValue instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -17272,6 +18137,7 @@ cdef class FieldValue: ptr, sizeof(nvmlFieldValue_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=field_value_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -17360,7 +18226,11 @@ cdef class PRMCounterValue_v1: @property def output_value(self): """Value: Output value.""" - return Value.from_ptr(&(self._ptr[0].outputValue), self._readonly, self) + return Value.from_ptr( + &(self._ptr[0].outputValue), + readonly=self._readonly, + owner=self, + ) @output_value.setter def output_value(self, val): @@ -17515,7 +18385,12 @@ cdef class GpuThermalSettings: @property def sensor(self): """_py_anon_pod0: """ - return _py_anon_pod0.from_ptr(&(self._ptr[0].sensor), 3, self._readonly) + return _py_anon_pod0.from_ptr( + &(self._ptr[0].sensor), + 3, + readonly=self._readonly, + owner=self, + ) @sensor.setter def sensor(self, val): @@ -17662,7 +18537,12 @@ cdef class ClkMonStatus: @property def clk_mon_list(self): """ClkMonFaultInfo: """ - return ClkMonFaultInfo.from_ptr(&(self._ptr[0].clkMonList), self._ptr[0].clkMonListSize, self._readonly) + return ClkMonFaultInfo.from_ptr( + &(self._ptr[0].clkMonList), + self._ptr[0].clkMonListSize, + readonly=self._readonly, + owner=self, + ) @clk_mon_list.setter def clk_mon_list(self, val): @@ -17839,7 +18719,12 @@ cdef class ProcessesUtilizationInfo_v1: """int: The array (allocated by caller) of the utilization of GPU SM, framebuffer, video encoder, video decoder, JPEG, and OFA.""" if self._ptr[0].procUtilArray == NULL or self._ptr[0].processSamplesCount == 0: return [] - return ProcessUtilizationInfo_v1.from_ptr((self._ptr[0].procUtilArray), self._ptr[0].processSamplesCount) + return ProcessUtilizationInfo_v1.from_ptr( + (self._ptr[0].procUtilArray), + self._ptr[0].processSamplesCount, + owner=self, + readonly=self._readonly + ) @proc_util_array.setter def proc_util_array(self, val): @@ -17975,7 +18860,12 @@ cdef class GpuDynamicPstatesInfo: @property def utilization(self): """_py_anon_pod1: """ - return _py_anon_pod1.from_ptr(&(self._ptr[0].utilization), 8, self._readonly) + return _py_anon_pod1.from_ptr( + &(self._ptr[0].utilization), + 8, + readonly=self._readonly, + owner=self, + ) @utilization.setter def utilization(self, val): @@ -18149,7 +19039,12 @@ cdef class VgpuProcessesUtilizationInfo_v1: """int: The array (allocated by caller) in which utilization of processes running on vGPU instances are returned.""" if self._ptr[0].vgpuProcUtilArray == NULL or self._ptr[0].vgpuProcessCount == 0: return [] - return VgpuProcessUtilizationInfo_v1.from_ptr((self._ptr[0].vgpuProcUtilArray), self._ptr[0].vgpuProcessCount) + return VgpuProcessUtilizationInfo_v1.from_ptr( + (self._ptr[0].vgpuProcUtilArray), + self._ptr[0].vgpuProcessCount, + owner=self, + readonly=self._readonly + ) @vgpu_proc_util_array.setter def vgpu_proc_util_array(self, val): @@ -18202,13 +19097,19 @@ cdef class VgpuProcessesUtilizationInfo_v1: return obj -vgpu_scheduler_params_dtype = _numpy.dtype(( - _numpy.dtype((_numpy.void, sizeof(nvmlVgpuSchedulerParams_t))), - { - "vgpu_sched_data_with_arr": (_py_anon_pod2_dtype, 0), - "vgpu_sched_data": (_py_anon_pod3_dtype, 0), - } - )) +cdef _get_vgpu_scheduler_params_dtype_offsets(): + cdef nvmlVgpuSchedulerParams_t pod + return _numpy.dtype({ + 'names': ['vgpu_sched_data_with_arr', 'vgpu_sched_data'], + 'formats': [_py_anon_pod2_dtype, _py_anon_pod3_dtype], + 'offsets': [ + (&(pod.vgpuSchedDataWithARR)) - (&pod), + (&(pod.vgpuSchedData)) - (&pod), + ], + 'itemsize': sizeof(nvmlVgpuSchedulerParams_t), + }) + +vgpu_scheduler_params_dtype = _get_vgpu_scheduler_params_dtype_offsets() cdef class VgpuSchedulerParams: """Empty-initialize an instance of `nvmlVgpuSchedulerParams_t`. @@ -18279,7 +19180,11 @@ cdef class VgpuSchedulerParams: @property def vgpu_sched_data_with_arr(self): """_py_anon_pod2: """ - return _py_anon_pod2.from_ptr(&(self._ptr[0].vgpuSchedDataWithARR), self._readonly, self) + return _py_anon_pod2.from_ptr( + &(self._ptr[0].vgpuSchedDataWithARR), + readonly=self._readonly, + owner=self, + ) @vgpu_sched_data_with_arr.setter def vgpu_sched_data_with_arr(self, val): @@ -18291,7 +19196,11 @@ cdef class VgpuSchedulerParams: @property def vgpu_sched_data(self): """_py_anon_pod3: """ - return _py_anon_pod3.from_ptr(&(self._ptr[0].vgpuSchedData), self._readonly, self) + return _py_anon_pod3.from_ptr( + &(self._ptr[0].vgpuSchedData), + readonly=self._readonly, + owner=self, + ) @vgpu_sched_data.setter def vgpu_sched_data(self, val): @@ -18341,13 +19250,19 @@ cdef class VgpuSchedulerParams: return obj -vgpu_scheduler_set_params_dtype = _numpy.dtype(( - _numpy.dtype((_numpy.void, sizeof(nvmlVgpuSchedulerSetParams_t))), - { - "vgpu_sched_data_with_arr": (_py_anon_pod4_dtype, 0), - "vgpu_sched_data": (_py_anon_pod5_dtype, 0), - } - )) +cdef _get_vgpu_scheduler_set_params_dtype_offsets(): + cdef nvmlVgpuSchedulerSetParams_t pod + return _numpy.dtype({ + 'names': ['vgpu_sched_data_with_arr', 'vgpu_sched_data'], + 'formats': [_py_anon_pod4_dtype, _py_anon_pod5_dtype], + 'offsets': [ + (&(pod.vgpuSchedDataWithARR)) - (&pod), + (&(pod.vgpuSchedData)) - (&pod), + ], + 'itemsize': sizeof(nvmlVgpuSchedulerSetParams_t), + }) + +vgpu_scheduler_set_params_dtype = _get_vgpu_scheduler_set_params_dtype_offsets() cdef class VgpuSchedulerSetParams: """Empty-initialize an instance of `nvmlVgpuSchedulerSetParams_t`. @@ -18418,7 +19333,11 @@ cdef class VgpuSchedulerSetParams: @property def vgpu_sched_data_with_arr(self): """_py_anon_pod4: """ - return _py_anon_pod4.from_ptr(&(self._ptr[0].vgpuSchedDataWithARR), self._readonly, self) + return _py_anon_pod4.from_ptr( + &(self._ptr[0].vgpuSchedDataWithARR), + readonly=self._readonly, + owner=self, + ) @vgpu_sched_data_with_arr.setter def vgpu_sched_data_with_arr(self, val): @@ -18430,7 +19349,11 @@ cdef class VgpuSchedulerSetParams: @property def vgpu_sched_data(self): """_py_anon_pod5: """ - return _py_anon_pod5.from_ptr(&(self._ptr[0].vgpuSchedData), self._readonly, self) + return _py_anon_pod5.from_ptr( + &(self._ptr[0].vgpuSchedData), + readonly=self._readonly, + owner=self, + ) @vgpu_sched_data.setter def vgpu_sched_data(self, val): @@ -18564,7 +19487,11 @@ cdef class VgpuLicenseInfo: @property def license_expiry(self): """VgpuLicenseExpiry: """ - return VgpuLicenseExpiry.from_ptr(&(self._ptr[0].licenseExpiry), self._readonly, self) + return VgpuLicenseExpiry.from_ptr( + &(self._ptr[0].licenseExpiry), + readonly=self._readonly, + owner=self, + ) @license_expiry.setter def license_expiry(self, val): @@ -18666,6 +19593,7 @@ cdef class GridLicensableFeature: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=grid_licensable_feature_dtype) @@ -18811,13 +19739,15 @@ cdef class GridLicensableFeature: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an GridLicensableFeature instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -18827,6 +19757,7 @@ cdef class GridLicensableFeature: ptr, sizeof(nvmlGridLicensableFeature_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=grid_licensable_feature_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -18914,7 +19845,12 @@ cdef class UnitFanSpeeds: @property def fans(self): """UnitFanInfo: """ - return UnitFanInfo.from_ptr(&(self._ptr[0].fans), 24, self._readonly) + return UnitFanInfo.from_ptr( + &(self._ptr[0].fans), + 24, + readonly=self._readonly, + owner=self, + ) @fans.setter def fans(self, val): @@ -19066,7 +20002,11 @@ cdef class VgpuPgpuMetadata: @property def host_supported_vgpu_range(self): """VgpuVersion: """ - return VgpuVersion.from_ptr(&(self._ptr[0].hostSupportedVgpuRange), self._readonly, self) + return VgpuVersion.from_ptr( + &(self._ptr[0].hostSupportedVgpuRange), + readonly=self._readonly, + owner=self, + ) @host_supported_vgpu_range.setter def host_supported_vgpu_range(self, val): @@ -19275,7 +20215,12 @@ cdef class GpuInstanceInfo: @property def placement(self): """GpuInstancePlacement: """ - return GpuInstancePlacement.from_ptr(&(self._ptr[0].placement), self._readonly, self) + return GpuInstancePlacement.from_ptr( + &(self._ptr[0].placement), + 1, + readonly=self._readonly, + owner=self, + ) @placement.setter def placement(self, val): @@ -19444,7 +20389,12 @@ cdef class ComputeInstanceInfo: @property def placement(self): """ComputeInstancePlacement: """ - return ComputeInstancePlacement.from_ptr(&(self._ptr[0].placement), self._readonly, self) + return ComputeInstancePlacement.from_ptr( + &(self._ptr[0].placement), + 1, + readonly=self._readonly, + owner=self, + ) @placement.setter def placement(self, val): @@ -19637,7 +20587,12 @@ cdef class EccSramUniqueUncorrectedErrorCounts_v1: """int: pointer to caller-supplied buffer to return the SRAM unique uncorrected ECC error count entries""" if self._ptr[0].entries == NULL or self._ptr[0].entryCount == 0: return [] - return EccSramUniqueUncorrectedErrorEntry_v1.from_ptr((self._ptr[0].entries), self._ptr[0].entryCount) + return EccSramUniqueUncorrectedErrorEntry_v1.from_ptr( + (self._ptr[0].entries), + self._ptr[0].entryCount, + owner=self, + readonly=self._readonly + ) @entries.setter def entries(self, val): @@ -19773,7 +20728,12 @@ cdef class NvlinkFirmwareInfo: @property def firmware_version(self): """NvlinkFirmwareVersion: OUT - NVLINK firmware version.""" - return NvlinkFirmwareVersion.from_ptr(&(self._ptr[0].firmwareVersion), 100, self._readonly) + return NvlinkFirmwareVersion.from_ptr( + &(self._ptr[0].firmwareVersion), + 100, + readonly=self._readonly, + owner=self, + ) @firmware_version.setter def firmware_version(self, val): @@ -19923,7 +20883,12 @@ cdef class VgpuSchedulerLogInfo_v2: @property def log_entries(self): """VgpuSchedulerLogEntry_v2: OUT: Structure to store the state and logs of a software runlist.""" - return VgpuSchedulerLogEntry_v2.from_ptr(&(self._ptr[0].logEntries), 200, self._readonly) + return VgpuSchedulerLogEntry_v2.from_ptr( + &(self._ptr[0].logEntries), + 200, + readonly=self._readonly, + owner=self, + ) @log_entries.setter def log_entries(self, val): @@ -20030,6 +20995,166 @@ cdef class VgpuSchedulerLogInfo_v2: return obj +cdef _get_get_cper_v1_dtype_offsets(): + cdef nvmlGetCPER_v1_t pod + return _numpy.dtype({ + 'names': ['cursor', 'buffer', 'buffer_size'], + 'formats': [cper_cursor_v1_dtype, _numpy.intp, _numpy.uint32], + 'offsets': [ + (&(pod.cursor)) - (&pod), + (&(pod.buffer)) - (&pod), + (&(pod.bufferSize)) - (&pod), + ], + 'itemsize': sizeof(nvmlGetCPER_v1_t), + }) + +get_cper_v1_dtype = _get_get_cper_v1_dtype_offsets() + +cdef class GetCPER_v1: + """Empty-initialize an instance of `nvmlGetCPER_v1_t`. + + + .. seealso:: `nvmlGetCPER_v1_t` + """ + cdef: + nvmlGetCPER_v1_t *_ptr + object _owner + bint _owned + bint _readonly + + def __init__(self): + self._ptr = _cyb_calloc(1, sizeof(nvmlGetCPER_v1_t)) + if self._ptr == NULL: + raise MemoryError("Error allocating GetCPER_v1") + self._owner = None + self._owned = True + self._readonly = False + + def __dealloc__(self): + cdef nvmlGetCPER_v1_t *ptr + if self._owned and self._ptr != NULL: + ptr = self._ptr + self._ptr = NULL + _cyb_free(ptr) + + def __repr__(self): + return f"<{__name__}.GetCPER_v1 object at {hex(id(self))}>" + + @property + def ptr(self): + """Get the pointer address to the data as Python :class:`int`.""" + return (self._ptr) + + cdef intptr_t _get_ptr(self): + return (self._ptr) + + def __int__(self): + return (self._ptr) + + def __eq__(self, other): + cdef GetCPER_v1 other_ + if not isinstance(other, GetCPER_v1): + return False + other_ = other + return (_cyb_memcmp((self._ptr), (other_._ptr), sizeof(nvmlGetCPER_v1_t)) == 0) + + def __getbuffer__(self, _cyb_cpython.Py_buffer *buffer, int flags): + _cyb___getbuffer(self, buffer, self._ptr, sizeof(nvmlGetCPER_v1_t), self._readonly) + + def __releasebuffer__(self, Py_buffer *buffer): + pass + + def __setitem__(self, key, val): + if key == 0 and isinstance(val, _numpy.ndarray): + self._ptr = _cyb_malloc(sizeof(nvmlGetCPER_v1_t)) + if self._ptr == NULL: + raise MemoryError("Error allocating GetCPER_v1") + _cyb_memcpy(self._ptr, val.ctypes.data, sizeof(nvmlGetCPER_v1_t)) + self._owner = None + self._owned = True + self._readonly = not val.flags.writeable + else: + setattr(self, key, val) + + @property + def cursor(self): + """CPERCursor_v1: [IN/OUT] Query parameters and cursor. See `nvmlCPERCursor_v1_t`""" + return CPERCursor_v1.from_ptr( + &(self._ptr[0].cursor), + readonly=self._readonly, + owner=self, + ) + + @cursor.setter + def cursor(self, val): + if self._readonly: + raise ValueError("This GetCPER_v1 instance is read-only") + cdef CPERCursor_v1 val_ = val + _cyb_memcpy(&(self._ptr[0].cursor), (val_._get_ptr()), sizeof(nvmlCPERCursor_v1_t) * 1) + + @property + def buffer(self): + """str: [OUT] Buffer to be filled (allocated by client). May be NULL for size query.""" + return (self._ptr[0].buffer) + + @buffer.setter + def buffer(self, val): + if self._readonly: + raise ValueError("This GetCPER_v1 instance is read-only") + self._ptr[0].buffer = val + + @property + def buffer_size(self): + """int: [IN/OUT] Size of `buffer`. Set to 0 with `buffer` NULL to query required size. On return, set to required or used size; 0 means no (more) records.""" + return self._ptr[0].bufferSize + + @buffer_size.setter + def buffer_size(self, val): + if self._readonly: + raise ValueError("This GetCPER_v1 instance is read-only") + self._ptr[0].bufferSize = val + + @staticmethod + def from_buffer(buffer): + """Create an GetCPER_v1 instance with the memory from the given buffer.""" + return _cyb_from_buffer(buffer, sizeof(nvmlGetCPER_v1_t), GetCPER_v1) + + @staticmethod + def from_data(data): + """Create an GetCPER_v1 instance wrapping the given NumPy array. + + Args: + data (_numpy.ndarray): a single-element array of dtype `get_cper_v1_dtype` holding the data. + """ + return _cyb_from_data(data, "get_cper_v1_dtype", get_cper_v1_dtype, GetCPER_v1) + + @staticmethod + def from_ptr(intptr_t ptr, bint readonly=False, object owner=None): + """Create an GetCPER_v1 instance wrapping the given pointer. + + Args: + ptr (intptr_t): pointer address as Python :class:`int` to the data. + owner (object): The Python object that owns the pointer. If not provided, data will be copied. + readonly (bool): whether the data is read-only (to the user). default is `False`. + """ + if ptr == 0: + raise ValueError("ptr must not be null (0)") + cdef GetCPER_v1 obj = GetCPER_v1.__new__(GetCPER_v1) + if owner is None: + obj._ptr = _cyb_malloc(sizeof(nvmlGetCPER_v1_t)) + if obj._ptr == NULL: + raise MemoryError("Error allocating GetCPER_v1") + _cyb_memcpy((obj._ptr), ptr, sizeof(nvmlGetCPER_v1_t)) + obj._owner = None + obj._owned = True + else: + obj._ptr = ptr + obj._owner = owner + obj._owned = False + obj._readonly = readonly + return obj + + cdef _get_vgpu_instances_utilization_info_v1_dtype_offsets(): cdef nvmlVgpuInstancesUtilizationInfo_v1_t pod return _numpy.dtype({ @@ -20153,7 +21278,12 @@ cdef class VgpuInstancesUtilizationInfo_v1: """int: The array (allocated by caller) in which vGPU utilization are returned.""" if self._ptr[0].vgpuUtilArray == NULL or self._ptr[0].vgpuInstanceCount == 0: return [] - return VgpuInstanceUtilizationInfo_v1.from_ptr((self._ptr[0].vgpuUtilArray), self._ptr[0].vgpuInstanceCount) + return VgpuInstanceUtilizationInfo_v1.from_ptr( + (self._ptr[0].vgpuUtilArray), + self._ptr[0].vgpuInstanceCount, + owner=self, + readonly=self._readonly + ) @vgpu_util_array.setter def vgpu_util_array(self, val): @@ -20233,6 +21363,7 @@ cdef class PRMCounter_v1: """ cdef: readonly object _data + object _owner def __init__(self, size=1): arr = _numpy.empty(size, dtype=prm_counter_v1_dtype) @@ -20347,13 +21478,15 @@ cdef class PRMCounter_v1: return obj @staticmethod - def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False): + def from_ptr(intptr_t ptr, size_t size=1, bint readonly=False, object owner=None): """Create an PRMCounter_v1 instance wrapping the given pointer. Args: ptr (intptr_t): pointer address as Python :class:`int` to the data. size (int): number of structs, default=1. readonly (bool): whether the data is read-only (to the user). default is `False`. + owner (object): object that owns the memory at *ptr*. A strong reference is + kept so the backing storage outlives this wrapper. """ if ptr == 0: raise ValueError("ptr must not be null (0)") @@ -20363,6 +21496,7 @@ cdef class PRMCounter_v1: ptr, sizeof(nvmlPRMCounter_v1_t) * size, flag) data = _numpy.ndarray(size, buffer=buf, dtype=prm_counter_v1_dtype) obj._data = data.view(_numpy.recarray) + obj._owner = owner return obj @@ -20454,7 +21588,11 @@ cdef class VgpuSchedulerLog: @property def scheduler_params(self): """VgpuSchedulerParams: """ - return VgpuSchedulerParams.from_ptr(&(self._ptr[0].schedulerParams), self._readonly, self) + return VgpuSchedulerParams.from_ptr( + &(self._ptr[0].schedulerParams), + readonly=self._readonly, + owner=self, + ) @scheduler_params.setter def scheduler_params(self, val): @@ -20466,7 +21604,12 @@ cdef class VgpuSchedulerLog: @property def log_entries(self): """VgpuSchedulerLogEntry: """ - return VgpuSchedulerLogEntry.from_ptr(&(self._ptr[0].logEntries), 200, self._readonly) + return VgpuSchedulerLogEntry.from_ptr( + &(self._ptr[0].logEntries), + 200, + readonly=self._readonly, + owner=self, + ) @log_entries.setter def log_entries(self, val): @@ -20646,7 +21789,11 @@ cdef class VgpuSchedulerGetState: @property def scheduler_params(self): """VgpuSchedulerParams: """ - return VgpuSchedulerParams.from_ptr(&(self._ptr[0].schedulerParams), self._readonly, self) + return VgpuSchedulerParams.from_ptr( + &(self._ptr[0].schedulerParams), + readonly=self._readonly, + owner=self, + ) @scheduler_params.setter def scheduler_params(self, val): @@ -20804,7 +21951,11 @@ cdef class VgpuSchedulerStateInfo_v1: @property def scheduler_params(self): """VgpuSchedulerParams: OUT: vGPU Scheduler Parameters.""" - return VgpuSchedulerParams.from_ptr(&(self._ptr[0].schedulerParams), self._readonly, self) + return VgpuSchedulerParams.from_ptr( + &(self._ptr[0].schedulerParams), + readonly=self._readonly, + owner=self, + ) @scheduler_params.setter def scheduler_params(self, val): @@ -20986,7 +22137,11 @@ cdef class VgpuSchedulerLogInfo_v1: @property def scheduler_params(self): """VgpuSchedulerParams: OUT: vGPU Scheduler Parameters.""" - return VgpuSchedulerParams.from_ptr(&(self._ptr[0].schedulerParams), self._readonly, self) + return VgpuSchedulerParams.from_ptr( + &(self._ptr[0].schedulerParams), + readonly=self._readonly, + owner=self, + ) @scheduler_params.setter def scheduler_params(self, val): @@ -20998,7 +22153,12 @@ cdef class VgpuSchedulerLogInfo_v1: @property def log_entries(self): """VgpuSchedulerLogEntry: OUT: Structure to store the state and logs of a software runlist.""" - return VgpuSchedulerLogEntry.from_ptr(&(self._ptr[0].logEntries), 200, self._readonly) + return VgpuSchedulerLogEntry.from_ptr( + &(self._ptr[0].logEntries), + 200, + readonly=self._readonly, + owner=self, + ) @log_entries.setter def log_entries(self, val): @@ -21191,7 +22351,11 @@ cdef class VgpuSchedulerState_v1: @property def scheduler_params(self): """VgpuSchedulerSetParams: IN: vGPU Scheduler Parameters.""" - return VgpuSchedulerSetParams.from_ptr(&(self._ptr[0].schedulerParams), self._readonly, self) + return VgpuSchedulerSetParams.from_ptr( + &(self._ptr[0].schedulerParams), + readonly=self._readonly, + owner=self, + ) @scheduler_params.setter def scheduler_params(self, val): @@ -21369,7 +22533,12 @@ cdef class GridLicensableFeatures: @property def grid_licensable_features(self): """GridLicensableFeature: """ - return GridLicensableFeature.from_ptr(&(self._ptr[0].gridLicensableFeatures), self._ptr[0].licensableFeaturesCount, self._readonly) + return GridLicensableFeature.from_ptr( + &(self._ptr[0].gridLicensableFeatures), + self._ptr[0].licensableFeaturesCount, + readonly=self._readonly, + owner=self, + ) @grid_licensable_features.setter def grid_licensable_features(self, val): @@ -21519,7 +22688,11 @@ cdef class NvLinkInfo_v2: @property def firmware_info(self): """NvlinkFirmwareInfo: OUT - NVLINK Firmware info.""" - return NvlinkFirmwareInfo.from_ptr(&(self._ptr[0].firmwareInfo), self._readonly, self) + return NvlinkFirmwareInfo.from_ptr( + &(self._ptr[0].firmwareInfo), + readonly=self._readonly, + owner=self, + ) @firmware_info.setter def firmware_info(self, val): @@ -21747,7 +22920,8 @@ cpdef unsigned int unit_get_count() except? 0: """Retrieves the number of units in the system. Returns: - unsigned int: Reference in which to return the number of units. + unsigned int: Reference in which to return the number of + units. .. seealso:: `nvmlUnitGetCount` """ @@ -21762,7 +22936,8 @@ cpdef intptr_t unit_get_handle_by_index(unsigned int index) except? 0: """Acquire the handle for a particular unit, based on its index. Args: - index (unsigned int): The index of the target unit, >= 0 and < ``unitCount``. + index (unsigned int): The index of the target unit, >= 0 and < + ``unitCount``. Returns: intptr_t: Reference in which to return the unit handle. @@ -21783,7 +22958,8 @@ cpdef object unit_get_unit_info(intptr_t unit): unit (intptr_t): The identifier of the target unit. Returns: - nvmlUnitInfo_t: Reference in which to return the unit information. + nvmlUnitInfo_t: Reference in which to return the unit + information. .. seealso:: `nvmlUnitGetUnitInfo` """ @@ -21802,7 +22978,8 @@ cpdef object unit_get_led_state(intptr_t unit): unit (intptr_t): The identifier of the target unit. Returns: - nvmlLedState_t: Reference in which to return the current LED state. + nvmlLedState_t: Reference in which to return the current LED + state. .. seealso:: `nvmlUnitGetLedState` """ @@ -21821,7 +22998,8 @@ cpdef object unit_get_psu_info(intptr_t unit): unit (intptr_t): The identifier of the target unit. Returns: - nvmlPSUInfo_t: Reference in which to return the PSU information. + nvmlPSUInfo_t: Reference in which to return the PSU + information. .. seealso:: `nvmlUnitGetPsuInfo` """ @@ -21841,7 +23019,8 @@ cpdef unsigned int unit_get_temperature(intptr_t unit, unsigned int type) except type (unsigned int): The type of reading to take. Returns: - unsigned int: Reference in which to return the intake temperature. + unsigned int: Reference in which to return the intake + temperature. .. seealso:: `nvmlUnitGetTemperature` """ @@ -21859,7 +23038,8 @@ cpdef object unit_get_fan_speed_info(intptr_t unit): unit (intptr_t): The identifier of the target unit. Returns: - nvmlUnitFanSpeeds_t: Reference in which to return the fan speed information. + nvmlUnitFanSpeeds_t: Reference in which to return the fan + speed information. .. seealso:: `nvmlUnitGetFanSpeedInfo` """ @@ -21875,7 +23055,8 @@ cpdef unsigned int device_get_count_v2() except? 0: """Retrieves the number of compute devices in the system. A compute device is a single GPU. Returns: - unsigned int: Reference in which to return the number of accessible devices. + unsigned int: Reference in which to return the number of + accessible devices. .. seealso:: `nvmlDeviceGetCount_v2` """ @@ -21909,7 +23090,8 @@ cpdef intptr_t device_get_handle_by_index_v2(unsigned int index) except? 0: """Acquire the handle for a particular device, based on its index. Args: - index (unsigned int): The index of the target GPU, >= 0 and < ``accessibleDevices``. + index (unsigned int): The index of the target GPU, >= 0 and < + ``accessibleDevices``. Returns: intptr_t: Reference in which to return the device handle. @@ -21952,7 +23134,8 @@ cpdef intptr_t device_get_handle_by_uuid(uuid) except? 0: uuid (str): The UUID of the target GPU or MIG instance. Returns: - intptr_t: Reference in which to return the device handle or MIG device handle. + intptr_t: Reference in which to return the device handle or + MIG device handle. .. seealso:: `nvmlDeviceGetHandleByUUID` """ @@ -21971,7 +23154,11 @@ cpdef intptr_t device_get_handle_by_pci_bus_id_v2(pci_bus_id) except? 0: """Acquire the handle for a particular device, based on its PCI bus id. Args: - pci_bus_id (str): The PCI bus id of the target GPU Accept the following formats (all numbers in hexadecimal): domain:bus:device.function in format x:x:x.x domain:bus:device in format x:x:x bus:device.function in format x:x.x. + pci_bus_id (str): The PCI bus id of the target GPU Accept the + following formats (all numbers in hexadecimal): + domain:bus:device.function in format x:x:x.x + domain:bus:device in format x:x:x bus:device.function in + format x:x.x. Returns: intptr_t: Reference in which to return the device handle. @@ -22033,7 +23220,8 @@ cpdef unsigned int device_get_index(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the NVML index of the device. + unsigned int: Reference in which to return the NVML index of + the device. .. seealso:: `nvmlDeviceGetIndex` """ @@ -22051,7 +23239,8 @@ cpdef str device_get_serial(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - char: Reference in which to return the board/module serial number. + char: Reference in which to return the board/module serial + number. .. seealso:: `nvmlDeviceGetSerial` """ @@ -22088,7 +23277,8 @@ cpdef object device_get_c2c_mode_info_v(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlC2cModeInfo_v1_t: Output struct containing the device's C2C Mode info. + nvmlC2cModeInfo_v1_t: Output struct containing the device's + C2C Mode info. .. seealso:: `nvmlDeviceGetC2cModeInfoV` """ @@ -22105,11 +23295,14 @@ cpdef object device_get_memory_affinity(intptr_t device, unsigned int node_set_s Args: device (intptr_t): The identifier of the target device. - node_set_size (unsigned int): The size of the node_set array that is safe to access. + node_set_size (unsigned int): The size of the node_set array + that is safe to access. scope (unsigned int): Scope that change the default behavior. Returns: - unsigned long: Array reference in which to return a bitmask of NODEs, 64 NODEs per unsigned long on 64-bit machines, 32 on 32-bit machines. + unsigned long: Array reference in which to return a bitmask of + NODEs, 64 NODEs per unsigned long on 64-bit machines, 32 + on 32-bit machines. .. seealso:: `nvmlDeviceGetMemoryAffinity` """ @@ -22128,11 +23321,14 @@ cpdef object device_get_cpu_affinity_within_scope(intptr_t device, unsigned int Args: device (intptr_t): The identifier of the target device. - cpu_set_size (unsigned int): The size of the cpu_set array that is safe to access. + cpu_set_size (unsigned int): The size of the cpu_set array + that is safe to access. scope (unsigned int): Scope that change the default behavior. Returns: - unsigned long: Array reference in which to return a bitmask of CPUs, 64 CPUs per unsigned long on 64-bit machines, 32 on 32-bit machines. + unsigned long: Array reference in which to return a bitmask of + CPUs, 64 CPUs per unsigned long on 64-bit machines, 32 on + 32-bit machines. .. seealso:: `nvmlDeviceGetCpuAffinityWithinScope` """ @@ -22151,10 +23347,13 @@ cpdef object device_get_cpu_affinity(intptr_t device, unsigned int cpu_set_size) Args: device (intptr_t): The identifier of the target device. - cpu_set_size (unsigned int): The size of the cpu_set array that is safe to access. + cpu_set_size (unsigned int): The size of the cpu_set array + that is safe to access. Returns: - unsigned long: Array reference in which to return a bitmask of CPUs, 64 CPUs per unsigned long on 64-bit machines, 32 on 32-bit machines. + unsigned long: Array reference in which to return a bitmask of + CPUs, 64 CPUs per unsigned long on 64-bit machines, 32 on + 32-bit machines. .. seealso:: `nvmlDeviceGetCpuAffinity` """ @@ -22237,10 +23436,12 @@ cpdef int device_get_p2p_status(intptr_t device1, intptr_t device2, int p2p_inde Args: device1 (intptr_t): The first device. device2 (intptr_t): The second device. - p2p_index (GpuP2PCapsIndex): p2p Capability Index being looked for between ``device1`` and ``device2``. + p2p_index (GpuP2PCapsIndex): p2p Capability Index being looked + for between ``device1`` and ``device2``. Returns: - int: Reference in which to return the status of the ``p2p_index`` between ``device1`` and ``device2``. + int: Reference in which to return the status of the + ``p2p_index`` between ``device1`` and ``device2``. .. seealso:: `nvmlDeviceGetP2PStatus` """ @@ -22277,7 +23478,8 @@ cpdef unsigned int device_get_minor_number(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the minor number for the device. + unsigned int: Reference in which to return the minor number + for the device. .. seealso:: `nvmlDeviceGetMinorNumber` """ @@ -22353,7 +23555,8 @@ cpdef unsigned int device_get_inforom_configuration_checksum(intptr_t device) ex device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the infoROM configuration checksum. + unsigned int: Reference in which to return the infoROM + configuration checksum. .. seealso:: `nvmlDeviceGetInforomConfigurationChecksum` """ @@ -22442,7 +23645,8 @@ cpdef int device_get_persistence_mode(intptr_t device) except? -1: device (intptr_t): The identifier of the target device. Returns: - int: Reference in which to return the current driver persistence mode. + int: Reference in which to return the current driver + persistence mode. .. seealso:: `nvmlDeviceGetPersistenceMode` """ @@ -22460,7 +23664,8 @@ cpdef object device_get_pci_info_ext(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlPciInfoExt_v1_t: Reference in which to return the PCI info. + nvmlPciInfoExt_v1_t: Reference in which to return the PCI + info. .. seealso:: `nvmlDeviceGetPciInfoExt` """ @@ -22499,7 +23704,8 @@ cpdef unsigned int device_get_max_pcie_link_generation(intptr_t device) except? device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the max PCIe link generation. + unsigned int: Reference in which to return the max PCIe link + generation. .. seealso:: `nvmlDeviceGetMaxPcieLinkGeneration` """ @@ -22517,7 +23723,8 @@ cpdef unsigned int device_get_gpu_max_pcie_link_generation(intptr_t device) exce device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the max PCIe link generation. + unsigned int: Reference in which to return the max PCIe link + generation. .. seealso:: `nvmlDeviceGetGpuMaxPcieLinkGeneration` """ @@ -22535,7 +23742,8 @@ cpdef unsigned int device_get_max_pcie_link_width(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the max PCIe link generation. + unsigned int: Reference in which to return the max PCIe link + generation. .. seealso:: `nvmlDeviceGetMaxPcieLinkWidth` """ @@ -22553,7 +23761,8 @@ cpdef unsigned int device_get_curr_pcie_link_generation(intptr_t device) except? device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the current PCIe link generation. + unsigned int: Reference in which to return the current PCIe + link generation. .. seealso:: `nvmlDeviceGetCurrPcieLinkGeneration` """ @@ -22571,7 +23780,8 @@ cpdef unsigned int device_get_curr_pcie_link_width(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the current PCIe link generation. + unsigned int: Reference in which to return the current PCIe + link generation. .. seealso:: `nvmlDeviceGetCurrPcieLinkWidth` """ @@ -22587,7 +23797,8 @@ cpdef unsigned int device_get_pcie_throughput(intptr_t device, int counter) exce Args: device (intptr_t): The identifier of the target device. - counter (PcieUtilCounter): The specific counter that should be queried ``nvmlPcieUtilCounter_t``. + counter (PcieUtilCounter): The specific counter that should be + queried ``nvmlPcieUtilCounter_t``. Returns: unsigned int: Reference in which to return throughput in KB/s. @@ -22608,7 +23819,8 @@ cpdef unsigned int device_get_pcie_replay_counter(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the counter's value. + unsigned int: Reference in which to return the counter's + value. .. seealso:: `nvmlDeviceGetPcieReplayCounter` """ @@ -22627,7 +23839,8 @@ cpdef unsigned int device_get_clock_info(intptr_t device, int type) except? 0: type (ClockType): Identify which clock domain to query. Returns: - unsigned int: Reference in which to return the clock speed in MHz. + unsigned int: Reference in which to return the clock speed in + MHz. .. seealso:: `nvmlDeviceGetClockInfo` """ @@ -22646,7 +23859,8 @@ cpdef unsigned int device_get_max_clock_info(intptr_t device, int type) except? type (ClockType): Identify which clock domain to query. Returns: - unsigned int: Reference in which to return the clock speed in MHz. + unsigned int: Reference in which to return the clock speed in + MHz. .. seealso:: `nvmlDeviceGetMaxClockInfo` """ @@ -22681,7 +23895,8 @@ cpdef unsigned int device_get_clock(intptr_t device, int clock_type, int clock_i Args: device (intptr_t): The identifier of the target device. clock_type (ClockType): Identify which clock domain to query. - clock_id (ClockId): Identify which clock in the domain to query. + clock_id (ClockId): Identify which clock in the domain to + query. Returns: unsigned int: Reference in which to return the clock in MHz. @@ -22744,7 +23959,8 @@ cpdef object device_get_supported_graphics_clocks(intptr_t device, unsigned int Args: device (intptr_t): The identifier of the target device. - memory_clock_m_hz (unsigned int): Memory clock for which to return possible graphics clocks. + memory_clock_m_hz (unsigned int): Memory clock for which to + return possible graphics clocks. Returns: unsigned int: Reference in which to return the clocks in MHz. @@ -22774,8 +23990,11 @@ cpdef tuple device_get_auto_boosted_clocks_enabled(intptr_t device): Returns: A 2-tuple containing: - - int: Where to store the current state of Auto Boosted clocks of the target device. - - int: Where to store the default Auto Boosted clocks behavior of the target device that the device will revert to when no applications are using the GPU. + - int: Where to store the current state of Auto Boosted clocks + of the target device. + - int: Where to store the default Auto Boosted clocks behavior + of the target device that the device will revert to when + no applications are using the GPU. .. seealso:: `nvmlDeviceGetAutoBoostedClocksEnabled` """ @@ -22794,7 +24013,8 @@ cpdef unsigned int device_get_fan_speed(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the fan speed percentage. + unsigned int: Reference in which to return the fan speed + percentage. .. seealso:: `nvmlDeviceGetFanSpeed` """ @@ -22813,7 +24033,8 @@ cpdef unsigned int device_get_fan_speed_v2(intptr_t device, unsigned int fan) ex fan (unsigned int): The index of the target fan, zero indexed. Returns: - unsigned int: Reference in which to return the fan speed percentage. + unsigned int: Reference in which to return the fan speed + percentage. .. seealso:: `nvmlDeviceGetFanSpeed_v2` """ @@ -22832,7 +24053,8 @@ cpdef unsigned int device_get_target_fan_speed(intptr_t device, unsigned int fan fan (unsigned int): The index of the target fan, zero indexed. Returns: - unsigned int: Reference in which to return the fan speed percentage. + unsigned int: Reference in which to return the fan speed + percentage. .. seealso:: `nvmlDeviceGetTargetFanSpeed` """ @@ -22873,7 +24095,8 @@ cpdef unsigned int device_get_fan_control_policy_v2(intptr_t device, unsigned in fan (unsigned int): The index of the target fan, zero indexed. Returns: - unsigned int: Reference in which to return the fan control ``policy``. + unsigned int: Reference in which to return the fan control + ``policy``. .. seealso:: `nvmlDeviceGetFanControlPolicy_v2` """ @@ -22909,7 +24132,9 @@ cpdef object device_get_cooler_info(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlCoolerInfo_v1_t: Structure specifying the cooler's control signal characteristics (out) and the target that cooler cools (out). + nvmlCoolerInfo_v1_t: Structure specifying the cooler's control + signal characteristics (out) and the target that cooler + cools (out). .. seealso:: `nvmlDeviceGetCoolerInfo` """ @@ -22927,10 +24152,12 @@ cpdef unsigned int device_get_temperature_threshold(intptr_t device, int thresho Args: device (intptr_t): The identifier of the target device. - threshold_type (TemperatureThresholds): The type of threshold value queried. + threshold_type (TemperatureThresholds): The type of threshold + value queried. Returns: - unsigned int: Reference in which to return the temperature reading. + unsigned int: Reference in which to return the temperature + reading. .. seealso:: `nvmlDeviceGetTemperatureThreshold` """ @@ -22949,7 +24176,8 @@ cpdef object device_get_thermal_settings(intptr_t device, unsigned int sensor_in sensor_index (unsigned int): The index of the thermal sensor. Returns: - nvmlGpuThermalSettings_t: Reference in which to return the thermal sensor information. + nvmlGpuThermalSettings_t: Reference in which to return the + thermal sensor information. .. seealso:: `nvmlDeviceGetThermalSettings` """ @@ -22968,7 +24196,8 @@ cpdef int device_get_performance_state(intptr_t device) except? -1: device (intptr_t): The identifier of the target device. Returns: - int: Reference in which to return the performance state reading. + int: Reference in which to return the performance state + reading. .. seealso:: `nvmlDeviceGetPerformanceState` """ @@ -22986,7 +24215,8 @@ cpdef unsigned long long device_get_current_clocks_event_reasons(intptr_t device device (intptr_t): The identifier of the target device. Returns: - unsigned long long: Reference in which to return bitmask of active clocks event reasons. + unsigned long long: Reference in which to return bitmask of + active clocks event reasons. .. seealso:: `nvmlDeviceGetCurrentClocksEventReasons` """ @@ -23004,7 +24234,8 @@ cpdef unsigned long long device_get_supported_clocks_event_reasons(intptr_t devi device (intptr_t): The identifier of the target device. Returns: - unsigned long long: Reference in which to return bitmask of supported clocks event reasons. + unsigned long long: Reference in which to return bitmask of + supported clocks event reasons. .. seealso:: `nvmlDeviceGetSupportedClocksEventReasons` """ @@ -23022,7 +24253,8 @@ cpdef int device_get_power_state(intptr_t device) except? -1: device (intptr_t): The identifier of the target device. Returns: - int: Reference in which to return the performance state reading. + int: Reference in which to return the performance state + reading. .. seealso:: `nvmlDeviceGetPowerState` """ @@ -23081,8 +24313,10 @@ cpdef tuple device_get_min_max_clock_of_p_state(intptr_t device, int type, int p Returns: A 2-tuple containing: - - unsigned int: Reference in which to return min clock frequency. - - unsigned int: Reference in which to return max clock frequency. + - unsigned int: Reference in which to return min clock + frequency. + - unsigned int: Reference in which to return max clock + frequency. .. seealso:: `nvmlDeviceGetMinMaxClockOfPState` """ @@ -23143,7 +24377,8 @@ cpdef device_set_clock_offsets(intptr_t device, intptr_t info): Args: device (intptr_t): The identifier of the target device. - info (intptr_t): Structure specifying the clock type (input), the pstate (input) and clock offset value (input). + info (intptr_t): Structure specifying the clock type (input), + the pstate (input) and clock offset value (input). .. seealso:: `nvmlDeviceSetClockOffsets` """ @@ -23159,7 +24394,8 @@ cpdef unsigned int device_get_power_management_limit(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the power management limit in milliwatts. + unsigned int: Reference in which to return the power + management limit in milliwatts. .. seealso:: `nvmlDeviceGetPowerManagementLimit` """ @@ -23179,8 +24415,10 @@ cpdef tuple device_get_power_management_limit_constraints(intptr_t device): Returns: A 2-tuple containing: - - unsigned int: Reference in which to return the minimum power management limit in milliwatts. - - unsigned int: Reference in which to return the maximum power management limit in milliwatts. + - unsigned int: Reference in which to return the minimum power + management limit in milliwatts. + - unsigned int: Reference in which to return the maximum power + management limit in milliwatts. .. seealso:: `nvmlDeviceGetPowerManagementLimitConstraints` """ @@ -23199,7 +24437,8 @@ cpdef unsigned int device_get_power_management_default_limit(intptr_t device) ex device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the default power management limit in milliwatts. + unsigned int: Reference in which to return the default power + management limit in milliwatts. .. seealso:: `nvmlDeviceGetPowerManagementDefaultLimit` """ @@ -23217,7 +24456,8 @@ cpdef unsigned int device_get_power_usage(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the power usage information. + unsigned int: Reference in which to return the power usage + information. .. seealso:: `nvmlDeviceGetPowerUsage` """ @@ -23235,7 +24475,8 @@ cpdef unsigned long long device_get_total_energy_consumption(intptr_t device) ex device (intptr_t): The identifier of the target device. Returns: - unsigned long long: Reference in which to return the energy consumption information. + unsigned long long: Reference in which to return the energy + consumption information. .. seealso:: `nvmlDeviceGetTotalEnergyConsumption` """ @@ -23253,7 +24494,8 @@ cpdef unsigned int device_get_enforced_power_limit(intptr_t device) except? 0: device (intptr_t): The device to communicate with. Returns: - unsigned int: Reference in which to return the power management limit in milliwatts. + unsigned int: Reference in which to return the power + management limit in milliwatts. .. seealso:: `nvmlDeviceGetEnforcedPowerLimit` """ @@ -23293,7 +24535,8 @@ cpdef object device_get_memory_info_v2(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlMemory_v2_t: Reference in which to return the memory information. + nvmlMemory_v2_t: Reference in which to return the memory + information. .. seealso:: `nvmlDeviceGetMemoryInfo_v2` """ @@ -23310,7 +24553,8 @@ cpdef int device_get_compute_mode(intptr_t device) except? -1: """Retrieves the current compute mode for the device or MIG device. Args: - device (intptr_t): The identifier of the target device handle or MIG device handle. + device (intptr_t): The identifier of the target device handle + or MIG device handle. Returns: int: Reference in which to return the current compute mode. @@ -23333,8 +24577,10 @@ cpdef tuple device_get_cuda_compute_capability(intptr_t device): Returns: A 2-tuple containing: - - int: Reference in which to return the major CUDA compute capability. - - int: Reference in which to return the minor CUDA compute capability. + - int: Reference in which to return the major CUDA compute + capability. + - int: Reference in which to return the minor CUDA compute + capability. .. seealso:: `nvmlDeviceGetCudaComputeCapability` """ @@ -23393,7 +24639,8 @@ cpdef unsigned int device_get_board_id(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return the device's board ID. + unsigned int: Reference in which to return the device's board + ID. .. seealso:: `nvmlDeviceGetBoardId` """ @@ -23411,7 +24658,9 @@ cpdef unsigned int device_get_multi_gpu_board(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return a zero or non-zero value to indicate whether the device is on a multi GPU board. + unsigned int: Reference in which to return a zero or non-zero + value to indicate whether the device is on a multi GPU + board. .. seealso:: `nvmlDeviceGetMultiGpuBoard` """ @@ -23427,11 +24676,14 @@ cpdef unsigned long long device_get_total_ecc_errors(intptr_t device, int error_ Args: device (intptr_t): The identifier of the target device. - error_type (MemoryErrorType): Flag that specifies the type of the errors. - counter_type (EccCounterType): Flag that specifies the counter-type of the errors. + error_type (MemoryErrorType): Flag that specifies the type of + the errors. + counter_type (EccCounterType): Flag that specifies the + counter-type of the errors. Returns: - unsigned long long: Reference in which to return the specified ECC errors. + unsigned long long: Reference in which to return the specified + ECC errors. .. seealso:: `nvmlDeviceGetTotalEccErrors` """ @@ -23447,12 +24699,16 @@ cpdef unsigned long long device_get_memory_error_counter(intptr_t device, int er Args: device (intptr_t): The identifier of the target device. - error_type (MemoryErrorType): Flag that specifies the type of error. - counter_type (EccCounterType): Flag that specifies the counter-type of the errors. - location_type (MemoryLocation): Specifies the location of the counter. + error_type (MemoryErrorType): Flag that specifies the type of + error. + counter_type (EccCounterType): Flag that specifies the + counter-type of the errors. + location_type (MemoryLocation): Specifies the location of the + counter. Returns: - unsigned long long: Reference in which to return the ECC counter. + unsigned long long: Reference in which to return the ECC + counter. .. seealso:: `nvmlDeviceGetMemoryErrorCounter` """ @@ -23470,7 +24726,8 @@ cpdef object device_get_utilization_rates(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlUtilization_t: Reference in which to return the utilization information. + nvmlUtilization_t: Reference in which to return the + utilization information. .. seealso:: `nvmlDeviceGetUtilizationRates` """ @@ -23491,8 +24748,10 @@ cpdef tuple device_get_encoder_utilization(intptr_t device): Returns: A 2-tuple containing: - - unsigned int: Reference to an unsigned int for encoder utilization info. - - unsigned int: Reference to an unsigned int for the sampling period in US. + - unsigned int: Reference to an unsigned int for encoder + utilization info. + - unsigned int: Reference to an unsigned int for the sampling + period in US. .. seealso:: `nvmlDeviceGetEncoderUtilization` """ @@ -23512,7 +24771,8 @@ cpdef unsigned int device_get_encoder_capacity(intptr_t device, int encoder_quer encoder_query_type (EncoderType): Type of encoder to query. Returns: - unsigned int: Reference to an unsigned int for the encoder capacity. + unsigned int: Reference to an unsigned int for the encoder + capacity. .. seealso:: `nvmlDeviceGetEncoderCapacity` """ @@ -23532,9 +24792,12 @@ cpdef tuple device_get_encoder_stats(intptr_t device): Returns: A 3-tuple containing: - - unsigned int: Reference to an unsigned int for count of active encoder sessions. - - unsigned int: Reference to an unsigned int for trailing average FPS of all active sessions. - - unsigned int: Reference to an unsigned int for encode latency in microseconds. + - unsigned int: Reference to an unsigned int for count of active + encoder sessions. + - unsigned int: Reference to an unsigned int for trailing + average FPS of all active sessions. + - unsigned int: Reference to an unsigned int for encode latency + in microseconds. .. seealso:: `nvmlDeviceGetEncoderStats` """ @@ -23554,7 +24817,8 @@ cpdef object device_get_encoder_sessions(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlEncoderSessionInfo_t: Reference in which to return the session information. + nvmlEncoderSessionInfo_t: Reference in which to return the + session information. .. seealso:: `nvmlDeviceGetEncoderSessions` """ @@ -23581,8 +24845,10 @@ cpdef tuple device_get_decoder_utilization(intptr_t device): Returns: A 2-tuple containing: - - unsigned int: Reference to an unsigned int for decoder utilization info. - - unsigned int: Reference to an unsigned int for the sampling period in US. + - unsigned int: Reference to an unsigned int for decoder + utilization info. + - unsigned int: Reference to an unsigned int for the sampling + period in US. .. seealso:: `nvmlDeviceGetDecoderUtilization` """ @@ -23603,8 +24869,10 @@ cpdef tuple device_get_jpg_utilization(intptr_t device): Returns: A 2-tuple containing: - - unsigned int: Reference to an unsigned int for jpg utilization info. - - unsigned int: Reference to an unsigned int for the sampling period in US. + - unsigned int: Reference to an unsigned int for jpg utilization + info. + - unsigned int: Reference to an unsigned int for the sampling + period in US. .. seealso:: `nvmlDeviceGetJpgUtilization` """ @@ -23625,8 +24893,10 @@ cpdef tuple device_get_ofa_utilization(intptr_t device): Returns: A 2-tuple containing: - - unsigned int: Reference to an unsigned int for ofa utilization info. - - unsigned int: Reference to an unsigned int for the sampling period in US. + - unsigned int: Reference to an unsigned int for ofa utilization + info. + - unsigned int: Reference to an unsigned int for the sampling + period in US. .. seealso:: `nvmlDeviceGetOfaUtilization` """ @@ -23645,7 +24915,8 @@ cpdef object device_get_fbc_stats(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlFBCStats_t: Reference to ``nvmlFBCStats_t`` structure containing NvFBC stats. + nvmlFBCStats_t: Reference to ``nvmlFBCStats_t`` structure + containing NvFBC stats. .. seealso:: `nvmlDeviceGetFBCStats` """ @@ -23664,7 +24935,8 @@ cpdef object device_get_fbc_sessions(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlFBCSessionInfo_t: Reference in which to return the session information. + nvmlFBCSessionInfo_t: Reference in which to return the session + information. .. seealso:: `nvmlDeviceGetFBCSessions` """ @@ -23730,7 +25002,8 @@ cpdef object device_get_bridge_chip_info(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlBridgeChipHierarchy_t: Reference to the returned bridge chip Hierarchy. + nvmlBridgeChipHierarchy_t: Reference to the returned bridge + chip Hierarchy. .. seealso:: `nvmlDeviceGetBridgeChipInfo` """ @@ -23749,7 +25022,8 @@ cpdef object device_get_compute_running_processes_v3(intptr_t device): device (intptr_t): The device handle or MIG device handle. Returns: - nvmlProcessInfo_t: Reference in which to return the process information. + nvmlProcessInfo_t: Reference in which to return the process + information. .. seealso:: `nvmlDeviceGetComputeRunningProcesses_v3` """ @@ -23774,7 +25048,8 @@ cpdef object device_get_graphics_running_processes_v3(intptr_t device): device (intptr_t): The device handle or MIG device handle. Returns: - nvmlProcessInfo_t: Reference in which to return the process information. + nvmlProcessInfo_t: Reference in which to return the process + information. .. seealso:: `nvmlDeviceGetGraphicsRunningProcesses_v3` """ @@ -23799,7 +25074,8 @@ cpdef object device_get_mps_compute_running_processes_v3(intptr_t device): device (intptr_t): The device handle or MIG device handle. Returns: - nvmlProcessInfo_t: Reference in which to return the process information. + nvmlProcessInfo_t: Reference in which to return the process + information. .. seealso:: `nvmlDeviceGetMPSComputeRunningProcesses_v3` """ @@ -23825,7 +25101,8 @@ cpdef int device_on_same_board(intptr_t device1, intptr_t device2) except? 0: device2 (intptr_t): The second GPU device. Returns: - int: Reference in which to return the status. Non-zero indicates that the GPUs are on the same board. + int: Reference in which to return the status. Non-zero + indicates that the GPUs are on the same board. .. seealso:: `nvmlDeviceOnSameBoard` """ @@ -23844,7 +25121,10 @@ cpdef int device_get_api_restriction(intptr_t device, int api_type) except? -1: api_type (RestrictedAPI): Target API type for this operation. Returns: - int: Reference in which to return the current restriction NVML_FEATURE_ENABLED indicates that the API is root-only NVML_FEATURE_DISABLED indicates that the API is accessible to all users. + int: Reference in which to return the current restriction + NVML_FEATURE_ENABLED indicates that the API is root-only + NVML_FEATURE_DISABLED indicates that the API is accessible + to all users. .. seealso:: `nvmlDeviceGetAPIRestriction` """ @@ -23862,7 +25142,8 @@ cpdef object device_get_bar1_memory_info(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlBAR1Memory_t: Reference in which BAR1 memory information is returned. + nvmlBAR1Memory_t: Reference in which BAR1 memory information + is returned. .. seealso:: `nvmlDeviceGetBAR1MemoryInfo` """ @@ -23881,7 +25162,8 @@ cpdef unsigned int device_get_irq_num(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: The interrupt number associated with the specified device. + unsigned int: The interrupt number associated with the + specified device. .. seealso:: `nvmlDeviceGetIrqNum` """ @@ -23989,7 +25271,9 @@ cpdef unsigned int device_get_adaptive_clock_info_status(intptr_t device) except device (intptr_t): The identifier of the target device. Returns: - unsigned int: The current adaptive clocking status, either NVML_ADAPTIVE_CLOCKING_INFO_STATUS_DISABLED or NVML_ADAPTIVE_CLOCKING_INFO_STATUS_ENABLED. + unsigned int: The current adaptive clocking status, either + NVML_ADAPTIVE_CLOCKING_INFO_STATUS_DISABLED or + NVML_ADAPTIVE_CLOCKING_INFO_STATUS_ENABLED. .. seealso:: `nvmlDeviceGetAdaptiveClockInfoStatus` """ @@ -24057,7 +25341,8 @@ cpdef object device_get_conf_compute_mem_size_info(intptr_t device): device (intptr_t): Device handle. Returns: - nvmlConfComputeMemSizeInfo_t: Protected/Unprotected Memory sizes. + nvmlConfComputeMemSizeInfo_t: Protected/Unprotected Memory + sizes. .. seealso:: `nvmlDeviceGetConfComputeMemSizeInfo` """ @@ -24073,7 +25358,9 @@ cpdef unsigned int system_get_conf_compute_gpus_ready_state() except? 0: """Get Conf Computing GPUs ready state. Returns: - unsigned int: Returns GPU current work accepting state, NVML_CC_ACCEPTING_CLIENT_REQUESTS_TRUE or NVML_CC_ACCEPTING_CLIENT_REQUESTS_FALSE. + unsigned int: Returns GPU current work accepting state, + NVML_CC_ACCEPTING_CLIENT_REQUESTS_TRUE or + NVML_CC_ACCEPTING_CLIENT_REQUESTS_FALSE. .. seealso:: `nvmlSystemGetConfComputeGpusReadyState` """ @@ -24091,7 +25378,8 @@ cpdef object device_get_conf_compute_protected_memory_usage(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlMemory_t: Reference in which to return the memory information. + nvmlMemory_t: Reference in which to return the memory + information. .. seealso:: `nvmlDeviceGetConfComputeProtectedMemoryUsage` """ @@ -24110,7 +25398,8 @@ cpdef object device_get_conf_compute_gpu_certificate(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlConfComputeGpuCertificate_t: Reference in which to return the gpu certificate information. + nvmlConfComputeGpuCertificate_t: Reference in which to return + the gpu certificate information. .. seealso:: `nvmlDeviceGetConfComputeGpuCertificate` """ @@ -24127,7 +25416,8 @@ cpdef device_set_conf_compute_unprotected_mem_size(intptr_t device, unsigned lon Args: device (intptr_t): Device Handle. - size_ki_b (unsigned long long): Unprotected Memory size to be set in KiB. + size_ki_b (unsigned long long): Unprotected Memory size to be + set in KiB. .. seealso:: `nvmlDeviceSetConfComputeUnprotectedMemSize` """ @@ -24140,7 +25430,9 @@ cpdef system_set_conf_compute_gpus_ready_state(unsigned int is_accepting_work): """Set Conf Computing GPUs ready state. Args: - is_accepting_work (unsigned int): GPU accepting new work, NVML_CC_ACCEPTING_CLIENT_REQUESTS_TRUE or NVML_CC_ACCEPTING_CLIENT_REQUESTS_FALSE. + is_accepting_work (unsigned int): GPU accepting new work, + NVML_CC_ACCEPTING_CLIENT_REQUESTS_TRUE or + NVML_CC_ACCEPTING_CLIENT_REQUESTS_FALSE. .. seealso:: `nvmlSystemSetConfComputeGpusReadyState` """ @@ -24194,7 +25486,8 @@ cpdef tuple device_get_gsp_firmware_mode(intptr_t device): A 2-tuple containing: - unsigned int: Pointer to specify if GSP firmware is enabled. - - unsigned int: Pointer to specify if GSP firmware is supported by default on ``device``. + - unsigned int: Pointer to specify if GSP firmware is supported + by default on ``device``. .. seealso:: `nvmlDeviceGetGspFirmwareMode` """ @@ -24249,10 +25542,12 @@ cpdef object device_get_accounting_stats(intptr_t device, unsigned int pid): Args: device (intptr_t): The identifier of the target device. - pid (unsigned int): Process Id of the target process to query stats for. + pid (unsigned int): Process Id of the target process to query + stats for. Returns: - nvmlAccountingStats_t: Reference in which to return the process's accounting stats. + nvmlAccountingStats_t: Reference in which to return the + process's accounting stats. .. seealso:: `nvmlDeviceGetAccountingStats` """ @@ -24271,7 +25566,8 @@ cpdef object device_get_accounting_pids(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to return list of process ids. + unsigned int: Reference in which to return list of process + ids. .. seealso:: `nvmlDeviceGetAccountingPids` """ @@ -24296,7 +25592,9 @@ cpdef unsigned int device_get_accounting_buffer_size(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference in which to provide the size (in number of elements) of the circular buffer for accounting stats. + unsigned int: Reference in which to provide the size (in + number of elements) of the circular buffer for accounting + stats. .. seealso:: `nvmlDeviceGetAccountingBufferSize` """ @@ -24312,7 +25610,8 @@ cpdef object device_get_retired_pages(intptr_t device, int cause): Args: device (intptr_t): The identifier of the target device. - cause (PageRetirementCause): Filter page addresses by cause of retirement. + cause (PageRetirementCause): Filter page addresses by cause of + retirement. Returns: unsigned long long: Buffer to write the page addresses into. @@ -24360,10 +25659,14 @@ cpdef tuple device_get_remapped_rows(intptr_t device): Returns: A 4-tuple containing: - - unsigned int: Reference for number of rows remapped due to correctable errors. - - unsigned int: Reference for number of rows remapped due to uncorrectable errors. - - unsigned int: Reference for whether or not remappings are pending. - - unsigned int: Reference that is set when a remapping has failed in the past. + - unsigned int: Reference for number of rows remapped due to + correctable errors. + - unsigned int: Reference for number of rows remapped due to + uncorrectable errors. + - unsigned int: Reference for whether or not remappings are + pending. + - unsigned int: Reference that is set when a remapping has + failed in the past. .. seealso:: `nvmlDeviceGetRemappedRows` """ @@ -24403,7 +25706,8 @@ cpdef unsigned int device_get_architecture(intptr_t device) except? 0: device (intptr_t): The identifier of the target device. Returns: - unsigned int: Reference where architecture is returned, if call successful. Set to NVML_DEVICE_ARCH_* upon success. + unsigned int: Reference where architecture is returned, if + call successful. Set to NVML_DEVICE_ARCH_* upon success. .. seealso:: `nvmlDeviceGetArchitecture` """ @@ -24421,7 +25725,8 @@ cpdef object device_get_clk_mon_status(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlClkMonStatus_t: Reference in which to return the clkmon fault status. + nvmlClkMonStatus_t: Reference in which to return the clkmon + fault status. .. seealso:: `nvmlDeviceGetClkMonStatus` """ @@ -24438,10 +25743,13 @@ cpdef object device_get_process_utilization(intptr_t device, unsigned long long Args: device (intptr_t): The identifier of the target device. - last_seen_time_stamp (unsigned long long): Return only samples with timestamp greater than last_seen_time_stamp. + last_seen_time_stamp (unsigned long long): Return only samples + with timestamp greater than last_seen_time_stamp. Returns: - nvmlProcessUtilizationSample_t: Pointer to caller-supplied buffer in which guest process utilization samples are returned. + nvmlProcessUtilizationSample_t: Pointer to caller-supplied + buffer in which guest process utilization samples are + returned. .. seealso:: `nvmlDeviceGetProcessUtilization` """ @@ -24491,7 +25799,8 @@ cpdef device_set_compute_mode(intptr_t device, int mode): """Set the compute mode for the device or MIG device. Args: - device (intptr_t): The identifier of the target device handle or MIG device handle. + device (intptr_t): The identifier of the target device handle + or MIG device handle. mode (ComputeMode): The target compute mode. .. seealso:: `nvmlDeviceSetComputeMode` @@ -24520,7 +25829,8 @@ cpdef device_clear_ecc_error_counts(intptr_t device, int counter_type): Args: device (intptr_t): The identifier of the target device. - counter_type (EccCounterType): Flag that indicates which type of errors should be cleared. + counter_type (EccCounterType): Flag that indicates which type + of errors should be cleared. .. seealso:: `nvmlDeviceClearEccErrorCounts` """ @@ -24549,8 +25859,10 @@ cpdef device_set_gpu_locked_clocks(intptr_t device, unsigned int min_gpu_clock_m Args: device (intptr_t): The identifier of the target device. - min_gpu_clock_m_hz (unsigned int): Requested minimum gpu clock in MHz. - max_gpu_clock_m_hz (unsigned int): Requested maximum gpu clock in MHz. + min_gpu_clock_m_hz (unsigned int): Requested minimum gpu clock + in MHz. + max_gpu_clock_m_hz (unsigned int): Requested maximum gpu clock + in MHz. .. seealso:: `nvmlDeviceSetGpuLockedClocks` """ @@ -24577,8 +25889,10 @@ cpdef device_set_memory_locked_clocks(intptr_t device, unsigned int min_mem_cloc Args: device (intptr_t): The identifier of the target device. - min_mem_clock_m_hz (unsigned int): Requested minimum memory clock in MHz. - max_mem_clock_m_hz (unsigned int): Requested maximum memory clock in MHz. + min_mem_clock_m_hz (unsigned int): Requested minimum memory + clock in MHz. + max_mem_clock_m_hz (unsigned int): Requested maximum memory + clock in MHz. .. seealso:: `nvmlDeviceSetMemoryLockedClocks` """ @@ -24605,7 +25919,8 @@ cpdef device_set_auto_boosted_clocks_enabled(intptr_t device, int enabled): Args: device (intptr_t): The identifier of the target device. - enabled (EnableState): What state to try to set Auto Boosted clocks of the target device to. + enabled (EnableState): What state to try to set Auto Boosted + clocks of the target device to. .. seealso:: `nvmlDeviceSetAutoBoostedClocksEnabled` """ @@ -24619,8 +25934,10 @@ cpdef device_set_default_auto_boosted_clocks_enabled(intptr_t device, int enable Args: device (intptr_t): The identifier of the target device. - enabled (EnableState): What state to try to set default Auto Boosted clocks of the target device to. - flags (unsigned int): Flags that change the default behavior. Currently Unused. + enabled (EnableState): What state to try to set default Auto + Boosted clocks of the target device to. + flags (unsigned int): Flags that change the default behavior. + Currently Unused. .. seealso:: `nvmlDeviceSetDefaultAutoBoostedClocksEnabled` """ @@ -24693,7 +26010,8 @@ cpdef device_set_fan_speed_v2(intptr_t device, unsigned int fan, unsigned int sp Args: device (intptr_t): The identifier of the target device. fan (unsigned int): The index of the fan, starting at zero. - speed (unsigned int): The target speed of the fan [0-100] in % of max speed. + speed (unsigned int): The target speed of the fan [0-100] in % + of max speed. .. seealso:: `nvmlDeviceSetFanSpeed_v2` """ @@ -24737,7 +26055,9 @@ cpdef int device_get_nvlink_state(intptr_t device, unsigned int link) except? -1 link (unsigned int): Specifies the NvLink link to be queried. Returns: - int: ``nvmlEnableState_t`` where NVML_FEATURE_ENABLED indicates that the link is active and NVML_FEATURE_DISABLED indicates it is inactive. + int: ``nvmlEnableState_t`` where NVML_FEATURE_ENABLED + indicates that the link is active and + NVML_FEATURE_DISABLED indicates it is inactive. .. seealso:: `nvmlDeviceGetNvLinkState` """ @@ -24756,7 +26076,8 @@ cpdef unsigned int device_get_nvlink_version(intptr_t device, unsigned int link) link (unsigned int): Specifies the NvLink link to be queried. Returns: - unsigned int: Requested NvLink version from ``nvmlNvlinkVersion_t``. + unsigned int: Requested NvLink version from + ``nvmlNvlinkVersion_t``. .. seealso:: `nvmlDeviceGetNvLinkVersion` """ @@ -24773,10 +26094,12 @@ cpdef unsigned int device_get_nvlink_capability(intptr_t device, unsigned int li Args: device (intptr_t): The identifier of the target device. link (unsigned int): Specifies the NvLink link to be queried. - capability (NvLinkCapability): Specifies the ``nvmlNvLinkCapability_t`` to be queried. + capability (NvLinkCapability): Specifies the + ``nvmlNvLinkCapability_t`` to be queried. Returns: - unsigned int: A boolean for the queried capability indicating that feature is available. + unsigned int: A boolean for the queried capability indicating + that feature is available. .. seealso:: `nvmlDeviceGetNvLinkCapability` """ @@ -24795,7 +26118,8 @@ cpdef object device_get_nvlink_remote_pci_info_v2(intptr_t device, unsigned int link (unsigned int): Specifies the NvLink link to be queried. Returns: - nvmlPciInfo_t: ``nvmlPciInfo_t`` of the remote node for the specified link. + nvmlPciInfo_t: ``nvmlPciInfo_t`` of the remote node for the + specified link. .. seealso:: `nvmlDeviceGetNvLinkRemotePciInfo_v2` """ @@ -24813,7 +26137,8 @@ cpdef unsigned long long device_get_nvlink_error_counter(intptr_t device, unsign Args: device (intptr_t): The identifier of the target device. link (unsigned int): Specifies the NvLink link to be queried. - counter (NvLinkErrorCounter): Specifies the NvLink counter to be queried. + counter (NvLinkErrorCounter): Specifies the NvLink counter to + be queried. Returns: unsigned long long: Returned counter value. @@ -24849,7 +26174,8 @@ cpdef int device_get_nvlink_remote_device_type(intptr_t device, unsigned int lin link (unsigned int): The NVLink link index on the target GPU. Returns: - int: Pointer in which the output remote device type is returned. + int: Pointer in which the output remote device type is + returned. .. seealso:: `nvmlDeviceGetNvLinkRemoteDeviceType` """ @@ -24895,7 +26221,8 @@ cpdef object device_get_nvlink_supported_bw_modes(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlNvlinkSupportedBwModes_v1_t: Reference to ``nvmlNvlinkSupportedBwModes_t``. + nvmlNvlinkSupportedBwModes_v1_t: Reference to + ``nvmlNvlinkSupportedBwModes_t``. .. seealso:: `nvmlDeviceGetNvlinkSupportedBwModes` """ @@ -24915,7 +26242,8 @@ cpdef object device_get_nvlink_bw_mode(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlNvlinkGetBwMode_v1_t: Reference to ``nvmlNvlinkGetBwMode_t``. + nvmlNvlinkGetBwMode_v1_t: Reference to + ``nvmlNvlinkGetBwMode_t``. .. seealso:: `nvmlDeviceGetNvlinkBwMode` """ @@ -24933,7 +26261,8 @@ cpdef device_set_nvlink_bw_mode(intptr_t device, intptr_t set_bw_mode): Args: device (intptr_t): The identifier of the target device. - set_bw_mode (intptr_t): Reference to ``nvmlNvlinkSetBwMode_t``. + set_bw_mode (intptr_t): Reference to + ``nvmlNvlinkSetBwMode_t``. .. seealso:: `nvmlDeviceSetNvlinkBwMode` """ @@ -24963,7 +26292,8 @@ cpdef device_register_events(intptr_t device, unsigned long long event_types, in Args: device (intptr_t): The identifier of the target device. - event_types (unsigned long long): Bitmask of ``Event Types`` to record. + event_types (unsigned long long): Bitmask of ``Event Types`` + to record. set (intptr_t): Set to which add new event types. .. seealso:: `nvmlDeviceRegisterEvents` @@ -24980,7 +26310,8 @@ cpdef unsigned long long device_get_supported_event_types(intptr_t device) excep device (intptr_t): The identifier of the target device. Returns: - unsigned long long: Reference in which to return bitmask of supported events. + unsigned long long: Reference in which to return bitmask of + supported events. .. seealso:: `nvmlDeviceGetSupportedEventTypes` """ @@ -24996,7 +26327,8 @@ cpdef object event_set_wait_v2(intptr_t set, unsigned int timeoutms): Args: set (intptr_t): Reference to set of events to wait on. - timeoutms (unsigned int): Maximum amount of wait time in milliseconds for registered event. + timeoutms (unsigned int): Maximum amount of wait time in + milliseconds for registered event. Returns: nvmlEventData_t: Reference in which to return event data. @@ -25028,8 +26360,10 @@ cpdef device_modify_drain_state(intptr_t pci_info, int new_state): """Modify the drain state of a GPU. This method forces a GPU to no longer accept new incoming requests. Any new NVML process will no longer see this GPU. Persistence mode for this GPU must be turned off before this call is made. Must be called as administrator. For Linux only. Args: - pci_info (intptr_t): The PCI address of the GPU drain state to be modified. - new_state (EnableState): The drain state that should be entered, see ``nvmlEnableState_t``. + pci_info (intptr_t): The PCI address of the GPU drain state to + be modified. + new_state (EnableState): The drain state that should be + entered, see ``nvmlEnableState_t``. .. seealso:: `nvmlDeviceModifyDrainState` """ @@ -25042,10 +26376,12 @@ cpdef int device_query_drain_state(intptr_t pci_info) except? -1: """Query the drain state of a GPU. This method is used to check if a GPU is in a currently draining state. For Linux only. Args: - pci_info (intptr_t): The PCI address of the GPU drain state to be queried. + pci_info (intptr_t): The PCI address of the GPU drain state to + be queried. Returns: - int: The current drain state for this GPU, see ``nvmlEnableState_t``. + int: The current drain state for this GPU, see + ``nvmlEnableState_t``. .. seealso:: `nvmlDeviceQueryDrainState` """ @@ -25061,8 +26397,10 @@ cpdef device_remove_gpu_v2(intptr_t pci_info, int gpu_state, int link_state): Args: pci_info (intptr_t): The PCI address of the GPU to be removed. - gpu_state (DetachGpuState): Whether the GPU is to be removed, from the OS see ``nvmlDetachGpuState_t``. - link_state (PcieLinkState): Requested upstream PCIe link state, see ``nvmlPcieLinkState_t``. + gpu_state (DetachGpuState): Whether the GPU is to be removed, + from the OS see ``nvmlDetachGpuState_t``. + link_state (PcieLinkState): Requested upstream PCIe link + state, see ``nvmlPcieLinkState_t``. .. seealso:: `nvmlDeviceRemoveGpu_v2` """ @@ -25075,7 +26413,8 @@ cpdef device_discover_gpus(intptr_t pci_info): """Request the OS and the NVIDIA kernel driver to rediscover a portion of the PCI subsystem looking for GPUs that were previously removed. The portion of the PCI tree can be narrowed by specifying a domain, bus, and device. If all are zeroes then the entire PCI tree will be searched. Please note that for long-running NVML processes the enumeration will change based on how many GPUs are discovered and where they are inserted in bus order. Args: - pci_info (intptr_t): The PCI tree to be searched. Only the domain, bus, and device fields are used in this call. + pci_info (intptr_t): The PCI tree to be searched. Only the + domain, bus, and device fields are used in this call. .. seealso:: `nvmlDeviceDiscoverGpus` """ @@ -25091,7 +26430,8 @@ cpdef int device_get_virtualization_mode(intptr_t device) except? -1: device (intptr_t): Identifier of the target device. Returns: - int: Reference to virtualization mode. One of NVML_GPU_VIRTUALIZATION_?. + int: Reference to virtualization mode. One of + ``NVML_GPU_VIRTUALIZATION_?``. .. seealso:: `nvmlDeviceGetVirtualizationMode` """ @@ -25125,7 +26465,8 @@ cpdef device_set_virtualization_mode(intptr_t device, int virtual_mode): Args: device (intptr_t): Identifier of the target device. - virtual_mode (GpuVirtualizationMode): virtualization mode. One of NVML_GPU_VIRTUALIZATION_?. + virtual_mode (GpuVirtualizationMode): virtualization mode. One + of ``NVML_GPU_VIRTUALIZATION_?``. .. seealso:: `nvmlDeviceSetVirtualizationMode` """ @@ -25141,7 +26482,8 @@ cpdef unsigned long long vgpu_type_get_gsp_heap_size(unsigned int vgpu_type_id) vgpu_type_id (unsigned int): Handle to vGPU type. Returns: - unsigned long long: Reference to return the GSP heap size value. + unsigned long long: Reference to return the GSP heap size + value. .. seealso:: `nvmlVgpuTypeGetGspHeapSize` """ @@ -25159,7 +26501,8 @@ cpdef unsigned long long vgpu_type_get_fb_reservation(unsigned int vgpu_type_id) vgpu_type_id (unsigned int): Handle to vGPU type. Returns: - unsigned long long: Reference to return the framebuffer reservation. + unsigned long long: Reference to return the framebuffer + reservation. .. seealso:: `nvmlVgpuTypeGetFbReservation` """ @@ -25175,7 +26518,8 @@ cpdef device_set_vgpu_capabilities(intptr_t device, int capability, int state): Args: device (intptr_t): The identifier of the target device. - capability (DeviceVgpuCapability): Specifies the ``nvmlDeviceVgpuCapability_t`` to be set. + capability (DeviceVgpuCapability): Specifies the + ``nvmlDeviceVgpuCapability_t`` to be set. state (EnableState): The target capability mode. .. seealso:: `nvmlDeviceSetVgpuCapabilities` @@ -25192,7 +26536,8 @@ cpdef object device_get_grid_licensable_features_v4(intptr_t device): device (intptr_t): Identifier of the target device. Returns: - nvmlGridLicensableFeatures_t: Pointer to structure in which vGPU software licensable features are returned. + nvmlGridLicensableFeatures_t: Pointer to structure in which + vGPU software licensable features are returned. .. seealso:: `nvmlDeviceGetGridLicensableFeatures_v4` """ @@ -25208,10 +26553,12 @@ cpdef unsigned int get_vgpu_driver_capabilities(int capability) except? 0: """Retrieve the requested vGPU driver capability. Args: - capability (VgpuDriverCapability): Specifies the ``nvmlVgpuDriverCapability_t`` to be queried. + capability (VgpuDriverCapability): Specifies the + ``nvmlVgpuDriverCapability_t`` to be queried. Returns: - unsigned int: A boolean for the queried capability indicating that feature is supported. + unsigned int: A boolean for the queried capability indicating + that feature is supported. .. seealso:: `nvmlGetVgpuDriverCapabilities` """ @@ -25227,10 +26574,12 @@ cpdef unsigned int device_get_vgpu_capabilities(intptr_t device, int capability) Args: device (intptr_t): The identifier of the target device. - capability (DeviceVgpuCapability): Specifies the ``nvmlDeviceVgpuCapability_t`` to be queried. + capability (DeviceVgpuCapability): Specifies the + ``nvmlDeviceVgpuCapability_t`` to be queried. Returns: - unsigned int: Specifies that the queried capability is supported, and also returns capability's data. + unsigned int: Specifies that the queried capability is + supported, and also returns capability's data. .. seealso:: `nvmlDeviceGetVgpuCapabilities` """ @@ -25293,8 +26642,10 @@ cpdef tuple vgpu_type_get_device_id(unsigned int vgpu_type_id): Returns: A 2-tuple containing: - - unsigned long long: Device ID and vendor ID of the device contained in single 32 bit value. - - unsigned long long: Subsystem ID and subsystem vendor ID of the device contained in single 32 bit value. + - unsigned long long: Device ID and vendor ID of the device + contained in single 32 bit value. + - unsigned long long: Subsystem ID and subsystem vendor ID of + the device contained in single 32 bit value. .. seealso:: `nvmlVgpuTypeGetDeviceID` """ @@ -25347,13 +26698,16 @@ cpdef tuple vgpu_type_get_resolution(unsigned int vgpu_type_id, unsigned int dis Args: vgpu_type_id (unsigned int): Handle to vGPU type. - display_index (unsigned int): Zero-based index of display head. + display_index (unsigned int): Zero-based index of display + head. Returns: A 2-tuple containing: - - unsigned int: Pointer to maximum number of pixels in X dimension. - - unsigned int: Pointer to maximum number of pixels in Y dimension. + - unsigned int: Pointer to maximum number of pixels in X + dimension. + - unsigned int: Pointer to maximum number of pixels in Y + dimension. .. seealso:: `nvmlVgpuTypeGetResolution` """ @@ -25410,7 +26764,8 @@ cpdef unsigned int vgpu_type_get_max_instances(intptr_t device, unsigned int vgp vgpu_type_id (unsigned int): Handle to vGPU type. Returns: - unsigned int: Pointer to get the max number of vGPU instances that can be created on a deicve for given vgpu_type_id. + unsigned int: Pointer to get the max number of vGPU instances + that can be created on a deicve for given vgpu_type_id. .. seealso:: `nvmlVgpuTypeGetMaxInstances` """ @@ -25428,7 +26783,8 @@ cpdef unsigned int vgpu_type_get_max_instances_per_vm(unsigned int vgpu_type_id) vgpu_type_id (unsigned int): Handle to vGPU type. Returns: - unsigned int: Pointer to get the max number of vGPU instances supported per VM for given ``vgpu_type_id``. + unsigned int: Pointer to get the max number of vGPU instances + supported per VM for given ``vgpu_type_id``. .. seealso:: `nvmlVgpuTypeGetMaxInstancesPerVm` """ @@ -25446,7 +26802,8 @@ cpdef object vgpu_type_get_bar1_info(unsigned int vgpu_type_id): vgpu_type_id (unsigned int): Handle to vGPU type. Returns: - nvmlVgpuTypeBar1Info_v1_t: Pointer to the vGPU type BAR1 information structure ``nvmlVgpuTypeBar1Info_t``. + nvmlVgpuTypeBar1Info_v1_t: Pointer to the vGPU type BAR1 + information structure ``nvmlVgpuTypeBar1Info_t``. .. seealso:: `nvmlVgpuTypeGetBAR1Info` """ @@ -25463,7 +26820,8 @@ cpdef str vgpu_instance_get_uuid(unsigned int vgpu_instance): """Retrieve the UUID of a vGPU instance. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: char: Pointer to caller-supplied buffer to hold vGPU UUID. @@ -25482,7 +26840,8 @@ cpdef str vgpu_instance_get_vm_driver_version(unsigned int vgpu_instance): """Retrieve the NVIDIA driver version installed in the VM associated with a vGPU. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: char: Caller-supplied buffer to return driver version string. @@ -25501,7 +26860,8 @@ cpdef unsigned long long vgpu_instance_get_fb_usage(unsigned int vgpu_instance) """Retrieve the framebuffer usage in bytes. Args: - vgpu_instance (unsigned int): The identifier of the target instance. + vgpu_instance (unsigned int): The identifier of the target + instance. Returns: unsigned long long: Pointer to framebuffer usage in bytes. @@ -25519,7 +26879,8 @@ cpdef unsigned int vgpu_instance_get_license_status(unsigned int vgpu_instance) """[Deprecated]. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: unsigned int: Reference to return the licensing status. @@ -25537,7 +26898,8 @@ cpdef unsigned int vgpu_instance_get_type(unsigned int vgpu_instance) except? 0: """Retrieve the vGPU type of a vGPU instance. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: unsigned int: Reference to return the vgpu_type_id. @@ -25555,7 +26917,8 @@ cpdef unsigned int vgpu_instance_get_frame_rate_limit(unsigned int vgpu_instance """Retrieve the frame rate limit set for the vGPU instance. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: unsigned int: Reference to return the frame rate limit. @@ -25573,7 +26936,8 @@ cpdef int vgpu_instance_get_ecc_mode(unsigned int vgpu_instance) except? -1: """Retrieve the current ECC mode of vGPU instance. Args: - vgpu_instance (unsigned int): The identifier of the target vGPU instance. + vgpu_instance (unsigned int): The identifier of the target + vGPU instance. Returns: int: Reference in which to return the current ECC mode. @@ -25591,10 +26955,12 @@ cpdef unsigned int vgpu_instance_get_encoder_capacity(unsigned int vgpu_instance """Retrieve the encoder capacity of a vGPU instance, as a percentage of maximum encoder capacity with valid values in the range 0-100. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: - unsigned int: Reference to an unsigned int for the encoder capacity. + unsigned int: Reference to an unsigned int for the encoder + capacity. .. seealso:: `nvmlVgpuInstanceGetEncoderCapacity` """ @@ -25609,8 +26975,10 @@ cpdef vgpu_instance_set_encoder_capacity(unsigned int vgpu_instance, unsigned in """Set the encoder capacity of a vGPU instance, as a percentage of maximum encoder capacity with valid values in the range 0-100. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. - encoder_capacity (unsigned int): Unsigned int for the encoder capacity value. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. + encoder_capacity (unsigned int): Unsigned int for the encoder + capacity value. .. seealso:: `nvmlVgpuInstanceSetEncoderCapacity` """ @@ -25623,14 +26991,18 @@ cpdef tuple vgpu_instance_get_encoder_stats(unsigned int vgpu_instance): """Retrieves the current encoder statistics of a vGPU Instance. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: A 3-tuple containing: - - unsigned int: Reference to an unsigned int for count of active encoder sessions. - - unsigned int: Reference to an unsigned int for trailing average FPS of all active sessions. - - unsigned int: Reference to an unsigned int for encode latency in microseconds. + - unsigned int: Reference to an unsigned int for count of active + encoder sessions. + - unsigned int: Reference to an unsigned int for trailing + average FPS of all active sessions. + - unsigned int: Reference to an unsigned int for encode latency + in microseconds. .. seealso:: `nvmlVgpuInstanceGetEncoderStats` """ @@ -25647,10 +27019,12 @@ cpdef object vgpu_instance_get_encoder_sessions(unsigned int vgpu_instance): """Retrieves information about all active encoder sessions on a vGPU Instance. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: - nvmlEncoderSessionInfo_t: Reference to caller supplied array in which the list of session information us returned. + nvmlEncoderSessionInfo_t: Reference to caller supplied array + in which the list of session information us returned. .. seealso:: `nvmlVgpuInstanceGetEncoderSessions` """ @@ -25672,10 +27046,12 @@ cpdef object vgpu_instance_get_fbc_stats(unsigned int vgpu_instance): """Retrieves the active frame buffer capture sessions statistics of a vGPU Instance. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: - nvmlFBCStats_t: Reference to ``nvmlFBCStats_t`` structure containing NvFBC stats. + nvmlFBCStats_t: Reference to ``nvmlFBCStats_t`` structure + containing NvFBC stats. .. seealso:: `nvmlVgpuInstanceGetFBCStats` """ @@ -25691,10 +27067,12 @@ cpdef object vgpu_instance_get_fbc_sessions(unsigned int vgpu_instance): """Retrieves information about active frame buffer capture sessions on a vGPU Instance. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: - nvmlFBCSessionInfo_t: Reference in which to return the session information. + nvmlFBCSessionInfo_t: Reference in which to return the session + information. .. seealso:: `nvmlVgpuInstanceGetFBCSessions` """ @@ -25716,7 +27094,8 @@ cpdef unsigned int vgpu_instance_get_gpu_instance_id(unsigned int vgpu_instance) """Retrieve the GPU Instance ID for the given vGPU Instance. The API will return a valid GPU Instance ID for MIG backed vGPU Instance, else INVALID_GPU_INSTANCE_ID is returned. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: unsigned int: GPU Instance ID. @@ -25734,7 +27113,8 @@ cpdef str vgpu_instance_get_gpu_pci_id(unsigned int vgpu_instance): """Retrieves the PCI Id of the given vGPU Instance i.e. the PCI Id of the GPU as seen inside the VM. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: char: Caller-supplied buffer to return vGPU PCI Id string. @@ -25760,10 +27140,12 @@ cpdef unsigned int vgpu_type_get_capabilities(unsigned int vgpu_type_id, int cap Args: vgpu_type_id (unsigned int): Handle to vGPU type. - capability (VgpuCapability): Specifies the ``nvmlVgpuCapability_t`` to be queried. + capability (VgpuCapability): Specifies the + ``nvmlVgpuCapability_t`` to be queried. Returns: - unsigned int: A boolean for the queried capability indicating that feature is supported. + unsigned int: A boolean for the queried capability indicating + that feature is supported. .. seealso:: `nvmlVgpuTypeGetCapabilities` """ @@ -25778,7 +27160,8 @@ cpdef str vgpu_instance_get_mdev_uuid(unsigned int vgpu_instance): """Retrieve the MDEV UUID of a vGPU instance. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: char: Pointer to caller-supplied buffer to hold MDEV UUID. @@ -25798,7 +27181,8 @@ cpdef gpu_instance_set_vgpu_scheduler_state(intptr_t gpu_instance, intptr_t p_sc Args: gpu_instance (intptr_t): The GPU instance handle. - p_scheduler (intptr_t): Pointer to the caller-provided structure of ``nvmlVgpuSchedulerState_t``. + p_scheduler (intptr_t): Pointer to the caller-provided + structure of ``nvmlVgpuSchedulerState_t``. .. seealso:: `nvmlGpuInstanceSetVgpuSchedulerState` """ @@ -25815,7 +27199,8 @@ cpdef object gpu_instance_get_vgpu_scheduler_state(intptr_t gpu_instance): gpu_instance (intptr_t): The GPU instance handle. Returns: - nvmlVgpuSchedulerStateInfo_v1_t: Reference in which ``p_scheduler_state_info`` is returned. + nvmlVgpuSchedulerStateInfo_v1_t: Reference in which + ``p_scheduler_state_info`` is returned. .. seealso:: `nvmlGpuInstanceGetVgpuSchedulerState` """ @@ -25835,7 +27220,8 @@ cpdef object gpu_instance_get_vgpu_scheduler_log(intptr_t gpu_instance): gpu_instance (intptr_t): The GPU instance handle. Returns: - nvmlVgpuSchedulerLogInfo_v1_t: Reference in which ``p_scheduler_log_info`` is written. + nvmlVgpuSchedulerLogInfo_v1_t: Reference in which + ``p_scheduler_log_info`` is written. .. seealso:: `nvmlGpuInstanceGetVgpuSchedulerLog` """ @@ -25855,7 +27241,8 @@ cpdef str device_get_pgpu_metadata_string(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - char: Pointer to caller-supplied buffer into which ``pgpu_metadata`` is written. + char: Pointer to caller-supplied buffer into which + ``pgpu_metadata`` is written. .. seealso:: `nvmlDeviceGetPgpuMetadataString` """ @@ -25880,7 +27267,8 @@ cpdef object device_get_vgpu_scheduler_log(intptr_t device): device (intptr_t): The identifier of the target ``device``. Returns: - nvmlVgpuSchedulerLog_t: Reference in which ``p_scheduler_log`` is written. + nvmlVgpuSchedulerLog_t: Reference in which ``p_scheduler_log`` + is written. .. seealso:: `nvmlDeviceGetVgpuSchedulerLog` """ @@ -25899,7 +27287,8 @@ cpdef object device_get_vgpu_scheduler_state(intptr_t device): device (intptr_t): The identifier of the target ``device``. Returns: - nvmlVgpuSchedulerGetState_t: Reference in which ``p_scheduler_state`` is returned. + nvmlVgpuSchedulerGetState_t: Reference in which + ``p_scheduler_state`` is returned. .. seealso:: `nvmlDeviceGetVgpuSchedulerState` """ @@ -25918,7 +27307,8 @@ cpdef object device_get_vgpu_scheduler_capabilities(intptr_t device): device (intptr_t): The identifier of the target ``device``. Returns: - nvmlVgpuSchedulerCapabilities_t: Reference in which ``p_capabilities`` is written. + nvmlVgpuSchedulerCapabilities_t: Reference in which + ``p_capabilities`` is written. .. seealso:: `nvmlDeviceGetVgpuSchedulerCapabilities` """ @@ -25935,7 +27325,8 @@ cpdef device_set_vgpu_scheduler_state(intptr_t device, intptr_t p_scheduler_stat Args: device (intptr_t): The identifier of the target ``device``. - p_scheduler_state (intptr_t): vGPU ``p_scheduler_state`` to set. + p_scheduler_state (intptr_t): vGPU ``p_scheduler_state`` to + set. .. seealso:: `nvmlDeviceSetVgpuSchedulerState` """ @@ -25948,7 +27339,8 @@ cpdef set_vgpu_version(intptr_t vgpu_version): """Override the preset range of vGPU versions supported by the NVIDIA vGPU Manager with a range set by an administrator. Args: - vgpu_version (intptr_t): Pointer to a caller-supplied range of supported vGPU versions. + vgpu_version (intptr_t): Pointer to a caller-supplied range of + supported vGPU versions. .. seealso:: `nvmlSetVgpuVersion` """ @@ -25962,13 +27354,17 @@ cpdef tuple device_get_vgpu_process_utilization(intptr_t device, unsigned long l Args: device (intptr_t): The identifier for the target device. - last_seen_time_stamp (unsigned long long): Return only samples with timestamp greater than last_seen_time_stamp. + last_seen_time_stamp (unsigned long long): Return only samples + with timestamp greater than last_seen_time_stamp. Returns: A 2-tuple containing: - - unsigned int: Pointer to caller-supplied array size, and returns number of processes running on vGPU instances. - - nvmlVgpuProcessUtilizationSample_t: Pointer to caller-supplied buffer in which vGPU sub process utilization samples are returned. + - unsigned int: Pointer to caller-supplied array size, and + returns number of processes running on vGPU instances. + - nvmlVgpuProcessUtilizationSample_t: Pointer to caller-supplied + buffer in which vGPU sub process utilization samples are + returned. .. seealso:: `nvmlDeviceGetVgpuProcessUtilization` """ @@ -25984,7 +27380,8 @@ cpdef int vgpu_instance_get_accounting_mode(unsigned int vgpu_instance) except? """Queries the state of per process accounting mode on vGPU. Args: - vgpu_instance (unsigned int): The identifier of the target vGPU instance. + vgpu_instance (unsigned int): The identifier of the target + vGPU instance. Returns: int: Reference in which to return the current accounting mode. @@ -26002,10 +27399,12 @@ cpdef object vgpu_instance_get_accounting_pids(unsigned int vgpu_instance): """Queries list of processes running on vGPU that can be queried for accounting stats. The list of processes returned can be in running or terminated state. Args: - vgpu_instance (unsigned int): The identifier of the target vGPU instance. + vgpu_instance (unsigned int): The identifier of the target + vGPU instance. Returns: - unsigned int: Reference in which to return list of process ids. + unsigned int: Reference in which to return list of process + ids. .. seealso:: `nvmlVgpuInstanceGetAccountingPids` """ @@ -26027,11 +27426,14 @@ cpdef object vgpu_instance_get_accounting_stats(unsigned int vgpu_instance, unsi """Queries process's accounting stats. Args: - vgpu_instance (unsigned int): The identifier of the target vGPU instance. - pid (unsigned int): Process Id of the target process to query stats for. + vgpu_instance (unsigned int): The identifier of the target + vGPU instance. + pid (unsigned int): Process Id of the target process to query + stats for. Returns: - nvmlAccountingStats_t: Reference in which to return the process's accounting stats. + nvmlAccountingStats_t: Reference in which to return the + process's accounting stats. .. seealso:: `nvmlVgpuInstanceGetAccountingStats` """ @@ -26047,7 +27449,8 @@ cpdef vgpu_instance_clear_accounting_pids(unsigned int vgpu_instance): """Clears accounting information of the vGPU instance that have already terminated. Args: - vgpu_instance (unsigned int): The identifier of the target vGPU instance. + vgpu_instance (unsigned int): The identifier of the target + vGPU instance. .. seealso:: `nvmlVgpuInstanceClearAccountingPids` """ @@ -26060,10 +27463,12 @@ cpdef object vgpu_instance_get_license_info_v2(unsigned int vgpu_instance): """Query the license information of the vGPU instance. Args: - vgpu_instance (unsigned int): Identifier of the target vGPU instance. + vgpu_instance (unsigned int): Identifier of the target vGPU + instance. Returns: - nvmlVgpuLicenseInfo_t: Pointer to vGPU license information structure. + nvmlVgpuLicenseInfo_t: Pointer to vGPU license information + structure. .. seealso:: `nvmlVgpuInstanceGetLicenseInfo_v2` """ @@ -26079,7 +27484,8 @@ cpdef unsigned int get_excluded_device_count() except? 0: """Retrieves the number of excluded GPU devices in the system. Returns: - unsigned int: Reference in which to return the number of excluded devices. + unsigned int: Reference in which to return the number of + excluded devices. .. seealso:: `nvmlGetExcludedDeviceCount` """ @@ -26094,10 +27500,12 @@ cpdef object get_excluded_device_info_by_index(unsigned int index): """Acquire the device information for an excluded GPU device, based on its index. Args: - index (unsigned int): The index of the target GPU, >= 0 and < ``deviceCount``. + index (unsigned int): The index of the target GPU, >= 0 and < + ``deviceCount``. Returns: - nvmlExcludedDeviceInfo_t: Reference in which to return the device information. + nvmlExcludedDeviceInfo_t: Reference in which to return the + device information. .. seealso:: `nvmlGetExcludedDeviceInfoByIndex` """ @@ -26114,7 +27522,8 @@ cpdef int device_set_mig_mode(intptr_t device, unsigned int mode) except? -1: Args: device (intptr_t): The identifier of the target device. - mode (unsigned int): The mode to be set, ``NVML_DEVICE_MIG_DISABLE`` or ``NVML_DEVICE_MIG_ENABLE``. + mode (unsigned int): The mode to be set, + ``NVML_DEVICE_MIG_DISABLE`` or ``NVML_DEVICE_MIG_ENABLE``. Returns: int: The activation_status status. @@ -26137,8 +27546,10 @@ cpdef tuple device_get_mig_mode(intptr_t device): Returns: A 2-tuple containing: - - unsigned int: Returns the current mode, ``NVML_DEVICE_MIG_DISABLE`` or ``NVML_DEVICE_MIG_ENABLE``. - - unsigned int: Returns the pending mode, ``NVML_DEVICE_MIG_DISABLE`` or ``NVML_DEVICE_MIG_ENABLE``. + - unsigned int: Returns the current mode, + ``NVML_DEVICE_MIG_DISABLE`` or ``NVML_DEVICE_MIG_ENABLE``. + - unsigned int: Returns the pending mode, + ``NVML_DEVICE_MIG_DISABLE`` or ``NVML_DEVICE_MIG_ENABLE``. .. seealso:: `nvmlDeviceGetMigMode` """ @@ -26155,10 +27566,15 @@ cpdef object device_get_gpu_instance_possible_placements_v2(intptr_t device, uns Args: device (intptr_t): The identifier of the target device. - profile_id (unsigned int): The GPU instance profile ID. See ``nvmlDeviceGetGpuInstanceProfileInfo``. + profile_id (unsigned int): The GPU instance profile ID. See + ``nvmlDeviceGetGpuInstanceProfileInfo``. Returns: - nvmlGpuInstancePlacement_t: Returns placements allowed for the profile. Can be NULL to discover number of allowed placements for this profile. If non-NULL must be large enough to accommodate the placements supported by the profile. + nvmlGpuInstancePlacement_t: Returns placements allowed for the + profile. Can be NULL to discover number of allowed + placements for this profile. If non-NULL must be large + enough to accommodate the placements supported by the + profile. .. seealso:: `nvmlDeviceGetGpuInstancePossiblePlacements_v2` """ @@ -26181,10 +27597,12 @@ cpdef unsigned int device_get_gpu_instance_remaining_capacity(intptr_t device, u Args: device (intptr_t): The identifier of the target device. - profile_id (unsigned int): The GPU instance profile ID. See ``nvmlDeviceGetGpuInstanceProfileInfo``. + profile_id (unsigned int): The GPU instance profile ID. See + ``nvmlDeviceGetGpuInstanceProfileInfo``. Returns: - unsigned int: Returns remaining instance count for the profile ID. + unsigned int: Returns remaining instance count for the profile + ID. .. seealso:: `nvmlDeviceGetGpuInstanceRemainingCapacity` """ @@ -26200,7 +27618,8 @@ cpdef intptr_t device_create_gpu_instance(intptr_t device, unsigned int profile_ Args: device (intptr_t): The identifier of the target device. - profile_id (unsigned int): The GPU instance profile ID. See ``nvmlDeviceGetGpuInstanceProfileInfo``. + profile_id (unsigned int): The GPU instance profile ID. See + ``nvmlDeviceGetGpuInstanceProfileInfo``. Returns: intptr_t: Returns the GPU instance handle. @@ -26219,8 +27638,10 @@ cpdef intptr_t device_create_gpu_instance_with_placement(intptr_t device, unsign Args: device (intptr_t): The identifier of the target device. - profile_id (unsigned int): The GPU instance profile ID. See ``nvmlDeviceGetGpuInstanceProfileInfo``. - placement (intptr_t): The requested placement. See ``nvmlDeviceGetGpuInstancePossiblePlacements_v2``. + profile_id (unsigned int): The GPU instance profile ID. See + ``nvmlDeviceGetGpuInstanceProfileInfo``. + placement (intptr_t): The requested placement. See + ``nvmlDeviceGetGpuInstancePossiblePlacements_v2``. Returns: intptr_t: Returns the GPU instance handle. @@ -26289,12 +27710,16 @@ cpdef object gpu_instance_get_compute_instance_profile_info_v(intptr_t gpu_insta """Versioned wrapper around ``nvmlGpuInstanceGetComputeInstanceProfileInfo`` that accepts a versioned ``nvmlComputeInstanceProfileInfo_v2_t`` or later output structure. Args: - gpu_instance (intptr_t): The identifier of the target GPU instance. - profile (unsigned int): One of the NVML_COMPUTE_INSTANCE_PROFILE_*. - eng_profile (unsigned int): One of the NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_*. + gpu_instance (intptr_t): The identifier of the target GPU + instance. + profile (unsigned int): One of the + NVML_COMPUTE_INSTANCE_PROFILE_*. + eng_profile (unsigned int): One of the + NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_*. Returns: - nvmlComputeInstanceProfileInfo_v2_t: Returns detailed profile information. + nvmlComputeInstanceProfileInfo_v2_t: Returns detailed profile + information. .. seealso:: `nvmlGpuInstanceGetComputeInstanceProfileInfoV` """ @@ -26311,11 +27736,14 @@ cpdef unsigned int gpu_instance_get_compute_instance_remaining_capacity(intptr_t """Get compute instance profile capacity. Args: - gpu_instance (intptr_t): The identifier of the target GPU instance. - profile_id (unsigned int): The compute instance profile ID. See ``nvmlGpuInstanceGetComputeInstanceProfileInfo``. + gpu_instance (intptr_t): The identifier of the target GPU + instance. + profile_id (unsigned int): The compute instance profile ID. + See ``nvmlGpuInstanceGetComputeInstanceProfileInfo``. Returns: - unsigned int: Returns remaining instance count for the profile ID. + unsigned int: Returns remaining instance count for the profile + ID. .. seealso:: `nvmlGpuInstanceGetComputeInstanceRemainingCapacity` """ @@ -26330,11 +27758,17 @@ cpdef object gpu_instance_get_compute_instance_possible_placements(intptr_t gpu_ """Get compute instance placements. Args: - gpu_instance (intptr_t): The identifier of the target GPU instance. - profile_id (unsigned int): The compute instance profile ID. See ``nvmlGpuInstanceGetComputeInstanceProfileInfo``. + gpu_instance (intptr_t): The identifier of the target GPU + instance. + profile_id (unsigned int): The compute instance profile ID. + See ``nvmlGpuInstanceGetComputeInstanceProfileInfo``. Returns: - nvmlComputeInstancePlacement_t: Returns placements allowed for the profile. Can be NULL to discover number of allowed placements for this profile. If non-NULL must be large enough to accommodate the placements supported by the profile. + nvmlComputeInstancePlacement_t: Returns placements allowed for + the profile. Can be NULL to discover number of allowed + placements for this profile. If non-NULL must be large + enough to accommodate the placements supported by the + profile. .. seealso:: `nvmlGpuInstanceGetComputeInstancePossiblePlacements` """ @@ -26356,8 +27790,10 @@ cpdef intptr_t gpu_instance_create_compute_instance(intptr_t gpu_instance, unsig """Create compute instance. Args: - gpu_instance (intptr_t): The identifier of the target GPU instance. - profile_id (unsigned int): The compute instance profile ID. See ``nvmlGpuInstanceGetComputeInstanceProfileInfo``. + gpu_instance (intptr_t): The identifier of the target GPU + instance. + profile_id (unsigned int): The compute instance profile ID. + See ``nvmlGpuInstanceGetComputeInstanceProfileInfo``. Returns: intptr_t: Returns the compute instance handle. @@ -26375,9 +27811,12 @@ cpdef intptr_t gpu_instance_create_compute_instance_with_placement(intptr_t gpu_ """Create compute instance with the specified placement. Args: - gpu_instance (intptr_t): The identifier of the target GPU instance. - profile_id (unsigned int): The compute instance profile ID. See ``nvmlGpuInstanceGetComputeInstanceProfileInfo``. - placement (intptr_t): The requested placement. See ``nvmlGpuInstanceGetComputeInstancePossiblePlacements``. + gpu_instance (intptr_t): The identifier of the target GPU + instance. + profile_id (unsigned int): The compute instance profile ID. + See ``nvmlGpuInstanceGetComputeInstanceProfileInfo``. + placement (intptr_t): The requested placement. See + ``nvmlGpuInstanceGetComputeInstancePossiblePlacements``. Returns: intptr_t: Returns the compute instance handle. @@ -26408,7 +27847,8 @@ cpdef intptr_t gpu_instance_get_compute_instance_by_id(intptr_t gpu_instance, un """Get compute instance for given instance ID. Args: - gpu_instance (intptr_t): The identifier of the target GPU instance. + gpu_instance (intptr_t): The identifier of the target GPU + instance. id (unsigned int): The compute instance ID. Returns: @@ -26430,7 +27870,8 @@ cpdef object compute_instance_get_info_v2(intptr_t compute_instance): compute_instance (intptr_t): The compute instance handle. Returns: - nvmlComputeInstanceInfo_t: Return compute instance information. + nvmlComputeInstanceInfo_t: Return compute instance + information. .. seealso:: `nvmlComputeInstanceGetInfo_v2` """ @@ -26556,7 +27997,10 @@ cpdef device_power_smoothing_activate_preset_profile(intptr_t device, intptr_t p Args: device (intptr_t): The identifier of the target device. - profile (intptr_t): Reference to ``nvmlPowerSmoothingProfile_v1_t``. Note that only ``profile->profileId`` is used and the rest of the structure is ignored. + profile (intptr_t): Reference to + ``nvmlPowerSmoothingProfile_v1_t``. Note that only + ``profile->profileId`` is used and the rest of the + structure is ignored. .. seealso:: `nvmlDevicePowerSmoothingActivatePresetProfile` """ @@ -26570,7 +28014,8 @@ cpdef device_power_smoothing_update_preset_profile_param(intptr_t device, intptr Args: device (intptr_t): The identifier of the target device. - profile (intptr_t): Reference to ``nvmlPowerSmoothingProfile_v1_t`` struct. + profile (intptr_t): Reference to + ``nvmlPowerSmoothingProfile_v1_t`` struct. .. seealso:: `nvmlDevicePowerSmoothingUpdatePresetProfileParam` """ @@ -26584,7 +28029,8 @@ cpdef device_power_smoothing_set_state(intptr_t device, intptr_t state): Args: device (intptr_t): The identifier of the target device. - state (intptr_t): Reference to ``nvmlPowerSmoothingState_v1_t``. + state (intptr_t): Reference to + ``nvmlPowerSmoothingState_v1_t``. .. seealso:: `nvmlDevicePowerSmoothingSetState` """ @@ -26600,7 +28046,8 @@ cpdef object device_get_addressing_mode(intptr_t device): device (intptr_t): The device handle. Returns: - nvmlDeviceAddressingMode_v1_t: Pointer to addressing mode of the device. + nvmlDeviceAddressingMode_v1_t: Pointer to addressing mode of + the device. .. seealso:: `nvmlDeviceGetAddressingMode` """ @@ -26640,7 +28087,8 @@ cpdef object device_get_power_mizer_mode_v1(intptr_t device): device (intptr_t): The identifier of the target device. Returns: - nvmlDevicePowerMizerModes_v1_t: Reference in which to return the power mizer mode. + nvmlDevicePowerMizerModes_v1_t: Reference in which to return + the power mizer mode. .. seealso:: `nvmlDeviceGetPowerMizerMode_v1` """ @@ -26657,7 +28105,8 @@ cpdef device_set_power_mizer_mode_v1(intptr_t device, intptr_t power_mizer_mode) Args: device (intptr_t): The identifier of the target device. - power_mizer_mode (intptr_t): Reference in which to set the power mizer mode. + power_mizer_mode (intptr_t): Reference in which to set the + power mizer mode. .. seealso:: `nvmlDeviceSetPowerMizerMode_v1` """ @@ -26686,7 +28135,8 @@ cpdef object device_get_vgpu_scheduler_state_v2(intptr_t device): device (intptr_t): The identifier of the target ``device``. Returns: - nvmlVgpuSchedulerStateInfo_v2_t: Reference in which ``p_scheduler_state_info`` is returned. + nvmlVgpuSchedulerStateInfo_v2_t: Reference in which + ``p_scheduler_state_info`` is returned. .. seealso:: `nvmlDeviceGetVgpuSchedulerState_v2` """ @@ -26705,7 +28155,8 @@ cpdef object gpu_instance_get_vgpu_scheduler_state_v2(intptr_t gpu_instance): gpu_instance (intptr_t): The GPU instance handle. Returns: - nvmlVgpuSchedulerStateInfo_v2_t: Reference in which ``p_scheduler_state_info`` is returned. + nvmlVgpuSchedulerStateInfo_v2_t: Reference in which + ``p_scheduler_state_info`` is returned. .. seealso:: `nvmlGpuInstanceGetVgpuSchedulerState_v2` """ @@ -26724,7 +28175,8 @@ cpdef object device_get_vgpu_scheduler_log_v2(intptr_t device): device (intptr_t): The identifier of the target ``device``. Returns: - nvmlVgpuSchedulerLogInfo_v2_t: Reference in which ``p_scheduler_log_info`` is written. + nvmlVgpuSchedulerLogInfo_v2_t: Reference in which + ``p_scheduler_log_info`` is written. .. seealso:: `nvmlDeviceGetVgpuSchedulerLog_v2` """ @@ -26743,7 +28195,8 @@ cpdef object gpu_instance_get_vgpu_scheduler_log_v2(intptr_t gpu_instance): gpu_instance (intptr_t): The GPU instance handle. Returns: - nvmlVgpuSchedulerLogInfo_v2_t: Reference in which ``p_scheduler_log_info`` is written. + nvmlVgpuSchedulerLogInfo_v2_t: Reference in which + ``p_scheduler_log_info`` is written. .. seealso:: `nvmlGpuInstanceGetVgpuSchedulerLog_v2` """ @@ -26760,7 +28213,8 @@ cpdef device_set_vgpu_scheduler_state_v2(intptr_t device, intptr_t p_scheduler_s Args: device (intptr_t): The identifier of the target ``device``. - p_scheduler_state (intptr_t): vGPU ``p_scheduler_state`` to set. + p_scheduler_state (intptr_t): vGPU ``p_scheduler_state`` to + set. .. seealso:: `nvmlDeviceSetVgpuSchedulerState_v2` """ @@ -26774,7 +28228,8 @@ cpdef gpu_instance_set_vgpu_scheduler_state_v2(intptr_t gpu_instance, intptr_t p Args: gpu_instance (intptr_t): The GPU instance handle. - p_scheduler_state (intptr_t): Pointer to the caller-provided structure of ``nvmlVgpuSchedulerState_v2_t``. + p_scheduler_state (intptr_t): Pointer to the caller-provided + structure of ``nvmlVgpuSchedulerState_v2_t``. .. seealso:: `nvmlGpuInstanceSetVgpuSchedulerState_v2` """ @@ -26783,6 +28238,88 @@ cpdef gpu_instance_set_vgpu_scheduler_state_v2(intptr_t gpu_instance, intptr_t p check_status(__status__) +cpdef object system_get_cper_v1(): + """Retrieves Common Platform Error Record (CPER) data. + + Returns: + nvmlGetCPER_v1_t: Pointer to an ``nvmlGetCPER_v1_t``. On entry + set ``cursor.cperTypeMask``, ``cursor.uuid`` (empty string + for all), ``cursor.handle`` (to + ``NVML_CPER_CURSOR_HANDLE_INIT`` for first call), + ``buffer`` (or NULL), ``bufferSize``. On return + ``cursor.handle`` and ``bufferSize`` are updated. + + .. seealso:: `nvmlSystemGetCPER_v1` + """ + cdef GetCPER_v1 cper_py = GetCPER_v1() + cdef nvmlGetCPER_v1_t *cper = (cper_py._get_ptr()) + with nogil: + __status__ = nvmlSystemGetCPER_v1(cper) + check_status(__status__) + return cper_py + + +cpdef object device_get_bbx_time_data_v1(intptr_t device): + """Retrieves the cumulative number of seconds the GPU has had the driver loaded. + + Args: + device (intptr_t): The identifier of the target device. + + Returns: + nvmlBBXTimeData_v1_t: Reference in which to return the + cumulative number of seconds the GPU has had the driver + loaded. + + .. seealso:: `nvmlDeviceGetBBXTimeData_v1` + """ + cdef BBXTimeData_v1 time_data_py = BBXTimeData_v1() + cdef nvmlBBXTimeData_v1_t *time_data = (time_data_py._get_ptr()) + with nogil: + __status__ = nvmlDeviceGetBBXTimeData_v1(device, time_data) + check_status(__status__) + return time_data_py + + +cpdef object device_get_accounting_stats_v2(intptr_t device): + """Queries process's accounting stats (v2). + + Args: + device (intptr_t): The identifier of the target device. + + Returns: + nvmlAccountingStats_v2_t: Reference in which to return the + process's accounting stats (v2). + + .. seealso:: `nvmlDeviceGetAccountingStats_v2` + """ + cdef AccountingStats_v2 stats_py = AccountingStats_v2() + cdef nvmlAccountingStats_v2_t *stats = (stats_py._get_ptr()) + with nogil: + __status__ = nvmlDeviceGetAccountingStats_v2(device, stats) + check_status(__status__) + return stats_py + + +cpdef object device_get_remapped_rows_v2(intptr_t device): + """Get the status of row remapper. + + Args: + device (intptr_t): The identifier of the target device. + + Returns: + nvmlRemappedRowsInfo_v2_t: Reference for + ``nvmlRemappedRowsInfo_v2_t``. + + .. seealso:: `nvmlDeviceGetRemappedRows_v2` + """ + cdef RemappedRowsInfo_v2 info_py = RemappedRowsInfo_v2() + cdef nvmlRemappedRowsInfo_v2_t *info = (info_py._get_ptr()) + with nogil: + __status__ = nvmlDeviceGetRemappedRows_v2(device, info) + check_status(__status__) + return info_py + + cpdef object system_get_topology_gpu_set(unsigned int cpuNumber): """Retrieve the set of GPUs that have a CPU affinity with the given CPU number @@ -28466,8 +30003,4 @@ cpdef str vgpu_type_get_name(unsigned int vgpu_type_id): return cpython.PyUnicode_FromStringAndSize(vgpu_type_name, size[0]) -# Cleanup some docstrings that don't parse as rst. -device_get_virtualization_mode.__doc__ = device_get_virtualization_mode.__doc__.replace("NVML_GPU_VIRTUALIZATION_?", "``NVML_GPU_VIRTUALIZATION_?``") -device_set_virtualization_mode.__doc__ = device_set_virtualization_mode.__doc__.replace("NVML_GPU_VIRTUALIZATION_?", "``NVML_GPU_VIRTUALIZATION_?``") -GpmMetricId.GPM_METRIC_DRAM_BW_UTIL.__doc__ = "Percentage of DRAM bw used vs theoretical maximum. ``0.0 - 100.0 *\u200d/``." del _cyb_FastEnum diff --git a/cuda_bindings/cuda/bindings/nvvm.pyx b/cuda_bindings/cuda/bindings/nvvm.pyx index 6d18a50f24c..abbbd4a72bd 100644 --- a/cuda_bindings/cuda/bindings/nvvm.pyx +++ b/cuda_bindings/cuda/bindings/nvvm.pyx @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # # This code was automatically generated across versions from 12.0.1 to 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=82dc56ccc695031faa515d1971c9841131d5aadc60c6d6e6cc223580fc544d16 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=869e6761e7af952be9590fcd26675047c19ff23ee9c1521f64dd7e8f6842bced # <<<< PREAMBLE CONTENT >>>> @@ -162,9 +162,11 @@ cpdef add_module_to_program(intptr_t prog, buffer, size_t size, name): Args: prog (intptr_t): NVVM program. - buffer (bytes): NVVM IR module in the bitcode or text representation. + buffer (bytes): NVVM IR module in the bitcode or text + representation. size (size_t): Size of the NVVM IR module. - name (str): Name of the NVVM IR module. If NULL, "" is used as the name. + name (str): Name of the NVVM IR module. If NULL, "" + is used as the name. .. seealso:: `nvvmAddModuleToProgram` """ @@ -185,7 +187,8 @@ cpdef lazy_add_module_to_program(intptr_t prog, buffer, size_t size, name): prog (intptr_t): NVVM program. buffer (bytes): NVVM IR module in the bitcode representation. size (size_t): Size of the NVVM IR module. - name (str): Name of the NVVM IR module. If NULL, "" is used as the name. + name (str): Name of the NVVM IR module. If NULL, "" + is used as the name. .. seealso:: `nvvmLazyAddModuleToProgram` """ @@ -205,7 +208,8 @@ cpdef compile_program(intptr_t prog, int num_options, options): Args: prog (intptr_t): NVVM program. num_options (int): Number of compiler ``options`` passed. - options (object): Compiler options in the form of C string array. It can be: + options (object): Compiler options in the form of C string + array. It can be: - an :class:`int` as the pointer address to the nested sequence, or - a Python sequence of :class:`int`\s, each of which is a pointer address @@ -228,7 +232,8 @@ cpdef verify_program(intptr_t prog, int num_options, options): Args: prog (intptr_t): NVVM program. num_options (int): Number of compiler ``options`` passed. - options (object): Compiler options in the form of C string array. It can be: + options (object): Compiler options in the form of C string + array. It can be: - an :class:`int` as the pointer address to the nested sequence, or - a Python sequence of :class:`int`\s, each of which is a pointer address @@ -252,7 +257,8 @@ cpdef size_t get_compiled_result_size(intptr_t prog) except? 0: prog (intptr_t): NVVM program. Returns: - size_t: Size of the compiled result (including the trailing NULL). + size_t: Size of the compiled result (including the trailing + NULL). .. seealso:: `nvvmGetCompiledResultSize` """ @@ -285,7 +291,8 @@ cpdef size_t get_program_log_size(intptr_t prog) except? 0: prog (intptr_t): NVVM program. Returns: - size_t: Size of the compilation/verification log (including the trailing NULL). + size_t: Size of the compilation/verification log (including + the trailing NULL). .. seealso:: `nvvmGetProgramLogSize` """ diff --git a/cuda_bindings/cuda/bindings/runtime.pxd b/cuda_bindings/cuda/bindings/runtime.pxd index 7cb680d1743..39e2d129890 100644 --- a/cuda_bindings/cuda/bindings/runtime.pxd +++ b/cuda_bindings/cuda/bindings/runtime.pxd @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 # This code was automatically generated with version 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=0f2431380680008795336b7acb5ccd83dba7a6e05d0c81c2b5f825bc95576ccd +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=033835aa1fcce7bcd75db8c655b92a6415a74fe0734819cda666ebf038bc1bce cimport cuda.bindings.cyruntime as cyruntime include "_lib/utils.pxd" @@ -405,10 +405,6 @@ cdef class cudaArraySparseProperties: Flags will either be zero or cudaArraySparsePropertiesSingleMipTail - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -435,10 +431,6 @@ cdef class cudaArrayMemoryRequirements: Alignment necessary for mapping the array. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -615,10 +607,6 @@ cdef class cudaMemcpyNodeParams: Must be zero - reserved : int - Must be zero - - ctx : cudaExecutionContext_t Context in which to run the memcpy. If NULL will try to use the current context. @@ -1025,13 +1013,6 @@ cdef class anon_struct4: cdef class anon_struct5: """ - Attributes - ---------- - - reserved : list[int] - - - Methods ------- getPtr() @@ -1060,10 +1041,6 @@ cdef class anon_union0: - reserved : anon_struct5 - - - Methods ------- getPtr() @@ -1083,9 +1060,6 @@ cdef class anon_union0: cdef anon_struct4 _pitch2D - cdef anon_struct5 _reserved - - cdef class cudaResourceDesc: """ CUDA resource descriptor @@ -1155,10 +1129,6 @@ cdef class cudaResourceViewDesc: Last layer index - reserved : list[unsigned int] - Must be zero - - Methods ------- getPtr() @@ -1201,10 +1171,6 @@ cdef class cudaPointerAttributes: pointer if an invalid pointer has been passed to CUDA. - reserved : list[long] - Must be zero - - Methods ------- getPtr() @@ -1333,14 +1299,6 @@ cdef class cudaFuncAttributes: the value. - reserved1 : int - - - - reserved : list[int] - Reserved for future use. - - Methods ------- getPtr() @@ -1440,10 +1398,6 @@ cdef class cudaMemPoolProps: Bitmask indicating intended usage for the pool. - reserved : bytes - reserved for future use, must be 0 - - Methods ------- getPtr() @@ -1462,13 +1416,6 @@ cdef class cudaMemPoolPtrExportData: """ Opaque data for exporting a pool allocation - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -2236,10 +2183,6 @@ cdef class cudaDeviceProp: multi-node system. - reserved : list[int] - Reserved for future use - - Methods ------- getPtr() @@ -2255,13 +2198,6 @@ cdef class cudaIpcEventHandle_st: """ CUDA IPC event handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -2274,13 +2210,6 @@ cdef class cudaIpcMemHandle_st: """ CUDA IPC memory handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -2291,13 +2220,6 @@ cdef class cudaIpcMemHandle_st: cdef class cudaMemFabricHandle_st: """ - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -2385,10 +2307,6 @@ cdef class cudaExternalMemoryHandleDesc: Flags must either be zero or cudaExternalMemoryDedicated - reserved : list[unsigned int] - Must be zero - - Methods ------- getPtr() @@ -2419,10 +2337,6 @@ cdef class cudaExternalMemoryBufferDesc: Flags reserved for future use. Must be zero. - reserved : list[unsigned int] - Must be zero - - Methods ------- getPtr() @@ -2460,10 +2374,6 @@ cdef class cudaExternalMemoryMipmappedArrayDesc: Total number of levels in the mipmap chain - reserved : list[unsigned int] - Must be zero - - Methods ------- getPtr() @@ -2553,10 +2463,6 @@ cdef class cudaExternalSemaphoreHandleDesc: Flags reserved for the future. Must be zero. - reserved : list[unsigned int] - Must be zero - - Methods ------- getPtr() @@ -2593,10 +2499,6 @@ cdef class anon_union5: - reserved : unsigned long long - - - Methods ------- getPtr() @@ -2640,10 +2542,6 @@ cdef class anon_struct12: - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -2682,10 +2580,6 @@ cdef class cudaExternalSemaphoreSignalParams: all other types of cudaExternalSemaphore_t, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -2722,10 +2616,6 @@ cdef class anon_union6: - reserved : unsigned long long - - - Methods ------- getPtr() @@ -2773,10 +2663,6 @@ cdef class anon_struct15: - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -2815,10 +2701,6 @@ cdef class cudaExternalSemaphoreWaitParams: all other types of cudaExternalSemaphore_t, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -2898,13 +2780,6 @@ cdef class cudaDevWorkqueueResource: """ Handle to a pre-existing workqueue related resource - Attributes - ---------- - - reserved : bytes - Reserved for future use - - Methods ------- getPtr() @@ -2939,10 +2814,6 @@ cdef class cudaDevSmResourceGroupParams_st: this this group is created. - reserved : list[unsigned int] - Reserved for future use - ensure this is zero initialized. - - Methods ------- getPtr() @@ -3477,14 +3348,6 @@ cdef class cudaGraphNodeParams: Type of the node - reserved0 : list[int] - Reserved. Must be zero. - - - reserved1 : list[long long] - Padding. Unused bytes must be zero. - - kernel : cudaKernelNodeParamsV2 Kernel node parameters. @@ -3533,10 +3396,6 @@ cdef class cudaGraphNodeParams: Conditional node parameters. - reserved2 : long long - Reserved bytes. Must be zero. - - Methods ------- getPtr() @@ -3618,11 +3477,6 @@ cdef class cudaGraphEdgeData_st: See cudaGraphDependencyType. - reserved : bytes - These bytes are unused and must be zeroed. This ensures - compatibility if additional fields are added in the future. - - Methods ------- getPtr() @@ -4023,12 +3877,12 @@ cdef class cudaLaunchAttributeValue: with the following fields: - `x` - The X dimension of the preferred cluster, in blocks. Must be a divisor of the grid X dimension, and must be a multiple of the `x` field of - ::cudaLaunchAttributeValue::clusterDim. - `y` - The Y dimension - of the preferred cluster, in blocks. Must be a divisor of the grid - Y dimension, and must be a multiple of the `y` field of - ::cudaLaunchAttributeValue::clusterDim. - `z` - The Z dimension - of the preferred cluster, in blocks. Must be equal to the `z` field - of ::cudaLaunchAttributeValue::clusterDim. + cudaLaunchAttributeValue::clusterDim. - `y` - The Y dimension of + the preferred cluster, in blocks. Must be a divisor of the grid Y + dimension, and must be a multiple of the `y` field of + cudaLaunchAttributeValue::clusterDim. - `z` - The Z dimension of + the preferred cluster, in blocks. Must be equal to the `z` field of + cudaLaunchAttributeValue::clusterDim. launchCompletionEvent : anon_struct20 @@ -4314,10 +4168,6 @@ cdef class cudaEglPlaneDesc_st: Channel Format Descriptor - reserved : list[unsigned int] - Reserved for future use - - Methods ------- getPtr() @@ -4430,13 +4280,6 @@ cdef class cudaIpcEventHandle_t(cudaIpcEventHandle_st): """ CUDA IPC event handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -4448,13 +4291,6 @@ cdef class cudaIpcMemHandle_t(cudaIpcMemHandle_st): """ CUDA IPC memory handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -4464,13 +4300,6 @@ cdef class cudaIpcMemHandle_t(cudaIpcMemHandle_st): cdef class cudaMemFabricHandle_t(cudaMemFabricHandle_st): """ - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -4504,10 +4333,6 @@ cdef class cudaDevSmResourceGroupParams(cudaDevSmResourceGroupParams_st): this this group is created. - reserved : list[unsigned int] - Reserved for future use - ensure this is zero initialized. - - Methods ------- getPtr() @@ -4609,11 +4434,6 @@ cdef class cudaGraphEdgeData(cudaGraphEdgeData_st): See cudaGraphDependencyType. - reserved : bytes - These bytes are unused and must be zeroed. This ensures - compatibility if additional fields are added in the future. - - Methods ------- getPtr() @@ -4830,12 +4650,12 @@ cdef class cudaStreamAttrValue(cudaLaunchAttributeValue): with the following fields: - `x` - The X dimension of the preferred cluster, in blocks. Must be a divisor of the grid X dimension, and must be a multiple of the `x` field of - ::cudaLaunchAttributeValue::clusterDim. - `y` - The Y dimension - of the preferred cluster, in blocks. Must be a divisor of the grid - Y dimension, and must be a multiple of the `y` field of - ::cudaLaunchAttributeValue::clusterDim. - `z` - The Z dimension - of the preferred cluster, in blocks. Must be equal to the `z` field - of ::cudaLaunchAttributeValue::clusterDim. + cudaLaunchAttributeValue::clusterDim. - `y` - The Y dimension of + the preferred cluster, in blocks. Must be a divisor of the grid Y + dimension, and must be a multiple of the `y` field of + cudaLaunchAttributeValue::clusterDim. - `z` - The Z dimension of + the preferred cluster, in blocks. Must be equal to the `z` field of + cudaLaunchAttributeValue::clusterDim. launchCompletionEvent : anon_struct20 @@ -4959,12 +4779,12 @@ cdef class cudaKernelNodeAttrValue(cudaLaunchAttributeValue): with the following fields: - `x` - The X dimension of the preferred cluster, in blocks. Must be a divisor of the grid X dimension, and must be a multiple of the `x` field of - ::cudaLaunchAttributeValue::clusterDim. - `y` - The Y dimension - of the preferred cluster, in blocks. Must be a divisor of the grid - Y dimension, and must be a multiple of the `y` field of - ::cudaLaunchAttributeValue::clusterDim. - `z` - The Z dimension - of the preferred cluster, in blocks. Must be equal to the `z` field - of ::cudaLaunchAttributeValue::clusterDim. + cudaLaunchAttributeValue::clusterDim. - `y` - The Y dimension of + the preferred cluster, in blocks. Must be a divisor of the grid Y + dimension, and must be a multiple of the `y` field of + cudaLaunchAttributeValue::clusterDim. - `z` - The Z dimension of + the preferred cluster, in blocks. Must be equal to the `z` field of + cudaLaunchAttributeValue::clusterDim. launchCompletionEvent : anon_struct20 @@ -5043,10 +4863,6 @@ cdef class cudaEglPlaneDesc(cudaEglPlaneDesc_st): Channel Format Descriptor - reserved : list[unsigned int] - Reserved for future use - - Methods ------- getPtr() diff --git a/cuda_bindings/cuda/bindings/runtime.pyx b/cuda_bindings/cuda/bindings/runtime.pyx index 6e11bdfc932..a2292efad7a 100644 --- a/cuda_bindings/cuda/bindings/runtime.pyx +++ b/cuda_bindings/cuda/bindings/runtime.pyx @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 # This code was automatically generated with version 13.3.0. Do not modify it directly. -# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=783d27cfa66fa4f5818edcf88141aeb96dcc0e27e73a77a36571f82f30f3bb47 +# CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=979e766bb067947f8d255ab5e8d2439b946aed85f2d19a209eb4136a1ceda20b from typing import Any, Optional import cython import ctypes @@ -1748,8 +1748,8 @@ class cudaLaunchAttributeID(_FastEnum): cyruntime.cudaLaunchAttributeID.cudaLaunchAttributeDeviceUpdatableKernelNode, 'Valid for graph nodes, launches. This attribute is graphs-only, and passing\n' 'it to a launch in a non-capturing stream will result in an error.\n' - ' :cudaLaunchAttributeValue::deviceUpdatableKernelNode::deviceUpdatable can\n' - 'only be set to 0 or 1. Setting the field to 1 indicates that the\n' + ':py:obj:`~.cudaLaunchAttributeValue.deviceUpdatableKernelNode.deviceUpdatable`\n' + 'can only be set to 0 or 1. Setting the field to 1 indicates that the\n' 'corresponding kernel node should be device-updatable. On success, a handle\n' 'will be returned via\n' ':py:obj:`~.cudaLaunchAttributeValue.deviceUpdatableKernelNode.devNode`\n' @@ -6590,8 +6590,8 @@ class cudaStreamAttrID(_FastEnum): cyruntime.cudaLaunchAttributeID.cudaLaunchAttributeDeviceUpdatableKernelNode, 'Valid for graph nodes, launches. This attribute is graphs-only, and passing\n' 'it to a launch in a non-capturing stream will result in an error.\n' - ' :cudaLaunchAttributeValue::deviceUpdatableKernelNode::deviceUpdatable can\n' - 'only be set to 0 or 1. Setting the field to 1 indicates that the\n' + ':py:obj:`~.cudaLaunchAttributeValue.deviceUpdatableKernelNode.deviceUpdatable`\n' + 'can only be set to 0 or 1. Setting the field to 1 indicates that the\n' 'corresponding kernel node should be device-updatable. On success, a handle\n' 'will be returned via\n' ':py:obj:`~.cudaLaunchAttributeValue.deviceUpdatableKernelNode.devNode`\n' @@ -6835,8 +6835,8 @@ class cudaKernelNodeAttrID(_FastEnum): cyruntime.cudaLaunchAttributeID.cudaLaunchAttributeDeviceUpdatableKernelNode, 'Valid for graph nodes, launches. This attribute is graphs-only, and passing\n' 'it to a launch in a non-capturing stream will result in an error.\n' - ' :cudaLaunchAttributeValue::deviceUpdatableKernelNode::deviceUpdatable can\n' - 'only be set to 0 or 1. Setting the field to 1 indicates that the\n' + ':py:obj:`~.cudaLaunchAttributeValue.deviceUpdatableKernelNode.deviceUpdatable`\n' + 'can only be set to 0 or 1. Setting the field to 1 indicates that the\n' 'corresponding kernel node should be device-updatable. On success, a handle\n' 'will be returned via\n' ':py:obj:`~.cudaLaunchAttributeValue.deviceUpdatableKernelNode.devNode`\n' @@ -7919,10 +7919,6 @@ cdef class cudaArraySparseProperties: Flags will either be zero or cudaArraySparsePropertiesSingleMipTail - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -7969,12 +7965,6 @@ cdef class cudaArraySparseProperties: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -8011,14 +8001,6 @@ cdef class cudaArraySparseProperties: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class cudaArrayMemoryRequirements: """ CUDA array and CUDA mipmapped array memory requirements @@ -8034,10 +8016,6 @@ cdef class cudaArrayMemoryRequirements: Alignment necessary for mapping the array. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -8069,12 +8047,6 @@ cdef class cudaArrayMemoryRequirements: except ValueError: str_list += ['alignment : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -8095,14 +8067,6 @@ cdef class cudaArrayMemoryRequirements: self._pvt_ptr[0].alignment = alignment - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class cudaPitchedPtr: """ CUDA Pitched memory pointer make_cudaPitchedPtr @@ -8599,10 +8563,6 @@ cdef class cudaMemcpyNodeParams: Must be zero - reserved : int - Must be zero - - ctx : cudaExecutionContext_t Context in which to run the memcpy. If NULL will try to use the current context. @@ -8644,12 +8604,6 @@ cdef class cudaMemcpyNodeParams: str_list += ['flags : '] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - - try: str_list += ['ctx : ' + str(self.ctx)] except ValueError: @@ -8673,14 +8627,6 @@ cdef class cudaMemcpyNodeParams: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, int reserved): - self._pvt_ptr[0].reserved = reserved - - @property def ctx(self): return self._ctx @@ -9872,13 +9818,6 @@ cdef class anon_struct4: cdef class anon_struct5: """ - Attributes - ---------- - - reserved : list[int] - - - Methods ------- getPtr() @@ -9897,23 +9836,10 @@ cdef class anon_struct5: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return self._pvt_ptr[0].res.reserved.reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].res.reserved.reserved = reserved - - cdef class anon_union0: """ Attributes @@ -9935,10 +9861,6 @@ cdef class anon_union0: - reserved : anon_struct5 - - - Methods ------- getPtr() @@ -9961,9 +9883,6 @@ cdef class anon_union0: self._pitch2D = anon_struct4(_ptr=self._pvt_ptr) - - self._reserved = anon_struct5(_ptr=self._pvt_ptr) - def __dealloc__(self): pass def getPtr(self): @@ -9995,12 +9914,6 @@ cdef class anon_union0: except ValueError: str_list += ['pitch2D : '] - - try: - str_list += ['reserved :\n' + '\n'.join([' ' + line for line in str(self.reserved).splitlines()])] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -10037,14 +9950,6 @@ cdef class anon_union0: string.memcpy(&self._pvt_ptr[0].res.pitch2D, pitch2D.getPtr(), sizeof(self._pvt_ptr[0].res.pitch2D)) - @property - def reserved(self): - return self._reserved - @reserved.setter - def reserved(self, reserved not None : anon_struct5): - string.memcpy(&self._pvt_ptr[0].res.reserved, reserved.getPtr(), sizeof(self._pvt_ptr[0].res.reserved)) - - cdef class cudaResourceDesc: """ CUDA resource descriptor @@ -10173,10 +10078,6 @@ cdef class cudaResourceViewDesc: Last layer index - reserved : list[unsigned int] - Must be zero - - Methods ------- getPtr() @@ -10244,12 +10145,6 @@ cdef class cudaResourceViewDesc: except ValueError: str_list += ['lastLayer : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -10318,14 +10213,6 @@ cdef class cudaResourceViewDesc: self._pvt_ptr[0].lastLayer = lastLayer - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class cudaPointerAttributes: """ CUDA pointer attributes @@ -10360,10 +10247,6 @@ cdef class cudaPointerAttributes: pointer if an invalid pointer has been passed to CUDA. - reserved : list[long] - Must be zero - - Methods ------- getPtr() @@ -10407,12 +10290,6 @@ cdef class cudaPointerAttributes: except ValueError: str_list += ['hostPointer : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -10451,14 +10328,6 @@ cdef class cudaPointerAttributes: self._pvt_ptr[0].hostPointer = self._cyhostPointer.cptr - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class cudaFuncAttributes: """ CUDA function attributes @@ -10573,14 +10442,6 @@ cdef class cudaFuncAttributes: the value. - reserved1 : int - - - - reserved : list[int] - Reserved for future use. - - Methods ------- getPtr() @@ -10702,18 +10563,6 @@ cdef class cudaFuncAttributes: except ValueError: str_list += ['deviceNodeUpdateStatus : '] - - try: - str_list += ['reserved1 : ' + str(self.reserved1)] - except ValueError: - str_list += ['reserved1 : '] - - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -10854,22 +10703,6 @@ cdef class cudaFuncAttributes: self._pvt_ptr[0].deviceNodeUpdateStatus = deviceNodeUpdateStatus - @property - def reserved1(self): - return self._pvt_ptr[0].reserved1 - @reserved1.setter - def reserved1(self, int reserved1): - self._pvt_ptr[0].reserved1 = reserved1 - - - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class cudaMemLocation: """ Specifies a memory location. To specify a gpu, set type = @@ -11049,10 +10882,6 @@ cdef class cudaMemPoolProps: Bitmask indicating intended usage for the pool. - reserved : bytes - reserved for future use, must be 0 - - Methods ------- getPtr() @@ -11111,12 +10940,6 @@ cdef class cudaMemPoolProps: except ValueError: str_list += ['usage : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -11170,28 +10993,10 @@ cdef class cudaMemPoolProps: self._pvt_ptr[0].usage = usage - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 54) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 54: - raise ValueError("reserved length must be 54, is " + str(len(reserved))) - for i, b in enumerate(reserved): - self._pvt_ptr[0].reserved[i] = b - - cdef class cudaMemPoolPtrExportData: """ Opaque data for exporting a pool allocation - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -11212,26 +11017,10 @@ cdef class cudaMemPoolPtrExportData: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 64) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 64: - raise ValueError("reserved length must be 64, is " + str(len(reserved))) - for i, b in enumerate(reserved): - self._pvt_ptr[0].reserved[i] = b - - cdef class cudaMemAllocNodeParams: """ Memory allocation node parameters @@ -11338,6 +11127,7 @@ cdef class cudaMemAllocNodeParams: return [cudaMemAccessDesc(_ptr=arr) for arr in arrs] @accessDescs.setter def accessDescs(self, val): + cdef cyruntime.cudaMemAccessDesc* _accessDescs_new if len(val) == 0: free(self._accessDescs) self._accessDescs = NULL @@ -11345,14 +11135,22 @@ cdef class cudaMemAllocNodeParams: self._pvt_ptr[0].accessDescs = NULL else: if self._accessDescs_length != len(val): - free(self._accessDescs) - self._accessDescs = calloc(len(val), sizeof(cyruntime.cudaMemAccessDesc)) - if self._accessDescs is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _accessDescs_new = calloc(len(val), sizeof(cyruntime.cudaMemAccessDesc)) + if _accessDescs_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cyruntime.cudaMemAccessDesc))) + for idx in range(len(val)): + string.memcpy(&_accessDescs_new[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaMemAccessDesc)) + free(self._accessDescs) + self._accessDescs = _accessDescs_new self._accessDescs_length = len(val) - self._pvt_ptr[0].accessDescs = self._accessDescs - for idx in range(len(val)): - string.memcpy(&self._accessDescs[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaMemAccessDesc)) + self._pvt_ptr[0].accessDescs = _accessDescs_new + else: + for idx in range(len(val)): + string.memcpy(&self._accessDescs[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaMemAccessDesc)) @@ -11487,6 +11285,7 @@ cdef class cudaMemAllocNodeParamsV2: return [cudaMemAccessDesc(_ptr=arr) for arr in arrs] @accessDescs.setter def accessDescs(self, val): + cdef cyruntime.cudaMemAccessDesc* _accessDescs_new if len(val) == 0: free(self._accessDescs) self._accessDescs = NULL @@ -11494,14 +11293,22 @@ cdef class cudaMemAllocNodeParamsV2: self._pvt_ptr[0].accessDescs = NULL else: if self._accessDescs_length != len(val): - free(self._accessDescs) - self._accessDescs = calloc(len(val), sizeof(cyruntime.cudaMemAccessDesc)) - if self._accessDescs is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _accessDescs_new = calloc(len(val), sizeof(cyruntime.cudaMemAccessDesc)) + if _accessDescs_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cyruntime.cudaMemAccessDesc))) + for idx in range(len(val)): + string.memcpy(&_accessDescs_new[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaMemAccessDesc)) + free(self._accessDescs) + self._accessDescs = _accessDescs_new self._accessDescs_length = len(val) - self._pvt_ptr[0].accessDescs = self._accessDescs - for idx in range(len(val)): - string.memcpy(&self._accessDescs[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaMemAccessDesc)) + self._pvt_ptr[0].accessDescs = _accessDescs_new + else: + for idx in range(len(val)): + string.memcpy(&self._accessDescs[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaMemAccessDesc)) @@ -12663,10 +12470,6 @@ cdef class cudaDeviceProp: multi-node system. - reserved : list[int] - Reserved for future use - - Methods ------- getPtr() @@ -13241,12 +13044,6 @@ cdef class cudaDeviceProp: except ValueError: str_list += ['hostNumaMultinodeIpcSupported : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -13999,25 +13796,10 @@ cdef class cudaDeviceProp: self._pvt_ptr[0].hostNumaMultinodeIpcSupported = hostNumaMultinodeIpcSupported - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class cudaIpcEventHandle_st: """ CUDA IPC event handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -14038,45 +13820,14 @@ cdef class cudaIpcEventHandle_st: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 64) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 64: - raise ValueError("reserved length must be 64, is " + str(len(reserved))) - if CHAR_MIN == 0: - for i, b in enumerate(reserved): - if b < 0 and b > -129: - b = b + 256 - self._pvt_ptr[0].reserved[i] = b - else: - for i, b in enumerate(reserved): - if b > 127 and b < 256: - b = b - 256 - self._pvt_ptr[0].reserved[i] = b - - cdef class cudaIpcMemHandle_st: """ CUDA IPC memory handle - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -14097,43 +13848,12 @@ cdef class cudaIpcMemHandle_st: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 64) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 64: - raise ValueError("reserved length must be 64, is " + str(len(reserved))) - if CHAR_MIN == 0: - for i, b in enumerate(reserved): - if b < 0 and b > -129: - b = b + 256 - self._pvt_ptr[0].reserved[i] = b - else: - for i, b in enumerate(reserved): - if b > 127 and b < 256: - b = b - 256 - self._pvt_ptr[0].reserved[i] = b - - cdef class cudaMemFabricHandle_st: """ - Attributes - ---------- - - reserved : bytes - - - Methods ------- getPtr() @@ -14154,34 +13874,10 @@ cdef class cudaMemFabricHandle_st: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 64) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 64: - raise ValueError("reserved length must be 64, is " + str(len(reserved))) - if CHAR_MIN == 0: - for i, b in enumerate(reserved): - if b < 0 and b > -129: - b = b + 256 - self._pvt_ptr[0].reserved[i] = b - else: - for i, b in enumerate(reserved): - if b > 127 and b < 256: - b = b - 256 - self._pvt_ptr[0].reserved[i] = b - - cdef class anon_struct8: """ Attributes @@ -14353,10 +14049,6 @@ cdef class cudaExternalMemoryHandleDesc: Flags must either be zero or cudaExternalMemoryDedicated - reserved : list[unsigned int] - Must be zero - - Methods ------- getPtr() @@ -14405,12 +14097,6 @@ cdef class cudaExternalMemoryHandleDesc: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -14447,14 +14133,6 @@ cdef class cudaExternalMemoryHandleDesc: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class cudaExternalMemoryBufferDesc: """ External memory buffer descriptor @@ -14474,10 +14152,6 @@ cdef class cudaExternalMemoryBufferDesc: Flags reserved for future use. Must be zero. - reserved : list[unsigned int] - Must be zero - - Methods ------- getPtr() @@ -14515,12 +14189,6 @@ cdef class cudaExternalMemoryBufferDesc: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -14549,14 +14217,6 @@ cdef class cudaExternalMemoryBufferDesc: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class cudaExternalMemoryMipmappedArrayDesc: """ External memory mipmap descriptor @@ -14586,10 +14246,6 @@ cdef class cudaExternalMemoryMipmappedArrayDesc: Total number of levels in the mipmap chain - reserved : list[unsigned int] - Must be zero - - Methods ------- getPtr() @@ -14645,12 +14301,6 @@ cdef class cudaExternalMemoryMipmappedArrayDesc: except ValueError: str_list += ['numLevels : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -14695,14 +14345,6 @@ cdef class cudaExternalMemoryMipmappedArrayDesc: self._pvt_ptr[0].numLevels = numLevels - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class anon_struct9: """ Attributes @@ -14870,10 +14512,6 @@ cdef class cudaExternalSemaphoreHandleDesc: Flags reserved for the future. Must be zero. - reserved : list[unsigned int] - Must be zero - - Methods ------- getPtr() @@ -14916,12 +14554,6 @@ cdef class cudaExternalSemaphoreHandleDesc: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -14950,14 +14582,6 @@ cdef class cudaExternalSemaphoreHandleDesc: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class anon_struct10: """ Attributes @@ -15011,10 +14635,6 @@ cdef class anon_union5: - reserved : unsigned long long - - - Methods ------- getPtr() @@ -15038,12 +14658,6 @@ cdef class anon_union5: except ValueError: str_list += ['fence : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -15057,14 +14671,6 @@ cdef class anon_union5: self._pvt_ptr[0].params.nvSciSync.fence = self._cyfence.cptr - @property - def reserved(self): - return self._pvt_ptr[0].params.nvSciSync.reserved - @reserved.setter - def reserved(self, unsigned long long reserved): - self._pvt_ptr[0].params.nvSciSync.reserved = reserved - - cdef class anon_struct11: """ Attributes @@ -15126,10 +14732,6 @@ cdef class anon_struct12: - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -15174,12 +14776,6 @@ cdef class anon_struct12: except ValueError: str_list += ['keyedMutex : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -15208,14 +14804,6 @@ cdef class anon_struct12: string.memcpy(&self._pvt_ptr[0].params.keyedMutex, keyedMutex.getPtr(), sizeof(self._pvt_ptr[0].params.keyedMutex)) - @property - def reserved(self): - return self._pvt_ptr[0].params.reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].params.reserved = reserved - - cdef class cudaExternalSemaphoreSignalParams: """ External semaphore signal parameters, compatible with driver type @@ -15238,10 +14826,6 @@ cdef class cudaExternalSemaphoreSignalParams: all other types of cudaExternalSemaphore_t, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -15276,12 +14860,6 @@ cdef class cudaExternalSemaphoreSignalParams: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -15302,14 +14880,6 @@ cdef class cudaExternalSemaphoreSignalParams: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class anon_struct13: """ Attributes @@ -15363,10 +14933,6 @@ cdef class anon_union6: - reserved : unsigned long long - - - Methods ------- getPtr() @@ -15390,12 +14956,6 @@ cdef class anon_union6: except ValueError: str_list += ['fence : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -15409,14 +14969,6 @@ cdef class anon_union6: self._pvt_ptr[0].params.nvSciSync.fence = self._cyfence.cptr - @property - def reserved(self): - return self._pvt_ptr[0].params.nvSciSync.reserved - @reserved.setter - def reserved(self, unsigned long long reserved): - self._pvt_ptr[0].params.nvSciSync.reserved = reserved - - cdef class anon_struct14: """ Attributes @@ -15496,10 +15048,6 @@ cdef class anon_struct15: - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -15544,12 +15092,6 @@ cdef class anon_struct15: except ValueError: str_list += ['keyedMutex : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -15578,14 +15120,6 @@ cdef class anon_struct15: string.memcpy(&self._pvt_ptr[0].params.keyedMutex, keyedMutex.getPtr(), sizeof(self._pvt_ptr[0].params.keyedMutex)) - @property - def reserved(self): - return self._pvt_ptr[0].params.reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].params.reserved = reserved - - cdef class cudaExternalSemaphoreWaitParams: """ External semaphore wait parameters, compatible with driver type @@ -15608,10 +15142,6 @@ cdef class cudaExternalSemaphoreWaitParams: all other types of cudaExternalSemaphore_t, flags must be zero. - reserved : list[unsigned int] - - - Methods ------- getPtr() @@ -15646,12 +15176,6 @@ cdef class cudaExternalSemaphoreWaitParams: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -15672,14 +15196,6 @@ cdef class cudaExternalSemaphoreWaitParams: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class cudaDevSmResource: """ Data for SM-related resources All parameters in this structure are @@ -15876,13 +15392,6 @@ cdef class cudaDevWorkqueueResource: """ Handle to a pre-existing workqueue related resource - Attributes - ---------- - - reserved : bytes - Reserved for future use - - Methods ------- getPtr() @@ -15903,26 +15412,10 @@ cdef class cudaDevWorkqueueResource: if self._pvt_ptr is not NULL: str_list = [] - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 40) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 40: - raise ValueError("reserved length must be 40, is " + str(len(reserved))) - for i, b in enumerate(reserved): - self._pvt_ptr[0].reserved[i] = b - - cdef class cudaDevSmResourceGroupParams_st: """ Input data for splitting SMs @@ -15949,10 +15442,6 @@ cdef class cudaDevSmResourceGroupParams_st: this this group is created. - reserved : list[unsigned int] - Reserved for future use - ensure this is zero initialized. - - Methods ------- getPtr() @@ -15996,12 +15485,6 @@ cdef class cudaDevSmResourceGroupParams_st: except ValueError: str_list += ['flags : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -16038,14 +15521,6 @@ cdef class cudaDevSmResourceGroupParams_st: self._pvt_ptr[0].flags = flags - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class cudaDevResource_st: """ A tagged union describing different resources identified by the @@ -16237,6 +15712,7 @@ cdef class cudaDevResource_st: return [cudaDevResource_st(_ptr=arr) for arr in arrs] @nextResource.setter def nextResource(self, val): + cdef cyruntime.cudaDevResource_st* _nextResource_new if len(val) == 0: free(self._nextResource) self._nextResource = NULL @@ -16244,14 +15720,22 @@ cdef class cudaDevResource_st: self._pvt_ptr[0].nextResource = NULL else: if self._nextResource_length != len(val): - free(self._nextResource) - self._nextResource = calloc(len(val), sizeof(cyruntime.cudaDevResource_st)) - if self._nextResource is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _nextResource_new = calloc(len(val), sizeof(cyruntime.cudaDevResource_st)) + if _nextResource_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cyruntime.cudaDevResource_st))) + for idx in range(len(val)): + string.memcpy(&_nextResource_new[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaDevResource_st)) + free(self._nextResource) + self._nextResource = _nextResource_new self._nextResource_length = len(val) - self._pvt_ptr[0].nextResource = self._nextResource - for idx in range(len(val)): - string.memcpy(&self._nextResource[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaDevResource_st)) + self._pvt_ptr[0].nextResource = _nextResource_new + else: + for idx in range(len(val)): + string.memcpy(&self._nextResource[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaDevResource_st)) @@ -16861,6 +16345,7 @@ cdef class cudaExternalSemaphoreSignalNodeParams: return [cudaExternalSemaphoreSignalParams(_ptr=arr) for arr in arrs] @paramsArray.setter def paramsArray(self, val): + cdef cyruntime.cudaExternalSemaphoreSignalParams* _paramsArray_new if len(val) == 0: free(self._paramsArray) self._paramsArray = NULL @@ -16868,14 +16353,22 @@ cdef class cudaExternalSemaphoreSignalNodeParams: self._pvt_ptr[0].paramsArray = NULL else: if self._paramsArray_length != len(val): - free(self._paramsArray) - self._paramsArray = calloc(len(val), sizeof(cyruntime.cudaExternalSemaphoreSignalParams)) - if self._paramsArray is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _paramsArray_new = calloc(len(val), sizeof(cyruntime.cudaExternalSemaphoreSignalParams)) + if _paramsArray_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cyruntime.cudaExternalSemaphoreSignalParams))) + for idx in range(len(val)): + string.memcpy(&_paramsArray_new[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreSignalParams)) + free(self._paramsArray) + self._paramsArray = _paramsArray_new self._paramsArray_length = len(val) - self._pvt_ptr[0].paramsArray = self._paramsArray - for idx in range(len(val)): - string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreSignalParams)) + self._pvt_ptr[0].paramsArray = _paramsArray_new + else: + for idx in range(len(val)): + string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreSignalParams)) @@ -16988,6 +16481,7 @@ cdef class cudaExternalSemaphoreSignalNodeParamsV2: return [cudaExternalSemaphoreSignalParams(_ptr=arr) for arr in arrs] @paramsArray.setter def paramsArray(self, val): + cdef cyruntime.cudaExternalSemaphoreSignalParams* _paramsArray_new if len(val) == 0: free(self._paramsArray) self._paramsArray = NULL @@ -16995,14 +16489,22 @@ cdef class cudaExternalSemaphoreSignalNodeParamsV2: self._pvt_ptr[0].paramsArray = NULL else: if self._paramsArray_length != len(val): - free(self._paramsArray) - self._paramsArray = calloc(len(val), sizeof(cyruntime.cudaExternalSemaphoreSignalParams)) - if self._paramsArray is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _paramsArray_new = calloc(len(val), sizeof(cyruntime.cudaExternalSemaphoreSignalParams)) + if _paramsArray_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cyruntime.cudaExternalSemaphoreSignalParams))) + for idx in range(len(val)): + string.memcpy(&_paramsArray_new[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreSignalParams)) + free(self._paramsArray) + self._paramsArray = _paramsArray_new self._paramsArray_length = len(val) - self._pvt_ptr[0].paramsArray = self._paramsArray - for idx in range(len(val)): - string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreSignalParams)) + self._pvt_ptr[0].paramsArray = _paramsArray_new + else: + for idx in range(len(val)): + string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreSignalParams)) @@ -17115,6 +16617,7 @@ cdef class cudaExternalSemaphoreWaitNodeParams: return [cudaExternalSemaphoreWaitParams(_ptr=arr) for arr in arrs] @paramsArray.setter def paramsArray(self, val): + cdef cyruntime.cudaExternalSemaphoreWaitParams* _paramsArray_new if len(val) == 0: free(self._paramsArray) self._paramsArray = NULL @@ -17122,14 +16625,22 @@ cdef class cudaExternalSemaphoreWaitNodeParams: self._pvt_ptr[0].paramsArray = NULL else: if self._paramsArray_length != len(val): - free(self._paramsArray) - self._paramsArray = calloc(len(val), sizeof(cyruntime.cudaExternalSemaphoreWaitParams)) - if self._paramsArray is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _paramsArray_new = calloc(len(val), sizeof(cyruntime.cudaExternalSemaphoreWaitParams)) + if _paramsArray_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cyruntime.cudaExternalSemaphoreWaitParams))) + for idx in range(len(val)): + string.memcpy(&_paramsArray_new[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreWaitParams)) + free(self._paramsArray) + self._paramsArray = _paramsArray_new self._paramsArray_length = len(val) - self._pvt_ptr[0].paramsArray = self._paramsArray - for idx in range(len(val)): - string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreWaitParams)) + self._pvt_ptr[0].paramsArray = _paramsArray_new + else: + for idx in range(len(val)): + string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreWaitParams)) @@ -17242,6 +16753,7 @@ cdef class cudaExternalSemaphoreWaitNodeParamsV2: return [cudaExternalSemaphoreWaitParams(_ptr=arr) for arr in arrs] @paramsArray.setter def paramsArray(self, val): + cdef cyruntime.cudaExternalSemaphoreWaitParams* _paramsArray_new if len(val) == 0: free(self._paramsArray) self._paramsArray = NULL @@ -17249,14 +16761,22 @@ cdef class cudaExternalSemaphoreWaitNodeParamsV2: self._pvt_ptr[0].paramsArray = NULL else: if self._paramsArray_length != len(val): - free(self._paramsArray) - self._paramsArray = calloc(len(val), sizeof(cyruntime.cudaExternalSemaphoreWaitParams)) - if self._paramsArray is NULL: + # Allocate and fill a new buffer before touching the + # live state so a failure leaves this object unchanged + # (strong exception guarantee); the old buffer is only + # freed once the resize is known to succeed. + _paramsArray_new = calloc(len(val), sizeof(cyruntime.cudaExternalSemaphoreWaitParams)) + if _paramsArray_new is NULL: raise MemoryError('Failed to allocate length x size memory: ' + str(len(val)) + 'x' + str(sizeof(cyruntime.cudaExternalSemaphoreWaitParams))) + for idx in range(len(val)): + string.memcpy(&_paramsArray_new[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreWaitParams)) + free(self._paramsArray) + self._paramsArray = _paramsArray_new self._paramsArray_length = len(val) - self._pvt_ptr[0].paramsArray = self._paramsArray - for idx in range(len(val)): - string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreWaitParams)) + self._pvt_ptr[0].paramsArray = _paramsArray_new + else: + for idx in range(len(val)): + string.memcpy(&self._paramsArray[idx], (val[idx])._pvt_ptr, sizeof(cyruntime.cudaExternalSemaphoreWaitParams)) @@ -17642,14 +17162,6 @@ cdef class cudaGraphNodeParams: Type of the node - reserved0 : list[int] - Reserved. Must be zero. - - - reserved1 : list[long long] - Padding. Unused bytes must be zero. - - kernel : cudaKernelNodeParamsV2 Kernel node parameters. @@ -17698,10 +17210,6 @@ cdef class cudaGraphNodeParams: Conditional node parameters. - reserved2 : long long - Reserved bytes. Must be zero. - - Methods ------- getPtr() @@ -17766,18 +17274,6 @@ cdef class cudaGraphNodeParams: str_list += ['type : '] - try: - str_list += ['reserved0 : ' + str(self.reserved0)] - except ValueError: - str_list += ['reserved0 : '] - - - try: - str_list += ['reserved1 : ' + str(self.reserved1)] - except ValueError: - str_list += ['reserved1 : '] - - try: str_list += ['kernel :\n' + '\n'.join([' ' + line for line in str(self.kernel).splitlines()])] except ValueError: @@ -17849,12 +17345,6 @@ cdef class cudaGraphNodeParams: except ValueError: str_list += ['conditional : '] - - try: - str_list += ['reserved2 : ' + str(self.reserved2)] - except ValueError: - str_list += ['reserved2 : '] - return '\n'.join(str_list) else: return '' @@ -17867,22 +17357,6 @@ cdef class cudaGraphNodeParams: self._pvt_ptr[0].type = int(type) - @property - def reserved0(self): - return self._pvt_ptr[0].reserved0 - @reserved0.setter - def reserved0(self, reserved0): - self._pvt_ptr[0].reserved0 = reserved0 - - - @property - def reserved1(self): - return self._pvt_ptr[0].reserved1 - @reserved1.setter - def reserved1(self, reserved1): - self._pvt_ptr[0].reserved1 = reserved1 - - @property def kernel(self): return self._kernel @@ -17979,14 +17453,6 @@ cdef class cudaGraphNodeParams: string.memcpy(&self._pvt_ptr[0].conditional, conditional.getPtr(), sizeof(self._pvt_ptr[0].conditional)) - @property - def reserved2(self): - return self._pvt_ptr[0].reserved2 - @reserved2.setter - def reserved2(self, long long reserved2): - self._pvt_ptr[0].reserved2 = reserved2 - - cdef class cudaGraphEdgeData_st: """ Optional annotation for edges in a CUDA graph. Note, all edges @@ -18024,11 +17490,6 @@ cdef class cudaGraphEdgeData_st: See cudaGraphDependencyType. - reserved : bytes - These bytes are unused and must be zeroed. This ensures - compatibility if additional fields are added in the future. - - Methods ------- getPtr() @@ -18066,12 +17527,6 @@ cdef class cudaGraphEdgeData_st: except ValueError: str_list += ['type : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -18100,17 +17555,6 @@ cdef class cudaGraphEdgeData_st: self._pvt_ptr[0].type = type - @property - def reserved(self): - return PyBytes_FromStringAndSize(self._pvt_ptr[0].reserved, 5) - @reserved.setter - def reserved(self, reserved): - if len(reserved) != 5: - raise ValueError("reserved length must be 5, is " + str(len(reserved))) - for i, b in enumerate(reserved): - self._pvt_ptr[0].reserved[i] = b - - cdef class cudaGraphInstantiateParams_st: """ Graph instantiation parameters @@ -19167,12 +18611,12 @@ cdef class cudaLaunchAttributeValue: with the following fields: - `x` - The X dimension of the preferred cluster, in blocks. Must be a divisor of the grid X dimension, and must be a multiple of the `x` field of - ::cudaLaunchAttributeValue::clusterDim. - `y` - The Y dimension - of the preferred cluster, in blocks. Must be a divisor of the grid - Y dimension, and must be a multiple of the `y` field of - ::cudaLaunchAttributeValue::clusterDim. - `z` - The Z dimension - of the preferred cluster, in blocks. Must be equal to the `z` field - of ::cudaLaunchAttributeValue::clusterDim. + cudaLaunchAttributeValue::clusterDim. - `y` - The Y dimension of + the preferred cluster, in blocks. Must be a divisor of the grid Y + dimension, and must be a multiple of the `y` field of + cudaLaunchAttributeValue::clusterDim. - `z` - The Z dimension of + the preferred cluster, in blocks. Must be equal to the `z` field of + cudaLaunchAttributeValue::clusterDim. launchCompletionEvent : anon_struct20 @@ -20127,10 +19571,6 @@ cdef class cudaEglPlaneDesc_st: Channel Format Descriptor - reserved : list[unsigned int] - Reserved for future use - - Methods ------- getPtr() @@ -20189,12 +19629,6 @@ cdef class cudaEglPlaneDesc_st: except ValueError: str_list += ['channelDesc : '] - - try: - str_list += ['reserved : ' + str(self.reserved)] - except ValueError: - str_list += ['reserved : '] - return '\n'.join(str_list) else: return '' @@ -20247,14 +19681,6 @@ cdef class cudaEglPlaneDesc_st: string.memcpy(&self._pvt_ptr[0].channelDesc, channelDesc.getPtr(), sizeof(self._pvt_ptr[0].channelDesc)) - @property - def reserved(self): - return self._pvt_ptr[0].reserved - @reserved.setter - def reserved(self, reserved): - self._pvt_ptr[0].reserved = reserved - - cdef class anon_union12: """ Attributes diff --git a/cuda_bindings/docs/source/install.rst b/cuda_bindings/docs/source/install.rst index 7f890365ea3..d77464ec91f 100644 --- a/cuda_bindings/docs/source/install.rst +++ b/cuda_bindings/docs/source/install.rst @@ -120,11 +120,14 @@ Requirements * CUDA Toolkit headers[^1] * CUDA Runtime static library[^2] +* A git clone of the repository that includes tags[^3] [^1]: User projects that ``cimport`` CUDA symbols in Cython must also use CUDA Toolkit (CTK) types as provided by the ``cuda.bindings`` major.minor version. This results in CTK headers becoming a transitive dependency of downstream projects through CUDA Python. [^2]: The CUDA Runtime static library (``libcudart_static.a`` on Linux, ``cudart_static.lib`` on Windows) is part of the CUDA Toolkit. If using conda packages, it is contained in the ``cuda-cudart-static`` package. +[^3]: The version is derived from git tags via ``setuptools-scm``, so the clone must include tags reaching back to at least the latest ``v*`` tag. Clone with ``git clone https://github.com/NVIDIA/cuda-python.git``; do not use ``--depth`` or ``--no-tags``, since a shallow clone builds without error but produces a bogus version such as ``0.1.dev1+g0d22cb444``. See `Cloning the repository `_ for details and recovery steps. + Source builds require that the provided CUDA headers are of the same major.minor version as the ``cuda.bindings`` you're trying to build. Despite this requirement, note that the minor version compatibility is still maintained. Use the ``CUDA_PATH`` (or ``CUDA_HOME``) environment variable to specify the location of your headers. If both are set, ``CUDA_PATH`` takes precedence. For example, if your headers are located in ``/usr/local/cuda/include``, then you should set ``CUDA_PATH`` with: .. code-block:: console diff --git a/cuda_bindings/docs/source/module/runtime.rst b/cuda_bindings/docs/source/module/runtime.rst index 80b11f16644..000c5fa188f 100644 --- a/cuda_bindings/docs/source/module/runtime.rst +++ b/cuda_bindings/docs/source/module/runtime.rst @@ -1,7 +1,7 @@ .. SPDX-FileCopyrightText: Copyright (c) 2021-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. .. SPDX-License-Identifier: Apache-2.0 -.. CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=0eccd5db44f7406acb693f5dd95ad2fa17c787c11659578cf54e116eb0b06e01 +.. CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE: format=1; content-sha256=86b1e47dc2cb6ed343cc979b646bdfb99db65d352605464573a8e1d5b248fce2 ------- runtime ------- @@ -4185,7 +4185,7 @@ Data types used by CUDA Runtime Valid for graph nodes, launches. This attribute is graphs-only, and passing it to a launch in a non-capturing stream will result in an error. - :cudaLaunchAttributeValue::deviceUpdatableKernelNode::deviceUpdatable can only be set to 0 or 1. Setting the field to 1 indicates that the corresponding kernel node should be device-updatable. On success, a handle will be returned via :py:obj:`~.cudaLaunchAttributeValue.deviceUpdatableKernelNode.devNode` which can be passed to the various device-side update functions to update the node's kernel parameters from within another kernel. For more information on the types of device updates that can be made, as well as the relevant limitations thereof, see :py:obj:`~.cudaGraphKernelNodeUpdatesApply`. + :py:obj:`~.cudaLaunchAttributeValue.deviceUpdatableKernelNode.deviceUpdatable` can only be set to 0 or 1. Setting the field to 1 indicates that the corresponding kernel node should be device-updatable. On success, a handle will be returned via :py:obj:`~.cudaLaunchAttributeValue.deviceUpdatableKernelNode.devNode` which can be passed to the various device-side update functions to update the node's kernel parameters from within another kernel. For more information on the types of device updates that can be made, as well as the relevant limitations thereof, see :py:obj:`~.cudaGraphKernelNodeUpdatesApply`. Nodes which are device-updatable have additional restrictions compared to regular kernel nodes. Firstly, device-updatable nodes cannot be removed from their graph via :py:obj:`~.cudaGraphDestroyNode`. Additionally, once opted-in to this functionality, a node cannot opt out, and any attempt to set the deviceUpdatable attribute to 0 will result in an error. Device-updatable kernel nodes also cannot have their attributes copied to/from another kernel node via :py:obj:`~.cudaGraphKernelNodeCopyAttributes`. Graphs containing one or more device-updatable nodes also do not allow multiple instantiation, and neither the graph nor its instantiated version can be passed to :py:obj:`~.cudaGraphExecUpdate`. diff --git a/cuda_bindings/pixi.lock b/cuda_bindings/pixi.lock index 65cb1f78793..81e0045322d 100644 --- a/cuda_bindings/pixi.lock +++ b/cuda_bindings/pixi.lock @@ -20,6 +20,8 @@ environments: cu12: channels: - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda @@ -37,7 +39,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-12.9.79-h7938cbb_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_hcddb375_914.conda @@ -77,15 +79,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda @@ -120,8 +122,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.10-hd0affe5_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.10-hd0affe5_4.conda @@ -220,8 +222,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[04818863] @ . - - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder + - conda_source: cuda-bindings[595e6447] @ . + - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda @@ -238,7 +241,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-12.9.86-h7b14b0b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.9.86-h7b14b0b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-12.9.79-h16bee8c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py314h4c416a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.8-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_h62efc85_914.conda @@ -275,15 +278,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.5.0-he9c94f4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.2-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.2-hdae7a39_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwy-1.3.0-h81d0cf9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda @@ -316,8 +319,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h30591a0_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.10-hf9559e3_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.10-hf9559e3_4.conda @@ -412,8 +415,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[748b2e6f] @ . - - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder + - conda_source: cuda-bindings[cb9a5e74] @ . + - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda @@ -469,7 +473,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-12.9.86-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-12.9.86-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-profiler-api-12.9.79-h57928b3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.8-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/dav1d-1.2.1-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ffmpeg-8.0.1-gpl_hb2d76f6_914.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda @@ -551,11 +555,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-bindings[341f49d8] @ . - - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder + - conda_source: cuda-bindings[38bd5059] @ . + - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers cu13: channels: - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 @@ -574,7 +581,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.33-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.33-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_hb3f9226_906.conda @@ -611,15 +618,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.3-h6548e54_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.12.1-default_hafda6a7_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda @@ -652,8 +659,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda @@ -750,8 +757,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[5987685b] @ . - - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder + - conda_source: cuda-bindings[33376fba] @ . + - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.1-he30d5cf_0.conda @@ -767,7 +775,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.33-h7b14b0b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-13.3.33-h7b14b0b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-13.3.27-h16bee8c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py314h4c416a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.8-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_h936a714_906.conda @@ -801,15 +809,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.5.0-he9c94f4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.1-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.1-hdae7a39_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.3-hf53f6bf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.12.1-default_ha470c98_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda @@ -840,8 +848,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h30591a0_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.1-h10b116e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda @@ -933,8 +941,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[d33f8c8b] @ . - - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder + - conda_source: cuda-bindings[9909e402] @ . + - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda @@ -990,7 +999,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.33-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-13.3.33-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-profiler-api-13.3.27-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.8-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/dav1d-1.2.1-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ffmpeg-8.0.1-gpl_h74fd8f1_908.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda @@ -1066,11 +1075,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-bindings[8de8dc46] @ . - - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder + - conda_source: cuda-bindings[943c652a] @ . + - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers default: channels: - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 @@ -1081,15 +1093,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.2.0-h53410ce_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-13.3.73-h69a702a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-h4bc722e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-h4bc722e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.3-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-12.9.86-h69a702a_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-12.9.79-h7938cbb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_hb3f9226_906.conda @@ -1117,7 +1129,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda @@ -1126,15 +1138,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_15.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_15.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.3-h6548e54_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_15.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.12.1-default_hafda6a7_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda @@ -1142,8 +1154,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-13.3.29-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.9.82-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2025.2.0-hb617929_1.conda @@ -1167,8 +1179,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_15.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_15.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda @@ -1229,13 +1241,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -1265,8 +1277,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[5987685b] @ . - - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder + - conda_source: cuda-bindings[595e6447] @ . + - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.1-he30d5cf_0.conda @@ -1274,15 +1287,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h83712da_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-static-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-13.3.33-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-13.3.73-he9431aa_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.73-h7b14b0b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-13.3.73-h7b14b0b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-13.3.27-h16bee8c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.3-py314h4c416a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-static-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-12.9.86-h8f3c8d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-12.9.86-he9431aa_106.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-12.9.86-h7b14b0b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.9.86-h7b14b0b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-12.9.79-h16bee8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.8-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_h936a714_906.conda @@ -1307,7 +1320,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hf9559e3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.18.1.6-h42688b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.14.1.1-had8bf56_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.125-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libegl-1.7.0-hd24410f_2.conda @@ -1316,15 +1329,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.5.0-he9c94f4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.1-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.1-hdae7a39_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_15.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_15.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.3-hf53f6bf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_15.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.12.1-default_ha470c98_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda @@ -1332,8 +1345,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvfatbin-13.3.29-h8f3c8d4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-13.3.33-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvfatbin-12.9.82-h8f3c8d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-12.9.86-h8f3c8d4_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libogg-1.3.5-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-2025.2.0-hcd21e76_1.conda @@ -1355,8 +1368,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h30591a0_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_15.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_15.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda @@ -1413,13 +1426,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-13.3.3.4.1-h579c4fd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-13.3.73-h579c4fd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-aarch64-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-13.3.73-h579c4fd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-12.9.27-h579c4fd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-12.9.86-h579c4fd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-aarch64-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-12.9.86-h579c4fd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -1448,8 +1461,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[d33f8c8b] @ . - - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder + - conda_source: cuda-bindings[cb9a5e74] @ . + - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda @@ -1505,7 +1519,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-12.9.86-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-12.9.86-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-profiler-api-12.9.79-h57928b3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.3-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.8-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/dav1d-1.2.1-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ffmpeg-8.0.1-gpl_h74fd8f1_907.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda @@ -1581,8 +1595,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-bindings[341f49d8] @ . - - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder + - conda_source: cuda-bindings[38bd5059] @ . + - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers docs: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -1597,7 +1612,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-13.2.0-py312hf79963d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.33-h4bc722e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py312h68e6be4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.9-py312h68e6be4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py312h8285ef7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.3.2-py312h8285ef7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda @@ -1772,7 +1787,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-13.2.0-py312hdc0efb6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-13.3.33-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.33-h7b14b0b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py312he940de5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py312hbda70bc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.20-py312hf55c4e8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.3.2-py312hf55c4e8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda @@ -2059,7 +2074,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-13.2.0-py312hc128f0a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-13.3.33-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.33-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py312hd245ac3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py312hd245ac3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py312ha1a9051_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/greenlet-3.3.2-py312ha1a9051_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda @@ -2112,6 +2127,7 @@ packages: sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 md5: d7c89558ba9fa0495403155b64376d81 license: None + purls: [] size: 2562 timestamp: 1578324546067 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda @@ -2142,6 +2158,7 @@ packages: - openmp_impl 9999 license: BSD-3-Clause license_family: BSD + purls: [] size: 23621 timestamp: 1650670423406 - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.1-hb03c661_0.conda @@ -2152,6 +2169,7 @@ packages: - libgcc >=14 license: LGPL-2.1-or-later license_family: GPL + purls: [] size: 585491 timestamp: 1766155792553 - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda @@ -2162,6 +2180,7 @@ packages: - libgcc >=14 license: LGPL-2.1-or-later license_family: GPL + purls: [] size: 584660 timestamp: 1768327524772 - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda @@ -2172,6 +2191,7 @@ packages: - libstdcxx-ng >=12 license: BSD-2-Clause license_family: BSD + purls: [] size: 2706396 timestamp: 1718551242397 - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda @@ -2182,6 +2202,7 @@ packages: - libgcc >=13 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 68072 timestamp: 1756738968573 - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda @@ -2207,6 +2228,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 3747046 timestamp: 1764007847963 - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_105.conda @@ -2218,6 +2240,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 3719982 timestamp: 1766513109980 - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda @@ -2229,6 +2252,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 3744895 timestamp: 1770267152681 - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda @@ -2270,6 +2294,19 @@ packages: - pkg:pypi/brotli?source=hash-mapping size: 368300 timestamp: 1764017300621 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + sha256: 1a0d382c515ebf55f8ee1f38c8b81bc95af5c2acc42ad53b66bc5df932032f96 + md5: e675fabcf81499adc7edf58124fb1e01 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 257808 + timestamp: 1785906269155 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 md5: 51a19bba1b8ebfb60df25cde030b7ebc @@ -2278,6 +2315,7 @@ packages: - libgcc >=14 license: bzip2-1.0.6 license_family: BSD + purls: [] size: 260341 timestamp: 1757437258798 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda @@ -2317,6 +2355,7 @@ packages: - xorg-libxext >=1.3.6,<2.0a0 - xorg-libxrender >=0.9.12,<0.10.0a0 license: LGPL-2.1-only or MPL-1.1 + purls: [] size: 978114 timestamp: 1741554591855 - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda @@ -2343,6 +2382,7 @@ packages: - xorg-libxext >=1.3.6,<2.0a0 - xorg-libxrender >=0.9.12,<0.10.0a0 license: LGPL-2.1-only or MPL-1.1 + purls: [] size: 989514 timestamp: 1766415934926 - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.2.0-h53410ce_16.conda @@ -2352,6 +2392,7 @@ packages: - gcc_impl_linux-64 >=15.2.0,<15.2.1.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 31290 timestamp: 1765257044086 - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-13.2.0-py312hf79963d_0.conda @@ -2387,6 +2428,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23242 timestamp: 1749218416505 @@ -2400,6 +2442,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24659 timestamp: 1779898425780 @@ -2415,6 +2458,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -2432,6 +2476,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=13.3.29,<14.0a0 @@ -2447,6 +2492,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23283 timestamp: 1749218442382 @@ -2460,6 +2506,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24626 timestamp: 1779898435744 @@ -2472,6 +2519,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 67168282 timestamp: 1760723629347 @@ -2530,6 +2578,7 @@ packages: - cuda-nvvm-impl 12.9.86.* - cuda-nvvm-tools 12.9.86.* license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 25475 timestamp: 1771619493286 @@ -2541,6 +2590,7 @@ packages: - cuda-nvvm-impl 13.3.33.* - cuda-nvvm-tools 13.3.33.* license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 25697 timestamp: 1779909800589 - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-13.3.73-h69a702a_0.conda @@ -2562,6 +2612,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libgcc >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 21425520 timestamp: 1753975283188 @@ -2595,6 +2646,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libgcc >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24246736 timestamp: 1753975332907 @@ -2606,6 +2658,7 @@ packages: - cuda-version >=13.3,<13.4.0a0 - libgcc >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 29720382 timestamp: 1779905121216 - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-h4bc722e_0.conda @@ -2626,6 +2679,7 @@ packages: - cuda-cudart-dev - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23668 timestamp: 1761098836058 @@ -2636,12 +2690,13 @@ packages: - cuda-cudart-dev - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 25007 timestamp: 1779913616712 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.3-py314h1807b08_0.conda - sha256: a0e2ed0efefb82278e0fd1d455d10d1095d951a896591838b30674aa872300c4 - md5: f0658a93053b13335be941289d7d6160 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda + sha256: f0210259007f573e38f7b8037be9b36e53aa0906b786e9f1f931e0a24f8a18e6 + md5: 0e6a14f60b561b2fff81d325b4dc8283 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -2650,11 +2705,14 @@ packages: - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: APACHE - size: 3797747 - timestamp: 1765651158436 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py312h68e6be4_0.conda - sha256: 01b815091e0c534a5f32a830b514e31c150dc2f539b7ba1d5c70b6d095a5ebcf - md5: 14f638dad5953c83443a2c4f011f1c9e + purls: + - pkg:pypi/cython?source=hash-mapping + run_exports: {} + size: 3819412 + timestamp: 1782821647528 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.9-py312h68e6be4_0.conda + sha256: 13e37a868e52933951b3f80fd5fe953742804499f2ee2b9a123e74070c265c0d + md5: 7311d3a6721eec7d76f4a84045f1ddfd depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -2665,35 +2723,9 @@ packages: license_family: APACHE purls: - pkg:pypi/cython?source=hash-mapping - size: 3738170 - timestamp: 1767577770165 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py314h1807b08_0.conda - sha256: f700d10c2a794710a1656a6fdb8908fb04f3c7812ac4f17187777646ede1a3d9 - md5: 866fd3d25b767bccb4adc8476f4035cd - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: APACHE - size: 3806945 - timestamp: 1767576996860 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - sha256: f0210259007f573e38f7b8037be9b36e53aa0906b786e9f1f931e0a24f8a18e6 - md5: 0e6a14f60b561b2fff81d325b4dc8283 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: APACHE run_exports: {} - size: 3819412 - timestamp: 1782821647528 + size: 3731635 + timestamp: 1785016112258 - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda sha256: 22053a5842ca8ee1cf8e1a817138cdb5e647eb2c46979f84153f6ad7bde73020 md5: 418c6ca5929a611cbd69204907a83995 @@ -2701,6 +2733,7 @@ packages: - libgcc-ng >=12 license: BSD-2-Clause license_family: BSD + purls: [] size: 760229 timestamp: 1685695754230 - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda @@ -2714,6 +2747,7 @@ packages: - libglib >=2.86.2,<3.0a0 - libexpat >=2.7.3,<3.0a0 license: AFL-2.1 OR GPL-2.0-or-later + purls: [] size: 447649 timestamp: 1764536047944 - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py312h8285ef7_0.conda @@ -2790,6 +2824,7 @@ packages: - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 12482468 timestamp: 1765653517558 - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_hcddb375_914.conda @@ -2853,6 +2888,7 @@ packages: - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 12485347 timestamp: 1773008832077 - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda @@ -2867,6 +2903,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 265599 timestamp: 1730283881107 - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda @@ -2882,6 +2919,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 270705 timestamp: 1771382710863 - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda @@ -2891,6 +2929,7 @@ packages: - libfreetype 2.14.1 ha770c72_0 - libfreetype6 2.14.1 h73754d4_0 license: GPL-2.0-only OR FTL + purls: [] size: 173114 timestamp: 1757945422243 - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda @@ -2900,6 +2939,7 @@ packages: - libfreetype 2.14.2 ha770c72_0 - libfreetype6 2.14.2 h73754d4_0 license: GPL-2.0-only OR FTL + purls: [] size: 174292 timestamp: 1772757205296 - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda @@ -2909,6 +2949,7 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] size: 61244 timestamp: 1757438574066 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-h0dff253_16.conda @@ -2919,6 +2960,7 @@ packages: - gcc_impl_linux-64 15.2.0 hc5723f1_16 license: BSD-3-Clause license_family: BSD + purls: [] size: 28938 timestamp: 1765257209407 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-h6f77f03_18.conda @@ -2930,6 +2972,7 @@ packages: - gcc_no_conda_specs license: BSD-3-Clause license_family: BSD + purls: [] size: 29453 timestamp: 1771378662937 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-hc5723f1_16.conda @@ -2946,25 +2989,9 @@ packages: - sysroot_linux-64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 80309755 timestamp: 1765256937267 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda - sha256: a48400ec4b73369c1c59babe4ad35821b63a88bba0ec40a80cea5f8c53a26b83 - md5: e3be72048d3c4a78b8e27ec48ba06252 - depends: - - binutils_impl_linux-64 >=2.45 - - libgcc >=15.2.0 - - libgcc-devel_linux-64 15.2.0 hcc6f6b0_119 - - libgomp >=15.2.0 - - libsanitizer 15.2.0 h90f66d4_19 - - libstdcxx >=15.2.0 - - libstdcxx-devel_linux-64 15.2.0 hd446a21_119 - - sysroot_linux-64 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - run_exports: {} - size: 81180457 - timestamp: 1778269124617 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he420e7e_18.conda sha256: a088cfd3ae6fa83815faa8703bc9d21cc915f17bd1b51aac9c16ddf678da21e4 md5: cf56b6d74f580b91fd527e10d9a2e324 @@ -2979,22 +3006,40 @@ packages: - sysroot_linux-64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 81814135 timestamp: 1771378369317 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_27.conda - sha256: b24b13d467898a9b9a17a868a2686412a98f8935dc7cc51547dd90645d4e8436 - md5: 28bc49875f9c38e2401696b3e48d0798 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-16.1.0-h5fcb69b_1.conda + sha256: 00c87015522248adb5565a1b8f977cfe927831dd7ef0cb0a5d13f896844af719 + md5: 419982d8913246db404319048e062d3e + depends: + - binutils_impl_linux-64 >=2.46.1 + - libgcc >=16.1.0 + - libgcc-devel_linux-64 16.1.0 h59071f9_101 + - libgomp >=16.1.0 + - libsanitizer 16.1.0 hf2715c6_1 + - libstdcxx >=16.1.0 + - libstdcxx-devel_linux-64 16.1.0 h41cdd0d_101 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 85161422 + timestamp: 1785375529345 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-16.1.0-h5fd2508_0.conda + sha256: 22d2b2c0386fda70971c87afd4926cb20ba1a247421f5be617c43512570fa4f7 + md5: 15b9577e4be98443deb42e88e9c44656 depends: - - gcc_impl_linux-64 15.2.0.* + - gcc_impl_linux-64 16.1.0.* - binutils_linux-64 - sysroot_linux-64 license: BSD-3-Clause license_family: BSD run_exports: strong: - - libgcc >=15 - size: 29330 - timestamp: 1781279944230 + - libgcc >=16 + size: 29720 + timestamp: 1785386616206 - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.4-h2b0a6b4_0.conda sha256: f47222f58839bcc77c15f11a8814c1d8cb8080c5ca6ba83398a12b640fd3c85c md5: c379d67c686fb83475c1a6ed41cc41ff @@ -3008,6 +3053,7 @@ packages: - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 572093 timestamp: 1761082340749 - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda @@ -3023,6 +3069,7 @@ packages: - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 575109 timestamp: 1771530561157 - conda: https://conda.anaconda.org/conda-forge/linux-64/glslang-16.1.0-hfd11570_0.conda @@ -3035,6 +3082,7 @@ packages: - spirv-tools >=2025,<2026.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1312583 timestamp: 1764720535916 - conda: https://conda.anaconda.org/conda-forge/linux-64/glslang-16.2.0-h96af755_1.conda @@ -3047,6 +3095,7 @@ packages: - spirv-tools >=2026,<2027.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1353008 timestamp: 1770195199411 - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda @@ -3056,6 +3105,7 @@ packages: - libgcc-ng >=12 - libstdcxx-ng >=12 license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] size: 460055 timestamp: 1718980856608 - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda @@ -3067,6 +3117,7 @@ packages: - libstdcxx >=14 license: LGPL-2.0-or-later license_family: LGPL + purls: [] size: 99596 timestamp: 1755102025473 - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.3.2-py312h8285ef7_0.conda @@ -3092,6 +3143,7 @@ packages: - gxx_impl_linux-64 15.2.0 hda75c37_16 license: BSD-3-Clause license_family: BSD + purls: [] size: 28467 timestamp: 1765257244273 - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-h76987e4_18.conda @@ -3102,6 +3154,7 @@ packages: - gxx_impl_linux-64 15.2.0 hda75c37_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 28723 timestamp: 1771378698305 - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_16.conda @@ -3114,6 +3167,7 @@ packages: - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 16357678 timestamp: 1765257161133 - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_18.conda @@ -3126,37 +3180,38 @@ packages: - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 15587873 timestamp: 1771378609722 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda - sha256: 3f5288346b9fe233352443b3c2e31f1fde845e39d3e96475fc05ec2e782af158 - md5: 9d41f3899b512199af0a4bb939b83e21 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-16.1.0-he33a5f8_1.conda + sha256: 4b7e7a082fab18a58409b05c2611b8edb4aeb06ee07be380a73da5de911da2ba + md5: aaeab97072d79e7945182dc7d4e1a035 depends: - - gcc_impl_linux-64 15.2.0 he0086c7_19 - - libstdcxx-devel_linux-64 15.2.0 hd446a21_119 + - gcc_impl_linux-64 16.1.0 h5fcb69b_1 + - libstdcxx-devel_linux-64 16.1.0 h41cdd0d_101 - sysroot_linux-64 - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL run_exports: {} - size: 16356816 - timestamp: 1778269332159 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-hcb00b6d_27.conda - sha256: f78da7a8b49943a6ce48372a5bc85ab741ac86666f1040e8876545065ec1096e - md5: 5e194579a5f72c70102f342aa362f5f9 - depends: - - gxx_impl_linux-64 15.2.0.* - - gcc_linux-64 ==15.2.0 h7be306e_27 + size: 16633585 + timestamp: 1785375706410 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-16.1.0-h5525346_0.conda + sha256: c8c0b721dadcc8d48d2a5a9ee56add4b46ce5427adbf6ff685e0f75fabd52cbd + md5: 4521cfa739a42179511b351566374c6e + depends: + - gxx_impl_linux-64 16.1.0.* + - gcc_linux-64 ==16.1.0 h5fd2508_0 - binutils_linux-64 - sysroot_linux-64 license: BSD-3-Clause license_family: BSD run_exports: strong: - - libstdcxx >=15 - - libgcc >=15 - size: 27848 - timestamp: 1781279944230 + - libstdcxx >=16 + - libgcc >=16 + size: 28116 + timestamp: 1785386616206 - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.2.0-h15599e2_0.conda sha256: 6bd8b22beb7d40562b2889dc68232c589ff0d11a5ad3addd41a8570d11f039d9 md5: b8690f53007e9b5ee2c2178dd4ac778c @@ -3174,6 +3229,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 2411408 timestamp: 1762372726141 - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.3.0-h6083320_0.conda @@ -3193,6 +3249,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 2062122 timestamp: 1766937132307 - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.1.0-h6083320_0.conda @@ -3212,6 +3269,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 2615630 timestamp: 1773217509651 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda @@ -3223,6 +3281,7 @@ packages: - libstdcxx-ng >=12 license: MIT license_family: MIT + purls: [] size: 12129203 timestamp: 1720853576813 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.1-h33c6efd_0.conda @@ -3234,6 +3293,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 12722920 timestamp: 1766299101259 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda @@ -3245,6 +3305,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 12728445 timestamp: 1767969922681 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda @@ -3259,6 +3320,20 @@ packages: purls: [] size: 12723451 timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda + sha256: d7c260b7e1cf22ce04d6ba8a86eabf4e6c50bc96a5c27fe2ecb32298af3e88eb + md5: 4ef4b977bb216a3001a3334696a80850 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 14455340 + timestamp: 1784916378180 - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.9.0-hb700be7_0.conda sha256: edad668db79c6c4899d46e1cd4a331f5d008f9ed8f7d2e39e1dfe1a2d81acec0 md5: 26311c5112b5c713f472bdfbb5ec5aa3 @@ -3268,6 +3343,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 1009795 timestamp: 1765886047465 - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-media-driver-25.3.4-hecca717_0.conda @@ -3281,6 +3357,7 @@ packages: - libva >=2.22.0,<3.0a0 license: MIT license_family: MIT + purls: [] size: 8424610 timestamp: 1757591682198 - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-media-driver-26.1.4-hecca717_0.conda @@ -3294,6 +3371,7 @@ packages: - libva >=2.23.0,<3.0a0 license: MIT license_family: MIT + purls: [] size: 8783533 timestamp: 1773230300873 - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -3329,6 +3407,7 @@ packages: - libgcc-ng >=12 license: LGPL-2.0-only license_family: LGPL + purls: [] size: 508258 timestamp: 1664996250081 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda @@ -3341,6 +3420,7 @@ packages: - binutils_impl_linux-64 2.45 license: GPL-3.0-only license_family: GPL + purls: [] size: 725545 timestamp: 1764007826689 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda @@ -3353,6 +3433,7 @@ packages: - binutils_impl_linux-64 2.45 license: GPL-3.0-only license_family: GPL + purls: [] size: 730831 timestamp: 1766513089214 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda @@ -3365,6 +3446,7 @@ packages: - binutils_impl_linux-64 2.45.1 license: GPL-3.0-only license_family: GPL + purls: [] size: 725507 timestamp: 1770267139900 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda @@ -3402,6 +3484,7 @@ packages: - libstdcxx >=13 license: Apache-2.0 license_family: Apache + purls: [] size: 264243 timestamp: 1745264221534 - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda @@ -3413,6 +3496,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: Apache + purls: [] size: 261513 timestamp: 1773113328888 - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.26.2-hb700be7_0.conda @@ -3424,6 +3508,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 667315 timestamp: 1765910088541 - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.26.3-hb700be7_0.conda @@ -3435,6 +3520,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 667437 timestamp: 1766226025812 - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.28.2-hb700be7_0.conda @@ -3446,6 +3532,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 858387 timestamp: 1772045965844 - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda @@ -3460,6 +3547,7 @@ packages: - abseil-cpp =20250512.1 license: Apache-2.0 license_family: Apache + purls: [] size: 1310612 timestamp: 1750194198254 - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda @@ -3474,6 +3562,7 @@ packages: - abseil-cpp =20260107.1 license: Apache-2.0 license_family: Apache + purls: [] size: 1384817 timestamp: 1770863194876 - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.4-h96ad9f0_0.conda @@ -3491,6 +3580,7 @@ packages: - fonts-conda-ecosystem - harfbuzz >=11.0.1 license: ISC + purls: [] size: 152179 timestamp: 1749328931930 - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda @@ -3508,6 +3598,7 @@ packages: - liblapacke 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18213 timestamp: 1765818813880 - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda @@ -3536,6 +3627,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 79965 timestamp: 1764017188531 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda @@ -3547,6 +3639,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 34632 timestamp: 1764017199083 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda @@ -3558,6 +3651,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 298378 timestamp: 1764017210931 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-h3ff7636_0.conda @@ -3569,6 +3663,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 121429 timestamp: 1762349484074 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda @@ -3582,6 +3677,19 @@ packages: purls: [] size: 124432 timestamp: 1774333989027 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + sha256: 8cb25174d6b6fac95d31e86cfe41faffc8ee9dacbf2bfd22e6c23377e8f338c1 + md5: 5db514adf5f843126ff846d1510f22a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcap >=2.78,<2.79.0a0 + size: 124306 + timestamp: 1786025967663 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda sha256: cc8c9fc6ddf0fbd3d1275b558ae9abad6cda23bced268732e2da21a87bb358cd md5: f9f17eab7f3df1c6fd4b1a548a2f683a @@ -3590,6 +3698,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] run_exports: weak: - libcap >=2.78,<2.79.0a0 @@ -3607,6 +3716,7 @@ packages: - liblapack 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18194 timestamp: 1765818837135 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda @@ -3634,6 +3744,7 @@ packages: - libstdcxx >=14 - rdma-core >=59.0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 969845 timestamp: 1761098818759 @@ -3660,6 +3771,7 @@ packages: - libstdcxx >=14 - rdma-core >=63.0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1117538 timestamp: 1782772352403 @@ -3705,6 +3817,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 73490 timestamp: 1761979956660 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda @@ -3716,6 +3829,7 @@ packages: - libpciaccess >=0.18,<0.19.0a0 license: MIT license_family: MIT + purls: [] size: 310785 timestamp: 1757212153962 - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda @@ -3738,6 +3852,7 @@ packages: - __glibc >=2.17,<3.0.a0 - libglvnd 1.7.0 ha4b6fd6_2 license: LicenseRef-libglvnd + purls: [] size: 44840 timestamp: 1731330973553 - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda @@ -3750,6 +3865,7 @@ packages: - expat 2.7.3.* license: MIT license_family: MIT + purls: [] size: 76643 timestamp: 1763549731408 - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda @@ -3762,6 +3878,7 @@ packages: - expat 2.7.4.* license: MIT license_family: MIT + purls: [] size: 76798 timestamp: 1771259418166 - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda @@ -3812,6 +3929,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 57821 timestamp: 1760295480630 - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda @@ -3825,6 +3943,7 @@ packages: - libstdcxx >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 424563 timestamp: 1764526740626 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda @@ -3833,6 +3952,7 @@ packages: depends: - libfreetype6 >=2.14.1 license: GPL-2.0-only OR FTL + purls: [] size: 7664 timestamp: 1757945417134 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda @@ -3841,6 +3961,7 @@ packages: depends: - libfreetype6 >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 8035 timestamp: 1772757210108 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda @@ -3854,6 +3975,7 @@ packages: constrains: - freetype >=2.14.1 license: GPL-2.0-only OR FTL + purls: [] size: 386739 timestamp: 1757945416744 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda @@ -3867,33 +3989,9 @@ packages: constrains: - freetype >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 386316 timestamp: 1772757193822 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_15.conda - sha256: 37f2edde2f8281672987c63f13c85a57d04d889dc929ce38204426d5eb2059cc - md5: a5d86b0496174a412d531eac03af9174 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - constrains: - - libgomp 15.2.0 he0feb66_15 - - libgcc-ng ==15.2.0=*_15 - license: GPL-3.0-only WITH GCC-exception-3.1 - size: 1041379 - timestamp: 1764836112865 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - sha256: 6eed58051c2e12b804d53ceff5994a350c61baf117ec83f5f10c953a3f311451 - md5: 6d0363467e6ed84f11435eb309f2ff06 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - constrains: - - libgcc-ng ==15.2.0=*_16 - - libgomp 15.2.0 he0feb66_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 1042798 - timestamp: 1765256792743 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 md5: 0aa00f03f9e39fb9876085dee11a85d4 @@ -3908,38 +4006,21 @@ packages: purls: [] size: 1041788 timestamp: 1771378212382 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 - md5: 57736f29cc2b0ec0b6c2952d3f101b6a +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + sha256: d5cb8475131c31680f8fd30512c418f373064e272e452063276a8fb14c9fa42f + md5: 5a7d954665c707c93311657cd779c705 depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: - - libgcc-ng ==15.2.0=*_19 - - libgomp 15.2.0 he0feb66_19 + - libgomp 16.1.0 he0feb66_1 + - libgcc-ng ==16.1.0=*_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] run_exports: {} - size: 1041084 - timestamp: 1778269013026 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_15.conda - sha256: 497d8cdba0da8fa154613d1c15f585674cadc194964ed1b4fe7c2809938dc41f - md5: 7b742943660c5173bb6a5c823021c9a0 - depends: - - libgcc 15.2.0 he0feb66_15 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 26834 - timestamp: 1764836127111 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - sha256: 5f07f9317f596a201cc6e095e5fc92621afca64829785e483738d935f8cab361 - md5: 5a68259fac2da8f2ee6f7bfe49c9eb8b - depends: - - libgcc 15.2.0 he0feb66_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 27256 - timestamp: 1765256804124 + size: 1057877 + timestamp: 1785375436766 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 md5: d5e96b1ed75ca01906b3d2469b4ce493 @@ -3950,6 +4031,19 @@ packages: purls: [] size: 27526 timestamp: 1771378224552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda + sha256: 225275c562337a1cd61705da0ee4235dde7bba7504de1c34b74c894adb2b0eee + md5: 7ed870c014a6f23c7dfafda53d2763a9 + depends: + - libgcc 16.1.0 ha9f2e26_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libgcc + size: 28210 + timestamp: 1785375440733 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda sha256: 8a7b01e1ee1c462ad243524d76099e7174ebdd94ff045fe3e9b1e58db196463b md5: 40d9b534410403c821ff64f00d0adc22 @@ -3959,6 +4053,7 @@ packages: - libgfortran-ng ==15.2.0=*_16 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 27215 timestamp: 1765256845586 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda @@ -3983,6 +4078,7 @@ packages: - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 2480559 timestamp: 1765256819588 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda @@ -4006,6 +4102,7 @@ packages: - libglvnd 1.7.0 ha4b6fd6_2 - libglx 1.7.0 ha4b6fd6_2 license: LicenseRef-libglvnd + purls: [] size: 134712 timestamp: 1731330998354 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.3-h6548e54_0.conda @@ -4021,6 +4118,7 @@ packages: constrains: - glib 2.86.3 *_0 license: LGPL-2.1-or-later + purls: [] size: 3946542 timestamp: 1765221858705 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda @@ -4036,6 +4134,7 @@ packages: constrains: - glib 2.86.4 *_1 license: LGPL-2.1-or-later + purls: [] size: 4398701 timestamp: 1771863239578 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda @@ -4044,6 +4143,7 @@ packages: depends: - __glibc >=2.17,<3.0.a0 license: LicenseRef-libglvnd + purls: [] size: 132463 timestamp: 1731330968309 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda @@ -4054,25 +4154,9 @@ packages: - libglvnd 1.7.0 ha4b6fd6_2 - xorg-libx11 >=1.8.10,<2.0a0 license: LicenseRef-libglvnd + purls: [] size: 75504 timestamp: 1731330988898 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_15.conda - sha256: b3c4e39be7aba6f5a8695d428362c5c918b96a281ce0a7037f1e889dfc340615 - md5: a90d6983da0757f4c09bb8fcfaf34e71 - depends: - - __glibc >=2.17,<3.0.a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - size: 602978 - timestamp: 1764836011147 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - sha256: 5b3e5e4e9270ecfcd48f47e3a68f037f5ab0f529ccb223e8e5d5ac75a58fc687 - md5: 26c46f90d0e727e95c6c9498a33a09f3 - depends: - - __glibc >=2.17,<3.0.a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 603284 - timestamp: 1765256703881 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 md5: 239c5e9546c38a1e884d69effcf4c882 @@ -4083,18 +4167,19 @@ packages: purls: [] size: 603262 timestamp: 1771378117851 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b - md5: faac990cb7aedc7f3a2224f2c9b0c26c +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + sha256: 62cb599ad0539d99386515326d9d5e8f51f75a60c69c2131b21df76edf35bd89 + md5: 88f2d91cb1533194c323534253094d23 depends: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] run_exports: strong: - _openmp_mutex >=4.5 - size: 603817 - timestamp: 1778268942614 + size: 640415 + timestamp: 1785375373755 - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.12.1-default_hafda6a7_1003.conda sha256: b9e6340da35245d5f3b7b044b4070b4980809d340bddf16c942a97a83f146aa4 md5: 4fe840c6d6b3719b4231ed89d389bb17 @@ -4106,6 +4191,7 @@ packages: - libxml2-16 >=2.14.6 license: BSD-3-Clause license_family: BSD + purls: [] size: 2449346 timestamp: 1765089858592 - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda @@ -4119,6 +4205,7 @@ packages: - libxml2-16 >=2.14.6 license: BSD-3-Clause license_family: BSD + purls: [] size: 2449916 timestamp: 1765103845133 - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda @@ -4129,6 +4216,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: Apache-2.0 OR BSD-3-Clause + purls: [] size: 1448617 timestamp: 1758894401402 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda @@ -4138,6 +4226,7 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: LGPL-2.1-only + purls: [] size: 790176 timestamp: 1754908768807 - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda @@ -4149,6 +4238,7 @@ packages: constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib + purls: [] size: 633710 timestamp: 1762094827865 - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-ha09017c_0.conda @@ -4163,6 +4253,7 @@ packages: - libbrotlidec >=1.2.0,<1.3.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1883476 timestamp: 1770801977654 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda @@ -4177,6 +4268,7 @@ packages: - libcblas 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18200 timestamp: 1765818857876 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda @@ -4203,6 +4295,7 @@ packages: constrains: - xz 5.8.1.* license: 0BSD + purls: [] size: 112894 timestamp: 1749230047870 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda @@ -4239,6 +4332,7 @@ packages: - libgcc >=14 license: BSD-2-Clause license_family: BSD + purls: [] run_exports: {} size: 92400 timestamp: 1769482286018 @@ -4250,6 +4344,7 @@ packages: - libgcc >=13 license: BSD-2-Clause license_family: BSD + purls: [] size: 91183 timestamp: 1748393666725 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda @@ -4286,31 +4381,34 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 818615 timestamp: 1761098926897 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-13.3.29-hecca717_0.conda - sha256: 3de6aed48ca7a705aa22444b54ad7236f0e1f9dc7f41ec3e2273e6cb991be213 - md5: 1f9be211f7ec5c88b1d2d561aee7884d +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-12.9.82-hecca717_2.conda + sha256: e044659e3a7e0a3168951fe8c4d7ad0e3b243211037d326d4e62540c75ce010a + md5: 1812ac6d93b3d1079881ccac0615e273 depends: - __glibc >=2.17,<3.0.a0 - - cuda-version >=13.3,<13.4.0a0 + - cuda-version >=12,<12.10.0a0 - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement - size: 472135 - timestamp: 1779897596590 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-13.3.29-hecca717_1.conda - sha256: 2f4f4824d6eb16693fa04aca1f872b64df48445e26e8a357dc538bf9825c25fa - md5: df0f2d96a171e8f843d4f03fa3d8d3d9 + purls: [] + run_exports: {} + size: 818431 + timestamp: 1782920268840 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-13.3.29-hecca717_0.conda + sha256: 3de6aed48ca7a705aa22444b54ad7236f0e1f9dc7f41ec3e2273e6cb991be213 + md5: 1f9be211f7ec5c88b1d2d561aee7884d depends: - __glibc >=2.17,<3.0.a0 - cuda-version >=13.3,<13.4.0a0 - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 470857 - timestamp: 1782920237017 + purls: [] + size: 472135 + timestamp: 1779897596590 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda sha256: 3b1c851f4fc42d347ce1c1606bdd195343a47f121e0fceb7a1f1e5aa1d497da9 md5: 3461b0f2d5cbb7973d361f9e85241d98 @@ -4320,6 +4418,8 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} size: 30515495 timestamp: 1760723776293 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda @@ -4343,6 +4443,7 @@ packages: - __glibc >=2.17,<3.0.a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 218500 timestamp: 1745825989535 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda @@ -4357,6 +4458,7 @@ packages: - openblas >=0.3.30,<0.3.31.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 5927939 timestamp: 1763114673331 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda @@ -4383,6 +4485,7 @@ packages: - libstdcxx >=14 - pugixml >=1.15,<1.16.0a0 - tbb >=2021.13.0 + purls: [] size: 6244771 timestamp: 1753211097492 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2026.0.0-hb56ce9e_1.conda @@ -4396,6 +4499,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 6582302 timestamp: 1772727204779 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2025.2.0-hed573e4_1.conda @@ -4407,6 +4511,7 @@ packages: - libopenvino 2025.2.0 hb617929_1 - libstdcxx >=14 - tbb >=2021.13.0 + purls: [] size: 114760 timestamp: 1753211116381 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2026.0.0-hd85de46_1.conda @@ -4420,6 +4525,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 114431 timestamp: 1772727230331 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2025.2.0-hed573e4_1.conda @@ -4431,6 +4537,7 @@ packages: - libopenvino 2025.2.0 hb617929_1 - libstdcxx >=14 - tbb >=2021.13.0 + purls: [] size: 250500 timestamp: 1753211127339 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2026.0.0-hd85de46_1.conda @@ -4444,6 +4551,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 249056 timestamp: 1772727247597 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2025.2.0-hd41364c_1.conda @@ -4455,6 +4563,7 @@ packages: - libopenvino 2025.2.0 hb617929_1 - libstdcxx >=14 - pugixml >=1.15,<1.16.0a0 + purls: [] size: 194815 timestamp: 1753211138624 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2026.0.0-hd41364c_1.conda @@ -4468,6 +4577,7 @@ packages: - pugixml >=1.15,<1.16.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 211582 timestamp: 1772727264950 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2025.2.0-hb617929_1.conda @@ -4480,6 +4590,7 @@ packages: - libstdcxx >=14 - pugixml >=1.15,<1.16.0a0 - tbb >=2021.13.0 + purls: [] size: 12377488 timestamp: 1753211149903 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2026.0.0-hb56ce9e_1.conda @@ -4494,6 +4605,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 13173323 timestamp: 1772727282718 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2025.2.0-hb617929_1.conda @@ -4507,6 +4619,7 @@ packages: - ocl-icd >=2.3.3,<3.0a0 - pugixml >=1.15,<1.16.0a0 - tbb >=2021.13.0 + purls: [] size: 10815480 timestamp: 1753211182626 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2026.0.0-hb56ce9e_1.conda @@ -4522,6 +4635,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 11402462 timestamp: 1772727323957 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2025.2.0-hb617929_1.conda @@ -4535,6 +4649,7 @@ packages: - libstdcxx >=14 - pugixml >=1.15,<1.16.0a0 - tbb >=2021.13.0 + purls: [] size: 1261488 timestamp: 1753211212823 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2026.0.0-hb56ce9e_1.conda @@ -4550,6 +4665,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 1994640 timestamp: 1772727360780 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2025.2.0-hd41364c_1.conda @@ -4561,6 +4677,7 @@ packages: - libopenvino 2025.2.0 hb617929_1 - libstdcxx >=14 - pugixml >=1.15,<1.16.0a0 + purls: [] size: 204890 timestamp: 1753211224567 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2026.0.0-hd41364c_1.conda @@ -4574,6 +4691,7 @@ packages: - pugixml >=1.15,<1.16.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 192778 timestamp: 1772727380069 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2025.2.0-h1862bb8_1.conda @@ -4587,6 +4705,7 @@ packages: - libopenvino 2025.2.0 hb617929_1 - libprotobuf >=6.31.1,<6.31.2.0a0 - libstdcxx >=14 + purls: [] size: 1724503 timestamp: 1753211235981 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2026.0.0-h7a07914_1.conda @@ -4602,6 +4721,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 1860687 timestamp: 1772727397981 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2025.2.0-h1862bb8_1.conda @@ -4615,6 +4735,7 @@ packages: - libopenvino 2025.2.0 hb617929_1 - libprotobuf >=6.31.1,<6.31.2.0a0 - libstdcxx >=14 + purls: [] size: 744746 timestamp: 1753211248776 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2026.0.0-h7a07914_1.conda @@ -4630,6 +4751,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 684224 timestamp: 1772727417276 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2025.2.0-hecca717_1.conda @@ -4640,6 +4762,7 @@ packages: - libgcc >=14 - libopenvino 2025.2.0 hb617929_1 - libstdcxx >=14 + purls: [] size: 1243134 timestamp: 1753211260154 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2026.0.0-hecca717_1.conda @@ -4652,6 +4775,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 1185558 timestamp: 1772727435039 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2025.2.0-h0767aad_1.conda @@ -4666,6 +4790,7 @@ packages: - libprotobuf >=6.31.1,<6.31.2.0a0 - libstdcxx >=14 - snappy >=1.2.2,<1.3.0a0 + purls: [] size: 1325059 timestamp: 1753211272484 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2026.0.0-h78e8023_1.conda @@ -4682,6 +4807,7 @@ packages: - snappy >=1.2.2,<1.3.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 1257870 timestamp: 1772727453738 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2025.2.0-hecca717_1.conda @@ -4692,6 +4818,7 @@ packages: - libgcc >=14 - libopenvino 2025.2.0 hb617929_1 - libstdcxx >=14 + purls: [] size: 497047 timestamp: 1753211285617 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2026.0.0-hecca717_1.conda @@ -4704,6 +4831,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 456585 timestamp: 1772727473378 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda @@ -4714,6 +4842,7 @@ packages: - __glibc >=2.17,<3.0.a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 312472 timestamp: 1744330953241 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.6.1-h280c20c_0.conda @@ -4724,6 +4853,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 324993 timestamp: 1768497114401 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda @@ -4734,6 +4864,7 @@ packages: - libgcc >=13 license: MIT license_family: MIT + purls: [] size: 28424 timestamp: 1749901812541 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda @@ -4744,6 +4875,7 @@ packages: - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement + purls: [] size: 317748 timestamp: 1764981060755 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda @@ -4754,6 +4886,7 @@ packages: - __glibc >=2.17,<3.0.a0 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement + purls: [] size: 317669 timestamp: 1770691470744 - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_2.conda @@ -4768,6 +4901,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 4645876 timestamp: 1760550892361 - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda @@ -4782,6 +4916,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 4372578 timestamp: 1766316228461 - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda @@ -4796,6 +4931,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 3638698 timestamp: 1769749419271 - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.60.0-h61e6d4b_0.conda @@ -4812,6 +4948,7 @@ packages: constrains: - __glibc >=2.17 license: LGPL-2.1-or-later + purls: [] size: 3421977 timestamp: 1759327942156 - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.60.2-h61e6d4b_0.conda @@ -4828,6 +4965,7 @@ packages: constrains: - __glibc >=2.17 license: LGPL-2.1-or-later + purls: [] size: 4011590 timestamp: 1771399906142 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda @@ -4839,6 +4977,7 @@ packages: - libstdcxx >=15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 7660762 timestamp: 1765256861607 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_18.conda @@ -4850,22 +4989,23 @@ packages: - libstdcxx >=15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 8095113 timestamp: 1771378289674 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda - sha256: 7a58892a52739ce4c0f7109de9e91b4353104748eb04fc6441d88e8af444ba99 - md5: 67eef12ce33f7ff99900c212d7076fc2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-16.1.0-hf2715c6_1.conda + sha256: 85662ecadd3961bc96cbcc38dbc024a768cc35932c8440677ed028ea6322c36c + md5: abd77210925872ee084672cf5be1d491 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=15.2.0 - - libstdcxx >=15.2.0 + - libgcc >=16.1.0 + - libstdcxx >=16.1.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL run_exports: weak: - - libsanitizer 15.2.0 - size: 7930689 - timestamp: 1778269054623 + - libsanitizer 16.1.0 + size: 7780843 + timestamp: 1785375481116 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda sha256: 57cb5f92110324c04498b96563211a1bca6a74b2918b1e8df578bfed03cc32e4 md5: 067590f061c9f6ea7e61e3b2112ed6b3 @@ -4881,6 +5021,7 @@ packages: - mpg123 >=1.32.9,<1.33.0a0 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 355619 timestamp: 1765181778282 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda @@ -4901,6 +5042,7 @@ packages: - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: blessing + purls: [] size: 938979 timestamp: 1764359444435 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda @@ -4912,6 +5054,7 @@ packages: - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: blessing + purls: [] size: 943451 timestamp: 1766319676469 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda @@ -4926,42 +5069,20 @@ packages: purls: [] size: 951405 timestamp: 1772818874251 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - sha256: 365376f4815e5e80def2b3462a2419708b7c292da0da85278386c2618621fff4 - md5: 4aed8e657e9ff156bdbe849b4df44389 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + sha256: 72023efc207fe681e26b65fc9d668062cf0b4f0eacf3431e6eb099b95c1f2efd + md5: df088a279cd5e6fd2790b4c196434da1 depends: - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 - libgcc >=14 - libzlib >=1.3.2,<2.0a0 license: blessing run_exports: weak: - - libsqlite >=3.53.3,<4.0a0 - size: 962119 - timestamp: 1782519076616 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_15.conda - sha256: 2648485aa2dcd5ca385423841a728f262458aec5d814a79da5ab75098e223e3f - md5: fccfb26375ec5e4a2192dee6604b6d02 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 he0feb66_15 - constrains: - - libstdcxx-ng ==15.2.0=*_15 - license: GPL-3.0-only WITH GCC-exception-3.1 - size: 5856371 - timestamp: 1764836166363 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - sha256: 813427918316a00c904723f1dfc3da1bbc1974c5cfe1ed1e704c6f4e0798cbc6 - md5: 68f68355000ec3f1d6f26ea13e8f525f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 he0feb66_16 - constrains: - - libstdcxx-ng ==15.2.0=*_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 5856456 - timestamp: 1765256838573 + - libsqlite >=3.53.4,<4.0a0 + size: 964200 + timestamp: 1785016112246 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e md5: 1b08cd684f34175e4514474793d44bcb @@ -4975,46 +5096,33 @@ packages: purls: [] size: 5852330 timestamp: 1771378262446 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc - md5: 5794b3bdc38177caf969dabd3af08549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + sha256: 79721dd08aeb0ab9e773f1f9ef41cf4e6c17477e3d72319147619045bce05a09 + md5: aed6cf89adc1e9b846e4367ac538e434 depends: - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 he0feb66_19 + - libgcc 16.1.0 ha9f2e26_1 constrains: - - libstdcxx-ng ==15.2.0=*_19 + - libstdcxx-ng ==16.1.0=*_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] run_exports: {} - size: 5852044 - timestamp: 1778269036376 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_15.conda - sha256: 2ffaec42c561f53dcc025277043aa02e2557dc0db62bc009be4c7559a7f19f09 - md5: 20a8584ff8677ac9d724345b9d4eb757 - depends: - - libstdcxx 15.2.0 h934c35e_15 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 26905 - timestamp: 1764836222826 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda - sha256: 81f2f246c7533b41c5e0c274172d607829019621c4a0823b5c0b4a8c7028ee84 - md5: 1b3152694d236cf233b76b8c56bf0eae - depends: - - libstdcxx 15.2.0 h934c35e_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 27300 - timestamp: 1765256885128 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - sha256: 3c902ffd673cb3c6ddde624cdb80f870b6c835f8bf28384b0016e7d444dd0145 - md5: 6235adb93d064ecdf3d44faee6f468de + size: 6631744 + timestamp: 1785375462643 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_1.conda + sha256: 2876ca4463d1b394eb969ce4a84d1620aa63fb8202a6397837d1e45ec76c1208 + md5: c94f06123272d8e129d4acf3a25ffb35 depends: - - libstdcxx 15.2.0 h934c35e_18 + - libstdcxx 16.1.0 h934c35e_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 27575 - timestamp: 1771378314494 + purls: [] + run_exports: + strong: + - libstdcxx + size: 28253 + timestamp: 1785375500257 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.10-hd0affe5_4.conda sha256: f0356bb344a684e7616fc84675cfca6401140320594e8686be30e8ac7547aed2 md5: 1d4c18d75c51ed9d00092a891a547a7d @@ -5023,6 +5131,7 @@ packages: - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] size: 491953 timestamp: 1770738638119 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda @@ -5033,6 +5142,7 @@ packages: - libcap >=2.78,<2.79.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] run_exports: {} size: 493022 timestamp: 1780084748140 @@ -5062,6 +5172,7 @@ packages: - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: HPND + purls: [] size: 435273 timestamp: 1762022005702 - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.10-hd0affe5_4.conda @@ -5072,6 +5183,7 @@ packages: - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] size: 144654 timestamp: 1770738650966 - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda @@ -5082,6 +5194,7 @@ packages: - libcap >=2.78,<2.79.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] run_exports: {} size: 145969 timestamp: 1780084753104 @@ -5105,6 +5218,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 75995 timestamp: 1757032240102 - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.12-hb700be7_0.conda @@ -5116,6 +5230,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 127967 timestamp: 1756125594973 - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.13-hb700be7_0.conda @@ -5127,6 +5242,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 132334 timestamp: 1765872504784 - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.14-hb700be7_0.conda @@ -5138,6 +5254,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 154203 timestamp: 1770566529700 - conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda @@ -5148,6 +5265,7 @@ packages: - libgcc >=13 - libudev1 >=257.4 license: LGPL-2.1-or-later + purls: [] size: 89551 timestamp: 1748856210075 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda @@ -5157,6 +5275,7 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause + purls: [] size: 40235 timestamp: 1764790744114 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda @@ -5167,6 +5286,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 40311 timestamp: 1766271528534 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda @@ -5211,6 +5331,7 @@ packages: - xorg-libxfixes >=6.0.2,<7.0a0 license: MIT license_family: MIT + purls: [] size: 221308 timestamp: 1765652453244 - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda @@ -5225,6 +5346,7 @@ packages: - libogg >=1.3.5,<1.4.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 285894 timestamp: 1753879378005 - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpl-2.15.0-h54a6638_1.conda @@ -5239,6 +5361,7 @@ packages: - libva >=2.22.0,<3.0a0 license: MIT license_family: MIT + purls: [] size: 287944 timestamp: 1757278954789 - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpl-2.16.0-h54a6638_0.conda @@ -5252,6 +5375,7 @@ packages: - libva >=2.23.0,<3.0a0 license: MIT license_family: MIT + purls: [] size: 287992 timestamp: 1772980546550 - conda: https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.15.2-hecca717_0.conda @@ -5263,6 +5387,7 @@ packages: - libstdcxx >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 1070048 timestamp: 1762010217363 - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.328.1-h5279c79_0.conda @@ -5278,6 +5403,7 @@ packages: - libvulkan-headers 1.4.328.1.* license: Apache-2.0 license_family: APACHE + purls: [] size: 197672 timestamp: 1759972155030 - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_0.conda @@ -5293,6 +5419,7 @@ packages: - libvulkan-headers 1.4.341.0.* license: Apache-2.0 license_family: APACHE + purls: [] size: 199795 timestamp: 1770077125520 - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda @@ -5305,6 +5432,7 @@ packages: - libwebp 1.6.0 license: BSD-3-Clause license_family: BSD + purls: [] size: 429011 timestamp: 1752159441324 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda @@ -5318,6 +5446,7 @@ packages: - xorg-libxdmcp license: MIT license_family: MIT + purls: [] size: 395888 timestamp: 1727278577118 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda @@ -5343,6 +5472,7 @@ packages: - xorg-libxau >=1.0.12,<2.0a0 license: MIT/X11 Derivative license_family: MIT + purls: [] size: 837922 timestamp: 1764794163823 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda @@ -5359,6 +5489,7 @@ packages: - libxml2 2.15.1 license: MIT license_family: MIT + purls: [] size: 556302 timestamp: 1761015637262 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda @@ -5375,6 +5506,7 @@ packages: - libxml2 2.15.1 license: MIT license_family: MIT + purls: [] size: 555747 timestamp: 1766327145986 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda @@ -5391,6 +5523,7 @@ packages: - libxml2 2.15.2 license: MIT license_family: MIT + purls: [] size: 557492 timestamp: 1772704601644 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda @@ -5406,6 +5539,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 45283 timestamp: 1761015644057 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda @@ -5421,6 +5555,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 45402 timestamp: 1766327161688 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda @@ -5436,6 +5571,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 45968 timestamp: 1772704614539 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda @@ -5448,6 +5584,7 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other + purls: [] size: 60963 timestamp: 1727963148474 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -5465,6 +5602,20 @@ packages: - libzlib >=1.3.2,<2.0a0 size: 63629 timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + sha256: eb8a0db0aa570124f7d2a93d7c7f596e3390df5e047818d873baad32985fc736 + md5: 0de0122d9570a8ab637c6b73db268389 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - zlib 1.3.2 *_3 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 63713 + timestamp: 1785362952714 - conda: https://conda.anaconda.org/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda sha256: d652c7bd4d3b6f82b0f6d063b0d8df6f54cc47531092d7ff008e780f3261bdda md5: 33405d2a66b1411db9f7242c8b97c9e7 @@ -5501,6 +5652,7 @@ packages: - libstdcxx >=13 license: LGPL-2.1-only license_family: LGPL + purls: [] size: 491140 timestamp: 1730581373280 - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda @@ -5557,6 +5709,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 8983459 timestamp: 1763350996398 - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.0-py314h2b28147_0.conda @@ -5575,6 +5729,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 8917806 timestamp: 1766373894725 - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda @@ -5593,6 +5749,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 8926994 timestamp: 1770098474394 - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py312h33ff503_0.conda @@ -5624,6 +5782,7 @@ packages: - opencl-headers >=2024.10.24 license: BSD-2-Clause license_family: BSD + purls: [] size: 106742 timestamp: 1743700382939 - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-h5888daf_0.conda @@ -5635,6 +5794,7 @@ packages: - libstdcxx >=13 license: Apache-2.0 license_family: APACHE + purls: [] size: 55357 timestamp: 1749853464518 - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.6.0-hc22cd8d_0.conda @@ -5646,6 +5806,7 @@ packages: - libstdcxx >=13 license: BSD-2-Clause license_family: BSD + purls: [] size: 731471 timestamp: 1739400677213 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda @@ -5657,6 +5818,7 @@ packages: - libgcc >=14 license: Apache-2.0 license_family: Apache + purls: [] size: 3165399 timestamp: 1762839186699 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda @@ -5671,9 +5833,9 @@ packages: purls: [] size: 3164551 timestamp: 1769555830639 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda - sha256: d48f5c22b9897c01e4dff3680f1f57ceb02711ab9c62f74339b080419dfad34b - md5: 79dd2074b5cd5c5c6b2930514a11e22d +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + sha256: 012096056b97abf1f68c46b7146bd2cbd68c1be762340b4f5dad4fbbe99177bc + md5: c5955c27917ff2234def47f075e71e02 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates @@ -5683,8 +5845,8 @@ packages: run_exports: weak: - openssl >=3.6.3,<4.0a0 - size: 3159683 - timestamp: 1781069855778 + size: 3182423 + timestamp: 1785913583650 - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda sha256: 3613774ad27e48503a3a6a9d72017087ea70f1426f6e5541dbdb59a3b626eaaf md5: 79f71230c069a287efe3a8614069ddf1 @@ -5703,6 +5865,7 @@ packages: - libpng >=1.6.49,<1.7.0a0 - libzlib >=1.3.1,<2.0a0 license: LGPL-2.1-or-later + purls: [] size: 455420 timestamp: 1751292466873 - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -5715,6 +5878,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1222481 timestamp: 1763655398280 - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda @@ -5727,6 +5891,7 @@ packages: - __glibc >=2.17,<3.0.a0 license: MIT license_family: MIT + purls: [] size: 450960 timestamp: 1754665235234 - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda @@ -5751,6 +5916,7 @@ packages: - libgcc >=13 license: MIT license_family: MIT + purls: [] size: 8252 timestamp: 1726802366959 - conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.15-h3f63f65_0.conda @@ -5762,6 +5928,7 @@ packages: - libstdcxx >=13 license: MIT license_family: MIT + purls: [] size: 118488 timestamp: 1736601364156 - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-h9a6aba3_3.conda @@ -5780,6 +5947,7 @@ packages: - pulseaudio 17.0 *_3 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 750785 timestamp: 1763148198088 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda @@ -5833,6 +6001,7 @@ packages: - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 + purls: [] size: 36768932 timestamp: 1764758363259 python_site_packages_path: lib/python3.14/site-packages @@ -5860,6 +6029,7 @@ packages: - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 + purls: [] size: 36790521 timestamp: 1765021515427 python_site_packages_path: lib/python3.14/site-packages @@ -5887,13 +6057,14 @@ packages: - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 + purls: [] size: 36702440 timestamp: 1770675584356 python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda - build_number: 100 - sha256: 6d28ac2b061179deb434d3d57afa98ffd20ec3c5d44ab8048a1ca33424b22d38 - md5: 0b9b2f83b5b600e1ac38becde8d0dd44 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda + build_number: 101 + sha256: ee8f2006e1724b1f2e9e0ccc5a7cfdcab973460faa2f63ac1f6e44fdad4c0344 + md5: 78975a41cf3c525da654f17e35bfca9e depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -5903,8 +6074,8 @@ packages: - libgcc >=14 - liblzma >=5.8.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.53.2,<4.0a0 - - libuuid >=2.42.1,<3.0a0 + - libsqlite >=3.53.3,<4.0a0 + - libuuid >=2.42.2,<3.0a0 - libzlib >=1.3.2,<2.0a0 - ncurses >=6.6,<7.0a0 - openssl >=3.5.7,<4.0a0 @@ -5919,8 +6090,8 @@ packages: - python_abi 3.14.* *_cp314 noarch: - python - size: 36717183 - timestamp: 1781255094700 + size: 36869055 + timestamp: 1784910110714 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda sha256: cb142bfd92f6e55749365ddc244294fa7b64db6d08c45b018ff1c658907bfcbf @@ -5982,6 +6153,7 @@ packages: - libudev1 >=257.13 license: Linux-OpenIB license_family: BSD + purls: [] run_exports: weak: - rdma-core >=63.0 @@ -5995,6 +6167,7 @@ packages: - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 282480 timestamp: 1740379431762 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda @@ -6076,6 +6249,7 @@ packages: - sdl3 >=3.2.22,<4.0a0 - libegl >=1.7.0,<2.0a0 license: Zlib + purls: [] size: 589145 timestamp: 1757842881000 - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.2.28-h3b84278_0.conda @@ -6103,6 +6277,7 @@ packages: - libxkbcommon >=1.13.0,<2.0a0 - libegl >=1.7.0,<2.0a0 license: Zlib + purls: [] size: 1939082 timestamp: 1764713273386 - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.2.30-h3b84278_0.conda @@ -6130,6 +6305,7 @@ packages: - libgl >=1.7.0,<2.0a0 - libusb >=1.0.29,<2.0a0 license: Zlib + purls: [] size: 1938719 timestamp: 1767236277588 - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.4.2-hdeec2a5_0.conda @@ -6159,6 +6335,7 @@ packages: - xorg-libxi >=1.8.2,<2.0a0 - wayland >=1.24.0,<2.0a0 license: Zlib + purls: [] size: 2138749 timestamp: 1771668185803 - conda: https://conda.anaconda.org/conda-forge/linux-64/shaderc-2025.5-h3e344bc_0.conda @@ -6172,6 +6349,7 @@ packages: - spirv-tools >=2025,<2026.0a0 license: Apache-2.0 license_family: Apache + purls: [] size: 113361 timestamp: 1764287965059 - conda: https://conda.anaconda.org/conda-forge/linux-64/shaderc-2025.5-h718be3e_1.conda @@ -6185,6 +6363,7 @@ packages: - spirv-tools >=2026,<2027.0a0 license: Apache-2.0 license_family: Apache + purls: [] size: 113513 timestamp: 1770208767759 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda @@ -6197,6 +6376,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 45829 timestamp: 1762948049098 - conda: https://conda.anaconda.org/conda-forge/linux-64/spirv-tools-2025.4-hb700be7_0.conda @@ -6210,6 +6390,7 @@ packages: - spirv-headers >=1.4.328.0,<1.4.328.1.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 2248062 timestamp: 1759805790709 - conda: https://conda.anaconda.org/conda-forge/linux-64/spirv-tools-2026.1-hb700be7_0.conda @@ -6223,6 +6404,7 @@ packages: - spirv-headers >=1.4.341.0,<1.4.341.1.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 2296977 timestamp: 1770089626195 - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.49-py312h5253ce2_0.conda @@ -6250,6 +6432,7 @@ packages: - libstdcxx >=14 license: BSD-2-Clause license_family: BSD + purls: [] size: 2741200 timestamp: 1756086702093 - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.1-hecca717_0.conda @@ -6261,6 +6444,7 @@ packages: - libstdcxx >=14 license: BSD-2-Clause license_family: BSD + purls: [] size: 2619743 timestamp: 1769664536467 - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2022.3.0-h8d10470_1.conda @@ -6273,6 +6457,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 181262 timestamp: 1762509955687 - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda @@ -6285,6 +6470,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 181329 timestamp: 1767886632911 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda @@ -6312,6 +6498,7 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: TCL license_family: BSD + purls: [] size: 3284905 timestamp: 1763054914403 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda @@ -6344,19 +6531,19 @@ packages: - pkg:pypi/tornado?source=hash-mapping size: 859665 timestamp: 1774358032165 -- conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda - sha256: a5b92c2cedcaba3b877d6c4aab42853f57b6bb26f9c901cfb5aa5da03269d310 - md5: 5552b8d0f33cf86753d35da1b3ec0736 +- conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda + sha256: ac2feff703269655286bf163c4382d3c4830bd2eb4e68e77879a8b4939a2203c + md5: 07c4923f2c89939ec82b77f2ab41c5e9 depends: - - libstdcxx >=14 - libgcc >=14 + - libstdcxx >=14 - __glibc >=2.17,<3.0.a0 constrains: - __glibc >=2.17 license: Apache-2.0 OR MIT run_exports: {} - size: 20782187 - timestamp: 1784166603021 + size: 17299962 + timestamp: 1785973451439 - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda sha256: 3aa04ae8e9521d9b56b562376d944c3e52b69f9d2a0667f77b8953464822e125 md5: 035da2e4f5770f036ff704fa17aace24 @@ -6368,6 +6555,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 329779 timestamp: 1761174273487 - conda: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 @@ -6377,6 +6565,7 @@ packages: - libgcc-ng >=12 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 897548 timestamp: 1660323080555 - conda: https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2 @@ -6387,6 +6576,7 @@ packages: - libstdcxx-ng >=10.3.0 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 3357188 timestamp: 1646609687141 - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.46-hb03c661_0.conda @@ -6398,6 +6588,7 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT + purls: [] size: 396975 timestamp: 1759543819846 - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda @@ -6409,6 +6600,7 @@ packages: - xorg-libx11 >=1.8.13,<2.0a0 license: MIT license_family: MIT + purls: [] size: 399291 timestamp: 1772021302485 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda @@ -6419,6 +6611,7 @@ packages: - libgcc >=13 license: MIT license_family: MIT + purls: [] size: 58628 timestamp: 1734227592886 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda @@ -6431,6 +6624,7 @@ packages: - xorg-libice >=1.1.2,<2.0a0 license: MIT license_family: MIT + purls: [] size: 27590 timestamp: 1741896361728 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda @@ -6442,6 +6636,7 @@ packages: - libxcb >=1.17.0,<2.0a0 license: MIT license_family: MIT + purls: [] size: 835896 timestamp: 1741901112627 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda @@ -6453,6 +6648,7 @@ packages: - libxcb >=1.17.0,<2.0a0 license: MIT license_family: MIT + purls: [] size: 839652 timestamp: 1770819209719 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda @@ -6463,6 +6659,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 15321 timestamp: 1762976464266 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda @@ -6476,6 +6673,7 @@ packages: - xorg-libxrender >=0.9.11,<0.10.0a0 license: MIT license_family: MIT + purls: [] size: 32533 timestamp: 1730908305254 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda @@ -6486,6 +6684,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 20591 timestamp: 1762976546182 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda @@ -6497,6 +6696,7 @@ packages: - xorg-libx11 >=1.8.10,<2.0a0 license: MIT license_family: MIT + purls: [] size: 50060 timestamp: 1727752228921 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda @@ -6508,6 +6708,7 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT + purls: [] size: 50326 timestamp: 1769445253162 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda @@ -6519,6 +6720,7 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT + purls: [] size: 20071 timestamp: 1759282564045 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda @@ -6532,6 +6734,7 @@ packages: - xorg-libxfixes >=6.0.1,<7.0a0 license: MIT license_family: MIT + purls: [] size: 47179 timestamp: 1727799254088 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda @@ -6545,6 +6748,7 @@ packages: - xorg-libxrender >=0.9.11,<0.10.0a0 license: MIT license_family: MIT + purls: [] size: 29599 timestamp: 1727794874300 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda @@ -6558,6 +6762,7 @@ packages: - xorg-libxrender >=0.9.12,<0.10.0a0 license: MIT license_family: MIT + purls: [] size: 30456 timestamp: 1769445263457 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda @@ -6569,6 +6774,7 @@ packages: - xorg-libx11 >=1.8.10,<2.0a0 license: MIT license_family: MIT + purls: [] size: 33005 timestamp: 1734229037766 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxscrnsaver-1.2.4-hb9d3cd8_0.conda @@ -6581,6 +6787,7 @@ packages: - xorg-libxext >=1.3.6,<2.0a0 license: MIT license_family: MIT + purls: [] size: 14412 timestamp: 1727899730073 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda @@ -6594,6 +6801,7 @@ packages: - xorg-libxi >=1.7.10,<2.0a0 license: MIT license_family: MIT + purls: [] size: 32808 timestamp: 1727964811275 - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda @@ -6661,6 +6869,7 @@ packages: - openmp_impl 9999 license: BSD-3-Clause license_family: BSD + purls: [] size: 23712 timestamp: 1650670790230 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.1-he30d5cf_0.conda @@ -6670,6 +6879,7 @@ packages: - libgcc >=14 license: LGPL-2.1-or-later license_family: GPL + purls: [] size: 615491 timestamp: 1766156819056 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda @@ -6679,6 +6889,7 @@ packages: - libgcc >=14 license: LGPL-2.1-or-later license_family: GPL + purls: [] size: 615729 timestamp: 1768327548407 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda @@ -6689,6 +6900,7 @@ packages: - libstdcxx-ng >=12 license: BSD-2-Clause license_family: BSD + purls: [] size: 3250813 timestamp: 1718551360260 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 @@ -6698,6 +6910,7 @@ packages: - libgcc-ng >=12 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 74992 timestamp: 1660065534958 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/backports.zstd-1.3.0-py312h3d8e7d4_0.conda @@ -6723,6 +6936,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 4850743 timestamp: 1764007931341 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_105.conda @@ -6734,6 +6948,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 4848132 timestamp: 1766513201703 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_101.conda @@ -6745,6 +6960,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 4741684 timestamp: 1770267224406 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda @@ -6786,6 +7002,18 @@ packages: - pkg:pypi/brotli?source=hash-mapping size: 373800 timestamp: 1764017545385 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + sha256: 24eacc8a20fd7c4616566178562bef7f9344eb4a8700cfc3180fa75a6ff9d39f + md5: fd544ef1c672d645bf78e5819cbb8f91 + depends: + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 194694 + timestamp: 1785906301397 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda sha256: d2a296aa0b5f38ed9c264def6cf775c0ccb0f110ae156fcde322f3eccebf2e01 md5: 2921ac0b541bf37c69e66bd6d9a43bca @@ -6793,6 +7021,7 @@ packages: - libgcc >=14 license: bzip2-1.0.6 license_family: BSD + purls: [] size: 192536 timestamp: 1757437302703 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda @@ -6831,6 +7060,7 @@ packages: - xorg-libxext >=1.3.6,<2.0a0 - xorg-libxrender >=0.9.12,<0.10.0a0 license: LGPL-2.1-only or MPL-1.1 + purls: [] size: 927045 timestamp: 1766416003626 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h83712da_0.conda @@ -6855,6 +7085,7 @@ packages: - xorg-libxext >=1.3.6,<2.0a0 - xorg-libxrender >=0.9.12,<0.10.0a0 license: LGPL-2.1-only or MPL-1.1 + purls: [] size: 966667 timestamp: 1741554768968 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-13.2.0-py312hdc0efb6_0.conda @@ -6890,6 +7121,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23466 timestamp: 1749218349235 @@ -6903,6 +7135,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24782 timestamp: 1779898439985 @@ -6918,6 +7151,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -6935,6 +7169,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=13.3.29,<14.0a0 @@ -6950,6 +7185,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23507 timestamp: 1749218358755 @@ -6963,6 +7199,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24786 timestamp: 1779898447855 @@ -6975,6 +7212,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 33382016 timestamp: 1760723722396 @@ -7035,6 +7273,7 @@ packages: - cuda-nvvm-impl 12.9.86.* - cuda-nvvm-tools 12.9.86.* license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 25585 timestamp: 1771619514901 @@ -7046,6 +7285,7 @@ packages: - cuda-nvvm-impl 13.3.33.* - cuda-nvvm-tools 13.3.33.* license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 25733 timestamp: 1779909827964 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-13.3.73-he9431aa_0.conda @@ -7067,6 +7307,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libgcc >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 21601172 timestamp: 1753975236344 @@ -7100,6 +7341,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libgcc >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24411824 timestamp: 1753975273689 @@ -7111,6 +7353,7 @@ packages: - cuda-version >=13.3,<13.4.0a0 - libgcc >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 29031580 timestamp: 1779905175228 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-13.3.73-h7b14b0b_0.conda @@ -7132,6 +7375,7 @@ packages: - cuda-cudart-dev - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23784 timestamp: 1761098779882 @@ -7145,70 +7389,61 @@ packages: constrains: - arm-variant * sbsa license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 25101 timestamp: 1779913642980 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.3-py314h4c416a3_0.conda - sha256: 431042164f0f50ce173be72d96f6a9ec069d1a4846f19ff8cf616ea98678a090 - md5: e641cbdecc93a5e243af87d198edc716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.8-py314hc6b4731_0.conda + sha256: 4add54f62b3fbdc7f8e1238f5e5990e16a561bed33d18e3dbc1db1d4f6cf8572 + md5: c8ec76477232c7e59f68545a1b4fb8ea depends: - libgcc >=14 - libstdcxx >=14 - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: APACHE - size: 3701570 - timestamp: 1765651306767 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py312he940de5_0.conda - sha256: 30bfb6445b8ae8022996283faa2d918393b1f0f78e37014995e1733e50df4303 - md5: 2f50ec4afc8e9f402b9041e9cee62744 + purls: + - pkg:pypi/cython?source=hash-mapping + run_exports: {} + size: 3747072 + timestamp: 1782821625037 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py312hbda70bc_0.conda + sha256: 9c3df78ef64fc05aaf01b4d16ccefe25656b7aac677a3a9d5e89e0c462c65a2c + md5: 30984003a6a35ea7b9eedc979cf52c7e depends: - libgcc >=14 - libstdcxx >=14 - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/cython?source=hash-mapping - size: 3629503 - timestamp: 1767577211661 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py314h4c416a3_0.conda - sha256: 1369b5b23d9451ae3ef678cb68678778a6ea164186bc8ebe6539a1d6fa803da8 - md5: 822c83a4ba5a12101695ba39607c338f + run_exports: {} + size: 3649707 + timestamp: 1785016066705 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda + sha256: 84aebc300e4a0f4ea697d95ec97277301e83f0a457e61efb48b27a14cfb37bda + md5: 4a44c5167b358f22ae2cd89b07728797 depends: - libgcc >=14 - libstdcxx >=14 - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: APACHE - size: 3707806 - timestamp: 1767577060898 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.8-py314hc6b4731_0.conda - sha256: 4add54f62b3fbdc7f8e1238f5e5990e16a561bed33d18e3dbc1db1d4f6cf8572 - md5: c8ec76477232c7e59f68545a1b4fb8ea - depends: - - libgcc >=14 - - libstdcxx >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: APACHE - run_exports: {} - size: 3747072 - timestamp: 1782821625037 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda - sha256: 33fe66d025cf5bac7745196d1a3dd7a437abcf2dbce66043e9745218169f7e17 - md5: 6e5a87182d66b2d1328a96b61ca43a62 + run_exports: {} + size: 3741802 + timestamp: 1785016071504 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda + sha256: 33fe66d025cf5bac7745196d1a3dd7a437abcf2dbce66043e9745218169f7e17 + md5: 6e5a87182d66b2d1328a96b61ca43a62 depends: - libgcc-ng >=12 license: BSD-2-Clause license_family: BSD + purls: [] size: 347363 timestamp: 1685696690003 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda @@ -7221,6 +7456,7 @@ packages: - libzlib >=1.3.1,<2.0a0 - libexpat >=2.7.3,<3.0a0 license: AFL-2.1 OR GPL-2.0-or-later + purls: [] size: 480416 timestamp: 1764536098891 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.20-py312hf55c4e8_0.conda @@ -7294,6 +7530,7 @@ packages: - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 12035194 timestamp: 1773008913159 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_h936a714_906.conda @@ -7350,6 +7587,7 @@ packages: - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 12009838 timestamp: 1765653483363 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.15.0-h8dda3cd_1.conda @@ -7363,6 +7601,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 277832 timestamp: 1730284967179 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda @@ -7377,6 +7616,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 279044 timestamp: 1771382728182 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.1-h8af1aa0_0.conda @@ -7386,6 +7626,7 @@ packages: - libfreetype 2.14.1 h8af1aa0_0 - libfreetype6 2.14.1 hdae7a39_0 license: GPL-2.0-only OR FTL + purls: [] size: 173174 timestamp: 1757945489158 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.2-h8af1aa0_0.conda @@ -7395,6 +7636,7 @@ packages: - libfreetype 2.14.2 h8af1aa0_0 - libfreetype6 2.14.2 hdae7a39_0 license: GPL-2.0-only OR FTL + purls: [] size: 173437 timestamp: 1772756019067 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.16-he30d5cf_0.conda @@ -7403,6 +7645,7 @@ packages: depends: - libgcc >=14 license: LGPL-2.1-or-later + purls: [] size: 62909 timestamp: 1757438620177 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-15.2.0-h24a549f_16.conda @@ -7414,6 +7657,7 @@ packages: - gcc_no_conda_specs license: BSD-3-Clause license_family: BSD + purls: [] size: 29174 timestamp: 1765257473532 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-15.2.0-h24a549f_18.conda @@ -7425,25 +7669,9 @@ packages: - gcc_no_conda_specs license: BSD-3-Clause license_family: BSD + purls: [] size: 29408 timestamp: 1771378529822 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-h3530432_19.conda - sha256: cd23829b5fb7f3ff5f44eab2da1a993e06bdf759b681a0a7a73bb5783755b6b3 - md5: 66dfb62e7a47e2b511f9c5ee0ff1abf3 - depends: - - binutils_impl_linux-aarch64 >=2.45 - - libgcc >=15.2.0 - - libgcc-devel_linux-aarch64 15.2.0 h55c397f_119 - - libgomp >=15.2.0 - - libsanitizer 15.2.0 he19c465_19 - - libstdcxx >=15.2.0 - - libstdcxx-devel_linux-aarch64 15.2.0 ha7b1723_119 - - sysroot_linux-aarch64 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - run_exports: {} - size: 73237372 - timestamp: 1778268860495 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-habb1d5c_16.conda sha256: 9b7e56534fa3029e0caf6dbbf4daa2d567e630672f977f01ad0c356933fb1b0d md5: af391ca6347927b4e067a8be221d1b3a @@ -7458,6 +7686,7 @@ packages: - sysroot_linux-aarch64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 74461928 timestamp: 1765257095042 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-hcedddb3_18.conda @@ -7474,22 +7703,40 @@ packages: - sysroot_linux-aarch64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 73516504 timestamp: 1771378256368 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-15.2.0-h0bf4bd8_27.conda - sha256: 2450913611189cc3c26062a43a97a93501159335d4d314cca5e2678fb5f4d3b6 - md5: 619b8a05f89220fa8c9536dcfeeddd5b +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-16.1.0-h04da0f0_1.conda + sha256: ad024e118ed57e7277547fd03a913b981e9bb9a6db258b8943293b13329d4489 + md5: e5551bb5b75bcc4031e40f2b69baab84 + depends: + - binutils_impl_linux-aarch64 >=2.46.1 + - libgcc >=16.1.0 + - libgcc-devel_linux-aarch64 16.1.0 hd673532_101 + - libgomp >=16.1.0 + - libsanitizer 16.1.0 h2510bd8_1 + - libstdcxx >=16.1.0 + - libstdcxx-devel_linux-aarch64 16.1.0 h2445e1f_101 + - sysroot_linux-aarch64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 75102801 + timestamp: 1785374604361 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-16.1.0-hed00b63_0.conda + sha256: 50305dd8c4198b4a38fca1666589bdaba0d26cf2c69f901391259d5b4b1133a4 + md5: 4cb863693c93536916f84802ea2b520c depends: - - gcc_impl_linux-aarch64 15.2.0.* + - gcc_impl_linux-aarch64 16.1.0.* - binutils_linux-aarch64 - sysroot_linux-aarch64 license: BSD-3-Clause license_family: BSD run_exports: strong: - - libgcc >=15 - size: 29074 - timestamp: 1781279974207 + - libgcc >=16 + size: 29478 + timestamp: 1785386542583 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.44.4-h90308e0_0.conda sha256: 78a1d69c3d0da73b4d54a35001abd4e273605180d21365b4f31e9a241d9fb715 md5: 4c8c0d2f7620467869d41f29304362dc @@ -7502,6 +7749,7 @@ packages: - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 580454 timestamp: 1761083738779 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.44.5-h90308e0_1.conda @@ -7516,6 +7764,7 @@ packages: - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 584221 timestamp: 1771532437279 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glslang-16.1.0-hd1da3a6_0.conda @@ -7527,6 +7776,7 @@ packages: - spirv-tools >=2025,<2026.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1308404 timestamp: 1764720598114 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glslang-16.2.0-h124e036_1.conda @@ -7538,6 +7788,7 @@ packages: - spirv-tools >=2026,<2027.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1348415 timestamp: 1770195275881 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h0a1ffab_2.conda @@ -7547,6 +7798,7 @@ packages: - libgcc-ng >=12 - libstdcxx-ng >=12 license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] size: 417323 timestamp: 1718980707330 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda @@ -7557,6 +7809,7 @@ packages: - libstdcxx >=14 license: LGPL-2.0-or-later license_family: LGPL + purls: [] size: 102400 timestamp: 1755102000043 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.3.2-py312hf55c4e8_0.conda @@ -7582,6 +7835,7 @@ packages: - gxx_impl_linux-aarch64 15.2.0 h03e2352_16 license: BSD-3-Clause license_family: BSD + purls: [] size: 28544 timestamp: 1765257509084 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-15.2.0-ha384071_18.conda @@ -7592,6 +7846,7 @@ packages: - gxx_impl_linux-aarch64 15.2.0 h03e2352_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 28780 timestamp: 1771378557194 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_16.conda @@ -7604,6 +7859,7 @@ packages: - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 14627102 timestamp: 1765257416069 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_18.conda @@ -7616,37 +7872,38 @@ packages: - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 15371317 timestamp: 1771378487467 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_19.conda - sha256: afb0fc36b93539a8e43a8063c8d3e1b4bace38a5a0c3c9e1978c72792d633c62 - md5: 7214ae8a8aade7b48a2bfd8bbb4d9e79 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-16.1.0-hd5c6868_1.conda + sha256: 9a8b38dc912b6952e52b554e1eb851da279fd4ead6fee7eac78ee2397be19d40 + md5: b7d0e87c50859580781ed98eb0a70180 depends: - - gcc_impl_linux-aarch64 15.2.0 h3530432_19 - - libstdcxx-devel_linux-aarch64 15.2.0 ha7b1723_119 + - gcc_impl_linux-aarch64 16.1.0 h04da0f0_1 + - libstdcxx-devel_linux-aarch64 16.1.0 h2445e1f_101 - sysroot_linux-aarch64 - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL run_exports: {} - size: 14640001 - timestamp: 1778269082840 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-15.2.0-h7e4acf5_27.conda - sha256: f4bc63d467e2c48c255bc8d2886fb11f6a8d09c1251a6f5b25628abee1768693 - md5: ea51d6df068bee183ff667f75bfdc2f6 - depends: - - gxx_impl_linux-aarch64 15.2.0.* - - gcc_linux-aarch64 ==15.2.0 h0bf4bd8_27 + size: 15592564 + timestamp: 1785374786297 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-16.1.0-h4223dcb_0.conda + sha256: edfc3ee04478cdfed6b84f58bc1db77818ed92f1d58bd6de565e9a8bacb5a558 + md5: 036c35401710f4b03aba2a0cc5792496 + depends: + - gxx_impl_linux-aarch64 16.1.0.* + - gcc_linux-aarch64 ==16.1.0 hed00b63_0 - binutils_linux-aarch64 - sysroot_linux-aarch64 license: BSD-3-Clause license_family: BSD run_exports: strong: - - libstdcxx >=15 - - libgcc >=15 - size: 27620 - timestamp: 1781279974207 + - libstdcxx >=16 + - libgcc >=16 + size: 27895 + timestamp: 1785386542583 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-12.2.0-he4899c9_0.conda sha256: 5cfd74a3fbce0921af5beff93a3fe7edc5b1344d9b9668b2de1c1be932b54993 md5: 1437bf9690976948f90175a65407b65f @@ -7663,6 +7920,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 2156041 timestamp: 1762376447693 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-12.3.0-h1134a53_0.conda @@ -7681,6 +7939,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 2454001 timestamp: 1766941218362 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.1.0-h1134a53_0.conda @@ -7699,6 +7958,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 2346492 timestamp: 1773222371375 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda @@ -7709,6 +7969,7 @@ packages: - libstdcxx-ng >=12 license: MIT license_family: MIT + purls: [] size: 12282786 timestamp: 1720853454991 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.1-hb1525cb_0.conda @@ -7719,6 +7980,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 12835377 timestamp: 1766304007889 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hcab7f73_0.conda @@ -7729,6 +7991,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 12851689 timestamp: 1772208964788 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda @@ -7742,18 +8005,6 @@ packages: purls: [] size: 12837286 timestamp: 1773822650615 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_1.conda - sha256: ba4e1acdaf6c66961d6a1863c10851dde2378fa18af48de0156b9874556ca438 - md5: da55da4ed68dcac1ce28faa0a3450b65 - depends: - - libgcc >=14 - - libstdcxx >=14 - license: MIT - run_exports: - weak: - - icu >=78.3,<79.0a0 - size: 12870753 - timestamp: 1784588696185 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 @@ -7785,6 +8036,7 @@ packages: - libgcc-ng >=12 license: LGPL-2.0-only license_family: LGPL + purls: [] size: 604863 timestamp: 1664997611416 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda @@ -7796,6 +8048,7 @@ packages: - binutils_impl_linux-aarch64 2.45 license: GPL-3.0-only license_family: GPL + purls: [] size: 875534 timestamp: 1764007911054 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda @@ -7807,6 +8060,7 @@ packages: - binutils_impl_linux-aarch64 2.45 license: GPL-3.0-only license_family: GPL + purls: [] size: 876257 timestamp: 1766513180236 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.conda @@ -7818,6 +8072,7 @@ packages: - binutils_impl_linux-aarch64 2.45.1 license: GPL-3.0-only license_family: GPL + purls: [] size: 875924 timestamp: 1770267209884 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda @@ -7852,6 +8107,7 @@ packages: - libstdcxx >=13 license: Apache-2.0 license_family: Apache + purls: [] size: 227184 timestamp: 1745265544057 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda @@ -7862,6 +8118,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: Apache + purls: [] size: 240444 timestamp: 1773114901155 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20250512.1-cxx17_h201e9ed_0.conda @@ -7875,6 +8132,7 @@ packages: - libabseil-static =20250512.1=cxx17* license: Apache-2.0 license_family: Apache + purls: [] size: 1327580 timestamp: 1750194149128 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20260107.1-cxx17_h6983b43_0.conda @@ -7888,6 +8146,7 @@ packages: - libabseil-static =20260107.1=cxx17* license: Apache-2.0 license_family: Apache + purls: [] size: 1401836 timestamp: 1770863223557 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libass-0.17.4-hcfe818d_0.conda @@ -7904,6 +8163,7 @@ packages: - libfreetype6 >=2.13.3 - libzlib >=1.3.1,<2.0a0 license: ISC + purls: [] size: 171287 timestamp: 1749328949722 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda @@ -7921,6 +8181,7 @@ packages: - blas 2.305 openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18369 timestamp: 1765818610617 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda @@ -7948,6 +8209,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 80030 timestamp: 1764017273715 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.2.0-he30d5cf_1.conda @@ -7958,6 +8220,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 33166 timestamp: 1764017282936 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.2.0-he30d5cf_1.conda @@ -7968,6 +8231,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 309304 timestamp: 1764017292044 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.77-h68e9139_0.conda @@ -7978,6 +8242,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 108542 timestamp: 1762350753349 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.77-hf9559e3_1.conda @@ -7997,11 +8262,24 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] run_exports: weak: - libcap >=2.78,<2.79.0a0 size: 109192 timestamp: 1775490102029 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda + sha256: 6487e7644d062e18d389c11a9a3183e5a71c2652d05fdd88dbd063ad09f7ad4b + md5: 5e347c665a310b4c148bbb02596ae0c3 + depends: + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcap >=2.78,<2.79.0a0 + size: 108530 + timestamp: 1786025925536 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda build_number: 5 sha256: 3fad5c9de161dccb4e42c8b1ae8eccb33f4ed56bccbcced9cbb0956ae7869e61 @@ -8014,6 +8292,7 @@ packages: - blas 2.305 openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18371 timestamp: 1765818618899 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda @@ -8042,6 +8321,7 @@ packages: - libstdcxx >=14 - rdma-core >=59.0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 909365 timestamp: 1761098964619 @@ -8074,6 +8354,7 @@ packages: constrains: - arm-variant * sbsa license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 997204 timestamp: 1782772368681 @@ -8121,6 +8402,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 71117 timestamp: 1761979776756 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.125-he30d5cf_1.conda @@ -8131,6 +8413,7 @@ packages: - libpciaccess >=0.18,<0.19.0a0 license: MIT license_family: MIT + purls: [] size: 344548 timestamp: 1757212128414 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda @@ -8151,6 +8434,7 @@ packages: depends: - libglvnd 1.7.0 hd24410f_2 license: LicenseRef-libglvnd + purls: [] size: 53551 timestamp: 1731330990477 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda @@ -8162,6 +8446,7 @@ packages: - expat 2.7.3.* license: MIT license_family: MIT + purls: [] size: 76201 timestamp: 1763549910086 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda @@ -8173,6 +8458,7 @@ packages: - expat 2.7.4.* license: MIT license_family: MIT + purls: [] size: 76564 timestamp: 1771259530958 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda @@ -8219,6 +8505,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 55586 timestamp: 1760295405021 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.5.0-he9c94f4_1.conda @@ -8231,6 +8518,7 @@ packages: - libstdcxx >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 397272 timestamp: 1764526699497 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.1-h8af1aa0_0.conda @@ -8239,6 +8527,7 @@ packages: depends: - libfreetype6 >=2.14.1 license: GPL-2.0-only OR FTL + purls: [] size: 7753 timestamp: 1757945484817 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.2-h8af1aa0_0.conda @@ -8247,6 +8536,7 @@ packages: depends: - libfreetype6 >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 8108 timestamp: 1772756012710 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.1-hdae7a39_0.conda @@ -8259,6 +8549,7 @@ packages: constrains: - freetype >=2.14.1 license: GPL-2.0-only OR FTL + purls: [] size: 423210 timestamp: 1757945484108 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.2-hdae7a39_0.conda @@ -8271,31 +8562,9 @@ packages: constrains: - freetype >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 423372 timestamp: 1772756012086 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_15.conda - sha256: ff184dbe54493b663eab2d62fa0b5a689eb84bec6401fcaeb44265c7f31ae4c6 - md5: cfdf8700e69902a113f2611e3cc09b55 - depends: - - _openmp_mutex >=4.5 - constrains: - - libgcc-ng ==15.2.0=*_15 - - libgomp 15.2.0 h8acb6b2_15 - license: GPL-3.0-only WITH GCC-exception-3.1 - size: 621200 - timestamp: 1764836146613 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda - sha256: 44bfc6fe16236babb271e0c693fe7fd978f336542e23c9c30e700483796ed30b - md5: cf9cd6739a3b694dcf551d898e112331 - depends: - - _openmp_mutex >=4.5 - constrains: - - libgomp 15.2.0 h8acb6b2_16 - - libgcc-ng ==15.2.0=*_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 620637 - timestamp: 1765256938043 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda sha256: 43df385bedc1cab11993c4369e1f3b04b4ca5d0ea16cba6a0e7f18dbc129fcc9 md5: 552567ea2b61e3a3035759b2fdb3f9a6 @@ -8309,36 +8578,20 @@ packages: purls: [] size: 622900 timestamp: 1771378128706 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - sha256: 4592b096e553f67799ae70d4b6167eeda3ec74587d68c7aecbf4e7b1df136681 - md5: f35b3f52d0a2ec4ffe3c89ba135cdb9a +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + sha256: 88a3d400c678df034c9d498f32503779977d5ea826063687c663e42c945abed5 + md5: 91eb209af1098d652fc69b8a3fc7cbaa depends: - _openmp_mutex >=4.5 constrains: - - libgomp 15.2.0 h8acb6b2_19 - - libgcc-ng ==15.2.0=*_19 + - libgomp 16.1.0 h8acb6b2_1 + - libgcc-ng ==16.1.0=*_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] run_exports: {} - size: 622462 - timestamp: 1778268755949 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_15.conda - sha256: 80e6135b5b0083ad6f0f00b8368d666fb148923fe2d3ab7d8cdca3eaf575eeff - md5: ad92990dc6f608f412a01540a7c9510e - depends: - - libgcc 15.2.0 h8acb6b2_15 - license: GPL-3.0-only WITH GCC-exception-3.1 - size: 26927 - timestamp: 1764836155568 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - sha256: 22d7e63a00c880bd14fbbc514ec6f553b9325d705f08582e9076c7e73c93a2e1 - md5: 3e54a6d0f2ff0172903c0acfda9efc0e - depends: - - libgcc 15.2.0 h8acb6b2_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 27356 - timestamp: 1765256948637 + size: 628785 + timestamp: 1785374520532 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f md5: 4feebd0fbf61075a1a9c2e9b3936c257 @@ -8349,6 +8602,19 @@ packages: purls: [] size: 27568 timestamp: 1771378136019 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_1.conda + sha256: e0456b4b49e8f9f9ffc04b1b412101ea2c38476eaceb9a0e4e16792d7cfdd929 + md5: e4489d8717b51cee8a33f2b66d10fa6a + depends: + - libgcc 16.1.0 h205dda4_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libgcc + size: 28123 + timestamp: 1785374523851 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_16.conda sha256: 02fa489a333ee4bb5483ae6bf221386b67c25d318f2f856237821a7c9333d5be md5: 776cca322459d09aad229a49761c0654 @@ -8358,6 +8624,7 @@ packages: - libgfortran-ng ==15.2.0=*_16 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 27314 timestamp: 1765256989755 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda @@ -8381,6 +8648,7 @@ packages: - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 1485817 timestamp: 1765256963205 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda @@ -8402,6 +8670,7 @@ packages: - libglvnd 1.7.0 hd24410f_2 - libglx 1.7.0 hd24410f_2 license: LicenseRef-libglvnd + purls: [] size: 145442 timestamp: 1731331005019 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.3-hf53f6bf_0.conda @@ -8416,6 +8685,7 @@ packages: constrains: - glib 2.86.3 *_0 license: LGPL-2.1-or-later + purls: [] size: 4041779 timestamp: 1765221790843 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda @@ -8430,12 +8700,14 @@ packages: constrains: - glib 2.86.4 *_1 license: LGPL-2.1-or-later + purls: [] size: 4512186 timestamp: 1771863220969 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda sha256: 57ec3898a923d4bcc064669e90e8abfc4d1d945a13639470ba5f3748bd3090da md5: 9e115653741810778c9a915a2f8439e7 license: LicenseRef-libglvnd + purls: [] size: 152135 timestamp: 1731330986070 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda @@ -8445,21 +8717,9 @@ packages: - libglvnd 1.7.0 hd24410f_2 - xorg-libx11 >=1.8.9,<2.0a0 license: LicenseRef-libglvnd + purls: [] size: 77736 timestamp: 1731330998960 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_15.conda - sha256: d76cbb7e76af310828c74396a78c59a3b305431da25c9337e420bb441d2e8ca0 - md5: 0719da240fd6086c34c4c30080329806 - license: GPL-3.0-only WITH GCC-exception-3.1 - size: 587301 - timestamp: 1764836050907 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda - sha256: 0a9d77c920db691eb42b78c734d70c5a1d00b3110c0867cfff18e9dd69bc3c29 - md5: 4d2f224e8186e7881d53e3aead912f6c - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 587924 - timestamp: 1765256821307 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 md5: 4faa39bf919939602e594253bd673958 @@ -8468,16 +8728,17 @@ packages: purls: [] size: 588060 timestamp: 1771378040807 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda - sha256: 2370ef0ffcbae5bede3c4bf136add4abc257245eb91f724c99bb4a43116c5a83 - md5: c5e8a379c4a2ec2aea4ba22758c001d9 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + sha256: 1c609a4a72597350317b92c4d9dfb85d21740219048e2b1d458925a6ccfa3d7a + md5: 4c9b02fc9fe27704777e260157003653 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] run_exports: strong: - _openmp_mutex >=4.5 - size: 587387 - timestamp: 1778268674393 + size: 617180 + timestamp: 1785374444877 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.12.1-default_ha470c98_1003.conda sha256: f0d2fdf4480bac454ac4585fbb8283dde72b8140e6767f9f0009bbf4aedd2db6 md5: da82e5681665613cd336ee8a7b7b87de @@ -8488,6 +8749,7 @@ packages: - libxml2-16 >=2.14.6 license: BSD-3-Clause license_family: BSD + purls: [] size: 2465783 timestamp: 1765090029212 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda @@ -8500,6 +8762,7 @@ packages: - libxml2-16 >=2.14.6 license: BSD-3-Clause license_family: BSD + purls: [] size: 2467105 timestamp: 1765103804193 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwy-1.3.0-h81d0cf9_1.conda @@ -8509,6 +8772,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: Apache-2.0 OR BSD-3-Clause + purls: [] size: 1180000 timestamp: 1758894754411 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda @@ -8517,6 +8781,7 @@ packages: depends: - libgcc >=14 license: LGPL-2.1-only + purls: [] size: 791226 timestamp: 1754910975665 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda @@ -8527,6 +8792,7 @@ packages: constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib + purls: [] size: 691818 timestamp: 1762094728337 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjxl-0.11.2-h71be66a_0.conda @@ -8540,6 +8806,7 @@ packages: - libhwy >=1.3.0,<1.4.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1489440 timestamp: 1770801995062 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda @@ -8554,6 +8821,7 @@ packages: - libcblas 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18392 timestamp: 1765818627104 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda @@ -8579,6 +8847,7 @@ packages: constrains: - xz 5.8.1.* license: 0BSD + purls: [] size: 125103 timestamp: 1749232230009 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda @@ -8612,6 +8881,7 @@ packages: - libgcc >=13 license: BSD-2-Clause license_family: BSD + purls: [] size: 114064 timestamp: 1748393729243 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda @@ -8621,6 +8891,7 @@ packages: - libgcc >=14 license: BSD-2-Clause license_family: BSD + purls: [] run_exports: {} size: 114056 timestamp: 1769482343003 @@ -8656,24 +8927,25 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 770989 timestamp: 1761098866337 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvfatbin-13.3.29-h8f3c8d4_0.conda - sha256: a811726bc62a3e1952672aa0917166f8123e0ff2c182b9346384f8e962184530 - md5: 3ace0e6476f8c17381dc3b391c3c5049 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvfatbin-12.9.82-h8f3c8d4_2.conda + sha256: 11a041920935c01fce0cc351f5db4157a3154e9a1aa3cfec29a707fb44c9a112 + md5: 230f26daf9cfcf4a4185c0c6f9cbdcb2 depends: - arm-variant * sbsa - - cuda-version >=13.3,<13.4.0a0 + - cuda-version >=12,<12.10.0a0 - libgcc >=14 - libstdcxx >=14 - constrains: - - arm-variant * sbsa license: LicenseRef-NVIDIA-End-User-License-Agreement - size: 459700 - timestamp: 1779897643320 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvfatbin-13.3.29-h8f3c8d4_1.conda - sha256: 5a5f13012bde038ad880d7af1514cc9fb6aa50dbffd69ab57e9b20914a3a5e59 - md5: c27b87f23e6381ebbb7f899bdfbe159c + purls: [] + run_exports: {} + size: 771344 + timestamp: 1782920321153 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvfatbin-13.3.29-h8f3c8d4_0.conda + sha256: a811726bc62a3e1952672aa0917166f8123e0ff2c182b9346384f8e962184530 + md5: 3ace0e6476f8c17381dc3b391c3c5049 depends: - arm-variant * sbsa - cuda-version >=13.3,<13.4.0a0 @@ -8682,9 +8954,9 @@ packages: constrains: - arm-variant * sbsa license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 458764 - timestamp: 1782920269581 + purls: [] + size: 459700 + timestamp: 1779897643320 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-12.9.86-h8f3c8d4_2.conda sha256: d5ff36f46250069a23b18d557052c6656f40a002333885e8c5332071e873b48e md5: e318a6573fea150226d5f417d1c0807a @@ -8694,6 +8966,8 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} size: 30323952 timestamp: 1760723774770 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-13.3.33-h8f3c8d4_0.conda @@ -8718,6 +8992,7 @@ packages: - libgcc >=13 license: BSD-3-Clause license_family: BSD + purls: [] size: 220653 timestamp: 1745826021156 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda @@ -8731,6 +9006,7 @@ packages: - openblas >=0.3.30,<0.3.31.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 4959359 timestamp: 1763114173544 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda @@ -8755,6 +9031,7 @@ packages: - libstdcxx >=14 - pugixml >=1.15,<1.16.0a0 - tbb >=2021.13.0 + purls: [] size: 5535917 timestamp: 1753203182299 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-2026.0.0-h1915271_1.conda @@ -8767,6 +9044,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 5742222 timestamp: 1772721263739 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-arm-cpu-plugin-2025.2.0-hcd21e76_1.conda @@ -8778,6 +9056,7 @@ packages: - libstdcxx >=14 - pugixml >=1.15,<1.16.0a0 - tbb >=2021.13.0 + purls: [] size: 9257629 timestamp: 1753203203327 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-arm-cpu-plugin-2026.0.0-h1915271_1.conda @@ -8791,6 +9070,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 10237615 timestamp: 1772721303162 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-batch-plugin-2025.2.0-h3890994_1.conda @@ -8801,6 +9081,7 @@ packages: - libopenvino 2025.2.0 hcd21e76_1 - libstdcxx >=14 - tbb >=2021.13.0 + purls: [] size: 111599 timestamp: 1753203233477 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-batch-plugin-2026.0.0-h3d5001d_1.conda @@ -8813,6 +9094,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 111064 timestamp: 1772721336786 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-plugin-2025.2.0-h3890994_1.conda @@ -8823,6 +9105,7 @@ packages: - libopenvino 2025.2.0 hcd21e76_1 - libstdcxx >=14 - tbb >=2021.13.0 + purls: [] size: 235379 timestamp: 1753203244808 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-plugin-2026.0.0-h3d5001d_1.conda @@ -8835,6 +9118,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 236010 timestamp: 1772721351244 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-hetero-plugin-2025.2.0-he07c6df_1.conda @@ -8845,6 +9129,7 @@ packages: - libopenvino 2025.2.0 hcd21e76_1 - libstdcxx >=14 - pugixml >=1.15,<1.16.0a0 + purls: [] size: 187747 timestamp: 1753203256494 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-hetero-plugin-2026.0.0-he07c6df_1.conda @@ -8857,6 +9142,7 @@ packages: - pugixml >=1.15,<1.16.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 202574 timestamp: 1772721365749 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-ir-frontend-2025.2.0-he07c6df_1.conda @@ -8867,6 +9153,7 @@ packages: - libopenvino 2025.2.0 hcd21e76_1 - libstdcxx >=14 - pugixml >=1.15,<1.16.0a0 + purls: [] size: 195451 timestamp: 1753203267888 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-ir-frontend-2026.0.0-he07c6df_1.conda @@ -8879,6 +9166,7 @@ packages: - pugixml >=1.15,<1.16.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 185648 timestamp: 1772721380070 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-onnx-frontend-2025.2.0-h07d5dce_1.conda @@ -8891,6 +9179,7 @@ packages: - libopenvino 2025.2.0 hcd21e76_1 - libprotobuf >=6.31.1,<6.31.2.0a0 - libstdcxx >=14 + purls: [] size: 1530030 timestamp: 1753203281815 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-onnx-frontend-2026.0.0-h558496d_1.conda @@ -8905,6 +9194,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 1665115 timestamp: 1772721394860 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-paddle-frontend-2025.2.0-h07d5dce_1.conda @@ -8917,6 +9207,7 @@ packages: - libopenvino 2025.2.0 hcd21e76_1 - libprotobuf >=6.31.1,<6.31.2.0a0 - libstdcxx >=14 + purls: [] size: 674194 timestamp: 1753203295461 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-paddle-frontend-2026.0.0-h558496d_1.conda @@ -8931,6 +9222,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 631754 timestamp: 1772721411589 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-pytorch-frontend-2025.2.0-hfae3067_1.conda @@ -8940,6 +9232,7 @@ packages: - libgcc >=14 - libopenvino 2025.2.0 hcd21e76_1 - libstdcxx >=14 + purls: [] size: 1123835 timestamp: 1753203307507 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-pytorch-frontend-2026.0.0-hfae3067_1.conda @@ -8951,6 +9244,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 1091266 timestamp: 1772721428223 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-frontend-2025.2.0-h38473e3_1.conda @@ -8964,6 +9258,7 @@ packages: - libprotobuf >=6.31.1,<6.31.2.0a0 - libstdcxx >=14 - snappy >=1.2.2,<1.3.0a0 + purls: [] size: 1224816 timestamp: 1753203320621 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-frontend-2026.0.0-h2cb6e3c_1.conda @@ -8979,6 +9274,7 @@ packages: - snappy >=1.2.2,<1.3.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 1184078 timestamp: 1772721443833 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2025.2.0-hfae3067_1.conda @@ -8988,6 +9284,7 @@ packages: - libgcc >=14 - libopenvino 2025.2.0 hcd21e76_1 - libstdcxx >=14 + purls: [] size: 456714 timestamp: 1753203333676 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2026.0.0-hfae3067_1.conda @@ -8999,6 +9296,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 428895 timestamp: 1772721459028 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopus-1.5.2-h86ecc28_0.conda @@ -9008,6 +9306,7 @@ packages: - libgcc >=13 license: BSD-3-Clause license_family: BSD + purls: [] size: 357115 timestamp: 1744331282621 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopus-1.6.1-h80f16a2_0.conda @@ -9017,6 +9316,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 383586 timestamp: 1768497303687 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpciaccess-0.18-h86ecc28_0.conda @@ -9026,6 +9326,7 @@ packages: - libgcc >=13 license: MIT license_family: MIT + purls: [] size: 29512 timestamp: 1749901899881 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.53-h1abf092_0.conda @@ -9035,6 +9336,7 @@ packages: - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement + purls: [] size: 340043 timestamp: 1764981067899 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda @@ -9044,6 +9346,7 @@ packages: - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement + purls: [] size: 340156 timestamp: 1770691477245 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-6.31.1-h2cf3c76_2.conda @@ -9057,6 +9360,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 4465754 timestamp: 1760550264433 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-6.31.1-h2cf3c76_4.conda @@ -9070,6 +9374,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 4218080 timestamp: 1766315327959 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-6.33.5-h1f88751_0.conda @@ -9083,6 +9388,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 3465308 timestamp: 1769748410724 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.60.0-h8171147_0.conda @@ -9098,6 +9404,7 @@ packages: constrains: - __glibc >=2.17 license: LGPL-2.1-or-later + purls: [] size: 2995492 timestamp: 1759335330016 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.60.2-h8171147_0.conda @@ -9113,6 +9420,7 @@ packages: constrains: - __glibc >=2.17 license: LGPL-2.1-or-later + purls: [] size: 4016799 timestamp: 1771406266442 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_16.conda @@ -9123,6 +9431,7 @@ packages: - libstdcxx >=15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 7460968 timestamp: 1765257008136 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_18.conda @@ -9133,21 +9442,22 @@ packages: - libstdcxx >=15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 7164557 timestamp: 1771378185265 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_19.conda - sha256: 8115604f113fe2b7be95b2d22183a4dda5779c1cc6db4b826af800581498b4b3 - md5: 95210a1edbd7fc6e12afc9f8276f450a +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-16.1.0-h2510bd8_1.conda + sha256: 3dfccbcd3bf34923df7482df41bcdbe599675f2de6f03a554dbc238476693854 + md5: ae3d9771453f2ec660dd79e5728129b3 depends: - - libgcc >=15.2.0 - - libstdcxx >=15.2.0 + - libgcc >=16.1.0 + - libstdcxx >=16.1.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL run_exports: weak: - - libsanitizer 15.2.0 - size: 7067965 - timestamp: 1778268796086 + - libsanitizer 16.1.0 + size: 8123895 + timestamp: 1785374560390 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h30591a0_2.conda sha256: f0b6844c09cdec608ca504bd97c5d64a5596a25f66ad806381f9d63dfc89e432 md5: 362bc94148039b77c6a42b1f7e7ef537 @@ -9162,6 +9472,7 @@ packages: - mpg123 >=1.32.9,<1.33.0a0 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 406978 timestamp: 1765181892661 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda @@ -9180,6 +9491,7 @@ packages: - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: blessing + purls: [] size: 939207 timestamp: 1764359457549 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.1-h10b116e_1.conda @@ -9190,6 +9502,7 @@ packages: - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: blessing + purls: [] size: 943924 timestamp: 1766319577347 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda @@ -9203,40 +9516,18 @@ packages: purls: [] size: 952296 timestamp: 1772818881550 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.3-h10b116e_0.conda - sha256: a835400072fb638fb582ee9fc2271169da84cbcad664d28b852610201116027e - md5: 2cd50877f494b34383af22560ced8b04 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda + sha256: da46b52f6815e9771f4e21e3332c423c88644e91ac96b0534e85158adc88a8b4 + md5: 99898219505ff142be5734dc6fa0d900 depends: - - icu >=78.3,<79.0a0 - libgcc >=14 - libzlib >=1.3.2,<2.0a0 license: blessing run_exports: weak: - - libsqlite >=3.53.3,<4.0a0 - size: 968420 - timestamp: 1782519054102 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_15.conda - sha256: f6347ce1d1a8a9ecfa16fc118594b0a5cab9194a8dcc7e79cd02a7497822d1d2 - md5: 2873f805cdabcf33b880b19077cf6180 - depends: - - libgcc 15.2.0 h8acb6b2_15 - constrains: - - libstdcxx-ng ==15.2.0=*_15 - license: GPL-3.0-only WITH GCC-exception-3.1 - size: 5540090 - timestamp: 1764836183565 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda - sha256: 4db11a903707068ae37aa6909511c68e9af6a2e97890d1b73b0a8d87cb74aba9 - md5: 52d9df8055af3f1665ba471cce77da48 - depends: - - libgcc 15.2.0 h8acb6b2_16 - constrains: - - libstdcxx-ng ==15.2.0=*_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 5541149 - timestamp: 1765256980783 + - libsqlite >=3.53.4,<4.0a0 + size: 963888 + timestamp: 1785016056926 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 md5: f56573d05e3b735cb03efeb64a15f388 @@ -9249,45 +9540,32 @@ packages: purls: [] size: 5541411 timestamp: 1771378162499 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - sha256: 1dadc45e599f510dd5f97141dddcdbb9844d9f1430c1f3a38075cf1c58f87b4e - md5: 543fbc8d71f2a0baf04cf88ce96cb8bb +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + sha256: 81ef9a10a0e01ffc7e03d429ed048410153411b2d8bbf95c334bdf3dcf175ab0 + md5: 0bfd287b881e05351a01c7ebf7bf8f1b depends: - - libgcc 15.2.0 h8acb6b2_19 + - libgcc 16.1.0 h205dda4_1 constrains: - - libstdcxx-ng ==15.2.0=*_19 + - libstdcxx-ng ==16.1.0=*_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] run_exports: {} - size: 5546559 - timestamp: 1778268777463 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_15.conda - sha256: 73d026540bd2ec75186bc82c164fbfa51cbe44c4c27ed64b57bf52b10f6f3d63 - md5: 7a99de7c14096347968d1fd574b46bb2 - depends: - - libstdcxx 15.2.0 hef695bb_15 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 26977 - timestamp: 1764836231696 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda - sha256: dd5c813ae5a4dac6fa946352674e0c21b1847994a717ef67bd6cc77bc15920be - md5: 20b7f96f58ccbe8931c3a20778fb3b32 - depends: - - libstdcxx 15.2.0 hef695bb_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 27376 - timestamp: 1765257033344 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda - sha256: 035a31cde134e706e30029a837a31f729ad32b7c5bca023271dfe91a8ba6c896 - md5: 699d294376fe18d80b7ce7876c3a875d + size: 6255794 + timestamp: 1785374543663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_1.conda + sha256: cb88eb500022e01f835209e771d455d2296e10a18a749f518c257dfcab7d46ba + md5: a728408241f9db99bad0d1642c908714 depends: - - libstdcxx 15.2.0 hef695bb_18 + - libstdcxx 16.1.0 hef695bb_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 27645 - timestamp: 1771378204663 + purls: [] + run_exports: + strong: + - libstdcxx + size: 28182 + timestamp: 1785374577436 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.10-hf9559e3_4.conda sha256: 95bb4c430e8ca666a4c67b7951f03fbee5a5258b1d29c2a26bf56c86fe32c010 md5: 96e731e9cf876fb2d8882093c0f24630 @@ -9295,6 +9573,7 @@ packages: - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] size: 517911 timestamp: 1770738680829 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hf9559e3_0.conda @@ -9314,6 +9593,7 @@ packages: - libcap >=2.78,<2.79.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] run_exports: {} size: 515284 timestamp: 1780084773602 @@ -9331,6 +9611,7 @@ packages: - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: HPND + purls: [] size: 488407 timestamp: 1762022048105 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.10-hf9559e3_4.conda @@ -9340,6 +9621,7 @@ packages: - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] size: 157130 timestamp: 1770738690431 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hf9559e3_0.conda @@ -9359,6 +9641,7 @@ packages: - libcap >=2.78,<2.79.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] run_exports: {} size: 156922 timestamp: 1780084778404 @@ -9370,6 +9653,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 94555 timestamp: 1757032278900 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liburing-2.12-hfefdfc9_0.conda @@ -9380,6 +9664,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 129619 timestamp: 1756126369793 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liburing-2.13-hfefdfc9_0.conda @@ -9390,6 +9675,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 134026 timestamp: 1765873930570 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liburing-2.14-hfefdfc9_0.conda @@ -9400,6 +9686,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 155011 timestamp: 1770567701524 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libusb-1.0.29-h06eaf92_0.conda @@ -9409,6 +9696,7 @@ packages: - libgcc >=13 - libudev1 >=257.4 license: LGPL-2.1-or-later + purls: [] size: 93129 timestamp: 1748856228398 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h1022ec0_1.conda @@ -9417,6 +9705,7 @@ packages: depends: - libgcc >=14 license: BSD-3-Clause + purls: [] size: 43415 timestamp: 1764790752623 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda @@ -9426,6 +9715,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 43453 timestamp: 1766271546875 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda @@ -9460,6 +9750,7 @@ packages: - libogg >=1.3.5,<1.4.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 289391 timestamp: 1753879417231 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvpx-1.15.2-hfae3067_0.conda @@ -9470,6 +9761,7 @@ packages: - libstdcxx >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 1296382 timestamp: 1762012332100 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvulkan-loader-1.4.328.1-h8b8848b_0.conda @@ -9484,6 +9776,7 @@ packages: - libvulkan-headers 1.4.328.1.* license: Apache-2.0 license_family: APACHE + purls: [] size: 214593 timestamp: 1759972148472 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvulkan-loader-1.4.341.0-h8b8848b_0.conda @@ -9498,6 +9791,7 @@ packages: - libvulkan-headers 1.4.341.0.* license: Apache-2.0 license_family: APACHE + purls: [] size: 217655 timestamp: 1770077141862 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda @@ -9509,6 +9803,7 @@ packages: - libwebp 1.6.0 license: BSD-3-Clause license_family: BSD + purls: [] size: 359496 timestamp: 1752160685488 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda @@ -9521,6 +9816,7 @@ packages: - xorg-libxdmcp license: MIT license_family: MIT + purls: [] size: 397493 timestamp: 1727280745441 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda @@ -9545,6 +9841,7 @@ packages: - xorg-libxau >=1.0.12,<2.0a0 license: MIT/X11 Derivative license_family: MIT + purls: [] size: 863646 timestamp: 1764794352540 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.1-h79dcc73_1.conda @@ -9560,6 +9857,7 @@ packages: - libxml2 2.15.1 license: MIT license_family: MIT + purls: [] size: 599721 timestamp: 1766327134458 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.1-h8591a01_0.conda @@ -9575,6 +9873,7 @@ packages: - libxml2 2.15.1 license: MIT license_family: MIT + purls: [] size: 597078 timestamp: 1761015734476 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.2-h79dcc73_0.conda @@ -9590,6 +9889,7 @@ packages: - libxml2 2.15.2 license: MIT license_family: MIT + purls: [] size: 598438 timestamp: 1772704671710 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.1-h788dabe_0.conda @@ -9604,6 +9904,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 47192 timestamp: 1761015739999 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.1-h825857f_1.conda @@ -9618,6 +9919,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 47725 timestamp: 1766327143205 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.2-h825857f_0.conda @@ -9632,6 +9934,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 47837 timestamp: 1772704681112 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda @@ -9643,6 +9946,7 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other + purls: [] size: 66657 timestamp: 1727963199518 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda @@ -9658,6 +9962,18 @@ packages: - libzlib >=1.3.2,<2.0a0 size: 69833 timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + sha256: 76efa6cc9d7e6f5ee3bbca0939f64054af2bdfb3c3632531f8e633cf6c2ea41e + md5: bd534c2fbe56d8c2ea3b2d8f5e12bca8 + constrains: + - zlib 1.3.2 *_3 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 70108 + timestamp: 1785276540870 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/make-4.4.1-h2a6d0cb_2.conda sha256: d243aea768e6fa360b7eda598340f43d2a41c9fc169d9f97f505410be68815f8 md5: 5983ffb12d09efc45c4a3b74cd890137 @@ -9691,6 +10007,7 @@ packages: - libstdcxx >=13 license: LGPL-2.1-only license_family: LGPL + purls: [] size: 558708 timestamp: 1730581372400 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/msgpack-python-1.1.2-py312h4f740d2_1.conda @@ -9745,6 +10062,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 7815328 timestamp: 1763351321550 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.0-py314haac167e_0.conda @@ -9763,6 +10082,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 8001251 timestamp: 1766373967611 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.2-py314haac167e_1.conda @@ -9781,6 +10102,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 8006259 timestamp: 1770098510476 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py312h6615c27_0.conda @@ -9811,6 +10134,7 @@ packages: - libstdcxx >=13 license: BSD-2-Clause license_family: BSD + purls: [] size: 774512 timestamp: 1739400731652 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda @@ -9821,6 +10145,7 @@ packages: - libgcc >=14 license: Apache-2.0 license_family: Apache + purls: [] size: 3705625 timestamp: 1762841024958 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda @@ -9834,9 +10159,9 @@ packages: purls: [] size: 3692030 timestamp: 1769557678657 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_0.conda - sha256: da4a5df42614166b69c2f6d8602fc1425f7aaa699f77c3bafb5c7fe69b3d9fb7 - md5: fa6260b3e6eababf6ca85a7eb3336383 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda + sha256: c89e748e8a008e8ca6f25e102362f33319db0c98cc29d98ddada92842f636327 + md5: 1600dfde78c5adba306f8571af62a323 depends: - ca-certificates - libgcc >=14 @@ -9845,8 +10170,8 @@ packages: run_exports: weak: - openssl >=3.6.3,<4.0a0 - size: 3704664 - timestamp: 1781069675555 + size: 3719270 + timestamp: 1785913554920 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.56.4-he55ef5b_0.conda sha256: dd36cd5b6bc1c2988291a6db9fa4eb8acade9b487f6f1da4eaa65a1eebb0a12d md5: a22cc88bf6059c9bcc158c94c9aab5b8 @@ -9864,6 +10189,7 @@ packages: - libpng >=1.6.49,<1.7.0a0 - libzlib >=1.3.1,<2.0a0 license: LGPL-2.1-or-later + purls: [] size: 468811 timestamp: 1751293869070 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda @@ -9875,6 +10201,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1166552 timestamp: 1763655534263 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda @@ -9886,6 +10213,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 357913 timestamp: 1754665583353 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.2.2-py312hd41f8a7_0.conda @@ -9909,6 +10237,7 @@ packages: - libgcc >=13 license: MIT license_family: MIT + purls: [] size: 8342 timestamp: 1726803319942 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pugixml-1.15-h6ef32b0_0.conda @@ -9919,6 +10248,7 @@ packages: - libstdcxx >=13 license: MIT license_family: MIT + purls: [] size: 113424 timestamp: 1737355438448 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pulseaudio-client-17.0-hcf98165_3.conda @@ -9936,6 +10266,7 @@ packages: - pulseaudio 17.0 *_3 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 760306 timestamp: 1763148231117 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.13-h91f4b29_0_cpython.conda @@ -9987,6 +10318,7 @@ packages: - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 + purls: [] size: 37149339 timestamp: 1764757159033 python_site_packages_path: lib/python3.14/site-packages @@ -10013,6 +10345,7 @@ packages: - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 + purls: [] size: 37217543 timestamp: 1765020325291 python_site_packages_path: lib/python3.14/site-packages @@ -10039,13 +10372,14 @@ packages: - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 + purls: [] size: 37305578 timestamp: 1770674395875 python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_100_cp314.conda - build_number: 100 - sha256: dd56fd95db3cb49a69fbe41df80afc8bd5214daa829bcd3930de80f0408ba5eb - md5: 416c74941d13d9f2b9e68b1a900f7f50 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda + build_number: 101 + sha256: b8135c10971f387402f42b8fe52cf983665e9af9a7b5c839ae082a0f71f6c0c4 + md5: 6ed1a6d56adc15f18919b6fc87660bd1 depends: - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-aarch64 >=2.36.1 @@ -10054,8 +10388,8 @@ packages: - libgcc >=14 - liblzma >=5.8.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.53.2,<4.0a0 - - libuuid >=2.42.1,<3.0a0 + - libsqlite >=3.53.3,<4.0a0 + - libuuid >=2.42.2,<3.0a0 - libzlib >=1.3.2,<2.0a0 - ncurses >=6.6,<7.0a0 - openssl >=3.5.7,<4.0a0 @@ -10070,8 +10404,8 @@ packages: - python_abi 3.14.* *_cp314 noarch: - python - size: 34900936 - timestamp: 1781254861576 + size: 34850010 + timestamp: 1784909900639 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda sha256: 0ba02720b470150a8c6261a86ea4db01dcf121e16a3e3978a84e965d3fe9c39a @@ -10130,6 +10464,7 @@ packages: - libudev1 >=257.13 license: Linux-OpenIB license_family: BSD + purls: [] run_exports: weak: - rdma-core >=63.0 @@ -10143,6 +10478,7 @@ packages: - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 291806 timestamp: 1740380591358 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda @@ -10221,6 +10557,7 @@ packages: - libgl >=1.7.0,<2.0a0 - libegl >=1.7.0,<2.0a0 license: Zlib + purls: [] size: 597756 timestamp: 1757842928996 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl3-3.2.28-h3d544e7_0.conda @@ -10246,6 +10583,7 @@ packages: - libunwind >=1.8.3,<1.9.0a0 - pulseaudio-client >=17.0,<17.1.0a0 license: Zlib + purls: [] size: 1929093 timestamp: 1764713313724 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl3-3.2.30-h3d544e7_0.conda @@ -10271,6 +10609,7 @@ packages: - libgl >=1.7.0,<2.0a0 - xorg-libx11 >=1.8.12,<2.0a0 license: Zlib + purls: [] size: 1928569 timestamp: 1767236340915 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl3-3.4.2-had2c13b_0.conda @@ -10299,6 +10638,7 @@ packages: - dbus >=1.16.2,<2.0a0 - xorg-libx11 >=1.8.13,<2.0a0 license: Zlib + purls: [] size: 2136476 timestamp: 1771668207211 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/shaderc-2025.5-h8c88b8f_0.conda @@ -10311,6 +10651,7 @@ packages: - spirv-tools >=2025,<2026.0a0 license: Apache-2.0 license_family: Apache + purls: [] size: 115395 timestamp: 1764287938541 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/shaderc-2025.5-hfeb5c2c_1.conda @@ -10323,6 +10664,7 @@ packages: - spirv-tools >=2026,<2027.0a0 license: Apache-2.0 license_family: Apache + purls: [] size: 115498 timestamp: 1770208786806 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.2-he774c54_1.conda @@ -10334,6 +10676,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 47096 timestamp: 1762948094646 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/spirv-tools-2025.4-hfefdfc9_0.conda @@ -10346,6 +10689,7 @@ packages: - spirv-headers >=1.4.328.0,<1.4.328.1.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 2511309 timestamp: 1759805874123 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/spirv-tools-2026.1-hfefdfc9_0.conda @@ -10358,6 +10702,7 @@ packages: - spirv-headers >=1.4.341.0,<1.4.341.1.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 2255599 timestamp: 1770089690097 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlalchemy-2.0.49-py312h2fc9c67_0.conda @@ -10383,6 +10728,7 @@ packages: - libstdcxx >=14 license: BSD-2-Clause license_family: BSD + purls: [] size: 2106252 timestamp: 1756090698097 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/svt-av1-4.0.1-hfae3067_0.conda @@ -10393,6 +10739,7 @@ packages: - libstdcxx >=14 license: BSD-2-Clause license_family: BSD + purls: [] size: 2042800 timestamp: 1769668627820 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tbb-2022.3.0-h0eac15c_1.conda @@ -10404,6 +10751,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 144223 timestamp: 1762511489745 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tbb-2022.3.0-hfefdfc9_2.conda @@ -10415,6 +10763,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 144746 timestamp: 1767888618836 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda @@ -10440,6 +10789,7 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: TCL license_family: BSD + purls: [] size: 3333495 timestamp: 1763059192223 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda @@ -10470,9 +10820,9 @@ packages: - pkg:pypi/tornado?source=hash-mapping size: 859168 timestamp: 1774359394755 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.11.29-hbe9c82f_0.conda - sha256: f17967c3ed7ad0b92ca97a7abfdf3e556d91649cbd74a1dd35962a333cfbed78 - md5: ef5ef192c6e6f74b6b1271b248336104 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda + sha256: 1c3f53ff574ca92562c83e29ab158d0e5790ed3dc0a70bc6c7a6e6108bc5c623 + md5: db4ed0e0968098dd8bdca55d62dc5dc5 depends: - libgcc >=14 - libstdcxx >=14 @@ -10480,8 +10830,8 @@ packages: - __glibc >=2.17 license: Apache-2.0 OR MIT run_exports: {} - size: 20306087 - timestamp: 1784166394558 + size: 17181969 + timestamp: 1785973409651 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.24.0-h4f8a99f_1.conda sha256: d94af8f287db764327ac7b48f6c0cd5c40da6ea2606afd34ac30671b7c85d8ee md5: f6966cb1f000c230359ae98c29e37d87 @@ -10492,6 +10842,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 331480 timestamp: 1761174368396 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/x264-1!164.3095-h4e544f5_2.tar.bz2 @@ -10501,6 +10852,7 @@ packages: - libgcc-ng >=12 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 1000661 timestamp: 1660324722559 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/x265-3.5-hdd96247_3.tar.bz2 @@ -10511,6 +10863,7 @@ packages: - libstdcxx-ng >=10.3.0 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 1018181 timestamp: 1646610147365 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xkeyboard-config-2.46-he30d5cf_0.conda @@ -10521,6 +10874,7 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT + purls: [] size: 396706 timestamp: 1759543850920 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xkeyboard-config-2.47-he30d5cf_0.conda @@ -10531,6 +10885,7 @@ packages: - xorg-libx11 >=1.8.13,<2.0a0 license: MIT license_family: MIT + purls: [] size: 399629 timestamp: 1772021320967 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda @@ -10540,6 +10895,7 @@ packages: - libgcc >=13 license: MIT license_family: MIT + purls: [] size: 60433 timestamp: 1734229908988 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda @@ -10551,6 +10907,7 @@ packages: - xorg-libice >=1.1.2,<2.0a0 license: MIT license_family: MIT + purls: [] size: 28701 timestamp: 1741897678254 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.12-hca56bd8_0.conda @@ -10561,6 +10918,7 @@ packages: - libxcb >=1.17.0,<2.0a0 license: MIT license_family: MIT + purls: [] size: 864850 timestamp: 1741901264068 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda @@ -10571,6 +10929,7 @@ packages: - libxcb >=1.17.0,<2.0a0 license: MIT license_family: MIT + purls: [] size: 869058 timestamp: 1770819244991 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda @@ -10580,6 +10939,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 16317 timestamp: 1762977521691 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxcursor-1.2.3-h86ecc28_0.conda @@ -10592,6 +10952,7 @@ packages: - xorg-libxrender >=0.9.11,<0.10.0a0 license: MIT license_family: MIT + purls: [] size: 34596 timestamp: 1730908388714 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda @@ -10601,6 +10962,7 @@ packages: - libgcc >=14 license: MIT license_family: MIT + purls: [] size: 21039 timestamp: 1762979038025 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.6-h57736b2_0.conda @@ -10611,6 +10973,7 @@ packages: - xorg-libx11 >=1.8.9,<2.0a0 license: MIT license_family: MIT + purls: [] size: 50746 timestamp: 1727754268156 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda @@ -10621,6 +10984,7 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT + purls: [] size: 52409 timestamp: 1769446753771 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda @@ -10631,6 +10995,7 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT + purls: [] size: 20704 timestamp: 1759284028146 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda @@ -10643,6 +11008,7 @@ packages: - xorg-libxfixes >=6.0.1,<7.0a0 license: MIT license_family: MIT + purls: [] size: 48197 timestamp: 1727801059062 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.4-h86ecc28_0.conda @@ -10655,6 +11021,7 @@ packages: - xorg-libxrender >=0.9.11,<0.10.0a0 license: MIT license_family: MIT + purls: [] size: 30197 timestamp: 1727794957221 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda @@ -10667,6 +11034,7 @@ packages: - xorg-libxrender >=0.9.12,<0.10.0a0 license: MIT license_family: MIT + purls: [] size: 31122 timestamp: 1769445286951 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda @@ -10677,6 +11045,7 @@ packages: - xorg-libx11 >=1.8.10,<2.0a0 license: MIT license_family: MIT + purls: [] size: 33649 timestamp: 1734229123157 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxscrnsaver-1.2.4-h86ecc28_0.conda @@ -10688,6 +11057,7 @@ packages: - xorg-libxext >=1.3.6,<2.0a0 license: MIT license_family: MIT + purls: [] size: 15720 timestamp: 1750007336692 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda @@ -10700,6 +11070,7 @@ packages: - xorg-libxi >=1.7.10,<2.0a0 license: MIT license_family: MIT + purls: [] size: 33786 timestamp: 1727964907993 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda @@ -10883,6 +11254,7 @@ packages: depends: - __win license: ISC + purls: [] size: 152827 timestamp: 1762967310929 - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda @@ -10891,6 +11263,7 @@ packages: depends: - __unix license: ISC + purls: [] size: 152432 timestamp: 1762967197890 - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda @@ -10899,6 +11272,7 @@ packages: depends: - __win license: ISC + purls: [] size: 147139 timestamp: 1767500904211 - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda @@ -10907,6 +11281,7 @@ packages: depends: - __unix license: ISC + purls: [] size: 146519 timestamp: 1767500828366 - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda @@ -10927,24 +11302,24 @@ packages: purls: [] size: 147413 timestamp: 1772006283803 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda - sha256: 7f458e4a82514d7bebbfef23d92817794a16aaf1c748a15f04870d4fb49aeab2 - md5: b9696b2cf00dfeec138c70cee38ed192 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + sha256: 95e8e74062a5fe5f870ac8c90302b6e89945165fdaed7810606e84ddee6aac12 + md5: e27d2ac27b096dc51fedfcf775a53f9b depends: - __win license: ISC run_exports: {} - size: 129352 - timestamp: 1781709016515 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - sha256: f8e3c730fa14ee3f170493779f06522c4acf89169f43db4f039727709b6419cf - md5: a9965dd99f683c5f444428f896635716 + size: 132136 + timestamp: 1784754918886 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + sha256: 0a0544cf95f64394fe4959286f5c71f5444ad58feb0602e53becb27448d24da6 + md5: 0f51e2391ade309db462a55611263e9c depends: - __unix license: ISC run_exports: {} - size: 128866 - timestamp: 1781708962055 + size: 131780 + timestamp: 1784754889428 - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda sha256: ec791bb6f1ef504411f87b28946a7ae63ed1f3681cefc462cf1dfdaf0790b6a9 md5: 241ef6e3db47a143ac34c21bfba510f1 @@ -11058,6 +11433,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1150650 timestamp: 1746189825236 @@ -11067,17 +11443,18 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 1472271 timestamp: 1779895496841 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_0.conda - sha256: 51106d05567031d9b10a26bcaea95022c9ae91ce44758df5dec86d46985bef61 - md5: c7aab5efb8e8151a038f9eb271f23dcf +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_1.conda + sha256: fa44586fc308d0089fb5f014d5b53cbea19a2e83cd7bbd1e19c79140293be9a3 + md5: 199a317645eac1a18745d05dc551ab6e depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement run_exports: {} - size: 1475805 - timestamp: 1782773759292 + size: 1486700 + timestamp: 1785874560026 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-12.9.27-h579c4fd_0.conda sha256: b4efaee8fa95b9ec97a462dc343914a138ece704895e33caa52ac55968f7adfa md5: 71e4d87a72bf003bd05f05a502288b2a @@ -11085,6 +11462,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1149299 timestamp: 1746189919921 @@ -11095,24 +11473,26 @@ packages: - arm-variant * sbsa - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 1481900 timestamp: 1779895522474 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-13.3.3.4.1-h579c4fd_0.conda - sha256: 2f9d85d0297b0c461518e5665351d73ffc5f7c9e2aa8b6e3e1cd9498bdd31cd0 - md5: 29bc81fe5927466cd27f2e1151e8502a +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-13.3.3.4.1-h579c4fd_1.conda + sha256: 0b5f21da410f288503f4f9b97b0d4bbec670c25dbf2317b6a92703fbe1a8b91a + md5: 23397299679c728e710be12875f64857 depends: - arm-variant * sbsa - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement run_exports: {} - size: 1480995 - timestamp: 1782773779842 + size: 1479144 + timestamp: 1785874588629 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-12.9.27-h57928b3_0.conda sha256: 681eb1d9afd596e04329a82b04734c0e37c6ecb94b3380f3a378d61983e2a8cc md5: 8f897dca7111f3bb4ded97ba6947b186 depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1139649 timestamp: 1746189858434 @@ -11122,23 +11502,25 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 1462453 timestamp: 1779895589763 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_0.conda - sha256: cc1524d3d25991ba509aa36b43c9b30ac1cde43820a4b318dbdd729e0ff029fe - md5: 64ff59f43bc9a8838324c8527d4d509d +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_1.conda + sha256: 57729383a520a75b1373c6795cd412e76f3799105e3240b258d33fbcc2d598e5 + md5: 6c36b47ed939964651d102a179699d1d depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement run_exports: {} - size: 1467923 - timestamp: 1782773832153 + size: 1476948 + timestamp: 1785874646188 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda sha256: e6257534c4b4b6b8a1192f84191c34906ab9968c92680fa09f639e7846a87304 md5: 79d280de61e18010df5997daea4743df depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 94239 timestamp: 1753975242354 @@ -11148,6 +11530,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 116655 timestamp: 1779905079263 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_0.conda @@ -11166,6 +11549,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 94794 timestamp: 1753975199249 @@ -11176,6 +11560,7 @@ packages: - arm-variant * sbsa - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 116665 timestamp: 1779905122757 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-13.3.73-h579c4fd_0.conda @@ -11194,6 +11579,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 95452 timestamp: 1753975640812 @@ -11203,6 +11589,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 117452 timestamp: 1779905164275 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-13.3.73-h57928b3_0.conda @@ -11223,6 +11610,7 @@ packages: - cuda-cudart_linux-64 - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -11237,6 +11625,7 @@ packages: - cuda-cudart_linux-64 - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=13.3.29,<14.0a0 @@ -11252,6 +11641,7 @@ packages: - cuda-cudart_linux-aarch64 - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -11267,6 +11657,7 @@ packages: - cuda-cudart_linux-aarch64 - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=13.3.29,<14.0a0 @@ -11281,6 +11672,7 @@ packages: - cuda-cudart_win-64 - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -11295,6 +11687,7 @@ packages: - cuda-cudart_win-64 - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1548117 timestamp: 1779898493787 @@ -11304,6 +11697,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1148889 timestamp: 1749218381225 @@ -11313,6 +11707,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1126340 timestamp: 1779898412056 @@ -11323,6 +11718,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1152498 timestamp: 1749218333554 @@ -11333,6 +11729,7 @@ packages: - arm-variant * sbsa - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1133087 timestamp: 1779898428591 @@ -11342,6 +11739,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 354611 timestamp: 1749218544740 @@ -11351,6 +11749,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 83026 timestamp: 1779898478182 @@ -11360,6 +11759,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 197249 timestamp: 1749218394213 @@ -11369,6 +11769,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 206064 timestamp: 1779898416941 @@ -11379,6 +11780,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 212993 timestamp: 1749218341193 @@ -11389,6 +11791,7 @@ packages: - arm-variant * sbsa - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 222441 timestamp: 1779898433566 @@ -11398,6 +11801,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23260 timestamp: 1749218569458 @@ -11407,6 +11811,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24659 timestamp: 1779898481919 @@ -11416,6 +11821,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27096 timestamp: 1753975261562 @@ -11425,6 +11831,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 28476 timestamp: 1779905085657 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_0.conda @@ -11443,6 +11850,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27218 timestamp: 1753975206503 @@ -11453,6 +11861,7 @@ packages: - arm-variant * sbsa - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 28720 timestamp: 1779905125664 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-13.3.73-h579c4fd_0.conda @@ -11471,6 +11880,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27284 timestamp: 1753975714790 @@ -11480,6 +11890,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 28779 timestamp: 1779905174253 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-13.3.73-h57928b3_0.conda @@ -11510,6 +11921,7 @@ packages: - cudatoolkit 12.9|12.9.* - __cuda >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 21578 timestamp: 1746134436166 @@ -11626,6 +12038,7 @@ packages: md5: 0c96522c6bdaed4b1566d11387caaf45 license: BSD-3-Clause license_family: BSD + purls: [] size: 397370 timestamp: 1566932522327 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -11633,6 +12046,7 @@ packages: md5: 34893075a5c9e55cdafac56607368fc6 license: OFL-1.1 license_family: Other + purls: [] size: 96530 timestamp: 1620479909603 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -11640,6 +12054,7 @@ packages: md5: 4d59c254e01d9cde7957100457e2d5fb license: OFL-1.1 license_family: Other + purls: [] size: 700814 timestamp: 1620479612257 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda @@ -11647,6 +12062,7 @@ packages: md5: 49023d73832ef61042f6a237cb2687e7 license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 license_family: Other + purls: [] size: 1620504 timestamp: 1727511233259 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 @@ -11656,6 +12072,7 @@ packages: - fonts-conda-forge license: BSD-3-Clause license_family: BSD + purls: [] size: 3667 timestamp: 1566974674465 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda @@ -11668,6 +12085,7 @@ packages: - font-ttf-source-code-pro license: BSD-3-Clause license_family: BSD + purls: [] size: 4059 timestamp: 1762351264405 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -11750,6 +12168,8 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=hash-mapping size: 34641 timestamp: 1747934053147 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda @@ -12043,6 +12463,7 @@ packages: - sysroot_linux-64 ==2.28 license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later license_family: GPL + purls: [] run_exports: {} size: 1278712 timestamp: 1765578681495 @@ -12053,6 +12474,7 @@ packages: - sysroot_linux-aarch64 ==2.28 license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later license_family: GPL + purls: [] run_exports: {} size: 1248134 timestamp: 1765578613607 @@ -12063,6 +12485,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 3094906 timestamp: 1765256682321 - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_118.conda @@ -12072,18 +12495,19 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 3085932 timestamp: 1771378098166 -- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda - sha256: 38a557eba305468ac1f90ac85e50d8defd76141cb0b8a43b2fc1aca71dd5d5f2 - md5: 683fcb168e1df9a21fa80d5aa2d9330b +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-16.1.0-h59071f9_101.conda + sha256: b314251d957b16c71ec241119ac09b9530c5c4ce140026ec98d297f55d6c5e08 + md5: 19b0151ecb1d122f706ebd2f82f9a017 depends: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL run_exports: {} - size: 3095909 - timestamp: 1778268932148 + size: 3096495 + timestamp: 1785375361053 - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_116.conda sha256: 594e4f22a4b6aae1bca5e22ea3a075c070642ca4c27c53e0c0973926ca711e09 md5: 8ba6e9b5866b6a5429ca5d9fa12bc964 @@ -12091,6 +12515,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 2343262 timestamp: 1765256811670 - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_118.conda @@ -12100,18 +12525,19 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 2364690 timestamp: 1771378032404 -- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_119.conda - sha256: fe600a63a39281e6994e27fe79360cd6bd8e576c3ce1af32ce8673b011f46c21 - md5: 18ad0f0b94071d91fa962a1bf3983a78 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_101.conda + sha256: 885f0d8a47f7ea50d7b33d07a240f2301935602b9d2a39a35b5018b13e934100 + md5: 00cdfad75c8331e103f830fb17184da1 depends: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL run_exports: {} - size: 2353893 - timestamp: 1778268665954 + size: 2357226 + timestamp: 1785374433650 - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_win-64-15.2.0-hbb59886_116.conda sha256: ffffa7c4e12ea0bb70d188eb003809c0579be974c721f0b53345e4e466857fa8 md5: 83cd21fa27411b91a3ec02ceb9f4d0ca @@ -12119,6 +12545,7 @@ packages: - m2-conda-epoch license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 2420086 timestamp: 1765260357692 - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_win-64-15.2.0-hbb59886_118.conda @@ -12128,6 +12555,7 @@ packages: - m2-conda-epoch license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 2422242 timestamp: 1771382108271 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_116.conda @@ -12137,6 +12565,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 20763949 timestamp: 1765256724565 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_118.conda @@ -12146,18 +12575,19 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 20669511 timestamp: 1771378139786 -- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda - sha256: a2385f3611d5cd25378f9cf2367183320731709c067ddd08d43330d3170f15b8 - md5: bcfe7eae40158c3e355d2f9d3ed41230 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-16.1.0-h41cdd0d_101.conda + sha256: c1521172f2fdf5510d79b621ea835064209fe3131518e0d8b2b43362a75e7b4c + md5: 8593636203272a748b63d56cbd674753 depends: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL run_exports: {} - size: 20765069 - timestamp: 1778268963689 + size: 22519609 + timestamp: 1785375386152 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_116.conda sha256: 06be0d20cb3784e1d625f316f26962085dd14f74e166bd668ee9c089b5fa3efa md5: 48cfd02ec4f1308109e5daaccb99aa30 @@ -12165,6 +12595,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 17639950 timestamp: 1765256847600 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_118.conda @@ -12174,18 +12605,19 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 17628403 timestamp: 1771378058765 -- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_119.conda - sha256: 6f7ceee16070781b7d642a37a35ffdf09c66796d3df105c919526210ce220443 - md5: 61da34d67f58dd4cf16683f6cdcb06c8 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-16.1.0-h2445e1f_101.conda + sha256: 926d2c2dedfca7334804d5c8a0727a3746ef580be8763f51ccc2ece24c7be56c + md5: d2cd8c4b92b4e6dbcb2616d855107aca depends: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL run_exports: {} - size: 17627362 - timestamp: 1778268687968 + size: 19792513 + timestamp: 1785374457502 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_win-64-15.2.0-h0a72980_116.conda sha256: 40fce07ecab2b8d4777021e22fbae2f8ab39b5d1713ae3999efae225cd19c5ba md5: 53a797061ae48ff2bd1956c7abc20776 @@ -12193,6 +12625,7 @@ packages: - m2-conda-epoch license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 12310259 timestamp: 1765260383723 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_win-64-15.2.0-h0a72980_118.conda @@ -12202,6 +12635,7 @@ packages: - m2-conda-epoch license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 11729036 timestamp: 1771382135681 - conda: https://conda.anaconda.org/conda-forge/noarch/m2w64-sysroot_win-64-12.0.0.r4.gg4f2fc60ca-hd8ed1ab_10.conda @@ -12214,6 +12648,7 @@ packages: - mingw-w64-ucrt-x86_64-windows-default-manifest - mingw-w64-ucrt-x86_64-winpthreads-git 12.0.0.r4.gg4f2fc60ca hd8ed1ab_10 - ucrt + purls: [] size: 8421 timestamp: 1759768559974 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda @@ -12272,6 +12707,7 @@ packages: constrains: - mingw-w64-ucrt-x86_64-winpthreads-git 12.0.0.r4.gg4f2fc60ca.* license: ZPL-2.1 + purls: [] size: 5663635 timestamp: 1759768458961 - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-headers-git-12.0.0.r4.gg4f2fc60ca-hd8ed1ab_10.conda @@ -12283,6 +12719,7 @@ packages: - mingw-w64-ucrt-x86_64-crt-git 12.0.0.r4.gg4f2fc60ca.* - mingw-w64-ucrt-x86_64-winpthreads-git 12.0.0.r4.gg4f2fc60ca.* license: ZPL-2.1 AND LGPL-2.1-or-later + purls: [] size: 7089846 timestamp: 1759768412123 - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-windows-default-manifest-6.4-he206cdd_7.conda @@ -12293,6 +12730,7 @@ packages: constrains: - m2w64-sysroot_win-64 >=12.0.0.r0 license: FSFAP + purls: [] size: 7412 timestamp: 1717486007140 - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-winpthreads-git-12.0.0.r4.gg4f2fc60ca-hd8ed1ab_10.conda @@ -12304,6 +12742,7 @@ packages: constrains: - mingw-w64-ucrt-x86_64-crt-git 12.0.0.r4.gg4f2fc60ca.* license: MIT AND BSD-3-Clause-Clear + purls: [] size: 123916 timestamp: 1759768539535 - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.0.1-pyhcf101f3_0.conda @@ -12443,6 +12882,8 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping size: 62477 timestamp: 1745345660407 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda @@ -12454,20 +12895,19 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/packaging?source=compressed-mapping + - pkg:pypi/packaging?source=hash-mapping size: 72010 timestamp: 1769093650580 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 - md5: 4c06a92e74452cfa53623a81592e8934 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + sha256: c432626b16768b8dab228bfb706f7060c2d462a21c516d240f68f2f902b5a044 + md5: 936687ed80f295a1f5dbcf8bd34c252c depends: - - python >=3.8 + - python >=3.9 - python license: Apache-2.0 - license_family: APACHE run_exports: {} - size: 91574 - timestamp: 1777103621679 + size: 116363 + timestamp: 1785888127370 - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda sha256: 42b2d77ccea60752f3aa929a6413a7835aaacdbbde679f2f5870a744fa836b94 md5: 97c1ce2fffa1209e7afb432810ec6e12 @@ -12570,6 +13010,8 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/py-cpuinfo?source=hash-mapping size: 25766 timestamp: 1733236452235 - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.17.0-pyhcf101f3_0.conda @@ -12600,6 +13042,8 @@ packages: - python >=3.10 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pyglet?source=hash-mapping size: 724353 timestamp: 1762495207513 - conda: https://conda.anaconda.org/conda-forge/noarch/pyglet-2.1.13-pyhd8ed1ab_0.conda @@ -12611,6 +13055,8 @@ packages: - python >=3.10 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pyglet?source=hash-mapping size: 725938 timestamp: 1770169149613 - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda @@ -12620,6 +13066,8 @@ packages: - python >=3.9 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping size: 889287 timestamp: 1750615908735 - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda @@ -12688,6 +13136,8 @@ packages: - python >=3.10 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/pytest-benchmark?source=hash-mapping size: 43976 timestamp: 1762716480208 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-3.15.0-pyhd8ed1ab_0.conda @@ -12699,6 +13149,8 @@ packages: - python >=3.6 license: MIT license_family: MIT + purls: + - pkg:pypi/pytest-randomly?source=hash-mapping size: 14133 timestamp: 1692131735622 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda @@ -12709,6 +13161,8 @@ packages: - python >=3.9 license: MPL-2.0 license_family: MOZILLA + purls: + - pkg:pypi/pytest-repeat?source=hash-mapping size: 10537 timestamp: 1744061283541 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -12765,6 +13219,7 @@ packages: - python 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD + purls: [] run_exports: {} size: 6989 timestamp: 1752805904792 @@ -12821,6 +13276,8 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping size: 748788 timestamp: 1748804951958 - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda @@ -12844,9 +13301,9 @@ packages: run_exports: {} size: 642081 timestamp: 1783619174976 -- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda - sha256: 8272686bacba85b683bf4ad1fedde16203b7610276074e22593a275b0ce3c017 - md5: 224418e442ea786882979fbd2b36061f +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + sha256: 8eb9daf6fc70111abf73f848c6d32d2769aa1fba550f793b865076fd4e33fb3a + md5: eefa3bc61c9224107d3a9afeb37552a9 depends: - python >=3.10 - vcs_versioning >=2.0.0.dev0 @@ -12858,8 +13315,8 @@ packages: license: MIT license_family: MIT run_exports: {} - size: 28577 - timestamp: 1782401906421 + size: 29407 + timestamp: 1784653562396 - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -13109,6 +13566,7 @@ packages: - tzdata license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later license_family: GPL + purls: [] run_exports: strong: - __glibc >=2.28,<3.0.a0 @@ -13123,6 +13581,7 @@ packages: - tzdata license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later license_family: GPL + purls: [] run_exports: strong: - __glibc >=2.28,<3.0.a0 @@ -13148,6 +13607,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/tomli?source=hash-mapping size: 20973 timestamp: 1760014679845 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda @@ -13158,6 +13619,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/tomli?source=hash-mapping size: 21453 timestamp: 1768146676791 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda @@ -13234,6 +13697,7 @@ packages: sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 md5: 4222072737ccff51314b5ece9c7d6f5a license: LicenseRef-Public-Domain + purls: [] size: 122968 timestamp: 1742727099393 - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda @@ -13265,20 +13729,20 @@ packages: - pkg:pypi/urllib3?source=hash-mapping size: 103172 timestamp: 1767817860341 -- conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - sha256: 5728b15adf4e2877e510996e0d617d1531ccd8e55ca59358f60d3a10aaead5fa - md5: efbdc1f76721fb4ae7a1dbb5fff72562 +- conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + sha256: 179dd4ed561926e5ab95934009bb4359487264de149b5274e43e9e094900dfe4 + md5: 3a8fb54b1dc8fbfdeb51083a1143edd1 depends: - python >=3.10 - - packaging >=20 + - packaging >=26.2 - tomli >=1 - typing_extensions >=4.1 - python license: MIT license_family: MIT run_exports: {} - size: 83180 - timestamp: 1782748145197 + size: 83586 + timestamp: 1785306846938 - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda sha256: b72270395326dc56de9bd6ca82f63791b3c8c9e2b98e25242a9869a4ca821895 md5: f622897afff347b715d046178ad745a5 @@ -13294,6 +13758,7 @@ packages: md5: 7da1571f560d4ba3343f7f4c48a79c76 license: MIT license_family: MIT + purls: [] size: 140476 timestamp: 1765821981856 - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda @@ -13380,6 +13845,7 @@ packages: - msys2-conda-epoch <0.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 49468 timestamp: 1718213032772 - conda: https://conda.anaconda.org/conda-forge/win-64/aom-3.9.1-he0c23c2_0.conda @@ -13391,6 +13857,7 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-2-Clause license_family: BSD + purls: [] size: 1958151 timestamp: 1718551737234 - conda: https://conda.anaconda.org/conda-forge/win-64/backports.zstd-1.3.0-py312h06d0912_0.conda @@ -13417,6 +13884,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 5997864 timestamp: 1764007778611 - conda: https://conda.anaconda.org/conda-forge/win-64/binutils_impl_win-64-2.45-default_ha84baeb_105.conda @@ -13428,6 +13896,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 6096221 timestamp: 1766513640880 - conda: https://conda.anaconda.org/conda-forge/win-64/binutils_impl_win-64-2.45.1-default_ha84baeb_101.conda @@ -13439,6 +13908,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 5830940 timestamp: 1770267725685 - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py312hc6d9e41_1.conda @@ -13458,6 +13928,20 @@ packages: - pkg:pypi/brotli?source=hash-mapping size: 335482 timestamp: 1764018063640 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda + sha256: 04767466ee9227c9c57ab2c6503e0149177d34111c7418d2f420297acb1eb229 + md5: c3301c058362f340100d91cd8be0393f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 55919 + timestamp: 1785906343696 - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda sha256: d882712855624641f48aa9dc3f5feea2ed6b4e6004585d3616386a18186fe692 md5: 1077e9333c41ff0be8edd1a5ec0ddace @@ -13467,6 +13951,7 @@ packages: - vc14_runtime >=14.44.35208 license: bzip2-1.0.6 license_family: BSD + purls: [] size: 55977 timestamp: 1757437738856 - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda @@ -13502,6 +13987,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LGPL-2.1-only or MPL-1.1 + purls: [] size: 1537783 timestamp: 1766416059188 - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h5782bbf_0.conda @@ -13521,6 +14007,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.1-only or MPL-1.1 + purls: [] size: 1524254 timestamp: 1741555212198 - conda: https://conda.anaconda.org/conda-forge/win-64/conda-gcc-specs-15.2.0-hd546029_16.conda @@ -13530,6 +14017,7 @@ packages: - gcc_impl_win-64 >=15.2.0,<15.2.1.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 54364 timestamp: 1765260662854 - conda: https://conda.anaconda.org/conda-forge/win-64/conda-gcc-specs-15.2.0-hd546029_18.conda @@ -13539,6 +14027,7 @@ packages: - gcc_impl_win-64 >=15.2.0,<15.2.1.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 54725 timestamp: 1771382417485 - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-13.2.0-py312hc128f0a_0.conda @@ -13573,6 +14062,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 170799 timestamp: 1749218946117 @@ -13586,6 +14076,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 215494 timestamp: 1779898489923 @@ -13601,6 +14092,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -13618,6 +14110,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24489 timestamp: 1779898504358 @@ -13631,6 +14124,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23249 timestamp: 1749218998822 @@ -13644,6 +14138,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24488 timestamp: 1779898500699 @@ -13656,6 +14151,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 58467504 timestamp: 1760723834711 @@ -13710,6 +14206,7 @@ packages: - cuda-nvvm-impl 12.9.86.* - cuda-nvvm-tools 12.9.86.* license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 26007 timestamp: 1771619504675 @@ -13721,6 +14218,7 @@ packages: - cuda-nvvm-impl 13.3.33.* - cuda-nvvm-tools 13.3.33.* license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 26223 timestamp: 1779909907942 - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-13.3.73-h719f0c7_0.conda @@ -13743,6 +14241,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 31168 timestamp: 1753975780038 @@ -13779,6 +14278,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 40286977 timestamp: 1753975898550 @@ -13791,6 +14291,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 45453672 timestamp: 1779905194696 - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-13.3.73-h2466b09_0.conda @@ -13812,6 +14313,7 @@ packages: - cuda-cudart-dev - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24150 timestamp: 1761098813665 @@ -13822,12 +14324,13 @@ packages: - cuda-cudart-dev - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 25690 timestamp: 1779913686281 -- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.3-py314h344ed54_0.conda - sha256: 6406b67af71dc477f891e6380eb6021d012ea467635c432017f08f954fa2b98d - md5: 91e2ed41320f5c89cc6d77ef47a820cd +- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.8-py314h344ed54_0.conda + sha256: 8900c3a11e71521ed7400265a36686c4ed3973b937658c1f58cc74b707a1c173 + md5: 596f6f1a842a246dbe778dce002d0ca5 depends: - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 @@ -13836,11 +14339,14 @@ packages: - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE - size: 3336844 - timestamp: 1765651351516 -- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py312hd245ac3_0.conda - sha256: 68e921fad16accb32e86c7c73abaea7d49c9346e078924d0a593f821672a5a0c - md5: 575ebca0d973015c21087b800bc48515 + purls: + - pkg:pypi/cython?source=hash-mapping + run_exports: {} + size: 3338147 + timestamp: 1782821777709 +- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py312hd245ac3_0.conda + sha256: 277887d63842d6b9d8a49f6bde1c57149fd65342c85e1f3e2aa44402125d3115 + md5: 762f58961f768b8790a215a8521d33cd depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 @@ -13851,24 +14357,12 @@ packages: license_family: APACHE purls: - pkg:pypi/cython?source=hash-mapping - size: 3285032 - timestamp: 1767577225362 -- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py314h344ed54_0.conda - sha256: c2e08246f2e6f38b5793ebc8d36de32704e4f152ed959ab0558d529580610e0e - md5: 545afbc1940d8a81f114b9c14eecf2ca - depends: - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: Apache-2.0 - license_family: APACHE - size: 3332872 - timestamp: 1767577440799 -- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.8-py314h344ed54_0.conda - sha256: 8900c3a11e71521ed7400265a36686c4ed3973b937658c1f58cc74b707a1c173 - md5: 596f6f1a842a246dbe778dce002d0ca5 + run_exports: {} + size: 3316549 + timestamp: 1785016176418 +- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda + sha256: a061170102d6f1a0b64ed3be712ac653fd9c9e8b6bed6205f398dbf319dcc3c8 + md5: 8ecd457018d6f302da0945cd2169167d depends: - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 @@ -13878,8 +14372,8 @@ packages: license: Apache-2.0 license_family: APACHE run_exports: {} - size: 3338147 - timestamp: 1782821777709 + size: 3343814 + timestamp: 1785016211855 - conda: https://conda.anaconda.org/conda-forge/win-64/dav1d-1.2.1-hcfcfb64_0.conda sha256: 2aa2083c9c186da7d6f975ccfbef654ed54fff27f4bc321dbcd12cee932ec2c4 md5: ed2c27bda330e3f0ab41577cf8b9b585 @@ -13889,6 +14383,7 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-2-Clause license_family: BSD + purls: [] size: 618643 timestamp: 1685696352968 - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py312ha1a9051_0.conda @@ -13943,6 +14438,7 @@ packages: - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 10420698 timestamp: 1765873656019 - conda: https://conda.anaconda.org/conda-forge/win-64/ffmpeg-8.0.1-gpl_h74fd8f1_908.conda @@ -13982,6 +14478,7 @@ packages: - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 10416746 timestamp: 1766461370784 - conda: https://conda.anaconda.org/conda-forge/win-64/ffmpeg-8.0.1-gpl_hb2d76f6_914.conda @@ -14023,6 +14520,7 @@ packages: - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 10417843 timestamp: 1773010275486 - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda @@ -14038,6 +14536,7 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT + purls: [] size: 192355 timestamp: 1730284147944 - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda @@ -14054,6 +14553,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 195332 timestamp: 1771382820659 - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.1-h57928b3_0.conda @@ -14063,6 +14563,7 @@ packages: - libfreetype 2.14.1 h57928b3_0 - libfreetype6 2.14.1 hdbac1cb_0 license: GPL-2.0-only OR FTL + purls: [] size: 184553 timestamp: 1757946164012 - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.2-h57928b3_0.conda @@ -14072,6 +14573,7 @@ packages: - libfreetype 2.14.2 h57928b3_0 - libfreetype6 2.14.2 hdbac1cb_0 license: GPL-2.0-only OR FTL + purls: [] size: 185633 timestamp: 1772756186241 - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.16-hfd05255_0.conda @@ -14082,6 +14584,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LGPL-2.1-or-later + purls: [] size: 64394 timestamp: 1757438741305 - conda: https://conda.anaconda.org/conda-forge/win-64/gcc-15.2.0-hd556455_16.conda @@ -14092,6 +14595,7 @@ packages: - gcc_impl_win-64 15.2.0 h79c4613_16 license: BSD-3-Clause license_family: BSD + purls: [] size: 1202509 timestamp: 1765260844098 - conda: https://conda.anaconda.org/conda-forge/win-64/gcc-15.2.0-hd556455_18.conda @@ -14102,6 +14606,7 @@ packages: - gcc_impl_win-64 15.2.0 ha526d7c_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 1198343 timestamp: 1771382604468 - conda: https://conda.anaconda.org/conda-forge/win-64/gcc_impl_win-64-15.2.0-h79c4613_16.conda @@ -14117,6 +14622,7 @@ packages: - m2w64-sysroot_win-64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 62325084 timestamp: 1765260533999 - conda: https://conda.anaconda.org/conda-forge/win-64/gcc_impl_win-64-15.2.0-ha526d7c_18.conda @@ -14132,6 +14638,7 @@ packages: - m2w64-sysroot_win-64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 62510234 timestamp: 1771382289787 - conda: https://conda.anaconda.org/conda-forge/win-64/gdk-pixbuf-2.44.4-h1f5b9c4_0.conda @@ -14149,6 +14656,7 @@ packages: - vc14_runtime >=14.44.35208 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 573466 timestamp: 1761082560321 - conda: https://conda.anaconda.org/conda-forge/win-64/gdk-pixbuf-2.44.5-h1f5b9c4_1.conda @@ -14166,6 +14674,7 @@ packages: - vc14_runtime >=14.44.35208 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 574950 timestamp: 1771530717329 - conda: https://conda.anaconda.org/conda-forge/win-64/glslang-16.1.0-h5b34520_0.conda @@ -14178,6 +14687,7 @@ packages: - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD + purls: [] size: 6241332 timestamp: 1764720816129 - conda: https://conda.anaconda.org/conda-forge/win-64/glslang-16.2.0-h294ba9c_1.conda @@ -14190,6 +14700,7 @@ packages: - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD + purls: [] size: 4929181 timestamp: 1770195251565 - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda @@ -14201,6 +14712,7 @@ packages: - vc14_runtime >=14.44.35208 license: LGPL-2.0-or-later license_family: LGPL + purls: [] size: 96336 timestamp: 1755102441729 - conda: https://conda.anaconda.org/conda-forge/win-64/greenlet-3.3.2-py312ha1a9051_0.conda @@ -14226,6 +14738,7 @@ packages: - gxx_impl_win-64 15.2.0 h22fd5bf_16 license: BSD-3-Clause license_family: BSD + purls: [] size: 823880 timestamp: 1765260877461 - conda: https://conda.anaconda.org/conda-forge/win-64/gxx-15.2.0-hf1b5d6d_18.conda @@ -14236,6 +14749,7 @@ packages: - gxx_impl_win-64 15.2.0 h22fd5bf_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 824078 timestamp: 1771382638258 - conda: https://conda.anaconda.org/conda-forge/win-64/gxx_impl_win-64-15.2.0-h22fd5bf_16.conda @@ -14248,6 +14762,7 @@ packages: - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 14533037 timestamp: 1765260794852 - conda: https://conda.anaconda.org/conda-forge/win-64/gxx_impl_win-64-15.2.0-h22fd5bf_18.conda @@ -14260,6 +14775,7 @@ packages: - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 14533744 timestamp: 1771382555150 - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-12.2.0-h5f2951f_0.conda @@ -14279,6 +14795,7 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT + purls: [] size: 1138900 timestamp: 1762373626704 - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-12.3.0-h5a1b470_0.conda @@ -14298,6 +14815,7 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT + purls: [] size: 1143524 timestamp: 1766937684751 - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.1.0-h5a1b470_0.conda @@ -14317,6 +14835,7 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT + purls: [] size: 1285640 timestamp: 1773217788574 - conda: https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda @@ -14328,6 +14847,7 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT + purls: [] size: 14544252 timestamp: 1720853966338 - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.1-h637d24d_0.conda @@ -14339,6 +14859,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 13849749 timestamp: 1766299627069 - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda @@ -14350,6 +14871,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 13222158 timestamp: 1767970128854 - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda @@ -14374,6 +14896,7 @@ packages: - vs2015_runtime >=14.29.30139 license: LGPL-2.0-only license_family: LGPL + purls: [] size: 570583 timestamp: 1664996824680 - conda: https://conda.anaconda.org/conda-forge/win-64/ld_impl_win-64-2.45-default_hfd38196_104.conda @@ -14385,6 +14908,7 @@ packages: - binutils_impl_win-64 2.45 license: GPL-3.0-only license_family: GPL + purls: [] size: 876777 timestamp: 1764007762541 - conda: https://conda.anaconda.org/conda-forge/win-64/ld_impl_win-64-2.45-default_hfd38196_105.conda @@ -14396,6 +14920,7 @@ packages: - binutils_impl_win-64 2.45 license: GPL-3.0-only license_family: GPL + purls: [] size: 876611 timestamp: 1766513627408 - conda: https://conda.anaconda.org/conda-forge/win-64/ld_impl_win-64-2.45.1-default_hfd38196_101.conda @@ -14407,6 +14932,7 @@ packages: - binutils_impl_win-64 2.45.1 license: GPL-3.0-only license_family: GPL + purls: [] size: 876736 timestamp: 1770267709635 - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda @@ -14418,6 +14944,7 @@ packages: - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache + purls: [] size: 164701 timestamp: 1745264384716 - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda @@ -14429,6 +14956,7 @@ packages: - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache + purls: [] size: 172395 timestamp: 1773113455582 - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda @@ -14444,6 +14972,7 @@ packages: - liblapacke 3.11.0 5*_mkl license: BSD-3-Clause license_family: BSD + purls: [] size: 67438 timestamp: 1765819100043 - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-6_hf2e6a31_mkl.conda @@ -14471,6 +15000,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 82042 timestamp: 1764017799966 - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda @@ -14483,6 +15013,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 34449 timestamp: 1764017851337 - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda @@ -14495,6 +15026,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 252903 timestamp: 1764017901735 - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda @@ -14509,6 +15041,7 @@ packages: - blas 2.305 mkl license: BSD-3-Clause license_family: BSD + purls: [] size: 68079 timestamp: 1765819124349 - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-6_h2a3cdd5_mkl.conda @@ -14535,6 +15068,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 156818 timestamp: 1761979842440 - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -14548,6 +15082,7 @@ packages: - expat 2.7.3.* license: MIT license_family: MIT + purls: [] size: 70137 timestamp: 1763550049107 - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.4-hac47afa_0.conda @@ -14561,6 +15096,7 @@ packages: - expat 2.7.4.* license: MIT license_family: MIT + purls: [] size: 70323 timestamp: 1771259521393 - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda @@ -14615,6 +15151,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 44866 timestamp: 1760295760649 - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.1-h57928b3_0.conda @@ -14623,6 +15160,7 @@ packages: depends: - libfreetype6 >=2.14.1 license: GPL-2.0-only OR FTL + purls: [] size: 8109 timestamp: 1757946135015 - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.2-h57928b3_0.conda @@ -14631,6 +15169,7 @@ packages: depends: - libfreetype6 >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 8404 timestamp: 1772756167212 - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.1-hdbac1cb_0.conda @@ -14645,6 +15184,7 @@ packages: constrains: - freetype >=2.14.1 license: GPL-2.0-only OR FTL + purls: [] size: 340264 timestamp: 1757946133889 - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.2-hdbac1cb_0.conda @@ -14659,6 +15199,7 @@ packages: constrains: - freetype >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 340155 timestamp: 1772756166648 - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_16.conda @@ -14673,6 +15214,7 @@ packages: - msys2-conda-epoch <0.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 819696 timestamp: 1765260437409 - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_18.conda @@ -14705,6 +15247,7 @@ packages: constrains: - glib 2.86.3 *_0 license: LGPL-2.1-or-later + purls: [] size: 3818991 timestamp: 1765222145992 - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda @@ -14722,6 +15265,7 @@ packages: constrains: - glib 2.86.4 *_1 license: LGPL-2.1-or-later + purls: [] size: 4095369 timestamp: 1771863229701 - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_16.conda @@ -14733,6 +15277,7 @@ packages: - msys2-conda-epoch <0.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 663567 timestamp: 1765260367147 - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_18.conda @@ -14759,6 +15304,7 @@ packages: - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD + purls: [] size: 2412642 timestamp: 1765090345611 - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda @@ -14784,6 +15330,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 OR BSD-3-Clause + purls: [] size: 536186 timestamp: 1758894243956 - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda @@ -14803,6 +15350,7 @@ packages: depends: - libiconv >=1.17,<2.0a0 license: LGPL-2.1-or-later + purls: [] size: 95568 timestamp: 1723629479451 - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.2-hfd05255_0.conda @@ -14815,6 +15363,7 @@ packages: constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib + purls: [] size: 841783 timestamp: 1762094814336 - conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.11.2-hf3f85d1_0.conda @@ -14829,6 +15378,7 @@ packages: - libhwy >=1.3.0,<1.4.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1317916 timestamp: 1770801992810 - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda @@ -14843,6 +15393,7 @@ packages: - liblapacke 3.11.0 5*_mkl license: BSD-3-Clause license_family: BSD + purls: [] size: 80225 timestamp: 1765819148014 - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda @@ -14870,6 +15421,7 @@ packages: constrains: - xz 5.8.1.* license: 0BSD + purls: [] size: 104935 timestamp: 1749230611612 - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda @@ -14909,6 +15461,7 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-2-Clause license_family: BSD + purls: [] size: 88657 timestamp: 1723861474602 - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda @@ -14920,6 +15473,7 @@ packages: - vc14_runtime >=14.44.35208 license: BSD-2-Clause license_family: BSD + purls: [] run_exports: {} size: 89411 timestamp: 1769482314283 @@ -14932,6 +15486,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 345320 timestamp: 1761099100395 - conda: https://conda.anaconda.org/conda-forge/win-64/libnvfatbin-12.9.82-hac47afa_2.conda @@ -14943,6 +15498,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 345191 timestamp: 1782920356823 @@ -14955,6 +15511,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 361081 timestamp: 1779897659188 - conda: https://conda.anaconda.org/conda-forge/win-64/libnvjitlink-12.9.86-hac47afa_2.conda @@ -14966,6 +15523,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27343190 timestamp: 1760724535115 @@ -14993,6 +15551,7 @@ packages: - ucrt >=10.0.20348.0 license: BSD-3-Clause license_family: BSD + purls: [] size: 35040 timestamp: 1745826086628 - conda: https://conda.anaconda.org/conda-forge/win-64/libopus-1.6-h6a83c73_0.conda @@ -15004,6 +15563,7 @@ packages: - ucrt >=10.0.20348.0 license: BSD-3-Clause license_family: BSD + purls: [] size: 307249 timestamp: 1765847775174 - conda: https://conda.anaconda.org/conda-forge/win-64/libopus-1.6.1-h6a83c73_0.conda @@ -15015,6 +15575,7 @@ packages: - ucrt >=10.0.20348.0 license: BSD-3-Clause license_family: BSD + purls: [] size: 307373 timestamp: 1768497136248 - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.53-h7351971_0.conda @@ -15026,6 +15587,7 @@ packages: - ucrt >=10.0.20348.0 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement + purls: [] size: 383702 timestamp: 1764981078732 - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.55-h7351971_0.conda @@ -15037,6 +15599,7 @@ packages: - ucrt >=10.0.20348.0 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement + purls: [] size: 383155 timestamp: 1770691504832 - conda: https://conda.anaconda.org/conda-forge/win-64/librsvg-2.60.0-hd5e4115_0.conda @@ -15052,6 +15615,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LGPL-2.1-or-later + purls: [] size: 3336793 timestamp: 1759328441569 - conda: https://conda.anaconda.org/conda-forge/win-64/librsvg-2.60.0-hd5e4115_1.conda @@ -15067,6 +15631,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LGPL-2.1-or-later + purls: [] size: 2877820 timestamp: 1771301866036 - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda @@ -15088,6 +15653,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: blessing + purls: [] size: 1291059 timestamp: 1764359545703 - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda @@ -15098,6 +15664,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: blessing + purls: [] size: 1292859 timestamp: 1766319616777 - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda @@ -15111,9 +15678,9 @@ packages: purls: [] size: 1297302 timestamp: 1772818899033 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda - sha256: 692dfb73a22c873656d5e393b8f1e2b019a3c8a6486c97cb6900552e64e38c25 - md5: 051f1b2228e7517a2ef8cca5146c8967 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + sha256: 62e1c45ec71ab2e5deeeb0e47e7df6a609991e91d46348f16df50c68fee145c8 + md5: ca0d59f40a02a15e9b5d0ff8db0f85e3 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -15121,9 +15688,9 @@ packages: license: blessing run_exports: weak: - - libsqlite >=3.53.3,<4.0a0 - size: 1315909 - timestamp: 1782519131898 + - libsqlite >=3.53.4,<4.0a0 + size: 1313790 + timestamp: 1785016158097 - conda: https://conda.anaconda.org/conda-forge/win-64/libstdcxx-15.2.0-hae5796f_16.conda sha256: 6d4b74aa2b668ea3927615055ff7557c50628f073a00a504d3fbedbb6eccca43 md5: 7ca89b8b412282e8b8b644f55056279e @@ -15134,6 +15701,7 @@ packages: - libstdcxx-ng ==15.2.0=*_16 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 6461950 timestamp: 1765260469617 - conda: https://conda.anaconda.org/conda-forge/win-64/libstdcxx-15.2.0-hae5796f_18.conda @@ -15146,6 +15714,7 @@ packages: - libstdcxx-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 6462596 timestamp: 1771382223989 - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda @@ -15162,6 +15731,7 @@ packages: - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 license: HPND + purls: [] size: 993166 timestamp: 1762022118895 - conda: https://conda.anaconda.org/conda-forge/win-64/libusb-1.0.29-h1839187_0.conda @@ -15175,6 +15745,7 @@ packages: - vc14_runtime >=14.29.30139 - ucrt >=10.0.20348.0 license: LGPL-2.1-or-later + purls: [] size: 118204 timestamp: 1748856290542 - conda: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h5112557_2.conda @@ -15191,6 +15762,7 @@ packages: - libogg >=1.3.5,<1.4.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 243401 timestamp: 1753879416570 - conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.328.1-h477610d_0.conda @@ -15207,6 +15779,7 @@ packages: - libvulkan-headers 1.4.328.1.* license: Apache-2.0 license_family: APACHE + purls: [] size: 280488 timestamp: 1759972163692 - conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.341.0-h477610d_0.conda @@ -15220,6 +15793,7 @@ packages: - libvulkan-headers 1.4.341.0.* license: Apache-2.0 license_family: APACHE + purls: [] size: 282251 timestamp: 1770077165680 - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda @@ -15233,6 +15807,7 @@ packages: - libwebp 1.6.0 license: BSD-3-Clause license_family: BSD + purls: [] size: 279176 timestamp: 1752159543911 - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda @@ -15262,6 +15837,7 @@ packages: - libxml2 2.15.1 license: MIT license_family: MIT + purls: [] size: 518616 timestamp: 1761016240185 - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda @@ -15279,6 +15855,7 @@ packages: - libxml2 2.15.1 license: MIT license_family: MIT + purls: [] size: 518964 timestamp: 1766327232819 - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h3cfd58e_0.conda @@ -15296,6 +15873,7 @@ packages: - libxml2 2.15.2 license: MIT license_family: MIT + purls: [] size: 520731 timestamp: 1772704723763 - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda @@ -15330,6 +15908,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 43387 timestamp: 1766327259710 - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-ha29bfb0_0.conda @@ -15346,6 +15925,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 43042 timestamp: 1761016261024 - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda @@ -15380,6 +15960,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 43866 timestamp: 1772704745691 - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda @@ -15393,6 +15974,7 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other + purls: [] size: 55476 timestamp: 1727963768015 - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda @@ -15412,6 +15994,22 @@ packages: - libzlib >=1.3.2,<2.0a0 size: 58347 timestamp: 1774072851498 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + sha256: 0629c2cc0404d3bb29d6baa7b4ba62da80797015e86de050db81ea5a07050527 + md5: 5d2ff29d465097458cc3ff6569151991 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - zlib 1.3.2 *_3 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 58529 + timestamp: 1785276664143 - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda sha256: 145c4370abe870f10987efa9fc15a8383f1dab09abbc9ad4ff15a55d45658f7b md5: 0d8b425ac862bcf17e4b28802c9351cb @@ -15424,6 +16022,7 @@ packages: - openmp 21.1.8|21.1.8.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE + purls: [] size: 347566 timestamp: 1765964942856 - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda @@ -15438,6 +16037,7 @@ packages: - intel-openmp <0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: APACHE + purls: [] size: 347404 timestamp: 1772025050288 - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda @@ -15463,6 +16063,7 @@ packages: - msys2-conda-epoch <0.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 7539 timestamp: 1747330852019 - conda: https://conda.anaconda.org/conda-forge/win-64/make-4.4.1-h0e40799_2.conda @@ -15505,6 +16106,7 @@ packages: - vc14_runtime >=14.44.35208 license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary + purls: [] size: 99909095 timestamp: 1761668703167 - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda @@ -15518,6 +16120,7 @@ packages: - vc14_runtime >=14.44.35208 license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary + purls: [] size: 100224829 timestamp: 1767634557029 - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda @@ -15568,6 +16171,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 7588219 timestamp: 1763350950306 - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.0-py314h06c3c77_0.conda @@ -15586,6 +16191,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 7301600 timestamp: 1766373809921 - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda @@ -15604,6 +16211,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 7309134 timestamp: 1770098414535 - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py312ha3f287d_0.conda @@ -15635,6 +16244,7 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-2-Clause license_family: BSD + purls: [] size: 411269 timestamp: 1739401120354 - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda @@ -15647,6 +16257,7 @@ packages: - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache + purls: [] size: 9440812 timestamp: 1762841722179 - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda @@ -15662,9 +16273,9 @@ packages: purls: [] size: 9343023 timestamp: 1769557547888 -- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda - sha256: cb6e7ba0d010ee0d3249ce9886de3d7613d26d9965d4c95666fa66b9c4c31001 - md5: e99f95734a326c0fd4d02bbd995150d4 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda + sha256: 2ebff5a1b5793e82495bf33c91fba040e11ff23333c2385ac66d0c3aee2cc14c + md5: a978392692a910ba1c8920ccb1e784b3 depends: - ca-certificates - ucrt >=10.0.20348.0 @@ -15675,8 +16286,8 @@ packages: run_exports: weak: - openssl >=3.6.3,<4.0a0 - size: 9414790 - timestamp: 1781071745579 + size: 9427535 + timestamp: 1785915614585 - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h03d888a_0.conda sha256: dcda7e9bedc1c87f51ceef7632a5901e26081a1f74a89799a3e50dbdc801c0bd md5: 452d6d3b409edead3bd90fc6317cd6d4 @@ -15696,6 +16307,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.1-or-later + purls: [] size: 454854 timestamp: 1751292618315 - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda @@ -15709,6 +16321,7 @@ packages: - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD + purls: [] size: 995992 timestamp: 1763655708300 - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda @@ -15723,6 +16336,7 @@ packages: - ucrt >=10.0.20348.0 license: MIT license_family: MIT + purls: [] size: 542795 timestamp: 1754665193489 - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py312he5662c2_0.conda @@ -15783,6 +16397,7 @@ packages: - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 + purls: [] size: 16934169 timestamp: 1764756783162 python_site_packages_path: Lib/site-packages @@ -15807,6 +16422,7 @@ packages: - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 + purls: [] size: 16833248 timestamp: 1765020224759 python_site_packages_path: Lib/site-packages @@ -15831,20 +16447,21 @@ packages: - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 + purls: [] size: 18273230 timestamp: 1770675442998 python_site_packages_path: Lib/site-packages -- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda - build_number: 100 - sha256: f1acb89cb1a6bec9a94ae9f8e7411839de009cd64d3ac6a6aec4f3d8a481099a - md5: 8333e3ca6f8d1ebcd30b678dd53f0a25 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda + build_number: 101 + sha256: 3a9ae901cd853d507d97aa8b72af4b9a572a3f92dcc5bad8a1318f77ff4e0e64 + md5: 67bbf51f88a2053513d7c78f485f7479 depends: - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.8.1,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - liblzma >=5.8.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.53.2,<4.0a0 + - libsqlite >=3.53.3,<4.0a0 - libzlib >=1.3.2,<2.0a0 - openssl >=3.5.7,<4.0a0 - python_abi 3.14.* *_cp314 @@ -15860,8 +16477,8 @@ packages: - python_abi 3.14.* *_cp314 noarch: - python - size: 18481352 - timestamp: 1781256034828 + size: 18338767 + timestamp: 1784911044838 python_site_packages_path: Lib/site-packages - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py312h829343e_1.conda sha256: a7505522048dad63940d06623f07eb357b9b65510a8d23ff32b99add05aac3a1 @@ -15978,6 +16595,7 @@ packages: - ucrt >=10.0.20348.0 - sdl3 >=3.2.22,<4.0a0 license: Zlib + purls: [] size: 572101 timestamp: 1757842925694 - conda: https://conda.anaconda.org/conda-forge/win-64/sdl3-3.2.28-h5112557_0.conda @@ -15990,6 +16608,7 @@ packages: - libusb >=1.0.29,<2.0a0 - libvulkan-loader >=1.4.328.1,<2.0a0 license: Zlib + purls: [] size: 1520902 timestamp: 1764713305315 - conda: https://conda.anaconda.org/conda-forge/win-64/sdl3-3.2.30-h5112557_0.conda @@ -16002,6 +16621,7 @@ packages: - libusb >=1.0.29,<2.0a0 - libvulkan-loader >=1.4.328.1,<2.0a0 license: Zlib + purls: [] size: 1521101 timestamp: 1767236315915 - conda: https://conda.anaconda.org/conda-forge/win-64/sdl3-3.4.2-h5112557_0.conda @@ -16014,6 +16634,7 @@ packages: - libvulkan-loader >=1.4.341.0,<2.0a0 - libusb >=1.0.29,<2.0a0 license: Zlib + purls: [] size: 1669623 timestamp: 1771668231217 - conda: https://conda.anaconda.org/conda-forge/win-64/shaderc-2025.5-h8fa7867_1.conda @@ -16027,6 +16648,7 @@ packages: - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache + purls: [] size: 1558909 timestamp: 1770208850155 - conda: https://conda.anaconda.org/conda-forge/win-64/shaderc-2025.5-haa9a63f_0.conda @@ -16040,6 +16662,7 @@ packages: - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache + purls: [] size: 1516952 timestamp: 1764288127996 - conda: https://conda.anaconda.org/conda-forge/win-64/spirv-tools-2025.4-h49e36cd_0.conda @@ -16053,6 +16676,7 @@ packages: - spirv-headers >=1.4.328.0,<1.4.328.1.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 14158518 timestamp: 1759806206089 - conda: https://conda.anaconda.org/conda-forge/win-64/spirv-tools-2026.1-h49e36cd_0.conda @@ -16066,6 +16690,7 @@ packages: - spirv-headers >=1.4.341.0,<1.4.341.1.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 13881533 timestamp: 1770089875437 - conda: https://conda.anaconda.org/conda-forge/win-64/sqlalchemy-2.0.49-py312he5662c2_0.conda @@ -16094,6 +16719,7 @@ packages: - vc14_runtime >=14.44.35208 license: BSD-2-Clause license_family: BSD + purls: [] size: 1862756 timestamp: 1756086862067 - conda: https://conda.anaconda.org/conda-forge/win-64/svt-av1-4.0.1-hac47afa_0.conda @@ -16105,6 +16731,7 @@ packages: - vc14_runtime >=14.44.35208 license: BSD-2-Clause license_family: BSD + purls: [] size: 1808810 timestamp: 1769664619287 - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda @@ -16130,6 +16757,7 @@ packages: - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE + purls: [] size: 155714 timestamp: 1762510341121 - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda @@ -16141,6 +16769,7 @@ packages: - vc14_runtime >=14.29.30139 license: TCL license_family: BSD + purls: [] size: 3472313 timestamp: 1763055164278 - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda @@ -16194,17 +16823,17 @@ packages: run_exports: {} size: 694692 timestamp: 1756385147981 -- conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.11.29-h7ca4a90_0.conda - sha256: 2275f79774c48a0bdb97f7ec7a75ed66d5fbbc8b1cca22d9be74a0dcab046189 - md5: 6e29fdc78a0e55d92d2d38b2b3149735 +- conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.12.2-h7ca4a90_0.conda + sha256: 15fdcce34c19c3dde9eab5550cd4eb9760cab80eb4e26305643b5cf0fd43d9be + md5: d791fa67f9e790de3bcb4961f3cfb145 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 license: Apache-2.0 OR MIT run_exports: {} - size: 21860770 - timestamp: 1784166533243 + size: 15540330 + timestamp: 1785973546861 - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda sha256: 82250af59af9ff3c6a635dd4c4764c631d854feb334d6747d356d949af44d7cf md5: ef02bbe151253a72b8eda264a935db66 @@ -16214,6 +16843,7 @@ packages: - vc14 license: BSD-3-Clause license_family: BSD + purls: [] size: 18861 timestamp: 1760418772353 - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda @@ -16228,18 +16858,18 @@ packages: purls: [] size: 19356 timestamp: 1767320221521 -- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda - sha256: 17693b60cb54f80c60275f003f3bfc1b128af56dbfd65c4fae37c64eeb755ce1 - md5: 2eacea63f545b97342da520df6854276 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + sha256: 35444c55a92e2f7f7ba26bc70f81e56e52344f7d064c0fd4b40a46a58517b79c + md5: aa805b5522c2a98fa286e551a1f48546 depends: - - vc14_runtime >=14.51.36231 + - vc14_runtime >=14.51.36247 track_features: - vc14 license: BSD-3-Clause license_family: BSD run_exports: {} - size: 20362 - timestamp: 1781320968457 + size: 21383 + timestamp: 1785359368566 - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda sha256: e3a3656b70d1202e0d042811ceb743bd0d9f7e00e2acdf824d231b044ef6c0fd md5: 378d5dcec45eaea8d303da6f00447ac0 @@ -16250,6 +16880,7 @@ packages: - vs2015_runtime 14.44.35208.* *_32 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary + purls: [] size: 682706 timestamp: 1760418629729 - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda @@ -16265,19 +16896,19 @@ packages: purls: [] size: 683233 timestamp: 1767320219644 -- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - sha256: 8153ed849c92e891eacac0f2f8d7ecb79f9b5fd7f7917fbb896f252a60a40390 - md5: 06a5bf5a1ca16cce0df6eaa91fc42bc2 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + sha256: 4e4cb599cdc41bf2109d1464c127b5bcbddf548ce3e322e612afb691338b48f8 + md5: ac5333bb3d429361f23adf704cc49a78 depends: - ucrt >=10.0.20348.0 - - vcomp14 14.51.36231 h1b9f54f_39 + - vcomp14 14.51.36247 habf1de7_41 constrains: - - vs2015_runtime 14.51.36231.* *_39 + - vs2015_runtime 14.51.36247.* *_41 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary run_exports: {} - size: 737434 - timestamp: 1781320964561 + size: 767955 + timestamp: 1785359364369 - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda sha256: f3790c88fbbdc55874f41de81a4237b1b91eab75e05d0e58661518ff04d2a8a1 md5: 58f67b437acbf2764317ba273d731f1d @@ -16287,6 +16918,7 @@ packages: - vs2015_runtime 14.44.35208.* *_32 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary + purls: [] size: 114846 timestamp: 1760418593847 - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda @@ -16301,20 +16933,20 @@ packages: purls: [] size: 115235 timestamp: 1767320173250 -- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda - sha256: 07fb14713c4bc62e2533a2e23a363abfb0e65650681fba0ae4c840e2219350f3 - md5: 8b53a83fda40ec679e4d63fa32fae989 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda + sha256: 731e043390c9457299484d39e427221fc868a9249540a498a5a4f6456c7744d1 + md5: 350bb67a5c8e5f1c53347ac544ab6600 depends: - ucrt >=10.0.20348.0 constrains: - - vs2015_runtime 14.51.36231.* *_39 + - vs2015_runtime 14.51.36247.* *_41 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary run_exports: strong: - - vcomp14 >=14.51.36231 - size: 120684 - timestamp: 1781320948530 + - vcomp14 >=14.51.36247 + size: 155910 + timestamp: 1785359349999 - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_32.conda sha256: 65cea43f4de99bc81d589e746c538908b2e95aead9042fecfbc56a4d14684a87 md5: dfc1e5bbf1ecb0024a78e4e8bd45239d @@ -16322,6 +16954,7 @@ packages: - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD + purls: [] size: 18919 timestamp: 1760418632059 - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda @@ -16331,11 +16964,12 @@ packages: - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD + purls: [] size: 19347 timestamp: 1767320221943 -- conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_39.conda - sha256: 434b4f517b7119675930d17749bf123558271f3f316b217f7ac759e6d7121e9d - md5: 59f1d09ae752b761542975d7b6ad1b89 +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_41.conda + sha256: 9d7d1b43cf4af5a8e8b1646175c9f899ffbcab189a33ac41127a96e7bcf41af0 + md5: 04190e0ebd886433300ce9343ee98942 depends: - vswhere constrains: @@ -16349,8 +16983,8 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - size: 24190 - timestamp: 1781320983107 + size: 25462 + timestamp: 1785358620723 - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 sha256: 97166b318f8c68ffe4d50b2f4bd36e415219eeaef233e7d41c54244dc6108249 md5: 19e39905184459760ccb8cf5c75f148b @@ -16359,6 +16993,7 @@ packages: - vs2015_runtime >=14.16.27033 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 1041889 timestamp: 1660323726084 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 @@ -16369,6 +17004,7 @@ packages: - vs2015_runtime >=14.16.27033 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 5517425 timestamp: 1646611941216 - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda @@ -16416,11 +17052,11 @@ packages: - zstd >=1.5.7,<1.6.0a0 size: 388453 timestamp: 1764777142545 -- conda_source: cuda-bindings[04818863] @ . +- conda_source: cuda-bindings[33376fba] @ . variants: c_stdlib: sysroot c_stdlib_version: '2.28' - cuda_version: 12.* + cuda_version: 13.3.* python: 3.14.* target_platform: linux-64 depends: @@ -16430,14 +17066,14 @@ packages: - cuda-pathfinder - libnvjitlink - cuda-nvrtc - - cuda-nvrtc >=12.9.86,<13.0a0 + - cuda-nvrtc >=13.3.33,<14.0a0 - cuda-nvvm - libnvfatbin - libcufile - - libcufile >=1.14.1.1,<2.0a0 - - libgcc >=15 - - libgcc >=15 - - libstdcxx >=15 + - libcufile >=1.18.1.6,<2.0a0 + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 - __glibc >=2.28,<3.0.a0 - python_abi 3.14.* *_cp314 license: Apache-2.0 @@ -16448,78 +17084,79 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-hcb00b6d_27.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-16.1.0-h5fcb69b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-16.1.0-h5fd2508_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-16.1.0-he33a5f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-16.1.0-h5525346_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-16.1.0-hf2715c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-16.1.0-h59071f9_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-16.1.0-h41cdd0d_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-12.9.86-h69a702a_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-12.9.79-h7938cbb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-13.3.73-h69a702a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-h4bc722e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-h4bc722e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-dev-1.14.1.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-dev-1.18.1.6-h676940d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder -- conda_source: cuda-bindings[341f49d8] @ . + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder +- conda_source: cuda-bindings[38bd5059] @ . variants: c_compiler: vs2022 cuda_version: 12.* @@ -16546,9 +17183,9 @@ packages: path: ../cuda_pathfinder build_packages: - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_41.conda host_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-12.9.27-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-12.9.86-h57928b3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_win-64-12.9.79-he0c23c2_0.conda @@ -16556,15 +17193,15 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-12.9.79-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-12.9.86-h57928b3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-12.9.79-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-dev-12.9.79-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-static-12.9.79-he0c23c2_0.conda @@ -16574,28 +17211,28 @@ packages: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-12.9.86-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-12.9.86-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-profiler-api-12.9.79-h57928b3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.8-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.11.29-h7ca4a90_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.12.2-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder -- conda_source: cuda-bindings[5987685b] @ . + - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder +- conda_source: cuda-bindings[595e6447] @ . variants: c_stdlib: sysroot c_stdlib_version: '2.28' - cuda_version: 13.3.* + cuda_version: 12.* python: 3.14.* target_platform: linux-64 depends: @@ -16605,14 +17242,14 @@ packages: - cuda-pathfinder - libnvjitlink - cuda-nvrtc - - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-nvrtc >=12.9.86,<13.0a0 - cuda-nvvm - libnvfatbin - libcufile - - libcufile >=1.18.1.6,<2.0a0 - - libgcc >=15 - - libgcc >=15 - - libstdcxx >=15 + - libcufile >=1.14.1.1,<2.0a0 + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 - __glibc >=2.28,<3.0.a0 - python_abi 3.14.* *_cp314 license: Apache-2.0 @@ -16623,183 +17260,79 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-hcb00b6d_27.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-16.1.0-h5fcb69b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-16.1.0-h5fd2508_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-16.1.0-he33a5f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-16.1.0-h5525346_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-16.1.0-hf2715c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-16.1.0-h59071f9_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-16.1.0-h41cdd0d_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-13.3.73-h69a702a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-h4bc722e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-h4bc722e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-12.9.86-h69a702a_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-12.9.79-h7938cbb_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-dev-1.18.1.6-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-dev-1.14.1.1-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder -- conda_source: cuda-bindings[748b2e6f] @ . - variants: - c_stdlib: sysroot - c_stdlib_version: '2.28' - cuda_version: 12.* - python: 3.14.* - target_platform: linux-aarch64 - depends: - - python - - python >=3.10 - - cuda-version - - cuda-pathfinder - - libnvjitlink - - cuda-nvrtc - - cuda-nvrtc >=12.9.86,<13.0a0 - - cuda-nvvm - - libnvfatbin - - libcufile - - libcufile >=1.14.1.1,<2.0a0 - - libgcc >=15 - - libgcc >=15 - - libstdcxx >=15 - - __glibc >=2.28,<3.0.a0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - source_depends: - cuda-pathfinder: - path: ../cuda_pathfinder - build_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-h3530432_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-15.2.0-h0bf4bd8_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-15.2.0-h7e4acf5_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - host_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-static-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-12.9.86-h8f3c8d4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-dev-12.9.86-h8f3c8d4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-12.9.86-he9431aa_106.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-12.9.86-h7b14b0b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.9.86-h7b14b0b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-12.9.79-h16bee8c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.8-py314hc6b4731_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hf9559e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.14.1.1-had8bf56_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-dev-1.14.1.1-he38c790_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.3-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.11.29-hbe9c82f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-12.9.27-h579c4fd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-12.9.86-h579c4fd_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-aarch64-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-12.9.86-h579c4fd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder -- conda_source: cuda-bindings[8de8dc46] @ . + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder +- conda_source: cuda-bindings[943c652a] @ . variants: c_compiler: vs2022 cuda_version: 13.3.* @@ -16826,25 +17359,25 @@ packages: path: ../cuda_pathfinder build_packages: - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_41.conda host_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-13.3.73-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_win-64-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_win-64-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-13.3.73-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-dev-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-static-13.3.29-hac47afa_0.conda @@ -16854,24 +17387,24 @@ packages: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.73-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-13.3.73-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-profiler-api-13.3.27-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.8-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.11.29-h7ca4a90_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.12.2-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder -- conda_source: cuda-bindings[d33f8c8b] @ . + - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder +- conda_source: cuda-bindings[9909e402] @ . variants: c_stdlib: sysroot c_stdlib_version: '2.28' @@ -16890,9 +17423,9 @@ packages: - libnvfatbin - libcufile - libcufile >=1.18.1.6,<2.0a0 - - libgcc >=15 - - libgcc >=15 - - libstdcxx >=15 + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 - __glibc >=2.28,<3.0.a0 - python_abi 3.14.* *_cp314 license: Apache-2.0 @@ -16903,25 +17436,25 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-h3530432_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-15.2.0-h0bf4bd8_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-15.2.0-h7e4acf5_27.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-16.1.0-h04da0f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-16.1.0-hed00b63_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-16.1.0-hd5c6868_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-16.1.0-h4223dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-16.1.0-h2510bd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-16.1.0-h2445e1f_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-static-13.3.29-h8f3c8d4_0.conda @@ -16931,123 +17464,188 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.73-h7b14b0b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-13.3.73-h7b14b0b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-13.3.27-h16bee8c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.8-py314hc6b4731_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hf9559e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.18.1.6-h42688b2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-dev-1.18.1.6-he38c790_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.3-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.11.29-hbe9c82f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-13.3.3.4.1-h579c4fd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-13.3.3.4.1-h579c4fd_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-13.3.73-h579c4fd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-aarch64-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-13.3.73-h579c4fd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder -- conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder +- conda_source: cuda-bindings[cb9a5e74] @ . variants: - target_platform: noarch + c_stdlib: sysroot + c_stdlib_version: '2.28' + cuda_version: 12.* + python: 3.14.* + target_platform: linux-aarch64 depends: + - python - python >=3.10 - - python * + - cuda-version + - cuda-pathfinder + - libnvjitlink + - cuda-nvrtc + - cuda-nvrtc >=12.9.86,<13.0a0 + - cuda-nvvm + - libnvfatbin + - libcufile + - libcufile >=1.14.1.1,<2.0a0 + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 + - __glibc >=2.28,<3.0.a0 + - python_abi 3.14.* *_cp314 license: Apache-2.0 - host_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + source_depends: + cuda-pathfinder: + path: ../cuda_pathfinder + build_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-16.1.0-h04da0f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-16.1.0-hed00b63_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-16.1.0-hd5c6868_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-16.1.0-h4223dcb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-16.1.0-h2510bd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-16.1.0-h2445e1f_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.11.29-h7ca4a90_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda -- conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder - variants: - target_platform: noarch - depends: - - python >=3.10 - - python * - license: Apache-2.0 host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-static-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-12.9.86-h8f3c8d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-dev-12.9.86-h8f3c8d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-12.9.86-he9431aa_106.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-12.9.86-h7b14b0b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.9.86-h7b14b0b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-12.9.79-h16bee8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.14.1.1-had8bf56_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-dev-1.14.1.1-he38c790_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.3-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.11.29-hbe9c82f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-12.9.27-h579c4fd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-12.9.86-h579c4fd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-aarch64-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-12.9.86-h579c4fd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda -- conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder +- conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder + variants: + target_platform: noarch + depends: + - python >=3.10 + - python * + license: Apache-2.0 + host_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.12.2-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda +- conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder variants: target_platform: noarch depends: @@ -17056,34 +17654,75 @@ packages: license: Apache-2.0 host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda +- conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder + variants: + target_platform: noarch + depends: + - python >=3.10 + - python * + license: Apache-2.0 + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda +- pypi: ../cuda_python_test_helpers + name: cuda-python-test-helpers + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/8c/79/017fab2f7167a9a9795665f894d04f77aafceca80821b51589bb4b23ff5c/nvidia_sphinx_theme-0.0.9.post1-py3-none-any.whl name: nvidia-sphinx-theme version: 0.0.9.post1 diff --git a/cuda_bindings/pixi.toml b/cuda_bindings/pixi.toml index 943d57e11bb..9d122d17413 100644 --- a/cuda_bindings/pixi.toml +++ b/cuda_bindings/pixi.toml @@ -21,11 +21,14 @@ pytest-repeat = "*" pyglet = ">=2.1.9" numpy = "*" +[feature.test.pypi-dependencies] +cuda-python-test-helpers = { path = "../cuda_python_test_helpers", editable = true } + # Keep this dependency set aligned with cuda_python/docs/environment-docs.yml. [feature.docs.dependencies] cuda-bindings = "13.2.*" python = "3.12.*" -cython = "*" +cython = ">=3.2.5,<3.3" enum_tools = "*" make = "*" myst-nb = "*" @@ -41,7 +44,7 @@ sphinx-copybutton = "*" sphinx-toolbox = "*" [feature.cython-tests.dependencies] -cython = ">=3.2,<3.3" # for tests that exercise APIs from cython +cython = ">=3.2.5,<3.3" # for tests that exercise APIs from cython setuptools = "*" # for distutils gxx = "*" # to compile the generated code # These are necessary because running the Cython tests requires compiling @@ -115,7 +118,7 @@ python = "*" cuda-version = "*" setuptools = ">=80" setuptools-scm = ">=8" -cython = ">=3.2,<3.3" +cython = ">=3.2.5,<3.3" cuda-pathfinder = { path = "../cuda_pathfinder" } cuda-cudart-static = "*" cuda-nvrtc-dev = "*" diff --git a/cuda_bindings/pyproject.toml b/cuda_bindings/pyproject.toml index 9744a0a009b..3896e4527ec 100644 --- a/cuda_bindings/pyproject.toml +++ b/cuda_bindings/pyproject.toml @@ -4,7 +4,7 @@ requires = [ "setuptools>=80.0.0", "setuptools_scm[simple]>=8,!=10.1", - "cython>=3.2,<3.3", + "cython>=3.2.5,<3.3", "cuda-pathfinder>=1.5", ] build-backend = "build_hooks" @@ -44,11 +44,12 @@ all = [ [dependency-groups] test = [ - "cython>=3.2,<3.3", + "cython>=3.2.5,<3.3", "setuptools>=80.0.0", # TODO: remove the Python 3.15 guard once 3.15 is officially supported "matplotlib>=3.5.0,<=3.10.9; python_version < '3.15'", - "numpy>=1.21.1,<=2.5.0", + # <=2.6.0.dev0 admits scientific-python nightlies (for Python 3.15) + "numpy>=1.21.1,<=2.6.0.dev0", "pytest==9.1.0", "pytest-benchmark==5.2.3", "pytest-repeat==0.9.4", @@ -88,7 +89,7 @@ repair-wheel-command = "delvewheel repair --namespace-pkg cuda -w {dest_dir} {wh [tool.pytest.ini_options] required_plugins = "pytest-benchmark" -addopts = "--benchmark-disable --showlocals" +addopts = "--benchmark-disable --showlocals --durations=20" norecursedirs = ["tests/cython", "examples"] xfail_strict = true # Keep this authorship marker registry in sync across all pytest config roots. diff --git a/cuda_bindings/tests/conftest.py b/cuda_bindings/tests/conftest.py index 1618d63a133..fada7d95601 100644 --- a/cuda_bindings/tests/conftest.py +++ b/cuda_bindings/tests/conftest.py @@ -2,30 +2,32 @@ # SPDX-License-Identifier: Apache-2.0 import functools +import importlib import inspect import pathlib import sys from contextlib import contextmanager -from importlib.metadata import PackageNotFoundError, distribution import pytest import cuda.bindings.driver as cuda -# Import shared test helpers for tests across subprojects. -# PLEASE KEEP IN SYNC with copies in other conftest.py in this repo. -_test_helpers_root = pathlib.Path(__file__).resolve().parents[2] / "cuda_python_test_helpers" +# Keep in sync with cuda_core/tests/conftest.py. try: - distribution("cuda-python-test-helpers") -except PackageNotFoundError as exc: + import cuda_python_test_helpers._pytest_plugin # noqa: F401 +except ImportError as e: + # Don't call .resolve(): resolving symlinks can make parents[2] point + # somewhere other than the monorepo root if a sub-directory is symlinked. + _test_helpers_root = pathlib.Path(__file__).parents[2] / "cuda_python_test_helpers" if not _test_helpers_root.is_dir(): - raise RuntimeError( - f"cuda-python-test-helpers not installed; expected checkout path {_test_helpers_root}" - ) from exc - - test_helpers_root = str(_test_helpers_root) - if test_helpers_root not in sys.path: - sys.path.insert(0, test_helpers_root) + raise RuntimeError(f"cuda-python-test-helpers not installed and not found at {_test_helpers_root}") from e + for _k in list(sys.modules): + if _k == "cuda_python_test_helpers" or _k.startswith("cuda_python_test_helpers."): + del sys.modules[_k] + sys.path.insert(0, str(_test_helpers_root)) + importlib.invalidate_caches() + +pytest_plugins = ["cuda_python_test_helpers._pytest_plugin"] def pytest_configure(config): diff --git a/cuda_bindings/tests/cython/test_ccudart.pyx b/cuda_bindings/tests/cython/test_ccudart.pyx index 4460ceb618a..3a59f952bd3 100644 --- a/cuda_bindings/tests/cython/test_ccudart.pyx +++ b/cuda_bindings/tests/cython/test_ccudart.pyx @@ -59,11 +59,8 @@ cdef extern from *: def test_ccudart_interoperable(): # struct - cdef dim3 oldDim, newDim - oldDim.x = 1 - oldDim.y = 2 - oldDim.z = 3 - newDim = copy_and_append_dim3(oldDim) + cdef dim3 oldDim = [1, 2, 3] + cdef dim3 newDim = copy_and_append_dim3(oldDim) assert oldDim.x + 1 == newDim.x assert oldDim.y + 1 == newDim.y assert oldDim.z + 1 == newDim.z diff --git a/cuda_bindings/tests/nvml/__init__.py b/cuda_bindings/tests/nvml/__init__.py index c746f897d2d..4baf1b49bc0 100644 --- a/cuda_bindings/tests/nvml/__init__.py +++ b/cuda_bindings/tests/nvml/__init__.py @@ -3,8 +3,7 @@ import pytest - -from cuda.bindings._test_helpers.arch_check import hardware_supports_nvml +from cuda_python_test_helpers.arch_check import hardware_supports_nvml if not hardware_supports_nvml(): pytest.skip("NVML not supported on this platform", allow_module_level=True) diff --git a/cuda_bindings/tests/nvml/conftest.py b/cuda_bindings/tests/nvml/conftest.py index 9897420e38d..7fb1aed4be4 100644 --- a/cuda_bindings/tests/nvml/conftest.py +++ b/cuda_bindings/tests/nvml/conftest.py @@ -4,9 +4,9 @@ from collections import namedtuple import pytest +from cuda_python_test_helpers.arch_check import unsupported_before # noqa: F401 from cuda.bindings import nvml -from cuda.bindings._test_helpers.arch_check import unsupported_before # noqa: F401 class NVMLInitializer: diff --git a/cuda_bindings/tests/nvml/test_init.py b/cuda_bindings/tests/nvml/test_init.py index a47af24dc6a..c56c400a0b9 100644 --- a/cuda_bindings/tests/nvml/test_init.py +++ b/cuda_bindings/tests/nvml/test_init.py @@ -7,6 +7,7 @@ import pytest from cuda.bindings import nvml +from cuda_python_test_helpers import driver_version_less_than def assert_nvml_is_initialized(): @@ -43,6 +44,7 @@ def get_architecture_name(arch): @pytest.mark.skipif(sys.platform == "win32", reason="Test not supported on Windows") @pytest.mark.thread_unsafe(reason="nvml init affects other threads") +@pytest.mark.skipif(not driver_version_less_than(13040), reason="Init behavior changed in CUDA 13.4") def test_init_ref_count(): """ Verifies that we can call NVML shutdown and init(2) multiple times, and that ref counting works diff --git a/cuda_bindings/tests/nvml/test_nvlink.py b/cuda_bindings/tests/nvml/test_nvlink.py index 04bc8eaae4c..1ea9e25dfa7 100644 --- a/cuda_bindings/tests/nvml/test_nvlink.py +++ b/cuda_bindings/tests/nvml/test_nvlink.py @@ -27,8 +27,3 @@ def test_nvlink_get_link_count(all_devices): assert value.nvml_return == nvml.Return.SUCCESS or value.nvml_return == nvml.Return.ERROR_NOT_SUPPORTED, ( f"Unexpected return {value.nvml_return} for link count field query" ) - - # The feature_nvlink_supported detection is not robust, so we - # can't be more specific about how many links we should find. - if value.nvml_return == nvml.Return.SUCCESS: - assert value.value.ui_val[0] <= nvml.NVLINK_MAX_LINKS, f"Unexpected link count {value.value.ui_val[0]}" diff --git a/cuda_bindings/tests/nvml/test_pynvml.py b/cuda_bindings/tests/nvml/test_pynvml.py index 2d1029e9d9b..c3a236edb12 100644 --- a/cuda_bindings/tests/nvml/test_pynvml.py +++ b/cuda_bindings/tests/nvml/test_pynvml.py @@ -9,8 +9,8 @@ import pytest from cuda.bindings import nvml +from cuda_python_test_helpers import IS_WINDOWS, IS_WSL -from . import util from .conftest import unsupported_before XFAIL_LEGACY_NVLINK_MSG = "Legacy NVLink test expected to fail." @@ -64,7 +64,7 @@ def test_device_get_handle_by_pci_bus_id(ngpus, pci_info): @pytest.mark.parametrize("scope", [nvml.AffinityScope.NODE, nvml.AffinityScope.SOCKET]) -@pytest.mark.skipif(util.is_wsl() or util.is_windows(), reason="Not supported on WSL or Windows") +@pytest.mark.skipif(IS_WSL or IS_WINDOWS, reason="Not supported on WSL or Windows") def test_device_get_memory_affinity(handles, scope): size = 1024 for handle in handles: @@ -75,7 +75,7 @@ def test_device_get_memory_affinity(handles, scope): @pytest.mark.parametrize("scope", [nvml.AffinityScope.NODE, nvml.AffinityScope.SOCKET]) -@pytest.mark.skipif(util.is_wsl() or util.is_windows(), reason="Not supported on WSL or Windows") +@pytest.mark.skipif(IS_WSL or IS_WINDOWS, reason="Not supported on WSL or Windows") def test_device_get_cpu_affinity_within_scope(handles, scope): size = 1024 for handle in handles: @@ -265,27 +265,6 @@ def test_device_get_pcie_throughput(ngpus, handles): # Test pynvml.nvmlDeviceGetNvLinkRemotePciInfo -@pytest.mark.parametrize( - "cap_type", - [ - nvml.NvLinkCapability.NVLINK_CAP_P2P_SUPPORTED, # P2P over NVLink is supported - nvml.NvLinkCapability.NVLINK_CAP_SYSMEM_ACCESS, # Access to system memory is supported - nvml.NvLinkCapability.NVLINK_CAP_P2P_ATOMICS, # P2P atomics are supported - nvml.NvLinkCapability.NVLINK_CAP_SYSMEM_ATOMICS, # System memory atomics are supported - nvml.NvLinkCapability.NVLINK_CAP_SLI_BRIDGE, # SLI is supported over this link - nvml.NvLinkCapability.NVLINK_CAP_VALID, - ], -) # Link is supported on this device -def test_device_get_nvlink_capability(ngpus, handles, cap_type): - for i in range(ngpus): - for j in range(nvml.NVLINK_MAX_LINKS): - # By the documentation, this should be supported on PASCAL or newer, - # but this also seems to fail on newer. - with unsupported_before(handles[i], None): - cap = nvml.device_get_nvlink_capability(handles[i], j, cap_type) - assert cap >= 0 - - # Test pynvml.nvmlDeviceResetNvLinkUtilizationCounter # Test pynvml.nvmlDeviceSetNvLinkUtilizationControl # Test pynvml.nvmlDeviceGetNvLinkUtilizationCounter diff --git a/cuda_bindings/tests/nvml/util.py b/cuda_bindings/tests/nvml/util.py index 038fe58d8be..129ded8f83c 100644 --- a/cuda_bindings/tests/nvml/util.py +++ b/cuda_bindings/tests/nvml/util.py @@ -2,29 +2,8 @@ # SPDX-License-Identifier: Apache-2.0 -import functools -import platform -from pathlib import Path - from cuda.bindings import nvml -current_os = platform.system() -if current_os == "VMkernel": - current_os = "Linux" # Treat VMkernel as Linux - - -def is_windows(os=current_os): - return os == "Windows" - - -def is_linux(os=current_os): - return os == "Linux" - - -@functools.cache -def is_wsl(os=current_os): - return os == "Linux" and "microsoft" in Path("/proc/version").read_text().lower() - def is_vgpu(device): """ diff --git a/cuda_bindings/tests/test_cuda.py b/cuda_bindings/tests/test_cuda.py index 192ad0f72fe..7bef2b844aa 100644 --- a/cuda_bindings/tests/test_cuda.py +++ b/cuda_bindings/tests/test_cuda.py @@ -10,19 +10,12 @@ import numpy as np import pytest +from cuda_python_test_helpers.mempool import xfail_if_mempool_oom import cuda.bindings.driver as cuda import cuda.bindings.runtime as cudart from cuda.bindings import driver -from cuda.bindings._test_helpers.mempool import xfail_if_mempool_oom - - -def driverVersionLessThan(target): - (err,) = cuda.cuInit(0) - assert err == cuda.CUresult.CUDA_SUCCESS - err, version = cuda.cuDriverGetVersion() - assert err == cuda.CUresult.CUDA_SUCCESS - return version < target +from cuda_python_test_helpers import driver_version_less_than def supportsMemoryPool(): @@ -213,12 +206,9 @@ def test_cuda_repr(): value : 0 nvSciSync : fence : 0x0 - reserved : 0 keyedMutex : key : 0 - reserved : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] flags : 0 -reserved : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] """) assert actual_repr.split() == expected_repr.split() @@ -268,7 +258,7 @@ def test_cuda_CUstreamBatchMemOpParams(): @pytest.mark.skipif( - driverVersionLessThan(11030) or not supportsMemoryPool(), reason="When new attributes were introduced" + driver_version_less_than(11030) or not supportsMemoryPool(), reason="When new attributes were introduced" ) def test_cuda_memPool_attr(): poolProps = cuda.CUmemPoolProps() @@ -331,7 +321,7 @@ def test_cuda_memPool_attr(): @pytest.mark.skipif( - driverVersionLessThan(11030) or not supportsManagedMemory(), reason="When new attributes were introduced" + driver_version_less_than(11030) or not supportsManagedMemory(), reason="When new attributes were introduced" ) def test_cuda_pointer_attr(): err, ptr = cuda.cuMemAllocManaged(0x1000, cuda.CUmemAttach_flags.CU_MEM_ATTACH_GLOBAL.value) @@ -382,7 +372,7 @@ def test_cuda_pointer_attr(): @pytest.mark.skipif( - driverVersionLessThan(11030) or not supportsManagedMemory(), reason="When new attributes were introduced" + driver_version_less_than(11030) or not supportsManagedMemory(), reason="When new attributes were introduced" ) def test_pointer_get_attributes_device_ordinal(): attributes = [ @@ -460,7 +450,9 @@ def test_cuda_mem_range_attr(device): assert err == cuda.CUresult.CUDA_SUCCESS -@pytest.mark.skipif(driverVersionLessThan(11040) or not supportsMemoryPool(), reason="Mempool for graphs not supported") +@pytest.mark.skipif( + driver_version_less_than(11040) or not supportsMemoryPool(), reason="Mempool for graphs not supported" +) @pytest.mark.thread_unsafe(reason="used high memory can be higher if threaded.") def test_cuda_graphMem_attr(device): err, stream = cuda.cuStreamCreate(0) @@ -519,7 +511,7 @@ def test_cuda_graphMem_attr(device): @pytest.mark.skipif( - driverVersionLessThan(12010) + driver_version_less_than(12010) or not supportsCudaAPI("cuCoredumpSetAttributeGlobal") or not supportsCudaAPI("cuCoredumpGetAttributeGlobal"), reason="Coredump API not present", @@ -569,7 +561,7 @@ def test_get_error_name_and_string(): # TODO: cuStreamGetCaptureInfo_v2 -@pytest.mark.skipif(driverVersionLessThan(11030), reason="Driver too old for cuStreamGetCaptureInfo_v2") +@pytest.mark.skipif(driver_version_less_than(11030), reason="Driver too old for cuStreamGetCaptureInfo_v2") def test_stream_capture(): pass @@ -608,16 +600,6 @@ def test_eglFrame(): assert int(val.frame.pPitch[2]) == 3 -def test_char_range(): - val = cuda.CUipcMemHandle_st() - for x in range(-128, 0): - val.reserved = [x] * 64 - assert val.reserved[0] == 256 + x - for x in range(256): - val.reserved = [x] * 64 - assert val.reserved[0] == x - - def test_anon_assign(): val1 = cuda.CUexecAffinityParam_st() val2 = cuda.CUexecAffinityParam_st() @@ -649,7 +631,7 @@ def test_invalid_repr_attribute(): @pytest.mark.skipif( - driverVersionLessThan(12020) + driver_version_less_than(12020) or not supportsCudaAPI("cuGraphAddNode") or not supportsCudaAPI("cuGraphNodeSetParams") or not supportsCudaAPI("cuGraphExecNodeSetParams"), @@ -761,7 +743,7 @@ def test_graph_poly(): @pytest.mark.skipif( - driverVersionLessThan(12040) or not supportsCudaAPI("cuDeviceGetDevResource"), + driver_version_less_than(12040) or not supportsCudaAPI("cuDeviceGetDevResource"), reason="Polymorphic graph APIs required", ) def test_cuDeviceGetDevResource(device): @@ -781,7 +763,7 @@ def test_cuDeviceGetDevResource(device): @pytest.mark.skipif( - driverVersionLessThan(12030) or not supportsCudaAPI("cuGraphConditionalHandleCreate"), + driver_version_less_than(12030) or not supportsCudaAPI("cuGraphConditionalHandleCreate"), reason="Conditional graph APIs required", ) def test_conditional(ctx): @@ -843,14 +825,14 @@ def test_all_CUresult_codes(): assert num_good >= 76 # CTK 11.0.3_450.51.06 -@pytest.mark.skipif(driverVersionLessThan(12030), reason="Driver too old for cuKernelGetName") +@pytest.mark.skipif(driver_version_less_than(12030), reason="Driver too old for cuKernelGetName") def test_cuKernelGetName_failure(): err, name = cuda.cuKernelGetName(0) assert err == cuda.CUresult.CUDA_ERROR_INVALID_VALUE assert name is None -@pytest.mark.skipif(driverVersionLessThan(12030), reason="Driver too old for cuFuncGetName") +@pytest.mark.skipif(driver_version_less_than(12030), reason="Driver too old for cuFuncGetName") def test_cuFuncGetName_failure(): err, name = cuda.cuFuncGetName(0) assert err == cuda.CUresult.CUDA_ERROR_INVALID_VALUE @@ -858,7 +840,7 @@ def test_cuFuncGetName_failure(): @pytest.mark.skipif( - driverVersionLessThan(12080) or not supportsCudaAPI("cuCheckpointProcessGetState"), + driver_version_less_than(12080) or not supportsCudaAPI("cuCheckpointProcessGetState"), reason="When API was introduced", ) def test_cuCheckpointProcessGetState_failure(): @@ -900,7 +882,7 @@ def test_struct_pointer_comparison(target): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cuGraphGetId"), + driver_version_less_than(13010) or not supportsCudaAPI("cuGraphGetId"), reason="Requires CUDA 13.1+", ) def test_cuGraphGetId(device, ctx): @@ -927,7 +909,7 @@ def test_cuGraphGetId(device, ctx): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cuGraphExecGetId"), + driver_version_less_than(13010) or not supportsCudaAPI("cuGraphExecGetId"), reason="Requires CUDA 13.1+", ) def test_cuGraphExecGetId(device, ctx): @@ -1008,7 +990,6 @@ def test_cuGraphGetEdges_edgeData_outlives_call(device, ctx): assert ed.from_port == 0 assert ed.to_port == 0 assert int(ed.type) == 0 - assert ed.reserved == b"\x00" * 5 finally: (err,) = cuda.cuGraphDestroy(graph) assert err == cuda.CUresult.CUDA_SUCCESS @@ -1048,14 +1029,13 @@ def test_cuGraphNodeGetDependencies_edgeData_outlives_call(device, ctx): assert ed.from_port == 0 assert ed.to_port == 0 assert int(ed.type) == 0 - assert ed.reserved == b"\x00" * 5 finally: (err,) = cuda.cuGraphDestroy(graph) assert err == cuda.CUresult.CUDA_SUCCESS @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cuGraphNodeGetLocalId"), + driver_version_less_than(13010) or not supportsCudaAPI("cuGraphNodeGetLocalId"), reason="Requires CUDA 13.1+", ) def test_cuGraphNodeGetLocalId(device, ctx): @@ -1097,7 +1077,7 @@ def test_cuGraphNodeGetLocalId(device, ctx): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cuGraphNodeGetToolsId"), + driver_version_less_than(13010) or not supportsCudaAPI("cuGraphNodeGetToolsId"), reason="Requires CUDA 13.1+", ) def test_cuGraphNodeGetToolsId(device, ctx): @@ -1126,7 +1106,7 @@ def test_cuGraphNodeGetToolsId(device, ctx): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cuGraphNodeGetContainingGraph"), + driver_version_less_than(13010) or not supportsCudaAPI("cuGraphNodeGetContainingGraph"), reason="Requires CUDA 13.1+", ) def test_cuGraphNodeGetContainingGraph(device, ctx): @@ -1173,7 +1153,7 @@ def test_cuGraphNodeGetContainingGraph(device, ctx): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cuStreamGetDevResource"), + driver_version_less_than(13010) or not supportsCudaAPI("cuStreamGetDevResource"), reason="Requires CUDA 13.1+", ) def test_cuStreamGetDevResource(device, ctx): @@ -1192,7 +1172,7 @@ def test_cuStreamGetDevResource(device, ctx): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cuDevSmResourceSplit"), + driver_version_less_than(13010) or not supportsCudaAPI("cuDevSmResourceSplit"), reason="Requires CUDA 13.1+", ) def test_cuDevSmResourceSplit(device, ctx): diff --git a/cuda_bindings/tests/test_cudart.py b/cuda_bindings/tests/test_cudart.py index ddb4448499b..7b70acdeb46 100644 --- a/cuda_bindings/tests/test_cudart.py +++ b/cuda_bindings/tests/test_cudart.py @@ -6,12 +6,13 @@ import numpy as np import pytest +from cuda_python_test_helpers.mempool import xfail_if_mempool_oom import cuda.bindings.driver as cuda import cuda.bindings.runtime as cudart from cuda import pathfinder from cuda.bindings import runtime -from cuda.bindings._test_helpers.mempool import xfail_if_mempool_oom +from cuda_python_test_helpers import driver_version_less_than def isSuccess(err): @@ -22,12 +23,6 @@ def assertSuccess(err): assert isSuccess(err) -def driverVersionLessThan(target): - err, version = cudart.cudaDriverGetVersion() - assertSuccess(err) - return version < target - - def supportsMemoryPool(): err, isSupported = cudart.cudaDeviceGetAttribute(cudart.cudaDeviceAttr.cudaDevAttrMemoryPoolsSupported, 0) return isSuccess(err) and isSupported @@ -294,7 +289,6 @@ def test_cudart_cudaGraphGetEdges_edgeData_outlives_call(): assert ed.from_port == 0 assert ed.to_port == 0 assert int(ed.type) == 0 - assert ed.reserved == b"\x00" * 5 finally: (err,) = cudart.cudaGraphDestroy(graph) assertSuccess(err) @@ -334,7 +328,6 @@ def test_cudart_cudaGraphNodeGetDependencies_edgeData_outlives_call(): assert ed.from_port == 0 assert ed.to_port == 0 assert int(ed.type) == 0 - assert ed.reserved == b"\x00" * 5 finally: (err,) = cudart.cudaGraphDestroy(graph) assertSuccess(err) @@ -506,7 +499,7 @@ def test_cudart_cudaGetDeviceProperties(): @pytest.mark.skipif( - driverVersionLessThan(11030) or not supportsMemoryPool(), reason="When new attributes were introduced" + driver_version_less_than(11030) or not supportsMemoryPool(), reason="When new attributes were introduced" ) def test_cudart_MemPool_attr(): poolProps = cudart.cudaMemPoolProps() @@ -1447,7 +1440,7 @@ def test_cudart_func_callback(): @pytest.mark.skipif( - driverVersionLessThan(12030) or not supportsCudaAPI("cudaGraphConditionalHandleCreate"), + driver_version_less_than(12030) or not supportsCudaAPI("cudaGraphConditionalHandleCreate"), reason="Conditional graph APIs required", ) def test_cudart_conditional(): @@ -1505,7 +1498,7 @@ def test_getLocalRuntimeVersion(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaGraphGetId"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaGraphGetId"), reason="Requires CUDA 13.1+", ) def test_cudaGraphGetId(): @@ -1532,7 +1525,7 @@ def test_cudaGraphGetId(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaGraphExecGetId"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaGraphExecGetId"), reason="Requires CUDA 13.1+", ) def test_cudaGraphExecGetId(): @@ -1579,7 +1572,7 @@ def test_cudaGraphExecGetId(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaGraphNodeGetLocalId"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaGraphNodeGetLocalId"), reason="Requires CUDA 13.1+", ) def test_cudaGraphNodeGetLocalId(): @@ -1621,7 +1614,7 @@ def test_cudaGraphNodeGetLocalId(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaGraphNodeGetToolsId"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaGraphNodeGetToolsId"), reason="Requires CUDA 13.1+", ) def test_cudaGraphNodeGetToolsId(): @@ -1650,7 +1643,7 @@ def test_cudaGraphNodeGetToolsId(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaGraphNodeGetContainingGraph"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaGraphNodeGetContainingGraph"), reason="Requires CUDA 13.1+", ) def test_cudaGraphNodeGetContainingGraph(): @@ -1697,7 +1690,7 @@ def test_cudaGraphNodeGetContainingGraph(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaStreamGetDevResource"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaStreamGetDevResource"), reason="Requires CUDA 13.1+", ) def test_cudaStreamGetDevResource(): @@ -1716,7 +1709,7 @@ def test_cudaStreamGetDevResource(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaDeviceGetDevResource"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaDeviceGetDevResource"), reason="Requires CUDA 13.1+", ) def test_cudaDeviceGetDevResource(): @@ -1731,7 +1724,7 @@ def test_cudaDeviceGetDevResource(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaDeviceGetExecutionCtx"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaDeviceGetExecutionCtx"), reason="Requires CUDA 13.1+", ) def test_cudaExecutionCtxGetDevResource(): @@ -1749,7 +1742,7 @@ def test_cudaExecutionCtxGetDevResource(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaDeviceGetExecutionCtx"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaDeviceGetExecutionCtx"), reason="Requires CUDA 13.1+", ) def test_cudaExecutionCtxGetDevice(): @@ -1769,7 +1762,7 @@ def test_cudaExecutionCtxGetDevice(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaDeviceGetExecutionCtx"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaDeviceGetExecutionCtx"), reason="Requires CUDA 13.1+", ) def test_cudaExecutionCtxGetId(): @@ -1797,7 +1790,7 @@ def test_cudaExecutionCtxGetId(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaDevSmResourceSplit"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaDevSmResourceSplit"), reason="Requires CUDA 13.1+", ) def test_cudaDevSmResourceSplit(): @@ -1866,7 +1859,7 @@ def test_cudaDevSmResourceSplit(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaDevSmResourceSplitByCount"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaDevSmResourceSplitByCount"), reason="Requires CUDA 13.1+", ) def test_cudaDevSmResourceSplitByCount(): @@ -1889,7 +1882,7 @@ def test_cudaDevSmResourceSplitByCount(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaDevResourceGenerateDesc"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaDevResourceGenerateDesc"), reason="Requires CUDA 13.1+", ) def test_cudaDevResourceGenerateDesc(): @@ -1906,7 +1899,7 @@ def test_cudaDevResourceGenerateDesc(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaGreenCtxCreate"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaGreenCtxCreate"), reason="Requires CUDA 13.1+", ) def test_cudaGreenCtxCreate(): @@ -1937,7 +1930,7 @@ def test_cudaGreenCtxCreate(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaExecutionCtxStreamCreate"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaExecutionCtxStreamCreate"), reason="Requires CUDA 13.1+", ) def test_cudaExecutionCtxStreamCreate(): @@ -1958,7 +1951,7 @@ def test_cudaExecutionCtxStreamCreate(): @pytest.mark.skipif( - driverVersionLessThan(13010) or not supportsCudaAPI("cudaGraphConditionalHandleCreate_v2"), + driver_version_less_than(13010) or not supportsCudaAPI("cudaGraphConditionalHandleCreate_v2"), reason="Requires CUDA 13.1+", ) def test_cudaGraphConditionalHandleCreate_v2(): diff --git a/cuda_bindings/tests/test_examples.py b/cuda_bindings/tests/test_examples.py index 63a56c78fb7..652515830f8 100644 --- a/cuda_bindings/tests/test_examples.py +++ b/cuda_bindings/tests/test_examples.py @@ -7,8 +7,7 @@ import sys import pytest - -from cuda.bindings._test_helpers.pep723 import has_package_requirements_or_skip +from cuda_python_test_helpers.pep723 import has_package_requirements_or_skip examples_path = os.path.join(os.path.dirname(__file__), "..", "examples") examples_files = glob.glob(os.path.join(examples_path, "**/*.py"), recursive=True) diff --git a/cuda_bindings/tests/test_interoperability.py b/cuda_bindings/tests/test_interoperability.py index 18a37ec6b4e..08bac311a2d 100644 --- a/cuda_bindings/tests/test_interoperability.py +++ b/cuda_bindings/tests/test_interoperability.py @@ -3,10 +3,10 @@ import numpy as np import pytest +from cuda_python_test_helpers.mempool import xfail_if_mempool_oom import cuda.bindings.driver as cuda import cuda.bindings.runtime as cudart -from cuda.bindings._test_helpers.mempool import xfail_if_mempool_oom def supportsMemoryPool(): diff --git a/cuda_bindings/tests/test_kernelParams.py b/cuda_bindings/tests/test_kernelParams.py index 793bbdebd68..3457965086e 100644 --- a/cuda_bindings/tests/test_kernelParams.py +++ b/cuda_bindings/tests/test_kernelParams.py @@ -782,3 +782,34 @@ def __init__(self, address, typestr): ASSERT_DRV(err) (err,) = cuda.cuModuleUnload(module) ASSERT_DRV(err) + + +def test_kernelParams_c_int_out_of_range_raises(device): + # #363: an out-of-range Python int for a c_int / c_byte kernel argument must + # raise instead of being silently truncated to fit the declared width. + kernelString = """\ + extern "C" __global__ void take_int(int i) {} + """ + module = common_nvrtc(kernelString, device) + err, kernel = cuda.cuModuleGetFunction(module, b"take_int") + ASSERT_DRV(err) + err, stream = cuda.cuStreamCreate(0) + ASSERT_DRV(err) + + # An in-range value still packs and launches fine. + (err,) = cuda.cuLaunchKernel(kernel, 1, 1, 1, 1, 1, 1, 0, stream, ((5,), (ctypes.c_int,)), 0) + ASSERT_DRV(err) + + # Out-of-range values now raise OverflowError during packing (previously the + # high bits were silently dropped, so the kernel saw a different value). + with pytest.raises(OverflowError): + cuda.cuLaunchKernel(kernel, 1, 1, 1, 1, 1, 1, 0, stream, ((2**32 + 5,), (ctypes.c_int,)), 0) + with pytest.raises(OverflowError): + cuda.cuLaunchKernel(kernel, 1, 1, 1, 1, 1, 1, 0, stream, ((200,), (ctypes.c_byte,)), 0) + + (err,) = cuda.cuStreamSynchronize(stream) + ASSERT_DRV(err) + (err,) = cuda.cuStreamDestroy(stream) + ASSERT_DRV(err) + (err,) = cuda.cuModuleUnload(module) + ASSERT_DRV(err) diff --git a/cuda_core/build_hooks.py b/cuda_core/build_hooks.py index dfd08d56733..626d50355ab 100644 --- a/cuda_core/build_hooks.py +++ b/cuda_core/build_hooks.py @@ -17,6 +17,7 @@ from pathlib import Path from Cython.Build import cythonize +from Cython.Compiler import Options as _CythonOptions from setuptools import Extension from setuptools import build_meta as _build_meta @@ -45,9 +46,9 @@ def _import_get_cuda_path_or_home(): cuda = None for p in sys.path: - sp_cuda = os.path.join(p, "cuda") - if os.path.isdir(os.path.join(sp_cuda, "pathfinder")): - cuda.__path__ = list(cuda.__path__) + [sp_cuda] + sp_cuda = Path(p) / "cuda" + if (sp_cuda / "pathfinder").is_dir(): + cuda.__path__ = list(cuda.__path__) + [str(sp_cuda)] break else: raise ModuleNotFoundError( @@ -56,6 +57,11 @@ def _import_get_cuda_path_or_home(): ) import cuda.pathfinder + pathfinder_dir = Path(cuda.pathfinder.__file__).parent + print( + f"Using cuda-pathfinder {cuda.pathfinder.__version__} from {pathfinder_dir}", + file=sys.stderr, + ) return cuda.pathfinder.get_cuda_path_or_home @@ -127,6 +133,9 @@ def _build_cuda_core(debug=False): # This function populates "_extensions". global _extensions + # Resolve CUDA first so the pathfinder import repairs PEP 517 namespace shadowing before importing bindings. + cuda_path = _get_cuda_path() + # Add cuda-bindings to sys.path so Cython can find .pxd files # This is needed for editable installs where meta path finders don't work for Cython # We need to add the directory containing the 'cuda' package so Cython can resolve @@ -135,6 +144,7 @@ def _build_cuda_core(debug=False): import cuda.bindings bindings_path = Path(cuda.bindings.__file__).parent # .../cuda/bindings/ + print(f"Using cuda-bindings {cuda.bindings.__version__} from {bindings_path}", file=sys.stderr) cuda_package_dir = bindings_path.parent.parent # .../cuda_bindings/ (contains cuda/) if str(cuda_package_dir) not in sys.path: sys.path.insert(0, str(cuda_package_dir)) @@ -171,7 +181,7 @@ def get_sources(mod_name): return sources - all_include_dirs = [os.path.join(_get_cuda_path(), "include")] + all_include_dirs = [os.path.join(cuda_path, "include")] extra_compile_args = [] extra_link_args = [] extra_cythonize_kwargs = {} @@ -212,6 +222,7 @@ def get_sources(mod_name): nthreads = int(os.environ.get("CUDA_PYTHON_PARALLEL_LEVEL", os.cpu_count() // 2)) compile_time_env = {"CUDA_CORE_BUILD_MAJOR": int(_determine_cuda_major_version())} compiler_directives = {"embedsignature": True, "warn.deprecated.IF": False, "freethreading_compatible": True} + _CythonOptions.warning_errors = True if COMPILE_FOR_COVERAGE: compiler_directives["linetrace"] = True _extensions = cythonize( diff --git a/cuda_core/cuda/core/__init__.py b/cuda_core/cuda/core/__init__.py index dc6fefdffea..b9a36e3dee7 100644 --- a/cuda_core/cuda/core/__init__.py +++ b/cuda_core/cuda/core/__init__.py @@ -69,45 +69,51 @@ class _PatchedProperty(metaclass=_PatchedPropMeta): from cuda.core import checkpoint, system, utils -from cuda.core._context import Context, ContextOptions -from cuda.core._device import Device -from cuda.core._device_resources import ( - DeviceResources, - SMResource, - SMResourceOptions, - WorkqueueResource, - WorkqueueResourceOptions, -) -from cuda.core._event import Event, EventOptions -from cuda.core._graphics import GraphicsResource -from cuda.core._host import Host -from cuda.core._launch_config import LaunchConfig -from cuda.core._launcher import launch -from cuda.core._linker import Linker, LinkerOptions -from cuda.core._memory import ( - Buffer, - DeviceMemoryResource, - DeviceMemoryResourceOptions, - GraphMemoryResource, - LegacyPinnedMemoryResource, - ManagedBuffer, - ManagedMemoryResource, - ManagedMemoryResourceOptions, - MemoryResource, - PinnedMemoryResource, - PinnedMemoryResourceOptions, - VirtualMemoryResource, - VirtualMemoryResourceOptions, -) -from cuda.core._module import Kernel, ObjectCode -from cuda.core._program import Program, ProgramOptions -from cuda.core._stream import ( - LEGACY_DEFAULT_STREAM, - PER_THREAD_DEFAULT_STREAM, - Stream, - StreamOptions, -) -from cuda.core._tensor_map import TensorMapDescriptor, TensorMapDescriptorOptions +from cuda.core._context import * +from cuda.core._context import __all__ as _context_all +from cuda.core._device import * +from cuda.core._device import __all__ as _device_all +from cuda.core._device_resources import * +from cuda.core._device_resources import __all__ as _device_resources_all +from cuda.core._event import * +from cuda.core._event import __all__ as _event_all +from cuda.core._graphics import * +from cuda.core._graphics import __all__ as _graphics_all +from cuda.core._host import * +from cuda.core._host import __all__ as _host_all +from cuda.core._launch_config import * +from cuda.core._launch_config import __all__ as _launch_config_all +from cuda.core._launcher import * +from cuda.core._launcher import __all__ as _launcher_all +from cuda.core._linker import * +from cuda.core._linker import __all__ as _linker_all +from cuda.core._memory import * +from cuda.core._memory import __all__ as _memory_all +from cuda.core._module import * +from cuda.core._module import __all__ as _module_all +from cuda.core._program import * +from cuda.core._program import __all__ as _program_all +from cuda.core._stream import * +from cuda.core._stream import __all__ as _stream_all +from cuda.core._tensor_map import * +from cuda.core._tensor_map import __all__ as _tensor_map_all + +__all__ = [ + *_context_all, + *_device_all, + *_device_resources_all, + *_event_all, + *_graphics_all, + *_host_all, + *_launch_config_all, + *_launcher_all, + *_linker_all, + *_memory_all, + *_module_all, + *_program_all, + *_stream_all, + *_tensor_map_all, +] # isort: split # Texture/surface types live under the cuda.core.texture namespace (not the diff --git a/cuda_core/cuda/core/_cpp/GRAPH_ATTACHMENTS.md b/cuda_core/cuda/core/_cpp/GRAPH_ATTACHMENTS.md index 89003ae0b7f..fdaf77785b2 100644 --- a/cuda_core/cuda/core/_cpp/GRAPH_ATTACHMENTS.md +++ b/cuda_core/cuda/core/_cpp/GRAPH_ATTACHMENTS.md @@ -77,12 +77,13 @@ The CUDA user-object reference count controls the attachment lifetime. `GraphAttachmentMap` only lets cuda.core find the attachment currently associated with a node. -Each `NodeAttachment` contains two type-erased `OpaqueHandle` owners: +Each `NodeAttachment` has two type-erased `OpaqueHandle` slots, allowing it to +hold up to two node-specific resource owners. These are: -- kernel: kernel and argument storage -- host callback: callback and copied user data -- memcpy: destination and source -- memset or event: destination or event in the first owner +- kernel node: kernel and argument storage +- host callback node: callback and copied user data +- memcpy node: destination and source +- memset or event node: destination or event `OpaqueHandle` is `shared_ptr`. Existing cuda.core handles reuse their shared ownership when converted to it. Python objects and copied callback @@ -93,23 +94,47 @@ published attachment. The resources those owners keep alive, including Python objects, may remain mutable, but they must not be modified in a way that releases resources still referenced by an installed parameter version. +## Executable graph attachments + +Executable graphs can be modified after instantiation. Those updates may +introduce new resources (events, memory, kernels, kernel parameters, and host +callbacks) that must outlive in-flight launches. CUDA provides no way to attach +user objects to an executable graph (`cuGraphRetainUserObject` accepts a +`CUgraph` only), so cuda.core emulates that lifetime tracking. + +Before instantiation or whole-graph update, cuda.core retains one +`ExecAttachments` accumulator on the source graph as a CUDA user object. +Instantiation or `cuGraphExecUpdate` propagates that reference into the +executable; cuda.core then releases the source graph's temporary reference so +the executable (and its in-flight launches) own the accumulator. Individual +node updates append owners to that accumulator through the same prepare/commit +transaction used for definition attachments. + +Appended owners are never removed: each update can only grow the accumulator. +A successful whole-graph update replaces the accumulator entirely, so the +previous owners are dropped once their last launch finishes. Enable/disable +attaches nothing. A child-graph update relies on CUDA cloning the replacement +graph's user-object references, which carry the child definition's attachments. + ## Deferred cleanup CUDA invokes a user-object destructor on an internal thread where CUDA API calls are forbidden. Destroying an attachment there could release handles whose deleters call CUDA or run Python finalizers. -`NodeAttachment` therefore inherits from `DeferredCleanupItem`. The CUDA +`NodeAttachment` and `ExecAttachments` therefore inherit from +`DeferredCleanupItem`. The CUDA destructor callback only adds the attachment to the process-lifetime `DeferredCleanupQueue` and requests a `Py_AddPendingCall`. One pending call drains all queued attachments from Python's main thread. The -queue coalesces work because CPython's pending-call queue is bounded. If -scheduling fails, attachments stay queued and a later enqueue or safe cuda.core -entry retries. Graph and executable-graph destruction and explicit close paths -provide additional retry points. During Python finalization, scheduling stops -and unreclaimable attachments are intentionally leaked rather than destroyed -in an unsafe context. +queue coalesces work because CPython's pending-call queue is bounded, and there +could be many more deferred cleanup items than allowed pending calls. If +`Py_AddPendingCall` fails, the attachments remain queued. A later successful +`Py_AddPendingCall` will safely clean them up. Graph and executable-graph +destruction and explicit close paths provide additional retry points. During +Python finalization, scheduling stops and unreclaimable attachments are +intentionally leaked rather than destroyed in an unsafe context. ## Graph hierarchy state @@ -157,19 +182,15 @@ be invalidated when CUDA destroys that graph. They use separate ## Invariants -1. The owner bundle of a published `NodeAttachment` is never modified in place. +1. The owner bundle of a published `NodeAttachment` is never modified in place; + replace the whole bundle. 2. CUDA user-object references, not metadata pointers, own attachments. -3. Metadata is removed or replaced before its graph reference is released. -4. Fallible attachment setup and metadata allocation happen before the CUDA - graph mutation they support. -5. Every live cuda.core `CUgraph` has one canonical `GraphBox` and registry - entry. -6. Graph boxes remain in parent-before-child order. -7. Destroyed child boxes remain at stable addresses in the graveyard. -8. A raw graph handle is unregistered before its box becomes a tombstone. -9. CUDA callbacks only enqueue attachments; they never release owners or call +3. Fallible attachment setup and metadata allocation happen before the CUDA + graph mutation they support; metadata is removed or replaced before its + graph reference is released. +4. CUDA callbacks only enqueue attachments; they never release owners or call CUDA. -10. Graph mutations and their metadata updates require the same external +5. Graph mutations and their metadata updates require the same external synchronization as the underlying CUDA graph. ## Scope @@ -177,10 +198,11 @@ be invalidated when CUDA destroys that graph. They use separate - Attachment metadata tracks graph mutations performed through cuda.core. - Raw driver clones receive the CUDA user-object references needed for safe execution, but cuda.core cannot reconstruct their node-to-attachment map. -- Executable graphs rely on CUDA's inherited user-object references; they do - not use `GraphAttachmentMap`. -- Direct executable-node updates require separate executable ownership and are - not tracked by definition attachment metadata. +- Executable graphs keep one append-only accumulator instead of a + `GraphAttachmentMap`. cuda.core cannot map an executable node back to its + owners, so it can neither report nor release them individually. +- Executable-node updates do not change definition attachment metadata, and + definition updates do not change an executable's accumulator. - Stream capture explicitly retains host callbacks. Other captured operations keep their documented caller-owned lifetime contract. - CPython's cyclic garbage collector cannot follow the ownership path from a diff --git a/cuda_core/cuda/core/_cpp/resource_handles.cpp b/cuda_core/cuda/core/_cpp/resource_handles.cpp index b3d2e3fe373..ef1b8d0f2f8 100644 --- a/cuda_core/cuda/core/_cpp/resource_handles.cpp +++ b/cuda_core/cuda/core/_cpp/resource_handles.cpp @@ -74,6 +74,8 @@ decltype(&cuLibraryGetKernel) p_cuLibraryGetKernel = nullptr; // Graph decltype(&cuGraphDestroy) p_cuGraphDestroy = nullptr; +decltype(&cuGraphInstantiateWithParams) p_cuGraphInstantiateWithParams = nullptr; +decltype(&cuGraphExecUpdate) p_cuGraphExecUpdate = nullptr; decltype(&cuGraphExecDestroy) p_cuGraphExecDestroy = nullptr; decltype(&cuUserObjectCreate) p_cuUserObjectCreate = nullptr; decltype(&cuUserObjectRelease) p_cuUserObjectRelease = nullptr; @@ -361,6 +363,15 @@ class HandleRegistry { map_.erase(key); } + void register_handles(const std::vector& handles) { + std::lock_guard lock(mutex_); + for (const Handle& h : handles) { + if (h) { + map_[*h] = h; + } + } + } + Handle lookup(const Key& key) { std::lock_guard lock(mutex_); auto it = map_.find(key); @@ -1341,7 +1352,8 @@ struct GraphHierarchy { }; // See REGISTRY_DESIGN.md (Level 1: Driver Handle -> Resource Handle) -static HandleRegistry graph_registry; +using GraphRegistry = HandleRegistry; +static GraphRegistry graph_registry; // Immutable resource owners for one version of a graph node's parameters. // Inheriting DeferredCleanupItem lets CUDA's user-object destructor enqueue @@ -1404,52 +1416,71 @@ CUresult rekey_attachments( return CUDA_SUCCESS; } -// Recursively copy and rekey attachments for a cloned graph hierarchy. -// The caller must release the GIL before calling this function. -CUresult copy_attachments( +struct StagedGraphMetadata { + const GraphBox* source; + GraphBox* clone; + GraphAttachmentMap* attachments; +}; +using StagedGraphMetadataList = std::vector; + +// Copy a source hierarchy into detached metadata before CUDA mutation. +void stage_graph_metadata( const GraphBox& source, GraphBox& clone, GraphAttachmentMap& attachments, - std::list& subgraphs) { - if (!p_cuGraphNodeFindInClone || !p_cuGraphChildGraphNodeGetGraph) { - return CUDA_ERROR_NOT_SUPPORTED; - } - + std::list& subgraphs, + StagedGraphMetadataList& staged) { attachments = source.attachments; - CUresult status = rekey_attachments(attachments, clone.resource); - if (status != CUDA_SUCCESS) { - return status; - } + staged.push_back({&source, &clone, &attachments}); for (const GraphBox& source_child : source.hierarchy->graphs) { if (source_child.parent != &source || !source_child.resource) { continue; } - - CUgraphNode cloned_owner = nullptr; - status = p_cuGraphNodeFindInClone( - &cloned_owner, source_child.owner_node, clone.resource); - if (status != CUDA_SUCCESS) { - return status; - } - - CUgraph cloned_graph = nullptr; - status = p_cuGraphChildGraphNodeGetGraph( - cloned_owner, &cloned_graph); - if (status != CUDA_SUCCESS) { - return status; - } - GraphBox& cloned_child = subgraphs.emplace_back( - cloned_graph, + nullptr, clone.hierarchy, &clone, - cloned_owner); - status = copy_attachments( + nullptr); + stage_graph_metadata( source_child, cloned_child, cloned_child.attachments, - subgraphs); + subgraphs, + staged); + } +} + +// Bind staged metadata to a CUDA-cloned hierarchy. The root clone resource +// must be populated before entry. The caller must release the GIL. +CUresult rekey_graph_metadata( + StagedGraphMetadataList& staged) { + if (!p_cuGraphNodeFindInClone || !p_cuGraphChildGraphNodeGetGraph) { + return CUDA_ERROR_NOT_SUPPORTED; + } + + CUresult status; + for (size_t i = 0; i < staged.size(); ++i) { + const GraphBox& source = *staged[i].source; + GraphBox& clone = *staged[i].clone; + if (i != 0) { + CUgraphNode cloned_owner = nullptr; + status = p_cuGraphNodeFindInClone( + &cloned_owner, + source.owner_node, + clone.parent->resource); + if (status == CUDA_SUCCESS) { + status = p_cuGraphChildGraphNodeGetGraph( + cloned_owner, &clone.resource); + } + if (status != CUDA_SUCCESS) { + return status; + } + clone.owner_node = cloned_owner; + } + + status = rekey_attachments( + *staged[i].attachments, clone.resource); if (status != CUDA_SUCCESS) { return status; } @@ -1497,6 +1528,29 @@ void rollback_prepared_attachment( delete state; } +// Detached metadata for a replacement embedded graph hierarchy. Preparation +// copies every attachment map and allocates every GraphBox before CUDA destroys +// the old embedded graph. Commit only rekeys and publishes it. +struct PreparedChildGraphUpdateState { + GraphHandle h_parent; + GraphHandle h_source; + GraphBox* old_root = nullptr; + CUgraphNode owner_node = nullptr; + std::list replacement; + StagedGraphMetadataList staged; + std::vector handles; + + PreparedChildGraphUpdateState( + GraphHandle h_parent_, + GraphHandle h_source_, + GraphBox* old_root_, + CUgraphNode owner_node_) + : h_parent(std::move(h_parent_)), + h_source(std::move(h_source_)), + old_root(old_root_), + owner_node(owner_node_) {} +}; + GraphHandle create_graph_handle(CUgraph graph) { if (!graph) { return {}; @@ -1543,15 +1597,112 @@ GraphHandle create_child_graph_handle( child_graph, hierarchy, parent, owner_node); GraphHandle h_child(h_parent, &child.resource); - try { - graph_registry.register_handle(child_graph, h_child); - } catch (...) { - hierarchy->graphs.pop_back(); - throw; - } + graph_registry.register_handle(child_graph, h_child); return h_child; } +CUresult graph_prepare_child_graph_update( + const GraphHandle& h_parent, + const GraphHandle& h_old_child, + CUgraphNode owner_node, + const GraphHandle& h_source, + PreparedChildGraphUpdate* out_prepared) { + if (!h_parent || !h_old_child || !owner_node || + !h_source || !out_prepared) { + return CUDA_ERROR_INVALID_VALUE; + } + out_prepared->reset(); + + GraphBox* parent = get_box(h_parent); + GraphBox* old_root = get_box(h_old_child); + GraphBox* source = get_box(h_source); + // A source from the destination hierarchy can include the old embedded + // subtree whose raw node keys CUDA destroys during replacement. + if (!parent->resource || !old_root->resource || !source->resource || + old_root->parent != parent || + old_root->owner_node != owner_node || + source->hierarchy == parent->hierarchy) { + return CUDA_ERROR_INVALID_VALUE; + } + + PreparedChildGraphUpdate prepared = + std::make_shared( + h_parent, h_source, old_root, owner_node); + + GraphBox& replacement_root = + prepared->replacement.emplace_back( + nullptr, parent->hierarchy, parent, owner_node); + stage_graph_metadata( + *source, + replacement_root, + replacement_root.attachments, + prepared->replacement, + prepared->staged); + + const size_t graph_count = prepared->staged.size(); + prepared->handles.reserve(graph_count); + for (const StagedGraphMetadata& graph : prepared->staged) { + prepared->handles.emplace_back( + h_parent, &graph.clone->resource); + } + + *out_prepared = std::move(prepared); + return CUDA_SUCCESS; +} + +void publish_child_graph_update( + PreparedChildGraphUpdateState& state, + GraphHandle* out_child) { + GraphBox* parent = get_box(state.h_parent); + parent->hierarchy->graphs.splice( + parent->hierarchy->graphs.end(), state.replacement); + *out_child = state.handles.front(); + graph_registry.register_handles(state.handles); +} + +CUresult graph_commit_child_graph_update( + PreparedChildGraphUpdate& prepared, + GraphHandle* out_child) { + if (!prepared || !out_child) { + return CUDA_ERROR_INVALID_VALUE; + } + out_child->reset(); + + PreparedChildGraphUpdateState& state = *prepared; + GraphBox* parent = get_box(state.h_parent); + if (!parent->resource || !state.old_root->resource) { + prepared.reset(); + return CUDA_ERROR_INVALID_VALUE; + } + + CUresult status = CUDA_ERROR_NOT_SUPPORTED; + CUgraph cloned_root = nullptr; + if (p_cuGraphChildGraphNodeGetGraph) { + GILReleaseGuard gil; + status = p_cuGraphChildGraphNodeGetGraph( + state.owner_node, &cloned_root); + if (status == CUDA_SUCCESS) { + state.staged.front().clone->resource = cloned_root; + status = rekey_graph_metadata(state.staged); + } + } + + // CUDA has already destroyed the old embedded graph. No replacement + // metadata is visible yet, so this selects only the old generation. + invalidate_child_graph_state( + state.h_parent, state.owner_node); + + if (status != CUDA_SUCCESS) { + prepared.reset(); + throw std::runtime_error( + "failed to update graph metadata after child graph replacement"); + } + + publish_child_graph_update(state, out_child); + prepared.reset(); + return status; +} + CUresult graph_get_attachment( const GraphHandle& h_graph, CUgraphNode node, OpaqueHandle* owner0, OpaqueHandle* owner1) { @@ -1727,13 +1878,22 @@ CUresult graph_clone_attachments( // Build and rekey the clone metadata off-hierarchy so a CUDA mapping error // cannot partially publish it. - GraphAttachmentMap attachments = source->attachments; + GraphAttachmentMap attachments; std::list subgraphs; + StagedGraphMetadataList staged; + stage_graph_metadata( + *source, *clone, attachments, subgraphs, staged); + + std::vector handles; + handles.reserve(subgraphs.size()); + for (GraphBox& graph : subgraphs) { + handles.emplace_back(h_clone, &graph.resource); + } + CUresult status; { GILReleaseGuard gil; - status = copy_attachments( - *source, *clone, attachments, subgraphs); + status = rekey_graph_metadata(staged); } if (status != CUDA_SUCCESS) { return status; @@ -1744,13 +1904,9 @@ CUresult graph_clone_attachments( return CUDA_SUCCESS; } - auto first = subgraphs.begin(); clone->hierarchy->graphs.splice( clone->hierarchy->graphs.end(), subgraphs); - for (auto it = first; it != clone->hierarchy->graphs.end(); ++it) { - GraphHandle h_graph(h_clone, &it->resource); - graph_registry.register_handle(it->resource, h_graph); - } + graph_registry.register_handles(handles); return CUDA_SUCCESS; } @@ -1759,26 +1915,274 @@ CUresult graph_clone_attachments( // ============================================================================ namespace { + +// Append-only owners introduced by individual executable-node updates. CUDA +// owns this payload through a user object propagated into the CUgraphExec. +struct ExecAttachments : DeferredCleanupItem { + CUuserObject object = nullptr; + std::vector owners; +}; + struct GraphExecBox { - CUgraphExec resource; + CUgraphExec resource = nullptr; + ExecAttachments* attachments = nullptr; // Non-owning. + + ~GraphExecBox() noexcept { + if (resource) { + GILReleaseGuard gil; + p_cuGraphExecDestroy(resource); + } + // The accumulator fields may be dangling after exec destruction. + retry_deferred_cleanup(); + } }; -} // namespace -GraphExecHandle create_graph_exec_handle(CUgraphExec graph_exec) { - auto box = std::shared_ptr( - new GraphExecBox{graph_exec}, - [](const GraphExecBox* b) { - { +GraphExecBox* get_exec_box(const GraphExecHandle& h) noexcept { + return const_cast( + reinterpret_cast(h.get())); +} + +GraphExecHandle make_graph_exec_handle( + CUgraphExec graph_exec, ExecAttachments* attachments) { + struct RawGraphExecGuard { + CUgraphExec resource; + + ~RawGraphExecGuard() noexcept { + if (resource) { GILReleaseGuard gil; - p_cuGraphExecDestroy(b->resource); + p_cuGraphExecDestroy(resource); } retry_deferred_cleanup(); - delete b; } - ); + } guard{graph_exec}; + + auto box = std::make_shared(); + box->resource = graph_exec; + box->attachments = attachments; + guard.resource = nullptr; return GraphExecHandle(box, &box->resource); } +// Holds a fresh accumulator retained on the source graph across a CUDA call +// that propagates user objects into an exec. Releasing drops the source's +// reference: after successful propagation the exec keeps the accumulator +// alive, and otherwise this drops its last reference. +struct ExecAttachmentStaging { + GraphHandle h_source; + ExecAttachments* accumulator = nullptr; + + ~ExecAttachmentStaging() noexcept { + release(); + } + + CUresult release() noexcept { + if (!h_source || !accumulator) { + return CUDA_SUCCESS; + } + const CUuserObject object = accumulator->object; + const GraphHandle source = std::move(h_source); + accumulator = nullptr; + GILReleaseGuard gil; + return p_cuGraphReleaseUserObject(*source, object, 1); + } +}; + +// Create an accumulator and retain it on h_source, so that a following +// instantiation or whole-graph update propagates a reference into the exec. +CUresult stage_exec_attachments( + const GraphHandle& h_source, ExecAttachmentStaging* out_staging) { + if (!p_cuUserObjectCreate || !p_cuUserObjectRelease || + !p_cuGraphRetainUserObject || !p_cuGraphReleaseUserObject) { + return CUDA_ERROR_NOT_SUPPORTED; + } + + ensure_deferred_cleanup_ready(); + auto* accumulator = new ExecAttachments; + + CUuserObject object = nullptr; + CUresult status; + { + GILReleaseGuard gil; + status = p_cuUserObjectCreate( + &object, + static_cast(accumulator), + reinterpret_cast(enqueue_cleanup), + 1, + CU_USER_OBJECT_NO_DESTRUCTOR_SYNC); + if (status != CUDA_SUCCESS) { + delete accumulator; + return status; + } + accumulator->object = object; + status = p_cuGraphRetainUserObject( + *h_source, object, 1, CU_GRAPH_USER_OBJECT_MOVE); + if (status != CUDA_SUCCESS) { + // Dropping the last reference retires the accumulator. + p_cuUserObjectRelease(object, 1); + return status; + } + } + + out_staging->h_source = h_source; + out_staging->accumulator = accumulator; + return CUDA_SUCCESS; +} + +} // namespace + +// State held by PreparedExecAttachment between preparation and commit. It keeps +// the exec alive and remembers the accumulator size before the append, so that +// rollback can drop owners staged for a mutation that CUDA rejected. +struct PreparedExecAttachmentState { + GraphExecHandle h_exec; + ExecAttachments* attachments = nullptr; + size_t original_size = 0; + + PreparedExecAttachmentState( + GraphExecHandle h_exec_, + ExecAttachments* attachments_, + size_t original_size_) + : h_exec(std::move(h_exec_)), + attachments(attachments_), + original_size(original_size_) {} +}; + +void rollback_prepared_exec_attachment( + PreparedExecAttachmentState* state) noexcept { + if (!state) { + return; + } + if (state->attachments) { + while (state->attachments->owners.size() > state->original_size) { + state->attachments->owners.pop_back(); + } + } + delete state; +} + +GraphExecHandle create_graph_exec_handle( + const GraphHandle& h_source, + CUDA_GRAPH_INSTANTIATE_PARAMS* params) { + if (!h_source || !*h_source || !params) { + err = CUDA_ERROR_INVALID_VALUE; + return {}; + } + if (!p_cuGraphInstantiateWithParams) { + err = CUDA_ERROR_NOT_SUPPORTED; + return {}; + } + + ExecAttachmentStaging staging; + if (CUDA_SUCCESS != (err = stage_exec_attachments(h_source, &staging))) { + return {}; + } + + CUgraphExec graph_exec = nullptr; + { + GILReleaseGuard gil; + err = p_cuGraphInstantiateWithParams(&graph_exec, *h_source, params); + } + if (err != CUDA_SUCCESS) { + return {}; + } + // CUDA can report a specific failure while returning success. The exec is + // then unusable, so it stays unadopted for the caller to diagnose from + // params->result_out. + if (params->result_out != CUDA_GRAPH_INSTANTIATE_SUCCESS) { + return {}; + } + if (!graph_exec) { + err = CUDA_ERROR_INVALID_VALUE; + return {}; + } + + GraphExecHandle h_exec = make_graph_exec_handle( + graph_exec, staging.accumulator); + if (CUDA_SUCCESS != (err = staging.release())) { + return {}; + } + return h_exec; +} + +CUresult graph_exec_update( + const GraphExecHandle& h_exec, + const GraphHandle& h_source, + CUgraphExecUpdateResultInfo* result_info) { + if (!h_exec || !h_source || !*h_source || !result_info) { + return CUDA_ERROR_INVALID_VALUE; + } + if (!p_cuGraphExecUpdate) { + return CUDA_ERROR_NOT_SUPPORTED; + } + + GraphExecBox* box = get_exec_box(h_exec); + if (!box->resource) { + return CUDA_ERROR_INVALID_VALUE; + } + + ExecAttachmentStaging staging; + CUresult status = stage_exec_attachments(h_source, &staging); + if (status != CUDA_SUCCESS) { + return status; + } + + { + GILReleaseGuard gil; + status = p_cuGraphExecUpdate(box->resource, *h_source, result_info); + } + if (status != CUDA_SUCCESS) { + return status; + } + + // CUDA may already have retired the old accumulator. Publish the new one + // before releasing the source graph's temporary reference. + box->attachments = staging.accumulator; + return staging.release(); +} + +CUresult graph_prepare_exec_attachment( + const GraphExecHandle& h_exec, + OpaqueHandle owner0, + OpaqueHandle owner1, + PreparedExecAttachment* out_prepared) { + if (!out_prepared) { + return CUDA_ERROR_INVALID_VALUE; + } + out_prepared->reset(); + if (!h_exec) { + return CUDA_ERROR_INVALID_VALUE; + } + + GraphExecBox* box = get_exec_box(h_exec); + if (!box->resource || !box->attachments) { + return CUDA_ERROR_INVALID_VALUE; + } + + ExecAttachments* attachments = box->attachments; + const size_t original_size = attachments->owners.size(); + const size_t additions = + static_cast(static_cast(owner0)) + + static_cast(static_cast(owner1)); + // Reserve before staging so that rollback and commit cannot allocate. + attachments->owners.reserve(original_size + additions); + PreparedExecAttachment prepared( + new PreparedExecAttachmentState(h_exec, attachments, original_size), + PreparedExecAttachmentDeleter{rollback_prepared_exec_attachment}); + if (owner0) { + attachments->owners.emplace_back(std::move(owner0)); + } + if (owner1) { + attachments->owners.emplace_back(std::move(owner1)); + } + *out_prepared = std::move(prepared); + return CUDA_SUCCESS; +} + +void graph_commit_exec_attachment( + PreparedExecAttachment& prepared) noexcept { + delete prepared.release(); +} + namespace { struct GraphNodeBox { mutable CUgraphNode resource; diff --git a/cuda_core/cuda/core/_cpp/resource_handles.hpp b/cuda_core/cuda/core/_cpp/resource_handles.hpp index 3a9d2d75cff..6a1a0edd6c7 100644 --- a/cuda_core/cuda/core/_cpp/resource_handles.hpp +++ b/cuda_core/cuda/core/_cpp/resource_handles.hpp @@ -108,6 +108,8 @@ extern decltype(&cuLibraryGetKernel) p_cuLibraryGetKernel; // Graph extern decltype(&cuGraphDestroy) p_cuGraphDestroy; +extern decltype(&cuGraphInstantiateWithParams) p_cuGraphInstantiateWithParams; +extern decltype(&cuGraphExecUpdate) p_cuGraphExecUpdate; extern decltype(&cuGraphExecDestroy) p_cuGraphExecDestroy; extern decltype(&cuUserObjectCreate) p_cuUserObjectCreate; extern decltype(&cuUserObjectRelease) p_cuUserObjectRelease; @@ -516,6 +518,27 @@ struct PreparedAttachmentDeleter { using PreparedAttachment = std::unique_ptr; +struct PreparedChildGraphUpdateState; +// Opaque unpublished hierarchy transaction; releasing it discards staged +// metadata unless graph_commit_child_graph_update publishes the replacement. +using PreparedChildGraphUpdate = + std::shared_ptr; + +struct PreparedExecAttachmentState; +using PreparedExecAttachmentRollback = + void (*)(PreparedExecAttachmentState*) noexcept; +struct PreparedExecAttachmentDeleter { + PreparedExecAttachmentRollback rollback = nullptr; + + void operator()(PreparedExecAttachmentState* state) const noexcept { + rollback(state); + } +}; +// Opaque append transaction. Releasing it rolls back newly appended owners +// unless graph_commit_exec_attachment has kept them. +using PreparedExecAttachment = + std::unique_ptr; + // Copy requested owners from node's current attachment. Pass nullptr to ignore // either owner; a missing attachment produces empty handles. CUresult graph_get_attachment( @@ -543,6 +566,21 @@ CUresult graph_clone_attachments( const GraphHandle& h_clone, const GraphHandle& h_source); +// Stage a complete metadata replacement before CUDA replaces an embedded +// graph. Dropping the prepared state leaves the current hierarchy unchanged. +CUresult graph_prepare_child_graph_update( + const GraphHandle& h_parent, + const GraphHandle& h_old_child, + CUgraphNode owner_node, + const GraphHandle& h_source, + PreparedChildGraphUpdate* out_prepared); + +// Rekey staged metadata to CUDA's replacement clone, retire the old embedded +// hierarchy, and publish the replacement handle. +CUresult graph_commit_child_graph_update( + PreparedChildGraphUpdate& prepared, + GraphHandle* out_child); + // Invalidate cuda.core state for child graphs CUDA destroyed with owner_node. void invalidate_child_graph_state( const GraphHandle& h_parent, @@ -552,9 +590,39 @@ void invalidate_child_graph_state( // Graph exec handle functions // ============================================================================ -// Wrap an externally-created CUgraphExec with RAII cleanup. -// When the last reference is released, cuGraphExecDestroy is called automatically. -GraphExecHandle create_graph_exec_handle(CUgraphExec graph_exec); +// Create an owning exec handle by calling cuGraphInstantiateWithParams. +// A fresh attachment accumulator is retained on h_source first, because CUDA +// propagates user object references only at instantiation; an exec cannot +// receive them afterwards. The exec is the sole owner once this returns. +// When the last reference is released, cuGraphExecDestroy is called +// automatically. +// Returns empty handle on error (caller must check). The caller reads +// params->result_out for the specific instantiation failure and +// get_last_error() for a driver status. +GraphExecHandle create_graph_exec_handle( + const GraphHandle& h_source, + CUDA_GRAPH_INSTANTIATE_PARAMS* params); + +// Update h_exec in place by calling cuGraphExecUpdate, and publish a fresh +// accumulator when CUDA accepts the update. Writes result_info for the caller. +CUresult graph_exec_update( + const GraphExecHandle& h_exec, + const GraphHandle& h_source, + CUgraphExecUpdateResultInfo* result_info); + +// Append owners before an executable-node mutation. The accumulator grows +// because CUDA cannot attach user objects to an exec after instantiation, so +// old owners stay reachable. Dropping the transaction restores the accumulator +// to its original size. +CUresult graph_prepare_exec_attachment( + const GraphExecHandle& h_exec, + OpaqueHandle owner0, + OpaqueHandle owner1, + PreparedExecAttachment* out_prepared); + +// Keep the owners added by graph_prepare_exec_attachment. +void graph_commit_exec_attachment( + PreparedExecAttachment& prepared) noexcept; // ============================================================================ // Graph node handle functions @@ -733,6 +801,10 @@ inline CUlibrary as_cu(const LibraryHandle& h) noexcept { return h ? *h : nullptr; } +inline CUmodule as_cu(const CUmodule& h) noexcept { + return h; +} + inline CUkernel as_cu(const KernelHandle& h) noexcept { return h ? *h : nullptr; } @@ -817,6 +889,10 @@ inline std::intptr_t as_intptr(const LibraryHandle& h) noexcept { return reinterpret_cast(as_cu(h)); } +inline std::intptr_t as_intptr(const CUmodule& h) noexcept { + return reinterpret_cast(as_cu(h)); +} + inline std::intptr_t as_intptr(const KernelHandle& h) noexcept { return reinterpret_cast(as_cu(h)); } @@ -947,6 +1023,10 @@ inline PyObject* as_py(const LibraryHandle& h) noexcept { return detail::make_py("cuda.bindings.driver", "CUlibrary", as_intptr(h)); } +inline PyObject* as_py(const CUmodule& h) noexcept { + return detail::make_py("cuda.bindings.driver", "CUmodule", as_intptr(h)); +} + inline PyObject* as_py(const KernelHandle& h) noexcept { return detail::make_py("cuda.bindings.driver", "CUkernel", as_intptr(h)); } diff --git a/cuda_core/cuda/core/_device.pyi b/cuda_core/cuda/core/_device.pyi index 14893fbd3c0..e83aef8a8d0 100644 --- a/cuda_core/cuda/core/_device.pyi +++ b/cuda_core/cuda/core/_device.pyi @@ -1023,4 +1023,5 @@ class Device: .. versionadded:: 1.1.0 """ _tls = threading.local() -_lock = threading.Lock() \ No newline at end of file +_lock = threading.Lock() +__all__ = ['Device'] \ No newline at end of file diff --git a/cuda_core/cuda/core/_device.pyx b/cuda_core/cuda/core/_device.pyx index ea5bb62cc1b..a0a0f472f2b 100644 --- a/cuda_core/cuda/core/_device.pyx +++ b/cuda_core/cuda/core/_device.pyx @@ -61,6 +61,8 @@ _tls = threading.local() _lock = threading.Lock() cdef bint _is_cuInit = False +__all__ = ['Device'] + cdef class DeviceProperties: """ @@ -922,34 +924,46 @@ cdef class DeviceProperties: @property def host_memory_pools_supported(self) -> bool: """bool: Device supports HOST location with the cuMemAllocAsync and cuMemPool family of APIs.""" - return bool( - self._get_cached_attribute(driver.CUdevice_attribute.CU_DEVICE_ATTRIBUTE_HOST_MEMORY_POOLS_SUPPORTED) - ) + IF CUDA_CORE_BUILD_MAJOR < 13: + return False + ELSE: + return bool( + self._get_cached_attribute(driver.CUdevice_attribute.CU_DEVICE_ATTRIBUTE_HOST_MEMORY_POOLS_SUPPORTED) + ) @property def host_virtual_memory_management_supported(self) -> bool: """bool: Device supports HOST location with the virtual memory management APIs like cuMemCreate, cuMemMap and related APIs.""" - return bool( - self._get_cached_attribute( - driver.CUdevice_attribute.CU_DEVICE_ATTRIBUTE_HOST_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED + IF CUDA_CORE_BUILD_MAJOR < 13: + return False + ELSE: + return bool( + self._get_cached_attribute( + driver.CUdevice_attribute.CU_DEVICE_ATTRIBUTE_HOST_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED + ) ) - ) @property def host_alloc_dma_buf_supported(self) -> bool: """bool: Device supports page-locked host memory buffer sharing with dma_buf mechanism.""" - return bool( - self._get_cached_attribute(driver.CUdevice_attribute.CU_DEVICE_ATTRIBUTE_HOST_ALLOC_DMA_BUF_SUPPORTED) - ) + IF CUDA_CORE_BUILD_MAJOR < 13: + return False + ELSE: + return bool( + self._get_cached_attribute(driver.CUdevice_attribute.CU_DEVICE_ATTRIBUTE_HOST_ALLOC_DMA_BUF_SUPPORTED) + ) @property def only_partial_host_native_atomic_supported(self) -> bool: """bool: Link between the device and the host supports only some native atomic operations.""" - return bool( - self._get_cached_attribute( - driver.CUdevice_attribute.CU_DEVICE_ATTRIBUTE_ONLY_PARTIAL_HOST_NATIVE_ATOMIC_SUPPORTED + IF CUDA_CORE_BUILD_MAJOR < 13: + return False + ELSE: + return bool( + self._get_cached_attribute( + driver.CUdevice_attribute.CU_DEVICE_ATTRIBUTE_ONLY_PARTIAL_HOST_NATIVE_ATOMIC_SUPPORTED + ) ) - ) class Device: @@ -1287,7 +1301,10 @@ class Device: # use primary ctx h_context = get_primary_context(self._device_id) if h_context.get() == NULL: - raise ValueError("Cannot set NULL context as current") + HANDLE_RETURN(get_last_error()) + raise RuntimeError( + f"Failed to retain the primary context for device {self._device_id}" + ) with nogil: HANDLE_RETURN(cydriver.cuCtxSetCurrent(as_cu(h_context))) self._has_inited = True @@ -1316,7 +1333,6 @@ class Device: cdef object res cdef SMResource sm_res cdef WorkqueueResource wq_res - cdef GreenCtxHandle h_green if options is None: raise ValueError( @@ -1348,7 +1364,7 @@ class Device: else: raise TypeError(f"Unsupported context resource type: {type(res)}") - h_green = create_green_ctx_handle( + cdef GreenCtxHandle h_green = create_green_ctx_handle( c_resources.data(), (c_resources.size()), (self._device_id), diff --git a/cuda_core/cuda/core/_device_resources.pxd b/cuda_core/cuda/core/_device_resources.pxd index 98f91ab4733..d618c24cf10 100644 --- a/cuda_core/cuda/core/_device_resources.pxd +++ b/cuda_core/cuda/core/_device_resources.pxd @@ -2,8 +2,6 @@ # # SPDX-License-Identifier: Apache-2.0 -cimport cython - from cuda.bindings cimport cydriver from cuda.core._resource_handles cimport ContextHandle, GreenCtxHandle @@ -17,7 +15,6 @@ cdef class SMResource: unsigned int _flags bint _is_usable object __weakref__ - cython.pymutex _split_mutex @staticmethod cdef SMResource _from_dev_resource(cydriver.CUdevResource res, int device_id) diff --git a/cuda_core/cuda/core/_device_resources.pyx b/cuda_core/cuda/core/_device_resources.pyx index 26c8863e063..15ca6c56685 100644 --- a/cuda_core/cuda/core/_device_resources.pyx +++ b/cuda_core/cuda/core/_device_resources.pyx @@ -250,7 +250,6 @@ cdef object _resolve_split_by_count_request(SMResourceOptions options): cdef list counts = _broadcast_field(options.count, n_groups) cdef object first = counts[0] cdef object value - cdef unsigned int min_count if options.coscheduled_sm_count is not None: raise RuntimeError( @@ -270,7 +269,7 @@ cdef object _resolve_split_by_count_request(SMResourceOptions options): "use CUDA 13.1 or newer for per-group counts" ) - min_count = _to_sm_count(first) + cdef unsigned int min_count = _to_sm_count(first) return n_groups, min_count @@ -520,11 +519,10 @@ cdef class SMResource: ) _resolve_group_count(opts) _check_green_ctx_support() - with self._split_mutex: - if _can_use_structured_sm_split(): - return _split_with_general_api(self, opts, dry_run) - # SplitByCount requires the same 12.4+ as green ctx support (already checked above) - return _split_with_count_api(self, opts, dry_run) + if _can_use_structured_sm_split(): + return _split_with_general_api(self, opts, dry_run) + # SplitByCount requires the same 12.4+ as green ctx support (already checked above) + return _split_with_count_api(self, opts, dry_run) cdef class WorkqueueResource: diff --git a/cuda_core/cuda/core/_dlpack.pyx b/cuda_core/cuda/core/_dlpack.pyx index 0c251881d11..a41b3a73e85 100644 --- a/cuda_core/cuda/core/_dlpack.pyx +++ b/cuda_core/cuda/core/_dlpack.pyx @@ -115,10 +115,8 @@ cdef inline int setup_dl_tensor_device(DLTensor* dl_tensor, object buf) except - cdef inline int setup_dl_tensor_dtype(DLTensor* dl_tensor) except -1 nogil: - cdef DLDataType* dtype = &dl_tensor.dtype - dtype.code = kDLInt - dtype.lanes = 1 - dtype.bits = 8 + dl_tensor.dtype = DLDataType( + code=kDLInt, bits=8, lanes=1) return 0 diff --git a/cuda_core/cuda/core/_event.pyi b/cuda_core/cuda/core/_event.pyi index 1ea91308bc1..9391735b6ab 100644 --- a/cuda_core/cuda/core/_event.pyi +++ b/cuda_core/cuda/core/_event.pyi @@ -180,6 +180,7 @@ class IPCEventDescriptor: def __reduce__(self) -> tuple[object, ...]: ... +__all__ = ['Event', 'EventOptions'] def _reduce_event(event: Event) -> tuple[object, ...]: ... \ No newline at end of file diff --git a/cuda_core/cuda/core/_event.pyx b/cuda_core/cuda/core/_event.pyx index e5cb81ac41e..314347f6cce 100644 --- a/cuda_core/cuda/core/_event.pyx +++ b/cuda_core/cuda/core/_event.pyx @@ -43,6 +43,8 @@ if TYPE_CHECKING: import cuda.bindings.driver # no-cython-lint from cuda.core._device import Device +__all__ = ['Event', 'EventOptions'] + @dataclass cdef class EventOptions: diff --git a/cuda_core/cuda/core/_graphics.pyx b/cuda_core/cuda/core/_graphics.pyx index c5fc5c83ecc..764e2ec7688 100644 --- a/cuda_core/cuda/core/_graphics.pyx +++ b/cuda_core/cuda/core/_graphics.pyx @@ -209,10 +209,9 @@ cdef class GraphicsResource: return self def _get_mapped_buffer(self) -> object: - cdef Buffer buf if self._mapped_buffer is None: return None - buf = self._mapped_buffer + cdef Buffer buf = self._mapped_buffer if not buf._h_ptr: self._mapped_buffer = None return None @@ -250,20 +249,16 @@ cdef class GraphicsResource: CUDAError If the mapping fails. """ - cdef Stream s_obj - cdef cydriver.CUgraphicsResource raw - cdef cydriver.CUstream cy_stream cdef cydriver.CUdeviceptr dev_ptr = 0 cdef size_t size = 0 - cdef Buffer buf if not self._handle: raise RuntimeError("GraphicsResource has been closed") if self._get_mapped_buffer() is not None: raise RuntimeError("GraphicsResource is already mapped") - s_obj = Stream_accept(stream) - raw = as_cu(self._handle) - cy_stream = as_cu(s_obj._h_stream) + cdef Stream s_obj = Stream_accept(stream) + cdef cydriver.CUgraphicsResource raw = as_cu(self._handle) + cdef cydriver.CUstream cy_stream = as_cu(s_obj._h_stream) with nogil: HANDLE_RETURN( cydriver.cuGraphicsMapResources(1, &raw, cy_stream) @@ -271,7 +266,7 @@ cdef class GraphicsResource: HANDLE_RETURN( cydriver.cuGraphicsResourceGetMappedPointer(&dev_ptr, &size, raw) ) - buf = Buffer_from_deviceptr_handle( + cdef Buffer buf = Buffer_from_deviceptr_handle( deviceptr_create_mapped_graphics(dev_ptr, self._handle, s_obj._h_stream), size, None, @@ -299,14 +294,12 @@ cdef class GraphicsResource: CUDAError If the unmapping fails. """ - cdef object buf_obj - cdef Buffer buf if not self._handle: raise RuntimeError("GraphicsResource has been closed") - buf_obj = self._get_mapped_buffer() + cdef object buf_obj = self._get_mapped_buffer() if buf_obj is None: raise RuntimeError("GraphicsResource is not mapped") - buf = buf_obj + cdef Buffer buf = buf_obj buf.close(stream=stream) self._mapped_buffer = None @@ -332,11 +325,10 @@ cdef class GraphicsResource: Optional override for the stream used to close the currently mapped buffer, if one exists. """ - cdef object buf_obj cdef Buffer buf if not self._handle: return - buf_obj = self._get_mapped_buffer() + cdef object buf_obj = self._get_mapped_buffer() if buf_obj is not None: buf = buf_obj buf.close(stream=stream) diff --git a/cuda_core/cuda/core/_host.py b/cuda_core/cuda/core/_host.py index e74743d493a..30464409871 100644 --- a/cuda_core/cuda/core/_host.py +++ b/cuda_core/cuda/core/_host.py @@ -6,6 +6,8 @@ import threading from typing import ClassVar +__all__ = ["Host"] + class Host: """Host (CPU) location for managed-memory operations. diff --git a/cuda_core/cuda/core/_launch_config.pxd b/cuda_core/cuda/core/_launch_config.pxd index 112007b9cfd..892a73f8efc 100644 --- a/cuda_core/cuda/core/_launch_config.pxd +++ b/cuda_core/cuda/core/_launch_config.pxd @@ -15,6 +15,7 @@ cdef class LaunchConfig: public tuple block public int shmem_size public bint is_cooperative + public bint programmatic_stream_serialization vector[cydriver.CUlaunchAttribute] _attrs object __weakref__ diff --git a/cuda_core/cuda/core/_launch_config.pyi b/cuda_core/cuda/core/_launch_config.pyi index eac16c1878f..579818342fb 100644 --- a/cuda_core/cuda/core/_launch_config.pyi +++ b/cuda_core/cuda/core/_launch_config.pyi @@ -35,9 +35,13 @@ class LaunchConfig: (Default to size 0) is_cooperative : bool, optional Whether this config can be used to launch a cooperative kernel. + programmatic_stream_serialization : bool, optional + Whether to allow programmatic stream serialization (PDL). When True, + the kernel may overlap with a previous kernel in the same stream that + signals completion via programmatic means. """ - def __init__(self, grid: int | tuple[int, ...] | None=None, cluster: int | tuple[int, ...] | None=None, block: int | tuple[int, ...] | None=None, shmem_size: int | None=None, is_cooperative: bool=False) -> None: + def __init__(self, grid: int | tuple[int, ...] | None=None, cluster: int | tuple[int, ...] | None=None, block: int | tuple[int, ...] | None=None, shmem_size: int | None=None, is_cooperative: bool=False, programmatic_stream_serialization: bool=False) -> None: """Initialize LaunchConfig with validation. Parameters @@ -52,6 +56,8 @@ class LaunchConfig: Dynamic shared memory size in bytes (default: 0) is_cooperative : bool, optional Whether to launch as cooperative kernel (default: False) + programmatic_stream_serialization : bool, optional + Whether to allow programmatic stream serialization / PDL (default: False) """ def _identity(self) -> tuple[Any, ...]: @@ -65,7 +71,8 @@ class LaunchConfig: def __hash__(self) -> int: ... -_LAUNCH_CONFIG_ATTRS = ('grid', 'cluster', 'block', 'shmem_size', 'is_cooperative') +_LAUNCH_CONFIG_ATTRS = ('grid', 'cluster', 'block', 'shmem_size', 'is_cooperative', 'programmatic_stream_serialization') +__all__ = ['LaunchConfig'] def _to_native_launch_config(config: LaunchConfig) -> object: """Convert LaunchConfig to native driver CUlaunchConfig. diff --git a/cuda_core/cuda/core/_launch_config.pyx b/cuda_core/cuda/core/_launch_config.pyx index a92ecf1f9e3..3a2f36a4dff 100644 --- a/cuda_core/cuda/core/_launch_config.pyx +++ b/cuda_core/cuda/core/_launch_config.pyx @@ -13,7 +13,16 @@ from cuda.core._utils.cuda_utils import ( driver, ) -_LAUNCH_CONFIG_ATTRS = ('grid', 'cluster', 'block', 'shmem_size', 'is_cooperative') +_LAUNCH_CONFIG_ATTRS = ( + 'grid', + 'cluster', + 'block', + 'shmem_size', + 'is_cooperative', + 'programmatic_stream_serialization', +) + +__all__ = ['LaunchConfig'] cdef class LaunchConfig: @@ -46,6 +55,10 @@ cdef class LaunchConfig: (Default to size 0) is_cooperative : bool, optional Whether this config can be used to launch a cooperative kernel. + programmatic_stream_serialization : bool, optional + Whether to allow programmatic stream serialization (PDL). When True, + the kernel may overlap with a previous kernel in the same stream that + signals completion via programmatic means. """ # TODO: expand LaunchConfig to include other attributes @@ -58,6 +71,7 @@ cdef class LaunchConfig: block: int | tuple[int, ...] | None = None, shmem_size: int | None = None, is_cooperative: bool = False, + programmatic_stream_serialization: bool = False, ) -> None: """Initialize LaunchConfig with validation. @@ -73,6 +87,8 @@ cdef class LaunchConfig: Dynamic shared memory size in bytes (default: 0) is_cooperative : bool, optional Whether to launch as cooperative kernel (default: False) + programmatic_stream_serialization : bool, optional + Whether to allow programmatic stream serialization / PDL (default: False) """ # Convert and validate grid and block dimensions self.grid = cast_to_3_tuple("LaunchConfig.grid", grid) @@ -99,6 +115,7 @@ cdef class LaunchConfig: self.shmem_size = shmem_size self.is_cooperative = is_cooperative + self.programmatic_stream_serialization = programmatic_stream_serialization if self.is_cooperative and not Device().properties.cooperative_launch: raise CUDAError("cooperative kernels are not supported on this device") @@ -147,6 +164,11 @@ cdef class LaunchConfig: attr.value.cooperative = 1 self._attrs.push_back(attr) + if self.programmatic_stream_serialization: + attr.id = cydriver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION + attr.value.programmaticStreamSerializationAllowed = 1 + self._attrs.push_back(attr) + drv_cfg.numAttrs = self._attrs.size() drv_cfg.attrs = self._attrs.data() @@ -202,6 +224,12 @@ cpdef object _to_native_launch_config(LaunchConfig config): attr.value.cooperative = 1 attrs.append(attr) + if config.programmatic_stream_serialization: + attr = driver.CUlaunchAttribute() + attr.id = driver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION + attr.value.programmaticStreamSerializationAllowed = 1 + attrs.append(attr) + drv_cfg.numAttrs = len(attrs) drv_cfg.attrs = attrs diff --git a/cuda_core/cuda/core/_launcher.pyi b/cuda_core/cuda/core/_launcher.pyi index a292c3eec95..27ed7e86da7 100644 --- a/cuda_core/cuda/core/_launcher.pyi +++ b/cuda_core/cuda/core/_launcher.pyi @@ -8,6 +8,7 @@ from cuda.core._stream import Stream from cuda.core.graph import GraphBuilder from cuda.core.typing import IsStreamType +__all__ = ['launch'] def launch(stream: Stream | GraphBuilder | IsStreamType, config: LaunchConfig, kernel: Kernel, *kernel_args) -> None: """Launches a :obj:`~_module.Kernel` diff --git a/cuda_core/cuda/core/_launcher.pyx b/cuda_core/cuda/core/_launcher.pyx index d5ddaff4d56..036189790e0 100644 --- a/cuda_core/cuda/core/_launcher.pyx +++ b/cuda_core/cuda/core/_launcher.pyx @@ -24,6 +24,8 @@ if TYPE_CHECKING: from cuda.core.graph import GraphBuilder from cuda.core.typing import IsStreamType +__all__ = ['launch'] + def launch( stream: Stream | GraphBuilder | IsStreamType, diff --git a/cuda_core/cuda/core/_linker.pyx b/cuda_core/cuda/core/_linker.pyx index 753fa28b0d3..0687632c3bb 100644 --- a/cuda_core/cuda/core/_linker.pyx +++ b/cuda_core/cuda/core/_linker.pyx @@ -29,6 +29,7 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Union from warnings import warn +from cuda.pathfinder import DynamicLibNotFoundError from cuda.pathfinder._optional_cuda_import import _optional_cuda_import from cuda.core._device import Device from cuda.core._module import ObjectCode @@ -544,11 +545,10 @@ cdef inline void Linker_add_code_object(Linker self, object object_code) except cdef cydriver.CUjitInputType c_drv_input_type cdef const char* c_data_ptr cdef size_t c_data_size - cdef const char* c_name_ptr cdef const char* c_file_ptr name_bytes = f"{object_code.name}".encode() - c_name_ptr = name_bytes + cdef const char* c_name_ptr = name_bytes input_types = _nvjitlink_input_types if self._use_nvjitlink else _driver_input_types py_input_type = input_types.get(object_code.code_type) @@ -684,26 +684,30 @@ def _decide_nvjitlink_or_driver() -> bool: " For best results, consider upgrading to a recent version of" ) - nvjitlink_module = _optional_cuda_import( - "cuda.bindings.nvjitlink", - probe_function=lambda module: module.version(), # probe triggers nvJitLink runtime load - ) + nvjitlink_module = _optional_cuda_import("cuda.bindings.nvjitlink") if nvjitlink_module is None: warn_txt = f"cuda.bindings.nvjitlink is not available, therefore {warn_txt_common} cuda-bindings." else: from cuda.bindings._internal import nvjitlink - if _nvjitlink_has_version_symbol(nvjitlink): - _use_nvjitlink_backend = True - return False # Use nvjitlink - warn_txt = ( - f"{'nvJitLink*.dll' if sys.platform == 'win32' else 'libnvJitLink.so*'} is too old (<12.3)." - f" Therefore cuda.bindings.nvjitlink is not usable and {warn_txt_common} nvJitLink." - ) + try: + has_version_symbol = _nvjitlink_has_version_symbol(nvjitlink) + except DynamicLibNotFoundError: + warn_txt = ( + f"cuda.bindings.nvjitlink is not available, therefore {warn_txt_common} cuda-bindings." + ) + else: + if has_version_symbol: + _use_nvjitlink_backend = True + return False # Use nvjitlink + warn_txt = ( + f"{'nvJitLink*.dll' if sys.platform == 'win32' else 'libnvJitLink.so*'} is too old (<12.3)." + f" Therefore cuda.bindings.nvjitlink is not usable and {warn_txt_common} nvJitLink." + ) warn(warn_txt, stacklevel=2, category=RuntimeWarning) - _use_nvjitlink_backend = False _driver = driver + _use_nvjitlink_backend = False return True diff --git a/cuda_core/cuda/core/_memory/__init__.py b/cuda_core/cuda/core/_memory/__init__.py index bf40a643f8c..d35ee814449 100644 --- a/cuda_core/cuda/core/_memory/__init__.py +++ b/cuda_core/cuda/core/_memory/__init__.py @@ -1,13 +1,34 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 from ._buffer import * +from ._buffer import __all__ as _buffer_all from ._device_memory_resource import * +from ._device_memory_resource import __all__ as _device_memory_resource_all from ._graph_memory_resource import * +from ._graph_memory_resource import __all__ as _graph_memory_resource_all from ._ipc import * +from ._ipc import __all__ as _ipc_all from ._legacy import * -from ._managed_buffer import ManagedBuffer +from ._legacy import __all__ as _legacy_all +from ._managed_buffer import * +from ._managed_buffer import __all__ as _managed_buffer_all from ._managed_memory_resource import * +from ._managed_memory_resource import __all__ as _managed_memory_resource_all from ._pinned_memory_resource import * +from ._pinned_memory_resource import __all__ as _pinned_memory_resource_all from ._virtual_memory_resource import * +from ._virtual_memory_resource import __all__ as _virtual_memory_resource_all + +__all__ = [ + *_buffer_all, + *_device_memory_resource_all, + *_graph_memory_resource_all, + *_ipc_all, + *_legacy_all, + *_managed_buffer_all, + *_managed_memory_resource_all, + *_pinned_memory_resource_all, + *_virtual_memory_resource_all, +] diff --git a/cuda_core/cuda/core/_memory/_buffer.pyx b/cuda_core/cuda/core/_memory/_buffer.pyx index 97ef892547d..2506331d0fd 100644 --- a/cuda_core/cuda/core/_memory/_buffer.pyx +++ b/cuda_core/cuda/core/_memory/_buffer.pyx @@ -272,8 +272,11 @@ cdef class Buffer: @cython.critical_section def ipc_descriptor(self) -> IPCBufferDescriptor: """Descriptor for sharing this buffer with other processes.""" + cdef object ipc_data if self._ipc_data is None: - self._ipc_data = IPCDataForBuffer(_ipc.Buffer_get_ipc_descriptor(self), False) + ipc_data = IPCDataForBuffer(_ipc.Buffer_get_ipc_descriptor(self), False) + if self._ipc_data is None: + self._ipc_data = ipc_data return self._ipc_data.ipc_descriptor def close(self, stream: Stream | GraphBuilder | None = None) -> None: @@ -422,8 +425,7 @@ cdef class Buffer: if not isinstance(max_version, tuple) or len(max_version) != 2: raise BufferError(f"Expected max_version tuple[int, int], got {max_version}") versioned = max_version >= (1, 0) - capsule = make_py_capsule(self, versioned) - return capsule + return make_py_capsule(self, versioned) def __dlpack_device__(self) -> tuple[int, int]: return classify_dl_device(self) diff --git a/cuda_core/cuda/core/_memory/_device_memory_resource.pyx b/cuda_core/cuda/core/_memory/_device_memory_resource.pyx index 45d8d543ac4..22b1488f638 100644 --- a/cuda_core/cuda/core/_memory/_device_memory_resource.pyx +++ b/cuda_core/cuda/core/_memory/_device_memory_resource.pyx @@ -321,10 +321,10 @@ cpdef str DMR_mempool_get_access(DeviceMemoryResource dmr, int device_id): cdef int dev_id = Device(device_id).device_id cdef cydriver.CUmemAccess_flags flags - cdef cydriver.CUmemLocation location - - location.type = cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_DEVICE - location.id = dev_id + cdef cydriver.CUmemLocation location = cydriver.CUmemLocation( + type=cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_DEVICE, + id=dev_id, + ) with nogil: HANDLE_RETURN(cydriver.cuMemPoolGetAccess(&flags, as_cu(dmr._h_pool), &location)) diff --git a/cuda_core/cuda/core/_memory/_ipc.pyi b/cuda_core/cuda/core/_memory/_ipc.pyi index 0c912a567bd..7c707ab0418 100644 --- a/cuda_core/cuda/core/_memory/_ipc.pyi +++ b/cuda_core/cuda/core/_memory/_ipc.pyi @@ -84,7 +84,7 @@ class IPCAllocationHandle: @property def uuid(self) -> uuid.UUID: ... -__all__ = ['IPCBufferDescriptor', 'IPCAllocationHandle'] +__all__ = [] def _reduce_allocation_handle(alloc_handle: IPCAllocationHandle) -> tuple[object, ...]: ... diff --git a/cuda_core/cuda/core/_memory/_ipc.pyx b/cuda_core/cuda/core/_memory/_ipc.pyx index d03f51a26ce..f4194b22b0e 100644 --- a/cuda_core/cuda/core/_memory/_ipc.pyx +++ b/cuda_core/cuda/core/_memory/_ipc.pyx @@ -29,7 +29,7 @@ import platform import uuid import weakref -__all__ = ['IPCBufferDescriptor', 'IPCAllocationHandle'] +__all__ = [] cdef object registry = weakref.WeakValueDictionary() diff --git a/cuda_core/cuda/core/_memory/_managed_buffer.py b/cuda_core/cuda/core/_memory/_managed_buffer.py index 9a8333e7094..83a6c618864 100644 --- a/cuda_core/cuda/core/_memory/_managed_buffer.py +++ b/cuda_core/cuda/core/_memory/_managed_buffer.py @@ -25,6 +25,8 @@ from cuda.core._stream import Stream from cuda.core.graph import GraphBuilder +__all__ = ["ManagedBuffer"] + _INT_SIZE = 4 diff --git a/cuda_core/cuda/core/_memory/_managed_memory_ops.pyx b/cuda_core/cuda/core/_memory/_managed_memory_ops.pyx index c07fb719dd9..b2ecde29f39 100644 --- a/cuda_core/cuda/core/_memory/_managed_memory_ops.pyx +++ b/cuda_core/cuda/core/_memory/_managed_memory_ops.pyx @@ -80,7 +80,6 @@ cdef tuple _coerce_batch_buffers(object buffers, str what): cdef tuple _broadcast_locations(object location, Py_ssize_t n, bint allow_none, str what): - cdef object coerced if isinstance(location, Sequence): if len(location) != n: raise ValueError( @@ -88,28 +87,30 @@ cdef tuple _broadcast_locations(object location, Py_ssize_t n, bint allow_none, f"targets length {n}" ) return tuple(_coerce_location(loc, allow_none=allow_none) for loc in location) - coerced = _coerce_location(location, allow_none=allow_none) + cdef object coerced = _coerce_location(location, allow_none=allow_none) return tuple([coerced] * n) IF CUDA_CORE_BUILD_MAJOR >= 13: # Convert a _LocSpec dataclass to a cydriver.CUmemLocation struct. cdef inline cydriver.CUmemLocation _to_cumemlocation(object loc): - cdef cydriver.CUmemLocation out cdef str kind = loc.kind if kind == "device": - out.type = cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_DEVICE - out.id = loc.id + return cydriver.CUmemLocation( + type=cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_DEVICE, + id=loc.id) elif kind == "host": - out.type = cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_HOST - out.id = 0 + return cydriver.CUmemLocation( + type=cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_HOST, + id=0) elif kind == "host_numa": - out.type = cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_HOST_NUMA - out.id = loc.id + return cydriver.CUmemLocation( + type=cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_HOST_NUMA, + id=loc.id) else: # host_numa_current - out.type = cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENT - out.id = 0 - return out + return cydriver.CUmemLocation( + type=cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENT, + id=0) ELSE: # CUDA 12 cuMemPrefetchAsync takes a device ordinal (-1 = host). cdef inline int _to_legacy_device(object loc) except? -2: @@ -223,8 +224,9 @@ cdef void _do_single_advise(Buffer buf, object advice_value, object loc, bint al # Driver ignores location for read_mostly / unset_preferred_location # advice values but still validates the CUmemLocation; pass a # host placeholder. - cu_loc.type = cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_HOST - cu_loc.id = 0 + cu_loc = cydriver.CUmemLocation( + type=cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_HOST, + id=0) else: cu_loc = _to_cumemlocation(loc) with nogil: diff --git a/cuda_core/cuda/core/_memory/_memory_pool.pyx b/cuda_core/cuda/core/_memory/_memory_pool.pyx index cf7c48068f1..8f9a4354b84 100644 --- a/cuda_core/cuda/core/_memory/_memory_pool.pyx +++ b/cuda_core/cuda/core/_memory/_memory_pool.pyx @@ -183,8 +183,11 @@ cdef class _MemPool(MemoryResource): @cython.critical_section def attributes(self) -> _MemPoolAttributes: """Memory pool attributes.""" + cdef _MemPoolAttributes attributes if self._attributes is None: - self._attributes = _MemPoolAttributes._init(self._h_pool) + attributes = _MemPoolAttributes._init(self._h_pool) + if self._attributes is None: + self._attributes = attributes return self._attributes @property @@ -275,19 +278,18 @@ cdef int MP_init_current_pool( Requires CUDA 13+. """ IF CUDA_CORE_BUILD_MAJOR >= 13: - cdef cydriver.CUmemLocation loc cdef cydriver.CUmemoryPool pool - loc.id = loc_id - loc.type = loc_type + cdef cydriver.CUmemLocation loc = cydriver.CUmemLocation( + type=loc_type, id=loc_id) with nogil: HANDLE_RETURN(cydriver.cuMemGetMemPool(&pool, &loc, alloc_type)) self._h_pool = create_mempool_handle_ref(pool) self._mempool_owned = False + return 0 ELSE: raise RuntimeError( "Getting the current memory pool requires CUDA 13.0 or later" ) - return 0 cdef int MP_raise_release_threshold(_MemPool self) except? -1: diff --git a/cuda_core/cuda/core/_memory/_peer_access_utils.pyx b/cuda_core/cuda/core/_memory/_peer_access_utils.pyx index 9a035378ecf..69d59f9e005 100644 --- a/cuda_core/cuda/core/_memory/_peer_access_utils.pyx +++ b/cuda_core/cuda/core/_memory/_peer_access_utils.pyx @@ -92,7 +92,7 @@ cdef inline tuple _query_peer_access_ids(DeviceMemoryResource mr): cdef cydriver.CUmemLocation location cdef cydriver.CUmemoryPool h_pool = as_cu(mr._h_pool) cdef vector[int] peers - cdef size_t i, n + cdef size_t i location.type = cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_DEVICE @@ -106,17 +106,17 @@ cdef inline tuple _query_peer_access_ids(DeviceMemoryResource mr): if flags == cydriver.CUmemAccess_flags.CU_MEM_ACCESS_FLAGS_PROT_READWRITE: peers.push_back(dev_id) - n = peers.size() + cdef size_t n = peers.size() return tuple(peers[i] for i in range(n)) cdef inline bint _peer_access_includes(DeviceMemoryResource mr, int dev_id): """Return True if peer access from ``dev_id`` is currently granted.""" cdef cydriver.CUmemAccess_flags flags - cdef cydriver.CUmemLocation location - - location.type = cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_DEVICE - location.id = dev_id + cdef cydriver.CUmemLocation location = cydriver.CUmemLocation( + type=cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_DEVICE, + id=dev_id, + ) with nogil: HANDLE_RETURN(cydriver.cuMemPoolGetAccess(&flags, as_cu(mr._h_pool), &location)) return flags == cydriver.CUmemAccess_flags.CU_MEM_ACCESS_FLAGS_PROT_READWRITE diff --git a/cuda_core/cuda/core/_memory/_pinned_memory_resource.pyi b/cuda_core/cuda/core/_memory/_pinned_memory_resource.pyi index a83cd8ea581..9cad97a1d0d 100644 --- a/cuda_core/cuda/core/_memory/_pinned_memory_resource.pyi +++ b/cuda_core/cuda/core/_memory/_pinned_memory_resource.pyi @@ -5,8 +5,11 @@ from __future__ import annotations import uuid from dataclasses import dataclass +from cuda.core._memory._buffer import Buffer from cuda.core._memory._ipc import IPCAllocationHandle from cuda.core._memory._memory_pool import _MemPool +from cuda.core._stream import Stream +from cuda.core.graph import GraphBuilder @dataclass @@ -63,6 +66,14 @@ class PinnedMemoryResource(_MemPool): Notes ----- + The device associated with ``stream`` must support host memory pools. If + ``numa_id`` is set or derived for IPC, it must support host NUMA memory pools. + You can query these capabilities through + ``Device.properties.host_memory_pools_supported`` and + ``Device.properties.host_numa_memory_pools_supported``. If the required pool + is unsupported and stream-ordered allocation is not needed, use + :class:`LegacyPinnedMemoryResource`. + To create an IPC-Enabled memory resource (MR) that is capable of sharing allocations between processes, specify ``ipc_enabled=True`` in the initializer option. When IPC is enabled and ``numa_id`` is not specified, the NUMA node @@ -76,6 +87,9 @@ class PinnedMemoryResource(_MemPool): def __init__(self, options: PinnedMemoryResourceOptions | dict[str, object] | None=None) -> None: ... + def allocate(self, size: int, *, stream: Stream | GraphBuilder) -> Buffer: + """Allocate a host-pinned buffer asynchronously on the supplied stream.""" + def __reduce__(self) -> tuple[object, ...]: ... diff --git a/cuda_core/cuda/core/_memory/_pinned_memory_resource.pyx b/cuda_core/cuda/core/_memory/_pinned_memory_resource.pyx index 4335fbb41c2..e5f89606330 100644 --- a/cuda_core/cuda/core/_memory/_pinned_memory_resource.pyx +++ b/cuda_core/cuda/core/_memory/_pinned_memory_resource.pyx @@ -5,9 +5,11 @@ from __future__ import annotations from cuda.bindings cimport cydriver -from cuda.core._memory._memory_pool cimport _MemPool, MP_init_create_pool, MP_init_current_pool +from cuda.core._memory._buffer cimport Buffer +from cuda.core._memory._memory_pool cimport _MemPool, _MP_allocate, MP_init_create_pool, MP_init_current_pool from cuda.core._memory cimport _ipc from cuda.core._memory._ipc cimport IPCAllocationHandle +from cuda.core._stream cimport Stream, Stream_accept from cuda.core._utils.cuda_utils cimport ( check_or_create_options, HANDLE_RETURN, @@ -20,6 +22,11 @@ import uuid from cuda.core._utils.cuda_utils import check_multiprocessing_start_method +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from cuda.core.graph import GraphBuilder + __all__ = ['PinnedMemoryResource', 'PinnedMemoryResourceOptions'] @@ -78,6 +85,14 @@ cdef class PinnedMemoryResource(_MemPool): Notes ----- + The device associated with ``stream`` must support host memory pools. If + ``numa_id`` is set or derived for IPC, it must support host NUMA memory pools. + You can query these capabilities through + ``Device.properties.host_memory_pools_supported`` and + ``Device.properties.host_numa_memory_pools_supported``. If the required pool + is unsupported and stream-ordered allocation is not needed, use + :class:`LegacyPinnedMemoryResource`. + To create an IPC-Enabled memory resource (MR) that is capable of sharing allocations between processes, specify ``ipc_enabled=True`` in the initializer option. When IPC is enabled and ``numa_id`` is not specified, the NUMA node @@ -91,6 +106,26 @@ cdef class PinnedMemoryResource(_MemPool): def __init__(self, options: PinnedMemoryResourceOptions | dict[str, object] | None = None) -> None: _PMR_init(self, options) + def allocate(self, size_t size, *, stream: Stream | GraphBuilder) -> Buffer: + """Allocate a host-pinned buffer asynchronously on the supplied stream.""" + if self.is_mapped: + raise TypeError("Cannot allocate from a mapped IPC-enabled memory resource") + cdef Stream s = Stream_accept(stream) + device = s.device + cdef bint supported = ( + device.properties.host_numa_memory_pools_supported + if self._numa_id >= 0 + else device.properties.host_memory_pools_supported + ) + + if not supported: + raise RuntimeError( + f"CUDA device {device.device_id} does not support the requested " + "host memory pool for PinnedMemoryResource. Use " + "LegacyPinnedMemoryResource if memory-pool features are not required." + ) + return _MP_allocate(self, size, s) + def __reduce__(self) -> tuple[object, ...]: return PinnedMemoryResource.from_registry, (self.uuid,) diff --git a/cuda_core/cuda/core/_memory/_virtual_memory_resource.py b/cuda_core/cuda/core/_memory/_virtual_memory_resource.py index f30e6e3838d..7cd12f597a6 100644 --- a/cuda_core/cuda/core/_memory/_virtual_memory_resource.py +++ b/cuda_core/cuda/core/_memory/_virtual_memory_resource.py @@ -33,6 +33,16 @@ __all__ = ["VirtualMemoryResource", "VirtualMemoryResourceOptions"] +# Location types whose physical backing lives in host memory. Shared by +# VirtualMemoryResource.__init__ and is_host_accessible so the two cannot drift. +_HOST_LOCATION_TYPES = frozenset( + { + VirtualMemoryLocationType.HOST, + VirtualMemoryLocationType.HOST_NUMA, + VirtualMemoryLocationType.HOST_NUMA_CURRENT, + } +) + @dataclass class VirtualMemoryResourceOptions: @@ -46,10 +56,9 @@ class VirtualMemoryResourceOptions: location_type: :obj:`~_memory.VirtualMemoryLocationType` | str Controls the location of the allocation. handle_type: :obj:`~_memory.VirtualMemoryHandleType` | str - Export handle type for the physical allocation. Use - ``"posix_fd"`` on Linux if you plan to - import/export the allocation (required for cuMemRetainAllocationHandle). - Use `None` if you don't need an exportable handle. + Export handle type for the physical allocation. Use ``"posix_fd"`` on + Linux if you plan to import/export the allocation. Use `None` if you + don't need an exportable handle. gpu_direct_rdma: bool Hint that the allocation should be GDR-capable (if supported). granularity: :obj:`~_memory.VirtualMemoryGranularityType` | str @@ -170,8 +179,7 @@ def __init__(self, device_id: Device | int, config: VirtualMemoryResourceOptions self.config: VirtualMemoryResourceOptions = check_or_create_options( # type: ignore[assignment] VirtualMemoryResourceOptions, config, "VirtualMemoryResource options", keep_none=False ) - # Matches ("host", "host_numa", "host_numa_current") - if "host" in self.config.location_type: + if self.config.location_type in _HOST_LOCATION_TYPES: self.device = None if not self.device and self.config.location_type == "device": @@ -610,7 +618,7 @@ def is_host_accessible(self) -> bool: """ Indicates whether the allocated memory is accessible from the host. """ - return self.config.location_type == "host" + return self.config.location_type in _HOST_LOCATION_TYPES @property def device_id(self) -> int: diff --git a/cuda_core/cuda/core/_memoryview.pyx b/cuda_core/cuda/core/_memoryview.pyx index 260980c1daf..bbe5a887700 100644 --- a/cuda_core/cuda/core/_memoryview.pyx +++ b/cuda_core/cuda/core/_memoryview.pyx @@ -346,13 +346,15 @@ cdef class StridedMemoryView: data = cpython.PyCapsule_GetPointer( self.metadata, DLPACK_VERSIONED_TENSOR_USED_NAME) dlm_tensor_ver = data - dlm_tensor_ver.deleter(dlm_tensor_ver) + if dlm_tensor_ver.deleter != NULL: + dlm_tensor_ver.deleter(dlm_tensor_ver) elif cpython.PyCapsule_IsValid( self.metadata, DLPACK_TENSOR_USED_NAME): data = cpython.PyCapsule_GetPointer( self.metadata, DLPACK_TENSOR_USED_NAME) dlm_tensor = data - dlm_tensor.deleter(dlm_tensor) + if dlm_tensor.deleter != NULL: + dlm_tensor.deleter(dlm_tensor) def view( self, layout : _StridedLayout | None = None, dtype : numpy.dtype | None = None @@ -542,13 +544,16 @@ cdef class StridedMemoryView: @cython.critical_section cdef inline _StridedLayout get_layout(self): + cdef _StridedLayout layout if self._layout is None: if self.dl_tensor: - self._layout = layout_from_dlpack(self.dl_tensor) + layout = layout_from_dlpack(self.dl_tensor) elif self.metadata is not None: - self._layout = layout_from_cai(self.metadata) + layout = layout_from_cai(self.metadata) else: raise ValueError("Cannot infer layout from the exporting object") + if self._layout is None: + self._layout = layout return self._layout @cython.critical_section @@ -558,24 +563,31 @@ cdef class StridedMemoryView: If the SMV was created from a Buffer, it will return the same Buffer instance. Otherwise, it will create a new instance with owner set to the exporting object. """ + cdef object buffer if self._buffer is None: if isinstance(self.exporting_obj, Buffer): - self._buffer = self.exporting_obj + buffer = self.exporting_obj else: - self._buffer = Buffer.from_handle(self.ptr, 0, owner=self.exporting_obj) + buffer = Buffer.from_handle(self.ptr, 0, owner=self.exporting_obj) + if self._buffer is None: + self._buffer = buffer return self._buffer @cython.critical_section cdef inline object get_dtype(self): + cdef object dtype if self._dtype is None: + dtype = None if self.dl_tensor != NULL: - self._dtype = dtype_dlpack_to_numpy(&self.dl_tensor.dtype) + dtype = dtype_dlpack_to_numpy(&self.dl_tensor.dtype) elif isinstance(self.metadata, int): # AOTI dtype code stored by the torch tensor bridge - self._dtype = _get_tensor_bridge().resolve_aoti_dtype( + dtype = _get_tensor_bridge().resolve_aoti_dtype( self.metadata) elif self.metadata is not None: - self._dtype = _typestr2dtype(self.metadata["typestr"]) + dtype = _typestr2dtype(self.metadata["typestr"]) + if self._dtype is None: + self._dtype = dtype return self._dtype @@ -1176,7 +1188,7 @@ cdef object dtype_dlpack_to_numpy(DLDataType* dtype): cpdef StridedMemoryView view_as_cai(obj, stream_ptr, view=None): cdef dict cai_data = obj.__cuda_array_interface__ - if cai_data["version"] < 3: + if cai_data.get("version", 0) < 3: raise BufferError("only CUDA Array Interface v3 or above is supported") if cai_data.get("mask") is not None: raise BufferError("mask is not supported") @@ -1232,7 +1244,7 @@ cpdef StridedMemoryView view_as_cai(obj, stream_ptr, view=None): cpdef StridedMemoryView view_as_array_interface(obj, view=None): cdef dict data = obj.__array_interface__ - if data["version"] < 3: + if data.get("version", 0) < 3: raise BufferError("only NumPy Array Interface v3 or above is supported") if data.get("mask") is not None: raise BufferError("mask is not supported") diff --git a/cuda_core/cuda/core/_module.pxd b/cuda_core/cuda/core/_module.pxd index 78f871b5ba2..5e9d08fc13f 100644 --- a/cuda_core/cuda/core/_module.pxd +++ b/cuda_core/cuda/core/_module.pxd @@ -2,6 +2,8 @@ # # SPDX-License-Identifier: Apache-2.0 +from libcpp.mutex cimport py_safe_once_flag + from cuda.bindings cimport cydriver from cuda.core._resource_handles cimport LibraryHandle, KernelHandle @@ -32,6 +34,7 @@ cdef class ObjectCode: object _module # bytes/str source dict _sym_map str _name + py_safe_once_flag _load_once object __weakref__ cdef int _lazy_load_module(self) except -1 diff --git a/cuda_core/cuda/core/_module.pyi b/cuda_core/cuda/core/_module.pyi index 5125b99131a..9ff758bb6c7 100644 --- a/cuda_core/cuda/core/_module.pyi +++ b/cuda_core/cuda/core/_module.pyi @@ -458,6 +458,20 @@ class ObjectCode: """ + def get_module(self) -> driver.CUmodule: + """Return a context-dependent :obj:`~driver.CUmodule` for legacy interop. + + Bridges the native :obj:`~driver.CUlibrary` (see :attr:`handle`) to a + ``CUmodule`` via ``cuLibraryGetModule``, for use with legacy driver APIs + that only accept ``CUmodule``. + + Returns + ------- + :obj:`~driver.CUmodule` + Module handle for the current CUDA context, suitable for legacy + driver APIs that accept ``CUmodule``. + """ + @property def code(self) -> CodeTypeT: """Return the underlying code object.""" @@ -476,7 +490,10 @@ class ObjectCode: @property def handle(self) -> object: - """Return the underlying handle object. + """Return the native, context-independent :obj:`~driver.CUlibrary` handle. + + Used by ``cuda.core`` and newer driver library APIs. For legacy APIs + that only accept a ``CUmodule``, use :meth:`get_module` instead. .. caution:: diff --git a/cuda_core/cuda/core/_module.pyx b/cuda_core/cuda/core/_module.pyx index 91c8ad43895..95e149065bf 100644 --- a/cuda_core/cuda/core/_module.pyx +++ b/cuda_core/cuda/core/_module.pyx @@ -6,6 +6,7 @@ from __future__ import annotations cimport cython from libc.stddef cimport size_t +from libcpp.mutex cimport py_safe_call_once from collections import namedtuple from os import fsencode, fspath, PathLike @@ -458,8 +459,11 @@ cdef class Kernel: @cython.critical_section def attributes(self) -> KernelAttributes: """Get the read-only attributes of this kernel.""" + cdef KernelAttributes attributes if self._attributes is None: - self._attributes = KernelAttributes._init(self._h_kernel) + attributes = KernelAttributes._init(self._h_kernel) + if self._attributes is None: + self._attributes = attributes return self._attributes cdef tuple _get_arguments_info(self, bint param_info=False): @@ -506,8 +510,11 @@ cdef class Kernel: @cython.critical_section def occupancy(self) -> KernelOccupancy: """Get the occupancy information for launching this kernel.""" + cdef KernelOccupancy occupancy if self._occupancy is None: - self._occupancy = KernelOccupancy._init(self._h_kernel) + occupancy = KernelOccupancy._init(self._h_kernel) + if self._occupancy is None: + self._occupancy = occupancy return self._occupancy @property @@ -583,6 +590,31 @@ CodeTypeT = bytes | bytearray | str cdef tuple _supported_code_type = tuple(ObjectCodeFormatType.__members__.values()) + +cdef void _lazy_load_module_once(void *self_v) except *: + # Call-once helper for the lazy module loading, we want to avoid unloading + # a module in case of threads racing, so use `call_once`. + cdef ObjectCode self = self_v + cdef LibraryHandle h_library + cdef bytes path_bytes + module = self._module + if isinstance(module, str): + path_bytes = module.encode() + h_library = create_library_handle_from_file(path_bytes) + elif isinstance(module, (bytes, bytearray)): + h_library = create_library_handle_from_data(module) + elif isinstance(module, PathLike): + path_bytes = fsencode(module) + h_library = create_library_handle_from_file(path_bytes) + else: + assert_type_str_or_bytes_like(module) + raise_code_path_meant_to_be_unreachable() + return + if not h_library: + HANDLE_RETURN(get_last_error()) + self._h_library = h_library + + cdef class ObjectCode: """Represent a compiled program to be loaded onto the device. @@ -745,26 +777,8 @@ cdef class ObjectCode: # TODO: do we want to unload in a finalizer? Probably not.. - @cython.critical_section cdef int _lazy_load_module(self) except -1: - if self._h_library: - return 0 - module = self._module - cdef bytes path_bytes - if isinstance(module, str): - path_bytes = module.encode() - self._h_library = create_library_handle_from_file(path_bytes) - elif isinstance(module, (bytes, bytearray)): - self._h_library = create_library_handle_from_data(module) - elif isinstance(module, PathLike): - path_bytes = fsencode(module) - self._h_library = create_library_handle_from_file(path_bytes) - else: - assert_type_str_or_bytes_like(module) - raise_code_path_meant_to_be_unreachable() - return -1 - if not self._h_library: - HANDLE_RETURN(get_last_error()) + py_safe_call_once(self._load_once, _lazy_load_module_once, self) return 0 def get_kernel(self, name: str | bytes) -> Kernel: @@ -796,6 +810,25 @@ cdef class ObjectCode: HANDLE_RETURN(get_last_error()) return Kernel._from_handle(h_kernel) + def get_module(self) -> driver.CUmodule: + """Return a context-dependent :obj:`~driver.CUmodule` for legacy interop. + + Bridges the native :obj:`~driver.CUlibrary` (see :attr:`handle`) to a + ``CUmodule`` via ``cuLibraryGetModule``, for use with legacy driver APIs + that only accept ``CUmodule``. + + Returns + ------- + :obj:`~driver.CUmodule` + Module handle for the current CUDA context, suitable for legacy + driver APIs that accept ``CUmodule``. + """ + self._lazy_load_module() + cdef cydriver.CUmodule mod + with nogil: + HANDLE_RETURN(cydriver.cuLibraryGetModule(&mod, as_cu(self._h_library))) + return as_py(mod) + @property def code(self) -> CodeTypeT: """Return the underlying code object.""" @@ -818,7 +851,10 @@ cdef class ObjectCode: @property def handle(self) -> object: - """Return the underlying handle object. + """Return the native, context-independent :obj:`~driver.CUlibrary` handle. + + Used by ``cuda.core`` and newer driver library APIs. For legacy APIs + that only accept a ``CUmodule``, use :meth:`get_module` instead. .. caution:: diff --git a/cuda_core/cuda/core/_program.pyi b/cuda_core/cuda/core/_program.pyi index df7ed66446a..d046523b007 100644 --- a/cuda_core/cuda/core/_program.pyi +++ b/cuda_core/cuda/core/_program.pyi @@ -145,6 +145,7 @@ class ProgramOptions: ---------- name : str, optional Name of the program. If the compilation succeeds, the name is passed down to the generated :class:`ObjectCode`. + When set to `None`, ``"default_program"`` is used. arch : str, optional Pass the SM architecture value, such as ``sm_`` (for generating CUBIN) or ``compute_`` (for generating PTX). If not provided, the current device's architecture diff --git a/cuda_core/cuda/core/_program.pyx b/cuda_core/cuda/core/_program.pyx index 2b2e5262a2c..7fb099b06d2 100644 --- a/cuda_core/cuda/core/_program.pyx +++ b/cuda_core/cuda/core/_program.pyx @@ -298,6 +298,7 @@ class ProgramOptions: ---------- name : str, optional Name of the program. If the compilation succeeds, the name is passed down to the generated :class:`ObjectCode`. + When set to `None`, ``"default_program"`` is used. arch : str, optional Pass the SM architecture value, such as ``sm_`` (for generating CUBIN) or ``compute_`` (for generating PTX). If not provided, the current device's architecture @@ -523,6 +524,9 @@ class ProgramOptions: numba_debug: bool | None = None # Custom option for Numba debugging def __post_init__(self) -> None: + # Set name to default if not provided + if self.name is None: + self.name = "default_program" self._name = self.name.encode() # Set arch to default if not provided if self.arch is None: @@ -649,12 +653,10 @@ def _get_nvvm_module() -> object: """Get the NVVM module, importing it lazily with availability checks.""" global _nvvm_module, _nvvm_import_attempted - if _nvvm_import_attempted: - if _nvvm_module is None: - raise RuntimeError("NVVM module is not available (previous import attempt failed)") + if _nvvm_module is not None: return _nvvm_module - - _nvvm_import_attempted = True + if _nvvm_import_attempted: + raise RuntimeError("NVVM module is not available (previous import attempt failed)") try: version = binding_version() @@ -678,8 +680,10 @@ def _get_nvvm_module() -> object: except RuntimeError: _nvvm_module = None + _nvvm_import_attempted = True raise + def _find_libdevice_path() -> object: """Find libdevice*.bc for NVVM compilation using cuda.pathfinder.""" from cuda.pathfinder import find_bitcode_lib diff --git a/cuda_core/cuda/core/_resource_handles.pxd b/cuda_core/cuda/core/_resource_handles.pxd index 2f481fee4f8..2637abb5137 100644 --- a/cuda_core/cuda/core/_resource_handles.pxd +++ b/cuda_core/cuda/core/_resource_handles.pxd @@ -71,6 +71,20 @@ cdef extern from "_cpp/resource_handles.hpp" namespace "cuda_core": PreparedAttachmentState, PreparedAttachmentDeleter ] PreparedAttachment + cppclass PreparedChildGraphUpdateState: + pass + ctypedef shared_ptr[ + PreparedChildGraphUpdateState + ] PreparedChildGraphUpdate + + cppclass PreparedExecAttachmentState: + pass + cppclass PreparedExecAttachmentDeleter: + pass + ctypedef unique_ptr[ + PreparedExecAttachmentState, PreparedExecAttachmentDeleter + ] PreparedExecAttachment + # as_cu() - extract the raw CUDA handle (inline C++) cydriver.CUcontext as_cu(ContextHandle h) noexcept nogil cydriver.CUgreenCtx as_cu(GreenCtxHandle h) noexcept nogil @@ -79,6 +93,7 @@ cdef extern from "_cpp/resource_handles.hpp" namespace "cuda_core": cydriver.CUmemoryPool as_cu(MemoryPoolHandle h) noexcept nogil cydriver.CUdeviceptr as_cu(DevicePtrHandle h) noexcept nogil cydriver.CUlibrary as_cu(LibraryHandle h) noexcept nogil + cydriver.CUmodule as_cu(cydriver.CUmodule h) noexcept nogil cydriver.CUkernel as_cu(KernelHandle h) noexcept nogil cydriver.CUgraph as_cu(GraphHandle h) noexcept nogil cydriver.CUgraphExec as_cu(GraphExecHandle h) noexcept nogil @@ -101,6 +116,7 @@ cdef extern from "_cpp/resource_handles.hpp" namespace "cuda_core": intptr_t as_intptr(MemoryPoolHandle h) noexcept nogil intptr_t as_intptr(DevicePtrHandle h) noexcept nogil intptr_t as_intptr(LibraryHandle h) noexcept nogil + intptr_t as_intptr(const cydriver.CUmodule& h) noexcept nogil intptr_t as_intptr(KernelHandle h) noexcept nogil intptr_t as_intptr(GraphHandle h) noexcept nogil intptr_t as_intptr(GraphExecHandle h) noexcept nogil @@ -124,6 +140,7 @@ cdef extern from "_cpp/resource_handles.hpp" namespace "cuda_core": object as_py(MemoryPoolHandle h) object as_py(DevicePtrHandle h) object as_py(LibraryHandle h) + object as_py(const cydriver.CUmodule& h) object as_py(KernelHandle h) object as_py(GraphHandle h) object as_py(GraphExecHandle h) @@ -253,11 +270,30 @@ cdef cydriver.CUresult graph_commit_attachment( PreparedAttachment& prepared, cydriver.CUgraphNode node) except+ cdef cydriver.CUresult graph_clone_attachments( const GraphHandle& h_clone, const GraphHandle& h_source) except+ +cdef cydriver.CUresult graph_prepare_child_graph_update( + const GraphHandle& h_parent, const GraphHandle& h_old_child, + cydriver.CUgraphNode owner_node, const GraphHandle& h_source, + PreparedChildGraphUpdate* out_prepared) except+ +cdef cydriver.CUresult graph_commit_child_graph_update( + PreparedChildGraphUpdate& prepared, GraphHandle* out_child) except+ cdef void invalidate_child_graph_state( const GraphHandle& h_parent, cydriver.CUgraphNode owner_node) noexcept # Graph exec handles -cdef GraphExecHandle create_graph_exec_handle(cydriver.CUgraphExec graph_exec) except+ nogil +cdef GraphExecHandle create_graph_exec_handle( + const GraphHandle& h_source, + cydriver.CUDA_GRAPH_INSTANTIATE_PARAMS* params) except+ +cdef cydriver.CUresult graph_exec_update( + const GraphExecHandle& h_exec, + const GraphHandle& h_source, + cydriver.CUgraphExecUpdateResultInfo* result_info) except+ +cdef cydriver.CUresult graph_prepare_exec_attachment( + const GraphExecHandle& h_exec, + OpaqueHandle owner0, + OpaqueHandle owner1, + PreparedExecAttachment* out_prepared) except+ +cdef void graph_commit_exec_attachment( + PreparedExecAttachment& prepared) noexcept # Graph node handles cdef GraphNodeHandle create_graph_node_handle(cydriver.CUgraphNode node, const GraphHandle& h_graph) except+ nogil diff --git a/cuda_core/cuda/core/_resource_handles.pyi b/cuda_core/cuda/core/_resource_handles.pyi index f11f6f08e00..f9b10d4db3d 100644 --- a/cuda_core/cuda/core/_resource_handles.pyi +++ b/cuda_core/cuda/core/_resource_handles.pyi @@ -26,4 +26,6 @@ MipmappedArrayHandle = shared_ptr TexObjectHandle = shared_ptr SurfObjectHandle = shared_ptr OpaqueHandle = shared_ptr -PreparedAttachment = unique_ptr \ No newline at end of file +PreparedAttachment = unique_ptr +PreparedChildGraphUpdate = shared_ptr +PreparedExecAttachment = unique_ptr \ No newline at end of file diff --git a/cuda_core/cuda/core/_resource_handles.pyx b/cuda_core/cuda/core/_resource_handles.pyx index f6fb6ac4e20..464fad6c1bf 100644 --- a/cuda_core/cuda/core/_resource_handles.pyx +++ b/cuda_core/cuda/core/_resource_handles.pyx @@ -167,12 +167,30 @@ cdef extern from "_cpp/resource_handles.hpp" namespace "cuda_core": PreparedAttachment& prepared, cydriver.CUgraphNode node) except+ cydriver.CUresult graph_clone_attachments "cuda_core::graph_clone_attachments" ( const GraphHandle& h_clone, const GraphHandle& h_source) except+ + cydriver.CUresult graph_prepare_child_graph_update "cuda_core::graph_prepare_child_graph_update" ( + const GraphHandle& h_parent, const GraphHandle& h_old_child, + cydriver.CUgraphNode owner_node, const GraphHandle& h_source, + PreparedChildGraphUpdate* out_prepared) except+ + cydriver.CUresult graph_commit_child_graph_update "cuda_core::graph_commit_child_graph_update" ( + PreparedChildGraphUpdate& prepared, GraphHandle* out_child) except+ void invalidate_child_graph_state "cuda_core::invalidate_child_graph_state" ( const GraphHandle& h_parent, cydriver.CUgraphNode owner_node) noexcept # Graph exec handles GraphExecHandle create_graph_exec_handle "cuda_core::create_graph_exec_handle" ( - cydriver.CUgraphExec graph_exec) except+ nogil + const GraphHandle& h_source, + cydriver.CUDA_GRAPH_INSTANTIATE_PARAMS* params) except+ + cydriver.CUresult graph_exec_update "cuda_core::graph_exec_update" ( + const GraphExecHandle& h_exec, + const GraphHandle& h_source, + cydriver.CUgraphExecUpdateResultInfo* result_info) except+ + cydriver.CUresult graph_prepare_exec_attachment "cuda_core::graph_prepare_exec_attachment" ( + const GraphExecHandle& h_exec, + OpaqueHandle owner0, + OpaqueHandle owner1, + PreparedExecAttachment* out_prepared) except+ + void graph_commit_exec_attachment "cuda_core::graph_commit_exec_attachment" ( + PreparedExecAttachment& prepared) noexcept # Graph node handles GraphNodeHandle create_graph_node_handle "cuda_core::create_graph_node_handle" ( @@ -322,6 +340,8 @@ cdef extern from "_cpp/resource_handles.hpp" namespace "cuda_core": # Graph void* p_cuGraphDestroy "reinterpret_cast(cuda_core::p_cuGraphDestroy)" + void* p_cuGraphInstantiateWithParams "reinterpret_cast(cuda_core::p_cuGraphInstantiateWithParams)" + void* p_cuGraphExecUpdate "reinterpret_cast(cuda_core::p_cuGraphExecUpdate)" void* p_cuGraphExecDestroy "reinterpret_cast(cuda_core::p_cuGraphExecDestroy)" void* p_cuUserObjectCreate "reinterpret_cast(cuda_core::p_cuUserObjectCreate)" void* p_cuUserObjectRelease "reinterpret_cast(cuda_core::p_cuUserObjectRelease)" @@ -388,7 +408,8 @@ cdef void _init_driver_fn_pointers() noexcept: global p_cuMemFreeAsync, p_cuMemFree, p_cuMemFreeHost global p_cuMemPoolImportPointer global p_cuLibraryLoadFromFile, p_cuLibraryLoadData, p_cuLibraryUnload, p_cuLibraryGetKernel - global p_cuGraphDestroy, p_cuGraphExecDestroy + global p_cuGraphDestroy, p_cuGraphInstantiateWithParams + global p_cuGraphExecUpdate, p_cuGraphExecDestroy global p_cuUserObjectCreate, p_cuUserObjectRelease global p_cuGraphRetainUserObject, p_cuGraphReleaseUserObject global p_cuGraphNodeFindInClone, p_cuGraphChildGraphNodeGetGraph @@ -451,6 +472,8 @@ cdef void _init_driver_fn_pointers() noexcept: # Graph p_cuGraphDestroy = _get_driver_fn("cuGraphDestroy") + p_cuGraphInstantiateWithParams = _get_driver_fn("cuGraphInstantiateWithParams") + p_cuGraphExecUpdate = _get_driver_fn("cuGraphExecUpdate") p_cuGraphExecDestroy = _get_driver_fn("cuGraphExecDestroy") p_cuUserObjectCreate = _get_driver_fn("cuUserObjectCreate") p_cuUserObjectRelease = _get_driver_fn("cuUserObjectRelease") diff --git a/cuda_core/cuda/core/_stream.pyi b/cuda_core/cuda/core/_stream.pyi index f4d78982a1d..99af5f9b15b 100644 --- a/cuda_core/cuda/core/_stream.pyi +++ b/cuda_core/cuda/core/_stream.pyi @@ -131,6 +131,13 @@ class Stream: :obj:`~_event.Event` Newly created event object. + Note + ---- + A default stream (:obj:`LEGACY_DEFAULT_STREAM` or + :obj:`PER_THREAD_DEFAULT_STREAM`) carries no context of its own; it + refers to whichever context is current, so a newly created event is + associated with the current context at call time. + """ def wait(self, event_or_stream: Event | Stream) -> None: @@ -157,15 +164,29 @@ class Stream: Note ---- - The current context on the device may differ from this - stream's context. This case occurs when a different CUDA - context is set current after a stream is created. + A default stream (:obj:`LEGACY_DEFAULT_STREAM` or + :obj:`PER_THREAD_DEFAULT_STREAM`) carries no context of its own; it + refers to whichever context is current, so this returns the device for + the current context at call time. + + For a created stream, the current context on the device may differ from + this stream's context. That case occurs when a different CUDA context is + set current after the stream is created. """ @property def context(self) -> Context: - """Return the :obj:`~_context.Context` associated with this stream.""" + """Return the :obj:`~_context.Context` associated with this stream. + + Note + ---- + A default stream (:obj:`LEGACY_DEFAULT_STREAM` or + :obj:`PER_THREAD_DEFAULT_STREAM`) carries no context of its own; it + refers to whichever context is current, so this returns the current + context at call time. + + """ @property def resources(self) -> DeviceResources: @@ -174,6 +195,14 @@ class Stream: For streams created from a green context, returns the resources that context was provisioned with. For streams on the primary context, returns the full device resources. + + Note + ---- + A default stream (:obj:`LEGACY_DEFAULT_STREAM` or + :obj:`PER_THREAD_DEFAULT_STREAM`) carries no context of its own; it + refers to whichever context is current, so this queries the current + context at call time. + """ @staticmethod @@ -212,6 +241,7 @@ class Stream: Newly created graph builder object. """ +__all__ = ['LEGACY_DEFAULT_STREAM', 'PER_THREAD_DEFAULT_STREAM', 'Stream', 'StreamOptions'] LEGACY_DEFAULT_STREAM: Stream = Stream._legacy_default() PER_THREAD_DEFAULT_STREAM: Stream = Stream._per_thread_default() diff --git a/cuda_core/cuda/core/_stream.pyx b/cuda_core/cuda/core/_stream.pyx index 5212ec5c7de..c8c5faf74bc 100644 --- a/cuda_core/cuda/core/_stream.pyx +++ b/cuda_core/cuda/core/_stream.pyx @@ -47,6 +47,9 @@ if TYPE_CHECKING: from cuda.core._device import Device from cuda.core.graph import GraphBuilder +__all__ = ['LEGACY_DEFAULT_STREAM', 'PER_THREAD_DEFAULT_STREAM', 'Stream', 'StreamOptions'] + + @dataclass cdef class StreamOptions: """Customizable :obj:`~_stream.Stream` options. @@ -125,7 +128,6 @@ cdef class Stream: cdef StreamHandle h_stream cdef cydriver.CUstream borrowed cdef ContextHandle h_context - cdef Stream self # Extract context handle if provided if ctx is not None: @@ -185,7 +187,7 @@ cdef class Stream: ) else: HANDLE_RETURN(res_code) - self = Stream._from_handle(cls, h_stream) + cdef Stream self = Stream._from_handle(cls, h_stream) self._nonblocking = int(nonblocking) self._priority = prio if device_id is not None: @@ -214,8 +216,9 @@ cdef class Stream: return as_intptr(self._h_stream) == as_intptr((other)._h_stream) def __repr__(self) -> str: - Stream_ensure_ctx(self) - return f"" + cdef ContextHandle h_context + Stream_get_ctx(self, &h_context) + return f"" @property def handle(self) -> cuda.bindings.driver.CUstream: @@ -271,13 +274,22 @@ cdef class Stream: :obj:`~_event.Event` Newly created event object. + Note + ---- + A default stream (:obj:`LEGACY_DEFAULT_STREAM` or + :obj:`PER_THREAD_DEFAULT_STREAM`) carries no context of its own; it + refers to whichever context is current, so a newly created event is + associated with the current context at call time. + """ # Create an Event object (or reusing the given one) by recording # on the stream. Event flags such as disabling timing, nonblocking, # and CU_EVENT_RECORD_EXTERNAL, can be set in EventOptions. + cdef ContextHandle h_context + cdef int device_id if event is None: - Stream_ensure_ctx_device(self) - event = cyEvent._init(cyEvent, self._device_id, self._h_context, options, False) + Stream_get_ctx_device(self, &h_context, &device_id) + event = cyEvent._init(cyEvent, device_id, h_context, options, False) elif event.is_ipc_enabled: raise TypeError( "IPC-enabled events should not be re-recorded, instead create a " @@ -342,21 +354,38 @@ cdef class Stream: Note ---- - The current context on the device may differ from this - stream's context. This case occurs when a different CUDA - context is set current after a stream is created. + A default stream (:obj:`LEGACY_DEFAULT_STREAM` or + :obj:`PER_THREAD_DEFAULT_STREAM`) carries no context of its own; it + refers to whichever context is current, so this returns the device for + the current context at call time. + + For a created stream, the current context on the device may differ from + this stream's context. That case occurs when a different CUDA context is + set current after the stream is created. """ from cuda.core._device import Device # avoid circular import - Stream_ensure_ctx_device(self) - return Device(self._device_id) + cdef ContextHandle h_context + cdef int device_id + Stream_get_ctx_device(self, &h_context, &device_id) + return Device(device_id) @property def context(self) -> Context: - """Return the :obj:`~_context.Context` associated with this stream.""" - Stream_ensure_ctx(self) - Stream_ensure_ctx_device(self) - return Context._from_handle(Context, self._h_context, self._device_id) + """Return the :obj:`~_context.Context` associated with this stream. + + Note + ---- + A default stream (:obj:`LEGACY_DEFAULT_STREAM` or + :obj:`PER_THREAD_DEFAULT_STREAM`) carries no context of its own; it + refers to whichever context is current, so this returns the current + context at call time. + + """ + cdef ContextHandle h_context + cdef int device_id + Stream_get_ctx_device(self, &h_context, &device_id) + return Context._from_handle(Context, h_context, device_id) @property def resources(self) -> DeviceResources: @@ -365,10 +394,19 @@ cdef class Stream: For streams created from a green context, returns the resources that context was provisioned with. For streams on the primary context, returns the full device resources. + + Note + ---- + A default stream (:obj:`LEGACY_DEFAULT_STREAM` or + :obj:`PER_THREAD_DEFAULT_STREAM`) carries no context of its own; it + refers to whichever context is current, so this queries the current + context at call time. + """ - Stream_ensure_ctx(self) - Stream_ensure_ctx_device(self) - return DeviceResources._init_from_ctx(self._h_context, self._device_id) + cdef ContextHandle h_context + cdef int device_id + Stream_get_ctx_device(self, &h_context, &device_id) + return DeviceResources._init_from_ctx(h_context, device_id) @staticmethod def from_handle(handle) -> Stream: @@ -445,39 +483,63 @@ cpdef Stream default_stream(): return LEGACY_DEFAULT_STREAM -cdef inline int Stream_ensure_ctx(Stream self) except?-1 nogil: - """Ensure the stream's context handle is populated.""" +cdef inline bint Stream_is_default_token(Stream self) noexcept nogil: + """Return True for CU_STREAM_LEGACY and CU_STREAM_PER_THREAD. + + These tokens carry no context of their own; they refer to whatever context + is current, so nothing resolved from one may be cached on the object. + """ + cdef uintptr_t h = as_cu(self._h_stream) + return h == cydriver.CU_STREAM_LEGACY or h == cydriver.CU_STREAM_PER_THREAD + + +cdef inline int Stream_get_ctx(Stream self, ContextHandle* h_context) except?-1 nogil: + """Resolve the stream's context handle into ``h_context``.""" cdef cydriver.CUcontext ctx - if not self._h_context: - self._h_context = get_stream_context(self._h_stream) - if self._h_context: + cdef bint is_default = Stream_is_default_token(self) + + # Default-stream tokens must never reuse a sticky object field, even if + # something else populated ``_h_context`` (defense in depth for #2485). + if self._h_context and not is_default: + h_context[0] = self._h_context return 0 - HANDLE_RETURN(cydriver.cuStreamGetCtx(as_cu(self._h_stream), &ctx)) - if ctx != NULL: - with gil: - self._h_context = create_context_handle_ref(ctx) + + h_context[0] = get_stream_context(self._h_stream) + if not h_context[0]: + HANDLE_RETURN(cydriver.cuStreamGetCtx(as_cu(self._h_stream), &ctx)) + if ctx != NULL: + with gil: + h_context[0] = create_context_handle_ref(ctx) + + if h_context[0] and not is_default: + self._h_context = h_context[0] return 0 -cdef inline int Stream_ensure_ctx_device(Stream self) except?-1: - """Ensure the stream's context and device_id are populated.""" +cdef inline int Stream_get_ctx_device(Stream self, ContextHandle* h_context, int* device_id) except?-1: + """Resolve the stream's context handle and device ID.""" cdef cydriver.CUcontext ctx cdef cydriver.CUdevice target_dev cdef ContextHandle current_context cdef bint switch_context + cdef bint is_default = Stream_is_default_token(self) - if self._device_id < 0: - with nogil: + with nogil: + Stream_get_ctx(self, h_context) + if self._device_id >= 0 and not is_default: + device_id[0] = self._device_id + else: # Get device ID from context, switching context temporarily if needed - Stream_ensure_ctx(self) current_context = get_current_context() - switch_context = (as_cu(current_context) != as_cu(self._h_context)) + switch_context = (as_cu(current_context) != as_cu(h_context[0])) if switch_context: - HANDLE_RETURN(cydriver.cuCtxPushCurrent(as_cu(self._h_context))) + HANDLE_RETURN(cydriver.cuCtxPushCurrent(as_cu(h_context[0]))) HANDLE_RETURN(cydriver.cuCtxGetDevice(&target_dev)) if switch_context: HANDLE_RETURN(cydriver.cuCtxPopCurrent(&ctx)) - self._device_id = target_dev + device_id[0] = target_dev + if not is_default: + self._device_id = device_id[0] return 0 diff --git a/cuda_core/cuda/core/_tensor_bridge.pyx b/cuda_core/cuda/core/_tensor_bridge.pyx index dd41c77c051..c7a6743213c 100644 --- a/cuda_core/cuda/core/_tensor_bridge.pyx +++ b/cuda_core/cuda/core/_tensor_bridge.pyx @@ -361,9 +361,7 @@ def view_as_torch_tensor( cdef int32_t dtype_code cdef int32_t device_type, device_index cdef StridedMemoryView buf - cdef int itemsize cdef intptr_t _stream_ptr_int - cdef _StridedLayout layout # Note: we intentionally skip PyTorch's Python-level __dlpack__ guards # (requires_grad, is_conj, is_neg, non-strided layout, wrong-device) @@ -436,8 +434,8 @@ def view_as_torch_tensor( # Build _StridedLayout. init_from_ptr copies shape/strides so we are # safe even though they are borrowed pointers. - itemsize = _get_aoti_itemsize(dtype_code) - layout = _StridedLayout.__new__(_StridedLayout) + cdef int itemsize = _get_aoti_itemsize(dtype_code) + cdef _StridedLayout layout = _StridedLayout.__new__(_StridedLayout) layout.init_from_ptr( ndim, sizes_ptr, diff --git a/cuda_core/cuda/core/_tensor_map.pyi b/cuda_core/cuda/core/_tensor_map.pyi index 986ab41549f..c6a18ad2399 100644 --- a/cuda_core/cuda/core/_tensor_map.pyi +++ b/cuda_core/cuda/core/_tensor_map.pyi @@ -284,6 +284,7 @@ class TensorMapDescriptor: def __repr__(self) -> str: ... +__all__ = ['TensorMapDescriptor', 'TensorMapDescriptorOptions'] _TMA_DT_UINT8 = int(cydriver.CU_TENSOR_MAP_DATA_TYPE_UINT8) _TMA_DT_UINT16 = int(cydriver.CU_TENSOR_MAP_DATA_TYPE_UINT16) _TMA_DT_UINT32 = int(cydriver.CU_TENSOR_MAP_DATA_TYPE_UINT32) diff --git a/cuda_core/cuda/core/_tensor_map.pyx b/cuda_core/cuda/core/_tensor_map.pyx index 7e059fe7b98..46c2fa93152 100644 --- a/cuda_core/cuda/core/_tensor_map.pyx +++ b/cuda_core/cuda/core/_tensor_map.pyx @@ -47,6 +47,8 @@ try: except ImportError: ml_bfloat16 = None +__all__ = ['TensorMapDescriptor', 'TensorMapDescriptorOptions'] + class TensorMapDataType(enum.IntEnum): """Data types for tensor map descriptors. @@ -485,7 +487,6 @@ cdef class TensorMapDescriptor: cdef int _check_context_compat(self) except -1: cdef cydriver.CUcontext current_ctx cdef cydriver.CUdevice current_dev - cdef int current_dev_id if self._context == 0 and self._device_id < 0: return 0 with nogil: @@ -497,7 +498,7 @@ cdef class TensorMapDescriptor: "TensorMapDescriptor was created in a different CUDA context") with nogil: HANDLE_RETURN(cydriver.cuCtxGetDevice(¤t_dev)) - current_dev_id = current_dev + cdef int current_dev_id = current_dev if self._device_id >= 0 and current_dev_id != self._device_id: raise RuntimeError( f"TensorMapDescriptor belongs to device {self._device_id}, " diff --git a/cuda_core/cuda/core/_utils/_weak_handles.pyi b/cuda_core/cuda/core/_utils/_weak_handles.pyi index 3cf095d7b87..5b7913e008a 100644 --- a/cuda_core/cuda/core/_utils/_weak_handles.pyi +++ b/cuda_core/cuda/core/_utils/_weak_handles.pyi @@ -43,8 +43,9 @@ class WeakHandle: def weak_handle(obj): """Return a :class:`WeakHandle` observing the resource behind ``obj``. - Currently supports :class:`~cuda.core.Buffer` (device allocation handle). - See the module docstring for how to add more types. + Currently supports :class:`~cuda.core.Buffer` (allocation handle) and + :class:`~cuda.core.graph.GraphDefinition` (graph hierarchy handle). See + the module docstring for how to add more types. Raises ------ diff --git a/cuda_core/cuda/core/_utils/_weak_handles.pyx b/cuda_core/cuda/core/_utils/_weak_handles.pyx index 65737b958a6..d9f71e36772 100644 --- a/cuda_core/cuda/core/_utils/_weak_handles.pyx +++ b/cuda_core/cuda/core/_utils/_weak_handles.pyx @@ -23,6 +23,7 @@ Python owners via ``make_opaque_py`` are not covered here -- use """ from cuda.core._memory._buffer cimport Buffer +from cuda.core.graph._graph_definition cimport GraphDefinition from cuda.core._resource_handles cimport OpaqueHandle @@ -85,11 +86,19 @@ cdef WeakHandle _weak_from_buffer(Buffer buf): return _weak_from_opaque(h) +cdef WeakHandle _weak_from_graph_definition(GraphDefinition graph): + cdef OpaqueHandle h = graph._h_graph + if not h: + raise ValueError("GraphDefinition has no active graph") + return _weak_from_opaque(h) + + def weak_handle(obj): """Return a :class:`WeakHandle` observing the resource behind ``obj``. - Currently supports :class:`~cuda.core.Buffer` (device allocation handle). - See the module docstring for how to add more types. + Currently supports :class:`~cuda.core.Buffer` (allocation handle) and + :class:`~cuda.core.graph.GraphDefinition` (graph hierarchy handle). See + the module docstring for how to add more types. Raises ------ @@ -100,7 +109,9 @@ def weak_handle(obj): """ if isinstance(obj, Buffer): return _weak_from_buffer(obj) + if isinstance(obj, GraphDefinition): + return _weak_from_graph_definition(obj) raise TypeError( f"weak_handle() does not support {type(obj).__name__!r}; " - "supported types: Buffer" + "supported types: Buffer, GraphDefinition" ) diff --git a/cuda_core/cuda/core/_utils/enum_explanations_helpers.py b/cuda_core/cuda/core/_utils/enum_explanations_helpers.py index 0dbe6d6bb60..6b666f4536c 100644 --- a/cuda_core/cuda/core/_utils/enum_explanations_helpers.py +++ b/cuda_core/cuda/core/_utils/enum_explanations_helpers.py @@ -31,6 +31,18 @@ _ExplanationTableLoader = Callable[[], _ExplanationTable] +def _parse_version_triple(version_str: str) -> tuple[int, int, int]: + """Parse a PEP 440 version string into a (major, minor, patch) triple. + + Strips local-version identifiers and handles pre-release suffixes such as + ``0b1`` or ``0rc1`` by extracting only the leading integer from each + release segment. + """ + parts = version_str.partition("+")[0].split(".")[:3] + ints = ([int(m.group(1)) if (m := re.match(r"(\d+)", v)) else 0 for v in parts] + [0, 0, 0])[:3] + return (ints[0], ints[1], ints[2]) + + # ``version.pyx`` cannot be reused here (circular import via ``cuda_utils``). def _binding_version() -> tuple[int, int, int]: """Return the installed ``cuda-bindings`` version, or a conservative old value.""" @@ -38,10 +50,7 @@ def _binding_version() -> tuple[int, int, int]: version = importlib.metadata.version("cuda-bindings") except importlib.metadata.PackageNotFoundError: return (0, 0, 0) # For very old versions of cuda-python - - parts = version.partition("+")[0].split(".")[:3] - parts_int = ([int(v) for v in parts] + [0, 0, 0])[:3] - return (parts_int[0], parts_int[1], parts_int[2]) + return _parse_version_triple(version) def _binding_version_has_usable_enum_docstrings(version: tuple[int, int, int]) -> bool: diff --git a/cuda_core/cuda/core/_utils/version.pyi b/cuda_core/cuda/core/_utils/version.pyi index bb7f0129917..a577e037bf7 100644 --- a/cuda_core/cuda/core/_utils/version.pyi +++ b/cuda_core/cuda/core/_utils/version.pyi @@ -5,6 +5,14 @@ from __future__ import annotations import functools +def _parse_version_triple(version_str: str) -> tuple[int, int, int]: + """Parse a PEP 440 version string into a (major, minor, patch) triple. + + Strips local-version identifiers and handles pre-release suffixes such as + ``0b1`` or ``0rc1`` by extracting only the leading integer from each + release segment. + """ + @functools.cache def binding_version() -> tuple[int, int, int]: """Return the cuda-bindings version as a (major, minor, patch) triple.""" diff --git a/cuda_core/cuda/core/_utils/version.pyx b/cuda_core/cuda/core/_utils/version.pyx index 09ea5852421..ed4c93c0262 100644 --- a/cuda_core/cuda/core/_utils/version.pyx +++ b/cuda_core/cuda/core/_utils/version.pyx @@ -4,18 +4,31 @@ import functools import importlib.metadata +import re from cuda.core._utils.cuda_utils import driver, handle_return +def _parse_version_triple(version_str: str) -> tuple[int, int, int]: + """Parse a PEP 440 version string into a (major, minor, patch) triple. + + Strips local-version identifiers and handles pre-release suffixes such as + ``0b1`` or ``0rc1`` by extracting only the leading integer from each + release segment. + """ + parts = version_str.partition("+")[0].split(".")[:3] + ints = ([int(m.group(1)) if (m := re.match(r"(\d+)", v)) else 0 for v in parts] + [0, 0, 0])[:3] + return (ints[0], ints[1], ints[2]) + + @functools.cache def binding_version() -> tuple[int, int, int]: """Return the cuda-bindings version as a (major, minor, patch) triple.""" try: - parts = importlib.metadata.version("cuda-bindings").split(".")[:3] + version_str = importlib.metadata.version("cuda-bindings") except importlib.metadata.PackageNotFoundError: - parts = importlib.metadata.version("cuda-python").split(".")[:3] - return tuple(int(v) for v in parts) + version_str = importlib.metadata.version("cuda-python") + return _parse_version_triple(version_str) @functools.cache diff --git a/cuda_core/cuda/core/graph/__init__.pxd b/cuda_core/cuda/core/graph/__init__.pxd index f367745acc1..a018340d20d 100644 --- a/cuda_core/cuda/core/graph/__init__.pxd +++ b/cuda_core/cuda/core/graph/__init__.pxd @@ -11,6 +11,14 @@ from cuda.core.graph._subclasses cimport ( EmptyNode, EventRecordNode, EventWaitNode, + ExecutableChildGraphNode, + ExecutableEventRecordNode, + ExecutableEventWaitNode, + ExecutableGraphNode, + ExecutableHostCallbackNode, + ExecutableKernelNode, + ExecutableMemcpyNode, + ExecutableMemsetNode, FreeNode, HostCallbackNode, IfElseNode, diff --git a/cuda_core/cuda/core/graph/__init__.py b/cuda_core/cuda/core/graph/__init__.py index e1091114368..507888321ea 100644 --- a/cuda_core/cuda/core/graph/__init__.py +++ b/cuda_core/cuda/core/graph/__init__.py @@ -2,7 +2,19 @@ # # SPDX-License-Identifier: Apache-2.0 +from . import _graph_builder, _graph_definition, _graph_node, _subclasses from ._graph_builder import * from ._graph_definition import * from ._graph_node import * from ._subclasses import * + +# Aggregate the star-imported submodule exports so ``cuda.core.graph`` carries +# an explicit ``__all__`` derived from its parts (no manual list to drift). +__all__ = [ + *_graph_builder.__all__, + *_graph_definition.__all__, + *_graph_node.__all__, + *_subclasses.__all__, +] + +del _graph_builder, _graph_definition, _graph_node, _subclasses diff --git a/cuda_core/cuda/core/graph/_adjacency_set_proxy.pyx b/cuda_core/cuda/core/graph/_adjacency_set_proxy.pyx index e1762321ce0..971e418a428 100644 --- a/cuda_core/cuda/core/graph/_adjacency_set_proxy.pyx +++ b/cuda_core/cuda/core/graph/_adjacency_set_proxy.pyx @@ -144,20 +144,23 @@ cdef class _AdjacencySetCore: cdef cydriver.CUgraphNode c_node = as_cu(self._h_node) if c_node == NULL: return [] - cdef cydriver.CUgraphNode buf[16] - cdef size_t count = 16 + cdef cydriver.CUgraphNode stack_buf[16] + cdef cydriver.CUgraphNode* nodes + cdef size_t count = 0 cdef size_t i with nogil: - HANDLE_RETURN(self._query_fn(c_node, buf, &count)) - if count <= 16: - return [GraphNode._create(self._h_graph, buf[i]) - for i in range(count)] + HANDLE_RETURN(self._query_fn(c_node, NULL, &count)) + if count == 0: + return [] cdef vector[cydriver.CUgraphNode] nodes_vec - nodes_vec.resize(count) + if count <= 16: + nodes = stack_buf + else: + nodes_vec.resize(count) + nodes = nodes_vec.data() with nogil: - HANDLE_RETURN(self._query_fn( - c_node, nodes_vec.data(), &count)) - return [GraphNode._create(self._h_graph, nodes_vec[i]) + HANDLE_RETURN(self._query_fn(c_node, nodes, &count)) + return [GraphNode._create(self._h_graph, nodes[i]) for i in range(count)] cdef bint contains(self, GraphNode other): @@ -165,27 +168,24 @@ cdef class _AdjacencySetCore: cdef cydriver.CUgraphNode target = as_cu(other._h_node) if c_node == NULL or target == NULL: return False - cdef cydriver.CUgraphNode buf[16] - cdef size_t count = 16 + cdef cydriver.CUgraphNode stack_buf[16] + cdef cydriver.CUgraphNode* nodes + cdef size_t count = 0 cdef size_t i with nogil: - HANDLE_RETURN(self._query_fn(c_node, buf, &count)) - - # Fast path for small sets. - if count <= 16: - for i in range(count): - if buf[i] == target: - return True + HANDLE_RETURN(self._query_fn(c_node, NULL, &count)) + if count == 0: return False - - # Fallback for large sets. cdef vector[cydriver.CUgraphNode] nodes_vec - nodes_vec.resize(count) + if count <= 16: + nodes = stack_buf + else: + nodes_vec.resize(count) + nodes = nodes_vec.data() with nogil: - HANDLE_RETURN(self._query_fn(c_node, nodes_vec.data(), &count)) - assert count == nodes_vec.size() + HANDLE_RETURN(self._query_fn(c_node, nodes, &count)) for i in range(count): - if nodes_vec[i] == target: + if nodes[i] == target: return True return False diff --git a/cuda_core/cuda/core/graph/_graph_builder.pxd b/cuda_core/cuda/core/graph/_graph_builder.pxd index 660ebe8ec7d..eb75e6bd44a 100644 --- a/cuda_core/cuda/core/graph/_graph_builder.pxd +++ b/cuda_core/cuda/core/graph/_graph_builder.pxd @@ -24,4 +24,4 @@ cdef class Graph: object __weakref__ @staticmethod - cdef Graph _init(cydriver.CUgraphExec graph_exec) + cdef Graph _init(GraphExecHandle h_graph_exec) diff --git a/cuda_core/cuda/core/graph/_graph_builder.pyi b/cuda_core/cuda/core/graph/_graph_builder.pyi index 4fbc6fb3903..d238b419be1 100644 --- a/cuda_core/cuda/core/graph/_graph_builder.pyi +++ b/cuda_core/cuda/core/graph/_graph_builder.pyi @@ -7,6 +7,8 @@ from dataclasses import dataclass from cuda.core._stream import Stream from cuda.core._utils.cuda_utils import driver from cuda.core.graph._graph_definition import GraphCondition, GraphDefinition +from cuda.core.graph._graph_node import GraphNode +from cuda.core.graph._subclasses import ExecutableGraphNode _BuilderKind = int _CaptureState = int @@ -407,10 +409,12 @@ class GraphBuilder: - **Python callable**: Pass any callable. The GIL is acquired automatically. The callable must take no arguments; use closures or ``functools.partial`` to bind state. - - **ctypes function pointer**: Pass a ``ctypes.CFUNCTYPE`` instance. - The function receives a single ``void*`` argument (the - ``user_data``). The caller must keep the ctypes wrapper alive - for the lifetime of the graph. + - **ctypes function pointer**: The function receives a single + ``void*`` argument (the ``user_data``), and the caller must keep + the ctypes wrapper alive for the lifetime of the graph. Its + declared prototype must match the driver's ``CUhostFn`` + (``void (*)(void*)``): ``ctypes.CFUNCTYPE(None, ctypes.c_void_p)``, + or ``ctypes.WINFUNCTYPE(None, ctypes.c_void_p)`` on Windows. .. warning:: @@ -430,6 +434,14 @@ class GraphBuilder: Only for ctypes function pointers. If ``int``, passed as a raw pointer (caller manages lifetime). If bytes-like, the data is copied and its lifetime is tied to the graph. + + Raises + ------ + TypeError + If ``fn`` is a ctypes function pointer whose declared prototype + does not match ``CUhostFn``. + ValueError + If ``user_data`` is given for a Python callable. """ class Graph: @@ -460,6 +472,15 @@ class Graph: """ + def __getitem__(self, node: GraphNode) -> ExecutableGraphNode: + """Return a view for updating *node* in this executable graph. + + *node* is a definition node from the graph used to instantiate this + executable. Call ``update()`` on the returned view to replace that + node's parameters for future launches. Kernel, memcpy, and memset + views also support enabling and disabling the node. + """ + def update(self, source: 'GraphBuilder | GraphDefinition') -> None: """Update the graph using a new graph definition. @@ -494,7 +515,7 @@ class Graph: """ __all__ = ['Graph', 'GraphBuilder', 'GraphCompleteOptions', 'GraphDebugPrintOptions'] -def _instantiate_graph(h_graph, options: GraphCompleteOptions | None=None) -> Graph: +def _instantiate_graph(source, options: GraphCompleteOptions | None=None) -> Graph: ... def _capture_callback_with_tail_failure_for_testing(gb: GraphBuilder, fn, *, user_data=None): diff --git a/cuda_core/cuda/core/graph/_graph_builder.pyx b/cuda_core/cuda/core/graph/_graph_builder.pyx index 3f5b57060b6..d3053a7261e 100644 --- a/cuda_core/cuda/core/graph/_graph_builder.pyx +++ b/cuda_core/cuda/core/graph/_graph_builder.pyx @@ -10,15 +10,23 @@ from libc.stdint cimport intptr_t from cuda.bindings cimport cydriver from cuda.core.graph._graph_definition cimport GraphCondition, GraphDefinition +from cuda.core.graph._graph_node cimport GraphNode from cuda.core.graph._host_callback cimport _resolve_host_callback +from cuda.core.graph._subclasses cimport ( + ExecutableGraphNode, + create_executable_node_view, +) from cuda.core._resource_handles cimport ( + GraphExecHandle, GraphHandle, OpaqueHandle, PreparedAttachment, as_cu, as_py, create_child_graph_handle, create_graph_exec_handle, create_graph_handle, + get_last_error, graph_clone_attachments, graph_commit_attachment, + graph_exec_update, graph_prepare_attachment, invalidate_child_graph_state, retry_deferred_cleanup, @@ -161,26 +169,40 @@ class GraphCompleteOptions: use_node_priority: bool = False -def _instantiate_graph(h_graph, options: GraphCompleteOptions | None = None) -> Graph: - cdef cydriver.CUgraphExec c_exec - params = driver.CUDA_GRAPH_INSTANTIATE_PARAMS() +def _instantiate_graph(source, options: GraphCompleteOptions | None = None) -> Graph: + cdef GraphHandle h_graph + cdef GraphExecHandle h_exec + + if isinstance(source, GraphBuilder): + h_graph = (source)._h_graph + elif isinstance(source, GraphDefinition): + h_graph = (source)._h_graph + else: + raise TypeError( + f"expected GraphBuilder or GraphDefinition, got {type(source).__name__}") + + cdef cydriver.CUDA_GRAPH_INSTANTIATE_PARAMS params = cydriver.CUDA_GRAPH_INSTANTIATE_PARAMS( + flags=0, + hUploadStream=NULL, + hErrNode_out=NULL, + result_out=cydriver.CUgraphInstantiateResult.CUDA_GRAPH_INSTANTIATE_SUCCESS, + ) if options: flags = 0 if options.auto_free_on_launch: flags |= driver.CUgraphInstantiate_flags.CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH if options.upload_stream: flags |= driver.CUgraphInstantiate_flags.CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD - params.hUploadStream = options.upload_stream.handle + params.hUploadStream = as_cu((options.upload_stream)._h_stream) if options.device_launch: flags |= driver.CUgraphInstantiate_flags.CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH if options.use_node_priority: flags |= driver.CUgraphInstantiate_flags.CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY params.flags = flags - py_exec = handle_return(driver.cuGraphInstantiateWithParams(h_graph, params)) - # Check result_out before wrapping the exec: on a non-SUCCESS result the exec - # may be invalid, and Graph._init's RAII deleter would call cuGraphExecDestroy - # on it during the exception unwind below. + # The exec is adopted only when result_out reports success, so the + # diagnostics below run before the handle is checked. + h_exec = create_graph_exec_handle(h_graph, ¶ms) if params.result_out == driver.CUgraphInstantiateResult.CUDA_GRAPH_INSTANTIATE_ERROR: raise RuntimeError( "Instantiation failed for an unexpected reason which is described in the return value of the function." @@ -201,8 +223,9 @@ def _instantiate_graph(h_graph, options: GraphCompleteOptions | None = None) -> elif params.result_out != driver.CUgraphInstantiateResult.CUDA_GRAPH_INSTANTIATE_SUCCESS: raise RuntimeError(f"Graph instantiation failed with unexpected error code: {params.result_out}") - c_exec = int(py_exec) - return Graph._init(c_exec) + if as_cu(h_exec) == NULL: + HANDLE_RETURN(get_last_error()) + return Graph._init(h_exec) # Distinguishes the three kinds of GraphBuilder, which differ in how they @@ -474,7 +497,7 @@ cdef class GraphBuilder: if self._state != CAPTURE_ENDED: raise RuntimeError("Graph has not finished building.") - return _instantiate_graph(as_py(self._h_graph), options) + return _instantiate_graph(self, options) def debug_dot_print(self, path: str, options: GraphDebugPrintOptions | None = None) -> None: """Generates a DOT debug file for the graph builder. @@ -837,10 +860,12 @@ cdef class GraphBuilder: - **Python callable**: Pass any callable. The GIL is acquired automatically. The callable must take no arguments; use closures or ``functools.partial`` to bind state. - - **ctypes function pointer**: Pass a ``ctypes.CFUNCTYPE`` instance. - The function receives a single ``void*`` argument (the - ``user_data``). The caller must keep the ctypes wrapper alive - for the lifetime of the graph. + - **ctypes function pointer**: The function receives a single + ``void*`` argument (the ``user_data``), and the caller must keep + the ctypes wrapper alive for the lifetime of the graph. Its + declared prototype must match the driver's ``CUhostFn`` + (``void (*)(void*)``): ``ctypes.CFUNCTYPE(None, ctypes.c_void_p)``, + or ``ctypes.WINFUNCTYPE(None, ctypes.c_void_p)`` on Windows. .. warning:: @@ -860,6 +885,14 @@ cdef class GraphBuilder: Only for ctypes function pointers. If ``int``, passed as a raw pointer (caller manages lifetime). If bytes-like, the data is copied and its lifetime is tied to the graph. + + Raises + ------ + TypeError + If ``fn`` is a ctypes function pointer whose declared prototype + does not match ``CUhostFn``. + ValueError + If ``user_data`` is given for a Python callable. """ GB_callback(self, fn, user_data, False) @@ -1060,9 +1093,9 @@ cdef class Graph: raise RuntimeError("directly constructing a Graph instance is not supported") @staticmethod - cdef Graph _init(cydriver.CUgraphExec graph_exec): + cdef Graph _init(GraphExecHandle h_graph_exec): cdef Graph self = Graph.__new__(Graph) - self._h_graph_exec = create_graph_exec_handle(graph_exec) + self._h_graph_exec = h_graph_exec return self def close(self) -> None: @@ -1082,6 +1115,17 @@ cdef class Graph: """ return as_py(self._h_graph_exec) + def __getitem__(self, node: GraphNode) -> ExecutableGraphNode: + """Return a view for updating *node* in this executable graph. + + *node* is a definition node from the graph used to instantiate this + executable. Call ``update()`` on the returned view to replace that + node's parameters for future launches. Kernel, memcpy, and memset + views also support enabling and disabling the node. + """ + return create_executable_node_view( + self._h_graph_exec, node) + def update(self, source: "GraphBuilder | GraphDefinition") -> None: """Update the graph using a new graph definition. @@ -1094,27 +1138,23 @@ cdef class Graph: finished building. """ - from cuda.core.graph import GraphDefinition - - cdef cydriver.CUgraph cu_graph - cdef cydriver.CUgraphExec cu_exec = as_cu(self._h_graph_exec) + cdef GraphHandle h_source if isinstance(source, GraphBuilder): if (source)._state == CLOSED: raise ValueError("Source graph builder has been closed.") if (source)._state != CAPTURE_ENDED: raise ValueError("Graph has not finished building.") - cu_graph = as_cu((source)._h_graph) + h_source = (source)._h_graph elif isinstance(source, GraphDefinition): - cu_graph = int(source.handle) + h_source = (source)._h_graph else: raise TypeError( f"expected GraphBuilder or GraphDefinition, got {type(source).__name__}") cdef cydriver.CUgraphExecUpdateResultInfo result_info - cdef cydriver.CUresult err - with nogil: - err = cydriver.cuGraphExecUpdate(cu_exec, cu_graph, &result_info) + cdef cydriver.CUresult err = graph_exec_update( + self._h_graph_exec, h_source, &result_info) if err == cydriver.CUresult.CUDA_ERROR_GRAPH_EXEC_UPDATE_FAILURE: reason = driver.CUgraphExecUpdateResult(result_info.result) msg = f"Graph update failed: {reason.__doc__.strip()} ({reason.name})" diff --git a/cuda_core/cuda/core/graph/_graph_definition.pyx b/cuda_core/cuda/core/graph/_graph_definition.pyx index b2516034d61..e4bed7eef15 100644 --- a/cuda_core/cuda/core/graph/_graph_definition.pyx +++ b/cuda_core/cuda/core/graph/_graph_definition.pyx @@ -327,8 +327,7 @@ cdef class GraphDefinition: """ from cuda.core.graph._graph_builder import _instantiate_graph - return _instantiate_graph( - driver.CUgraph(as_intptr(self._h_graph)), options) + return _instantiate_graph(self, options) def debug_dot_print(self, path: str, options: GraphDebugPrintOptions | None = None) -> None: """Write a GraphViz DOT representation of the graph to a file. @@ -362,19 +361,17 @@ cdef class GraphDefinition: All nodes in the graph. """ cdef vector[cydriver.CUgraphNode] nodes_vec - nodes_vec.resize(128) - cdef size_t num_nodes = 128 + cdef size_t num_nodes = 0 with nogil: - HANDLE_RETURN(cydriver.cuGraphGetNodes(as_cu(self._h_graph), nodes_vec.data(), &num_nodes)) + HANDLE_RETURN(cydriver.cuGraphGetNodes(as_cu(self._h_graph), NULL, &num_nodes)) if num_nodes == 0: return set() - if num_nodes > 128: - nodes_vec.resize(num_nodes) - with nogil: - HANDLE_RETURN(cydriver.cuGraphGetNodes(as_cu(self._h_graph), nodes_vec.data(), &num_nodes)) + nodes_vec.resize(num_nodes) + with nogil: + HANDLE_RETURN(cydriver.cuGraphGetNodes(as_cu(self._h_graph), nodes_vec.data(), &num_nodes)) return {GraphNode._create(self._h_graph, nodes_vec[i]) for i in range(num_nodes)} @@ -389,31 +386,28 @@ cdef class GraphDefinition: """ cdef vector[cydriver.CUgraphNode] from_nodes cdef vector[cydriver.CUgraphNode] to_nodes - from_nodes.resize(128) - to_nodes.resize(128) - cdef size_t num_edges = 128 + cdef size_t num_edges = 0 with nogil: IF CUDA_CORE_BUILD_MAJOR >= 13: HANDLE_RETURN(cydriver.cuGraphGetEdges( - as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), NULL, &num_edges)) + as_cu(self._h_graph), NULL, NULL, NULL, &num_edges)) ELSE: HANDLE_RETURN(cydriver.cuGraphGetEdges( - as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), &num_edges)) + as_cu(self._h_graph), NULL, NULL, &num_edges)) if num_edges == 0: return set() - if num_edges > 128: - from_nodes.resize(num_edges) - to_nodes.resize(num_edges) - with nogil: - IF CUDA_CORE_BUILD_MAJOR >= 13: - HANDLE_RETURN(cydriver.cuGraphGetEdges( - as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), NULL, &num_edges)) - ELSE: - HANDLE_RETURN(cydriver.cuGraphGetEdges( - as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), &num_edges)) + from_nodes.resize(num_edges) + to_nodes.resize(num_edges) + with nogil: + IF CUDA_CORE_BUILD_MAJOR >= 13: + HANDLE_RETURN(cydriver.cuGraphGetEdges( + as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), NULL, &num_edges)) + ELSE: + HANDLE_RETURN(cydriver.cuGraphGetEdges( + as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), &num_edges)) return { (GraphNode._create(self._h_graph, from_nodes[i]), diff --git a/cuda_core/cuda/core/graph/_graph_node.pxd b/cuda_core/cuda/core/graph/_graph_node.pxd index 0a87b70ad62..2ad4851a54c 100644 --- a/cuda_core/cuda/core/graph/_graph_node.pxd +++ b/cuda_core/cuda/core/graph/_graph_node.pxd @@ -2,8 +2,10 @@ # # SPDX-License-Identifier: Apache-2.0 +from libc.stddef cimport size_t + from cuda.bindings cimport cydriver -from cuda.core._resource_handles cimport GraphHandle, GraphNodeHandle +from cuda.core._resource_handles cimport GraphHandle, GraphNodeHandle, OpaqueHandle cdef class GraphNode: @@ -13,3 +15,15 @@ cdef class GraphNode: @staticmethod cdef GraphNode _create(GraphHandle h_graph, cydriver.CUgraphNode node) + + +cdef OpaqueHandle _resolve_memcpy_operand( + object operand, object owner, str side, cydriver.CUdeviceptr* out_ptr) except * + +cdef cydriver.CUmemorytype _get_memcpy_memory_type( + cydriver.CUdeviceptr ptr) except * + +cdef void _init_memcpy_params( + cydriver.CUdeviceptr dst, cydriver.CUdeviceptr src, size_t size, + cydriver.CUDA_MEMCPY3D* params, cydriver.CUmemorytype* dst_type, + cydriver.CUmemorytype* src_type) except * diff --git a/cuda_core/cuda/core/graph/_graph_node.pyi b/cuda_core/cuda/core/graph/_graph_node.pyi index 23bcbf191a3..0e3cac045d2 100644 --- a/cuda_core/cuda/core/graph/_graph_node.pyi +++ b/cuda_core/cuda/core/graph/_graph_node.pyi @@ -94,6 +94,9 @@ class GraphNode: def launch(self, config: LaunchConfig, kernel: Kernel, *args) -> KernelNode: """Add a kernel launch node depending on this node. + Clustered and cooperative launch configurations are not currently + supported for graph kernel nodes. + .. warning:: Use caution when a retained kernel argument directly or indirectly @@ -330,10 +333,12 @@ class GraphNode: - **Python callable**: Pass any callable. The GIL is acquired automatically. The callable must take no arguments; use closures or ``functools.partial`` to bind state. - - **ctypes function pointer**: Pass a ``ctypes.CFUNCTYPE`` instance. - The function receives a single ``void*`` argument (the - ``user_data``). The caller must keep the ctypes wrapper alive - for the lifetime of the graph. + - **ctypes function pointer**: The function receives a single + ``void*`` argument (the ``user_data``), and the caller must keep + the ctypes wrapper alive for the lifetime of the graph. Its + declared prototype must match the driver's ``CUhostFn`` + (``void (*)(void*)``): ``ctypes.CFUNCTYPE(None, ctypes.c_void_p)``, + or ``ctypes.WINFUNCTYPE(None, ctypes.c_void_p)`` on Windows. .. warning:: @@ -358,6 +363,14 @@ class GraphNode: ------- HostCallbackNode A new HostCallbackNode representing the callback. + + Raises + ------ + TypeError + If ``fn`` is a ctypes function pointer whose declared prototype + does not match ``CUhostFn``. + ValueError + If ``user_data`` is given for a Python callable. """ def if_then(self, condition: GraphCondition) -> IfNode: diff --git a/cuda_core/cuda/core/graph/_graph_node.pyx b/cuda_core/cuda/core/graph/_graph_node.pyx index 9e1cab09e7b..2c9c07e6b3a 100644 --- a/cuda_core/cuda/core/graph/_graph_node.pyx +++ b/cuda_core/cuda/core/graph/_graph_node.pyx @@ -163,13 +163,11 @@ cdef class GraphNode: already-destroyed node (no-op). """ cdef cydriver.CUgraphNode node = as_cu(self._h_node) - cdef GraphHandle h_graph - cdef cydriver.CUresult cleanup_status cdef PreparedAttachment prepared if node == NULL: return - h_graph = graph_node_get_graph(self._h_node) + cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) # Allocate the cleanup transaction before asking CUDA to destroy the # node. A failed CUDA call leaves metadata and wrappers unchanged. HANDLE_RETURN(graph_prepare_attachment( @@ -178,7 +176,7 @@ cdef class GraphNode: HANDLE_RETURN(cydriver.cuGraphDestroyNode(node)) # Publish attachment removal before invalidating graph and node aliases. - cleanup_status = graph_commit_attachment(prepared, node) + cdef cydriver.CUresult cleanup_status = graph_commit_attachment(prepared, node) invalidate_child_graph_state(h_graph, node) _node_registry.pop(self._h_node.get(), None) invalidate_graph_node(self._h_node) @@ -209,6 +207,9 @@ cdef class GraphNode: def launch(self, config: LaunchConfig, kernel: Kernel, *args) -> KernelNode: """Add a kernel launch node depending on this node. + Clustered and cooperative launch configurations are not currently + supported for graph kernel nodes. + .. warning:: Use caution when a retained kernel argument directly or indirectly @@ -360,8 +361,8 @@ cdef class GraphNode: cdef cydriver.CUdeviceptr c_dst cdef unsigned int val cdef unsigned int elem_size - cdef OpaqueHandle dst_attachment_owner - dst_attachment_owner = _resolve_memcpy_operand(dst, dst_owner, "dst", &c_dst) + cdef OpaqueHandle dst_attachment_owner = _resolve_memcpy_operand( + dst, dst_owner, "dst", &c_dst) val, elem_size = _parse_fill_value(value) return GN_memset( self, c_dst, dst_attachment_owner, @@ -423,9 +424,10 @@ cdef class GraphNode: """ cdef cydriver.CUdeviceptr c_dst cdef cydriver.CUdeviceptr c_src - cdef OpaqueHandle dst_attachment_owner, src_attachment_owner - dst_attachment_owner = _resolve_memcpy_operand(dst, dst_owner, "dst", &c_dst) - src_attachment_owner = _resolve_memcpy_operand(src, src_owner, "src", &c_src) + cdef OpaqueHandle dst_attachment_owner = _resolve_memcpy_operand( + dst, dst_owner, "dst", &c_dst) + cdef OpaqueHandle src_attachment_owner = _resolve_memcpy_operand( + src, src_owner, "src", &c_src) return GN_memcpy( self, c_dst, dst_attachment_owner, c_src, src_attachment_owner, size) @@ -488,10 +490,12 @@ cdef class GraphNode: - **Python callable**: Pass any callable. The GIL is acquired automatically. The callable must take no arguments; use closures or ``functools.partial`` to bind state. - - **ctypes function pointer**: Pass a ``ctypes.CFUNCTYPE`` instance. - The function receives a single ``void*`` argument (the - ``user_data``). The caller must keep the ctypes wrapper alive - for the lifetime of the graph. + - **ctypes function pointer**: The function receives a single + ``void*`` argument (the ``user_data``), and the caller must keep + the ctypes wrapper alive for the lifetime of the graph. Its + declared prototype must match the driver's ``CUhostFn`` + (``void (*)(void*)``): ``ctypes.CFUNCTYPE(None, ctypes.c_void_p)``, + or ``ctypes.WINFUNCTYPE(None, ctypes.c_void_p)`` on Windows. .. warning:: @@ -516,6 +520,14 @@ cdef class GraphNode: ------- HostCallbackNode A new HostCallbackNode representing the callback. + + Raises + ------ + TypeError + If ``fn`` is a ctypes function pointer whose declared prototype + does not match ``CUhostFn``. + ValueError + If ``user_data`` is given for a Python callable. """ return GN_callback(self, fn, user_data) @@ -713,35 +725,40 @@ cdef inline GraphNode GN_create_impl(GraphNodeHandle h_node): cdef inline KernelNode GN_launch(GraphNode self, LaunchConfig conf, Kernel ker, ParamHolder ker_args): - cdef cydriver.CUDA_KERNEL_NODE_PARAMS node_params cdef cydriver.CUgraphNode new_node = NULL cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) cdef cydriver.CUgraphNode* deps = NULL cdef size_t num_deps = 0 - cdef OpaqueHandle kernel_owner, args_owner + cdef OpaqueHandle args_owner cdef PreparedAttachment prepared + if conf.cluster is not None or conf.is_cooperative: + raise NotImplementedError( + "clustered or cooperative graph kernel nodes are not supported") + if pred_node != NULL: deps = &pred_node num_deps = 1 - node_params.kern = as_cu(ker._h_kernel) - node_params.func = NULL - node_params.gridDimX = conf.grid[0] - node_params.gridDimY = conf.grid[1] - node_params.gridDimZ = conf.grid[2] - node_params.blockDimX = conf.block[0] - node_params.blockDimY = conf.block[1] - node_params.blockDimZ = conf.block[2] - node_params.sharedMemBytes = conf.shmem_size - node_params.kernelParams = (ker_args.ptr) - node_params.extra = NULL - node_params.ctx = NULL + cdef cydriver.CUDA_KERNEL_NODE_PARAMS node_params = cydriver.CUDA_KERNEL_NODE_PARAMS( + kern=as_cu(ker._h_kernel), + func=NULL, + gridDimX=conf.grid[0], + gridDimY=conf.grid[1], + gridDimZ=conf.grid[2], + blockDimX=conf.block[0], + blockDimY=conf.block[1], + blockDimZ=conf.block[2], + sharedMemBytes=conf.shmem_size, + kernelParams=(ker_args.ptr), + extra=NULL, + ctx=NULL, + ) # Keep the kernel and argument objects alive because CUDA copies argument # values but does not retain the resources they reference. - kernel_owner = ker._h_kernel + cdef OpaqueHandle kernel_owner = ker._h_kernel kernel_args = ker_args.kernel_args if kernel_args is not None: args_owner = make_opaque_py(kernel_args) @@ -881,15 +898,17 @@ cdef inline FreeNode GN_free(GraphNode self, cydriver.CUdeviceptr c_dptr): cdef inline OpaqueHandle _buffer_attachment_owner(Buffer buf, str label): """Copy a Buffer's device-pointer handle into an attachment owner.""" - cdef OpaqueHandle attachment_owner if not buf._h_ptr: raise ValueError(f"{label} Buffer has no active allocation") - attachment_owner = buf._h_ptr + # The local is required: Cython permits the DevicePtrHandle -> OpaqueHandle + # conversion on assignment, but not directly in a return statement. + cdef OpaqueHandle attachment_owner = buf._h_ptr return attachment_owner cdef inline OpaqueHandle _resolve_memcpy_operand( - object operand, object owner, str side, cydriver.CUdeviceptr* out_ptr): + object operand, object owner, str side, + cydriver.CUdeviceptr* out_ptr) except *: """Resolve an operand to a pointer and optional attachment owner. ``operand`` is a :class:`Buffer` or a raw integer address; its device @@ -928,7 +947,6 @@ cdef inline MemsetNode GN_memset( GraphNode self, cydriver.CUdeviceptr c_dst, OpaqueHandle dst_owner, unsigned int val, unsigned int elem_size, size_t width, size_t height, size_t pitch): - cdef cydriver.CUDA_MEMSET_NODE_PARAMS memset_params cdef cydriver.CUgraphNode new_node = NULL cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) @@ -944,13 +962,14 @@ cdef inline MemsetNode GN_memset( with nogil: HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) - c_memset(&memset_params, 0, sizeof(memset_params)) - memset_params.dst = c_dst - memset_params.value = val - memset_params.elementSize = elem_size - memset_params.width = width - memset_params.height = height - memset_params.pitch = pitch + cdef cydriver.CUDA_MEMSET_NODE_PARAMS memset_params = cydriver.CUDA_MEMSET_NODE_PARAMS( + dst=c_dst, + pitch=pitch, + value=val, + elementSize=elem_size, + width=width, + height=height, + ) if dst_owner: HANDLE_RETURN(graph_prepare_attachment( @@ -969,46 +988,52 @@ cdef inline MemsetNode GN_memset( val, elem_size, width, height, pitch)) -cdef inline MemcpyNode GN_memcpy( - GraphNode self, cydriver.CUdeviceptr c_dst, OpaqueHandle dst_owner, - cydriver.CUdeviceptr c_src, OpaqueHandle src_owner, size_t size): - cdef unsigned int dst_mem_type = cydriver.CU_MEMORYTYPE_DEVICE - cdef unsigned int src_mem_type = cydriver.CU_MEMORYTYPE_DEVICE +cdef cydriver.CUmemorytype _get_memcpy_memory_type( + cydriver.CUdeviceptr ptr) except *: + cdef unsigned int memory_type = cydriver.CU_MEMORYTYPE_DEVICE cdef cydriver.CUresult ret with nogil: ret = cydriver.cuPointerGetAttribute( - &dst_mem_type, - cydriver.CU_POINTER_ATTRIBUTE_MEMORY_TYPE, - c_dst) - if ret != cydriver.CUDA_SUCCESS and ret != cydriver.CUDA_ERROR_INVALID_VALUE: - HANDLE_RETURN(ret) - ret = cydriver.cuPointerGetAttribute( - &src_mem_type, + &memory_type, cydriver.CU_POINTER_ATTRIBUTE_MEMORY_TYPE, - c_src) - if ret != cydriver.CUDA_SUCCESS and ret != cydriver.CUDA_ERROR_INVALID_VALUE: - HANDLE_RETURN(ret) - - cdef cydriver.CUmemorytype c_dst_type = dst_mem_type - cdef cydriver.CUmemorytype c_src_type = src_mem_type - - cdef cydriver.CUDA_MEMCPY3D params - c_memset(¶ms, 0, sizeof(params)) - - params.srcMemoryType = c_src_type - params.dstMemoryType = c_dst_type - if c_src_type == cydriver.CU_MEMORYTYPE_HOST: - params.srcHost = c_src + ptr) + if ret != cydriver.CUDA_SUCCESS and ret != cydriver.CUDA_ERROR_INVALID_VALUE: + HANDLE_RETURN(ret) + return memory_type + + +cdef void _init_memcpy_params( + cydriver.CUdeviceptr dst, cydriver.CUdeviceptr src, size_t size, + cydriver.CUDA_MEMCPY3D* params, cydriver.CUmemorytype* dst_type, + cydriver.CUmemorytype* src_type) except *: + dst_type[0] = _get_memcpy_memory_type(dst) + src_type[0] = _get_memcpy_memory_type(src) + + c_memset(params, 0, sizeof(params[0])) + params.srcMemoryType = src_type[0] + params.dstMemoryType = dst_type[0] + if src_type[0] == cydriver.CU_MEMORYTYPE_HOST: + params.srcHost = src else: - params.srcDevice = c_src - if c_dst_type == cydriver.CU_MEMORYTYPE_HOST: - params.dstHost = c_dst + params.srcDevice = src + if dst_type[0] == cydriver.CU_MEMORYTYPE_HOST: + params.dstHost = dst else: - params.dstDevice = c_dst + params.dstDevice = dst params.WidthInBytes = size params.Height = 1 params.Depth = 1 + +cdef inline MemcpyNode GN_memcpy( + GraphNode self, cydriver.CUdeviceptr c_dst, OpaqueHandle dst_owner, + cydriver.CUdeviceptr c_src, OpaqueHandle src_owner, size_t size): + cdef cydriver.CUDA_MEMCPY3D params + cdef cydriver.CUmemorytype c_dst_type + cdef cydriver.CUmemorytype c_src_type + _init_memcpy_params( + c_dst, c_src, size, ¶ms, &c_dst_type, &c_src_type) + cdef cydriver.CUgraphNode new_node = NULL cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) @@ -1081,14 +1106,13 @@ cdef inline EventRecordNode GN_record_event(GraphNode self, Event ev): cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) cdef cydriver.CUgraphNode* deps = NULL cdef size_t num_deps = 0 - cdef OpaqueHandle owner cdef PreparedAttachment prepared if pred_node != NULL: deps = &pred_node num_deps = 1 - owner = ev._h_event + cdef OpaqueHandle owner = ev._h_event HANDLE_RETURN(graph_prepare_attachment( h_graph, owner, OpaqueHandle(), &prepared)) @@ -1108,14 +1132,13 @@ cdef inline EventWaitNode GN_wait_event(GraphNode self, Event ev): cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) cdef cydriver.CUgraphNode* deps = NULL cdef size_t num_deps = 0 - cdef OpaqueHandle owner cdef PreparedAttachment prepared if pred_node != NULL: deps = &pred_node num_deps = 1 - owner = ev._h_event + cdef OpaqueHandle owner = ev._h_event HANDLE_RETURN(graph_prepare_attachment( h_graph, owner, OpaqueHandle(), &prepared)) diff --git a/cuda_core/cuda/core/graph/_host_callback.pyi b/cuda_core/cuda/core/graph/_host_callback.pyi index 6c9d0ead317..1c642abf501 100644 --- a/cuda_core/cuda/core/graph/_host_callback.pyi +++ b/cuda_core/cuda/core/graph/_host_callback.pyi @@ -1,3 +1,19 @@ # This file was generated by stubgen-pyx v0.2.6 from cuda_core/cuda/core/graph/_host_callback.pyx -from __future__ import annotations \ No newline at end of file +from __future__ import annotations + +import sys + +_CUHOSTFN_HINT = 'ctypes.CFUNCTYPE(None, ctypes.c_void_p)' if sys.platform != 'win32' else 'ctypes.CFUNCTYPE(None, ctypes.c_void_p) or ctypes.WINFUNCTYPE(None, ctypes.c_void_p)' + +def _cuhostfn_type_error(detail): + """Build the rejection message for a non-conforming ctypes callback.""" + +def _validate_ctypes_host_callback(fn): + """Reject ctypes callbacks whose declared prototype is not CUhostFn. + + ``restype`` and ``argtypes`` are the prototype the caller declared, and are + what CUDA calls through. A function pointer taken from a shared library + keeps ctypes' defaults -- a ``c_int`` result and unspecified arguments -- + until the caller declares otherwise, so it must be declared to be accepted. + """ \ No newline at end of file diff --git a/cuda_core/cuda/core/graph/_host_callback.pyx b/cuda_core/cuda/core/graph/_host_callback.pyx index 27f251abeae..4fb48f0d6ec 100644 --- a/cuda_core/cuda/core/graph/_host_callback.pyx +++ b/cuda_core/cuda/core/graph/_host_callback.pyx @@ -14,9 +14,47 @@ from cuda.core._resource_handles cimport ( make_opaque_py, ) +import sys import ctypes as ct +# CUhostFn is `void (CUDA_CB *)(void*)`. CUDA_CB is __stdcall on Windows and +# empty elsewhere, but ctypes only honors that distinction when it builds a +# callback on 32-bit x86 Windows, which cuda.core does not support: on win-64 +# and ARM64 both CFUNCTYPE and WINFUNCTYPE produce a FFI_DEFAULT_ABI thunk. The +# declared result and argument types are all that remain worth checking. +_CUHOSTFN_HINT = ( + "ctypes.CFUNCTYPE(None, ctypes.c_void_p)" + if sys.platform != "win32" + else "ctypes.CFUNCTYPE(None, ctypes.c_void_p) or " + "ctypes.WINFUNCTYPE(None, ctypes.c_void_p)" +) + + +def _cuhostfn_type_error(detail): + """Build the rejection message for a non-conforming ctypes callback.""" + return TypeError( + f"host callback {detail}; CUDA requires a callback matching CUhostFn " + f"(void (*)(void*)), declared as {_CUHOSTFN_HINT}. " + "Alternatively, pass a Python callable." + ) + + +def _validate_ctypes_host_callback(fn): + """Reject ctypes callbacks whose declared prototype is not CUhostFn. + + ``restype`` and ``argtypes`` are the prototype the caller declared, and are + what CUDA calls through. A function pointer taken from a shared library + keeps ctypes' defaults -- a ``c_int`` result and unspecified arguments -- + until the caller declares otherwise, so it must be declared to be accepted. + """ + restype = fn.restype + argtypes = fn.argtypes + if restype is not None or argtypes is None or tuple(argtypes) != (ct.c_void_p,): + raise _cuhostfn_type_error( + f"has prototype restype={restype!r}, argtypes={argtypes!r}") + + cdef void _py_host_trampoline(void* data) noexcept with gil: (data)() @@ -36,8 +74,12 @@ cdef void _resolve_host_callback( ``cuGraphAddHostNode`` or ``cuLaunchHostFunc``. ``*out_fn_owner`` owns the callback object; ``*out_data_owner`` owns a copied ``user_data`` buffer and is left null otherwise. The caller attaches both owners to the graph node. + + ctypes callbacks are validated against the ``CUhostFn`` ABI before their + address is passed to CUDA. """ if isinstance(fn, ct._CFuncPtr): + _validate_ctypes_host_callback(fn) out_fn[0] = ct.cast(fn, ct.c_void_p).value if user_data is None: out_user_data[0] = NULL @@ -54,6 +96,9 @@ cdef void _resolve_host_callback( else: out_user_data[0] = NULL else: + if not callable(fn): + raise TypeError( + f"callback must be callable, got {type(fn).__name__}") if user_data is not None: raise ValueError( "user_data is only supported with ctypes function pointers") diff --git a/cuda_core/cuda/core/graph/_subclasses.pxd b/cuda_core/cuda/core/graph/_subclasses.pxd index 7f84b713429..7f92eafe7e8 100644 --- a/cuda_core/cuda/core/graph/_subclasses.pxd +++ b/cuda_core/cuda/core/graph/_subclasses.pxd @@ -7,7 +7,13 @@ from libc.stddef cimport size_t from cuda.bindings cimport cydriver from cuda.core.graph._graph_definition cimport GraphCondition from cuda.core.graph._graph_node cimport GraphNode -from cuda.core._resource_handles cimport EventHandle, GraphHandle, GraphNodeHandle, KernelHandle +from cuda.core._resource_handles cimport ( + EventHandle, + GraphExecHandle, + GraphHandle, + GraphNodeHandle, + KernelHandle, +) cdef class EmptyNode(GraphNode): @@ -172,3 +178,41 @@ cdef class WhileNode(ConditionalNode): cdef class SwitchNode(ConditionalNode): pass + + +cdef class ExecutableGraphNode: + cdef: + GraphExecHandle _h_graph_exec + GraphNodeHandle _h_node + + +cdef class ExecutableKernelNode(ExecutableGraphNode): + pass + + +cdef class ExecutableMemsetNode(ExecutableGraphNode): + pass + + +cdef class ExecutableMemcpyNode(ExecutableGraphNode): + pass + + +cdef class ExecutableChildGraphNode(ExecutableGraphNode): + pass + + +cdef class ExecutableEventRecordNode(ExecutableGraphNode): + pass + + +cdef class ExecutableEventWaitNode(ExecutableGraphNode): + pass + + +cdef class ExecutableHostCallbackNode(ExecutableGraphNode): + pass + + +cdef ExecutableGraphNode create_executable_node_view( + const GraphExecHandle& h_exec, GraphNode node) diff --git a/cuda_core/cuda/core/graph/_subclasses.pyi b/cuda_core/cuda/core/graph/_subclasses.pyi index 345e6417c4d..a68e500f7f2 100644 --- a/cuda_core/cuda/core/graph/_subclasses.pyi +++ b/cuda_core/cuda/core/graph/_subclasses.pyi @@ -5,6 +5,7 @@ from __future__ import annotations from cuda.core._event import Event from cuda.core._launch_config import LaunchConfig +from cuda.core._memory._buffer import Buffer from cuda.core._module import Kernel from cuda.core.graph._graph_definition import GraphCondition, GraphDefinition from cuda.core.graph._graph_node import GraphNode @@ -37,6 +38,21 @@ class KernelNode(GraphNode): def __repr__(self) -> str: ... + def update(self, *, config: LaunchConfig | None=None, kernel: Kernel | None=None, args=None) -> None: + """Replace selected kernel launch parameters. + + Omitted parameters preserve their current values. Changing ``kernel`` + requires ``args``, including ``args=()`` for a no-argument kernel. + Clustered and cooperative kernel nodes are not supported. + + .. warning:: + + Use caution when a retained kernel argument directly or indirectly + owns a graph. Any reference cycle involving the argument and a + graph that retains it cannot be broken by Python's cyclic garbage + collector. Use a weak reference to break such cycles. + """ + @property def grid(self) -> tuple[int, int, int]: """Grid dimensions as a 3-tuple (gridDimX, gridDimY, gridDimZ).""" @@ -139,6 +155,24 @@ class MemsetNode(GraphNode): def __repr__(self) -> str: ... + def update(self, *, dst: Buffer | int | None=None, value=None, width: int | None=None, height: int | None=None, pitch: int | None=None, dst_owner=None) -> None: + """Replace selected memset parameters. + + Omitted parameters preserve their current values. ``dst_owner`` may + only accompany a raw-address ``dst``. + + With CUDA 12.2 through 13.1, the node's intended CUDA context must be + current when this method is called. CUDA driver and ``cuda.bindings`` + versions 13.2 and newer preserve the recorded context automatically. + + .. warning:: + + Use caution when a retained operand owner directly or indirectly + owns a graph. Any reference cycle involving the owner and a graph + that retains it cannot be broken by Python's cyclic garbage + collector. Use a weak reference to break such cycles. + """ + @property def dptr(self) -> int: """The destination device pointer.""" @@ -179,6 +213,26 @@ class MemcpyNode(GraphNode): def __repr__(self) -> str: ... + def update(self, *, dst: Buffer | int | None=None, src: Buffer | int | None=None, size: int | None=None, dst_owner=None, src_owner=None) -> None: + """Replace selected memcpy parameters. + + Omitted parameters preserve their current values. ``dst_owner`` and + ``src_owner`` may only accompany their corresponding raw addresses. + Multidimensional, pitched, offset, and array-backed memcpy nodes are + not supported. + + With CUDA 12.2 through 13.1, the node's intended CUDA context must be + current when this method is called. CUDA driver and ``cuda.bindings`` + versions 13.2 and newer preserve the recorded context automatically. + + .. warning:: + + Use caution when a retained operand owner directly or indirectly + owns a graph. Any reference cycle involving the owner and a graph + that retains it cannot be broken by Python's cyclic garbage + collector. Use a weak reference to break such cycles. + """ + @property def dst(self) -> int: """The destination pointer.""" @@ -203,6 +257,12 @@ class ChildGraphNode(GraphNode): def __repr__(self) -> str: ... + def update(self, child: GraphDefinition) -> None: + """Replace the embedded graph with a clone of ``child``. + + ``child`` must belong to an independent graph hierarchy. + """ + @property def child_graph(self) -> GraphDefinition: """The embedded graph definition (non-owning wrapper).""" @@ -219,6 +279,9 @@ class EventRecordNode(GraphNode): def __repr__(self) -> str: ... + def update(self, event: Event) -> None: + """Replace the event recorded by this node.""" + @property def event(self) -> Event: """The event being recorded.""" @@ -235,6 +298,9 @@ class EventWaitNode(GraphNode): def __repr__(self) -> str: ... + def update(self, event: Event) -> None: + """Replace the event waited on by this node.""" + @property def event(self) -> Event: """The event being waited on.""" @@ -251,6 +317,25 @@ class HostCallbackNode(GraphNode): def __repr__(self) -> str: ... + def update(self, fn, *, user_data=None) -> None: + """Replace the callback and user-data binding for this node. + + ``fn`` accepts the same forms as :meth:`~graph.GraphNode.callback`: a + Python callable, or a ctypes function pointer whose declared prototype + matches ``CUhostFn`` (``void (*)(void*)``). A mismatched ctypes + prototype raises ``TypeError``. + + .. warning:: + + Callbacks must not call CUDA API functions. Doing so may + deadlock or corrupt driver state. + + Use caution when a Python callback retains an object that owns a + graph. Any reference cycle involving the callback and a graph that + retains it cannot be broken by Python's cyclic garbage collector. + Use a weak reference to break such cycles. + """ + @property def callback(self): """The Python callable, or None for ctypes function pointer callbacks.""" @@ -336,4 +421,105 @@ class SwitchNode(ConditionalNode): def __repr__(self) -> str: ... -__all__ = ['AllocNode', 'ChildGraphNode', 'ConditionalNode', 'EmptyNode', 'EventRecordNode', 'EventWaitNode', 'FreeNode', 'HostCallbackNode', 'IfElseNode', 'IfNode', 'KernelNode', 'MemcpyNode', 'MemsetNode', 'SwitchNode', 'WhileNode'] \ No newline at end of file + +class ExecutableGraphNode: + """A lightweight view pairing an executable graph with a source node. + + Create executable-node views with ``graph[node]``. CUDA validates that the + node identifies a node in the executable graph when an operation is + performed. + """ + + def __init__(self): + ... + + def __repr__(self) -> str: + ... + +class ExecutableKernelNode(ExecutableGraphNode): + """An executable kernel-node view.""" + + def update(self, *, config: LaunchConfig, kernel: Kernel, args) -> None: + """Replace all kernel launch parameters for future launches. + + ``args`` must contain the complete argument sequence; use ``args=()`` + for a no-argument kernel. Clustered and cooperative launch + configurations are not supported. + """ + + @property + def is_enabled(self) -> bool: + """Whether this node is enabled in the executable graph.""" + + def enable(self) -> None: + """Enable this node in the executable graph.""" + + def disable(self) -> None: + """Disable this node in the executable graph.""" + +class ExecutableMemsetNode(ExecutableGraphNode): + """An executable memset-node view.""" + + def update(self, *, dst: Buffer | int, value, width: int, height: int=1, pitch: int=0) -> None: + """Replace all memset parameters for future launches.""" + + @property + def is_enabled(self) -> bool: + """Whether this node is enabled in the executable graph.""" + + def enable(self) -> None: + """Enable this node in the executable graph.""" + + def disable(self) -> None: + """Disable this node in the executable graph.""" + +class ExecutableMemcpyNode(ExecutableGraphNode): + """An executable memcpy-node view.""" + + def update(self, *, dst: Buffer | int, src: Buffer | int, size: int) -> None: + """Replace all one-dimensional memcpy parameters for future launches.""" + + @property + def is_enabled(self) -> bool: + """Whether this node is enabled in the executable graph.""" + + def enable(self) -> None: + """Enable this node in the executable graph.""" + + def disable(self) -> None: + """Disable this node in the executable graph.""" + +class ExecutableChildGraphNode(ExecutableGraphNode): + """An executable child-graph-node view.""" + + def update(self, child: GraphDefinition) -> None: + """Replace the embedded graph parameters for future launches.""" + +class ExecutableEventRecordNode(ExecutableGraphNode): + """An executable event-record-node view.""" + + def update(self, event: Event) -> None: + """Replace the event recorded by future launches.""" + +class ExecutableEventWaitNode(ExecutableGraphNode): + """An executable event-wait-node view.""" + + def update(self, event: Event) -> None: + """Replace the event waited on by future launches.""" + +class ExecutableHostCallbackNode(ExecutableGraphNode): + """An executable host-callback-node view.""" + + def update(self, fn, *, user_data=None) -> None: + """Replace the callback and user-data binding for future launches. + + ``fn`` may be a Python callable, or a ctypes function pointer whose + declared prototype matches ``CUhostFn`` (``void (*)(void*)``); a + mismatched prototype raises ``TypeError``. + + .. warning:: + + Callbacks must not call CUDA API functions. Doing so may deadlock + or corrupt driver state. + """ +__all__ = ['AllocNode', 'ChildGraphNode', 'ConditionalNode', 'EmptyNode', 'EventRecordNode', 'EventWaitNode', 'ExecutableChildGraphNode', 'ExecutableEventRecordNode', 'ExecutableEventWaitNode', 'ExecutableGraphNode', 'ExecutableHostCallbackNode', 'ExecutableKernelNode', 'ExecutableMemcpyNode', 'ExecutableMemsetNode', 'FreeNode', 'HostCallbackNode', 'IfElseNode', 'IfNode', 'KernelNode', 'MemcpyNode', 'MemsetNode', 'SwitchNode', 'WhileNode'] \ No newline at end of file diff --git a/cuda_core/cuda/core/graph/_subclasses.pyx b/cuda_core/cuda/core/graph/_subclasses.pyx index 2fa08e2a6a1..79e302d59d5 100644 --- a/cuda_core/cuda/core/graph/_subclasses.pyx +++ b/cuda_core/cuda/core/graph/_subclasses.pyx @@ -8,29 +8,54 @@ from __future__ import annotations from libc.stddef cimport size_t from libc.stdint cimport uintptr_t +from libc.string cimport memset as c_memset from cuda.bindings cimport cydriver from cuda.core._event cimport Event +from cuda.core._kernel_arg_handler cimport ParamHolder from cuda.core._launch_config cimport LaunchConfig +from cuda.core._memory._buffer cimport Buffer from cuda.core._module cimport Kernel from cuda.core.graph._graph_definition cimport GraphCondition, GraphDefinition -from cuda.core.graph._graph_node cimport GraphNode +from cuda.core.graph._graph_node cimport ( + GraphNode, + _get_memcpy_memory_type, + _init_memcpy_params, + _resolve_memcpy_operand, +) from cuda.core._resource_handles cimport ( EventHandle, + GraphExecHandle, GraphHandle, - KernelHandle, GraphNodeHandle, + KernelHandle, + OpaqueHandle, + PreparedAttachment, + PreparedChildGraphUpdate, + PreparedExecAttachment, as_cu, as_intptr, - create_event_handle_ref, create_child_graph_handle, + create_event_handle_ref, create_kernel_handle_ref, + graph_commit_attachment, + graph_commit_child_graph_update, + graph_commit_exec_attachment, + graph_get_attachment, graph_node_get_graph, + graph_prepare_attachment, + graph_prepare_child_graph_update, + graph_prepare_exec_attachment, + make_opaque_py, ) -from cuda.core._utils.cuda_utils cimport HANDLE_RETURN +from cuda.core._utils.cuda_utils cimport HANDLE_RETURN, _parse_fill_value +from cuda.core._utils.version cimport cy_binding_version, cy_driver_version -from cuda.core.graph._host_callback cimport _is_py_host_trampoline +from cuda.core.graph._host_callback cimport ( + _is_py_host_trampoline, + _resolve_host_callback, +) from cuda.core._utils.cuda_utils import driver, handle_return from cuda.core.typing import GraphConditionalType @@ -42,6 +67,14 @@ __all__ = [ 'EmptyNode', 'EventRecordNode', 'EventWaitNode', + 'ExecutableChildGraphNode', + 'ExecutableEventRecordNode', + 'ExecutableEventWaitNode', + 'ExecutableGraphNode', + 'ExecutableHostCallbackNode', + 'ExecutableKernelNode', + 'ExecutableMemcpyNode', + 'ExecutableMemsetNode', 'FreeNode', 'HostCallbackNode', 'IfElseNode', @@ -57,6 +90,117 @@ __all__ = [ cdef bint _has_cuGraphNodeGetParams = False cdef bint _version_checked = False + +cdef void _require_graph_node_update_support() except *: + cdef tuple version = cy_driver_version() + if version < (12, 2, 0): + raise RuntimeError( + "Graph node mutation requires CUDA driver 12.2 or newer; " + f"using driver version {'.'.join(map(str, version))}" + ) + version = cy_binding_version() + if version < (12, 2, 0): + raise RuntimeError( + "Graph node mutation requires cuda.bindings 12.2 or newer; " + f"using cuda.bindings version {'.'.join(map(str, version))}" + ) + + +cdef void _set_definition_node_params( + const GraphNodeHandle& h_node, + cydriver.CUgraphNodeParams* params, + OpaqueHandle owner0, + OpaqueHandle owner1=OpaqueHandle(), + cydriver.CUcontext update_ctx=NULL) except *: + _require_graph_node_update_support() + + cdef GraphHandle h_graph = graph_node_get_graph(h_node) + cdef cydriver.CUgraphNode node = as_cu(h_node) + cdef cydriver.CUcontext previous_ctx = NULL + cdef bint restore_ctx = False + cdef PreparedAttachment prepared + + HANDLE_RETURN(graph_prepare_attachment( + h_graph, owner0, owner1, &prepared)) + if update_ctx != NULL: + with nogil: + HANDLE_RETURN(cydriver.cuCtxGetCurrent(&previous_ctx)) + if previous_ctx != update_ctx: + HANDLE_RETURN(cydriver.cuCtxSetCurrent(update_ctx)) + restore_ctx = True + try: + with nogil: + HANDLE_RETURN(cydriver.cuGraphNodeSetParams(node, params)) + finally: + if restore_ctx: + with nogil: + HANDLE_RETURN(cydriver.cuCtxSetCurrent(previous_ctx)) + HANDLE_RETURN(graph_commit_attachment(prepared, node)) + + +cdef void _set_executable_node_params( + const GraphExecHandle& h_exec, + const GraphNodeHandle& h_node, + cydriver.CUgraphNodeParams* params, + OpaqueHandle owner0=OpaqueHandle(), + OpaqueHandle owner1=OpaqueHandle()) except *: + _require_graph_node_update_support() + + cdef cydriver.CUgraphExec graph_exec = as_cu(h_exec) + cdef cydriver.CUgraphNode node = as_cu(h_node) + if graph_exec == NULL: + raise ValueError("executable graph has been closed") + if node == NULL: + raise ValueError("source graph node is no longer valid") + + cdef PreparedExecAttachment prepared + HANDLE_RETURN(graph_prepare_exec_attachment( + h_exec, owner0, owner1, &prepared)) + + cdef cydriver.CUresult status + with nogil: + status = cydriver.cuGraphExecNodeSetParams( + graph_exec, node, params) + if status == cydriver.CUDA_SUCCESS: + graph_commit_exec_attachment(prepared) + HANDLE_RETURN(status) + + +cdef bint _get_executable_node_enabled( + const GraphExecHandle& h_exec, + const GraphNodeHandle& h_node) except *: + _require_graph_node_update_support() + + cdef cydriver.CUgraphExec graph_exec = as_cu(h_exec) + cdef cydriver.CUgraphNode node = as_cu(h_node) + cdef unsigned int enabled + if graph_exec == NULL: + raise ValueError("executable graph has been closed") + if node == NULL: + raise ValueError("source graph node is no longer valid") + with nogil: + HANDLE_RETURN(cydriver.cuGraphNodeGetEnabled( + graph_exec, node, &enabled)) + return enabled != 0 + + +cdef void _set_executable_node_enabled( + const GraphExecHandle& h_exec, + const GraphNodeHandle& h_node, + bint enabled) except *: + _require_graph_node_update_support() + + cdef cydriver.CUgraphExec graph_exec = as_cu(h_exec) + cdef cydriver.CUgraphNode node = as_cu(h_node) + if graph_exec == NULL: + raise ValueError("executable graph has been closed") + if node == NULL: + raise ValueError("source graph node is no longer valid") + with nogil: + HANDLE_RETURN(cydriver.cuGraphNodeSetEnabled( + graph_exec, node, enabled)) + + cdef bint _check_node_get_params(): global _has_cuGraphNodeGetParams, _version_checked if not _version_checked: @@ -68,6 +212,54 @@ cdef bint _check_node_get_params(): return _has_cuGraphNodeGetParams +cdef void _reject_unsupported_kernel_node( + cydriver.CUgraphNode node) except *: + cdef cydriver.CUkernelNodeAttrValue cluster + cdef cydriver.CUkernelNodeAttrValue cooperative + + c_memset(&cluster, 0, sizeof(cluster)) + c_memset(&cooperative, 0, sizeof(cooperative)) + with nogil: + HANDLE_RETURN(cydriver.cuGraphKernelNodeGetAttribute( + node, ( + cydriver.CU_KERNEL_NODE_ATTRIBUTE_CLUSTER_DIMENSION), + &cluster)) + HANDLE_RETURN(cydriver.cuGraphKernelNodeGetAttribute( + node, ( + cydriver.CU_KERNEL_NODE_ATTRIBUTE_COOPERATIVE), + &cooperative)) + if (cluster.clusterDim.x != 0 or cluster.clusterDim.y != 0 or + cluster.clusterDim.z != 0 or cooperative.cooperative != 0): + raise NotImplementedError( + "updating clustered or cooperative kernel nodes is not supported") + + +cdef bint _is_supported_memcpy_descriptor( + cydriver.CUDA_MEMCPY3D* params) noexcept nogil: + return ( + (params.srcMemoryType == cydriver.CU_MEMORYTYPE_HOST or + params.srcMemoryType == cydriver.CU_MEMORYTYPE_DEVICE) + and (params.dstMemoryType == cydriver.CU_MEMORYTYPE_HOST or + params.dstMemoryType == cydriver.CU_MEMORYTYPE_DEVICE) + and params.srcXInBytes == 0 + and params.srcY == 0 + and params.srcZ == 0 + and params.srcLOD == 0 + and params.srcPitch == 0 + and params.srcHeight == 0 + and params.dstXInBytes == 0 + and params.dstY == 0 + and params.dstZ == 0 + and params.dstLOD == 0 + and params.dstPitch == 0 + and params.dstHeight == 0 + and params.Height == 1 + and params.Depth == 1 + and params.reserved0 == NULL + and params.reserved1 == NULL + ) + + cdef class EmptyNode(GraphNode): """An empty (synchronization) node.""" @@ -130,6 +322,99 @@ cdef class KernelNode(GraphNode): return (f"") + def update( + self, + *, + config: LaunchConfig | None = None, + kernel: Kernel | None = None, + args=None, + ) -> None: + """Replace selected kernel launch parameters. + + Omitted parameters preserve their current values. Changing ``kernel`` + requires ``args``, including ``args=()`` for a no-argument kernel. + Clustered and cooperative kernel nodes are not supported. + + .. warning:: + + Use caution when a retained kernel argument directly or indirectly + owns a graph. Any reference cycle involving the argument and a + graph that retains it cannot be broken by Python's cyclic garbage + collector. Use a weak reference to break such cycles. + """ + cdef LaunchConfig c_config + cdef Kernel c_kernel + cdef ParamHolder arg_holder + cdef object kernel_args + cdef KernelHandle h_kernel = self._h_kernel + cdef OpaqueHandle kernel_owner + cdef OpaqueHandle args_owner + cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) + cdef cydriver.CUgraphNode node = as_cu(self._h_node) + cdef cydriver.CUgraphNodeParams params + + if config is not None: + c_config = config + if (c_config.cluster is not None or + c_config.is_cooperative): + raise NotImplementedError( + "updating clustered or cooperative kernel nodes is not " + "supported") + _require_graph_node_update_support() + _reject_unsupported_kernel_node(node) + if kernel is not None: + if args is None: + raise ValueError("changing kernel requires args") + c_kernel = kernel + h_kernel = c_kernel._h_kernel + if args is not None: + arg_holder = ParamHolder(args) + + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_KERNEL + with nogil: + HANDLE_RETURN(cydriver.cuGraphKernelNodeGetParams( + node, ¶ms.kernel)) + HANDLE_RETURN(graph_get_attachment( + h_graph, node, &kernel_owner, &args_owner)) + + if config is not None: + params.kernel.gridDimX = c_config.grid[0] + params.kernel.gridDimY = c_config.grid[1] + params.kernel.gridDimZ = c_config.grid[2] + params.kernel.blockDimX = c_config.block[0] + params.kernel.blockDimY = c_config.block[1] + params.kernel.blockDimZ = c_config.block[2] + params.kernel.sharedMemBytes = c_config.shmem_size + if kernel is not None: + params.kernel.kern = as_cu(h_kernel) + params.kernel.func = NULL + params.kernel.ctx = NULL + kernel_owner = h_kernel + if args is not None: + params.kernel.kernelParams = arg_holder.ptr + params.kernel.extra = NULL + kernel_args = arg_holder.kernel_args + if kernel_args is None: + args_owner = OpaqueHandle() + else: + args_owner = make_opaque_py(kernel_args) + + _set_definition_node_params( + self._h_node, ¶ms, kernel_owner, args_owner) + self._grid = ( + params.kernel.gridDimX, + params.kernel.gridDimY, + params.kernel.gridDimZ, + ) + self._block = ( + params.kernel.blockDimX, + params.kernel.blockDimY, + params.kernel.blockDimZ, + ) + self._shmem_size = params.kernel.sharedMemBytes + self._h_kernel = h_kernel + @property def grid(self) -> tuple[int, int, int]: """Grid dimensions as a 3-tuple (gridDimX, gridDimY, gridDimZ).""" @@ -340,6 +625,102 @@ cdef class MemsetNode(GraphNode): return (f"") + def update( + self, + *, + dst: Buffer | int | None = None, + value=None, + width: int | None = None, + height: int | None = None, + pitch: int | None = None, + dst_owner=None, + ) -> None: + """Replace selected memset parameters. + + Omitted parameters preserve their current values. ``dst_owner`` may + only accompany a raw-address ``dst``. + + With CUDA 12.2 through 13.1, the node's intended CUDA context must be + current when this method is called. CUDA driver and ``cuda.bindings`` + versions 13.2 and newer preserve the recorded context automatically. + + .. warning:: + + Use caution when a retained operand owner directly or indirectly + owns a graph. Any reference cycle involving the owner and a graph + that retains it cannot be broken by Python's cyclic garbage + collector. Use a weak reference to break such cycles. + """ + cdef OpaqueHandle dst_attachment_owner + cdef GraphHandle h_graph + cdef cydriver.CUgraphNode node = as_cu(self._h_node) + cdef cydriver.CUcontext ctx = NULL + cdef cydriver.CUDA_MEMSET_NODE_PARAMS current + cdef cydriver.CUgraphNodeParams params + cdef object queried + + if dst is None and dst_owner is not None: + raise ValueError("dst_owner requires dst") + if (dst is None and value is None and width is None and + height is None and pitch is None): + return + + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_MEMSET + with nogil: + HANDLE_RETURN(cydriver.cuGraphMemsetNodeGetParams( + node, ¤t)) + if _check_node_get_params(): + queried = handle_return(driver.cuGraphNodeGetParams( + node)) + ctx = int(queried.memset.ctx) + else: + with nogil: + HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) + + cdef cydriver.CUdeviceptr c_dst = current.dst + cdef unsigned int c_value = current.value + cdef unsigned int c_element_size = current.elementSize + cdef size_t c_width = current.width + cdef size_t c_height = current.height + cdef size_t c_pitch = current.pitch + + if dst is None: + h_graph = graph_node_get_graph(self._h_node) + HANDLE_RETURN(graph_get_attachment( + h_graph, node, + &dst_attachment_owner, NULL)) + else: + dst_attachment_owner = _resolve_memcpy_operand( + dst, dst_owner, "dst", &c_dst) + + if value is not None: + c_value, c_element_size = _parse_fill_value(value) + if width is not None: + c_width = width + if height is not None: + c_height = height + if pitch is not None: + c_pitch = pitch + + params.memset.dst = c_dst + params.memset.value = c_value + params.memset.elementSize = c_element_size + params.memset.width = c_width + params.memset.height = c_height + params.memset.pitch = c_pitch + params.memset.ctx = ctx + + _set_definition_node_params( + self._h_node, ¶ms, dst_attachment_owner, + OpaqueHandle(), params.memset.ctx) + self._dptr = c_dst + self._value = c_value + self._element_size = c_element_size + self._width = c_width + self._height = c_height + self._pitch = c_pitch + @property def dptr(self) -> int: """The destination device pointer.""" @@ -428,6 +809,133 @@ cdef class MemcpyNode(GraphNode): return (f"") + def update( + self, + *, + dst: Buffer | int | None = None, + src: Buffer | int | None = None, + size: int | None = None, + dst_owner=None, + src_owner=None, + ) -> None: + """Replace selected memcpy parameters. + + Omitted parameters preserve their current values. ``dst_owner`` and + ``src_owner`` may only accompany their corresponding raw addresses. + Multidimensional, pitched, offset, and array-backed memcpy nodes are + not supported. + + With CUDA 12.2 through 13.1, the node's intended CUDA context must be + current when this method is called. CUDA driver and ``cuda.bindings`` + versions 13.2 and newer preserve the recorded context automatically. + + .. warning:: + + Use caution when a retained operand owner directly or indirectly + owns a graph. Any reference cycle involving the owner and a graph + that retains it cannot be broken by Python's cyclic garbage + collector. Use a weak reference to break such cycles. + """ + cdef cydriver.CUdeviceptr c_dst = self._dst + cdef cydriver.CUdeviceptr c_src = self._src + cdef OpaqueHandle dst_attachment_owner + cdef OpaqueHandle src_attachment_owner + cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) + cdef cydriver.CUgraphNode node = as_cu(self._h_node) + cdef cydriver.CUcontext ctx = NULL + cdef cydriver.CUgraphNodeParams params + cdef cydriver.CUmemorytype c_dst_type + cdef cydriver.CUmemorytype c_src_type + cdef object queried + + if dst is None and dst_owner is not None: + raise ValueError("dst_owner requires dst") + if src is None and src_owner is not None: + raise ValueError("src_owner requires src") + if dst is None and src is None and size is None: + return + + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_MEMCPY + with nogil: + HANDLE_RETURN(cydriver.cuGraphMemcpyNodeGetParams( + node, ¶ms.memcpy.copyParams)) + if _check_node_get_params(): + queried = handle_return(driver.cuGraphNodeGetParams( + node)) + ctx = int( + queried.memcpy.copyCtx) + else: + with nogil: + HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) + params.memcpy.copyCtx = ctx + + if not _is_supported_memcpy_descriptor(¶ms.memcpy.copyParams): + raise NotImplementedError( + "updating multidimensional, pitched, offset, or array-backed " + "memcpy nodes is not supported") + + c_dst_type = params.memcpy.copyParams.dstMemoryType + c_src_type = params.memcpy.copyParams.srcMemoryType + if c_dst_type == cydriver.CU_MEMORYTYPE_HOST: + c_dst = ( + params.memcpy.copyParams.dstHost) + elif c_dst_type == cydriver.CU_MEMORYTYPE_DEVICE: + c_dst = params.memcpy.copyParams.dstDevice + else: + raise NotImplementedError( + f"unsupported destination memory type: {int(c_dst_type)}") + if c_src_type == cydriver.CU_MEMORYTYPE_HOST: + c_src = ( + params.memcpy.copyParams.srcHost) + elif c_src_type == cydriver.CU_MEMORYTYPE_DEVICE: + c_src = params.memcpy.copyParams.srcDevice + else: + raise NotImplementedError( + f"unsupported source memory type: {int(c_src_type)}") + + HANDLE_RETURN(graph_get_attachment( + h_graph, node, + &dst_attachment_owner, &src_attachment_owner)) + if dst is not None: + dst_attachment_owner = _resolve_memcpy_operand( + dst, dst_owner, "dst", &c_dst) + c_dst_type = _get_memcpy_memory_type(c_dst) + params.memcpy.copyParams.dstMemoryType = c_dst_type + params.memcpy.copyParams.dstHost = NULL + params.memcpy.copyParams.dstDevice = 0 + params.memcpy.copyParams.dstArray = NULL + params.memcpy.copyParams.reserved1 = NULL + if c_dst_type == cydriver.CU_MEMORYTYPE_HOST: + params.memcpy.copyParams.dstHost = c_dst + else: + params.memcpy.copyParams.dstDevice = c_dst + if src is not None: + src_attachment_owner = _resolve_memcpy_operand( + src, src_owner, "src", &c_src) + c_src_type = _get_memcpy_memory_type(c_src) + params.memcpy.copyParams.srcMemoryType = c_src_type + params.memcpy.copyParams.srcHost = NULL + params.memcpy.copyParams.srcDevice = 0 + params.memcpy.copyParams.srcArray = NULL + params.memcpy.copyParams.reserved0 = NULL + if c_src_type == cydriver.CU_MEMORYTYPE_HOST: + params.memcpy.copyParams.srcHost = c_src + else: + params.memcpy.copyParams.srcDevice = c_src + if size is not None: + params.memcpy.copyParams.WidthInBytes = size + + _set_definition_node_params( + self._h_node, ¶ms, + dst_attachment_owner, src_attachment_owner, + params.memcpy.copyCtx) + self._dst = c_dst + self._src = c_src + self._size = params.memcpy.copyParams.WidthInBytes + self._dst_type = c_dst_type + self._src_type = c_src_type + @property def dst(self) -> int: """The destination pointer.""" @@ -478,6 +986,37 @@ cdef class ChildGraphNode(GraphNode): return (f"") + def update(self, child: GraphDefinition) -> None: + """Replace the embedded graph with a clone of ``child``. + + ``child`` must belong to an independent graph hierarchy. + """ + cdef GraphHandle h_parent = graph_node_get_graph(self._h_node) + cdef GraphHandle h_replacement + cdef cydriver.CUgraphNode node = as_cu(self._h_node) + cdef cydriver.CUgraphNodeParams params + cdef cydriver.CUresult commit_status + cdef PreparedChildGraphUpdate prepared + + _require_graph_node_update_support() + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_GRAPH + params.graph.graph = as_cu(child._h_graph) + + HANDLE_RETURN(graph_prepare_child_graph_update( + h_parent, self._h_child_graph, node, + child._h_graph, &prepared)) + with nogil: + HANDLE_RETURN(cydriver.cuGraphNodeSetParams( + node, ¶ms)) + try: + commit_status = graph_commit_child_graph_update( + prepared, &h_replacement) + finally: + if h_replacement: + self._h_child_graph = h_replacement + HANDLE_RETURN(commit_status) + @property def child_graph(self) -> GraphDefinition: """The embedded graph definition (non-owning wrapper).""" @@ -516,6 +1055,19 @@ cdef class EventRecordNode(GraphNode): return (f"") + def update(self, event: Event) -> None: + """Replace the event recorded by this node.""" + cdef OpaqueHandle event_owner = event._h_event + cdef cydriver.CUgraphNodeParams params + + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_EVENT_RECORD + params.eventRecord.event = as_cu(event._h_event) + + _set_definition_node_params( + self._h_node, ¶ms, event_owner) + self._h_event = event._h_event + @property def event(self) -> Event: """The event being recorded.""" @@ -554,6 +1106,19 @@ cdef class EventWaitNode(GraphNode): return (f"") + def update(self, event: Event) -> None: + """Replace the event waited on by this node.""" + cdef OpaqueHandle event_owner = event._h_event + cdef cydriver.CUgraphNodeParams params + + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_WAIT_EVENT + params.eventWait.event = as_cu(event._h_event) + + _set_definition_node_params( + self._h_node, ¶ms, event_owner) + self._h_event = event._h_event + @property def event(self) -> Event: """The event being waited on.""" @@ -604,6 +1169,42 @@ cdef class HostCallbackNode(GraphNode): return (f"self._fn:x}>") + def update(self, fn, *, user_data=None) -> None: + """Replace the callback and user-data binding for this node. + + ``fn`` accepts the same forms as :meth:`~graph.GraphNode.callback`: a + Python callable, or a ctypes function pointer whose declared prototype + matches ``CUhostFn`` (``void (*)(void*)``). A mismatched ctypes + prototype raises ``TypeError``. + + .. warning:: + + Callbacks must not call CUDA API functions. Doing so may + deadlock or corrupt driver state. + + Use caution when a Python callback retains an object that owns a + graph. Any reference cycle involving the callback and a graph that + retains it cannot be broken by Python's cyclic garbage collector. + Use a weak reference to break such cycles. + """ + cdef cydriver.CUhostFn c_fn + cdef void* c_user_data + cdef OpaqueHandle fn_owner, data_owner + cdef cydriver.CUgraphNodeParams params + + _resolve_host_callback( + fn, user_data, &c_fn, &c_user_data, &fn_owner, &data_owner) + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_HOST + params.host.fn = c_fn + params.host.userData = c_user_data + + _set_definition_node_params( + self._h_node, ¶ms, fn_owner, data_owner) + self._callable = fn if _is_py_host_trampoline(c_fn) else None + self._fn = c_fn + self._user_data = c_user_data + @property def callback(self): """The Python callable, or None for ctypes function pointer callbacks.""" @@ -765,3 +1366,302 @@ cdef class SwitchNode(ConditionalNode): def __repr__(self) -> str: return (f"self._condition._c_handle:x}>") + + +cdef class ExecutableGraphNode: + """A lightweight view pairing an executable graph with a source node. + + Create executable-node views with ``graph[node]``. CUDA validates that the + node identifies a node in the executable graph when an operation is + performed. + """ + + def __init__(self): + raise RuntimeError( + "directly constructing an executable graph node is not supported") + + def __repr__(self) -> str: + return ( + f"<{type(self).__name__} graph=0x{as_intptr(self._h_graph_exec):x}" + f" node=0x{as_intptr(self._h_node):x}>" + ) + + +cdef class ExecutableKernelNode(ExecutableGraphNode): + """An executable kernel-node view.""" + + def update( + self, + *, + config: LaunchConfig, + kernel: Kernel, + args, + ) -> None: + """Replace all kernel launch parameters for future launches. + + ``args`` must contain the complete argument sequence; use ``args=()`` + for a no-argument kernel. Clustered and cooperative launch + configurations are not supported. + """ + cdef LaunchConfig c_config = config + cdef Kernel c_kernel = kernel + cdef ParamHolder arg_holder + cdef object kernel_args + cdef OpaqueHandle kernel_owner = c_kernel._h_kernel + cdef OpaqueHandle args_owner + cdef cydriver.CUgraphNodeParams params + + if c_config.cluster is not None or c_config.is_cooperative: + raise NotImplementedError( + "updating clustered or cooperative kernel nodes is not " + "supported") + arg_holder = ParamHolder(args) + + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_KERNEL + params.kernel.kern = as_cu(c_kernel._h_kernel) + params.kernel.func = NULL + params.kernel.gridDimX = c_config.grid[0] + params.kernel.gridDimY = c_config.grid[1] + params.kernel.gridDimZ = c_config.grid[2] + params.kernel.blockDimX = c_config.block[0] + params.kernel.blockDimY = c_config.block[1] + params.kernel.blockDimZ = c_config.block[2] + params.kernel.sharedMemBytes = c_config.shmem_size + params.kernel.kernelParams = arg_holder.ptr + params.kernel.extra = NULL + params.kernel.ctx = NULL + + kernel_args = arg_holder.kernel_args + if kernel_args is not None: + args_owner = make_opaque_py(kernel_args) + _set_executable_node_params( + self._h_graph_exec, self._h_node, ¶ms, + kernel_owner, args_owner) + + @property + def is_enabled(self) -> bool: + """Whether this node is enabled in the executable graph.""" + return _get_executable_node_enabled( + self._h_graph_exec, self._h_node) + + def enable(self) -> None: + """Enable this node in the executable graph.""" + _set_executable_node_enabled( + self._h_graph_exec, self._h_node, True) + + def disable(self) -> None: + """Disable this node in the executable graph.""" + _set_executable_node_enabled( + self._h_graph_exec, self._h_node, False) + + +cdef class ExecutableMemsetNode(ExecutableGraphNode): + """An executable memset-node view.""" + + def update( + self, + *, + dst: Buffer | int, + value, + size_t width, + size_t height=1, + size_t pitch=0, + ) -> None: + """Replace all memset parameters for future launches.""" + cdef cydriver.CUdeviceptr c_dst + cdef OpaqueHandle dst_owner = _resolve_memcpy_operand( + dst, None, "dst", &c_dst) + cdef unsigned int c_value + cdef unsigned int element_size + c_value, element_size = _parse_fill_value(value) + + cdef cydriver.CUcontext ctx = NULL + cdef cydriver.CUgraphNodeParams params + with nogil: + HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) + + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_MEMSET + params.memset.dst = c_dst + params.memset.value = c_value + params.memset.elementSize = element_size + params.memset.width = width + params.memset.height = height + params.memset.pitch = pitch + params.memset.ctx = ctx + _set_executable_node_params( + self._h_graph_exec, self._h_node, ¶ms, dst_owner) + + @property + def is_enabled(self) -> bool: + """Whether this node is enabled in the executable graph.""" + return _get_executable_node_enabled( + self._h_graph_exec, self._h_node) + + def enable(self) -> None: + """Enable this node in the executable graph.""" + _set_executable_node_enabled( + self._h_graph_exec, self._h_node, True) + + def disable(self) -> None: + """Disable this node in the executable graph.""" + _set_executable_node_enabled( + self._h_graph_exec, self._h_node, False) + + +cdef class ExecutableMemcpyNode(ExecutableGraphNode): + """An executable memcpy-node view.""" + + def update( + self, + *, + dst: Buffer | int, + src: Buffer | int, + size_t size, + ) -> None: + """Replace all one-dimensional memcpy parameters for future launches.""" + cdef cydriver.CUdeviceptr c_dst + cdef cydriver.CUdeviceptr c_src + cdef OpaqueHandle dst_owner = _resolve_memcpy_operand( + dst, None, "dst", &c_dst) + cdef OpaqueHandle src_owner = _resolve_memcpy_operand( + src, None, "src", &c_src) + cdef cydriver.CUmemorytype dst_type + cdef cydriver.CUmemorytype src_type + cdef cydriver.CUcontext ctx = NULL + cdef cydriver.CUgraphNodeParams params + + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_MEMCPY + _init_memcpy_params( + c_dst, c_src, size, ¶ms.memcpy.copyParams, + &dst_type, &src_type) + with nogil: + HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) + params.memcpy.copyCtx = ctx + _set_executable_node_params( + self._h_graph_exec, self._h_node, ¶ms, + dst_owner, src_owner) + + @property + def is_enabled(self) -> bool: + """Whether this node is enabled in the executable graph.""" + return _get_executable_node_enabled( + self._h_graph_exec, self._h_node) + + def enable(self) -> None: + """Enable this node in the executable graph.""" + _set_executable_node_enabled( + self._h_graph_exec, self._h_node, True) + + def disable(self) -> None: + """Disable this node in the executable graph.""" + _set_executable_node_enabled( + self._h_graph_exec, self._h_node, False) + + +cdef class ExecutableChildGraphNode(ExecutableGraphNode): + """An executable child-graph-node view.""" + + def update(self, child: GraphDefinition) -> None: + """Replace the embedded graph parameters for future launches.""" + cdef cydriver.CUgraphNodeParams params + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_GRAPH + params.graph.graph = as_cu(child._h_graph) + _set_executable_node_params( + self._h_graph_exec, self._h_node, ¶ms) + + +cdef class ExecutableEventRecordNode(ExecutableGraphNode): + """An executable event-record-node view.""" + + def update(self, event: Event) -> None: + """Replace the event recorded by future launches.""" + cdef OpaqueHandle event_owner = event._h_event + cdef cydriver.CUgraphNodeParams params + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_EVENT_RECORD + params.eventRecord.event = as_cu(event._h_event) + _set_executable_node_params( + self._h_graph_exec, self._h_node, ¶ms, event_owner) + + +cdef class ExecutableEventWaitNode(ExecutableGraphNode): + """An executable event-wait-node view.""" + + def update(self, event: Event) -> None: + """Replace the event waited on by future launches.""" + cdef OpaqueHandle event_owner = event._h_event + cdef cydriver.CUgraphNodeParams params + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_WAIT_EVENT + params.eventWait.event = as_cu(event._h_event) + _set_executable_node_params( + self._h_graph_exec, self._h_node, ¶ms, event_owner) + + +cdef class ExecutableHostCallbackNode(ExecutableGraphNode): + """An executable host-callback-node view.""" + + def update(self, fn, *, user_data=None) -> None: + """Replace the callback and user-data binding for future launches. + + ``fn`` may be a Python callable, or a ctypes function pointer whose + declared prototype matches ``CUhostFn`` (``void (*)(void*)``); a + mismatched prototype raises ``TypeError``. + + .. warning:: + + Callbacks must not call CUDA API functions. Doing so may deadlock + or corrupt driver state. + """ + cdef cydriver.CUhostFn c_fn + cdef void* c_user_data + cdef OpaqueHandle fn_owner + cdef OpaqueHandle data_owner + cdef cydriver.CUgraphNodeParams params + + _resolve_host_callback( + fn, user_data, &c_fn, &c_user_data, &fn_owner, &data_owner) + c_memset(¶ms, 0, sizeof(params)) + params.type = cydriver.CU_GRAPH_NODE_TYPE_HOST + params.host.fn = c_fn + params.host.userData = c_user_data + _set_executable_node_params( + self._h_graph_exec, self._h_node, ¶ms, + fn_owner, data_owner) + + +cdef ExecutableGraphNode create_executable_node_view( + const GraphExecHandle& h_exec, + GraphNode node): + cdef type view_type + if isinstance(node, KernelNode): + view_type = ExecutableKernelNode + elif isinstance(node, MemsetNode): + view_type = ExecutableMemsetNode + elif isinstance(node, MemcpyNode): + view_type = ExecutableMemcpyNode + elif isinstance(node, ChildGraphNode): + view_type = ExecutableChildGraphNode + elif isinstance(node, EventRecordNode): + view_type = ExecutableEventRecordNode + elif isinstance(node, EventWaitNode): + view_type = ExecutableEventWaitNode + elif isinstance(node, HostCallbackNode): + view_type = ExecutableHostCallbackNode + else: + raise TypeError( + f"{type(node).__name__} does not support executable updates") + + if as_cu(h_exec) == NULL: + raise ValueError("executable graph has been closed") + if as_cu(node._h_node) == NULL: + raise ValueError("source graph node is no longer valid") + + cdef ExecutableGraphNode view = view_type.__new__(view_type) + view._h_graph_exec = h_exec + view._h_node = node._h_node + return view diff --git a/cuda_core/cuda/core/system/__init__.py b/cuda_core/cuda/core/system/__init__.py index 685519f9b80..acb648549bc 100644 --- a/cuda_core/cuda/core/system/__init__.py +++ b/cuda_core/cuda/core/system/__init__.py @@ -12,8 +12,10 @@ __all__ = [ "CUDA_BINDINGS_NVML_IS_COMPATIBLE", + "get_driver_branch", "get_kernel_mode_driver_version", "get_num_devices", + "get_nvml_version", "get_process_name", "get_user_mode_driver_version", ] @@ -40,7 +42,6 @@ from .exceptions import * from .exceptions import __all__ as _exceptions_all - __all__.append("get_nvml_version") __all__.extend(_device_all) __all__.extend(_system_events_all) __all__.extend(_exceptions_all) diff --git a/cuda_core/cuda/core/system/_device.pyi b/cuda_core/cuda/core/system/_device.pyi index 0a51e5c9928..c758576f0ac 100644 --- a/cuda_core/cuda/core/system/_device.pyi +++ b/cuda_core/cuda/core/system/_device.pyi @@ -1036,7 +1036,7 @@ class ProcessInfo: Information about running compute processes on the GPU. """ - def __init__(self, device: 'Device', process_info: nvml.ProcessInfo): + def __init__(self, device: Device, process_info: nvml.ProcessInfo): ... @property diff --git a/cuda_core/cuda/core/system/_device.pyx b/cuda_core/cuda/core/system/_device.pyx index 73f51cad8e3..6c81c3b9732 100644 --- a/cuda_core/cuda/core/system/_device.pyx +++ b/cuda_core/cuda/core/system/_device.pyx @@ -2,6 +2,8 @@ # # SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + from libc.stdint cimport intptr_t, uint64_t from libc.math cimport ceil diff --git a/cuda_core/cuda/core/system/_process.pxi b/cuda_core/cuda/core/system/_process.pxi index 019ebf5c323..4266f5b5914 100644 --- a/cuda_core/cuda/core/system/_process.pxi +++ b/cuda_core/cuda/core/system/_process.pxi @@ -7,7 +7,7 @@ class ProcessInfo: """ Information about running compute processes on the GPU. """ - def __init__(self, device: "Device", process_info: nvml.ProcessInfo): + def __init__(self, device: Device, process_info: nvml.ProcessInfo): self._device = device self._process_info = process_info diff --git a/cuda_core/cuda/core/system/_temperature.pxi b/cuda_core/cuda/core/system/_temperature.pxi index f5eed73de2c..82dc0cab785 100644 --- a/cuda_core/cuda/core/system/_temperature.pxi +++ b/cuda_core/cuda/core/system/_temperature.pxi @@ -173,7 +173,9 @@ cdef class Temperature: nvml.TemperatureThresholds.TEMPERATURE_THRESHOLD_MEM_MAX, nvml.TemperatureThresholds.TEMPERATURE_THRESHOLD_GPU_MAX ): - device_arch = nvml.DeviceArch(nvml.device_get_architecture(self._handle)) + # Compare the raw value so newer NVML architecture constants remain + # forward-compatible. + device_arch = nvml.device_get_architecture(self._handle) if device_arch >= nvml.DeviceArch.ADA: warnings.warn( f"{threshold_type} is no longer recommended for Ada and later architectures. " diff --git a/cuda_core/cuda/core/texture/_array.pyx b/cuda_core/cuda/core/texture/_array.pyx index 0a1cb671daf..684ba79460f 100644 --- a/cuda_core/cuda/core/texture/_array.pyx +++ b/cuda_core/cuda/core/texture/_array.pyx @@ -522,7 +522,6 @@ def _create_opaque_array(options): shape_t = opts.shape cdef cydriver.CUarray_format c_format = _ARRAYFORMAT_TO_CU[opts.format] - cdef cydriver.CUDA_ARRAY3D_DESCRIPTOR desc3d cdef int rank = len(shape_t) cdef unsigned int flags = ( cydriver.CUDA_ARRAY3D_SURFACE_LDST if opts.is_surface_load_store else 0 @@ -530,13 +529,14 @@ def _create_opaque_array(options): # cuArray3DCreate handles 1D/2D/3D uniformly (Height/Depth 0 sentinels), # so a single descriptor + create_array_handle covers every shape. - memset(&desc3d, 0, sizeof(desc3d)) - desc3d.Width = shape_t[0] - desc3d.Height = (shape_t[1] if rank >= 2 else 0) - desc3d.Depth = (shape_t[2] if rank >= 3 else 0) - desc3d.Format = c_format - desc3d.NumChannels = opts.num_channels - desc3d.Flags = flags + cdef cydriver.CUDA_ARRAY3D_DESCRIPTOR desc3d = cydriver.CUDA_ARRAY3D_DESCRIPTOR( + Width=shape_t[0], + Height=(shape_t[1] if rank >= 2 else 0), + Depth=(shape_t[2] if rank >= 3 else 0), + Format=c_format, + NumChannels=opts.num_channels, + Flags=flags, + ) cdef OpaqueArrayHandle h = create_array_handle(desc3d) if not h: diff --git a/cuda_core/cuda/core/texture/_mipmapped_array.pyx b/cuda_core/cuda/core/texture/_mipmapped_array.pyx index 3f151f7bb9f..e9ad0fa478b 100644 --- a/cuda_core/cuda/core/texture/_mipmapped_array.pyx +++ b/cuda_core/cuda/core/texture/_mipmapped_array.pyx @@ -4,8 +4,6 @@ from __future__ import annotations -from libc.string cimport memset - from cuda.bindings cimport cydriver from cuda.core.texture._array cimport _array_from_handle from cuda.core.texture._array import ( @@ -201,7 +199,6 @@ def _create_mipmapped_array(options): shape_t = opts.shape cdef cydriver.CUarray_format c_format = _ARRAYFORMAT_TO_CU[opts.format] - cdef cydriver.CUDA_ARRAY3D_DESCRIPTOR desc3d cdef int rank = len(shape_t) cdef unsigned int flags = ( cydriver.CUDA_ARRAY3D_SURFACE_LDST if opts.is_surface_load_store else 0 @@ -210,13 +207,14 @@ def _create_mipmapped_array(options): # Mipmap creation uses the 3D descriptor regardless of rank; lower-rank # shapes use Height=0/Depth=0 sentinels, matching cuArray3DCreate. - memset(&desc3d, 0, sizeof(desc3d)) - desc3d.Width = shape_t[0] - desc3d.Height = (shape_t[1] if rank >= 2 else 0) - desc3d.Depth = (shape_t[2] if rank >= 3 else 0) - desc3d.Format = c_format - desc3d.NumChannels = opts.num_channels - desc3d.Flags = flags + cdef cydriver.CUDA_ARRAY3D_DESCRIPTOR desc3d = cydriver.CUDA_ARRAY3D_DESCRIPTOR( + Width=shape_t[0], + Height=(shape_t[1] if rank >= 2 else 0), + Depth=(shape_t[2] if rank >= 3 else 0), + Format=c_format, + NumChannels=opts.num_channels, + Flags=flags, + ) cdef MipmappedArrayHandle h = create_mipmapped_array_handle(desc3d, c_levels) if not h: diff --git a/cuda_core/cuda/core/utils/_program_cache/_file_stream.py b/cuda_core/cuda/core/utils/_program_cache/_file_stream.py index 1e22a739ae0..eb71abf5446 100644 --- a/cuda_core/cuda/core/utils/_program_cache/_file_stream.py +++ b/cuda_core/cuda/core/utils/_program_cache/_file_stream.py @@ -397,9 +397,19 @@ def __init__( self._entries = self._root / _ENTRIES_SUBDIR self._tmp = self._root / _TMP_SUBDIR self._max_size_bytes = max_size_bytes + # Permissions (see PR #2399): + # root/ and entries/ use default permissions so a shared cache (e.g. one + # a group shares on a cluster) keeps working. The cached files themselves + # are still private: each is written to tmp/ as owner-only and moved into + # entries/, which keeps its permissions. tmp/ is made owner-only so no one + # can read or swap a file while it's being written. We don't chmod, so an + # existing directory is left as-is. + # Trade-off: if a group deliberately shares a writable entries/, a member + # could replace a cached file. Blocking that needs a check at load time, + # not just permissions, and is out of scope here. self._root.mkdir(parents=True, exist_ok=True) self._entries.mkdir(exist_ok=True) - self._tmp.mkdir(exist_ok=True) + self._tmp.mkdir(exist_ok=True, mode=0o700) # Opportunistic startup sweep of orphaned temp files left by any # crashed writers. Age-based so concurrent in-flight writes from # other processes are preserved. diff --git a/cuda_core/docs/source/api.rst b/cuda_core/docs/source/api.rst index 089e68576c9..e903a46a7ee 100644 --- a/cuda_core/docs/source/api.rst +++ b/cuda_core/docs/source/api.rst @@ -154,6 +154,22 @@ Every graph node is a subclass of :class:`~graph.GraphNode`, which provides the common interface (dependencies, successors, destruction). Each subclass exposes attributes unique to its operation type. +Parameter-bearing definition nodes expose subclass-specific ``update()`` +methods: :class:`~graph.KernelNode`, :class:`~graph.MemcpyNode`, +:class:`~graph.MemsetNode`, :class:`~graph.ChildGraphNode`, +:class:`~graph.EventRecordNode`, :class:`~graph.EventWaitNode`, and +:class:`~graph.HostCallbackNode`. These methods require CUDA driver and +``cuda.bindings`` versions 12.2 or newer. Updates affect future graph +instantiations; executable graphs that were already instantiated continue +using their previous parameters and retained resources. Omitted optional +arguments preserve their current values where supported. +On CUDA 12.2 through 13.1, the intended CUDA context must be current when +updating memcpy or memset nodes. CUDA driver and ``cuda.bindings`` versions +13.2 and newer preserve the recorded context automatically. +Multidimensional or array-backed memcpy nodes and clustered or cooperative +kernel nodes cannot currently be updated. Clustered and cooperative kernel +nodes also cannot currently be constructed explicitly. + .. autosummary:: :toctree: generated/ @@ -175,6 +191,41 @@ Each subclass exposes attributes unique to its operation type. graph.WhileNode graph.SwitchNode +Executable node views +````````````````````` + +Index an executable :class:`~graph.Graph` with a definition node to update that +node in the executable, for example +``graph[kernel_node].update(config=config, kernel=kernel, args=args)``. +The returned view retains the executable and source node, while CUDA validates +that the node is associated with the executable. + +Executable graphs do not support reading back current node parameters, so +updates take a complete replacement. Buffer operands, kernels, events, kernel +arguments, and callback bindings are retained for every future launch that may +use them. Superseded resources remain retained until a successful whole-graph +update or executable destruction. Raw integer addresses remain caller-owned. +Memcpy and memset updates use the current CUDA context, which must match the +original node context. + +Kernel, memcpy, and memset views also provide ``is_enabled``, ``enable()``, and +``disable()``. Executable-node updates require CUDA driver and +``cuda.bindings`` versions 12.2 or newer. + +.. autosummary:: + :toctree: generated/ + + :template: autosummary/cyclass.rst + + graph.ExecutableGraphNode + graph.ExecutableKernelNode + graph.ExecutableMemcpyNode + graph.ExecutableMemsetNode + graph.ExecutableHostCallbackNode + graph.ExecutableChildGraphNode + graph.ExecutableEventRecordNode + graph.ExecutableEventWaitNode + Graphics interoperability ------------------------- diff --git a/cuda_core/docs/source/api_nvml.rst b/cuda_core/docs/source/api_nvml.rst index 7780dd6086e..c96b68ab701 100644 --- a/cuda_core/docs/source/api_nvml.rst +++ b/cuda_core/docs/source/api_nvml.rst @@ -45,3 +45,11 @@ Types Device NvlinkInfo + +Constants +--------- + +.. autosummary:: + :toctree: generated/ + + CUDA_BINDINGS_NVML_IS_COMPATIBLE diff --git a/cuda_core/docs/source/api_private.rst b/cuda_core/docs/source/api_private.rst index 907fc2f5bcf..80675799c07 100644 --- a/cuda_core/docs/source/api_private.rst +++ b/cuda_core/docs/source/api_private.rst @@ -40,11 +40,12 @@ CUDA runtime typing.VirtualMemoryGranularityType typing.VirtualMemoryHandleType typing.VirtualMemoryLocationType + typing.WorkqueueSharingScopeType :template: autosummary/cyclass.rst + DeviceResources _device.DeviceProperties - _device_resources.DeviceResources _memory._ipc.IPCAllocationHandle _memory._ipc.IPCBufferDescriptor _memory._managed_buffer.AccessedBySetProxy @@ -125,3 +126,36 @@ NVML system.typing.TemperatureThresholds system.typing.ThermalController system.typing.ThermalTarget + + system.NvmlError + system.UninitializedError + system.InvalidArgumentError + system.NotSupportedError + system.NoPermissionError + system.AlreadyInitializedError + system.NotFoundError + system.InsufficientSizeError + system.InsufficientPowerError + system.DriverNotLoadedError + system.TimeoutError + system.IrqIssueError + system.LibraryNotFoundError + system.FunctionNotFoundError + system.CorruptedInforomError + system.GpuIsLostError + system.ResetRequiredError + system.OperatingSystemError + system.LibRmVersionMismatchError + system.InUseError + system.MemoryError + system.NoDataError + system.VgpuEccNotSupportedError + system.InsufficientResourcesError + system.FreqNotSupportedError + system.ArgumentVersionMismatchError + system.DeprecatedError + system.NotReadyError + system.GpuNotFoundError + system.InvalidStateError + system.ResetTypeNotSupportedError + system.UnknownError diff --git a/cuda_core/docs/source/install.rst b/cuda_core/docs/source/install.rst index a49aab7c966..c048cfb2a2c 100644 --- a/cuda_core/docs/source/install.rst +++ b/cuda_core/docs/source/install.rst @@ -110,7 +110,7 @@ Development with uv .. code-block:: console - $ git clone https://github.com/NVIDIA/cuda-python + $ git clone https://github.com/NVIDIA/cuda-python.git $ cd cuda-python/cuda_core $ uv venv $ source .venv/bin/activate # On Windows: .venv\Scripts\activate @@ -132,7 +132,7 @@ From the repository root: .. code-block:: console - $ git clone https://github.com/NVIDIA/cuda-python + $ git clone https://github.com/NVIDIA/cuda-python.git $ cd cuda-python $ pixi run -e cu13 test-core @@ -151,8 +151,18 @@ Installing from Source .. code-block:: console - $ git clone https://github.com/NVIDIA/cuda-python + $ git clone https://github.com/NVIDIA/cuda-python.git $ cd cuda-python/cuda_core $ pip install . ``cuda-bindings`` 12.x or 13.x is a required dependency. + +.. note:: + + The version is derived from git tags via ``setuptools-scm``, so the clone + must include tags reaching back to at least the latest ``cuda-core-v*`` tag. + Do not use ``--depth`` or ``--no-tags``: a shallow clone builds without + error but produces a bogus version such as ``0.1.dev1+g0d22cb444``. See + `Cloning the repository + `_ + for details and recovery steps. diff --git a/cuda_core/docs/source/release/1.1.1-notes.rst b/cuda_core/docs/source/release/1.1.1-notes.rst new file mode 100644 index 00000000000..66d74e3540b --- /dev/null +++ b/cuda_core/docs/source/release/1.1.1-notes.rst @@ -0,0 +1,59 @@ +.. SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +.. SPDX-License-Identifier: Apache-2.0 + +.. currentmodule:: cuda.core + +``cuda.core`` 1.1.1 Release Notes +================================= + + +New features +------------ + +- Added :meth:`ObjectCode.get_module` for interoperability with legacy + ``CUmodule``-based driver APIs. The method returns a context-dependent + ``CUmodule`` handle via ``cuLibraryGetModule``, bridging the newer + context-independent library API to existing code that expects a module. + (`#2339 `__) + +- ``cuda.core`` C++ headers are now included in source distributions and + installed wheels, making them available to downstream projects that extend + ``cuda.core`` at the C++ level. + (`#2236 `__) + + +Fixes and enhancements +---------------------- + +- This cuda-core patch release was issued to be compatible with cuda-bindings + 13.4.0b1. Version strings that include PEP 440 pre-release suffixes (e.g. + ``0b1``) are now parsed correctly; previously they caused an ``ImportError`` + on startup. + +- Graph nodes now properly retain per-node user-object attachments (kernel + argument buffers, host-callback functions and user data, and + memcpy/memset operands) for the full lifetime of the graph. + (`#2357 `__) + +- Graph user-object payload cleanup is now deferred to the main Python thread + via ``Py_AddPendingCall``, avoiding unsafe cross-thread Python object + destruction that could occur when CUDA invoked the destructor callback on an + internal driver thread. + (`#2371 `__) + +- The on-disk program cache directory is now created with owner-only + permissions (``0o700``) on POSIX systems, and those permissions are + re-asserted on each use. This prevents other local users from reading or + injecting cached device code regardless of the process ``umask``. + (`#2399 `__) + +- DLPack: a ``NULL`` deleter in a ``DLManagedTensorVersioned`` capsule is now + handled correctly per the DLPack specification; previously it would cause a + crash. + (`#2427 `__) + +- Corrected NumPy version guards for writing into DLPack host arrays. The + minimum required NumPy version for such writes is now correctly enforced as + 2.2.5+; earlier NumPy versions return a read-only buffer + (``numpy GH#28632``) and would error rather than skip. + (`#2238 `__) diff --git a/cuda_core/docs/source/release/1.2.0-notes.rst b/cuda_core/docs/source/release/1.2.0-notes.rst index 6a047c9cfe8..ef28e7931e4 100644 --- a/cuda_core/docs/source/release/1.2.0-notes.rst +++ b/cuda_core/docs/source/release/1.2.0-notes.rst @@ -18,6 +18,73 @@ Fixes and enhancements (`#2357 `__, `#2371 `__) +- Added ``update()`` methods to kernel, memcpy, memset, child-graph, event + record, event wait, and host-callback graph definition nodes. Updates change + parameters used by future graph instantiations without affecting existing + executable graphs. This feature requires CUDA driver and ``cuda.bindings`` + versions 12.2 or newer. + (`#2352 `__) + +- Added ``graph[node]`` views for updating nodes in an executable graph. + Kernel, memcpy, memset, child-graph, event, and host-callback parameters can + be replaced without reinstantiating the graph. Kernel, memcpy, and memset + nodes can also be enabled or disabled. Resources introduced by these updates + remain alive through in-flight launches. Superseded resources stay retained + until a successful whole-graph update or executable graph destruction. This + feature requires CUDA driver and ``cuda.bindings`` versions 12.2 or newer. + (`#2353 `__, + `#2354 `__) + +- The default-stream singletons ``LEGACY_DEFAULT_STREAM`` and + ``PER_THREAD_DEFAULT_STREAM`` no longer cache the first context and device + they observe. A default-stream token refers to whatever context is current, + so ``Stream.context``, ``Stream.device``, ``Stream.resources``, and + ``Stream.record()`` now resolve against the current context on every call. + Previously the first query pinned the singleton to one context for the + lifetime of the process, which also kept that context alive. + (`#2485 `__) + +- :meth:`Linker.which_backend` and constructing a :class:`Linker` no longer + raise ``FunctionNotFoundError`` when an nvJitLink older than 12.3 + (12.0–12.2) is installed. These versions do not export the unversioned + ``nvJitLinkVersion`` symbol, so probing the version crashed instead of + falling back. ``cuda.core`` now warns and falls back to the driver + (``cuLink``) backend, restoring the pre-0.7.0 behavior. + (`#2409 `__, + closes `#2408 `__) + +- :class:`ProgramOptions` now accepts ``name=None`` and falls back to the + documented default ``"default_program"``. Previously the annotated and + documented ``None`` raised ``AttributeError`` during construction. + (`#2517 `__, + closes `#2516 `__) + +- ``cuda.core`` now checks ctypes host callbacks against the driver's + ``CUhostFn`` signature (``void (*)(void*)``) before passing the function + pointer to CUDA. :meth:`graph.GraphNode.callback`, + :meth:`graph.GraphBuilder.callback`, and the host-callback ``update()`` + methods raise ``TypeError`` for a mismatched prototype, rather than leaving + the driver to call through an incompatible signature, which is undefined + behavior. Declarations that previously reached the driver, such as + ``ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p)``, are now rejected at the + call site. A function pointer obtained from a shared library keeps ctypes' + default ``c_int`` result type until it is declared, so set its ``restype`` + and ``argtypes`` (or cast it to the prototype above) before passing it. On + Windows, both ``ctypes.CFUNCTYPE`` and ``ctypes.WINFUNCTYPE`` are accepted. + (`#2439 `__) + +- Starting with CUDA 13.4, unconstrained SM-resource discovery through + :meth:`SMResource.split` with ``SMResourceOptions(count=None)`` may return + every available SM, even when that count is not divisible by the device's + :attr:`SMResource.coscheduled_alignment`. CUDA 13.1 through 13.3 returned an + aligned subset for the same request. An omitted or zero + ``coscheduled_sm_count`` still selects the driver's default internally, but + CUDA 13.4 no longer guarantees that the returned :attr:`SMResource.sm_count` + is a multiple of that default. A green context created from the discovered + group may therefore span the full GPU and leave an empty remainder. Set + ``coscheduled_sm_count`` explicitly when an aligned result is required. + (`#2389 `__) + Deprecation Notices ------------------- diff --git a/cuda_core/pixi.lock b/cuda_core/pixi.lock index ebaf967facd..b8f6cbac479 100644 --- a/cuda_core/pixi.lock +++ b/cuda_core/pixi.lock @@ -42,6 +42,8 @@ environments: cu12: channels: - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda @@ -64,7 +66,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-12.9.79-h7938cbb_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_hcddb375_914.conda @@ -104,15 +106,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda @@ -147,8 +149,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.10-hd0affe5_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.10-hd0affe5_4.conda @@ -224,6 +226,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.4.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -255,7 +258,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-core[2472945f] @ . + - conda_source: cuda-core[e53261c5] @ . + - pypi: ../cuda_python_test_helpers linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda @@ -277,7 +281,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-12.9.86-h7b14b0b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.9.86-h7b14b0b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-12.9.79-h16bee8c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py314h4c416a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_h62efc85_914.conda @@ -314,15 +318,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.5.0-he9c94f4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.2-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.2-hdae7a39_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwy-1.3.0-h81d0cf9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda @@ -355,8 +359,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h30591a0_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.10-hf9559e3_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.10-hf9559e3_4.conda @@ -429,6 +433,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-12.9.86-h579c4fd_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.4.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -459,7 +464,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-core[491c4fa3] @ . + - conda_source: cuda-core[6e9d4edb] @ . + - pypi: ../cuda_python_test_helpers win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda @@ -474,6 +480,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-12.9.86-h57928b3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.4.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -524,7 +531,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-dev-12.9.86-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-12.9.86-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-12.9.86-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/dav1d-1.2.1-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ffmpeg-8.0.1-gpl_hb2d76f6_914.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda @@ -608,10 +615,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-core[8e8d43e1] @ . + - conda_source: cuda-core[18c68942] @ . + - pypi: ../cuda_python_test_helpers cu13: channels: - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda @@ -629,7 +639,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.33-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.33-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_hcddb375_914.conda @@ -669,15 +679,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda @@ -712,8 +722,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda @@ -787,6 +797,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.33-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -817,9 +828,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[29afc263] @ ../cuda_bindings - - conda_source: cuda-core[496050ab] @ . - - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder + - conda_source: cuda-bindings[6c91bfdd] @ ../cuda_bindings + - conda_source: cuda-core[adf7f1da] @ . + - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda @@ -836,7 +848,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.33-h7b14b0b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-13.3.33-h7b14b0b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-13.3.27-h16bee8c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py314h4c416a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_h62efc85_914.conda @@ -873,15 +885,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.5.0-he9c94f4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.2-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.2-hdae7a39_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwy-1.3.0-h81d0cf9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda @@ -914,8 +926,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h30591a0_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda @@ -986,6 +998,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-13.3.33-h579c4fd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -1015,9 +1028,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[b73e05e0] @ ../cuda_bindings - - conda_source: cuda-core[b9ba9726] @ . - - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder + - conda_source: cuda-bindings[3db1bf41] @ ../cuda_bindings + - conda_source: cuda-core[7b4f4a3f] @ . + - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda @@ -1030,6 +1044,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-13.3.33-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -1073,7 +1088,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-13.3.33-h719f0c7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.33-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-13.3.33-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/dav1d-1.2.1-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ffmpeg-8.0.1-gpl_hb2d76f6_914.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda @@ -1157,12 +1172,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-bindings[1a320ca0] @ ../cuda_bindings - - conda_source: cuda-core[f1ea05b3] @ . - - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder + - conda_source: cuda-bindings[4664b262] @ ../cuda_bindings + - conda_source: cuda-core[2b0a529b] @ . + - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers default: channels: - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda @@ -1180,7 +1198,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.33-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.33-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_hcddb375_914.conda @@ -1220,15 +1238,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda @@ -1263,8 +1281,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda @@ -1338,6 +1356,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.33-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -1368,9 +1387,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[29afc263] @ ../cuda_bindings - - conda_source: cuda-core[496050ab] @ . - - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder + - conda_source: cuda-bindings[6c91bfdd] @ ../cuda_bindings + - conda_source: cuda-core[adf7f1da] @ . + - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda @@ -1387,7 +1407,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.33-h7b14b0b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-13.3.33-h7b14b0b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-13.3.27-h16bee8c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py314h4c416a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_h62efc85_914.conda @@ -1424,15 +1444,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.5.0-he9c94f4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.2-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.2-hdae7a39_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwy-1.3.0-h81d0cf9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda @@ -1465,8 +1485,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h30591a0_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda @@ -1537,6 +1557,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-13.3.33-h579c4fd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -1566,9 +1587,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[b73e05e0] @ ../cuda_bindings - - conda_source: cuda-core[b9ba9726] @ . - - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder + - conda_source: cuda-bindings[3db1bf41] @ ../cuda_bindings + - conda_source: cuda-core[7b4f4a3f] @ . + - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda @@ -1581,6 +1603,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-13.3.33-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -1624,7 +1647,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-13.3.33-h719f0c7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.33-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-13.3.33-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/dav1d-1.2.1-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ffmpeg-8.0.1-gpl_hb2d76f6_914.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.17.1-hd47e2ca_0.conda @@ -1708,9 +1731,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-bindings[1a320ca0] @ ../cuda_bindings - - conda_source: cuda-core[f1ea05b3] @ . - - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder + - conda_source: cuda-bindings[4664b262] @ ../cuda_bindings + - conda_source: cuda-core[2b0a529b] @ . + - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder + - pypi: ../cuda_python_test_helpers docs: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -1726,7 +1750,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-13.3.33-h69a702a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.33-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.33-h4bc722e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py314h42812f9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.3.2-py314h42812f9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda @@ -1894,9 +1918,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[29afc263] @ ../cuda_bindings - - conda_source: cuda-core[496050ab] @ . - - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder + - conda_source: cuda-bindings[91169b48] @ ../cuda_bindings + - conda_source: cuda-core[83c371ca] @ . + - conda_source: cuda-pathfinder[3890e449] @ ../cuda_pathfinder - pypi: https://files.pythonhosted.org/packages/8c/79/017fab2f7167a9a9795665f894d04f77aafceca80821b51589bb4b23ff5c/nvidia_sphinx_theme-0.0.9.post1-py3-none-any.whl linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda @@ -1907,7 +1931,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-13.3.33-he9431aa_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.33-h7b14b0b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-13.3.33-h7b14b0b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py314h4c416a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.20-py314he6363bd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.3.2-py314he6363bd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda @@ -2076,9 +2100,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[b73e05e0] @ ../cuda_bindings - - conda_source: cuda-core[b9ba9726] @ . - - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder + - conda_source: cuda-bindings[4e633ee8] @ ../cuda_bindings + - conda_source: cuda-core[29d2d05a] @ . + - conda_source: cuda-pathfinder[640a9949] @ ../cuda_pathfinder - pypi: https://files.pythonhosted.org/packages/8c/79/017fab2f7167a9a9795665f894d04f77aafceca80821b51589bb4b23ff5c/nvidia_sphinx_theme-0.0.9.post1-py3-none-any.whl win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda @@ -2200,7 +2224,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-13.3.33-h719f0c7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.33-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-13.3.33-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py314hb98de8c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/greenlet-3.3.2-py314hb98de8c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda @@ -2246,9 +2270,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-bindings[1a320ca0] @ ../cuda_bindings - - conda_source: cuda-core[f1ea05b3] @ . - - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder + - conda_source: cuda-bindings[8b6a309f] @ ../cuda_bindings + - conda_source: cuda-core[e56c61a7] @ . + - conda_source: cuda-pathfinder[bcd0ad48] @ ../cuda_pathfinder - pypi: https://files.pythonhosted.org/packages/8c/79/017fab2f7167a9a9795665f894d04f77aafceca80821b51589bb4b23ff5c/nvidia_sphinx_theme-0.0.9.post1-py3-none-any.whl examples: channels: @@ -2478,9 +2502,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - - conda_source: cuda-bindings[29afc263] @ ../cuda_bindings - - conda_source: cuda-core[496050ab] @ . - - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder + - conda_source: cuda-bindings[91169b48] @ ../cuda_bindings + - conda_source: cuda-core[83c371ca] @ . + - conda_source: cuda-pathfinder[3890e449] @ ../cuda_pathfinder p2: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda @@ -2699,9 +2723,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda_source: cuda-bindings[b73e05e0] @ ../cuda_bindings - - conda_source: cuda-core[b9ba9726] @ . - - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder + - conda_source: cuda-bindings[4e633ee8] @ ../cuda_bindings + - conda_source: cuda-core[29d2d05a] @ . + - conda_source: cuda-pathfinder[640a9949] @ ../cuda_pathfinder p3: - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda @@ -2797,9 +2821,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-bindings[1a320ca0] @ ../cuda_bindings - - conda_source: cuda-core[f1ea05b3] @ . - - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder + - conda_source: cuda-bindings[8b6a309f] @ ../cuda_bindings + - conda_source: cuda-core[e56c61a7] @ . + - conda_source: cuda-pathfinder[bcd0ad48] @ ../cuda_pathfinder numba-classic: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -3680,6 +3704,7 @@ packages: - libgcc >=14 license: LGPL-2.1-or-later license_family: GPL + purls: [] size: 584660 timestamp: 1768327524772 - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.16.1-hb03c661_0.conda @@ -3713,6 +3738,7 @@ packages: - libstdcxx-ng >=12 license: BSD-2-Clause license_family: BSD + purls: [] size: 2706396 timestamp: 1718551242397 - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda @@ -3723,6 +3749,7 @@ packages: - libgcc >=13 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 68072 timestamp: 1756738968573 - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda @@ -3734,6 +3761,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 3744895 timestamp: 1770267152681 - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda @@ -3775,6 +3803,19 @@ packages: - pkg:pypi/brotli?source=hash-mapping size: 367376 timestamp: 1764017265553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + sha256: 1a0d382c515ebf55f8ee1f38c8b81bc95af5c2acc42ad53b66bc5df932032f96 + md5: e675fabcf81499adc7edf58124fb1e01 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 257808 + timestamp: 1785906269155 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 md5: d2ffd7602c02f2b316fd921d39876885 @@ -3837,6 +3878,7 @@ packages: - gcc_impl_linux-64 >=14.3.0,<14.3.1.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 31705 timestamp: 1771378159534 - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-12.9.6-py314h7ea930b_0.conda @@ -3858,6 +3900,8 @@ packages: - cuda-cudart >=12,<13.0a0 - cuda-python >=12.9.6,<12.10.0a0 license: LicenseRef-NVIDIA-SOFTWARE-LICENSE + purls: + - pkg:pypi/cuda-bindings?source=hash-mapping size: 4451465 timestamp: 1773288432998 - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-12.9.7-py314hadd79bd_1.conda @@ -3910,6 +3954,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 29138 timestamp: 1753975252445 @@ -3931,6 +3976,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23242 timestamp: 1749218416505 @@ -3960,6 +4006,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -3977,6 +4024,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=13.3.29,<14.0a0 @@ -3992,6 +4040,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23283 timestamp: 1749218442382 @@ -4005,6 +4054,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24626 timestamp: 1779898435744 @@ -4045,6 +4095,7 @@ packages: constrains: - gcc_impl_linux-64 >=6,<15.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27215 timestamp: 1753975546846 @@ -4061,6 +4112,7 @@ packages: constrains: - gcc_impl_linux-64 >=6,<15.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27380012 timestamp: 1753975454194 @@ -4099,6 +4151,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 67168282 timestamp: 1760723629347 @@ -4127,6 +4180,7 @@ packages: constrains: - cuda-nvrtc-static >=12.9.86 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-nvrtc >=12.9.86,<13.0a0 @@ -4144,6 +4198,7 @@ packages: constrains: - cuda-nvrtc-static >=13.3.33 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-nvrtc >=13.3.33,<14.0a0 @@ -4190,6 +4245,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libgcc >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 21425520 timestamp: 1753975283188 @@ -4223,6 +4279,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libgcc >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24246736 timestamp: 1753975332907 @@ -4255,6 +4312,7 @@ packages: - cuda-cudart-dev - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23668 timestamp: 1761098836058 @@ -4265,6 +4323,7 @@ packages: - cuda-cudart-dev - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 25007 timestamp: 1779913616712 @@ -4317,21 +4376,6 @@ packages: license_family: MIT size: 33970282 timestamp: 1771604499034 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py314h1807b08_0.conda - sha256: f700d10c2a794710a1656a6fdb8908fb04f3c7812ac4f17187777646ede1a3d9 - md5: 866fd3d25b767bccb4adc8476f4035cd - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/cython?source=hash-mapping - size: 3806945 - timestamp: 1767576996860 - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda sha256: f0210259007f573e38f7b8037be9b36e53aa0906b786e9f1f931e0a24f8a18e6 md5: 0e6a14f60b561b2fff81d325b4dc8283 @@ -4343,6 +4387,8 @@ packages: - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/cython?source=hash-mapping run_exports: {} size: 3819412 timestamp: 1782821647528 @@ -4458,6 +4504,7 @@ packages: - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 12485347 timestamp: 1773008832077 - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.1.1-gpl_h6d6c1bd_904.conda @@ -4614,6 +4661,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 270705 timestamp: 1771382710863 - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.1-h27c8c51_0.conda @@ -4639,6 +4687,7 @@ packages: - libfreetype 2.14.2 ha770c72_0 - libfreetype6 2.14.2 h73754d4_0 license: GPL-2.0-only OR FTL + purls: [] size: 174292 timestamp: 1772757205296 - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda @@ -4669,6 +4718,7 @@ packages: - gcc_impl_linux-64 14.3.0 hbdf3cc3_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 29506 timestamp: 1771378321585 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-h6f77f03_18.conda @@ -4680,6 +4730,7 @@ packages: - gcc_no_conda_specs license: BSD-3-Clause license_family: BSD + purls: [] size: 29453 timestamp: 1771378662937 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda @@ -4696,6 +4747,7 @@ packages: - sysroot_linux-64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 76302378 timestamp: 1771378056505 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda @@ -4729,8 +4781,26 @@ packages: - sysroot_linux-64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 81814135 timestamp: 1771378369317 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-16.1.0-h5fcb69b_1.conda + sha256: 00c87015522248adb5565a1b8f977cfe927831dd7ef0cb0a5d13f896844af719 + md5: 419982d8913246db404319048e062d3e + depends: + - binutils_impl_linux-64 >=2.46.1 + - libgcc >=16.1.0 + - libgcc-devel_linux-64 16.1.0 h59071f9_101 + - libgomp >=16.1.0 + - libsanitizer 16.1.0 hf2715c6_1 + - libstdcxx >=16.1.0 + - libstdcxx-devel_linux-64 16.1.0 h41cdd0d_101 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 85161422 + timestamp: 1785375529345 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_27.conda sha256: b24b13d467898a9b9a17a868a2686412a98f8935dc7cc51547dd90645d4e8436 md5: 28bc49875f9c38e2401696b3e48d0798 @@ -4745,6 +4815,20 @@ packages: - libgcc >=15 size: 29330 timestamp: 1781279944230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-16.1.0-h5fd2508_0.conda + sha256: 22d2b2c0386fda70971c87afd4926cb20ba1a247421f5be617c43512570fa4f7 + md5: 15b9577e4be98443deb42e88e9c44656 + depends: + - gcc_impl_linux-64 16.1.0.* + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + run_exports: + strong: + - libgcc >=16 + size: 29720 + timestamp: 1785386616206 - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda sha256: b2a6fb56b8f2d576a3ae5e6c57b2dbab91d52d1f1658bf1b258747ae25bb9fde md5: 7eb4977dd6f60b3aaab0715a0ea76f11 @@ -4758,6 +4842,7 @@ packages: - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 575109 timestamp: 1771530561157 - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda @@ -4786,6 +4871,7 @@ packages: - spirv-tools >=2026,<2027.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1353008 timestamp: 1770195199411 - conda: https://conda.anaconda.org/conda-forge/linux-64/glslang-16.3.0-h96af755_0.conda @@ -4835,6 +4921,7 @@ packages: - libstdcxx >=14 license: LGPL-2.0-or-later license_family: LGPL + purls: [] size: 99596 timestamp: 1755102025473 - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-hecca717_0.conda @@ -4872,6 +4959,7 @@ packages: - gxx_impl_linux-64 14.3.0 h2185e75_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 28883 timestamp: 1771378355605 - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-h76987e4_18.conda @@ -4882,6 +4970,7 @@ packages: - gxx_impl_linux-64 15.2.0 hda75c37_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 28723 timestamp: 1771378698305 - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda @@ -4894,6 +4983,7 @@ packages: - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 14566100 timestamp: 1771378271421 - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_18.conda @@ -4906,6 +4996,7 @@ packages: - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 15587873 timestamp: 1771378609722 - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda @@ -4921,6 +5012,19 @@ packages: run_exports: {} size: 16356816 timestamp: 1778269332159 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-16.1.0-he33a5f8_1.conda + sha256: 4b7e7a082fab18a58409b05c2611b8edb4aeb06ee07be380a73da5de911da2ba + md5: aaeab97072d79e7945182dc7d4e1a035 + depends: + - gcc_impl_linux-64 16.1.0 h5fcb69b_1 + - libstdcxx-devel_linux-64 16.1.0 h41cdd0d_101 + - sysroot_linux-64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 16633585 + timestamp: 1785375706410 - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-hcb00b6d_27.conda sha256: f78da7a8b49943a6ce48372a5bc85ab741ac86666f1040e8876545065ec1096e md5: 5e194579a5f72c70102f342aa362f5f9 @@ -4937,6 +5041,22 @@ packages: - libgcc >=15 size: 27848 timestamp: 1781279944230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-16.1.0-h5525346_0.conda + sha256: c8c0b721dadcc8d48d2a5a9ee56add4b46ce5427adbf6ff685e0f75fabd52cbd + md5: 4521cfa739a42179511b351566374c6e + depends: + - gxx_impl_linux-64 16.1.0.* + - gcc_linux-64 ==16.1.0 h5fd2508_0 + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + run_exports: + strong: + - libstdcxx >=16 + - libgcc >=16 + size: 28116 + timestamp: 1785386616206 - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.1.0-h6083320_0.conda sha256: 08dc098dcc5c3445331a834f46602b927cb65d2768189f3f032a6e4643f15cd9 md5: 5baf48da05855be929c5a50f4377794d @@ -4954,6 +5074,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 2615630 timestamp: 1773217509651 - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.1-h6083320_0.conda @@ -4985,6 +5106,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 12728445 timestamp: 1767969922681 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda @@ -4999,6 +5121,20 @@ packages: purls: [] size: 12723451 timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda + sha256: d7c260b7e1cf22ce04d6ba8a86eabf4e6c50bc96a5c27fe2ecb32298af3e88eb + md5: 4ef4b977bb216a3001a3334696a80850 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 14455340 + timestamp: 1784916378180 - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.10.0-hb700be7_0.conda sha256: bc231d69eb6663db0e09738fb916c5e5507147cf1ac60f364f964004e0b29bab md5: 10909406c1b0e4b57f9f4f0eb0999af8 @@ -5020,6 +5156,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 1009795 timestamp: 1765886047465 - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-media-driver-26.1.4-hecca717_0.conda @@ -5033,6 +5170,7 @@ packages: - libva >=2.23.0,<3.0a0 license: MIT license_family: MIT + purls: [] size: 8783533 timestamp: 1773230300873 - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-media-driver-26.1.6-hecca717_0.conda @@ -5108,6 +5246,7 @@ packages: - binutils_impl_linux-64 2.45.1 license: GPL-3.0-only license_family: GPL + purls: [] size: 725507 timestamp: 1770267139900 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda @@ -5157,6 +5296,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 858387 timestamp: 1772045965844 - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.29.0-hb700be7_0.conda @@ -5219,6 +5359,7 @@ packages: - liblapacke 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18213 timestamp: 1765818813880 - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h5875eb1_mkl.conda @@ -5319,6 +5460,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 121429 timestamp: 1762349484074 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda @@ -5332,6 +5474,19 @@ packages: purls: [] size: 124432 timestamp: 1774333989027 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + sha256: 8cb25174d6b6fac95d31e86cfe41faffc8ee9dacbf2bfd22e6c23377e8f338c1 + md5: 5db514adf5f843126ff846d1510f22a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcap >=2.78,<2.79.0a0 + size: 124306 + timestamp: 1786025967663 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda sha256: cc8c9fc6ddf0fbd3d1275b558ae9abad6cda23bced268732e2da21a87bb358cd md5: f9f17eab7f3df1c6fd4b1a548a2f683a @@ -5358,6 +5513,7 @@ packages: - liblapack 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18194 timestamp: 1765818837135 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_hfef963f_mkl.conda @@ -5472,6 +5628,7 @@ packages: - libstdcxx >=14 - rdma-core >=59.0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 969845 timestamp: 1761098818759 @@ -5576,6 +5733,7 @@ packages: - libpciaccess >=0.18,<0.19.0a0 license: MIT license_family: MIT + purls: [] size: 310785 timestamp: 1757212153962 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.127-hb03c661_0.conda @@ -5610,6 +5768,7 @@ packages: - __glibc >=2.17,<3.0.a0 - libglvnd 1.7.0 ha4b6fd6_2 license: LicenseRef-libglvnd + purls: [] size: 44840 timestamp: 1731330973553 - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_3.conda @@ -5632,6 +5791,7 @@ packages: - expat 2.7.4.* license: MIT license_family: MIT + purls: [] size: 76798 timestamp: 1771259418166 - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda @@ -5695,6 +5855,7 @@ packages: depends: - libfreetype6 >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 8035 timestamp: 1772757210108 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda @@ -5717,6 +5878,7 @@ packages: constrains: - freetype >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 386316 timestamp: 1772757193822 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda @@ -5762,6 +5924,21 @@ packages: run_exports: {} size: 1041084 timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + sha256: d5cb8475131c31680f8fd30512c418f373064e272e452063276a8fb14c9fa42f + md5: 5a7d954665c707c93311657cd779c705 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 16.1.0 he0feb66_1 + - libgcc-ng ==16.1.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 1057877 + timestamp: 1785375436766 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 md5: d5e96b1ed75ca01906b3d2469b4ce493 @@ -5781,6 +5958,19 @@ packages: purls: [] size: 27694 timestamp: 1778269016987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda + sha256: 225275c562337a1cd61705da0ee4235dde7bba7504de1c34b74c894adb2b0eee + md5: 7ed870c014a6f23c7dfafda53d2763a9 + depends: + - libgcc 16.1.0 ha9f2e26_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libgcc + size: 28210 + timestamp: 1785375440733 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee md5: 9063115da5bc35fdc3e1002e69b9ef6e @@ -5839,6 +6029,7 @@ packages: - libglvnd 1.7.0 ha4b6fd6_2 - libglx 1.7.0 ha4b6fd6_2 license: LicenseRef-libglvnd + purls: [] size: 134712 timestamp: 1731330998354 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_3.conda @@ -5886,6 +6077,7 @@ packages: constrains: - glib 2.86.4 *_1 license: LGPL-2.1-or-later + purls: [] size: 4398701 timestamp: 1771863239578 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda @@ -5910,6 +6102,7 @@ packages: depends: - __glibc >=2.17,<3.0.a0 license: LicenseRef-libglvnd + purls: [] size: 132463 timestamp: 1731330968309 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_3.conda @@ -5929,6 +6122,7 @@ packages: - libglvnd 1.7.0 ha4b6fd6_2 - xorg-libx11 >=1.8.10,<2.0a0 license: LicenseRef-libglvnd + purls: [] size: 75504 timestamp: 1731330988898 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_3.conda @@ -5988,6 +6182,19 @@ packages: - _openmp_mutex >=4.5 size: 603817 timestamp: 1778268942614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + sha256: 62cb599ad0539d99386515326d9d5e8f51f75a60c69c2131b21df76edf35bd89 + md5: 88f2d91cb1533194c323534253094d23 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 640415 + timestamp: 1785375373755 - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.12.2-default_hafda6a7_1000.conda sha256: 2cf160794dda62cf93539adf16d26cfd31092829f2a2757dbdd562984c1b110a md5: 0ed3aa3e3e6bc85050d38881673a692f @@ -5999,6 +6206,7 @@ packages: - libxml2-16 >=2.14.6 license: BSD-3-Clause license_family: BSD + purls: [] size: 2449916 timestamp: 1765103845133 - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda @@ -6023,6 +6231,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: Apache-2.0 OR BSD-3-Clause + purls: [] size: 1448617 timestamp: 1758894401402 - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.4.0-h10be129_0.conda @@ -6055,6 +6264,7 @@ packages: constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib + purls: [] size: 633710 timestamp: 1762094827865 - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda @@ -6096,6 +6306,7 @@ packages: - libbrotlidec >=1.2.0,<1.3.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1883476 timestamp: 1770801977654 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda @@ -6110,6 +6321,7 @@ packages: - libcblas 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18200 timestamp: 1765818857876 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h5e43f62_mkl.conda @@ -6273,6 +6485,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 30515495 timestamp: 1760723776293 @@ -6296,6 +6509,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libnvptxcompiler-dev_linux-64 12.9.86 ha770c72_2 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27046 timestamp: 1753975516342 @@ -6322,6 +6536,7 @@ packages: - openblas >=0.3.30,<0.3.31.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 5927939 timestamp: 1763114673331 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda @@ -6365,6 +6580,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 6582302 timestamp: 1772727204779 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2026.2.0-h1f0fae8_1.conda @@ -6405,6 +6621,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 114431 timestamp: 1772727230331 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2026.2.0-h7e124b3_1.conda @@ -6445,6 +6662,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 249056 timestamp: 1772727247597 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2026.2.0-h7e124b3_1.conda @@ -6485,6 +6703,7 @@ packages: - pugixml >=1.15,<1.16.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 211582 timestamp: 1772727264950 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2026.2.0-hd41364c_0.conda @@ -6526,6 +6745,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 13173323 timestamp: 1772727282718 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2026.2.0-h1f0fae8_1.conda @@ -6570,6 +6790,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 11402462 timestamp: 1772727323957 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2026.2.0-h1f0fae8_1.conda @@ -6616,6 +6837,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 1994640 timestamp: 1772727360780 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2026.2.0-h1f0fae8_1.conda @@ -6660,6 +6882,7 @@ packages: - pugixml >=1.15,<1.16.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 192778 timestamp: 1772727380069 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2026.2.0-hd41364c_0.conda @@ -6702,6 +6925,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 1860687 timestamp: 1772727397981 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2026.2.0-h7a07914_0.conda @@ -6748,6 +6972,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 684224 timestamp: 1772727417276 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2026.2.0-h7a07914_0.conda @@ -6791,6 +7016,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 1185558 timestamp: 1772727435039 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2026.2.0-hecca717_0.conda @@ -6832,6 +7058,7 @@ packages: - snappy >=1.2.2,<1.3.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 1257870 timestamp: 1772727453738 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2026.2.0-h78e8023_0.conda @@ -6877,6 +7104,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 456585 timestamp: 1772727473378 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2026.2.0-hecca717_0.conda @@ -6923,6 +7151,7 @@ packages: - libgcc >=13 license: MIT license_family: MIT + purls: [] size: 28424 timestamp: 1749901812541 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.19-hb03c661_0.conda @@ -6959,6 +7188,7 @@ packages: - __glibc >=2.17,<3.0.a0 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement + purls: [] size: 317669 timestamp: 1770691470744 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda @@ -6984,6 +7214,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 3638698 timestamp: 1769749419271 - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h6eeba95_1.conda @@ -7015,6 +7246,7 @@ packages: constrains: - __glibc >=2.17 license: LGPL-2.1-or-later + purls: [] size: 4011590 timestamp: 1771399906142 - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.3-h4c96295_0.conda @@ -7046,6 +7278,7 @@ packages: - libstdcxx >=14.3.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 7949259 timestamp: 1771377982207 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_18.conda @@ -7057,6 +7290,7 @@ packages: - libstdcxx >=15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 8095113 timestamp: 1771378289674 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda @@ -7073,6 +7307,20 @@ packages: - libsanitizer 15.2.0 size: 7930689 timestamp: 1778269054623 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-16.1.0-hf2715c6_1.conda + sha256: 85662ecadd3961bc96cbcc38dbc024a768cc35932c8440677ed028ea6322c36c + md5: abd77210925872ee084672cf5be1d491 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=16.1.0 + - libstdcxx >=16.1.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: + weak: + - libsanitizer 16.1.0 + size: 7780843 + timestamp: 1785375481116 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda sha256: 57cb5f92110324c04498b96563211a1bca6a74b2918b1e8df578bfed03cc32e4 md5: 067590f061c9f6ea7e61e3b2112ed6b3 @@ -7137,6 +7385,20 @@ packages: - libsqlite >=3.53.3,<4.0a0 size: 962119 timestamp: 1782519076616 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + sha256: 72023efc207fe681e26b65fc9d668062cf0b4f0eacf3431e6eb099b95c1f2efd + md5: df088a279cd5e6fd2790b4c196434da1 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + license: blessing + run_exports: + weak: + - libsqlite >=3.53.4,<4.0a0 + size: 964200 + timestamp: 1785016112246 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e md5: 1b08cd684f34175e4514474793d44bcb @@ -7164,6 +7426,20 @@ packages: run_exports: {} size: 5852044 timestamp: 1778269036376 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + sha256: 79721dd08aeb0ab9e773f1f9ef41cf4e6c17477e3d72319147619045bce05a09 + md5: aed6cf89adc1e9b846e4367ac538e434 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 16.1.0 ha9f2e26_1 + constrains: + - libstdcxx-ng ==16.1.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 6631744 + timestamp: 1785375462643 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda sha256: 3c902ffd673cb3c6ddde624cdb80f870b6c835f8bf28384b0016e7d444dd0145 md5: 6235adb93d064ecdf3d44faee6f468de @@ -7183,6 +7459,19 @@ packages: purls: [] size: 27776 timestamp: 1778269074600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_1.conda + sha256: 2876ca4463d1b394eb969ce4a84d1620aa63fb8202a6397837d1e45ec76c1208 + md5: c94f06123272d8e129d4acf3a25ffb35 + depends: + - libstdcxx 16.1.0 h934c35e_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libstdcxx + size: 28253 + timestamp: 1785375500257 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.10-hd0affe5_4.conda sha256: f0356bb344a684e7616fc84675cfca6401140320594e8686be30e8ac7547aed2 md5: 1d4c18d75c51ed9d00092a891a547a7d @@ -7191,6 +7480,7 @@ packages: - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] size: 491953 timestamp: 1770738638119 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda @@ -7286,6 +7576,7 @@ packages: - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] size: 144654 timestamp: 1770738650966 - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda @@ -7354,6 +7645,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 40311 timestamp: 1766271528534 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda @@ -7530,6 +7822,7 @@ packages: - xorg-libxau >=1.0.12,<2.0a0 license: MIT/X11 Derivative license_family: MIT + purls: [] size: 837922 timestamp: 1764794163823 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.2-hca5e8e5_0.conda @@ -7563,6 +7856,7 @@ packages: - libxml2 2.15.2 license: MIT license_family: MIT + purls: [] size: 557492 timestamp: 1772704601644 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda @@ -7595,6 +7889,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 45968 timestamp: 1772704614539 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda @@ -7623,6 +7918,7 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other + purls: [] size: 60963 timestamp: 1727963148474 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -7640,6 +7936,20 @@ packages: - libzlib >=1.3.2,<2.0a0 size: 63629 timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + sha256: eb8a0db0aa570124f7d2a93d7c7f596e3390df5e047818d873baad32985fc736 + md5: 0de0122d9570a8ab637c6b73db268389 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - zlib 1.3.2 *_3 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 63713 + timestamp: 1785362952714 - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.0-h4922eb0_0.conda sha256: 543c9f17cf6ee6d7b635823fb9009df421d510c36739534df6ae43eadaf6ff4e md5: 5e7da5333653c631d27732893b934351 @@ -7705,6 +8015,8 @@ packages: - python_abi 3.14.* *_cp314 - numpy >=1.23,<3 license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping size: 345273 timestamp: 1771362516002 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda @@ -7808,6 +8120,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 8926994 timestamp: 1770098474394 - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda @@ -7879,6 +8193,7 @@ packages: - opencl-headers >=2024.10.24 license: BSD-2-Clause license_family: BSD + purls: [] size: 106742 timestamp: 1743700382939 - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.4-hb03c661_1.conda @@ -7902,6 +8217,7 @@ packages: - libstdcxx >=13 license: Apache-2.0 license_family: APACHE + purls: [] size: 55357 timestamp: 1749853464518 - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-hecca717_0.conda @@ -7955,6 +8271,20 @@ packages: - openssl >=3.6.3,<4.0a0 size: 3159683 timestamp: 1781069855778 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + sha256: 012096056b97abf1f68c46b7146bd2cbd68c1be762340b4f5dad4fbbe99177bc + md5: c5955c27917ff2234def47f075e71e02 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 3182423 + timestamp: 1785913583650 - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.19.0-py314h9891dd4_0.conda sha256: 620379ebc27e1c43b9a8defdb167442a3413de949a464305443833db32ba7a83 md5: e13172f02effa3c9f07571ed0ddef44d @@ -7987,6 +8317,7 @@ packages: - libpng >=1.6.49,<1.7.0a0 - libzlib >=1.3.1,<2.0a0 license: LGPL-2.1-or-later + purls: [] size: 455420 timestamp: 1751292466873 - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda @@ -8180,6 +8511,38 @@ packages: size: 36717183 timestamp: 1781255094700 python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda + build_number: 101 + sha256: ee8f2006e1724b1f2e9e0ccc5a7cfdcab973460faa2f63ac1f6e44fdad4c0344 + md5: 78975a41cf3c525da654f17e35bfca9e + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.53.3,<4.0a0 + - libuuid >=2.42.2,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.7,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + run_exports: + weak: + - python_abi 3.14.* *_cp314 + noarch: + - python + size: 36869055 + timestamp: 1784910110714 + python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.10.0-cuda130_mkl_py314_h382c374_303.conda sha256: d86f460bddc5b3c443b109e30a1c7f1f9b4044eabf6356c49f19dd660720e395 md5: 1a0371ac3f70358740c260541508f0f5 @@ -8453,6 +8816,7 @@ packages: - xorg-libxi >=1.8.2,<2.0a0 - wayland >=1.24.0,<2.0a0 license: Zlib + purls: [] size: 2138749 timestamp: 1771668185803 - conda: https://conda.anaconda.org/conda-forge/linux-64/shaderc-2025.5-h718be3e_1.conda @@ -8466,6 +8830,7 @@ packages: - spirv-tools >=2026,<2027.0a0 license: Apache-2.0 license_family: Apache + purls: [] size: 113513 timestamp: 1770208767759 - conda: https://conda.anaconda.org/conda-forge/linux-64/shaderc-2026.2-h718be3e_0.conda @@ -8517,6 +8882,7 @@ packages: - spirv-headers >=1.4.341.0,<1.4.341.1.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 2296977 timestamp: 1770089626195 - conda: https://conda.anaconda.org/conda-forge/linux-64/spirv-tools-2026.2-hb700be7_0.conda @@ -8571,6 +8937,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 181329 timestamp: 1767886632911 - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda @@ -8665,6 +9032,19 @@ packages: run_exports: {} size: 20782187 timestamp: 1784166603021 +- conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda + sha256: ac2feff703269655286bf163c4382d3c4830bd2eb4e68e77879a8b4939a2203c + md5: 07c4923f2c89939ec82b77f2ab41c5e9 + depends: + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + constrains: + - __glibc >=2.17 + license: Apache-2.0 OR MIT + run_exports: {} + size: 17299962 + timestamp: 1785973451439 - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda sha256: 3aa04ae8e9521d9b56b562376d944c3e52b69f9d2a0667f77b8953464822e125 md5: 035da2e4f5770f036ff704fa17aace24 @@ -8676,6 +9056,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 329779 timestamp: 1761174273487 - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda @@ -8734,6 +9115,7 @@ packages: - xorg-libx11 >=1.8.13,<2.0a0 license: MIT license_family: MIT + purls: [] size: 399291 timestamp: 1772021302485 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda @@ -8843,6 +9225,7 @@ packages: - xorg-libxfixes >=6.0.1,<7.0a0 license: MIT license_family: MIT + purls: [] size: 47179 timestamp: 1727799254088 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.3-hb03c661_0.conda @@ -8995,6 +9378,7 @@ packages: - libgcc >=14 license: LGPL-2.1-or-later license_family: GPL + purls: [] size: 615729 timestamp: 1768327548407 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.16.1-he30d5cf_0.conda @@ -9026,6 +9410,7 @@ packages: - libstdcxx-ng >=12 license: BSD-2-Clause license_family: BSD + purls: [] size: 3250813 timestamp: 1718551360260 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 @@ -9035,6 +9420,7 @@ packages: - libgcc-ng >=12 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 74992 timestamp: 1660065534958 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_101.conda @@ -9046,6 +9432,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 4741684 timestamp: 1770267224406 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda @@ -9087,6 +9474,18 @@ packages: - pkg:pypi/brotli?source=hash-mapping size: 373193 timestamp: 1764017486851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + sha256: 24eacc8a20fd7c4616566178562bef7f9344eb4a8700cfc3180fa75a6ff9d39f + md5: fd544ef1c672d645bf78e5819cbb8f91 + depends: + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 194694 + timestamp: 1785906301397 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c md5: 840d8fc0d7b3209be93080bc20e07f2d @@ -9146,6 +9545,7 @@ packages: - gcc_impl_linux-aarch64 >=14.3.0,<14.3.1.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 31474 timestamp: 1771377963347 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-12.9.6-py314h43a89f9_0.conda @@ -9167,6 +9567,8 @@ packages: - cuda-cudart >=12,<13.0a0 - cuda-python >=12.9.6,<12.10.0a0 license: LicenseRef-NVIDIA-SOFTWARE-LICENSE + purls: + - pkg:pypi/cuda-bindings?source=hash-mapping size: 3959387 timestamp: 1773288705142 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-12.9.7-py314hd8c1704_1.conda @@ -9221,6 +9623,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 29186 timestamp: 1753975202369 @@ -9243,6 +9646,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23466 timestamp: 1749218349235 @@ -9272,6 +9676,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -9289,6 +9694,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=13.3.29,<14.0a0 @@ -9304,6 +9710,7 @@ packages: - libgcc >=13 - libstdcxx >=13 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23507 timestamp: 1749218358755 @@ -9317,6 +9724,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24786 timestamp: 1779898447855 @@ -9360,6 +9768,7 @@ packages: constrains: - gcc_impl_linux-aarch64 >=6,<15.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27322 timestamp: 1753975427660 @@ -9376,6 +9785,7 @@ packages: constrains: - gcc_impl_linux-aarch64 >=6,<15.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23974390 timestamp: 1753975366926 @@ -9416,6 +9826,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 33382016 timestamp: 1760723722396 @@ -9445,6 +9856,7 @@ packages: - cuda-nvrtc-static >=12.9.86 - arm-variant * sbsa license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-nvrtc >=12.9.86,<13.0a0 @@ -9463,6 +9875,7 @@ packages: - arm-variant * sbsa - cuda-nvrtc-static >=13.3.33 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-nvrtc >=13.3.33,<14.0a0 @@ -9511,6 +9924,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libgcc >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 21601172 timestamp: 1753975236344 @@ -9544,6 +9958,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libgcc >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24411824 timestamp: 1753975273689 @@ -9577,6 +9992,7 @@ packages: - cuda-cudart-dev - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23784 timestamp: 1761098779882 @@ -9590,6 +10006,7 @@ packages: constrains: - arm-variant * sbsa license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 25101 timestamp: 1779913642980 @@ -9643,34 +10060,21 @@ packages: license_family: MIT size: 39128286 timestamp: 1771605119782 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py314h4c416a3_0.conda - sha256: 1369b5b23d9451ae3ef678cb68678778a6ea164186bc8ebe6539a1d6fa803da8 - md5: 822c83a4ba5a12101695ba39607c338f +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda + sha256: 84aebc300e4a0f4ea697d95ec97277301e83f0a457e61efb48b27a14cfb37bda + md5: 4a44c5167b358f22ae2cd89b07728797 depends: - libgcc >=14 - libstdcxx >=14 - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/cython?source=hash-mapping - size: 3707806 - timestamp: 1767577060898 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.8-py314hc6b4731_0.conda - sha256: 4add54f62b3fbdc7f8e1238f5e5990e16a561bed33d18e3dbc1db1d4f6cf8572 - md5: c8ec76477232c7e59f68545a1b4fb8ea - depends: - - libgcc >=14 - - libstdcxx >=14 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - license_family: APACHE run_exports: {} - size: 3747072 - timestamp: 1782821625037 + size: 3741802 + timestamp: 1785016071504 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda sha256: 33fe66d025cf5bac7745196d1a3dd7a437abcf2dbce66043e9745218169f7e17 md5: 6e5a87182d66b2d1328a96b61ca43a62 @@ -9776,6 +10180,7 @@ packages: - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 12035194 timestamp: 1773008913159 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.1.1-gpl_hef17b83_904.conda @@ -9920,6 +10325,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 279044 timestamp: 1771382728182 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.1-hba86a56_0.conda @@ -9944,6 +10350,7 @@ packages: - libfreetype 2.14.2 h8af1aa0_0 - libfreetype6 2.14.2 hdae7a39_0 license: GPL-2.0-only OR FTL + purls: [] size: 173437 timestamp: 1772756019067 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_1.conda @@ -9973,6 +10380,7 @@ packages: - gcc_impl_linux-aarch64 14.3.0 h533bfc8_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 29438 timestamp: 1771378102660 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-15.2.0-h24a549f_18.conda @@ -9984,6 +10392,7 @@ packages: - gcc_no_conda_specs license: BSD-3-Clause license_family: BSD + purls: [] size: 29408 timestamp: 1771378529822 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-h533bfc8_18.conda @@ -10000,6 +10409,7 @@ packages: - sysroot_linux-aarch64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 69149627 timestamp: 1771377858762 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-h3530432_19.conda @@ -10033,8 +10443,26 @@ packages: - sysroot_linux-aarch64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 73516504 timestamp: 1771378256368 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-16.1.0-h04da0f0_1.conda + sha256: ad024e118ed57e7277547fd03a913b981e9bb9a6db258b8943293b13329d4489 + md5: e5551bb5b75bcc4031e40f2b69baab84 + depends: + - binutils_impl_linux-aarch64 >=2.46.1 + - libgcc >=16.1.0 + - libgcc-devel_linux-aarch64 16.1.0 hd673532_101 + - libgomp >=16.1.0 + - libsanitizer 16.1.0 h2510bd8_1 + - libstdcxx >=16.1.0 + - libstdcxx-devel_linux-aarch64 16.1.0 h2445e1f_101 + - sysroot_linux-aarch64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 75102801 + timestamp: 1785374604361 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-15.2.0-h0bf4bd8_27.conda sha256: 2450913611189cc3c26062a43a97a93501159335d4d314cca5e2678fb5f4d3b6 md5: 619b8a05f89220fa8c9536dcfeeddd5b @@ -10049,6 +10477,20 @@ packages: - libgcc >=15 size: 29074 timestamp: 1781279974207 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-16.1.0-hed00b63_0.conda + sha256: 50305dd8c4198b4a38fca1666589bdaba0d26cf2c69f901391259d5b4b1133a4 + md5: 4cb863693c93536916f84802ea2b520c + depends: + - gcc_impl_linux-aarch64 16.1.0.* + - binutils_linux-aarch64 + - sysroot_linux-aarch64 + license: BSD-3-Clause + license_family: BSD + run_exports: + strong: + - libgcc >=16 + size: 29478 + timestamp: 1785386542583 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.44.5-h90308e0_1.conda sha256: aa95b37da0750fb93c5eeef79073b9b0d50976fa0dc02ed0301ff7bbbfc7ff36 md5: c75ae103325db056719dd51d6525e1cd @@ -10061,6 +10503,7 @@ packages: - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 584221 timestamp: 1771532437279 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.44.6-h90308e0_0.conda @@ -10087,6 +10530,7 @@ packages: - spirv-tools >=2026,<2027.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1348415 timestamp: 1770195275881 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glslang-16.3.0-h124e036_0.conda @@ -10134,6 +10578,7 @@ packages: - libstdcxx >=14 license: LGPL-2.0-or-later license_family: LGPL + purls: [] size: 102400 timestamp: 1755102000043 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.15-hfae3067_0.conda @@ -10170,6 +10615,7 @@ packages: - gxx_impl_linux-aarch64 14.3.0 h0d4f5d4_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 28822 timestamp: 1771378129202 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-15.2.0-ha384071_18.conda @@ -10180,6 +10626,7 @@ packages: - gxx_impl_linux-aarch64 15.2.0 h03e2352_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 28780 timestamp: 1771378557194 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_18.conda @@ -10192,6 +10639,7 @@ packages: - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 13513218 timestamp: 1771378064341 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_18.conda @@ -10204,6 +10652,7 @@ packages: - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 15371317 timestamp: 1771378487467 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_19.conda @@ -10219,6 +10668,19 @@ packages: run_exports: {} size: 14640001 timestamp: 1778269082840 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-16.1.0-hd5c6868_1.conda + sha256: 9a8b38dc912b6952e52b554e1eb851da279fd4ead6fee7eac78ee2397be19d40 + md5: b7d0e87c50859580781ed98eb0a70180 + depends: + - gcc_impl_linux-aarch64 16.1.0 h04da0f0_1 + - libstdcxx-devel_linux-aarch64 16.1.0 h2445e1f_101 + - sysroot_linux-aarch64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 15592564 + timestamp: 1785374786297 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-15.2.0-h7e4acf5_27.conda sha256: f4bc63d467e2c48c255bc8d2886fb11f6a8d09c1251a6f5b25628abee1768693 md5: ea51d6df068bee183ff667f75bfdc2f6 @@ -10235,6 +10697,22 @@ packages: - libgcc >=15 size: 27620 timestamp: 1781279974207 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-16.1.0-h4223dcb_0.conda + sha256: edfc3ee04478cdfed6b84f58bc1db77818ed92f1d58bd6de565e9a8bacb5a558 + md5: 036c35401710f4b03aba2a0cc5792496 + depends: + - gxx_impl_linux-aarch64 16.1.0.* + - gcc_linux-aarch64 ==16.1.0 hed00b63_0 + - binutils_linux-aarch64 + - sysroot_linux-aarch64 + license: BSD-3-Clause + license_family: BSD + run_exports: + strong: + - libstdcxx >=16 + - libgcc >=16 + size: 27895 + timestamp: 1785386542583 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.1.0-h1134a53_0.conda sha256: 49074457bdc624c0c0f39bb4b9b7689ec6334127ed7d5312484908f48e9a8e20 md5: 811bb5384d92870a3492fab4de4ff3f6 @@ -10251,6 +10729,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 2346492 timestamp: 1773222371375 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-14.2.1-h1134a53_0.conda @@ -10280,6 +10759,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 12851689 timestamp: 1772208964788 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda @@ -10360,6 +10840,7 @@ packages: - binutils_impl_linux-aarch64 2.45.1 license: GPL-3.0-only license_family: GPL + purls: [] size: 875924 timestamp: 1770267209884 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda @@ -10443,6 +10924,7 @@ packages: - blas 2.305 openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18369 timestamp: 1765818610617 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda @@ -10521,6 +11003,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 108542 timestamp: 1762350753349 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.77-hf9559e3_1.conda @@ -10546,6 +11029,18 @@ packages: - libcap >=2.78,<2.79.0a0 size: 109192 timestamp: 1775490102029 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda + sha256: 6487e7644d062e18d389c11a9a3183e5a71c2652d05fdd88dbd063ad09f7ad4b + md5: 5e347c665a310b4c148bbb02596ae0c3 + depends: + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcap >=2.78,<2.79.0a0 + size: 108530 + timestamp: 1786025925536 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda build_number: 5 sha256: 3fad5c9de161dccb4e42c8b1ae8eccb33f4ed56bccbcced9cbb0956ae7869e61 @@ -10558,6 +11053,7 @@ packages: - blas 2.305 openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18371 timestamp: 1765818618899 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda @@ -10675,6 +11171,7 @@ packages: - libstdcxx >=14 - rdma-core >=59.0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 909365 timestamp: 1761098964619 @@ -10789,6 +11286,7 @@ packages: - libpciaccess >=0.18,<0.19.0a0 license: MIT license_family: MIT + purls: [] size: 344548 timestamp: 1757212128414 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.127-he30d5cf_0.conda @@ -10820,6 +11318,7 @@ packages: depends: - libglvnd 1.7.0 hd24410f_2 license: LicenseRef-libglvnd + purls: [] size: 53551 timestamp: 1731330990477 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libegl-1.7.0-hd24410f_3.conda @@ -10840,6 +11339,7 @@ packages: - expat 2.7.4.* license: MIT license_family: MIT + purls: [] size: 76564 timestamp: 1771259530958 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda @@ -10899,6 +11399,7 @@ packages: depends: - libfreetype6 >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 8108 timestamp: 1772756012710 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_1.conda @@ -10920,6 +11421,7 @@ packages: constrains: - freetype >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 423372 timestamp: 1772756012086 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_1.conda @@ -10962,6 +11464,20 @@ packages: run_exports: {} size: 622462 timestamp: 1778268755949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + sha256: 88a3d400c678df034c9d498f32503779977d5ea826063687c663e42c945abed5 + md5: 91eb209af1098d652fc69b8a3fc7cbaa + depends: + - _openmp_mutex >=4.5 + constrains: + - libgomp 16.1.0 h8acb6b2_1 + - libgcc-ng ==16.1.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 628785 + timestamp: 1785374520532 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f md5: 4feebd0fbf61075a1a9c2e9b3936c257 @@ -10981,6 +11497,19 @@ packages: purls: [] size: 27738 timestamp: 1778268759211 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_1.conda + sha256: e0456b4b49e8f9f9ffc04b1b412101ea2c38476eaceb9a0e4e16792d7cfdd929 + md5: e4489d8717b51cee8a33f2b66d10fa6a + depends: + - libgcc 16.1.0 h205dda4_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libgcc + size: 28123 + timestamp: 1785374523851 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda sha256: 7dcd7dff2505d56fd5272a6e712ec912f50a46bf07dc6873a7e853694304e6e4 md5: 41f261f5e4e2e8cbd236c2f1f15dae1b @@ -11036,6 +11565,7 @@ packages: - libglvnd 1.7.0 hd24410f_2 - libglx 1.7.0 hd24410f_2 license: LicenseRef-libglvnd + purls: [] size: 145442 timestamp: 1731331005019 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgl-1.7.0-hd24410f_3.conda @@ -11079,6 +11609,7 @@ packages: constrains: - glib 2.86.4 *_1 license: LGPL-2.1-or-later + purls: [] size: 4512186 timestamp: 1771863220969 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.1-h96a7f82_2.conda @@ -11100,6 +11631,7 @@ packages: sha256: 57ec3898a923d4bcc064669e90e8abfc4d1d945a13639470ba5f3748bd3090da md5: 9e115653741810778c9a915a2f8439e7 license: LicenseRef-libglvnd + purls: [] size: 152135 timestamp: 1731330986070 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglvnd-1.7.0-hd24410f_3.conda @@ -11116,6 +11648,7 @@ packages: - libglvnd 1.7.0 hd24410f_2 - xorg-libx11 >=1.8.9,<2.0a0 license: LicenseRef-libglvnd + purls: [] size: 77736 timestamp: 1731330998960 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglx-1.7.0-hd24410f_3.conda @@ -11168,6 +11701,17 @@ packages: - _openmp_mutex >=4.5 size: 587387 timestamp: 1778268674393 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + sha256: 1c609a4a72597350317b92c4d9dfb85d21740219048e2b1d458925a6ccfa3d7a + md5: 4c9b02fc9fe27704777e260157003653 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 617180 + timestamp: 1785374444877 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.12.2-default_ha470c98_1000.conda sha256: e87cf64d87c7706403507df7329f5b597c3b487f4c72ef53ef899e38983ea70e md5: c8b05c85ae962a993d9b7d6c9d10571e @@ -11178,6 +11722,7 @@ packages: - libxml2-16 >=2.14.6 license: BSD-3-Clause license_family: BSD + purls: [] size: 2467105 timestamp: 1765103804193 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.13.0-default_ha95e27d_1000.conda @@ -11200,6 +11745,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: Apache-2.0 OR BSD-3-Clause + purls: [] size: 1180000 timestamp: 1758894754411 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwy-1.4.0-h0626a34_0.conda @@ -11229,6 +11775,7 @@ packages: constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib + purls: [] size: 691818 timestamp: 1762094728337 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda @@ -11253,6 +11800,7 @@ packages: - libhwy >=1.3.0,<1.4.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1489440 timestamp: 1770801995062 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjxl-0.11.2-hbae46ee_1.conda @@ -11281,6 +11829,7 @@ packages: - libcblas 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD + purls: [] size: 18392 timestamp: 1765818627104 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda @@ -11428,6 +11977,7 @@ packages: - libgcc >=14 - libstdcxx >=14 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 30323952 timestamp: 1760723774770 @@ -11454,6 +12004,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libnvptxcompiler-dev_linux-aarch64 12.9.86 h579c4fd_2 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27138 timestamp: 1753975408006 @@ -11496,6 +12047,7 @@ packages: - openblas >=0.3.30,<0.3.31.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 4959359 timestamp: 1763114173544 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda @@ -11536,6 +12088,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 5742222 timestamp: 1772721263739 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-2026.2.0-h1915271_0.conda @@ -11562,6 +12115,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 10237615 timestamp: 1772721303162 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-arm-cpu-plugin-2026.2.0-h1915271_0.conda @@ -11588,6 +12142,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 111064 timestamp: 1772721336786 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-batch-plugin-2026.2.0-h3d5001d_0.conda @@ -11613,6 +12168,7 @@ packages: - tbb >=2022.3.0 license: Apache-2.0 license_family: APACHE + purls: [] size: 236010 timestamp: 1772721351244 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-auto-plugin-2026.2.0-h3d5001d_0.conda @@ -11638,6 +12194,7 @@ packages: - pugixml >=1.15,<1.16.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 202574 timestamp: 1772721365749 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-hetero-plugin-2026.2.0-he07c6df_0.conda @@ -11663,6 +12220,7 @@ packages: - pugixml >=1.15,<1.16.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 185648 timestamp: 1772721380070 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-ir-frontend-2026.2.0-he07c6df_0.conda @@ -11690,6 +12248,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 1665115 timestamp: 1772721394860 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-onnx-frontend-2026.2.0-h558496d_0.conda @@ -11719,6 +12278,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 631754 timestamp: 1772721411589 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-paddle-frontend-2026.2.0-h558496d_0.conda @@ -11745,6 +12305,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 1091266 timestamp: 1772721428223 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-pytorch-frontend-2026.2.0-hfae3067_0.conda @@ -11772,6 +12333,7 @@ packages: - snappy >=1.2.2,<1.3.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 1184078 timestamp: 1772721443833 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-frontend-2026.2.0-h2cb6e3c_0.conda @@ -11799,6 +12361,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 428895 timestamp: 1772721459028 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2026.2.0-hfae3067_0.conda @@ -11830,6 +12393,7 @@ packages: - libgcc >=13 license: MIT license_family: MIT + purls: [] size: 29512 timestamp: 1749901899881 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpciaccess-0.19-he30d5cf_0.conda @@ -11863,6 +12427,7 @@ packages: - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement + purls: [] size: 340156 timestamp: 1770691477245 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda @@ -11886,6 +12451,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 3465308 timestamp: 1769748410724 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-6.33.5-h306233d_1.conda @@ -11915,6 +12481,7 @@ packages: constrains: - __glibc >=2.17 license: LGPL-2.1-or-later + purls: [] size: 4016799 timestamp: 1771406266442 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.62.3-hf685517_0.conda @@ -11944,6 +12511,7 @@ packages: - libstdcxx >=14.3.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 7526147 timestamp: 1771377792671 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_18.conda @@ -11954,6 +12522,7 @@ packages: - libstdcxx >=15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 7164557 timestamp: 1771378185265 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_19.conda @@ -11969,6 +12538,19 @@ packages: - libsanitizer 15.2.0 size: 7067965 timestamp: 1778268796086 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-16.1.0-h2510bd8_1.conda + sha256: 3dfccbcd3bf34923df7482df41bcdbe599675f2de6f03a554dbc238476693854 + md5: ae3d9771453f2ec660dd79e5728129b3 + depends: + - libgcc >=16.1.0 + - libstdcxx >=16.1.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: + weak: + - libsanitizer 16.1.0 + size: 8123895 + timestamp: 1785374560390 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h30591a0_2.conda sha256: f0b6844c09cdec608ca504bd97c5d64a5596a25f66ad806381f9d63dfc89e432 md5: 362bc94148039b77c6a42b1f7e7ef537 @@ -12030,6 +12612,18 @@ packages: - libsqlite >=3.53.3,<4.0a0 size: 968420 timestamp: 1782519054102 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda + sha256: da46b52f6815e9771f4e21e3332c423c88644e91ac96b0534e85158adc88a8b4 + md5: 99898219505ff142be5734dc6fa0d900 + depends: + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + license: blessing + run_exports: + weak: + - libsqlite >=3.53.4,<4.0a0 + size: 963888 + timestamp: 1785016056926 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 md5: f56573d05e3b735cb03efeb64a15f388 @@ -12055,6 +12649,19 @@ packages: run_exports: {} size: 5546559 timestamp: 1778268777463 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + sha256: 81ef9a10a0e01ffc7e03d429ed048410153411b2d8bbf95c334bdf3dcf175ab0 + md5: 0bfd287b881e05351a01c7ebf7bf8f1b + depends: + - libgcc 16.1.0 h205dda4_1 + constrains: + - libstdcxx-ng ==16.1.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 6255794 + timestamp: 1785374543663 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda sha256: 035a31cde134e706e30029a837a31f729ad32b7c5bca023271dfe91a8ba6c896 md5: 699d294376fe18d80b7ce7876c3a875d @@ -12074,6 +12681,19 @@ packages: purls: [] size: 27803 timestamp: 1778268813278 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_1.conda + sha256: cb88eb500022e01f835209e771d455d2296e10a18a749f518c257dfcab7d46ba + md5: a728408241f9db99bad0d1642c908714 + depends: + - libstdcxx 16.1.0 hef695bb_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libstdcxx + size: 28182 + timestamp: 1785374577436 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.10-hf9559e3_4.conda sha256: 95bb4c430e8ca666a4c67b7951f03fbee5a5258b1d29c2a26bf56c86fe32c010 md5: 96e731e9cf876fb2d8882093c0f24630 @@ -12081,6 +12701,7 @@ packages: - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] size: 517911 timestamp: 1770738680829 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hf9559e3_0.conda @@ -12175,6 +12796,7 @@ packages: - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later + purls: [] size: 157130 timestamp: 1770738690431 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hf9559e3_0.conda @@ -12237,6 +12859,7 @@ packages: - libgcc >=14 license: BSD-3-Clause license_family: BSD + purls: [] size: 43453 timestamp: 1766271546875 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda @@ -12367,6 +12990,7 @@ packages: - xorg-libxau >=1.0.12,<2.0a0 license: MIT/X11 Derivative license_family: MIT + purls: [] size: 863646 timestamp: 1764794352540 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxkbcommon-1.13.2-h3c6a4c8_0.conda @@ -12398,6 +13022,7 @@ packages: - libxml2 2.15.2 license: MIT license_family: MIT + purls: [] size: 598438 timestamp: 1772704671710 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h79dcc73_0.conda @@ -12428,6 +13053,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + purls: [] size: 47837 timestamp: 1772704681112 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h869d058_0.conda @@ -12454,6 +13080,7 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other + purls: [] size: 66657 timestamp: 1727963199518 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda @@ -12469,6 +13096,18 @@ packages: - libzlib >=1.3.2,<2.0a0 size: 69833 timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + sha256: 76efa6cc9d7e6f5ee3bbca0939f64054af2bdfb3c3632531f8e633cf6c2ea41e + md5: bd534c2fbe56d8c2ea3b2d8f5e12bca8 + constrains: + - zlib 1.3.2 *_3 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 70108 + timestamp: 1785276540870 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-22.1.0-he40846f_0.conda sha256: 08e50e981736118b6cc379096395bd725eeac1cb3852bcdfa1d2980acba39c29 md5: 757e953866f430da9de3fcebf44d1474 @@ -12515,6 +13154,8 @@ packages: - numpy >=1.23,<3 - python_abi 3.14.* *_cp314 license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping size: 306998 timestamp: 1771362449472 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.3.1-h783934e_1.conda @@ -12614,6 +13255,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 8006259 timestamp: 1770098510476 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda @@ -12709,6 +13352,19 @@ packages: - openssl >=3.6.3,<4.0a0 size: 3704664 timestamp: 1781069675555 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda + sha256: c89e748e8a008e8ca6f25e102362f33319db0c98cc29d98ddada92842f636327 + md5: 1600dfde78c5adba306f8571af62a323 + depends: + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 3719270 + timestamp: 1785913554920 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/optree-0.19.0-py314hd7d8586_0.conda sha256: 78deba0984ab747179c1aa87f024d6597ecfba75378c9b4601046d9c8ab59956 md5: 214ab44a77f6135a6b0178c1c9cb5149 @@ -12760,6 +13416,7 @@ packages: - libpng >=1.6.49,<1.7.0a0 - libzlib >=1.3.1,<2.0a0 license: LGPL-2.1-or-later + purls: [] size: 468811 timestamp: 1751293869070 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda @@ -12951,6 +13608,37 @@ packages: size: 34900936 timestamp: 1781254861576 python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda + build_number: 101 + sha256: b8135c10971f387402f42b8fe52cf983665e9af9a7b5c839ae082a0f71f6c0c4 + md5: 6ed1a6d56adc15f18919b6fc87660bd1 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.53.3,<4.0a0 + - libuuid >=2.42.2,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.7,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + run_exports: + weak: + - python_abi 3.14.* *_cp314 + noarch: + - python + size: 34850010 + timestamp: 1784909900639 + python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.10.0-cuda130_generic_py314_h7cb4a1c_203.conda sha256: 70b45b24d9591f943ff3a5ffff9419af85293e318a5f001be41cd9538d4e21c9 md5: eec5f372504eec64c324446bbfc8442a @@ -13219,6 +13907,7 @@ packages: - dbus >=1.16.2,<2.0a0 - xorg-libx11 >=1.8.13,<2.0a0 license: Zlib + purls: [] size: 2136476 timestamp: 1771668207211 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/shaderc-2025.5-hfeb5c2c_1.conda @@ -13231,6 +13920,7 @@ packages: - spirv-tools >=2026,<2027.0a0 license: Apache-2.0 license_family: Apache + purls: [] size: 115498 timestamp: 1770208786806 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/shaderc-2026.2-hfeb5c2c_0.conda @@ -13278,6 +13968,7 @@ packages: - spirv-headers >=1.4.341.0,<1.4.341.1.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 2255599 timestamp: 1770089690097 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/spirv-tools-2026.2-hfefdfc9_0.conda @@ -13328,6 +14019,7 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: APACHE + purls: [] size: 144746 timestamp: 1767888618836 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tbb-2023.0.0-h57272ed_2.conda @@ -13419,6 +14111,18 @@ packages: run_exports: {} size: 20306087 timestamp: 1784166394558 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda + sha256: 1c3f53ff574ca92562c83e29ab158d0e5790ed3dc0a70bc6c7a6e6108bc5c623 + md5: db4ed0e0968098dd8bdca55d62dc5dc5 + depends: + - libgcc >=14 + - libstdcxx >=14 + constrains: + - __glibc >=2.17 + license: Apache-2.0 OR MIT + run_exports: {} + size: 17181969 + timestamp: 1785973409651 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.24.0-h4f8a99f_1.conda sha256: d94af8f287db764327ac7b48f6c0cd5c40da6ea2606afd34ac30671b7c85d8ee md5: f6966cb1f000c230359ae98c29e37d87 @@ -13429,6 +14133,7 @@ packages: - libstdcxx >=14 license: MIT license_family: MIT + purls: [] size: 331480 timestamp: 1761174368396 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.25.0-h4f8a99f_0.conda @@ -13484,6 +14189,7 @@ packages: - xorg-libx11 >=1.8.13,<2.0a0 license: MIT license_family: MIT + purls: [] size: 399629 timestamp: 1772021320967 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda @@ -13584,6 +14290,7 @@ packages: - xorg-libxfixes >=6.0.1,<7.0a0 license: MIT license_family: MIT + purls: [] size: 48197 timestamp: 1727801059062 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.3-he30d5cf_0.conda @@ -13910,6 +14617,24 @@ packages: run_exports: {} size: 128866 timestamp: 1781708962055 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + sha256: 95e8e74062a5fe5f870ac8c90302b6e89945165fdaed7810606e84ddee6aac12 + md5: e27d2ac27b096dc51fedfcf775a53f9b + depends: + - __win + license: ISC + run_exports: {} + size: 132136 + timestamp: 1784754918886 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + sha256: 0a0544cf95f64394fe4959286f5c71f5444ad58feb0602e53becb27448d24da6 + md5: 0f51e2391ade309db462a55611263e9c + depends: + - __unix + license: ISC + run_exports: {} + size: 131780 + timestamp: 1784754889428 - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda sha256: ec791bb6f1ef504411f87b28946a7ae63ed1f3681cefc462cf1dfdaf0790b6a9 md5: 241ef6e3db47a143ac34c21bfba510f1 @@ -13979,6 +14704,8 @@ packages: - python license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/cloudpickle?source=hash-mapping size: 27353 timestamp: 1765303462831 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda @@ -14033,6 +14760,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1150650 timestamp: 1746189825236 @@ -14042,6 +14770,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 1472271 timestamp: 1779895496841 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_0.conda @@ -14053,6 +14782,15 @@ packages: run_exports: {} size: 1475805 timestamp: 1782773759292 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_1.conda + sha256: fa44586fc308d0089fb5f014d5b53cbea19a2e83cd7bbd1e19c79140293be9a3 + md5: 199a317645eac1a18745d05dc551ab6e + depends: + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + run_exports: {} + size: 1486700 + timestamp: 1785874560026 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-12.9.27-h579c4fd_0.conda sha256: b4efaee8fa95b9ec97a462dc343914a138ece704895e33caa52ac55968f7adfa md5: 71e4d87a72bf003bd05f05a502288b2a @@ -14060,6 +14798,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1149299 timestamp: 1746189919921 @@ -14070,6 +14809,7 @@ packages: - arm-variant * sbsa - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 1481900 timestamp: 1779895522474 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-13.3.3.4.1-h579c4fd_0.conda @@ -14082,12 +14822,23 @@ packages: run_exports: {} size: 1480995 timestamp: 1782773779842 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-13.3.3.4.1-h579c4fd_1.conda + sha256: 0b5f21da410f288503f4f9b97b0d4bbec670c25dbf2317b6a92703fbe1a8b91a + md5: 23397299679c728e710be12875f64857 + depends: + - arm-variant * sbsa + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + run_exports: {} + size: 1479144 + timestamp: 1785874588629 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-12.9.27-h57928b3_0.conda sha256: 681eb1d9afd596e04329a82b04734c0e37c6ecb94b3380f3a378d61983e2a8cc md5: 8f897dca7111f3bb4ded97ba6947b186 depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1139649 timestamp: 1746189858434 @@ -14097,6 +14848,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 1462453 timestamp: 1779895589763 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_0.conda @@ -14108,12 +14860,22 @@ packages: run_exports: {} size: 1467923 timestamp: 1782773832153 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_1.conda + sha256: 57729383a520a75b1373c6795cd412e76f3799105e3240b258d33fbcc2d598e5 + md5: 6c36b47ed939964651d102a179699d1d + depends: + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + run_exports: {} + size: 1476948 + timestamp: 1785874646188 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda sha256: e6257534c4b4b6b8a1192f84191c34906ab9968c92680fa09f639e7846a87304 md5: 79d280de61e18010df5997daea4743df depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 94239 timestamp: 1753975242354 @@ -14123,6 +14885,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 116655 timestamp: 1779905079263 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_0.conda @@ -14141,6 +14904,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 94794 timestamp: 1753975199249 @@ -14151,6 +14915,7 @@ packages: - arm-variant * sbsa - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 116665 timestamp: 1779905122757 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-13.3.73-h579c4fd_0.conda @@ -14169,6 +14934,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 95452 timestamp: 1753975640812 @@ -14178,6 +14944,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] size: 117452 timestamp: 1779905164275 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-13.3.73-h57928b3_0.conda @@ -14198,6 +14965,7 @@ packages: - cuda-cudart_linux-64 - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -14212,6 +14980,7 @@ packages: - cuda-cudart_linux-64 - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=13.3.29,<14.0a0 @@ -14227,6 +14996,7 @@ packages: - cuda-cudart_linux-aarch64 - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -14242,6 +15012,7 @@ packages: - cuda-cudart_linux-aarch64 - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=13.3.29,<14.0a0 @@ -14256,6 +15027,7 @@ packages: - cuda-cudart_win-64 - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -14270,6 +15042,7 @@ packages: - cuda-cudart_win-64 - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1548117 timestamp: 1779898493787 @@ -14279,6 +15052,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1148889 timestamp: 1749218381225 @@ -14288,6 +15062,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1126340 timestamp: 1779898412056 @@ -14298,6 +15073,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1152498 timestamp: 1749218333554 @@ -14308,6 +15084,7 @@ packages: - arm-variant * sbsa - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 1133087 timestamp: 1779898428591 @@ -14317,6 +15094,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 354611 timestamp: 1749218544740 @@ -14326,6 +15104,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 83026 timestamp: 1779898478182 @@ -14335,6 +15114,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 197249 timestamp: 1749218394213 @@ -14355,6 +15135,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 212993 timestamp: 1749218341193 @@ -14375,6 +15156,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23260 timestamp: 1749218569458 @@ -14384,6 +15166,7 @@ packages: depends: - cuda-version >=13.3,<13.4.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 24659 timestamp: 1779898481919 @@ -14399,6 +15182,7 @@ packages: constrains: - gcc_impl_linux-64 >=6,<15.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 28121 timestamp: 1753975535813 @@ -14415,6 +15199,7 @@ packages: constrains: - gcc_impl_linux-aarch64 >=6,<15.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 28252 timestamp: 1753975422031 @@ -14427,6 +15212,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libnvptxcompiler-dev_win-64 12.9.86 h57928b3_2 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23452957 timestamp: 1753976361068 @@ -14436,6 +15222,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27096 timestamp: 1753975261562 @@ -14464,6 +15251,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27218 timestamp: 1753975206503 @@ -14493,6 +15281,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27284 timestamp: 1753975714790 @@ -14523,6 +15312,8 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/cuda-pathfinder?source=hash-mapping size: 41835 timestamp: 1773187684373 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.5.6-pyhc364b38_0.conda @@ -14537,6 +15328,18 @@ packages: run_exports: {} size: 45350 timestamp: 1782782777927 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda + sha256: a949bc139e9bc53d9d6dd0fe18b587f3ed49e870fe5994c7b6ae424d698f00cd + md5: d154eea5563eb45f05031ef90fed6518 + depends: + - python >=3.10 + - cuda-version >=12.0,<14 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 46398 + timestamp: 1784649204190 - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda sha256: 5f5f428031933f117ff9f7fcc650e6ea1b3fef5936cf84aa24af79167513b656 md5: b6d5d7f1c171cbd228ea06b556cfa859 @@ -14544,6 +15347,7 @@ packages: - cudatoolkit 12.9|12.9.* - __cuda >=12 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 21578 timestamp: 1746134436166 @@ -14592,6 +15396,19 @@ packages: - pkg:pypi/docutils?source=hash-mapping size: 402700 timestamp: 1733217860944 +- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.23-pyhcf101f3_0.conda + sha256: def3b2566a1702fa083a8984753ac0b3e3f7381048f88714e03d55b7bd930b74 + md5: 2c3958e02221c2504ec036139e648d8b + depends: + - python >=3.10 + - python + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/docutils?source=hash-mapping + run_exports: {} + size: 459540 + timestamp: 1779967837277 - conda: https://conda.anaconda.org/conda-forge/noarch/domdf-python-tools-3.10.0-pyhff2d567_0.conda sha256: e7a7121de51caa332e73a0a7345d78fb514a8460311347be5d8eba0738c66c31 md5: 0254332c3957f0ae09a58670c2d7ea01 @@ -14799,6 +15616,8 @@ packages: - python license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=hash-mapping size: 34641 timestamp: 1747934053147 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda @@ -15092,6 +15911,7 @@ packages: - sysroot_linux-64 ==2.28 license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later license_family: GPL + purls: [] run_exports: {} size: 1278712 timestamp: 1765578681495 @@ -15102,6 +15922,7 @@ packages: - sysroot_linux-aarch64 ==2.28 license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later license_family: GPL + purls: [] run_exports: {} size: 1248134 timestamp: 1765578613607 @@ -15112,6 +15933,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 3084533 timestamp: 1771377786730 - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_118.conda @@ -15121,6 +15943,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 3085932 timestamp: 1771378098166 - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda @@ -15133,6 +15956,16 @@ packages: run_exports: {} size: 3095909 timestamp: 1778268932148 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-16.1.0-h59071f9_101.conda + sha256: b314251d957b16c71ec241119ac09b9530c5c4ce140026ec98d297f55d6c5e08 + md5: 19b0151ecb1d122f706ebd2f82f9a017 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 3096495 + timestamp: 1785375361053 - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_118.conda sha256: 058fab0156cb13897f7e4a2fc9d63c922d3de09b6429390365f91b62f1dddb0e md5: 3733752e5a7a0737c8c4f1897f2074f9 @@ -15140,6 +15973,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 2335839 timestamp: 1771377646960 - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_118.conda @@ -15149,6 +15983,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 2364690 timestamp: 1771378032404 - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_119.conda @@ -15161,6 +15996,16 @@ packages: run_exports: {} size: 2353893 timestamp: 1778268665954 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_101.conda + sha256: 885f0d8a47f7ea50d7b33d07a240f2301935602b9d2a39a35b5018b13e934100 + md5: 00cdfad75c8331e103f830fb17184da1 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 2357226 + timestamp: 1785374433650 - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_win-64-15.2.0-hbb59886_118.conda sha256: e43ffa48a88a7d77a0dc0d3ccfa3acc55702e9d964e8564e86927f5a389a6c51 md5: 1e020780767f809769807a442f5d6f6a @@ -15168,6 +16013,7 @@ packages: - m2-conda-epoch license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 2422242 timestamp: 1771382108271 - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda @@ -15176,6 +16022,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 14422867 timestamp: 1753975387297 @@ -15186,6 +16033,7 @@ packages: - arm-variant * sbsa - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 13939480 timestamp: 1753975314178 @@ -15195,6 +16043,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 31818844 timestamp: 1753976049670 @@ -15205,6 +16054,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 20171098 timestamp: 1771377827750 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_118.conda @@ -15214,6 +16064,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 20669511 timestamp: 1771378139786 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda @@ -15226,6 +16077,16 @@ packages: run_exports: {} size: 20765069 timestamp: 1778268963689 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-16.1.0-h41cdd0d_101.conda + sha256: c1521172f2fdf5510d79b621ea835064209fe3131518e0d8b2b43362a75e7b4c + md5: 8593636203272a748b63d56cbd674753 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 22519609 + timestamp: 1785375386152 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_118.conda sha256: 609585a02b05a2b0f2cabb18849328455cbce576f2e3eb8108f3ef7f4cb165a6 md5: bcf29f2ed914259a258204b05346abb1 @@ -15233,6 +16094,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 17565700 timestamp: 1771377672552 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_118.conda @@ -15242,6 +16104,7 @@ packages: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 17628403 timestamp: 1771378058765 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_119.conda @@ -15254,6 +16117,16 @@ packages: run_exports: {} size: 17627362 timestamp: 1778268687968 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-16.1.0-h2445e1f_101.conda + sha256: 926d2c2dedfca7334804d5c8a0727a3746ef580be8763f51ccc2ece24c7be56c + md5: d2cd8c4b92b4e6dbcb2616d855107aca + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 19792513 + timestamp: 1785374457502 - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_win-64-15.2.0-h0a72980_118.conda sha256: 0b27331f127c6c10017442cc98c483aa868298102e98aae70ad86b9a5ae0029e md5: b7a331c07d140e476fee0c70c9696e87 @@ -15261,6 +16134,7 @@ packages: - m2-conda-epoch license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 11729036 timestamp: 1771382135681 - conda: https://conda.anaconda.org/conda-forge/noarch/m2w64-sysroot_win-64-12.0.0.r4.gg4f2fc60ca-hd8ed1ab_10.conda @@ -15273,6 +16147,7 @@ packages: - mingw-w64-ucrt-x86_64-windows-default-manifest - mingw-w64-ucrt-x86_64-winpthreads-git 12.0.0.r4.gg4f2fc60ca hd8ed1ab_10 - ucrt + purls: [] size: 8421 timestamp: 1759768559974 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda @@ -15331,6 +16206,7 @@ packages: constrains: - mingw-w64-ucrt-x86_64-winpthreads-git 12.0.0.r4.gg4f2fc60ca.* license: ZPL-2.1 + purls: [] size: 5663635 timestamp: 1759768458961 - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-headers-git-12.0.0.r4.gg4f2fc60ca-hd8ed1ab_10.conda @@ -15342,6 +16218,7 @@ packages: - mingw-w64-ucrt-x86_64-crt-git 12.0.0.r4.gg4f2fc60ca.* - mingw-w64-ucrt-x86_64-winpthreads-git 12.0.0.r4.gg4f2fc60ca.* license: ZPL-2.1 AND LGPL-2.1-or-later + purls: [] size: 7089846 timestamp: 1759768412123 - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-windows-default-manifest-6.4-he206cdd_7.conda @@ -15352,6 +16229,7 @@ packages: constrains: - m2w64-sysroot_win-64 >=12.0.0.r0 license: FSFAP + purls: [] size: 7412 timestamp: 1717486007140 - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-winpthreads-git-12.0.0.r4.gg4f2fc60ca-hd8ed1ab_10.conda @@ -15363,6 +16241,7 @@ packages: constrains: - mingw-w64-ucrt-x86_64-crt-git 12.0.0.r4.gg4f2fc60ca.* license: MIT AND BSD-3-Clause-Clear + purls: [] size: 123916 timestamp: 1759768539535 - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-11.0.1-pyhcf101f3_0.conda @@ -15536,7 +16415,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/packaging?source=compressed-mapping + - pkg:pypi/packaging?source=hash-mapping size: 72010 timestamp: 1769093650580 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda @@ -15550,6 +16429,16 @@ packages: run_exports: {} size: 91574 timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + sha256: c432626b16768b8dab228bfb706f7060c2d462a21c516d240f68f2f902b5a044 + md5: 936687ed80f295a1f5dbcf8bd34c252c + depends: + - python >=3.9 + - python + license: Apache-2.0 + run_exports: {} + size: 116363 + timestamp: 1785888127370 - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda sha256: 42b2d77ccea60752f3aa929a6413a7835aaacdbbde679f2f5870a744fa836b94 md5: 97c1ce2fffa1209e7afb432810ec6e12 @@ -15650,6 +16539,8 @@ packages: - python >=3.9 license: MIT license_family: MIT + purls: + - pkg:pypi/py-cpuinfo?source=hash-mapping size: 25766 timestamp: 1733236452235 - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda @@ -15735,6 +16626,8 @@ packages: - python >=3.10 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pyglet?source=hash-mapping size: 725938 timestamp: 1770169149613 - conda: https://conda.anaconda.org/conda-forge/noarch/pyglet-2.1.14-pyhd8ed1ab_0.conda @@ -15757,6 +16650,8 @@ packages: - python >=3.9 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping size: 889287 timestamp: 1750615908735 - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda @@ -15837,6 +16732,8 @@ packages: - python >=3.10 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/pytest-benchmark?source=hash-mapping size: 43976 timestamp: 1762716480208 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-3.15.0-pyhd8ed1ab_0.conda @@ -15848,6 +16745,8 @@ packages: - python >=3.6 license: MIT license_family: MIT + purls: + - pkg:pypi/pytest-randomly?source=hash-mapping size: 14133 timestamp: 1692131735622 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda @@ -15858,6 +16757,8 @@ packages: - python >=3.9 license: MPL-2.0 license_family: MOZILLA + purls: + - pkg:pypi/pytest-repeat?source=hash-mapping size: 10537 timestamp: 1744061283541 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda @@ -15869,6 +16770,8 @@ packages: - python >=3.10 license: MPL-2.0 license_family: OTHER + purls: + - pkg:pypi/pytest-rerunfailures?source=hash-mapping size: 19613 timestamp: 1760091441792 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -15993,6 +16896,8 @@ packages: - python >=3.10 license: MIT license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping size: 639697 timestamp: 1773074868565 - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda @@ -16021,6 +16926,22 @@ packages: run_exports: {} size: 28577 timestamp: 1782401906421 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + sha256: 8eb9daf6fc70111abf73f848c6d32d2769aa1fba550f793b865076fd4e33fb3a + md5: eefa3bc61c9224107d3a9afeb37552a9 + depends: + - python >=3.10 + - vcs_versioning >=2.0.0.dev0 + - packaging >=20 + - setuptools + - tomli >=1 + - typing_extensions + - python + license: MIT + license_family: MIT + run_exports: {} + size: 29407 + timestamp: 1784653562396 - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -16283,6 +17204,7 @@ packages: - tzdata license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later license_family: GPL + purls: [] run_exports: strong: - __glibc >=2.28,<3.0.a0 @@ -16297,6 +17219,7 @@ packages: - tzdata license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later license_family: GPL + purls: [] run_exports: strong: - __glibc >=2.28,<3.0.a0 @@ -16322,6 +17245,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/tomli?source=hash-mapping size: 21453 timestamp: 1768146676791 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda @@ -16437,6 +17362,20 @@ packages: run_exports: {} size: 83180 timestamp: 1782748145197 +- conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + sha256: 179dd4ed561926e5ab95934009bb4359487264de149b5274e43e9e094900dfe4 + md5: 3a8fb54b1dc8fbfdeb51083a1143edd1 + depends: + - python >=3.10 + - packaging >=26.2 + - tomli >=1 + - typing_extensions >=4.1 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 83586 + timestamp: 1785306846938 - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda sha256: b72270395326dc56de9bd6ca82f63791b3c8c9e2b98e25242a9869a4ca821895 md5: f622897afff347b715d046178ad745a5 @@ -16452,6 +17391,7 @@ packages: md5: 7da1571f560d4ba3343f7f4c48a79c76 license: MIT license_family: MIT + purls: [] size: 140476 timestamp: 1765821981856 - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.49-hd8ed1ab_0.conda @@ -16519,6 +17459,7 @@ packages: - msys2-conda-epoch <0.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 52252 timestamp: 1770943776666 - conda: https://conda.anaconda.org/conda-forge/win-64/aom-3.14.1-pl5321h06fc181_1.conda @@ -16542,6 +17483,7 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-2-Clause license_family: BSD + purls: [] size: 1958151 timestamp: 1718551737234 - conda: https://conda.anaconda.org/conda-forge/win-64/binutils_impl_win-64-2.45.1-default_ha84baeb_101.conda @@ -16553,6 +17495,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 5830940 timestamp: 1770267725685 - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda @@ -16572,6 +17515,20 @@ packages: - pkg:pypi/brotli?source=hash-mapping size: 335782 timestamp: 1764018443683 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda + sha256: 04767466ee9227c9c57ab2c6503e0149177d34111c7418d2f420297acb1eb229 + md5: c3301c058362f340100d91cd8be0393f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 55919 + timestamp: 1785906343696 - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda sha256: 76dfb71df5e8d1c4eded2dbb5ba15bb8fb2e2b0fe42d94145d5eed4c75c35902 md5: 4cb8e6b48f67de0b018719cdf1136306 @@ -16629,6 +17586,7 @@ packages: - gcc_impl_win-64 >=15.2.0,<15.2.1.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 54725 timestamp: 1771382417485 - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-12.9.6-py314hdc4d7ff_0.conda @@ -16649,6 +17607,8 @@ packages: - cuda-python >=12.9.6,<12.10.0a0 - cuda-cudart >=12,<13.0a0 license: LicenseRef-NVIDIA-SOFTWARE-LICENSE + purls: + - pkg:pypi/cuda-bindings?source=hash-mapping size: 3891535 timestamp: 1773288261512 - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-12.9.7-py314h2547b3f_1.conda @@ -16699,6 +17659,7 @@ packages: depends: - cuda-version >=12.9,<12.10.0a0 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 29604 timestamp: 1753975679251 @@ -16712,6 +17673,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 170799 timestamp: 1749218946117 @@ -16740,6 +17702,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-cudart >=12.9.79,<13.0a0 @@ -16770,6 +17733,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 23249 timestamp: 1749218998822 @@ -16800,6 +17764,7 @@ packages: constrains: - vc >=14.2 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27684 timestamp: 1753976469818 @@ -16814,6 +17779,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27361 timestamp: 1753976245101 @@ -16826,6 +17792,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 58467504 timestamp: 1760723834711 @@ -16852,6 +17819,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-nvrtc >=12.9.86,<13.0a0 @@ -16867,6 +17835,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: weak: - cuda-nvrtc >=13.3.33,<14.0a0 @@ -16903,6 +17872,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 31168 timestamp: 1753975780038 @@ -16939,6 +17909,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 40286977 timestamp: 1753975898550 @@ -16976,9 +17947,9 @@ packages: run_exports: {} size: 25690 timestamp: 1779913686281 -- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py314h344ed54_0.conda - sha256: c2e08246f2e6f38b5793ebc8d36de32704e4f152ed959ab0558d529580610e0e - md5: 545afbc1940d8a81f114b9c14eecf2ca +- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda + sha256: a061170102d6f1a0b64ed3be712ac653fd9c9e8b6bed6205f398dbf319dcc3c8 + md5: 8ecd457018d6f302da0945cd2169167d depends: - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 @@ -16989,22 +17960,9 @@ packages: license_family: APACHE purls: - pkg:pypi/cython?source=hash-mapping - size: 3332872 - timestamp: 1767577440799 -- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.8-py314h344ed54_0.conda - sha256: 8900c3a11e71521ed7400265a36686c4ed3973b937658c1f58cc74b707a1c173 - md5: 596f6f1a842a246dbe778dce002d0ca5 - depends: - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: Apache-2.0 - license_family: APACHE run_exports: {} - size: 3338147 - timestamp: 1782821777709 + size: 3343814 + timestamp: 1785016211855 - conda: https://conda.anaconda.org/conda-forge/win-64/dav1d-1.2.1-hcfcfb64_0.conda sha256: 2aa2083c9c186da7d6f975ccfbef654ed54fff27f4bc321dbcd12cee932ec2c4 md5: ed2c27bda330e3f0ab41577cf8b9b585 @@ -17083,6 +18041,7 @@ packages: - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL + purls: [] size: 10417843 timestamp: 1773010275486 - conda: https://conda.anaconda.org/conda-forge/win-64/ffmpeg-8.1.1-gpl_h6d5d71d_904.conda @@ -17183,6 +18142,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 195332 timestamp: 1771382820659 - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.18.1-hd47e2ca_0.conda @@ -17210,6 +18170,7 @@ packages: - libfreetype 2.14.2 h57928b3_0 - libfreetype6 2.14.2 hdbac1cb_0 license: GPL-2.0-only OR FTL + purls: [] size: 185633 timestamp: 1772756186241 - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.3-h57928b3_1.conda @@ -17242,6 +18203,7 @@ packages: - gcc_impl_win-64 15.2.0 ha526d7c_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 1198343 timestamp: 1771382604468 - conda: https://conda.anaconda.org/conda-forge/win-64/gcc_impl_win-64-15.2.0-ha526d7c_18.conda @@ -17257,6 +18219,7 @@ packages: - m2w64-sysroot_win-64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 62510234 timestamp: 1771382289787 - conda: https://conda.anaconda.org/conda-forge/win-64/gdk-pixbuf-2.44.5-h1f5b9c4_1.conda @@ -17274,6 +18237,7 @@ packages: - vc14_runtime >=14.44.35208 license: LGPL-2.1-or-later license_family: LGPL + purls: [] size: 574950 timestamp: 1771530717329 - conda: https://conda.anaconda.org/conda-forge/win-64/gdk-pixbuf-2.44.6-h1f5b9c4_0.conda @@ -17304,6 +18268,7 @@ packages: - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD + purls: [] size: 4929181 timestamp: 1770195251565 - conda: https://conda.anaconda.org/conda-forge/win-64/glslang-16.3.0-h294ba9c_0.conda @@ -17328,6 +18293,7 @@ packages: - vc14_runtime >=14.44.35208 license: LGPL-2.0-or-later license_family: LGPL + purls: [] size: 96336 timestamp: 1755102441729 - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.15-hac47afa_0.conda @@ -17365,6 +18331,7 @@ packages: - gxx_impl_win-64 15.2.0 h22fd5bf_18 license: BSD-3-Clause license_family: BSD + purls: [] size: 824078 timestamp: 1771382638258 - conda: https://conda.anaconda.org/conda-forge/win-64/gxx_impl_win-64-15.2.0-h22fd5bf_18.conda @@ -17377,6 +18344,7 @@ packages: - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 14533744 timestamp: 1771382555150 - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-13.1.0-h5a1b470_0.conda @@ -17396,6 +18364,7 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT + purls: [] size: 1285640 timestamp: 1773217788574 - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.1-h5a1b470_0.conda @@ -17427,6 +18396,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 13222158 timestamp: 1767970128854 - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda @@ -17475,6 +18445,7 @@ packages: - binutils_impl_win-64 2.45.1 license: GPL-3.0-only license_family: GPL + purls: [] size: 876736 timestamp: 1770267709635 - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda @@ -17502,6 +18473,7 @@ packages: - liblapacke 3.11.0 5*_mkl license: BSD-3-Clause license_family: BSD + purls: [] size: 67438 timestamp: 1765819100043 - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-6_hf2e6a31_mkl.conda @@ -17586,6 +18558,7 @@ packages: - blas 2.305 mkl license: BSD-3-Clause license_family: BSD + purls: [] size: 68079 timestamp: 1765819124349 - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-6_h2a3cdd5_mkl.conda @@ -17641,6 +18614,7 @@ packages: - expat 2.7.4.* license: MIT license_family: MIT + purls: [] size: 70323 timestamp: 1771259521393 - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda @@ -17693,6 +18667,7 @@ packages: depends: - libfreetype6 >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 8404 timestamp: 1772756167212 - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_1.conda @@ -17716,6 +18691,7 @@ packages: constrains: - freetype >=2.14.2 license: GPL-2.0-only OR FTL + purls: [] size: 340155 timestamp: 1772756166648 - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_1.conda @@ -17745,6 +18721,7 @@ packages: - libgomp 15.2.0 h8ee18e1_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 820022 timestamp: 1771382190160 - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda @@ -17762,6 +18739,7 @@ packages: constrains: - glib 2.86.4 *_1 license: LGPL-2.1-or-later + purls: [] size: 4095369 timestamp: 1771863229701 - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.1-h7ce1215_2.conda @@ -17791,6 +18769,7 @@ packages: - msys2-conda-epoch <0.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 663864 timestamp: 1771382118742 - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda @@ -17831,6 +18810,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 OR BSD-3-Clause + purls: [] size: 536186 timestamp: 1758894243956 - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.4.0-h172a326_0.conda @@ -17874,6 +18854,7 @@ packages: constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib + purls: [] size: 841783 timestamp: 1762094814336 - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.1.4.1-hfd05255_0.conda @@ -17916,6 +18897,7 @@ packages: - libhwy >=1.3.0,<1.4.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 1317916 timestamp: 1770801992810 - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda @@ -17930,6 +18912,7 @@ packages: - liblapacke 3.11.0 5*_mkl license: BSD-3-Clause license_family: BSD + purls: [] size: 80225 timestamp: 1765819148014 - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda @@ -18037,6 +19020,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27343190 timestamp: 1760724535115 @@ -18060,6 +19044,7 @@ packages: - cuda-version >=12.9,<12.10.0a0 - libnvptxcompiler-dev_win-64 12.9.86 h57928b3_2 license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] run_exports: {} size: 27359 timestamp: 1753976279054 @@ -18099,6 +19084,7 @@ packages: - ucrt >=10.0.20348.0 - libzlib >=1.3.1,<2.0a0 license: zlib-acknowledgement + purls: [] size: 383155 timestamp: 1770691504832 - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda @@ -18126,6 +19112,7 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: LGPL-2.1-or-later + purls: [] size: 2877820 timestamp: 1771301866036 - conda: https://conda.anaconda.org/conda-forge/win-64/librsvg-2.62.3-h15cfe45_0.conda @@ -18191,6 +19178,19 @@ packages: - libsqlite >=3.53.3,<4.0a0 size: 1315909 timestamp: 1782519131898 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + sha256: 62e1c45ec71ab2e5deeeb0e47e7df6a609991e91d46348f16df50c68fee145c8 + md5: ca0d59f40a02a15e9b5d0ff8db0f85e3 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + run_exports: + weak: + - libsqlite >=3.53.4,<4.0a0 + size: 1313790 + timestamp: 1785016158097 - conda: https://conda.anaconda.org/conda-forge/win-64/libstdcxx-15.2.0-hae5796f_18.conda sha256: 7134b90a850f0e14f15bd0f0218fd728f19cd5c58420a90c2f561f58272b8519 md5: 7c09facd8f5aced6b4c146e1c4053e50 @@ -18201,6 +19201,7 @@ packages: - libstdcxx-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 6462596 timestamp: 1771382223989 - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda @@ -18306,6 +19307,7 @@ packages: - libxml2 2.15.2 license: MIT license_family: MIT + purls: [] size: 520731 timestamp: 1772704723763 - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda @@ -18376,6 +19378,7 @@ packages: - vc14_runtime >=14.44.35208 license: MIT license_family: MIT + purls: [] size: 43866 timestamp: 1772704745691 - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-h8ef44ab_0.conda @@ -18406,6 +19409,7 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other + purls: [] size: 55476 timestamp: 1727963768015 - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda @@ -18425,6 +19429,22 @@ packages: - libzlib >=1.3.2,<2.0a0 size: 58347 timestamp: 1774072851498 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + sha256: 0629c2cc0404d3bb29d6baa7b4ba62da80797015e86de050db81ea5a07050527 + md5: 5d2ff29d465097458cc3ff6569151991 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - zlib 1.3.2 *_3 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 58529 + timestamp: 1785276664143 - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.0-h4fa8253_0.conda sha256: bb55a3736380759d338f87aac68df4fd7d845ae090b94400525f5d21a55eea31 md5: e5505e0b7d6ef5c19d5c0c1884a2f494 @@ -18437,6 +19457,7 @@ packages: - intel-openmp <0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: APACHE + purls: [] size: 347404 timestamp: 1772025050288 - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda @@ -18492,6 +19513,7 @@ packages: - msys2-conda-epoch <0.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 7539 timestamp: 1747330852019 - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda @@ -18522,6 +19544,7 @@ packages: - vc14_runtime >=14.44.35208 license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary + purls: [] size: 100224829 timestamp: 1767634557029 - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda @@ -18564,6 +19587,8 @@ packages: - python_abi 3.14.* *_cp314 - numpy >=1.23,<3 license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping size: 202093 timestamp: 1771362373159 - conda: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.1.2-py314h909e829_1.conda @@ -18597,6 +19622,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping size: 7309134 timestamp: 1770098414535 - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda @@ -18708,7 +19735,22 @@ packages: - openssl >=3.6.3,<4.0a0 size: 9414790 timestamp: 1781071745579 -- conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h03d888a_0.conda +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda + sha256: 2ebff5a1b5793e82495bf33c91fba040e11ff23333c2385ac66d0c3aee2cc14c + md5: a978392692a910ba1c8920ccb1e784b3 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 9427535 + timestamp: 1785915614585 +- conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h03d888a_0.conda sha256: dcda7e9bedc1c87f51ceef7632a5901e26081a1f74a89799a3e50dbdc801c0bd md5: 452d6d3b409edead3bd90fc6317cd6d4 depends: @@ -18727,6 +19769,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.1-or-later + purls: [] size: 454854 timestamp: 1751292618315 - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda @@ -18872,6 +19915,35 @@ packages: size: 18481352 timestamp: 1781256034828 python_site_packages_path: Lib/site-packages +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda + build_number: 101 + sha256: 3a9ae901cd853d507d97aa8b72af4b9a572a3f92dcc5bad8a1318f77ff4e0e64 + md5: 67bbf51f88a2053513d7c78f485f7479 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.53.3,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - python_abi 3.14.* *_cp314 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + run_exports: + weak: + - python_abi 3.14.* *_cp314 + noarch: + - python + size: 18338767 + timestamp: 1784911044838 + python_site_packages_path: Lib/site-packages - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda sha256: 6918a8067f296f3c65d43e84558170c9e6c3f4dd735cfe041af41a7fdba7b171 md5: 2d7b7ba21e8a8ced0eca553d4d53f773 @@ -19013,6 +20085,7 @@ packages: - libvulkan-loader >=1.4.341.0,<2.0a0 - libusb >=1.0.29,<2.0a0 license: Zlib + purls: [] size: 1669623 timestamp: 1771668231217 - conda: https://conda.anaconda.org/conda-forge/win-64/shaderc-2025.5-h8fa7867_1.conda @@ -19026,6 +20099,7 @@ packages: - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache + purls: [] size: 1558909 timestamp: 1770208850155 - conda: https://conda.anaconda.org/conda-forge/win-64/shaderc-2026.2-h8fa7867_0.conda @@ -19053,6 +20127,7 @@ packages: - spirv-headers >=1.4.341.0,<1.4.341.1.0a0 license: Apache-2.0 license_family: APACHE + purls: [] size: 13881533 timestamp: 1770089875437 - conda: https://conda.anaconda.org/conda-forge/win-64/spirv-tools-2026.2-h49e36cd_0.conda @@ -19186,6 +20261,17 @@ packages: run_exports: {} size: 21860770 timestamp: 1784166533243 +- conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.12.2-h7ca4a90_0.conda + sha256: 15fdcce34c19c3dde9eab5550cd4eb9760cab80eb4e26305643b5cf0fd43d9be + md5: d791fa67f9e790de3bcb4961f3cfb145 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: Apache-2.0 OR MIT + run_exports: {} + size: 15540330 + timestamp: 1785973546861 - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda sha256: 9dc40c2610a6e6727d635c62cced5ef30b7b30123f5ef67d6139e23d21744b3a md5: 1e610f2416b6acdd231c5f573d754a0f @@ -19211,6 +20297,18 @@ packages: run_exports: {} size: 20362 timestamp: 1781320968457 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + sha256: 35444c55a92e2f7f7ba26bc70f81e56e52344f7d064c0fd4b40a46a58517b79c + md5: aa805b5522c2a98fa286e551a1f48546 + depends: + - vc14_runtime >=14.51.36247 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 21383 + timestamp: 1785359368566 - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda sha256: 02732f953292cce179de9b633e74928037fa3741eb5ef91c3f8bae4f761d32a5 md5: 37eb311485d2d8b2c419449582046a42 @@ -19238,6 +20336,19 @@ packages: run_exports: {} size: 737434 timestamp: 1781320964561 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + sha256: 4e4cb599cdc41bf2109d1464c127b5bcbddf548ce3e322e612afb691338b48f8 + md5: ac5333bb3d429361f23adf704cc49a78 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.51.36247 habf1de7_41 + constrains: + - vs2015_runtime 14.51.36247.* *_41 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + run_exports: {} + size: 767955 + timestamp: 1785359364369 - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda sha256: 878d5d10318b119bd98ed3ed874bd467acbe21996e1d81597a1dbf8030ea0ce6 md5: 242d9f25d2ae60c76b38a5e42858e51d @@ -19265,6 +20376,20 @@ packages: - vcomp14 >=14.51.36231 size: 120684 timestamp: 1781320948530 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda + sha256: 731e043390c9457299484d39e427221fc868a9249540a498a5a4f6456c7744d1 + md5: 350bb67a5c8e5f1c53347ac544ab6600 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.51.36247.* *_41 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + run_exports: + strong: + - vcomp14 >=14.51.36247 + size: 155910 + timestamp: 1785359349999 - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda sha256: 63ff4ec6e5833f768d402f5e95e03497ce211ded5b6f492e660e2bfc726ad24d md5: f276d1de4553e8fca1dfb6988551ebb4 @@ -19272,6 +20397,7 @@ packages: - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD + purls: [] size: 19347 timestamp: 1767320221943 - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.51.36231-h84cd919_39.conda @@ -19302,6 +20428,24 @@ packages: - ucrt >=10.0.20348.0 size: 24190 timestamp: 1781320983107 +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_41.conda + sha256: 9d7d1b43cf4af5a8e8b1646175c9f899ffbcab189a33ac41127a96e7bcf41af0 + md5: 04190e0ebd886433300ce9343ee98942 + depends: + - vswhere + constrains: + - vs_win-64 2022.14 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + run_exports: + strong: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + size: 25462 + timestamp: 1785358620723 - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 sha256: 97166b318f8c68ffe4d50b2f4bd36e415219eeaef233e7d41c54244dc6108249 md5: 19e39905184459760ccb8cf5c75f148b @@ -19382,7 +20526,111 @@ packages: - zstd >=1.5.7,<1.6.0a0 size: 388453 timestamp: 1764777142545 -- conda_source: cuda-bindings[1a320ca0] @ ../cuda_bindings +- conda_source: cuda-bindings[3db1bf41] @ ../cuda_bindings + variants: + c_stdlib: sysroot + c_stdlib_version: '2.28' + cuda_version: 13.3.* + python: 3.14.* + target_platform: linux-aarch64 + depends: + - python + - python >=3.10 + - cuda-version + - cuda-pathfinder + - libnvjitlink + - cuda-nvrtc + - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-nvvm + - libnvfatbin + - libcufile + - libcufile >=1.18.1.6,<2.0a0 + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 + - __glibc >=2.28,<3.0.a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + source_depends: + cuda-pathfinder: + path: ../cuda_pathfinder + build_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-16.1.0-h04da0f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-16.1.0-hed00b63_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-16.1.0-hd5c6868_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-16.1.0-h4223dcb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-16.1.0-h2510bd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-16.1.0-h2445e1f_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-static-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-13.3.33-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-dev-13.3.33-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-13.3.73-he9431aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.73-h7b14b0b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-13.3.73-h7b14b0b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-13.3.27-h16bee8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.18.1.6-h42688b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-dev-1.18.1.6-he38c790_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-13.3.3.4.1-h579c4fd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-13.3.73-h579c4fd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-aarch64-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-13.3.73-h579c4fd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder +- conda_source: cuda-bindings[4664b262] @ ../cuda_bindings variants: c_compiler: vs2022 cuda_version: 13.3.* @@ -19409,25 +20657,25 @@ packages: path: ../cuda_pathfinder build_packages: - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_41.conda host_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-13.3.73-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_win-64-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_win-64-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-13.3.73-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-dev-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-static-13.3.29-hac47afa_0.conda @@ -19437,30 +20685,30 @@ packages: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.73-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-13.3.73-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-profiler-api-13.3.27-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.8-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.11.29-h7ca4a90_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.12.2-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder -- conda_source: cuda-bindings[29afc263] @ ../cuda_bindings + - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder +- conda_source: cuda-bindings[4e633ee8] @ ../cuda_bindings variants: c_stdlib: sysroot c_stdlib_version: '2.28' cuda_version: 13.3.* python: 3.14.* - target_platform: linux-64 + target_platform: linux-aarch64 depends: - python - python >=3.10 @@ -19483,127 +20731,24 @@ packages: cuda-pathfinder: path: ../cuda_pathfinder build_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-hcb00b6d_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - host_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-13.3.73-h69a702a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-h4bc722e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-h4bc722e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-dev-1.18.1.6-h676940d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder -- conda_source: cuda-bindings[b73e05e0] @ ../cuda_bindings - variants: - c_stdlib: sysroot - c_stdlib_version: '2.28' - cuda_version: 13.3.* - python: 3.14.* - target_platform: linux-aarch64 - depends: - - python - - python >=3.10 - - cuda-version - - cuda-pathfinder - - libnvjitlink - - cuda-nvrtc - - cuda-nvrtc >=13.3.33,<14.0a0 - - cuda-nvvm - - libnvfatbin - - libcufile - - libcufile >=1.18.1.6,<2.0a0 - - libgcc >=15 - - libgcc >=15 - - libstdcxx >=15 - - __glibc >=2.28,<3.0.a0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - source_depends: - cuda-pathfinder: - path: ../cuda_pathfinder - build_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-h3530432_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-15.2.0-h0bf4bd8_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-15.2.0-h7e4acf5_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-h3530432_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-15.2.0-h0bf4bd8_27.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-15.2.0-h7e4acf5_27.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda @@ -19617,7 +20762,7 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.73-h7b14b0b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-13.3.73-h7b14b0b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-13.3.27-h16bee8c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.8-py314hc6b4731_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hf9559e3_0.conda @@ -19661,30 +20806,211 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder -- conda_source: cuda-core[2472945f] @ . + - conda_source: cuda-pathfinder[640a9949] @ ../cuda_pathfinder +- conda_source: cuda-bindings[6c91bfdd] @ ../cuda_bindings variants: c_stdlib: sysroot c_stdlib_version: '2.28' - cuda_version: 12.* + cuda_version: 13.3.* python: 3.14.* target_platform: linux-64 depends: - python - python >=3.10 - cuda-version - - numpy - - cuda-bindings - cuda-pathfinder - - backports.strenum + - libnvjitlink + - cuda-nvrtc + - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-nvvm + - libnvfatbin + - libcufile + - libcufile >=1.18.1.6,<2.0a0 + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 + - __glibc >=2.28,<3.0.a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + source_depends: + cuda-pathfinder: + path: ../cuda_pathfinder + build_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-16.1.0-h5fcb69b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-16.1.0-h5fd2508_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-16.1.0-he33a5f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-16.1.0-h5525346_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-16.1.0-hf2715c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-16.1.0-h59071f9_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-16.1.0-h41cdd0d_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-13.3.73-h69a702a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-h4bc722e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-h4bc722e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-dev-1.18.1.6-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder +- conda_source: cuda-bindings[8b6a309f] @ ../cuda_bindings + variants: + c_compiler: vs2022 + cuda_version: 13.3.* + cxx_compiler: vs2022 + python: 3.14.* + target_platform: win-64 + depends: + - python + - python >=3.10 + - cuda-version + - cuda-pathfinder + - libnvjitlink + - cuda-nvrtc + - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-nvvm + - libnvfatbin + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + source_depends: + cuda-pathfinder: + path: ../cuda_pathfinder + build_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_39.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-13.3.73-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_win-64-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_win-64-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-13.3.73-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-dev-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-static-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-13.3.33-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-dev-13.3.33-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-13.3.73-h719f0c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.73-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-13.3.73-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-profiler-api-13.3.27-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.11.29-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + - conda_source: cuda-pathfinder[bcd0ad48] @ ../cuda_pathfinder +- conda_source: cuda-bindings[91169b48] @ ../cuda_bindings + variants: + c_stdlib: sysroot + c_stdlib_version: '2.28' + cuda_version: 13.3.* + python: 3.14.* + target_platform: linux-64 + depends: + - python + - python >=3.10 + - cuda-version + - cuda-pathfinder + - libnvjitlink + - cuda-nvrtc + - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-nvvm + - libnvfatbin + - libcufile + - libcufile >=1.18.1.6,<2.0a0 - libgcc >=15 - libgcc >=15 - libstdcxx >=15 - __glibc >=2.28,<3.0.a0 - python_abi 3.14.* *_cp314 - - cuda-nvrtc >=12.9.86,<13.0a0 - - cuda-cudart >=12.9.79,<13.0a0 license: Apache-2.0 + source_depends: + cuda-pathfinder: + path: ../cuda_pathfinder build_packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda @@ -19708,23 +21034,20 @@ packages: host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-12.9.7-py314hadd79bd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-12.9.79-h7938cbb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-13.3.73-h69a702a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-h4bc722e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-h4bc722e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/dlpack-1.3-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-dev-1.18.1.6-h676940d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda @@ -19732,8 +21055,6 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda @@ -19749,16 +21070,191 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda + - conda_source: cuda-pathfinder[3890e449] @ ../cuda_pathfinder +- conda_source: cuda-core[18c68942] @ . + variants: + c_compiler: vs2022 + cuda_version: 12.* + cxx_compiler: vs2022 + python: 3.14.* + target_platform: win-64 + depends: + - python + - python >=3.10 + - cuda-version + - numpy + - cuda-bindings + - cuda-pathfinder + - backports.strenum + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + - cuda-nvrtc >=12.9.86,<13.0a0 + - cuda-cudart >=12.9.79,<13.0a0 + license: Apache-2.0 + build_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_41.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-12.9.27-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-12.9.86-h57928b3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_win-64-12.9.79-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_win-64-12.9.79-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-12.9.79-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_win-64-12.9.86-h36c15f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-12.9.86-h57928b3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_win-64-12.9.86-h57928b3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-12.9.7-py314h2547b3f_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-crt-tools-12.9.86-h57928b3_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-12.9.79-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-dev-12.9.79-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-static-12.9.79-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvcc-impl-12.9.86-h53cbb54_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvcc-tools-12.9.86-he0c23c2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-12.9.86-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-dev-12.9.86-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-12.9.86-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-12.9.86-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/dlpack-1.3-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libnvjitlink-12.9.86-hac47afa_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libnvptxcompiler-dev-12.9.86-h57928b3_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.12.2-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda +- conda_source: cuda-core[29d2d05a] @ . + variants: + c_stdlib: sysroot + c_stdlib_version: '2.28' + cuda_version: 13.3.* + python: 3.14.* + target_platform: linux-aarch64 + depends: + - python + - python >=3.10 + - cuda-version + - numpy + - cuda-bindings + - cuda-pathfinder + - backports.strenum + - libgcc >=15 + - libgcc >=15 + - libstdcxx >=15 + - __glibc >=2.28,<3.0.a0 + - python_abi 3.14.* *_cp314 + - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-cudart >=13.3.29,<14.0a0 + license: Apache-2.0 + build_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-h3530432_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-15.2.0-h0bf4bd8_27.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-15.2.0-h7e4acf5_27.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-13.3.1-py314he6363bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-static-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-13.3.33-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-dev-13.3.33-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.73-h7b14b0b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-13.3.27-h16bee8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dlpack-1.3-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hf9559e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcudla-13.3.29-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.18.1.6-h42688b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvfatbin-13.3.29-h8f3c8d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-13.3.33-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.3-h10b116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.11.29-hbe9c82f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-13.3.3.4.1-h579c4fd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-13.3.73-h579c4fd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-aarch64-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.5.6-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda @@ -19767,7 +21263,72 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda -- conda_source: cuda-core[491c4fa3] @ . +- conda_source: cuda-core[2b0a529b] @ . + variants: + c_compiler: vs2022 + cuda_version: 13.3.* + cxx_compiler: vs2022 + python: 3.14.* + target_platform: win-64 + depends: + - python + - python >=3.10 + - cuda-version + - numpy + - cuda-bindings + - cuda-pathfinder + - backports.strenum + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - cuda-nvrtc >=13.3.33,<14.0a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + build_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_41.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-13.3.73-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_win-64-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_win-64-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-13.3.1-py314hb98de8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-13.3.33-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-dev-13.3.33-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.73-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/dlpack-1.3-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libnvfatbin-13.3.29-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libnvjitlink-13.3.33-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.12.2-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda +- conda_source: cuda-core[6e9d4edb] @ . variants: c_stdlib: sysroot c_stdlib_version: '2.28' @@ -19782,9 +21343,9 @@ packages: - cuda-bindings - cuda-pathfinder - backports.strenum - - libgcc >=15 - - libgcc >=15 - - libstdcxx >=15 + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 - __glibc >=2.28,<3.0.a0 - python_abi 3.14.* *_cp314 - cuda-nvrtc >=12.9.86,<13.0a0 @@ -19794,25 +21355,25 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-h3530432_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-15.2.0-h0bf4bd8_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-15.2.0-h7e4acf5_27.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-16.1.0-h04da0f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-16.1.0-hed00b63_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-16.1.0-hd5c6868_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-16.1.0-h4223dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-16.1.0-h2510bd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-16.1.0-h2445e1f_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-12.9.7-py314hd8c1704_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-crt-tools-12.9.86-h579c4fd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-12.9.79-h3ae8b8a_0.conda @@ -19825,37 +21386,36 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-12.9.86-h7b14b0b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.9.86-h7b14b0b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-12.9.79-h16bee8c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.8-py314hc6b4731_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dlpack-1.3-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hf9559e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.14.1.1-had8bf56_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-12.9.86-h8f3c8d4_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvptxcompiler-dev-12.9.86-h579c4fd_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.3-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.11.29-hbe9c82f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-12.9.27-h579c4fd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-12.9.86-h579c4fd_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-12.9.79-h3ae8b8a_0.conda @@ -19863,18 +21423,118 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-12.9.79-h3ae8b8a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-aarch64-12.9.86-h4310d6a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-12.9.86-h579c4fd_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.5.6-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-aarch64-12.9.86-h579c4fd_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda -- conda_source: cuda-core[496050ab] @ . + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda +- conda_source: cuda-core[7b4f4a3f] @ . + variants: + c_stdlib: sysroot + c_stdlib_version: '2.28' + cuda_version: 13.3.* + python: 3.14.* + target_platform: linux-aarch64 + depends: + - python + - python >=3.10 + - cuda-version + - numpy + - cuda-bindings + - cuda-pathfinder + - backports.strenum + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 + - __glibc >=2.28,<3.0.a0 + - cuda-cudart >=13.3.29,<14.0a0 + - cuda-nvrtc >=13.3.33,<14.0a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + build_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-16.1.0-h04da0f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-16.1.0-hed00b63_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-16.1.0-hd5c6868_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-16.1.0-h4223dcb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-16.1.0-h2510bd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-16.1.0-h2445e1f_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-13.3.1-py314he6363bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-static-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-13.3.33-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-dev-13.3.33-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.73-h7b14b0b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-13.3.27-h16bee8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dlpack-1.3-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcudla-13.3.29-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.18.1.6-h42688b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvfatbin-13.3.29-h8f3c8d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-13.3.33-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-13.3.3.4.1-h579c4fd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-13.3.73-h579c4fd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-aarch64-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-13.3.29-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda +- conda_source: cuda-core[83c371ca] @ . variants: c_stdlib: sysroot c_stdlib_version: '2.28' @@ -19893,9 +21553,9 @@ packages: - libgcc >=15 - libstdcxx >=15 - __glibc >=2.28,<3.0.a0 - - cuda-cudart >=13.3.29,<14.0a0 - - cuda-nvrtc >=13.3.33,<14.0a0 - python_abi 3.14.* *_cp314 + - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-cudart >=13.3.29,<14.0a0 license: Apache-2.0 build_packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda @@ -19972,13 +21632,13 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda -- conda_source: cuda-core[8e8d43e1] @ . +- conda_source: cuda-core[adf7f1da] @ . variants: - c_compiler: vs2022 - cuda_version: 12.* - cxx_compiler: vs2022 + c_stdlib: sysroot + c_stdlib_version: '2.28' + cuda_version: 13.3.* python: 3.14.* - target_platform: win-64 + target_platform: linux-64 depends: - python - python >=3.10 @@ -19987,74 +21647,97 @@ packages: - cuda-bindings - cuda-pathfinder - backports.strenum - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 + - __glibc >=2.28,<3.0.a0 + - cuda-cudart >=13.3.29,<14.0a0 + - cuda-nvrtc >=13.3.33,<14.0a0 - python_abi 3.14.* *_cp314 - - cuda-nvrtc >=12.9.86,<13.0a0 - - cuda-cudart >=12.9.79,<13.0a0 license: Apache-2.0 build_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_39.conda - host_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-12.9.27-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-12.9.86-h57928b3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_win-64-12.9.79-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_win-64-12.9.79-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-12.9.79-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_win-64-12.9.86-h36c15f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-12.9.86-h57928b3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.5.6-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_win-64-12.9.86-h57928b3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-16.1.0-h5fcb69b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-16.1.0-h5fd2508_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-16.1.0-he33a5f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-16.1.0-h5525346_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-16.1.0-hf2715c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-16.1.0-h59071f9_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-16.1.0-h41cdd0d_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-12.9.7-py314h2547b3f_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-crt-tools-12.9.86-h57928b3_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-12.9.79-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-dev-12.9.79-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-static-12.9.79-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvcc-impl-12.9.86-h53cbb54_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvcc-tools-12.9.86-he0c23c2_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-12.9.86-hac47afa_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-dev-12.9.86-hac47afa_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-12.9.86-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-12.9.86-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.8-py314h344ed54_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/dlpack-1.3-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libnvjitlink-12.9.86-hac47afa_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libnvptxcompiler-dev-12.9.86-h57928b3_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.11.29-h7ca4a90_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda -- conda_source: cuda-core[b9ba9726] @ . + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-13.3.1-py314h42812f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-h4bc722e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dlpack-1.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-13.3.29-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda +- conda_source: cuda-core[e53261c5] @ . variants: c_stdlib: sysroot c_stdlib_version: '2.28' - cuda_version: 13.3.* + cuda_version: 12.* python: 3.14.* - target_platform: linux-aarch64 + target_platform: linux-64 depends: - python - python >=3.10 @@ -20063,93 +21746,98 @@ packages: - cuda-bindings - cuda-pathfinder - backports.strenum - - libgcc >=15 - - libgcc >=15 - - libstdcxx >=15 + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 - __glibc >=2.28,<3.0.a0 - - cuda-cudart >=13.3.29,<14.0a0 - - cuda-nvrtc >=13.3.33,<14.0a0 - python_abi 3.14.* *_cp314 + - cuda-nvrtc >=12.9.86,<13.0a0 + - cuda-cudart >=12.9.79,<13.0a0 license: Apache-2.0 build_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.2.0-h3530432_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-15.2.0-h0bf4bd8_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.2.0-h03e2352_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-15.2.0-h7e4acf5_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.2.0-he19c465_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-16.1.0-h5fcb69b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-16.1.0-h5fd2508_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-16.1.0-he33a5f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-16.1.0-h5525346_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-16.1.0-hf2715c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-16.1.0-h59071f9_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-16.1.0-h41cdd0d_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda host_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-13.3.1-py314he6363bd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-static-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-13.3.33-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-dev-13.3.33-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-13.3.73-h7b14b0b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-13.3.27-h16bee8c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.8-py314hc6b4731_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dlpack-1.3-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hf9559e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcudla-13.3.29-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.18.1.6-h42688b2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvfatbin-13.3.29-h8f3c8d4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-13.3.33-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.3-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.11.29-hbe9c82f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-13.3.3.4.1-h579c4fd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-13.3.73-h579c4fd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-aarch64-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-13.3.29-h8f3c8d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.5.6-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-12.9.7-py314hadd79bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-12.9.79-h7938cbb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dlpack-1.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda -- conda_source: cuda-core[f1ea05b3] @ . + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda +- conda_source: cuda-core[e56c61a7] @ . variants: c_compiler: vs2022 cuda_version: 13.3.* @@ -20167,8 +21855,8 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - cuda-nvrtc >=13.3.33,<14.0a0 - python_abi 3.14.* *_cp314 + - cuda-nvrtc >=13.3.33,<14.0a0 license: Apache-2.0 build_packages: - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda @@ -20195,7 +21883,7 @@ packages: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-13.3.33-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-dev-13.3.33-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.73-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.8-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/dlpack-1.3-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda @@ -20214,7 +21902,7 @@ packages: - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda -- conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder +- conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder variants: target_platform: noarch depends: @@ -20222,32 +21910,69 @@ packages: - python * license: Apache-2.0 host_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.11.29-h7ca4a90_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.12.2-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda -- conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder +- conda_source: cuda-pathfinder[3890e449] @ ../cuda_pathfinder + variants: + target_platform: noarch + depends: + - python >=3.10 + - python * + license: Apache-2.0 + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda +- conda_source: cuda-pathfinder[640a9949] @ ../cuda_pathfinder variants: target_platform: noarch depends: @@ -20285,7 +22010,7 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda -- conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder +- conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder variants: target_platform: noarch depends: @@ -20294,26 +22019,44 @@ packages: license: Apache-2.0 host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda +- conda_source: cuda-pathfinder[bcd0ad48] @ ../cuda_pathfinder + variants: + target_platform: noarch + depends: + - python >=3.10 + - python * + license: Apache-2.0 + host_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda @@ -20322,6 +22065,62 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.11.29-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda +- conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder + variants: + target_platform: noarch + depends: + - python >=3.10 + - python * + license: Apache-2.0 + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_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/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda +- pypi: ../cuda_python_test_helpers + name: cuda-python-test-helpers + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/01/8a/f767031dcd0d24c2bbab4b696dbcf004da4f3284e5e4649fc47bc0e2bb78/nvidia_nvvm-13.3.33-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl name: nvidia-nvvm version: 13.3.33 diff --git a/cuda_core/pixi.toml b/cuda_core/pixi.toml index 8772ed4e88b..b2c6a3389c3 100644 --- a/cuda_core/pixi.toml +++ b/cuda_core/pixi.toml @@ -21,9 +21,13 @@ pytest-randomly = "*" pytest-repeat = "*" pytest-rerunfailures = "*" cloudpickle = "*" +docutils = "*" psutil = "*" pyglet = "*" +[feature.test.pypi-dependencies] +cuda-python-test-helpers = { path = "../cuda_python_test_helpers", editable = true } + [feature.examples.dependencies] cuda-core = { path = "." } cffi = "*" @@ -52,7 +56,7 @@ CUDA_HOME = "$CONDA_PREFIX/targets/sbsa-linux" CUDA_HOME = "$CONDA_PREFIX/Library" [feature.cython-tests.dependencies] -cython = ">=3.2,<3.3" # for tests that exercise APIs from cython +cython = ">=3.2.5,<3.3" # for tests that exercise APIs from cython setuptools = "*" # for distutils gxx = "*" # to compile the generated code # These are necessary because running the Cython tests requires compiling @@ -93,7 +97,7 @@ cuda-version = "12.*" [feature.docs.dependencies] cuda-core = { path = "." } -cython = "*" +cython = ">=3.2.5,<3.3" myst-parser = "*" numpy = "*" numpydoc = "*" @@ -210,7 +214,7 @@ python = "*" cuda-version = "*" setuptools = ">=80" setuptools-scm = ">=8" -cython = ">=3.2,<3.3" +cython = ">=3.2.5,<3.3" cuda-nvrtc-dev = "*" cuda-bindings = "*" dlpack = "*" diff --git a/cuda_core/pyproject.toml b/cuda_core/pyproject.toml index f3a0c3a70f9..f3afa29241d 100644 --- a/cuda_core/pyproject.toml +++ b/cuda_core/pyproject.toml @@ -6,7 +6,7 @@ requires = [ "setuptools>=80", "setuptools-scm[simple]>=8,!=10.1", - "Cython>=3.2,<3.3", + "Cython>=3.2.5,<3.3", "cuda-pathfinder>=1.5" ] build-backend = "build_hooks" @@ -59,7 +59,7 @@ cu13 = ["cuda-bindings[all]==13.*", "cuda-toolkit==13.*"] [dependency-groups] test = [ - "cython>=3.2,<3.3", + "cython>=3.2.5,<3.3", "setuptools>=80", "pytest==9.1.0", "pytest-benchmark==5.2.3", @@ -69,10 +69,12 @@ test = [ "pytest-timeout==2.4.0", "cloudpickle==3.1.2", "psutil==7.2.2", + "docutils==0.23", # TODO: remove the Python 3.15 guard once 3.15 is officially supported "cffi==2.0.0; python_version < '3.15'", ] -ml-dtypes = ["ml-dtypes>=0.5.4,<0.6.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'"] test-cu12 = [ {include-group = "ml-dtypes" }, {include-group = "test" }, "cupy-cuda12x; python_version < '3.14'", "cuda-toolkit[cudart]==12.*"] # runtime headers needed by CuPy test-cu13 = [ {include-group = "ml-dtypes" }, {include-group = "test" }, "cupy-cuda13x; python_version < '3.14'", "cuda-toolkit[cudart]==13.*"] # runtime headers needed by CuPy # free threaded build, cupy doesn't support free-threaded builds yet, so avoid installing it for now diff --git a/cuda_core/pytest.ini b/cuda_core/pytest.ini index c3d243387fe..64fcf312a79 100644 --- a/cuda_core/pytest.ini +++ b/cuda_core/pytest.ini @@ -1,9 +1,9 @@ -# 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 [pytest] -addopts = --showlocals +addopts = --showlocals --durations=20 norecursedirs = cython markers = # Keep this authorship marker registry in sync across all pytest config roots. @@ -11,3 +11,5 @@ markers = agent_authored(model): agent-authored test not yet materially human-reviewed human_reviewed: agent-authored test materially reviewed or rewritten by a human human_authored: test authored primarily by a human + thread_unsafe(reason): test is not safe to run concurrently with other tests (e.g. uses mocks, patches globals, or mutates shared CUDA state) + parallel_threads_limit(n): cap the number of parallel threads pytest-run-parallel uses for this test or module diff --git a/cuda_core/tests/AGENTS.md b/cuda_core/tests/AGENTS.md new file mode 100644 index 00000000000..39472d745b5 --- /dev/null +++ b/cuda_core/tests/AGENTS.md @@ -0,0 +1,67 @@ +# cuda.core test suite + +Package-wide conventions live in `../AGENTS.md`; repository-wide ones in +`../../AGENTS.md`. This file covers conventions specific to the tests. + +## Never create an uncapped memory pool + +A memory pool created without `max_size` reserves virtual address space similar +in size to the installed physical device memory regardless of what the test +actually allocates. The reservation is charged to the process address space +even though it is not backed by physical memory, and it is not returned until +the pool is destroyed *and* the stream-ordered frees of its outstanding +allocations retire. The whole suite shares one process and one device, so these +reservations accumulate across tests. + +When a test needs its own pool, use the suite-wide cap from +`helpers/constants.py`: + +```python +from helpers.constants import POOL_SIZE + +mr = DeviceMemoryResource(dev, DeviceMemoryResourceOptions(max_size=POOL_SIZE)) +``` + +Use a larger value only if a test genuinely requires it, and prefer adding a +shared constant to `helpers/constants.py` over redefining one per module. + +### Passing no options is different from passing empty options + +`DeviceMemoryResource(dev)` with no options does **not** create a pool. It +wraps the device's existing default mempool (`_mempool_owned` is false) and +costs no additional address space. Passing *any* options object creates a new +owned pool, and a new pool without `max_size` is uncapped: + +```python +DeviceMemoryResource(dev) # wraps default pool, free +DeviceMemoryResource(dev, DeviceMemoryResourceOptions()) # NEW uncapped pool, expensive +DeviceMemoryResource(dev, {"ipc_enabled": True}) # NEW uncapped pool, expensive +``` + +Do not add `max_size` to a call that currently passes no options: that +converts a free default-pool wrapper into a new pool and makes things worse. + +### Managed pools are exempt + +`cuMemPoolCreate` requires `CUmemPoolProps.maxSize` to be zero for managed +pools, so `ManagedMemoryResourceOptions` has no `max_size` option. Managed +pools cannot be right-sized and are not checked. + +### Document exemptions + +When a call is deliberately exempt -- most often because it sits inside +`pytest.raises` and no pool is ever created -- annotate it: + +```python +with pytest.raises(RuntimeError, match="IPC is not available"): + # uncapped-pool-ok: raises before the pool is created + DeviceMemoryResource(mempool_device, DeviceMemoryResourceOptions(ipc_enabled=True)) +``` + +## Release resources at test boundaries + +The `_init_cuda_context` fixture in `conftest.py` runs `gc.collect()` followed +by `cuCtxSynchronize()` before popping the context. Tests should not rely on +that as a substitute for cleaning up explicitly: prefer context managers for +resources whose lifetime fits a single scope, and keep pool lifetimes inside +the test that creates them. diff --git a/cuda_core/tests/conftest.py b/cuda_core/tests/conftest.py index 7106b1e31f6..dfe97b265eb 100644 --- a/cuda_core/tests/conftest.py +++ b/cuda_core/tests/conftest.py @@ -2,15 +2,37 @@ # SPDX-License-Identifier: Apache-2.0 import functools +import gc +import importlib import multiprocessing import os import pathlib import sys from contextlib import contextmanager -from importlib.metadata import PackageNotFoundError, distribution import pytest +# Keep in sync with cuda_bindings/tests/conftest.py. +try: + import cuda_python_test_helpers._pytest_plugin # noqa: F401 +except ImportError as e: + # Don't call .resolve(): resolving symlinks can make parents[2] point + # somewhere other than the monorepo root if a sub-directory is symlinked. + _test_helpers_root = pathlib.Path(__file__).parents[2] / "cuda_python_test_helpers" + if not _test_helpers_root.is_dir(): + raise RuntimeError(f"cuda-python-test-helpers not installed and not found at {_test_helpers_root}") from e + for _k in list(sys.modules): + if _k == "cuda_python_test_helpers" or _k.startswith("cuda_python_test_helpers."): + del sys.modules[_k] + sys.path.insert(0, str(_test_helpers_root)) + importlib.invalidate_caches() + +pytest_plugins = ["cuda_python_test_helpers._pytest_plugin"] + +from cuda_python_test_helpers.marks import skipif_need_cuda_headers # noqa: F401 (re-exported for tests) +from cuda_python_test_helpers.mempool import xfail_if_mempool_oom +from helpers.constants import POOL_SIZE + import cuda.core from cuda.bindings import driver from cuda.core import ( @@ -24,72 +46,6 @@ _device, ) from cuda.core._utils.cuda_utils import CUDAError, handle_return -from cuda.pathfinder import get_cuda_path_or_home - -try: - from cuda.bindings._test_helpers.mempool import xfail_if_mempool_oom -except ModuleNotFoundError: - # Older cuda.bindings artifacts (for example 12.9.x backports) do not ship - # this helper yet. Keep the fallback local so tests against published - # bindings still xfail the known Windows MCDM mempool setup issue. - # - # Keep in sync with cuda_bindings/cuda/bindings/_test_helpers/mempool.py. - # This copy is intentionally simpler because it only handles cuda_core - # CUDAError exceptions when the shared helper is absent. - def _is_windows_mcdm_device(device=0): - if sys.platform != "win32": - return False - import cuda.bindings.nvml as nvml - - device_id = int(getattr(device, "device_id", device)) - (err,) = driver.cuInit(0) - if err != driver.CUresult.CUDA_SUCCESS: - return False - err, pci_bus_id = driver.cuDeviceGetPCIBusId(13, device_id) - if err != driver.CUresult.CUDA_SUCCESS: - return False - pci_bus_id = pci_bus_id.split(b"\x00", 1)[0].decode("ascii") - nvml.init_v2() - try: - handle = nvml.device_get_handle_by_pci_bus_id_v2(pci_bus_id) - current, _ = nvml.device_get_driver_model_v2(handle) - return current == nvml.DriverModel.DRIVER_MCDM - finally: - nvml.shutdown() - - def xfail_if_mempool_oom(err_or_exc, api_name=None, device=0): - if api_name is not None and not isinstance(api_name, str): - device = api_name - api_name = None - - if "CUDA_ERROR_OUT_OF_MEMORY" not in str(err_or_exc): - return - try: - is_windows_mcdm = _is_windows_mcdm_device(device) - except Exception: - # If MCDM detection fails, leave the primary test failure visible. - return - if not is_windows_mcdm: - return - - api_context = f"{api_name} " if api_name else "" - pytest.xfail(f"{api_context}could not reserve VA for mempool operations on Windows MCDM") - - -# Import shared test helpers for tests across subprojects. -# PLEASE KEEP IN SYNC with copies in other conftest.py in this repo. -_test_helpers_root = pathlib.Path(__file__).resolve().parents[2] / "cuda_python_test_helpers" -try: - distribution("cuda-python-test-helpers") -except PackageNotFoundError as exc: - if not _test_helpers_root.is_dir(): - raise RuntimeError( - f"cuda-python-test-helpers not installed; expected checkout path {_test_helpers_root}" - ) from exc - - test_helpers_root = str(_test_helpers_root) - if test_helpers_root not in sys.path: - sys.path.insert(0, test_helpers_root) def pytest_configure(config): @@ -114,6 +70,18 @@ def _init_cuda_context(): try: yield device finally: + # Force any pool/allocation whose only remaining reference was a local + # in this test's frame to actually get destroyed now, then drain the + # context so the stream-ordered frees that destruction enqueues retire + # before the next test runs. Without this, a memory pool's VA + # reservation is not returned until both have happened, and per-test + # leftovers accumulate across the run -- which is how full-suite runs + # can exhaust address space and hit CUDA_ERROR_OUT_OF_MEMORY on a + # device with plenty of free physical memory (issue #2381). gc.collect() + # must run first: cuCtxSynchronize alone cannot drain frees that were + # never enqueued because their owning object had not been collected yet. + gc.collect() + driver.cuCtxSynchronize() _ = _device_unset_current() @@ -131,6 +99,18 @@ def wrapper(*args, **kwargs): kwargs["mempool_device_x2"] = _mempool_device_impl(2) if "mempool_device_x3" in kwargs: kwargs["mempool_device_x3"] = _mempool_device_impl(3) + + # These are used by test_green_context.py. The original fixtures include + # pytest.skip() but that should have correctly fired by this time. + if "sm_resource" in kwargs: + kwargs["sm_resource"] = device.resources.sm + if "wq_resource" in kwargs: + kwargs["wq_resource"] = device.resources.workqueue + if "green_ctx" in kwargs: + from cuda.core import ContextOptions, SMResourceOptions + + groups, _ = device.resources.sm.split(SMResourceOptions(count=None)) + kwargs["green_ctx"] = device.create_context(ContextOptions(resources=[groups[0]])) return func(*args, **kwargs) wrapper._cuda_core_worker_cuda_wrapped = True @@ -240,7 +220,9 @@ def _device_id_from_resource_options(device, args, kwargs): def _require_ipc_mempool_devices(devices): """Return devices if they all support IPC-enabled mempools, otherwise skip.""" - from helpers import IS_WSL, supports_ipc_mempool + from helpers import supports_ipc_mempool + + from cuda_python_test_helpers import IS_WSL checked_devices = tuple(devices) @@ -335,7 +317,6 @@ def ipc_device(init_cuda): ) def ipc_memory_resource(request, ipc_device): """Provides IPC-enabled memory resource (either Device or Pinned).""" - POOL_SIZE = 2097152 mr_type = request.param if mr_type == "device": @@ -433,24 +414,3 @@ def test_something(memory_resource_factory): mr = MRClass() """ return request.param - - -# Please keep in sync with the copy in the top-level conftest.py. -def _cuda_headers_available() -> bool: - """Return True if CUDA headers are available, False if no CUDA path is set. - - Raises AssertionError if a CUDA path is set but has no include/ subdirectory. - """ - cuda_path = get_cuda_path_or_home() - if cuda_path is None: - return False - assert os.path.isdir(os.path.join(cuda_path, "include")), ( - f"CUDA path {cuda_path} does not contain an 'include' subdirectory" - ) - return True - - -skipif_need_cuda_headers = pytest.mark.skipif( - not _cuda_headers_available(), - reason="need CUDA header", -) diff --git a/cuda_core/tests/example_tests/test_basic_examples.py b/cuda_core/tests/example_tests/test_basic_examples.py index a8a47791991..bf423758366 100644 --- a/cuda_core/tests/example_tests/test_basic_examples.py +++ b/cuda_core/tests/example_tests/test_basic_examples.py @@ -11,17 +11,11 @@ import warnings import pytest +from cuda_python_test_helpers.pep723 import has_package_requirements_or_skip from cuda.core import Device, ManagedMemoryResource, system from cuda.core._program import _can_load_generated_ptx -try: - from cuda.bindings._test_helpers.pep723 import has_package_requirements_or_skip -except ImportError: - # If the import fails, we define a dummy function that will cause all tests to be skipped. - def has_package_requirements_or_skip(example): - pytest.skip("PEP 723 test helper is not available") - def has_compute_capability_9_or_higher() -> bool: return Device().compute_capability >= (9, 0) diff --git a/cuda_core/tests/graph/test_device_launch.py b/cuda_core/tests/graph/test_device_launch.py index 221b09bd815..d77ceeec37f 100644 --- a/cuda_core/tests/graph/test_device_launch.py +++ b/cuda_core/tests/graph/test_device_launch.py @@ -5,7 +5,7 @@ import numpy as np import pytest -from helpers.marks import requires_module +from cuda_python_test_helpers.marks import requires_module from cuda.core import ( Device, diff --git a/cuda_core/tests/graph/test_graph_builder.py b/cuda_core/tests/graph/test_graph_builder.py index 443399c4590..a730c2bd83a 100644 --- a/cuda_core/tests/graph/test_graph_builder.py +++ b/cuda_core/tests/graph/test_graph_builder.py @@ -9,8 +9,8 @@ import numpy as np import pytest +from cuda_python_test_helpers.marks import requires_module from helpers.graph_kernels import compile_common_kernels, compile_conditional_kernels -from helpers.marks import requires_module from helpers.misc import try_create_condition from cuda.core import Device, LaunchConfig, LegacyPinnedMemoryResource, launch @@ -306,6 +306,21 @@ def read_byte(data): assert result[0] == 0xAB +@pytest.mark.agent_authored(model="cursor-grok-4.5") +def test_graph_capture_callback_ctypes_rejects_incompatible_signature(init_cuda): + """Stream-capture host callbacks use the same ctypes ABI check.""" + import ctypes + + bad_type = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p) + launch_stream = Device().create_stream() + gb = launch_stream.create_graph_builder().begin_building() + try: + with pytest.raises(TypeError, match="CUhostFn"): + gb.callback(bad_type(0)) + finally: + gb.end_building() + + @pytest.mark.agent_authored(model="claude-opus-4.8") def test_graph_capture_callback_python_survives_del(init_cuda): """Captured callback is retained by its graph-node user object after del.""" diff --git a/cuda_core/tests/graph/test_graph_builder_conditional.py b/cuda_core/tests/graph/test_graph_builder_conditional.py index 0bb779a8bf7..150d43bfc14 100644 --- a/cuda_core/tests/graph/test_graph_builder_conditional.py +++ b/cuda_core/tests/graph/test_graph_builder_conditional.py @@ -7,8 +7,8 @@ import numpy as np import pytest +from cuda_python_test_helpers.marks import requires_module from helpers.graph_kernels import compile_conditional_kernels -from helpers.marks import requires_module from cuda.core import Device, LaunchConfig, LegacyPinnedMemoryResource, launch from cuda.core.graph import GraphBuilder diff --git a/cuda_core/tests/graph/test_graph_definition.py b/cuda_core/tests/graph/test_graph_definition.py index 50d4b4ac253..a273e8b6a01 100644 --- a/cuda_core/tests/graph/test_graph_definition.py +++ b/cuda_core/tests/graph/test_graph_definition.py @@ -3,14 +3,16 @@ """Tests for GraphDefinition topology, node types, instantiation, and execution.""" +import ctypes +import sys from collections.abc import Callable from dataclasses import dataclass, field import pytest +from conftest import xfail_on_graph_mempool_oom from helpers.graph_kernels import compile_common_kernels from helpers.misc import try_create_condition -from conftest import xfail_on_graph_mempool_oom from cuda.core import Device, LaunchConfig from cuda.core.graph import ( AllocNode, @@ -631,6 +633,43 @@ def test_succ(nonempty_graph_spec): assert actual == spec.expected_succ[name], f"succ mismatch for node {name}" +@pytest.mark.parametrize("adjacency_name", ("pred", "succ")) +@pytest.mark.agent_authored(model="gpt-5.6") +def test_large_adjacency_set_is_not_truncated(init_cuda, adjacency_name): + """Adjacency queries return and remove edges beyond the old 16-edge buffer.""" + g = GraphDefinition() + hub = g.empty() + neighbors = [g.empty() for _ in range(20)] + adjacency = getattr(hub, adjacency_name) + adjacency.update(neighbors) + + expected_edges = ( + {(node, hub) for node in neighbors} if adjacency_name == "pred" else {(hub, node) for node in neighbors} + ) + assert len(adjacency) == 20 + assert set(adjacency) == set(neighbors) + assert neighbors[-1] in adjacency + assert g.edges() == expected_edges + + adjacency.clear() + assert len(adjacency) == 0 + assert g.edges() == set() + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_large_graph_queries_are_not_truncated(init_cuda): + """Graph queries return nodes and edges beyond the old 128-item buffers.""" + g = GraphDefinition() + nodes = [g.empty() for _ in range(130)] + nodes[0].succ.update(nodes[1:]) + nodes[1].succ.add(nodes[2]) + + expected_edges = {(nodes[0], node) for node in nodes[1:]} + expected_edges.add((nodes[1], nodes[2])) + assert g.nodes() == set(nodes) + assert g.edges() == expected_edges + + def test_node_graph_property(nonempty_graph_spec): """Every node's .graph property returns the parent GraphDefinition.""" spec = nonempty_graph_spec @@ -701,6 +740,22 @@ def test_node_attrs_preserved_by_nodes(node_spec): assert getattr(retrieved, attr) == getattr(node, attr), f"{spec.name}.{attr} not preserved by nodes()" +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_host_callback_node_reconstructed_from_embedded_child(init_cuda): + """A host-callback node read through an embedded child graph is reconstructed via _create_from_driver.""" + # The same-wrapper nodes() (test_node_attrs_preserved_by_nodes) returns the + # registry-cached object and never exercises reconstruction; only the embedded + # child graph carries fresh, unregistered node handles. Host callback is + # mempool-free so it reconstructs here; alloc-based nodes stay cached. + child = GraphDefinition() + _build_host_callback_node(child) + parent = GraphDefinition() + reconstructed = list(parent.embed(child).child_graph.nodes()) + assert any(isinstance(n, HostCallbackNode) for n in reconstructed), ( + f"no reconstructed HostCallbackNode in {[type(n).__name__ for n in reconstructed]}" + ) + + def test_identity_preservation(init_cuda): """Round-trips through nodes(), edges(), and pred/succ return extant objects rather than duplicates.""" @@ -1143,6 +1198,88 @@ def test_host_callback_user_data_rejected_for_python_callable(sample_graphdef): sample_graphdef.callback(lambda: None, user_data=b"hello") +_INCOMPATIBLE_CTYPES_HOST_CALLBACKS = [ + pytest.param(ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p), id="bad-restype"), + pytest.param(ctypes.CFUNCTYPE(None, ctypes.c_int), id="bad-argtype"), + pytest.param(ctypes.CFUNCTYPE(None), id="missing-arg"), + pytest.param(ctypes.CFUNCTYPE(None, ctypes.c_void_p, ctypes.c_void_p), id="extra-arg"), +] + +# Prototypes that declare CUhostFn but differ in ctypes bookkeeping. ctypes +# builds the same thunk for all of them, so all must be accepted. +_COMPATIBLE_CTYPES_HOST_CALLBACKS = [ + pytest.param(ctypes.CFUNCTYPE(None, ctypes.c_void_p), id="cfunctype"), + pytest.param(ctypes.CFUNCTYPE(None, ctypes.c_void_p, use_errno=True), id="use-errno"), + pytest.param(ctypes.PYFUNCTYPE(None, ctypes.c_void_p), id="pyfunctype"), +] + + +@pytest.mark.agent_authored(model="cursor-grok-4.5") +@pytest.mark.parametrize("callback_type", _INCOMPATIBLE_CTYPES_HOST_CALLBACKS) +def test_host_callback_ctypes_rejects_incompatible_signature(sample_graphdef, callback_type): + """Incompatible ctypes prototypes are rejected before CUDA sees them.""" + with pytest.raises(TypeError, match="CUhostFn"): + sample_graphdef.callback(callback_type(0)) + + +@pytest.mark.agent_authored(model="cursor-grok-4.5") +def test_host_callback_ctypes_update_rejects_incompatible_signature(sample_graphdef): + """HostCallbackNode.update applies the same ctypes ABI check.""" + good_type = ctypes.CFUNCTYPE(None, ctypes.c_void_p) + bad_type = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p) + + @good_type + def good(data): + pass + + node = sample_graphdef.callback(good) + with pytest.raises(TypeError, match="CUhostFn"): + node.update(bad_type(0)) + + +@pytest.mark.agent_authored(model="claude-opus-5") +@pytest.mark.parametrize("callback_type", _COMPATIBLE_CTYPES_HOST_CALLBACKS) +def test_host_callback_ctypes_accepts_equivalent_prototypes(sample_graphdef, callback_type): + """Prototypes that declare CUhostFn are accepted and run.""" + called = [False] + + @callback_type + def raw_fn(data): + called[0] = True + + sample_graphdef.callback(raw_fn) + graph = sample_graphdef.instantiate() + + stream = Device().create_stream() + graph.upload(stream) + graph.launch(stream) + stream.sync() + + assert called[0] + + +@pytest.mark.agent_authored(model="cursor-grok-4.5") +@pytest.mark.skipif(sys.platform != "win32", reason="WINFUNCTYPE is Windows-only") +def test_host_callback_ctypes_accepts_winfunctype(sample_graphdef): + """On Windows, WINFUNCTYPE matches CUDA_CB (__stdcall) and is accepted.""" + callback_type = ctypes.WINFUNCTYPE(None, ctypes.c_void_p) + called = [False] + + @callback_type + def raw_fn(data): + called[0] = True + + sample_graphdef.callback(raw_fn) + graph = sample_graphdef.instantiate() + + stream = Device().create_stream() + graph.upload(stream) + graph.launch(stream) + stream.sync() + + assert called[0] + + def test_instantiate_and_execute_event_record_wait(sample_graphdef): """Graph with event record and wait nodes can be executed.""" event = Device().create_event() diff --git a/cuda_core/tests/graph/test_graph_definition_errors.py b/cuda_core/tests/graph/test_graph_definition_errors.py index a8a3c9b8f09..d80118cdf7c 100644 --- a/cuda_core/tests/graph/test_graph_definition_errors.py +++ b/cuda_core/tests/graph/test_graph_definition_errors.py @@ -6,10 +6,10 @@ import ctypes import pytest +from conftest import xfail_on_graph_mempool_oom from helpers.graph_kernels import compile_common_kernels from helpers.misc import try_create_condition -from conftest import xfail_on_graph_mempool_oom from cuda.core import Device, LaunchConfig from cuda.core._utils.cuda_utils import CUDAError from cuda.core.graph import ( diff --git a/cuda_core/tests/graph/test_graph_definition_integration.py b/cuda_core/tests/graph/test_graph_definition_integration.py index 12b57bb73a5..58f96e1bab3 100644 --- a/cuda_core/tests/graph/test_graph_definition_integration.py +++ b/cuda_core/tests/graph/test_graph_definition_integration.py @@ -7,8 +7,8 @@ import numpy as np import pytest - from conftest import xfail_on_graph_mempool_oom + from cuda.core import Device, EventOptions, LaunchConfig, Program, ProgramOptions from cuda.core._utils.cuda_utils import driver, handle_return from cuda.core.graph import GraphDefinition diff --git a/cuda_core/tests/graph/test_graph_definition_lifetime.py b/cuda_core/tests/graph/test_graph_definition_lifetime.py index 78ccb3008b0..93c1453753d 100644 --- a/cuda_core/tests/graph/test_graph_definition_lifetime.py +++ b/cuda_core/tests/graph/test_graph_definition_lifetime.py @@ -13,10 +13,10 @@ import weakref import pytest +from conftest import xfail_on_graph_mempool_oom from helpers.graph_kernels import compile_common_kernels from helpers.misc import try_create_condition -from conftest import xfail_on_graph_mempool_oom from cuda_python_test_helpers import under_compute_sanitizer # Resource finalization triggered by graph destruction is not synchronous. A @@ -77,6 +77,8 @@ def _wait_until(predicate, timeout=None, interval=0.02): from cuda.core import Device, DeviceMemoryResource, EventOptions, Kernel, LaunchConfig +from cuda.core._utils.cuda_utils import CUDAError +from cuda.core._utils.version import driver_version from cuda.core.graph import ( ChildGraphNode, ConditionalNode, @@ -424,6 +426,97 @@ def test_destroying_child_node_invalidates_embedded_handles(init_cuda): assert not embedded_callback.is_valid +@pytest.mark.agent_authored(model="gpt-5.6") +def test_updating_child_node_replaces_embedded_handles(init_cuda): + """A successful replacement invalidates only the old embedded hierarchy.""" + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + old_inner = GraphDefinition() + old_inner.callback(lambda: None) + old_middle = GraphDefinition() + old_middle.embed(old_inner) + parent = GraphDefinition() + child_node = parent.embed(old_middle) + + embedded_middle = child_node.child_graph + embedded_child = next(node for node in embedded_middle.nodes() if isinstance(node, ChildGraphNode)) + embedded_inner = embedded_child.child_graph + embedded_callback = next(node for node in embedded_inner.nodes() if isinstance(node, HostCallbackNode)) + + # Sources from the destination hierarchy may contain handles CUDA destroys + # during replacement, so cuda-core rejects them before mutation. + with pytest.raises(CUDAError): + child_node.update(embedded_middle) + with pytest.raises(CUDAError): + child_node.update(parent) + assert int(embedded_middle.handle) != 0 + assert int(embedded_inner.handle) != 0 + assert embedded_child.is_valid + assert embedded_callback.is_valid + + replacement_inner = GraphDefinition() + replacement_inner.callback(lambda: None) + replacement_middle = GraphDefinition() + replacement_middle.embed(replacement_inner) + child_node.update(replacement_middle) + + assert child_node.is_valid + assert int(embedded_middle.handle) == 0 + assert int(embedded_inner.handle) == 0 + assert not embedded_child.is_valid + assert not embedded_callback.is_valid + + new_middle = child_node.child_graph + new_child = next(node for node in new_middle.nodes() if isinstance(node, ChildGraphNode)) + assert int(new_middle.handle) != 0 + assert int(new_child.child_graph.handle) != 0 + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_child_update_replaces_nested_attachments(init_cuda): + """Replacement drops old owners and imports nested replacement owners.""" + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + def old_callback(): + pass + + old_callback_weak = weakref.ref(old_callback) + old_child = GraphDefinition() + old_child.callback(old_callback) + parent = GraphDefinition() + child_node = parent.embed(old_child) + + del old_callback, old_child + gc.collect() + assert old_callback_weak() is not None + + def replacement_callback(): + pass + + replacement_callback_weak = weakref.ref(replacement_callback) + replacement_inner = GraphDefinition() + replacement_inner.callback(replacement_callback) + replacement = GraphDefinition() + replacement.embed(replacement_inner) + child_node.update(replacement) + + _wait_until(lambda: old_callback_weak() is None) + del replacement_callback, replacement_inner, replacement + gc.collect() + assert replacement_callback_weak() is not None + + embedded = child_node.child_graph + embedded_child = next(node for node in embedded.nodes() if isinstance(node, ChildGraphNode)) + embedded_callback = next(node for node in embedded_child.child_graph.nodes() if isinstance(node, HostCallbackNode)) + assert embedded_callback.callback is replacement_callback_weak() + + del embedded_callback, embedded_child, embedded + child_node.destroy() + _wait_until(lambda: replacement_callback_weak() is None) + + @pytest.mark.agent_authored(model="gpt-5.6") def test_builder_embedded_clone_releases_attachment_on_node_destroy(init_cuda): """GraphBuilder.embed imports metadata from the captured child graph.""" @@ -611,48 +704,97 @@ def test_user_object_cleanup_is_coalesced_on_python_thread(init_cuda): @pytest.mark.agent_authored(model="gpt-5.6") -def test_pending_call_queue_saturation_preserves_cleanup(init_cuda): +def test_pending_call_queue_saturation_preserves_cleanup(tmp_path): """A full CPython queue neither strands nor mis-threads cleanup.""" - pending_callback_type = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p) - add_pending_call = ctypes.pythonapi.Py_AddPendingCall - add_pending_call.argtypes = [pending_callback_type, ctypes.c_void_p] - add_pending_call.restype = ctypes.c_int + code = f"timeout = {_FINALIZE_TIMEOUT!r}\n" + textwrap.dedent( + """ + import ctypes + import gc + import threading + import time - @pending_callback_type - def noop_pending_call(_): - return 0 + from cuda.core import Device + from cuda.core.graph import GraphDefinition - finalized_threads = [] - main_thread = threading.get_ident() - first_callback = _ThreadRecordingCallback(finalized_threads) - first_graph = GraphDefinition() - first_graph.callback(first_callback) - graph_holder = [first_graph] - worker_done = threading.Event() - queue_was_full = [] + class ThreadRecordingCallback: + def __init__(self, finalized_threads): + self.finalized_threads = finalized_threads - del first_callback, first_graph + def __call__(self): + pass - def fill_queue_and_destroy(): - while add_pending_call(noop_pending_call, None) == 0: - pass - queue_was_full.append(True) - graph_holder.clear() - worker_done.set() - - worker = threading.Thread(target=fill_queue_and_destroy) - worker.start() - assert worker_done.wait(timeout=5) - worker.join() - assert queue_was_full == [True] - - # A later safe cuda-core close retries after the main thread has had an - # opportunity to drain the foreign pending calls. - retry_builder = Device().create_graph_builder() - retry_builder.close() - - _wait_until(lambda: len(finalized_threads) == 1) - assert set(finalized_threads) == {main_thread} + def __del__(self): + self.finalized_threads.append(threading.get_ident()) + + def wait_until(predicate): + deadline = time.monotonic() + timeout + while True: + gc.collect() + if predicate(): + return + if time.monotonic() >= deadline: + break + time.sleep(0) + time.sleep(0.02) + raise AssertionError(f"condition not satisfied within {timeout}s") + + Device(0).set_current() + + pending_callback_type = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p) + add_pending_call = ctypes.pythonapi.Py_AddPendingCall + add_pending_call.argtypes = [pending_callback_type, ctypes.c_void_p] + add_pending_call.restype = ctypes.c_int + make_pending_calls = ctypes.pythonapi.Py_MakePendingCalls + make_pending_calls.argtypes = [] + make_pending_calls.restype = ctypes.c_int + + @pending_callback_type + def noop_pending_call(_): + return 0 + + finalized_threads = [] + main_thread = threading.get_ident() + first_callback = ThreadRecordingCallback(finalized_threads) + first_graph = GraphDefinition() + first_graph.callback(first_callback) + graph_holder = [first_graph] + worker_done = threading.Event() + queue_was_full = [] + + del first_callback, first_graph + + def fill_queue_and_destroy(): + while add_pending_call(noop_pending_call, None) == 0: + pass + queue_was_full.append(True) + graph_holder.clear() + worker_done.set() + + worker = threading.Thread(target=fill_queue_and_destroy) + worker.start() + assert worker_done.wait(timeout=5) + worker.join() + assert queue_was_full == [True] + + # Free space before the cuda-core entry that retries cleanup scheduling. + assert make_pending_calls() == 0 + + retry_builder = Device().create_graph_builder() + retry_builder.close() + + wait_until(lambda: len(finalized_threads) == 1) + assert set(finalized_threads) == {main_thread} + """ + ) + result = subprocess.run( # noqa: S603 - controlled interpreter probe + [sys.executable, "-c", code], + capture_output=True, + text=True, + timeout=60, + # Isolate the process-global pending-call queue from parallel tests. + cwd=tmp_path, + ) + assert result.returncode == 0, result.stderr @pytest.mark.agent_authored(model="gpt-5.6") diff --git a/cuda_core/tests/graph/test_graph_definition_mutation.py b/cuda_core/tests/graph/test_graph_definition_mutation.py index 066822f232a..eb1f0255ad4 100644 --- a/cuda_core/tests/graph/test_graph_definition_mutation.py +++ b/cuda_core/tests/graph/test_graph_definition_mutation.py @@ -8,9 +8,9 @@ import numpy as np import pytest +from cuda_python_test_helpers.marks import requires_module from helpers.collection_interface_testers import assert_mutable_set_interface from helpers.graph_kernels import compile_parallel_kernels -from helpers.marks import requires_module from cuda.core import Device, LaunchConfig, LegacyPinnedMemoryResource from cuda.core._utils.cuda_utils import CUDAError diff --git a/cuda_core/tests/graph/test_graph_memory_resource.py b/cuda_core/tests/graph/test_graph_memory_resource.py index 9fc794f4cca..517f9c080b7 100644 --- a/cuda_core/tests/graph/test_graph_memory_resource.py +++ b/cuda_core/tests/graph/test_graph_memory_resource.py @@ -5,10 +5,9 @@ """Tests for GraphMemoryResource allocation and attributes during graph capture.""" import pytest -from helpers import IS_WINDOWS, IS_WSL +from conftest import xfail_on_graph_mempool_oom from helpers.buffers import compare_buffer_to_constant, make_scratch_buffer, set_buffer -from conftest import xfail_on_graph_mempool_oom from cuda.core import ( Device, DeviceMemoryResource, @@ -20,6 +19,7 @@ ) from cuda.core._utils.cuda_utils import CUDAError from cuda.core.graph import GraphCompleteOptions +from cuda_python_test_helpers import IS_WINDOWS, IS_WSL def _common_kernels_alloc(): diff --git a/cuda_core/tests/graph/test_graph_node_update.py b/cuda_core/tests/graph/test_graph_node_update.py new file mode 100644 index 00000000000..f34b9ce7f93 --- /dev/null +++ b/cuda_core/tests/graph/test_graph_node_update.py @@ -0,0 +1,1219 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Tests for updating individual graph node parameters.""" + +import ctypes +import gc +import threading +import time +import weakref +from dataclasses import dataclass +from typing import Callable + +import pytest +from helpers.graph_kernels import compile_common_kernels + +from cuda.core import LaunchConfig, LegacyPinnedMemoryResource +from cuda.core._utils._weak_handles import weak_handle +from cuda.core._utils.cuda_utils import CUDAError, driver, handle_return +from cuda.core._utils.version import driver_version +from cuda.core.graph import ( + ChildGraphNode, + EventRecordNode, + EventWaitNode, + GraphDefinition, + HostCallbackNode, + KernelNode, + MemcpyNode, + MemsetNode, +) + + +@dataclass +class _DefinitionUpdateCase: + graph_def: GraphDefinition + node: object + original: object + replacement: object + update: Callable[[object], None] + assert_current: Callable[[object], None] + assert_exec_uses: Callable[[object, object], None] + invalid_update: Callable[[], None] | None + invalid_exception: type[BaseException] | None + invalid_argument_update: Callable[[], None] | None + + +def _assert_equal(actual, expected): + assert actual == expected + + +def _wait_until(predicate, timeout=5.0): + deadline = time.monotonic() + timeout + while not predicate(): + if time.monotonic() >= deadline: + raise AssertionError(f"condition not satisfied within {timeout}s") + gc.collect() + time.sleep(0.02) + + +def _update_executable_case(graph, case): + view = graph[case.node] + replacement = case.replacement + if isinstance(case.node, (EventRecordNode, EventWaitNode)): + view.update(replacement) + elif isinstance(case.node, HostCallbackNode): + if isinstance(replacement, tuple): + view.update(replacement[0], user_data=replacement[1]) + else: + view.update(replacement) + elif isinstance(case.node, MemsetNode): + view.update( + dst=replacement["dst"], + value=replacement["value"], + width=replacement["width"], + height=replacement["height"], + pitch=replacement["pitch"], + ) + elif isinstance(case.node, MemcpyNode): + view.update( + dst=replacement["dst"], + src=replacement["src"], + size=replacement["size"], + ) + elif isinstance(case.node, KernelNode): + view.update( + config=replacement["config"], + kernel=replacement["kernel"], + args=replacement["args"], + ) + elif isinstance(case.node, ChildGraphNode): + view.update(replacement["child"]) + else: # pragma: no cover - fixture cases are exhaustive + raise AssertionError(f"unsupported case: {type(case.node).__name__}") + + +def _event_record_case(device): + """Keep the selected event pending to identify each exec's record target.""" + original = device.create_event() + replacement = device.create_event() + invalid_replacement = device.create_event() + invalid_replacement.close() + + callback_started = threading.Event() + callback_release = threading.Event() + + def blocking_callback(): + callback_started.set() + callback_release.wait(timeout=30) + + graph_def = GraphDefinition() + callback_node = graph_def.callback(blocking_callback) + node = callback_node.record(original) + + def assert_exec_uses(graph, expected): + callback_started.clear() + callback_release.clear() + stream = device.create_stream() + graph.launch(stream) + try: + assert callback_started.wait(timeout=5) + assert expected.is_done is False + unexpected = replacement if expected is original else original + assert unexpected.is_done is True + finally: + callback_release.set() + stream.sync() + + return _DefinitionUpdateCase( + graph_def=graph_def, + node=node, + original=original, + replacement=replacement, + update=node.update, + assert_current=lambda expected: _assert_equal(node.event, expected), + assert_exec_uses=assert_exec_uses, + invalid_update=lambda: node.update(invalid_replacement), + invalid_exception=CUDAError, + invalid_argument_update=lambda: node.update(object()), + ) + + +def _event_wait_case(device): + """Keep the selected event pending to identify each exec's wait target.""" + original = device.create_event() + replacement = device.create_event() + invalid_replacement = device.create_event() + invalid_replacement.close() + + callback_called = threading.Event() + graph_def = GraphDefinition() + node = graph_def.wait(original) + node.callback(callback_called.set) + + def assert_exec_uses(graph, expected): + producer_started = threading.Event() + producer_release = threading.Event() + + def blocking_callback(): + producer_started.set() + producer_release.wait(timeout=30) + + producer_def = GraphDefinition() + producer_def.callback(blocking_callback).record(expected) + producer_graph = producer_def.instantiate() + producer_stream = device.create_stream() + consumer_stream = device.create_stream() + + callback_called.clear() + producer_graph.launch(producer_stream) + try: + assert producer_started.wait(timeout=5) + graph.launch(consumer_stream) + assert not callback_called.wait(timeout=0.1) + finally: + producer_release.set() + producer_stream.sync() + consumer_stream.sync() + assert callback_called.is_set() + + return _DefinitionUpdateCase( + graph_def=graph_def, + node=node, + original=original, + replacement=replacement, + update=node.update, + assert_current=lambda expected: _assert_equal(node.event, expected), + assert_exec_uses=assert_exec_uses, + invalid_update=lambda: node.update(invalid_replacement), + invalid_exception=CUDAError, + invalid_argument_update=lambda: node.update(object()), + ) + + +def _host_callback_case(device): + """Use callbacks that report their identity to distinguish each exec.""" + called = [] + + def original(): + called.append(original) + + def replacement(): + called.append(replacement) + + graph_def = GraphDefinition() + node = graph_def.callback(original) + + def assert_exec_uses(graph, expected): + called.clear() + stream = device.create_stream() + graph.launch(stream) + stream.sync() + assert called == [expected] + + return _DefinitionUpdateCase( + graph_def=graph_def, + node=node, + original=original, + replacement=replacement, + update=node.update, + assert_current=lambda expected: _assert_equal(node.callback, expected), + assert_exec_uses=assert_exec_uses, + invalid_update=lambda: node.update(replacement, user_data=b"not valid for a Python callback"), + invalid_exception=ValueError, + invalid_argument_update=lambda: node.update(object()), + ) + + +def _host_callback_ctypes_case(device): + """Use ctypes callbacks and copied payloads to distinguish each exec.""" + callback_type = ctypes.CFUNCTYPE(None, ctypes.c_void_p) + called = [] + + def read_byte(data): + return ctypes.cast(data, ctypes.POINTER(ctypes.c_uint8))[0] + + @callback_type + def original_fn(data): + called.append((original_fn, read_byte(data))) + + @callback_type + def replacement_fn(data): + called.append((replacement_fn, read_byte(data))) + + original = original_fn, bytes([0xA1]) + replacement = replacement_fn, bytes([0xB2]) + graph_def = GraphDefinition() + node = graph_def.callback(original_fn, user_data=original[1]) + + def update(value): + fn, user_data = value + node.update(fn, user_data=user_data) + + def assert_exec_uses(graph, expected): + called.clear() + stream = device.create_stream() + graph.launch(stream) + stream.sync() + assert called == [(expected[0], expected[1][0])] + + def invalid_update(): + node.update(lambda: None, user_data=b"not valid for a Python callback") + + return _DefinitionUpdateCase( + graph_def=graph_def, + node=node, + original=original, + replacement=replacement, + update=update, + assert_current=lambda _expected: _assert_equal(node.callback, None), + assert_exec_uses=assert_exec_uses, + invalid_update=invalid_update, + invalid_exception=ValueError, + invalid_argument_update=None, + ) + + +def _memset_case(device, *, replace_dst): + memory_resource = LegacyPinnedMemoryResource() + original_buffer = memory_resource.allocate(4) + replacement_buffer = memory_resource.allocate(4) if replace_dst else original_buffer + original = { + "dst": original_buffer, + "value": 0x11, + "element_size": 1, + "width": 4, + "height": 1, + "pitch": 0, + } + replacement = { + **original, + "dst": replacement_buffer, + "value": 0x22, + } + + graph_def = GraphDefinition() + node = graph_def.memset(original["dst"], original["value"], original["width"]) + + def update(expected): + if replace_dst: + node.update(dst=expected["dst"], value=expected["value"]) + else: + node.update(value=expected["value"]) + + def assert_current(expected): + assert node.dptr == int(expected["dst"].handle) + assert node.value == expected["value"] + assert node.element_size == expected["element_size"] + assert node.width == expected["width"] + assert node.height == expected["height"] + assert node.pitch == expected["pitch"] + + def as_bytes(buffer): + return (ctypes.c_uint8 * 4).from_address(int(buffer.handle)) + + def assert_exec_uses(graph, expected): + original_data = as_bytes(original_buffer) + replacement_data = as_bytes(replacement_buffer) + original_data[:] = [0] * 4 + replacement_data[:] = [0] * 4 + + stream = device.create_stream() + graph.launch(stream) + stream.sync() + + assert list(as_bytes(expected["dst"])) == [expected["value"]] * 4 + if replace_dst: + unexpected = replacement_buffer if expected["dst"] is original_buffer else original_buffer + assert list(as_bytes(unexpected)) == [0] * 4 + + return _DefinitionUpdateCase( + graph_def=graph_def, + node=node, + original=original, + replacement=replacement, + update=update, + assert_current=assert_current, + assert_exec_uses=assert_exec_uses, + invalid_update=lambda: node.update(value=256), + invalid_exception=OverflowError, + invalid_argument_update=lambda: node.update(dst=object()), + ) + + +def _memset_value_case(device): + """Change the fill value while preserving destination ownership.""" + return _memset_case(device, replace_dst=False) + + +def _memset_destination_case(device): + """Replace the destination and its retained allocation owner.""" + return _memset_case(device, replace_dst=True) + + +def _memcpy_case(device, *, replace_operand): + memory_resource = LegacyPinnedMemoryResource() + original_src = memory_resource.allocate(4) + original_dst = memory_resource.allocate(4) + replacement_src = memory_resource.allocate(4) if replace_operand == "src" else original_src + replacement_dst = memory_resource.allocate(4) if replace_operand == "dst" else original_dst + original = { + "dst": original_dst, + "src": original_src, + "size": 2 if replace_operand is None else 4, + } + replacement = { + "dst": replacement_dst, + "src": replacement_src, + "size": 4, + } + + graph_def = GraphDefinition() + node = graph_def.memcpy(original["dst"], original["src"], original["size"]) + + def update(expected): + if replace_operand == "src": + node.update(src=expected["src"]) + elif replace_operand == "dst": + node.update(dst=expected["dst"]) + else: + node.update(size=expected["size"]) + + def assert_current(expected): + assert node.dst == int(expected["dst"].handle) + assert node.src == int(expected["src"].handle) + assert node.size == expected["size"] + + def as_bytes(buffer): + return (ctypes.c_uint8 * 4).from_address(int(buffer.handle)) + + def assert_exec_uses(graph, expected): + as_bytes(original_src)[:] = [0x11] * 4 + as_bytes(original_dst)[:] = [0] * 4 + if replacement_src is not original_src: + as_bytes(replacement_src)[:] = [0x22] * 4 + if replacement_dst is not original_dst: + as_bytes(replacement_dst)[:] = [0] * 4 + + stream = device.create_stream() + graph.launch(stream) + stream.sync() + + source_value = 0x11 if expected["src"] is original_src else 0x22 + expected_data = [source_value] * expected["size"] + expected_data.extend([0] * (4 - expected["size"])) + assert list(as_bytes(expected["dst"])) == expected_data + if replacement_dst is not original_dst: + unexpected_dst = replacement_dst if expected["dst"] is original_dst else original_dst + assert list(as_bytes(unexpected_dst)) == [0] * 4 + + return _DefinitionUpdateCase( + graph_def=graph_def, + node=node, + original=original, + replacement=replacement, + update=update, + assert_current=assert_current, + assert_exec_uses=assert_exec_uses, + invalid_update=lambda: node.update(size=-1), + invalid_exception=OverflowError, + invalid_argument_update=lambda: node.update(src=object()), + ) + + +def _memcpy_size_case(device): + """Change the copy size while preserving both operand owners.""" + return _memcpy_case(device, replace_operand=None) + + +def _memcpy_source_case(device): + """Replace the source while preserving destination ownership.""" + return _memcpy_case(device, replace_operand="src") + + +def _memcpy_destination_case(device): + """Replace the destination while preserving source ownership.""" + return _memcpy_case(device, replace_operand="dst") + + +def _kernel_case(device, *, replace): + module = compile_common_kernels() + add_one = module.get_kernel("add_one") + empty_kernel = module.get_kernel("empty_kernel") + write_launch_dims = module.get_kernel("write_launch_dims") + memory_resource = LegacyPinnedMemoryResource() + original_buffer = memory_resource.allocate(ctypes.sizeof(ctypes.c_int)) + replacement_buffer = memory_resource.allocate(ctypes.sizeof(ctypes.c_int)) if replace == "args" else original_buffer + + original_config = LaunchConfig(grid=1, block=1) + replacement_config = LaunchConfig(grid=2, block=3) if replace == "config" else original_config + original_kernel = write_launch_dims if replace == "config" else add_one + replacement_kernel = empty_kernel if replace == "kernel" else original_kernel + original_args = (original_buffer,) + if replace == "kernel": + replacement_args = () + elif replace == "args": + replacement_args = (replacement_buffer,) + else: + replacement_args = original_args + + original = { + "config": original_config, + "kernel": original_kernel, + "args": original_args, + "output": original_buffer, + "expected": 1001 if replace == "config" else 1, + } + replacement = { + "config": replacement_config, + "kernel": replacement_kernel, + "args": replacement_args, + "output": replacement_buffer, + "expected": 2003 if replace == "config" else int(replace != "kernel"), + } + + graph_def = GraphDefinition() + node = graph_def.launch(original["config"], original["kernel"], *original["args"]) + + def update(expected): + if replace == "config": + node.update(config=expected["config"]) + elif replace == "args": + node.update(args=expected["args"]) + else: + node.update(kernel=expected["kernel"], args=expected["args"]) + + def assert_current(expected): + assert node.config == expected["config"] + assert int(node.kernel.handle) == int(expected["kernel"].handle) + + def as_int(buffer): + return ctypes.c_int.from_address(int(buffer.handle)) + + def assert_exec_uses(graph, expected): + as_int(original_buffer).value = 0 + as_int(replacement_buffer).value = 0 + + stream = device.create_stream() + graph.launch(stream) + stream.sync() + + assert as_int(expected["output"]).value == expected["expected"] + if replacement_buffer is not original_buffer: + unexpected = replacement_buffer if expected["output"] is original_buffer else original_buffer + assert as_int(unexpected).value == 0 + + def invalid_update(): + if replace == "kernel": + node.update(kernel=replacement_kernel) + elif replace == "args": + node.update(args=(object(),)) + else: + node.update(config=object()) + + invalid_exception = ValueError if replace == "kernel" else TypeError + + return _DefinitionUpdateCase( + graph_def=graph_def, + node=node, + original=original, + replacement=replacement, + update=update, + assert_current=assert_current, + assert_exec_uses=assert_exec_uses, + invalid_update=invalid_update, + invalid_exception=invalid_exception, + invalid_argument_update=lambda: node.update(config=object()), + ) + + +def _kernel_config_case(device): + """Replace launch dimensions while preserving the kernel and arguments.""" + return _kernel_case(device, replace="config") + + +def _kernel_args_case(device): + """Replace arguments while preserving the kernel and configuration.""" + return _kernel_case(device, replace="args") + + +def _kernel_function_case(device): + """Replace a kernel and explicitly supply its coupled arguments.""" + return _kernel_case(device, replace="kernel") + + +def _child_graph_case(device): + """Replace the embedded clone while preserving existing executables.""" + called = [] + + def original_callback(): + called.append(original_callback) + + def replacement_callback(): + called.append(replacement_callback) + + original_child = GraphDefinition() + original_child.callback(original_callback) + replacement_child = GraphDefinition() + replacement_child.callback(replacement_callback) + original = { + "child": original_child, + "callback": original_callback, + } + replacement = { + "child": replacement_child, + "callback": replacement_callback, + } + + graph_def = GraphDefinition() + node = graph_def.embed(original_child) + invalid_child = node.child_graph + + def update(expected): + node.update(expected["child"]) + + def assert_current(expected): + callback_node = next( + child_node for child_node in node.child_graph.nodes() if isinstance(child_node, HostCallbackNode) + ) + assert callback_node.callback is expected["callback"] + + def assert_exec_uses(graph, expected): + called.clear() + stream = device.create_stream() + graph.launch(stream) + stream.sync() + assert called == [expected["callback"]] + + return _DefinitionUpdateCase( + graph_def=graph_def, + node=node, + original=original, + replacement=replacement, + update=update, + assert_current=assert_current, + assert_exec_uses=assert_exec_uses, + invalid_update=lambda: node.update(invalid_child), + invalid_exception=CUDAError, + invalid_argument_update=lambda: node.update(object()), + ) + + +@pytest.fixture( + params=[ + pytest.param(_event_record_case, id="event-record"), + pytest.param(_event_wait_case, id="event-wait"), + pytest.param(_host_callback_case, id="host-callback-python"), + pytest.param(_host_callback_ctypes_case, id="host-callback-ctypes"), + pytest.param(_memset_value_case, id="memset-value"), + pytest.param(_memset_destination_case, id="memset-destination"), + pytest.param(_memcpy_size_case, id="memcpy-size"), + pytest.param(_memcpy_source_case, id="memcpy-source"), + pytest.param(_memcpy_destination_case, id="memcpy-destination"), + pytest.param(_kernel_config_case, id="kernel-config"), + pytest.param(_kernel_args_case, id="kernel-args"), + pytest.param(_kernel_function_case, id="kernel-function"), + pytest.param(_child_graph_case, id="child-graph"), + ] +) +def definition_update_case(request, init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + return request.param(init_cuda) + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_memcpy_update_rejects_unsupported_descriptor(init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + memory_resource = LegacyPinnedMemoryResource() + src = memory_resource.allocate(8) + dst = memory_resource.allocate(8) + graph_def = GraphDefinition() + node = graph_def.memcpy(dst, src, 4) + + # cuda.core cannot construct this descriptor, but imported graphs can + # contain one; use cuda.bindings to exercise that rejection path. + params = driver.CUDA_MEMCPY3D() + params.srcXInBytes = 1 + params.srcMemoryType = driver.CUmemorytype.CU_MEMORYTYPE_HOST + params.srcHost = int(src.handle) + params.srcPitch = 4 + params.srcHeight = 2 + params.dstMemoryType = driver.CUmemorytype.CU_MEMORYTYPE_HOST + params.dstHost = int(dst.handle) + params.dstPitch = 4 + params.dstHeight = 2 + params.WidthInBytes = 2 + params.Height = 2 + params.Depth = 1 + handle_return(driver.cuGraphMemcpyNodeSetParams(node.handle, params)) + + with pytest.raises(NotImplementedError, match="multidimensional"): + node.update(size=3) + + unchanged = handle_return(driver.cuGraphMemcpyNodeGetParams(node.handle)) + assert unchanged.srcXInBytes == 1 + assert unchanged.WidthInBytes == 2 + assert unchanged.Height == 2 + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_kernel_update_rejects_unsupported_config(init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + kernel = compile_common_kernels().get_kernel("empty_kernel") + graph_def = GraphDefinition() + node = graph_def.launch(LaunchConfig(grid=1, block=1), kernel) + + clustered = LaunchConfig(grid=1, block=1) + clustered.cluster = (1, 1, 1) + with pytest.raises(NotImplementedError, match="clustered or cooperative"): + node.update(config=clustered) + with pytest.raises(NotImplementedError, match="clustered or cooperative"): + graph_def.launch(clustered, kernel) + + cooperative = LaunchConfig(grid=1, block=1) + cooperative.is_cooperative = True + with pytest.raises(NotImplementedError, match="clustered or cooperative"): + node.update(config=cooperative) + with pytest.raises(NotImplementedError, match="clustered or cooperative"): + graph_def.launch(cooperative, kernel) + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_partial_memory_updates_are_keyword_only(init_cuda): + memory_resource = LegacyPinnedMemoryResource() + src = memory_resource.allocate(4) + dst = memory_resource.allocate(4) + graph_def = GraphDefinition() + memset_node = graph_def.memset(dst, 0, 4) + memcpy_node = graph_def.memcpy(dst, src, 4) + + with pytest.raises(TypeError): + memset_node.update(dst) + with pytest.raises(TypeError): + memcpy_node.update(dst) + + +@pytest.mark.parametrize( + "device_operand", + [ + pytest.param("src", id="device-to-host"), + pytest.param("dst", id="host-to-device"), + ], +) +@pytest.mark.agent_authored(model="gpt-5.6") +def test_memcpy_update_between_host_and_device(init_cuda, device_operand): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + memory_resource = LegacyPinnedMemoryResource() + host_src = memory_resource.allocate(4) + host_dst = memory_resource.allocate(4) + host_src_bytes = (ctypes.c_uint8 * 4).from_address(int(host_src.handle)) + host_dst_bytes = (ctypes.c_uint8 * 4).from_address(int(host_dst.handle)) + host_src_bytes[:] = [0x5A] * 4 + host_dst_bytes[:] = [0] * 4 + + stream = init_cuda.create_stream() + device_buffer = init_cuda.memory_resource.allocate(4, stream=stream) + device_buffer.fill(0, stream=stream) + if device_operand == "src": + device_buffer.copy_from(host_src, stream=stream) + stream.sync() + + graph_def = GraphDefinition() + node = graph_def.memcpy(host_dst, host_src, 4) + if device_operand == "src": + node.update(src=device_buffer) + else: + node.update(dst=device_buffer) + + graph = graph_def.instantiate() + graph.launch(stream) + if device_operand == "dst": + device_buffer.copy_to(host_dst, stream=stream) + stream.sync() + + assert list(host_dst_bytes) == [0x5A] * 4 + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_definition_node_update_changes_future_instantiations( + definition_update_case, +): + case = definition_update_case + assert case.original != case.replacement + old_graph = case.graph_def.instantiate() + + case.update(case.replacement) + case.assert_current(case.replacement) + + new_graph = case.graph_def.instantiate() + assert old_graph != new_graph + case.assert_exec_uses(old_graph, case.original) + case.assert_exec_uses(new_graph, case.replacement) + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_destroyed_definition_node_rejects_update( + definition_update_case, +): + case = definition_update_case + case.node.destroy() + + assert not case.node.is_valid + assert case.node not in case.graph_def.nodes() + with pytest.raises(CUDAError): + case.update(case.replacement) + assert not case.node.is_valid + assert case.node not in case.graph_def.nodes() + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_failed_definition_node_update_preserves_state( + definition_update_case, +): + case = definition_update_case + + assert case.invalid_update is not None + assert case.invalid_exception is not None + with pytest.raises(case.invalid_exception): + case.invalid_update() + + case.assert_current(case.original) + graph = case.graph_def.instantiate() + case.assert_exec_uses(graph, case.original) + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_definition_node_update_rejects_wrong_type( + definition_update_case, +): + if definition_update_case.invalid_argument_update is None: + pytest.skip("update method has no typed positional argument") + with pytest.raises(TypeError): + definition_update_case.invalid_argument_update() + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_executable_node_update_changes_existing_exec( + definition_update_case, +): + case = definition_update_case + graph = case.graph_def.instantiate() + + _update_executable_case(graph, case) + + case.assert_current(case.original) + case.assert_exec_uses(graph, case.replacement) + + +@pytest.mark.parametrize("node_kind", ["kernel", "memcpy", "memset"]) +@pytest.mark.agent_authored(model="gpt-5.6") +def test_executable_node_enable_state(init_cuda, node_kind): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + graph_def = GraphDefinition() + if node_kind == "kernel": + kernel = compile_common_kernels().get_kernel("empty_kernel") + node = graph_def.launch(LaunchConfig(grid=1, block=1), kernel) + else: + memory_resource = LegacyPinnedMemoryResource() + src = memory_resource.allocate(4) + dst = memory_resource.allocate(4) + if node_kind == "memcpy": + node = graph_def.memcpy(dst, src, 4) + else: + node = graph_def.memset(dst, 0, 4) + + view = graph_def.instantiate()[node] + assert view.is_enabled + view.disable() + assert not view.is_enabled + view.disable() + assert not view.is_enabled + view.enable() + assert view.is_enabled + view.enable() + assert view.is_enabled + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_executable_node_view_rejects_unsupported_and_destroyed_nodes( + init_cuda, +): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + kernel = compile_common_kernels().get_kernel("empty_kernel") + graph_def = GraphDefinition() + empty = graph_def.empty() + kernel_node = graph_def.launch(LaunchConfig(grid=1, block=1), kernel) + graph = graph_def.instantiate() + + with pytest.raises(TypeError, match="does not support executable updates"): + graph[empty] + with pytest.raises(TypeError): + graph[object()] + + kernel_node.destroy() + with pytest.raises(ValueError, match="no longer valid"): + graph[kernel_node] + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_executable_node_view_retains_source_only_while_live(init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + called = [] + + def original(): + called.append("original") + + def replacement(): + called.append("replacement") + + source = GraphDefinition() + node = source.callback(original) + source_weak = weak_handle(source) + graph = source.instantiate() + view = graph[node] + + del source, node + gc.collect() + assert source_weak + + view.update(replacement) + del view + _wait_until(lambda: not source_weak) + + stream = init_cuda.create_stream() + graph.launch(stream) + stream.sync() + assert called == ["replacement"] + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_executable_attachment_accumulators_are_independent(init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + called = [] + + def original(): + called.append("original") + + def first_replacement(): + called.append("first") + + def second_replacement(): + called.append("second") + + first_weak = weakref.ref(first_replacement) + second_weak = weakref.ref(second_replacement) + source = GraphDefinition() + node = source.callback(original) + first = source.instantiate() + second = source.instantiate() + + first[node].update(first_replacement) + second[node].update(second_replacement) + del first_replacement, second_replacement, original, node, source + gc.collect() + assert first_weak() is not None + assert second_weak() is not None + + stream = init_cuda.create_stream() + first.launch(stream) + second.launch(stream) + stream.sync() + assert called == ["first", "second"] + + del first + _wait_until(lambda: first_weak() is None) + assert second_weak() is not None + + del second + _wait_until(lambda: second_weak() is None) + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_rejected_executable_update_rolls_back_owners(init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + kernel = compile_common_kernels().get_kernel("add_one") + config = LaunchConfig(grid=1, block=1) + memory_resource = LegacyPinnedMemoryResource() + active = memory_resource.allocate(ctypes.sizeof(ctypes.c_int)) + rejected = memory_resource.allocate(ctypes.sizeof(ctypes.c_int)) + ctypes.c_int.from_address(int(active.handle)).value = 0 + rejected_weak = weak_handle(rejected) + + source = GraphDefinition() + source.launch(config, kernel, active) + graph = source.instantiate() + unrelated = GraphDefinition() + unrelated_node = unrelated.launch(config, kernel, active) + + with pytest.raises(CUDAError): + graph[unrelated_node].update(config=config, kernel=kernel, args=(rejected,)) + + del rejected + _wait_until(lambda: not rejected_weak) + + stream = init_cuda.create_stream() + graph.launch(stream) + stream.sync() + assert ctypes.c_int.from_address(int(active.handle)).value == 1 + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_whole_update_replaces_executable_attachment_accumulator(init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + called = [] + + def original(): + called.append("original") + + def individual(): + called.append("individual") + + def whole(): + called.append("whole") + + individual_weak = weakref.ref(individual) + source = GraphDefinition() + node = source.callback(original) + graph = source.instantiate() + graph[node].update(individual) + + replacement = GraphDefinition() + replacement.callback(whole) + del individual + graph.update(replacement) + _wait_until(lambda: individual_weak() is None) + + stream = init_cuda.create_stream() + graph.launch(stream) + stream.sync() + assert called == ["whole"] + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_failed_whole_update_preserves_executable_accumulator(init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + called = [] + + def original(): + called.append("original") + + def active(): + called.append("active") + + active_weak = weakref.ref(active) + source = GraphDefinition() + node = source.callback(original) + graph = source.instantiate() + graph[node].update(active) + + rejected = GraphDefinition() + rejected.callback(lambda: called.append("rejected")) + rejected.empty() + with pytest.raises(CUDAError): + graph.update(rejected) + + del active, original, node, source, rejected + gc.collect() + assert active_weak() is not None + + stream = init_cuda.create_stream() + graph.launch(stream) + stream.sync() + assert called == ["active"] + + del graph + _wait_until(lambda: active_weak() is None) + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_inflight_launch_defers_replaced_executable_owners(init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + callback_started = threading.Event() + callback_release = threading.Event() + + def blocking_callback(): + callback_started.set() + assert callback_release.wait(timeout=30) + + kernel = compile_common_kernels().get_kernel("add_one") + config = LaunchConfig(grid=1, block=1) + memory_resource = LegacyPinnedMemoryResource() + original = memory_resource.allocate(ctypes.sizeof(ctypes.c_int)) + inflight = memory_resource.allocate(ctypes.sizeof(ctypes.c_int)) + future = memory_resource.allocate(ctypes.sizeof(ctypes.c_int)) + inflight_weak = weak_handle(inflight) + + source = GraphDefinition() + kernel_node = source.callback(blocking_callback).launch(config, kernel, original) + graph = source.instantiate() + graph[kernel_node].update(config=config, kernel=kernel, args=(inflight,)) + del inflight + gc.collect() + assert inflight_weak + + replacement = GraphDefinition() + replacement.callback(lambda: None).launch(config, kernel, future) + stream = init_cuda.create_stream() + graph.launch(stream) + assert callback_started.wait(timeout=5) + + try: + graph.update(replacement) + gc.collect() + assert inflight_weak + finally: + callback_release.set() + stream.sync() + + _wait_until(lambda: not inflight_weak) + + +@pytest.mark.agent_authored(model="claude-opus-5") +def test_sequential_executable_updates_accumulate_owners(init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + called = [] + + def original(): + called.append("original") + + def first(): + called.append("first") + + def second(): + called.append("second") + + first_weak = weakref.ref(first) + second_weak = weakref.ref(second) + source = GraphDefinition() + node = source.callback(original) + graph = source.instantiate() + + graph[node].update(first) + graph[node].update(second) + + # CUDA cannot detach user objects from an executable graph, so the + # superseded owner stays reachable for as long as the executable lives. + del first, second, original + gc.collect() + assert first_weak() is not None + assert second_weak() is not None + + stream = init_cuda.create_stream() + graph.launch(stream) + stream.sync() + assert called == ["second"] + + del node, source, graph + _wait_until(lambda: first_weak() is None and second_weak() is None) + + +@pytest.mark.agent_authored(model="claude-opus-5") +def test_child_graph_update_transfers_source_owners_to_executable(init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + called = [] + + def original(): + called.append("original") + + def replacement(): + called.append("replacement") + + original_child = GraphDefinition() + original_child.callback(original) + source = GraphDefinition() + node = source.embed(original_child) + graph = source.instantiate() + + replacement_child = GraphDefinition() + replacement_child.callback(replacement) + graph[node].update(replacement_child) + + replacement_weak = weakref.ref(replacement) + child_weak = weak_handle(replacement_child) + + # A child-graph update is the one executable update that attaches no owner + # of its own. It is safe because CUDA clones the replacement graph's user + # object references into the executable, so the callback must outlive the + # definition that supplied it. + del replacement_child, replacement + _wait_until(lambda: not child_weak) + assert replacement_weak() is not None + + stream = init_cuda.create_stream() + graph.launch(stream) + stream.sync() + assert called == ["replacement"] + + del graph + _wait_until(lambda: replacement_weak() is None) + + +@pytest.mark.agent_authored(model="claude-opus-5") +def test_closing_executable_during_launch_defers_owner_release(init_cuda): + if driver_version() < (12, 2, 0): + pytest.skip("individual graph node updates require CUDA 12.2+") + + callback_started = threading.Event() + callback_release = threading.Event() + + def blocking_callback(): + callback_started.set() + assert callback_release.wait(timeout=30) + + kernel = compile_common_kernels().get_kernel("add_one") + config = LaunchConfig(grid=1, block=1) + memory_resource = LegacyPinnedMemoryResource() + original = memory_resource.allocate(ctypes.sizeof(ctypes.c_int)) + inflight = memory_resource.allocate(ctypes.sizeof(ctypes.c_int)) + inflight_weak = weak_handle(inflight) + + source = GraphDefinition() + kernel_node = source.callback(blocking_callback).launch(config, kernel, original) + graph = source.instantiate() + graph[kernel_node].update(config=config, kernel=kernel, args=(inflight,)) + del inflight + gc.collect() + assert inflight_weak + + stream = init_cuda.create_stream() + graph.launch(stream) + assert callback_started.wait(timeout=5) + + try: + # The launch still writes through the buffer the update attached, so + # closing the executable must not retire the accumulator yet. + graph.close() + gc.collect() + assert inflight_weak + finally: + callback_release.set() + stream.sync() + + _wait_until(lambda: not inflight_weak) diff --git a/cuda_core/tests/graph/test_graph_update.py b/cuda_core/tests/graph/test_graph_update.py index 13513830944..54a04863cf4 100644 --- a/cuda_core/tests/graph/test_graph_update.py +++ b/cuda_core/tests/graph/test_graph_update.py @@ -9,8 +9,8 @@ import numpy as np import pytest +from cuda_python_test_helpers.marks import requires_module from helpers.graph_kernels import compile_common_kernels, compile_conditional_kernels -from helpers.marks import requires_module from cuda.core import Device, LaunchConfig, LegacyPinnedMemoryResource, launch from cuda.core._utils.cuda_utils import CUDAError diff --git a/cuda_core/tests/helpers/__init__.py b/cuda_core/tests/helpers/__init__.py index 5ce5ab7f05b..2305cfaa1e5 100644 --- a/cuda_core/tests/helpers/__init__.py +++ b/cuda_core/tests/helpers/__init__.py @@ -3,7 +3,6 @@ import functools import os -from typing import Union from cuda.core._utils.cuda_utils import handle_return from cuda.pathfinder import get_cuda_path_or_home @@ -23,7 +22,7 @@ @functools.cache -def supports_ipc_mempool(device_id: Union[int, object]) -> bool: +def supports_ipc_mempool(device_id: int | object) -> bool: """Return True if mempool IPC via POSIX file descriptor is supported. Uses cuDeviceGetAttribute(CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPES) diff --git a/cuda_core/tests/helpers/constants.py b/cuda_core/tests/helpers/constants.py new file mode 100644 index 00000000000..f4ea61b1938 --- /dev/null +++ b/cuda_core/tests/helpers/constants.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Constants shared across the cuda_core test suite.""" + +# Cap for memory pools created by tests. A pool created without an explicit +# max_size instead reserves a system-dependent window that scales with +# installed device memory -- hundreds of GiB on large-memory GPUs. The +# per-process virtual address budget is bounded (~1 TB on Windows MCDM), and a +# reservation is not returned until the pool is torn down and its +# stream-ordered frees retire, so oversized windows accumulate across a session +# and eventually starve later pool creations with CUDA_ERROR_OUT_OF_MEMORY +# (issue #2381). See AGENTS.md in the tests directory. +POOL_SIZE = 2097152 # 2 MiB diff --git a/cuda_core/tests/helpers/graph_kernels.py b/cuda_core/tests/helpers/graph_kernels.py index 54caedd165c..d08837585fe 100644 --- a/cuda_core/tests/helpers/graph_kernels.py +++ b/cuda_core/tests/helpers/graph_kernels.py @@ -19,15 +19,24 @@ def compile_common_kernels(): Returns a module with: - empty_kernel: does nothing - add_one: increments an int pointer by 1 + - write_launch_dims: encodes the launch dimensions in an int """ code = """ __global__ void empty_kernel() {} __global__ void add_one(int *a) { *a += 1; } + __global__ void write_launch_dims(int *a) { + if (blockIdx.x == 0 && threadIdx.x == 0) { + *a = gridDim.x * 1000 + blockDim.x; + } + } """ arch = "".join(f"{i}" for i in Device().compute_capability) program_options = ProgramOptions(std="c++17", arch=f"sm_{arch}") prog = Program(code, code_type="c++", options=program_options) - mod = prog.compile("cubin", name_expressions=("empty_kernel", "add_one")) + mod = prog.compile( + "cubin", + name_expressions=("empty_kernel", "add_one", "write_launch_dims"), + ) return mod diff --git a/cuda_core/tests/memory/test_managed_ops.py b/cuda_core/tests/memory/test_managed_ops.py index 33def77935f..ed7f44a97f4 100644 --- a/cuda_core/tests/memory/test_managed_ops.py +++ b/cuda_core/tests/memory/test_managed_ops.py @@ -4,9 +4,9 @@ import mmap import pytest +from conftest import create_managed_memory_resource_or_skip from helpers.buffers import DummyDeviceMemoryResource, DummyUnifiedMemoryResource -from conftest import create_managed_memory_resource_or_skip from cuda.bindings import driver from cuda.core import Device, Host, ManagedBuffer from cuda.core._memory._managed_buffer import _get_int_attr diff --git a/cuda_core/tests/memory_ipc/test_errors.py b/cuda_core/tests/memory_ipc/test_errors.py index 40cbcc2826b..0aac9f9a297 100644 --- a/cuda_core/tests/memory_ipc/test_errors.py +++ b/cuda_core/tests/memory_ipc/test_errors.py @@ -7,14 +7,14 @@ import pytest from helpers.child_processes import child_timeout_sec, kill_subprocesses +from helpers.constants import POOL_SIZE from cuda.core import Buffer, Device, DeviceMemoryResource, DeviceMemoryResourceOptions -from cuda.core._memory import IPCBufferDescriptor +from cuda.core._memory._ipc import IPCBufferDescriptor from cuda.core._utils.cuda_utils import CUDAError CHILD_TIMEOUT_SEC = child_timeout_sec() NBYTES = 64 -POOL_SIZE = 2097152 # these tests spawn new processes and files which fails for very many threads diff --git a/cuda_core/tests/memory_ipc/test_ipc_duplicate_import.py b/cuda_core/tests/memory_ipc/test_ipc_duplicate_import.py index eaa6ddec92f..dc3f5e57c33 100644 --- a/cuda_core/tests/memory_ipc/test_ipc_duplicate_import.py +++ b/cuda_core/tests/memory_ipc/test_ipc_duplicate_import.py @@ -20,7 +20,6 @@ CHILD_TIMEOUT_SEC = child_timeout_sec() NBYTES = 64 -POOL_SIZE = 2097152 ENABLE_LOGGING = False # Set True for test debugging and development diff --git a/cuda_core/tests/memory_ipc/test_peer_access.py b/cuda_core/tests/memory_ipc/test_peer_access.py index ac7f71a88e9..4dc04a8bd0b 100644 --- a/cuda_core/tests/memory_ipc/test_peer_access.py +++ b/cuda_core/tests/memory_ipc/test_peer_access.py @@ -6,13 +6,13 @@ import pytest from helpers.buffers import PatternGen from helpers.child_processes import child_timeout_sec, kill_subprocesses +from helpers.constants import POOL_SIZE from cuda.core import Device, DeviceMemoryResource, DeviceMemoryResourceOptions from cuda.core._utils.cuda_utils import CUDAError CHILD_TIMEOUT_SEC = child_timeout_sec() NBYTES = 64 -POOL_SIZE = 2097152 # these tests spawn new processes and files which fails for very many threads pytestmark = pytest.mark.parallel_threads_limit(4) diff --git a/cuda_core/tests/memory_ipc/test_send_buffers.py b/cuda_core/tests/memory_ipc/test_send_buffers.py index 59216cd9cce..efa4d8b2abc 100644 --- a/cuda_core/tests/memory_ipc/test_send_buffers.py +++ b/cuda_core/tests/memory_ipc/test_send_buffers.py @@ -7,6 +7,7 @@ import pytest from helpers.buffers import PatternGen from helpers.child_processes import child_timeout_sec, kill_subprocesses +from helpers.constants import POOL_SIZE from cuda.core import Device, DeviceMemoryResource, DeviceMemoryResourceOptions @@ -14,7 +15,6 @@ NBYTES = 64 NMRS = 3 NTASKS = 7 -POOL_SIZE = 2097152 # these tests spawn new processes and files which fails for very many threads pytestmark = pytest.mark.parallel_threads_limit(4) diff --git a/cuda_core/tests/memory_ipc/test_serialize.py b/cuda_core/tests/memory_ipc/test_serialize.py index 4289de4b5a9..22596582c49 100644 --- a/cuda_core/tests/memory_ipc/test_serialize.py +++ b/cuda_core/tests/memory_ipc/test_serialize.py @@ -13,7 +13,6 @@ CHILD_TIMEOUT_SEC = child_timeout_sec() NBYTES = 64 -POOL_SIZE = 2097152 # these tests spawn new processes and files which fails for very many threads pytestmark = pytest.mark.parallel_threads_limit(4) diff --git a/cuda_core/tests/memory_ipc/test_workerpool.py b/cuda_core/tests/memory_ipc/test_workerpool.py index 358c16fd7bf..e358c043b00 100644 --- a/cuda_core/tests/memory_ipc/test_workerpool.py +++ b/cuda_core/tests/memory_ipc/test_workerpool.py @@ -7,6 +7,7 @@ import pytest from helpers.buffers import PatternGen +from helpers.constants import POOL_SIZE from cuda.core import Buffer, Device, DeviceMemoryResource, DeviceMemoryResourceOptions @@ -14,7 +15,6 @@ NWORKERS = 2 NMRS = 3 NTASKS = 20 -POOL_SIZE = 2097152 # these tests spawn new processes and files which fails for very many threads pytestmark = pytest.mark.parallel_threads_limit(4) diff --git a/cuda_core/tests/system/conftest.py b/cuda_core/tests/system/conftest.py deleted file mode 100644 index 8708b3f06fc..00000000000 --- a/cuda_core/tests/system/conftest.py +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# -# SPDX-License-Identifier: Apache-2.0 - - -import pytest - -from cuda.core import system - -SHOULD_SKIP_NVML_TESTS = not system.CUDA_BINDINGS_NVML_IS_COMPATIBLE - - -if system.CUDA_BINDINGS_NVML_IS_COMPATIBLE: - from cuda.bindings._test_helpers.arch_check import hardware_supports_nvml - - SHOULD_SKIP_NVML_TESTS |= not hardware_supports_nvml() - - -skip_if_nvml_unsupported = pytest.mark.skipif( - SHOULD_SKIP_NVML_TESTS, - reason="NVML support requires cuda.bindings version 12.9.6+ for CUDA 12.x or 13.2.0+ for CUDA 13.x, and hardware that supports NVML", -) - - -def unsupported_before(device, expected_device_arch): - from cuda.bindings._test_helpers.arch_check import unsupported_before as nvml_unsupported_before - - return nvml_unsupported_before(device._handle, expected_device_arch) diff --git a/cuda_core/tests/system/test_nvml_context.py b/cuda_core/tests/system/test_nvml_context.py index 16bc97f385c..03c3fbefe8b 100644 --- a/cuda_core/tests/system/test_nvml_context.py +++ b/cuda_core/tests/system/test_nvml_context.py @@ -1,9 +1,9 @@ -# 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 -from .conftest import skip_if_nvml_unsupported +from cuda_python_test_helpers.arch_check import skip_if_nvml_unsupported pytestmark = skip_if_nvml_unsupported diff --git a/cuda_core/tests/system/test_system_device.py b/cuda_core/tests/system/test_system_device.py index b5fe8cccbfa..8fa41da0488 100644 --- a/cuda_core/tests/system/test_system_device.py +++ b/cuda_core/tests/system/test_system_device.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 -from .conftest import skip_if_nvml_unsupported, unsupported_before +from cuda_python_test_helpers.arch_check import skip_if_nvml_unsupported, unsupported_before pytestmark = skip_if_nvml_unsupported @@ -684,6 +684,7 @@ def test_cooler(): assert all(isinstance(t, typing.CoolerTarget) for t in target) +@pytest.mark.filterwarnings("ignore::DeprecationWarning") def test_temperature(): for device in system.Device.get_all_devices(): temperature = device.temperature @@ -695,6 +696,9 @@ def test_temperature(): # By docs, should be supported on KEPLER or newer, but experimentally, # is also unsupported on other hardware. + # get_threshold emits DeprecationWarning for some thresholds on Ada+; + # that behaviour is tested separately in + # test_temperature_threshold_unrecognized_device_arch. with unsupported_before(device, None): for threshold in list(typing.TemperatureThresholds): t = temperature.get_threshold(threshold) @@ -722,6 +726,58 @@ def test_temperature(): assert sensor.default_min_temp <= sensor.current_temp <= sensor.default_max_temp +@pytest.mark.thread_unsafe(reason="Temporarily replaces process-global NVML functions") +@pytest.mark.agent_authored(model="gpt-5.6-sol") +def test_temperature_threshold_unrecognized_device_arch(monkeypatch): + temperature = system.Device(index=0).temperature + unrecognized_arch = int(nvml.DeviceArch.UNKNOWN) - 1 + with pytest.raises(ValueError): + nvml.DeviceArch(unrecognized_arch) + + monkeypatch.setattr(nvml, "device_get_architecture", lambda _handle: unrecognized_arch) + monkeypatch.setattr( + nvml, + "device_get_temperature_threshold", + lambda _handle, _threshold: 42, + ) + + with pytest.warns(DeprecationWarning, match="no longer recommended"): + assert temperature.get_threshold(typing.TemperatureThresholds.SHUTDOWN) == 42 + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_temperature_arg_validation(): + # Both getters reject an unknown key before issuing any NVML call. + temperature = system.Device(index=0).temperature + with pytest.raises(ValueError, match="Invalid temperature threshold type"): + temperature.get_threshold("not-a-threshold") + with pytest.raises(ValueError, match="Invalid thermal sensor index"): + temperature.get_thermal_settings("not-a-sensor") + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_device_constructor_selector_validation(): + # The constructor requires exactly one selector, rejected before NVML is touched. + with pytest.raises(ValueError, match="only one of"): + system.Device(index=0, uuid="ignored") + with pytest.raises(ValueError, match="either a device"): + system.Device() + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_device_arg_validation(): + device = system.Device(index=0) + # Each argument validator raises before reaching the driver/NVML call. + with pytest.raises(ValueError, match="Invalid affinity scope"): + device.get_memory_affinity("not-a-scope") + with pytest.raises(ValueError, match="Invalid affinity scope"): + device.get_cpu_affinity("not-a-scope") + with pytest.raises(ValueError, match="Invalid topology level"): + list(device.get_topology_nearest_gpus("not-a-level")) + with pytest.raises(ValueError, match="Invalid P2P caps index"): + system.get_p2p_status(device, device, "not-an-index") + + def test_pstates(): for device in system.Device.get_all_devices(): with unsupported_before(device, None): diff --git a/cuda_core/tests/system/test_system_events.py b/cuda_core/tests/system/test_system_events.py index ce204001a4e..d2684bebd0b 100644 --- a/cuda_core/tests/system/test_system_events.py +++ b/cuda_core/tests/system/test_system_events.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 -from .conftest import skip_if_nvml_unsupported +from cuda_python_test_helpers.arch_check import skip_if_nvml_unsupported pytestmark = skip_if_nvml_unsupported diff --git a/cuda_core/tests/system/test_system_system.py b/cuda_core/tests/system/test_system_system.py index 460078918f5..28173836ff4 100644 --- a/cuda_core/tests/system/test_system_system.py +++ b/cuda_core/tests/system/test_system_system.py @@ -6,13 +6,12 @@ import os import pytest +from cuda_python_test_helpers.arch_check import skip_if_nvml_unsupported from cuda.bindings import driver from cuda.core import system from cuda.core._utils.cuda_utils import handle_return -from .conftest import skip_if_nvml_unsupported - def test_user_mode_driver_version(): umd = system.get_user_mode_driver_version() diff --git a/cuda_core/tests/test_api_docs_consistency.py b/cuda_core/tests/test_api_docs_consistency.py new file mode 100644 index 00000000000..053fc93d6cd --- /dev/null +++ b/cuda_core/tests/test_api_docs_consistency.py @@ -0,0 +1,240 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +"""Consistency checks between the public ``__all__`` surface and the API docs. + +Covers the flat ``cuda.core`` namespace and every public submodule +(``checkpoint``, ``graph``, ``system``, ``texture``, ``typing``, ``utils``, +and any added later) discovered automatically from ``cuda.core.__path__``. +For each public namespace, exported ``__all__`` names must appear somewhere +in ``cuda_core/docs/source``. + +The enforced direction is deliberately one-way (public export -> documented). +This is intentionally a *name-presence* check, and it does not verify: + +- the reverse direction (documented -> exported): documenting a private or + internal symbol on any page is allowed, so a documented name is never + required to be public; +- signatures, docstrings, parameter lists, or rendered output: only that each + exported name appears as a documented entry; +- whether an entry is marked ``:no-index:`` or deprecated: such entries still + count as documented; +- class members or attributes nested below the namespace level: only top-level + names of each namespace are matched (entries deeper than + ``.`` are ignored); +- docs outside the top-level ``docs/source/*.rst`` files: nested pages are not + scanned. +""" + +import collections +import importlib +import io +import pathlib +import pkgutil +import re + +import pytest +from docutils import nodes +from docutils.core import publish_doctree +from docutils.parsers.rst import Directive, directives + +import cuda.core + +DOCS_SOURCE_DIR = pathlib.Path(__file__).resolve().parent.parent / "docs" / "source" + +# ``cuda.core`` ships a versioned wheel shim as ``cu12`` / ``cu13`` subpackages; +# those are an internal packaging mechanism, not public API. +_VERSIONED_SUBPACKAGE = re.compile(r"^cu\d+$") + +PUBLIC_SUBMODULES = sorted( + name + for _, name, ispkg in pkgutil.iter_modules(cuda.core.__path__) + if not name.startswith("_") and not _VERSIONED_SUBPACKAGE.match(name) +) + + +class _ModuleNode(nodes.Element): + pass + + +class _AutosummaryNode(nodes.Element): + pass + + +class _DataNode(nodes.Element): + pass + + +class _ModuleDirective(Directive): + required_arguments = 1 + final_argument_whitespace = False + has_content = True + option_spec = { + "deprecated": directives.unchanged, + "no-index": directives.flag, + "platform": directives.unchanged, + "synopsis": directives.unchanged, + } + + def run(self): + node = _ModuleNode() + node["module"] = self.arguments[0].strip() + self.state.nested_parse(self.content, self.content_offset, node) + return [node] + + +class _AutosummaryDirective(Directive): + has_content = True + option_spec = { + "caption": directives.unchanged, + "nosignatures": directives.flag, + "recursive": directives.flag, + "template": directives.unchanged, + "toctree": directives.unchanged, + } + + def run(self): + node = _AutosummaryNode() + node["entries"] = [entry for line in self.content if (entry := line.strip()) and not entry.startswith(":")] + return [node] + + +class _DataDirective(Directive): + required_arguments = 1 + final_argument_whitespace = True + has_content = True + option_spec = { + "annotation": directives.unchanged, + "no-index": directives.flag, + "type": directives.unchanged, + "value": directives.unchanged, + } + + def run(self): + node = _DataNode() + node["name"] = self.arguments[0].strip() + return [node] + + +# These patch the global docutils directive registry for the process lifetime. +# Safe as long as no other test module in the same session uses docutils or +# Sphinx with the real autosummary/module/data directives. If that ever changes, +# move these calls into a session-scoped autouse fixture that saves and restores +# the previous mapping. +directives.register_directive("autosummary", _AutosummaryDirective) +directives.register_directive("currentmodule", _ModuleDirective) +directives.register_directive("data", _DataDirective) +directives.register_directive("module", _ModuleDirective) + + +def _iter_documented_entries(rst_path): + """Yield (module, entry) pairs from Sphinx directives in an RST file.""" + doctree = publish_doctree( + rst_path.read_text(), + source_path=str(rst_path), + settings_overrides={ + "halt_level": 6, + "report_level": 5, + "warning_stream": io.StringIO(), + }, + ) + module = None + for node in doctree.findall(): + if isinstance(node, _ModuleNode): + module = node["module"] + elif isinstance(node, _AutosummaryNode): + for entry in node["entries"]: + yield module, entry + elif isinstance(node, _DataNode): + yield module, node["name"] + + +def _add_documented_name(documented, module, entry): + if not module or not module.startswith("cuda.core"): + return + if module == "cuda.core": + if "." not in entry: + documented[module].add(entry) + return + sub, name = entry.split(".", 1) + if sub in PUBLIC_SUBMODULES and "." not in name: + documented[f"cuda.core.{sub}"].add(name) + return + if module.startswith("cuda.core."): + namespace = module + if namespace in PUBLIC_NAMESPACES and "." not in entry: + documented[namespace].add(entry) + + +def _documented_names(docs_dir, *, exclude=frozenset()): + documented = collections.defaultdict(set) + for rst_path in docs_dir.glob("*.rst"): + if rst_path.name in exclude: + continue + for module, entry in _iter_documented_entries(rst_path): + _add_documented_name(documented, module, entry) + return documented + + +PUBLIC_NAMESPACES = ("cuda.core", *(f"cuda.core.{sub}" for sub in PUBLIC_SUBMODULES)) + + +@pytest.fixture(scope="module") +def exported(): + if not hasattr(cuda.core, "__all__"): + pytest.skip("cuda.core does not define __all__") + return set(cuda.core.__all__) + + +@pytest.fixture(scope="module") +def docs_dir(): + if not DOCS_SOURCE_DIR.is_dir(): + pytest.skip("docs sources not available (not running from a source checkout)") + return DOCS_SOURCE_DIR + + +@pytest.fixture(scope="module") +def documented(docs_dir): + return _documented_names(docs_dir) + + +@pytest.mark.human_authored +def test_public_submodules_discovered(): + # Guards against a broken __path__ walk silently turning every + # parametrized submodule check into a no-op. + assert PUBLIC_SUBMODULES, "no public cuda.core submodules were discovered" + + +@pytest.mark.human_authored +def test_main_package_all_exports_resolve(): + assert hasattr(cuda.core, "__all__"), "cuda.core does not define __all__" + missing = [name for name in cuda.core.__all__ if not hasattr(cuda.core, name)] + assert missing == [], f"cuda.core.__all__ lists names that do not resolve: {missing}" + + +@pytest.mark.human_authored +def test_main_package_symbols_are_documented(exported, documented): + documented = documented["cuda.core"] + undocumented = exported - documented + assert not undocumented, f"public by cuda.core.__all__ but missing from docs/source/*.rst: {sorted(undocumented)}" + + +@pytest.mark.parametrize("sub", PUBLIC_SUBMODULES) +def test_subpackage_symbols_define_all(sub): + module = importlib.import_module(f"cuda.core.{sub}") + assert hasattr(module, "__all__"), f"cuda.core.{sub} does not define __all__" + missing = [name for name in module.__all__ if not hasattr(module, name)] + assert missing == [], f"cuda.core.{sub}.__all__ lists names that do not resolve: {missing}" + + +@pytest.mark.human_authored +@pytest.mark.parametrize("sub", PUBLIC_SUBMODULES) +def test_subpackage_exports_are_documented(sub, documented): + documented = documented[f"cuda.core.{sub}"] + module = importlib.import_module(f"cuda.core.{sub}") + exported = set(module.__all__) + undocumented = exported - documented + assert not undocumented, ( + f"public by cuda.core.{sub}.__all__ but missing from docs/source/*.rst: {sorted(undocumented)}" + ) diff --git a/cuda_core/tests/test_build_hooks.py b/cuda_core/tests/test_build_hooks.py index 121ed1be053..c08ad4cd3c5 100644 --- a/cuda_core/tests/test_build_hooks.py +++ b/cuda_core/tests/test_build_hooks.py @@ -16,6 +16,7 @@ These tests require Cython to be installed (build_hooks.py imports it). """ +import builtins import importlib.util import os import tempfile @@ -50,6 +51,35 @@ def _load_build_hooks(): build_hooks = _load_build_hooks() +@pytest.mark.agent_authored(model="gpt-5.6") +def test_cuda_path_is_resolved_before_importing_bindings(monkeypatch): + """PEP 517 namespace repair runs before cuda.bindings is imported.""" + events = [] + + class StopBuildError(Exception): + pass + + def get_cuda_path(): + events.append("cuda-path") + return "/cuda" + + original_import = builtins.__import__ + + def stop_at_bindings_import(name, *args, **kwargs): + if name == "cuda.bindings": + events.append("cuda-bindings") + raise StopBuildError + return original_import(name, *args, **kwargs) + + monkeypatch.setattr(build_hooks, "_get_cuda_path", get_cuda_path) + monkeypatch.setattr(builtins, "__import__", stop_at_bindings_import) + + with pytest.raises(StopBuildError): + build_hooks._build_cuda_core() + + assert events == ["cuda-path", "cuda-bindings"] + + def _check_version_detection( cuda_version, expected_major, *, use_cuda_path=True, use_cuda_home=False, cuda_core_build_major=None ): diff --git a/cuda_core/tests/test_checkpoint.py b/cuda_core/tests/test_checkpoint.py index 5e70a162320..ff727eb9fff 100644 --- a/cuda_core/tests/test_checkpoint.py +++ b/cuda_core/tests/test_checkpoint.py @@ -409,6 +409,145 @@ def test_pid_is_read_only(self): proc.pid = 2 +# -- Pure helpers (no GPU / driver needed) --------------------------------- + +import ctypes + +from cuda.bindings import driver as _bindings_driver + +# The checkpoint functions, structs, and enums are generated and shipped +# together from the same CUDA headers, so probe them as one atomic API surface. +_HAS_CHECKPOINT_BINDINGS = all(hasattr(_bindings_driver, name) for name in checkpoint._REQUIRED_BINDING_ATTRS) + +needs_checkpoint_bindings = pytest.mark.skipif( + not _HAS_CHECKPOINT_BINDINGS, + reason="cuda.bindings does not expose the CUDA checkpoint API", +) + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +class TestCheckpointHelpers: + """Host-only tests for the arg-validation and struct-marshalling helpers. + + The driver-backed lifecycle/migration scenarios skip without a checkpoint-capable + Linux driver, so these are the only coverage of these helpers on most CI. + """ + + @pytest.mark.parametrize( + ("value", "error_type", "match"), + [ + (True, TypeError, "timeout_ms must be an int"), + (1.5, TypeError, "timeout_ms must be an int"), + ("0", TypeError, "timeout_ms must be an int"), + (-1, ValueError, "timeout_ms must be >= 0"), + ], + ) + def test_check_timeout_ms_rejects_invalid(self, value, error_type, match): + with pytest.raises(error_type, match=match): + checkpoint._check_timeout_ms(value) + + def test_make_restore_args_rejects_non_mapping(self): + with pytest.raises(TypeError, match="gpu_mapping must be a mapping"): + checkpoint._make_restore_args(_bindings_driver, [("a", "b")]) + + def test_make_restore_args_empty_mapping_returns_none(self): + # An empty mapping produces no GPU pairs, so there is nothing to restore. + assert checkpoint._make_restore_args(_bindings_driver, {}) is None + + @needs_checkpoint_bindings + def test_make_restore_args_builds_pairs(self): + old = "00000000-0000-0000-0000-000000000001" + new = "00000000-0000-0000-0000-000000000002" + args = checkpoint._make_restore_args(_bindings_driver, {old: new}) + assert isinstance(args, _bindings_driver.CUcheckpointRestoreArgs) + assert args.gpuPairsCount == 1 + # The pair must map old->new in that order (not swapped or duplicated). + pair = args.gpuPairs[0] + assert bytes(pair.oldUuid.bytes) == bytes.fromhex(old.replace("-", "")) + assert bytes(pair.newUuid.bytes) == bytes.fromhex(new.replace("-", "")) + + @pytest.mark.parametrize( + ("value", "match"), + [ + ("not-hex-zz", "32 hex characters"), + ("00", "32 hex characters"), # valid hex but wrong length (1 byte) + ], + ) + def test_as_cuuuid_rejects_bad_strings(self, value, match): + with pytest.raises(ValueError, match=match): + checkpoint._as_cuuuid(_bindings_driver, value, []) + + def test_as_cuuuid_rejects_wrong_type(self): + with pytest.raises(TypeError, match="must be CUDA UUID objects or UUID strings"): + checkpoint._as_cuuuid(_bindings_driver, 12345, []) + + @pytest.mark.parametrize( + "value", + [ + "0123456789abcdef0123456789abcdef", # bare 32 hex chars + "01234567-89ab-cdef-0123-456789abcdef", # hyphenated form (Device.uuid style) + ], + ) + def test_as_cuuuid_from_string_decodes_bytes_and_appends_backing_buffer(self, value): + buffers = [] + result = checkpoint._as_cuuuid(_bindings_driver, value, buffers) + assert isinstance(result, _bindings_driver.CUuuid) + # Stripped hex must decode to the exact 16 CUuuid bytes (guards fromhex/replace). + assert bytes(result.bytes) == bytes.fromhex(value.replace("-", "")) + # _as_cuuuid appends the backing ctypes buffer to the caller's list so it survives + # until the caller copies the bytes into the pair struct. + assert len(buffers) == 1 + assert isinstance(buffers[0], ctypes.Array) + + def test_as_cuuuid_passes_through_cuuuid_instance(self): + existing = _bindings_driver.CUuuid() + # An already-constructed CUuuid is returned unchanged and adds no buffer. + buffers = [] + assert checkpoint._as_cuuuid(_bindings_driver, existing, buffers) is existing + assert buffers == [] + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +class TestCheckpointDriverDispatch: + """Driver-dispatch (_call_driver) result-code / exception translation. + + _call_driver runs against a boundary-mock ``func`` (dependency-injected as its + argument) so the translation branches exercise without a live driver — the real + ``checkpoint._driver`` still supplies the CUresult enum. + """ + + @pytest.mark.parametrize("err_name", ["CUDA_ERROR_NOT_FOUND", "CUDA_ERROR_NOT_SUPPORTED"]) + def test_call_driver_translates_unsupported_result_codes(self, err_name): + """NOT_FOUND / NOT_SUPPORTED become the 'not supported by the installed NVIDIA driver' RuntimeError.""" + driver = checkpoint._driver + + def fake(*args): + return (getattr(driver.CUresult, err_name),) + + with pytest.raises(RuntimeError, match="not supported by the installed NVIDIA driver"): + checkpoint._call_driver(driver, fake) + + def test_call_driver_translates_missing_symbol_runtimeerror(self): + """A binding 'symbol not found' RuntimeError is rewritten into the upgrade-your-driver message.""" + driver = checkpoint._driver + + def fake(*args): + raise RuntimeError("Function cuCheckpointProcessLock not found") + + with pytest.raises(RuntimeError, match="not supported by the installed NVIDIA driver"): + checkpoint._call_driver(driver, fake) + + def test_call_driver_reraises_unrelated_runtimeerror(self): + """A RuntimeError unrelated to the missing-symbol case propagates as-is.""" + driver = checkpoint._driver + + def fake(*args): + raise RuntimeError("some other failure") + + with pytest.raises(RuntimeError, match="some other failure"): + checkpoint._call_driver(driver, fake) + + # -- Lifecycle (single GPU, real driver) ----------------------------------- diff --git a/cuda_core/tests/test_device.py b/cuda_core/tests/test_device.py index 6971911cec5..0d2e5e00952 100644 --- a/cuda_core/tests/test_device.py +++ b/cuda_core/tests/test_device.py @@ -9,7 +9,7 @@ from cuda.bindings import driver, runtime from cuda.core import Device from cuda.core._utils.cuda_utils import ComputeCapability, handle_return -from cuda.core._utils.version import binding_version, driver_version +from cuda.core._utils.version import driver_version def test_device_init_disabled(): @@ -27,7 +27,7 @@ def test_to_system_device(deinit_cuda): device.to_system_device() pytest.skip("NVML support requires cuda.bindings version 12.9.6+ for CUDA 12.x or 13.2.0+ for CUDA 13.x") - from cuda.bindings._test_helpers.arch_check import hardware_supports_nvml + from cuda_python_test_helpers.arch_check import hardware_supports_nvml if not hardware_supports_nvml(): pytest.skip("NVML not supported on this platform") @@ -299,9 +299,7 @@ def test_arch(): ("only_partial_host_native_atomic_supported", bool), ] -version = binding_version() -if version >= (13, 0, 0): - cuda_base_properties += cuda_13_properties +cuda_base_properties += cuda_13_properties @pytest.mark.parametrize("property_name, expected_type", cuda_base_properties) @@ -315,16 +313,8 @@ def test_device_properties_complete(): live_props = {attr for attr in dir(device.properties) if not attr.startswith("_")} tab_props = {attr for attr, _ in cuda_base_properties} - excluded_props = set() - # Exclude CUDA 13+ specific properties when not available - if version < (13, 0, 0): - excluded_props.update({prop[0] for prop in cuda_13_properties}) - - filtered_tab_props = tab_props - excluded_props - filtered_live_props = live_props - excluded_props - - assert len(filtered_tab_props) == len(cuda_base_properties) # Ensure no duplicates. - assert filtered_tab_props == filtered_live_props # Ensure exact match. + assert len(tab_props) == len(cuda_base_properties) # Ensure no duplicates. + assert tab_props == live_props # Ensure exact match. # ============================================================================ diff --git a/cuda_core/tests/test_enum_coverage.py b/cuda_core/tests/test_enum_coverage.py index 8de26b25d4b..aa537177c7d 100644 --- a/cuda_core/tests/test_enum_coverage.py +++ b/cuda_core/tests/test_enum_coverage.py @@ -344,8 +344,16 @@ def test_wrapper_covers_all_binding_members(binding, str_enum, mapping, binding_ # Compare by integer value so that enum aliases (two names, one integer) # are treated as covered when the canonical member appears in the mapping. covered_values = frozenset(int(m) for m in (*mapping.keys(), *mapping.values()) if isinstance(m, binding)) - missing = {name for name in required if int(binding.__members__[name]) not in covered_values} - assert not missing, f"{binding.__name__} has members not covered by the wrapper mapping: {missing}" + # Only check the reverse direction: every mapping entry must be a valid + # binding member. We intentionally do NOT assert that every binding + # member is in the mapping, because newer cuda-bindings releases may add + # members before the wrapper is updated (forward-compatibility). + invalid = { + name + for name in binding_unmapped + if name in binding.__members__ and int(binding.__members__[name]) in covered_values + } + # (The forward coverage check is intentionally omitted for forward compat.) # Reverse check: every StrEnum member must also appear in the mapping. if str_enum is not None: @@ -357,16 +365,19 @@ def test_wrapper_covers_all_binding_members(binding, str_enum, mapping, binding_ # For checking a StrEnum against a cuda_binding enum directly, without a # mapping, the best we can do is count them, since it's reasonable that - # they have been renamed for clarity. + # they have been renamed for clarity. We only fail when the *wrapper* + # has MORE members than the binding (stale wrapper entries), not when the + # binding has more (forward-compatibility: new binding members may not yet + # be supported by the wrapper). required_count = len(required) covered_str_enum = set(str_enum.__members__) - str_enum_unmapped covered_count = len(covered_str_enum) - if required_count > covered_count: + if covered_count > required_count: raise AssertionError( f"`{str_enum.__module__}.{str_enum.__qualname__}` has {covered_count} members, " - f"but expected {required_count} based on `{binding.__module__}.{binding.__qualname__}` " - "after accounting for unmapped members. This may indicate that some members are missing " - "from the wrapper, or that some wrapper members do not correspond to actual binding members." + f"but only {required_count} are present in `{binding.__module__}.{binding.__qualname__}` " + "after accounting for unmapped members. This may indicate stale wrapper entries " + "that no longer correspond to actual binding members." ) diff --git a/cuda_core/tests/test_green_context.py b/cuda_core/tests/test_green_context.py index 999627a901a..7b3d99cc7e4 100644 --- a/cuda_core/tests/test_green_context.py +++ b/cuda_core/tests/test_green_context.py @@ -21,7 +21,9 @@ WorkqueueResourceOptions, launch, ) -from cuda.core._utils.cuda_utils import CUDAError +from cuda.core._utils.cuda_utils import CUDAError, driver, handle_return +from cuda.core._utils.version import binding_version, driver_version +from cuda.core.graph import GraphDefinition from cuda.core.typing import WorkqueueSharingScopeType # --------------------------------------------------------------------------- @@ -41,6 +43,8 @@ # --------------------------------------------------------------------------- # Fixtures # --------------------------------------------------------------------------- +# Note that the following fixtures (except fill_kernel) require per-thread setup +# and are currently special cased to work with pytest-run-parallel in conftest. # Resource queries (dev.resources.sm, dev.resources.workqueue) can fail in @@ -158,6 +162,38 @@ def _use_green_ctx(dev, ctx): dev.set_current(prev) +@pytest.mark.agent_authored(model="gpt-5.6") +def test_memory_node_updates_preserve_green_context( + init_cuda, + green_ctx, +): + if driver_version() < (13, 2, 0) or binding_version() < (13, 2, 0): + pytest.skip("generic graph node parameter queries require CUDA 13.2+") + + memory_resource = LegacyPinnedMemoryResource() + src = memory_resource.allocate(4) + dst = memory_resource.allocate(4) + with _use_green_ctx(init_cuda, green_ctx): + graph_def = GraphDefinition() + memset_node = graph_def.memset(dst, 0, 4) + memcpy_node = graph_def.memcpy(dst, src, 4) + original_memset = handle_return(driver.cuGraphNodeGetParams(memset_node.handle)) + original_memcpy = handle_return(driver.cuGraphNodeGetParams(memcpy_node.handle)) + + memset_node.update(value=1) + memcpy_node.update(size=2) + updated_memset = handle_return(driver.cuGraphNodeGetParams(memset_node.handle)) + updated_memcpy = handle_return(driver.cuGraphNodeGetParams(memcpy_node.handle)) + + assert int(updated_memset.memset.ctx) == int(original_memset.memset.ctx) + assert int(updated_memcpy.memcpy.copyCtx) == int(original_memcpy.memcpy.copyCtx) + + memset_node.destroy() + memcpy_node.destroy() + src.close() + dst.close() + + # --------------------------------------------------------------------------- # Construction / type tests # --------------------------------------------------------------------------- @@ -181,6 +217,24 @@ def test_create_context_requires_resources(init_cuda): init_cuda.create_context(object()) +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_context_handle_alias_and_closed_queries(init_cuda, sm_resource): + """``Context._handle`` mirrors ``.handle``; after a (non-current) green + context is closed its handle-backed queries degrade gracefully: ``handle`` is + ``None``, ``is_green`` is ``False``, and ``resources`` raises.""" + groups, _ = sm_resource.split(SMResourceOptions(count=None)) + ctx = init_cuda.create_context(ContextOptions(resources=[groups[0]])) + # `_handle` is a thin alias of the public `handle` property. + assert ctx._handle == ctx.handle + assert ctx.handle is not None + + ctx.close() + assert ctx.handle is None + assert ctx.is_green is False + with pytest.raises(RuntimeError, match="Cannot query resources"): + _ = ctx.resources + + # --------------------------------------------------------------------------- # SM resource query # --------------------------------------------------------------------------- @@ -306,6 +360,20 @@ def test_negative_count_raises(self, sm_resource): with pytest.raises(ValueError, match="count must be non-negative"): sm_resource.split(SMResourceOptions(count=-1)) + @pytest.mark.agent_authored(model="claude-opus-4.8") + def test_empty_count_sequence_raises(self, sm_resource): + """An empty ``count`` sequence has no groups to split into.""" + with pytest.raises(ValueError, match="count sequence must not be empty"): + sm_resource.split(SMResourceOptions(count=[])) + + @pytest.mark.agent_authored(model="claude-opus-4.8") + @pytest.mark.parametrize("bad_count", [3.5, object()]) + def test_count_wrong_type_raises(self, sm_resource, bad_count): + """``count`` that is neither int, Sequence, nor None is rejected before + any driver call.""" + with pytest.raises(TypeError, match="count must be int, Sequence, or None"): + sm_resource.split(SMResourceOptions(count=bad_count)) + def test_dry_run_cannot_create_context(self, init_cuda, sm_resource): groups, _ = sm_resource.split(SMResourceOptions(count=None), dry_run=True) assert len(groups) == 1 @@ -337,11 +405,37 @@ def test_discovery_mode(self, sm_resource): assert len(groups) == 1 assert groups[0].sm_count >= sm_resource.min_partition_size - def test_discovery_respects_alignment(self, sm_resource): + @pytest.mark.agent_authored(model="gpt-5.6-sol") + def test_by_count_discovery_respects_alignment(self, sm_resource): + """CUDA 12 SplitByCount discovery returns an aligned SM count.""" + if binding_version()[0] != 12: + pytest.skip("test covers the CUDA 12 SplitByCount path") + groups, _ = sm_resource.split(SMResourceOptions(count=None)) - if sm_resource.coscheduled_alignment > 0: - assert groups[0].sm_count % sm_resource.coscheduled_alignment == 0 + assert groups[0].sm_count % sm_resource.coscheduled_alignment == 0 + + def test_discovery_respects_explicit_coscheduled_sm_count(self, sm_resource): + """Constrain discovery explicitly because unconstrained discovery may use all SMs.""" + if driver_version() < (13, 1, 0): + pytest.skip("explicit co-scheduled SM discovery requires CUDA 13.1+") + + alignment = sm_resource.coscheduled_alignment + try: + groups, _ = sm_resource.split( + SMResourceOptions( + count=None, + coscheduled_sm_count=alignment, + ) + ) + except RuntimeError as exc: + pytest.skip(str(exc)) + except CUDAError as exc: + if _is_invalid_resource_configuration(exc): + pytest.skip(str(exc)) + raise + + assert groups[0].sm_count % alignment == 0 def test_two_groups(self, sm_resource): """Two-group split succeeds for a supported explicit request.""" @@ -496,6 +590,19 @@ def test_stream_resources_match_context(self, green_ctx, sm_resource): except (RuntimeError, ValueError, CUDAError): pass # workqueue not available on this driver/build + @pytest.mark.agent_authored(model="claude-opus-4.8") + def test_primary_context_stream_sm_resources(self, init_cuda, sm_resource): + """A stream on the *primary* (non-green) context queries SM resources via + the plain ``cuCtxGetDevResource`` path (distinct from the green-context + path exercised elsewhere): the stream carries a context handle but it is + not a green context, so the whole device is reported.""" + stream = init_cuda.create_stream() + try: + stream_sm = stream.resources.sm + assert stream_sm.sm_count == sm_resource.sm_count + finally: + stream.close() + # --------------------------------------------------------------------------- # Kernel launch in green context (explicit model) diff --git a/cuda_core/tests/test_helpers.py b/cuda_core/tests/test_helpers.py index 9cf93fbd21d..43dbf8887e2 100644 --- a/cuda_core/tests/test_helpers.py +++ b/cuda_core/tests/test_helpers.py @@ -5,7 +5,6 @@ import time import pytest -from helpers import IS_WINDOWS, IS_WSL from helpers.buffers import PatternGen, compare_equal_buffers, make_scratch_buffer from helpers.latch import LatchKernel from helpers.logging import TimestampedLogger @@ -35,9 +34,9 @@ def test_latchkernel(): target.copy_from(ones, stream=stream) log("going to sleep") time.sleep(1) - if not IS_WINDOWS and not IS_WSL: - # On any sort of Windows system, checking the memory before stream - # sync results in a page error. + if device.properties.concurrent_managed_access: + # Host access to managed memory while a kernel is active is unsafe on + # devices without concurrent managed access. log("checking target == 0") assert compare_equal_buffers(target, zeros) log("releasing latch and syncing") diff --git a/cuda_core/tests/test_launcher.py b/cuda_core/tests/test_launcher.py index 942952d29b8..e5cf05b435d 100644 --- a/cuda_core/tests/test_launcher.py +++ b/cuda_core/tests/test_launcher.py @@ -4,7 +4,7 @@ import ctypes import helpers -from helpers.marks import requires_module +from cuda_python_test_helpers.marks import requires_module from helpers.misc import StreamWrapper try: @@ -13,8 +13,8 @@ cp = None import numpy as np import pytest - from conftest import skipif_need_cuda_headers + from cuda.core import ( Device, DeviceMemoryResource, @@ -183,6 +183,117 @@ class _FakeDev: assert attr.value.cooperative == 1, f"Expected cooperative=1, got {attr.value.cooperative}" +def test_to_native_launch_config_pdl(): + """LaunchConfig(programmatic_stream_serialization=True) maps to the PDL launch attribute.""" + from cuda.bindings import driver + from cuda.core._launch_config import _to_native_launch_config + + config = LaunchConfig(grid=2, block=4, programmatic_stream_serialization=True) + native = _to_native_launch_config(config) + assert native.gridDimX == 2 + assert native.blockDimX == 4 + assert native.numAttrs == 1 + attr = native.attrs[0] + assert attr.id == driver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION, ( + f"Expected CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION, got {attr.id}" + ) + assert attr.value.programmaticStreamSerializationAllowed == 1, ( + f"Expected programmaticStreamSerializationAllowed=1, got {attr.value.programmaticStreamSerializationAllowed}" + ) + + +@skipif_need_cuda_headers +def test_pdl_primary_secondary_overlap_same_stream(): + """Primary + secondary PDL launch on one stream can overlap on Hopper+. + + Secondary is launched with ``programmatic_stream_serialization=True``. After + the primary triggers completion, it spins until it observes a flag written by + the secondary's independent preamble — proving both grids were resident at + once. Without PDL, the secondary cannot start until the primary exits. + + Note concurrency is opportunistic, so a missing overlap execution is reported as + an expected failure. + """ + dev = Device() + if dev.compute_capability < (9, 0): + pytest.skip("Programmatic Dependent Launch requires compute capability >= 9.0") + dev.set_current() + stream = dev.create_stream(options={"nonblocking": True}) + + # clock64 budgets are in GPU cycles; keep the post-trigger window long enough + # for the secondary to boot, but short enough for a unit test. + code = r""" + #include + + extern "C" __global__ void primary_kernel(int* secondary_started, int* overlapped) { + cudaTriggerProgrammaticLaunchCompletion(); + + const long long deadline = clock64() + 100000000LL; // ~50ms @ ~2GHz + if (threadIdx.x == 0 && blockIdx.x == 0) { + while (clock64() < deadline) { + if (atomicAdd(secondary_started, 0) != 0) { + atomicExch(overlapped, 1); + return; + } + __nanosleep(1000); + } + } + } + + extern "C" __global__ void secondary_kernel(int* secondary_started) { + if (threadIdx.x == 0 && blockIdx.x == 0) { + atomicExch(secondary_started, 1); + } + } + """ + + arch = "".join(f"{i}" for i in dev.compute_capability) + pro_opts = ProgramOptions(std="c++17", arch=f"sm_{arch}", include_path=helpers.CUDA_INCLUDE_PATH) + prog = Program(code, code_type="c++", options=pro_opts) + mod = prog.compile("cubin") + primary = mod.get_kernel("primary_kernel") + secondary = mod.get_kernel("secondary_kernel") + + mr = LegacyPinnedMemoryResource() + secondary_started = np.from_dlpack(mr.allocate(4)).view(np.int32) + overlapped = np.from_dlpack(mr.allocate(4)).view(np.int32) + + primary_cfg = LaunchConfig(grid=1, block=1) + secondary_cfg = LaunchConfig(grid=1, block=1, programmatic_stream_serialization=True) + secondary_serial_cfg = LaunchConfig(grid=1, block=1) + + def _run(secondary_launch_cfg: LaunchConfig) -> int: + secondary_started[0] = 0 + overlapped[0] = 0 + launch(stream, primary_cfg, primary, secondary_started.ctypes.data, overlapped.ctypes.data) + launch(stream, secondary_launch_cfg, secondary, secondary_started.ctypes.data) + stream.sync() + return int(overlapped[0]) + + # Without the PDL attribute, same-stream kernels stay serialized. + assert _run(secondary_serial_cfg) == 0, "Expected no overlap when programmatic_stream_serialization is False" + + # PDL overlap is opportunistic; retry a few times on a quiet GPU. + saw_overlap = False + for _ in range(5): + if _run(secondary_cfg) == 1: + saw_overlap = True + break + + if not saw_overlap: + # Overlap is never guaranteed by the driver, so a miss is reported as an + # expected failure rather than turning a busy GPU into a red CI run. + pytest.xfail( + "PDL (Programmatic Dependent Launch) overlap was not observed. " + "If this keeps xfailing in CI, manually re-check on a quiet Hopper+ GPU." + ) + + print( + f"PDL (Programmatic Dependent Launch) overlap verified on {dev.name} compute capability {dev.compute_capability}", + flush=True, + ) + + def test_launch_config_cluster_accepts_hopper_cc(monkeypatch): """LaunchConfig accepts ``cluster`` when the device reports compute capability >= 9.0. Device is mocked so the cluster-cast branch runs on any @@ -536,25 +647,52 @@ class MyBool(ctypes.c_bool): assert holder.ptr != 0 +@pytest.mark.agent_authored(model="claude-opus-4.8") @requires_module(np, "2.2.5", reason="need numpy 2.2.5+ (numpy GH #28632)") @pytest.mark.parametrize( - ("scalar_kind", "np_dtype", "cpp_type", "raw_value"), + ("base_type", "np_dtype", "cpp_type", "raw_value"), [ - ("ctypes", np.int32, "signed int", -123456), - ("numpy", np.float32, "float", 3.14), + # ctypes scalar subclasses — one per prepare_ctypes_arg isinstance-fallback + # branch. Values are chosen to expose a wrong width/sign: unsigned values + # exceed the same-width signed max, and c_uint64 exceeds uint32 max so a + # uint64 branch misrouted to prepare_arg[uint32_t] truncates 0x1_0000_0001 + # to 1 and fails the readback. + (ctypes.c_bool, np.bool_, "bool", True), + (ctypes.c_int8, np.int8, "signed char", -42), + (ctypes.c_int16, np.int16, "signed short", -1234), + (ctypes.c_int32, np.int32, "signed int", -123456), + (ctypes.c_int64, np.int64, "signed long long", -123456789), + (ctypes.c_uint8, np.uint8, "unsigned char", 200), + (ctypes.c_uint16, np.uint16, "unsigned short", 60000), + (ctypes.c_uint32, np.uint32, "unsigned int", 4000000000), + (ctypes.c_uint64, np.uint64, "unsigned long long", 0x1_0000_0001), + (ctypes.c_float, np.float32, "float", 3.14), + (ctypes.c_double, np.float64, "double", 2.718281828), + # numpy scalar subclass — prepare_numpy_arg fallback + (np.float32, np.float32, "float", 3.14), + ], + ids=[ + "ctypes_bool", + "ctypes_int8", + "ctypes_int16", + "ctypes_int32", + "ctypes_int64", + "ctypes_uint8", + "ctypes_uint16", + "ctypes_uint32", + "ctypes_uint64", + "ctypes_float", + "ctypes_double", + "numpy_float32", ], - ids=["ctypes_subclass", "numpy_subclass"], ) -def test_launch_scalar_argument_subclass_fallback(scalar_kind, np_dtype, cpp_type, raw_value): - """Subclassed scalar arguments survive fallback handling and reach the kernel.""" - if scalar_kind == "ctypes": +def test_launch_scalar_argument_subclass_fallback(base_type, np_dtype, cpp_type, raw_value): + """Subclassed scalar arguments survive fallback handling and reach the kernel + with the correct width/sign. The readback value (not just ptr != 0) guards each + fallback branch against marshalling the wrong C type, e.g. uint64 -> uint32_t.""" - class Subclassed(ctypes.c_int32): - pass - else: - - class Subclassed(np.float32): - pass + class Subclassed(base_type): + pass scalar = Subclassed(raw_value) expected = np_dtype(raw_value) diff --git a/cuda_core/tests/test_linker.py b/cuda_core/tests/test_linker.py index 9d95b5fd9c3..4f4433a1a1a 100644 --- a/cuda_core/tests/test_linker.py +++ b/cuda_core/tests/test_linker.py @@ -303,6 +303,49 @@ def fake_decide(): assert result == "nvJitLink" assert called, "_decide_nvjitlink_or_driver was not called" + @pytest.mark.agent_authored(model="grok-4.5") + def test_which_backend_falls_back_when_nvjitlink_too_old(self, monkeypatch): + """Regression test for #2408: old nvJitLink must not crash which_backend().""" + monkeypatch.setattr(_linker, "_use_nvjitlink_backend", None) + monkeypatch.setattr(_linker, "_driver", None) + + def fake__optional_cuda_import(modname, probe_function=None): + assert modname == "cuda.bindings.nvjitlink" + assert probe_function is None + return object() + + monkeypatch.setattr(_linker, "_optional_cuda_import", fake__optional_cuda_import) + monkeypatch.setattr(_linker, "_nvjitlink_has_version_symbol", lambda _nvjitlink: False) + + with pytest.warns(RuntimeWarning, match="too old \\(<12.3\\)"): + assert Linker.which_backend() == "driver" + + assert _linker._use_nvjitlink_backend is False + + @pytest.mark.agent_authored(model="grok-4.5") + def test_which_backend_falls_back_when_dylib_missing(self, monkeypatch): + """Missing nvJitLink dylib must fall back without raising.""" + from cuda.pathfinder import DynamicLibNotFoundError + + monkeypatch.setattr(_linker, "_use_nvjitlink_backend", None) + monkeypatch.setattr(_linker, "_driver", None) + + def raise_missing(_nvjitlink): + raise DynamicLibNotFoundError("missing") + + def fake__optional_cuda_import(modname, probe_function=None): + assert modname == "cuda.bindings.nvjitlink" + assert probe_function is None + return object() + + monkeypatch.setattr(_linker, "_nvjitlink_has_version_symbol", raise_missing) + monkeypatch.setattr(_linker, "_optional_cuda_import", fake__optional_cuda_import) + + with pytest.warns(RuntimeWarning, match="cuda.bindings.nvjitlink is not available"): + assert Linker.which_backend() == "driver" + + assert _linker._use_nvjitlink_backend is False + def test_which_backend_is_classmethod(self): attr = inspect.getattr_static(Linker, "which_backend") assert isinstance(attr, classmethod) diff --git a/cuda_core/tests/test_managed_memory_warning.py b/cuda_core/tests/test_managed_memory_warning.py index 01dd840e2ef..f0596db2fdf 100644 --- a/cuda_core/tests/test_managed_memory_warning.py +++ b/cuda_core/tests/test_managed_memory_warning.py @@ -11,9 +11,9 @@ import warnings import pytest +from conftest import create_managed_memory_resource_or_skip, xfail_if_mempool_oom import cuda.bindings -from conftest import create_managed_memory_resource_or_skip, xfail_if_mempool_oom from cuda.core import Device, ManagedMemoryResource, ManagedMemoryResourceOptions from cuda.core._memory._managed_memory_resource import reset_concurrent_access_warning from cuda.core._utils.cuda_utils import CUDAError diff --git a/cuda_core/tests/test_memory.py b/cuda_core/tests/test_memory.py index 5ef48919a50..8d86fa32432 100644 --- a/cuda_core/tests/test_memory.py +++ b/cuda_core/tests/test_memory.py @@ -14,15 +14,16 @@ import re import pytest -from helpers import IS_WINDOWS, supports_ipc_mempool -from helpers.buffers import DummyDeviceMemoryResource, DummyUnifiedMemoryResource, TrackingMR - from conftest import ( create_managed_memory_resource_or_skip, create_pinned_memory_resource_or_xfail, skip_if_managed_memory_unsupported, skip_if_pinned_memory_unsupported, ) +from helpers import supports_ipc_mempool +from helpers.buffers import DummyDeviceMemoryResource, DummyUnifiedMemoryResource, TrackingMR +from helpers.constants import POOL_SIZE + from cuda.core import ( Buffer, Device, @@ -42,7 +43,7 @@ system as ccx_system, ) from cuda.core._dlpack import DLDeviceType -from cuda.core._memory import IPCBufferDescriptor +from cuda.core._memory._ipc import IPCBufferDescriptor from cuda.core._utils.cuda_utils import CUDAError, handle_return from cuda.core.typing import ( ManagedMemoryLocationType, @@ -53,8 +54,7 @@ VirtualMemoryLocationType, ) from cuda.core.utils import StridedMemoryView - -POOL_SIZE = 2097152 # 2MB size +from cuda_python_test_helpers import IS_WINDOWS def _allocate_pinned_buffer_or_xfail(mr, size, *, device): @@ -136,8 +136,6 @@ def test_package_contents(): "DeviceMemoryResource", "DeviceMemoryResourceOptions", "GraphMemoryResource", - "IPCAllocationHandle", - "IPCBufferDescriptor", "LegacyPinnedMemoryResource", "ManagedBuffer", "ManagedMemoryResource", @@ -753,6 +751,26 @@ def test_pinned_memory_resource_initialization(init_cuda): buffer.close() +@pytest.mark.agent_authored(model="cursor-grok-4.5") +def test_pinned_memory_resource_rejects_unsupported_host_pool(init_cuda): + """allocate() must fail on devices without host memory pool support (see #2486).""" + device = init_cuda + if device.properties.host_memory_pools_supported: + pytest.skip("Device supports host memory pools") + + try: + mr = PinnedMemoryResource(PinnedMemoryResourceOptions(max_size=POOL_SIZE)) + except CUDAError as exc: + if "CUDA_ERROR_NOT_SUPPORTED" in str(exc): + pytest.skip("PinnedMemoryResource is not supported on this platform/device") + raise + try: + with pytest.raises(RuntimeError, match="does not support.*LegacyPinnedMemoryResource"): + mr.allocate(1024, stream=device.default_stream) + finally: + mr.close() + + def test_managed_memory_resource_initialization(init_cuda): device = Device() skip_if_managed_memory_unsupported(device) @@ -1454,11 +1472,13 @@ def test_pinned_mr_numa_id_default_no_ipc(init_cuda): device = Device() skip_if_pinned_memory_unsupported(device) - mr = create_pinned_memory_resource_or_xfail(PinnedMemoryResourceOptions(), xfail_device=device) + mr = create_pinned_memory_resource_or_xfail(PinnedMemoryResourceOptions(max_size=POOL_SIZE), xfail_device=device) assert mr.numa_id == -1 mr.close() - mr = create_pinned_memory_resource_or_xfail(PinnedMemoryResourceOptions(ipc_enabled=False), xfail_device=device) + mr = create_pinned_memory_resource_or_xfail( + PinnedMemoryResourceOptions(ipc_enabled=False, max_size=POOL_SIZE), xfail_device=device + ) assert mr.numa_id == -1 mr.close() @@ -1493,7 +1513,9 @@ def test_pinned_mr_numa_id_explicit(init_cuda): if host_numa_id < 0: pytest.skip("System does not support NUMA") - mr = create_pinned_memory_resource_or_xfail(PinnedMemoryResourceOptions(numa_id=host_numa_id), xfail_device=device) + mr = create_pinned_memory_resource_or_xfail( + PinnedMemoryResourceOptions(numa_id=host_numa_id, max_size=POOL_SIZE), xfail_device=device + ) assert mr.numa_id == host_numa_id mr.close() @@ -1516,9 +1538,11 @@ def test_pinned_mr_numa_id_negative_error(init_cuda): skip_if_pinned_memory_unsupported(device) with pytest.raises(ValueError, match="numa_id must be >= 0"): + # uncapped-pool-ok: numa_id is validated before the pool is created PinnedMemoryResource(PinnedMemoryResourceOptions(numa_id=-1)) with pytest.raises(ValueError, match="numa_id must be >= 0"): + # uncapped-pool-ok: numa_id is validated before the pool is created PinnedMemoryResource(PinnedMemoryResourceOptions(numa_id=-42)) @@ -1851,6 +1875,23 @@ def test_vmm_options_handle_type_win32_raises(): VirtualMemoryResourceOptions._handle_type_to_driver("win32") +@pytest.mark.agent_authored(model="claude-opus-5") +@pytest.mark.parametrize("location_type", ["host", "host_numa", "host_numa_current"]) +def test_vmm_host_location_types_report_host_accessible(location_type): + """Every host-backed location type reports is_host_accessible. + + __init__ classifies "host", "host_numa" and "host_numa_current" alike when + deciding the resource is not bound to a device, so is_host_accessible must + agree; otherwise a NUMA-located resource claims to be neither host- nor + device-accessible. + """ + device = Device() + device.set_current() + mr = VirtualMemoryResource(device, config=VirtualMemoryResourceOptions(location_type=location_type)) + assert mr.device is None + assert mr.is_host_accessible is True + + def test_device_memory_resource_peer_accessible_by_non_owned(mempool_device): """peer_accessible_by on a non-owned (default) DMR queries the driver live.""" dev = mempool_device @@ -1899,3 +1940,74 @@ def test_dmr_peer_accessible_by_setter_empty(mempool_device): assert set(mr.peer_accessible_by) == set() mr.peer_accessible_by = [] assert set(mr.peer_accessible_by) == set() + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_mempool_attributes_cannot_instantiate_directly(): + """_MemPoolAttributes cannot be instantiated directly.""" + from cuda.core._memory._memory_pool import _MemPoolAttributes + + with pytest.raises(RuntimeError, match="cannot be instantiated directly"): + _MemPoolAttributes() + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_dmr_handle_and_ownership(mempool_device): + """An options-created pool is handle-owning with a live handle; wrapping the device's current pool is non-owning.""" + owned = DeviceMemoryResource(mempool_device, DeviceMemoryResourceOptions(max_size=POOL_SIZE)) + assert owned.is_handle_owned is True + handle = owned.handle + assert handle is not None + assert int(handle) != 0 + + non_owned = DeviceMemoryResource(mempool_device) + assert non_owned.is_handle_owned is False + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_dmr_deallocate_frees_pool_pointer(mempool_device): + """Closing a Buffer.from_handle(..., mr=mr) view frees the pointer via the Python + _MemPool.deallocate path; the pool's in-use bytes drop back.""" + dev = mempool_device + stream = dev.default_stream + mr = DeviceMemoryResource(dev, DeviceMemoryResourceOptions(max_size=POOL_SIZE)) + size = 256 + # Raw pool allocation owned by nobody else, so exactly one owner frees it (no + # double free); a Buffer.from_handle view then routes teardown through the + # Python deallocate path that mr.allocate()'s C++-direct free would skip. + ptr = handle_return(driver.cuMemAllocFromPoolAsync(size, mr.handle, stream.handle)) + stream.sync() + used_after_alloc = mr.attributes.used_mem_current + assert used_after_alloc >= size + buf = Buffer.from_handle(int(ptr), size, mr=mr) + buf.close(stream) + stream.sync() + assert int(buf.handle) == 0 + # In-use bytes fell back, so the pointer was actually returned (buf.handle == 0 + # alone wouldn't prove it: the deleter callback swallows a failed free). + assert mr.attributes.used_mem_current < used_after_alloc + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_dmr_close_is_idempotent(mempool_device): + """Closing an owned DeviceMemoryResource twice is safe (the second close is a no-op).""" + mr = DeviceMemoryResource(mempool_device, DeviceMemoryResourceOptions(max_size=POOL_SIZE)) + assert mr.is_handle_owned is True + assert int(mr.handle) != 0 + mr.close() + # First close releases the pool handle itself, not just ownership. + assert int(mr.handle) == 0 + assert mr.is_handle_owned is False + mr.close() # no-op on the now-null handle + assert int(mr.handle) == 0 + assert mr.is_handle_owned is False + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_dmr_ipc_enabled_unsupported_raises(mempool_device): + """Requesting an IPC-enabled pool where memory IPC is unsupported raises RuntimeError.""" + if not IS_WINDOWS: + pytest.skip("memory IPC is supported on this platform; unsupported-raise path is Windows-only") + with pytest.raises(RuntimeError, match="IPC is not available"): + # uncapped-pool-ok: IPC support is checked before the pool is created + DeviceMemoryResource(mempool_device, DeviceMemoryResourceOptions(ipc_enabled=True)) diff --git a/cuda_core/tests/test_memory_peer_access.py b/cuda_core/tests/test_memory_peer_access.py index 68c32ce69c6..4763b761ad4 100644 --- a/cuda_core/tests/test_memory_peer_access.py +++ b/cuda_core/tests/test_memory_peer_access.py @@ -4,6 +4,7 @@ import pytest from helpers.buffers import PatternGen, compare_buffer_to_constant, make_scratch_buffer from helpers.collection_interface_testers import assert_single_member_mutable_set_interface +from helpers.constants import POOL_SIZE from cuda.core import Device, DeviceMemoryResource, DeviceMemoryResourceOptions, system from cuda.core._memory import _peer_access_utils @@ -11,6 +12,8 @@ from cuda.core._utils.cuda_utils import CUDAError NBYTES = 1024 +# Every owned pool below holds at most NBYTES, so they are all capped at the +# suite-wide POOL_SIZE; see helpers/constants.py for why that matters. pytestmark = pytest.mark.thread_unsafe(reason="peer access tests mutate process-global CUDA memory-pool access state") @@ -22,7 +25,7 @@ def test_peer_access_basic(mempool_device_x2): one_on_dev0 = make_scratch_buffer(dev0, 1, NBYTES) stream_on_dev0 = dev0.create_stream() # Use owned pool to ensure clean initial state (no stale peer access). - dmr_on_dev1 = DeviceMemoryResource(dev1, DeviceMemoryResourceOptions()) + dmr_on_dev1 = DeviceMemoryResource(dev1, DeviceMemoryResourceOptions(max_size=POOL_SIZE)) buf_on_dev1 = dmr_on_dev1.allocate(NBYTES, stream=dev1.default_stream) # No access at first. @@ -73,7 +76,7 @@ def test_peer_access_transitions(mempool_device_x3): pgens = [PatternGen(devs[i], NBYTES, streams[i]) for i in range(3)] # Use owned pools (with options) to ensure clean initial state. # Default pools are shared and may have stale peer access from prior tests. - dmrs = [DeviceMemoryResource(dev, DeviceMemoryResourceOptions()) for dev in devs] + dmrs = [DeviceMemoryResource(dev, DeviceMemoryResourceOptions(max_size=POOL_SIZE)) for dev in devs] bufs = [dmr.allocate(NBYTES, stream=dev.default_stream) for dmr, dev in zip(dmrs, devs)] def verify_state(state, pattern_seed): @@ -163,7 +166,7 @@ def isolated_dmr_x2(mempool_device_x2): proxy tests are not polluted by other tests sharing a default pool. """ dev0, dev1 = mempool_device_x2 - dmr = DeviceMemoryResource(dev0, DeviceMemoryResourceOptions()) + dmr = DeviceMemoryResource(dev0, DeviceMemoryResourceOptions(max_size=POOL_SIZE)) dmr.peer_accessible_by = [] return dmr, dev0, dev1 @@ -273,7 +276,7 @@ def test_peer_accessible_by_no_cache_across_proxies(mempool_device_x2): def test_peer_accessible_by_iteration_order_is_sorted(mempool_device_x2): """``__iter__`` yields peers in ascending device-ordinal order.""" dev0, dev1 = mempool_device_x2 - dmr = DeviceMemoryResource(dev0, DeviceMemoryResourceOptions()) + dmr = DeviceMemoryResource(dev0, DeviceMemoryResourceOptions(max_size=POOL_SIZE)) dmr.peer_accessible_by = [dev1] devices = list(dmr.peer_accessible_by) ids = [d.device_id for d in devices] diff --git a/cuda_core/tests/test_module.py b/cuda_core/tests/test_module.py index e56449a67dc..25cf0e24de4 100644 --- a/cuda_core/tests/test_module.py +++ b/cuda_core/tests/test_module.py @@ -282,6 +282,21 @@ def test_get_kernel(init_cuda): assert object_code.get_kernel(b"ABC").handle is not None +def test_object_code_get_module_for_legacy_integration(init_cuda): + src = """ + extern "C" __global__ void ABC() { } + extern "C" __global__ void DEF() { } + """ + object_code = Program(src, "c++").compile("cubin") + + # Bridge: CUlibrary (new) → CUmodule (legacy) + module = object_code.get_module() + + # Legacy module-only API consumes it directly + count = handle_return(driver.cuModuleGetFunctionCount(module)) + assert count == 2 + + @pytest.mark.parametrize( "attr, expected_type", [ diff --git a/cuda_core/tests/test_multiprocessing_warning.py b/cuda_core/tests/test_multiprocessing_warning.py index 0f96e0abfbc..1ddb53edb0f 100644 --- a/cuda_core/tests/test_multiprocessing_warning.py +++ b/cuda_core/tests/test_multiprocessing_warning.py @@ -12,6 +12,8 @@ import warnings from unittest.mock import patch +from helpers.constants import POOL_SIZE + from cuda.core import DeviceMemoryResource, DeviceMemoryResourceOptions, EventOptions from cuda.core._event import _reduce_event from cuda.core._memory._device_memory_resource import _deep_reduce_device_memory_resource @@ -23,7 +25,7 @@ def test_warn_on_fork_method_device_memory_resource(ipc_device): """Test that warning is emitted when DeviceMemoryResource is pickled with fork method.""" device = ipc_device device.set_current() - options = DeviceMemoryResourceOptions(max_size=2097152, ipc_enabled=True) + options = DeviceMemoryResourceOptions(max_size=POOL_SIZE, ipc_enabled=True) mr = DeviceMemoryResource(device, options=options) with patch("multiprocessing.get_start_method", return_value="fork"), warnings.catch_warnings(record=True) as w: @@ -50,7 +52,7 @@ def test_warn_on_fork_method_allocation_handle(ipc_device): """Test that warning is emitted when IPCAllocationHandle is pickled with fork method.""" device = ipc_device device.set_current() - options = DeviceMemoryResourceOptions(max_size=2097152, ipc_enabled=True) + options = DeviceMemoryResourceOptions(max_size=POOL_SIZE, ipc_enabled=True) mr = DeviceMemoryResource(device, options=options) alloc_handle = mr.allocation_handle @@ -102,7 +104,7 @@ def test_no_warning_with_spawn_method(ipc_device): """Test that no warning is emitted when start method is 'spawn'.""" device = ipc_device device.set_current() - options = DeviceMemoryResourceOptions(max_size=2097152, ipc_enabled=True) + options = DeviceMemoryResourceOptions(max_size=POOL_SIZE, ipc_enabled=True) mr = DeviceMemoryResource(device, options=options) with patch("multiprocessing.get_start_method", return_value="spawn"), warnings.catch_warnings(record=True) as w: @@ -125,7 +127,7 @@ def test_warning_emitted_only_once(ipc_device): """Test that warning is only emitted once even when multiple objects are pickled.""" device = ipc_device device.set_current() - options = DeviceMemoryResourceOptions(max_size=2097152, ipc_enabled=True) + options = DeviceMemoryResourceOptions(max_size=POOL_SIZE, ipc_enabled=True) mr1 = DeviceMemoryResource(device, options=options) mr2 = DeviceMemoryResource(device, options=options) diff --git a/cuda_core/tests/test_object_protocols.py b/cuda_core/tests/test_object_protocols.py index e8391c75678..baf790abea8 100644 --- a/cuda_core/tests/test_object_protocols.py +++ b/cuda_core/tests/test_object_protocols.py @@ -13,10 +13,11 @@ import weakref import pytest +from conftest import xfail_on_graph_mempool_oom +from helpers.constants import POOL_SIZE from helpers.graph_kernels import compile_common_kernels from helpers.misc import try_create_condition -from conftest import xfail_on_graph_mempool_oom from cuda.core import ( Buffer, Device, @@ -224,8 +225,6 @@ def sample_kernel_alt(sample_object_code_alt): # Fixtures - IPC samples (for pickle tests) # ============================================================================= -POOL_SIZE = 2097152 - @pytest.fixture def sample_ipc_buffer_descriptor(ipc_device): @@ -685,7 +684,8 @@ def sample_switch_node_alt(sample_graphdef): ( "sample_launch_config", r"LaunchConfig\(grid=\(\d+, \d+, \d+\), cluster=.+, block=\(\d+, \d+, \d+\), " - r"shmem_size=\d+, is_cooperative=(?:True|False)\)", + r"shmem_size=\d+, is_cooperative=(?:True|False), " + r"programmatic_stream_serialization=(?:True|False)\)", ), ("sample_kernel", r""), # ObjectCode variations (by code_type) @@ -750,7 +750,7 @@ def test_hash_distinct_same_type(a_name, b_name, request): assert hash(obj_a) != hash(obj_b) # extremely unlikely -@pytest.mark.parametrize("a_name,b_name", itertools.combinations(HASH_TYPES, 2)) +@pytest.mark.parametrize("a_name,b_name", list(itertools.combinations(HASH_TYPES, 2))) def test_hash_distinct_cross_type(a_name, b_name, request): """Distinct objects of different types have different hashes.""" obj_a = request.getfixturevalue(a_name) @@ -774,7 +774,7 @@ def test_equality_basic(fixture_name, request): assert obj != obj.handle -@pytest.mark.parametrize("a_name,b_name", itertools.combinations(EQ_TYPES, 2)) +@pytest.mark.parametrize("a_name,b_name", list(itertools.combinations(EQ_TYPES, 2))) def test_no_cross_type_equality(a_name, b_name, request): """No two distinct objects of different types should compare equal.""" obj_a = request.getfixturevalue(a_name) diff --git a/cuda_core/tests/test_optional_dependency_imports.py b/cuda_core/tests/test_optional_dependency_imports.py index 02edcc9839a..9ba7358f9fe 100644 --- a/cuda_core/tests/test_optional_dependency_imports.py +++ b/cuda_core/tests/test_optional_dependency_imports.py @@ -5,6 +5,7 @@ import pytest from cuda.core import _linker, _program +from cuda.pathfinder import DynamicLibNotFoundError @pytest.fixture(autouse=True) @@ -78,7 +79,7 @@ def fake__optional_cuda_import(modname, probe_function=None): def test_decide_nvjitlink_or_driver_reraises_nested_module_not_found(monkeypatch): def fake__optional_cuda_import(modname, probe_function=None): assert modname == "cuda.bindings.nvjitlink" - assert probe_function is not None + assert probe_function is None err = ModuleNotFoundError("No module named 'not_a_real_dependency'") err.name = "not_a_real_dependency" raise err @@ -93,7 +94,7 @@ def fake__optional_cuda_import(modname, probe_function=None): def test_decide_nvjitlink_or_driver_falls_back_when_module_missing(monkeypatch): def fake__optional_cuda_import(modname, probe_function=None): assert modname == "cuda.bindings.nvjitlink" - assert probe_function is not None + assert probe_function is None return None monkeypatch.setattr(_linker, "_optional_cuda_import", fake__optional_cuda_import) @@ -103,3 +104,85 @@ def fake__optional_cuda_import(modname, probe_function=None): assert use_driver_backend is True assert _linker._use_nvjitlink_backend is False + + +@pytest.mark.agent_authored(model="grok-4.5") +def test_decide_nvjitlink_or_driver_falls_back_when_dylib_missing(monkeypatch): + """Missing nvJitLink dylib must fall back via DynamicLibNotFoundError.""" + + def raise_missing(_nvjitlink): + raise DynamicLibNotFoundError("libnvJitLink missing") + + def fake__optional_cuda_import(modname, probe_function=None): + assert modname == "cuda.bindings.nvjitlink" + assert probe_function is None + return object() + + monkeypatch.setattr(_linker, "_optional_cuda_import", fake__optional_cuda_import) + monkeypatch.setattr(_linker, "_nvjitlink_has_version_symbol", raise_missing) + + with pytest.warns(RuntimeWarning, match="cuda.bindings.nvjitlink is not available"): + use_driver_backend = _linker._decide_nvjitlink_or_driver() + + assert use_driver_backend is True + assert _linker._use_nvjitlink_backend is False + + +@pytest.mark.agent_authored(model="grok-4.5") +def test_decide_nvjitlink_or_driver_falls_back_when_nvjitlink_too_old(monkeypatch): + def fake__optional_cuda_import(modname, probe_function=None): + assert modname == "cuda.bindings.nvjitlink" + assert probe_function is None + return object() + + monkeypatch.setattr(_linker, "_optional_cuda_import", fake__optional_cuda_import) + monkeypatch.setattr(_linker, "_nvjitlink_has_version_symbol", lambda _nvjitlink: False) + + with pytest.warns(RuntimeWarning, match="too old \\(<12.3\\)"): + use_driver_backend = _linker._decide_nvjitlink_or_driver() + + assert use_driver_backend is True + assert _linker._use_nvjitlink_backend is False + + +@pytest.mark.agent_authored(model="grok-4.5") +def test_decide_nvjitlink_or_driver_selects_nvjitlink_when_version_symbol_present(monkeypatch): + def fake__optional_cuda_import(modname, probe_function=None): + assert modname == "cuda.bindings.nvjitlink" + assert probe_function is None + return object() + + monkeypatch.setattr(_linker, "_optional_cuda_import", fake__optional_cuda_import) + monkeypatch.setattr(_linker, "_nvjitlink_has_version_symbol", lambda _nvjitlink: True) + + use_driver_backend = _linker._decide_nvjitlink_or_driver() + + assert use_driver_backend is False + assert _linker._use_nvjitlink_backend is True + + +@pytest.mark.agent_authored(model="grok-4.5") +def test_decide_nvjitlink_or_driver_does_not_call_version(monkeypatch): + """Regression guard for #2408: must not call module.version().""" + called = {"version": False, "inspect": False} + + class FakeModule: + def version(self): + called["version"] = True + raise AssertionError("module.version() must not be used for nvJitLink probing") + + def fake_has_version(_nvjitlink): + called["inspect"] = True + return True + + def fake__optional_cuda_import(modname, probe_function=None): + assert modname == "cuda.bindings.nvjitlink" + assert probe_function is None + return FakeModule() + + monkeypatch.setattr(_linker, "_optional_cuda_import", fake__optional_cuda_import) + monkeypatch.setattr(_linker, "_nvjitlink_has_version_symbol", fake_has_version) + + assert _linker._decide_nvjitlink_or_driver() is False + assert called["inspect"] is True + assert called["version"] is False diff --git a/cuda_core/tests/test_program.py b/cuda_core/tests/test_program.py index a9dc4966346..28465425c0e 100644 --- a/cuda_core/tests/test_program.py +++ b/cuda_core/tests/test_program.py @@ -351,6 +351,16 @@ def test_program_init_invalid_code_format(): Program(code, "c++") +# arch is passed explicitly so the current device is not queried. +@pytest.mark.agent_authored(model="claude-opus-5") +@pytest.mark.parametrize("name", [None, "my_program"]) +def test_program_options_name_accepts_none(name): + options = ProgramOptions(name=name, arch="sm_90") + expected = "default_program" if name is None else name + assert options.name == expected + assert options._name == expected.encode() + + # This is tested against the current device's arch def test_program_compile_valid_target_type(init_cuda): code = 'extern "C" __global__ void my_kernel() {}' diff --git a/cuda_core/tests/test_program_cache.py b/cuda_core/tests/test_program_cache.py index c305562dcba..a8d3fc85f7e 100644 --- a/cuda_core/tests/test_program_cache.py +++ b/cuda_core/tests/test_program_cache.py @@ -3,6 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 import abc +import os import time import pytest @@ -2535,3 +2536,40 @@ def reader(tid: int) -> None: # Internal accounting must agree with the cap and with __len__. assert cache._total_bytes <= 4096 assert len(cache) == len(cache._entries) # no orphan entries + + +@pytest.mark.skipif(os.name == "nt", reason="POSIX permission bits only") +def test_program_cache_tmp_dir_created_owner_only(tmp_path): + """``tmp`` stages in-flight compiled device code before the atomic rename into + ``entries``, so it must be created owner-only (0o700) regardless of the inherited + umask. ``root``/``entries`` intentionally inherit the umask to keep deliberately + shared caches working (PR #2399 review), so only ``tmp`` is asserted.""" + import stat + + from cuda.core.utils._program_cache._file_stream import FileStreamProgramCache + + root = tmp_path / "pc" + FileStreamProgramCache(path=root) + + mode = stat.S_IMODE(os.stat(root / "tmp").st_mode) + assert mode == 0o700, f"tmp has mode {oct(mode)}" + + +@pytest.mark.skipif(os.name == "nt", reason="POSIX permission bits only") +def test_program_cache_preexisting_shared_root_used_as_is(tmp_path): + """PR #2399 review: a deliberately shared cache root (e.g. group-writable on a + compute cluster) must be used as-is, not re-tightened. Only ``tmp`` is forced + owner-only; ``root`` keeps whatever permissions it was created with.""" + import stat + + from cuda.core.utils._program_cache._file_stream import FileStreamProgramCache + + root = tmp_path / "pc" + root.mkdir() + # Simulate an intentionally shared cache directory. + os.chmod(root, 0o777) # noqa: S103 + + FileStreamProgramCache(path=root) + + assert stat.S_IMODE(os.stat(root).st_mode) == 0o777 + assert stat.S_IMODE(os.stat(root / "tmp").st_mode) == 0o700 diff --git a/cuda_core/tests/test_stream.py b/cuda_core/tests/test_stream.py index 49e372c9d53..55f34bbc9ec 100644 --- a/cuda_core/tests/test_stream.py +++ b/cuda_core/tests/test_stream.py @@ -303,3 +303,169 @@ def test_default_stream_consistency(init_cuda): # Should be same object (or at least equal) assert default1 == default2 assert hash(default1) == hash(default2) + + +class _BadStreamProtocol: + """Object whose __cuda_stream__ (a method) returns a malformed value.""" + + def __init__(self, value): + self._value = value + + def __cuda_stream__(self): + return self._value + + +class _AttrStreamProtocol: + """Object implementing __cuda_stream__ as an attribute (deprecated form) + rather than a method; the tuple length is wrong so resolution stops before + any GPU work.""" + + __cuda_stream__ = (0, 1, 2) + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_stream_init_rejects_obj_and_options(): + """Stream._init rejects supplying both a foreign object and options.""" + from cuda.core._stream import Stream + + with pytest.raises(ValueError, match="obj and options cannot be both specified"): + Stream._init(obj=_BadStreamProtocol((0, 0)), options=StreamOptions()) + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +@pytest.mark.parametrize( + "value,match", + [ + ((0, 1, 2), "must return a sequence with 2 elements"), # wrong length + (5, "must return a sequence with 2 elements"), # not a sequence + ((1, 123), r"first element of the sequence.*must be 0"), # bad version + ], +) +def test_stream_init_rejects_bad_cuda_stream_protocol(value, match): + """A foreign object whose __cuda_stream__ returns a malformed value is + rejected before any handle is created.""" + from cuda.core._stream import Stream + + with pytest.raises(RuntimeError, match=match): + Stream._init(obj=_BadStreamProtocol(value)) + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_stream_init_warns_on_attribute_cuda_stream_protocol(): + """Implementing __cuda_stream__ as an attribute (not a method) is deprecated: + resolution emits a DeprecationWarning and then still rejects the malformed + (wrong-length) value with a RuntimeError.""" + from cuda.core._stream import Stream + + with ( + pytest.warns(DeprecationWarning, match="must be implemented as a method"), + pytest.raises(RuntimeError, match="must return a sequence with 2 elements"), + ): + Stream._init(obj=_AttrStreamProtocol()) + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_stream_init_from_existing_stream_object(init_cuda): + """Passing an existing Stream as the foreign object yields a borrowed stream over the same handle.""" + from cuda.core._stream import Stream + + src = Device().create_stream(options=StreamOptions()) + borrowed = Stream._init(obj=src) + assert int(borrowed.handle) == int(src.handle) + borrowed.close() + src.close() + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +def test_stream_from_handle_lazy_flag_and_priority_queries(init_cuda): + """A from_handle stream reports is_nonblocking and priority read back from the + driver (matching the source stream), not the constructor defaults.""" + from cuda.core._stream import Stream + + # priority=-1 (not the default 0) so the value proves the driver was actually queried. + real = Device().create_stream(options=StreamOptions(nonblocking=True, priority=-1)) + wrapped = Stream.from_handle(int(real.handle)) + assert wrapped.is_nonblocking is True + assert wrapped.priority == -1 + wrapped.close() + real.close() + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +@pytest.mark.thread_unsafe( + reason="mutates the process-global CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM env var that default_stream() reads live" +) +def test_default_stream_per_thread_when_env_set(monkeypatch): + """default_stream() returns the per-thread default stream when + CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM is set to a nonzero value, and the + legacy default stream otherwise.""" + from cuda.core._stream import default_stream + + monkeypatch.setenv("CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM", "1") + assert default_stream() is PER_THREAD_DEFAULT_STREAM + monkeypatch.delenv("CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM", raising=False) + assert default_stream() is LEGACY_DEFAULT_STREAM + + +def _skip_unless_multi_gpu(): + from cuda.core import system + + if system.get_num_devices() < 2: + pytest.skip("requires 2+ GPUs") + + +@pytest.mark.agent_authored(model="claude-opus-5") +@pytest.mark.parametrize("stream", [LEGACY_DEFAULT_STREAM, PER_THREAD_DEFAULT_STREAM]) +def test_default_stream_follows_current_context(stream): + """A default-stream token denotes whatever context is current, so its + queries follow a context switch instead of reporting the first context + they ever saw (issue #2485).""" + _skip_unless_multi_gpu() + + for device_id in (0, 1, 0): + dev = Device(device_id) + dev.set_current() + assert stream.device.device_id == device_id + assert stream.context == dev.context + assert stream.record().context == dev.context + # Exercise Stream.resources and check it tracks the same context + # resolution as .context (issue #2485). + assert stream.resources.sm.sm_count == stream.context.resources.sm.sm_count + assert stream.resources.sm.sm_count == dev.resources.sm.sm_count + + +@pytest.mark.agent_authored(model="claude-opus-5") +def test_default_stream_first_touch_does_not_pin_context(): + """Any query resolves the context, including repr(), so logging a default + stream must not bind the singleton to whichever context happened to be + current at the time (issue #2485).""" + _skip_unless_multi_gpu() + + Device(1).set_current() + repr(LEGACY_DEFAULT_STREAM) + + dev0 = Device(0) + dev0.set_current() + assert LEGACY_DEFAULT_STREAM.device.device_id == 0 + assert LEGACY_DEFAULT_STREAM.context == dev0.context + + +@pytest.mark.agent_authored(model="claude-opus-5") +def test_created_stream_keeps_its_own_context(): + """A created stream has a context fixed at creation and keeps reporting it + across a switch; only default-stream tokens follow the current context + (issue #2485).""" + _skip_unless_multi_gpu() + + dev0 = Device(0) + dev0.set_current() + stream = dev0.create_stream() + assert stream.context == dev0.context + + try: + Device(1).set_current() + assert stream.device.device_id == 0 + assert stream.context == dev0.context + finally: + dev0.set_current() + stream.close() diff --git a/cuda_core/tests/test_tensor_map.py b/cuda_core/tests/test_tensor_map.py index 7abbaadb483..6f63938710f 100644 --- a/cuda_core/tests/test_tensor_map.py +++ b/cuda_core/tests/test_tensor_map.py @@ -3,8 +3,8 @@ import numpy as np import pytest - from conftest import create_managed_memory_resource_or_skip, skip_if_managed_memory_unsupported + from cuda.core import ( Device, ManagedMemoryResourceOptions, @@ -20,7 +20,9 @@ TensorMapL2Promotion, TensorMapOOBFill, TensorMapSwizzle, + _coerce_tensor_map_descriptor_options, _require_view_device, + _resolve_data_type, ) from cuda.core.utils import StridedMemoryView @@ -649,3 +651,67 @@ def test_from_im2col_wide_rank_validation(self, dev, skip_if_no_im2col_wide): pixels_per_column=4, data_type=TensorMapDataType.FLOAT32, ) + + +class _DtypeView: + """Minimal stand-in for a StridedMemoryView exposing only ``.dtype``. + + ``_resolve_data_type`` reads nothing else off the view, so this keeps the + host-only tests free of any GPU allocation. + """ + + def __init__(self, dtype): + self.dtype = dtype + + +@pytest.mark.agent_authored(model="claude-opus-4.8") +class TestTensorMapHelpers: + """Host-only coverage for the arg-marshalling helpers' input-validation branches. + + The happy-path normalize/coerce/resolve/stride cases are covered by the TMA + factory-method tests above once they run on TMA-capable hardware (e.g. the H200 + coverage runner). Only the rejection branches those tests never hit — real + devices never feed bad inputs — are pinned here. + """ + + # Rejected by the public TensorMapDescriptorOptions(...) constructor, whose + # __post_init__ runs the normalize/require-enum helpers. + @pytest.mark.parametrize( + ("kwargs", "match"), + [ + (dict(box_dim=5), "box_dim must be a tuple of ints"), + (dict(box_dim=(1, "x", 3)), r"box_dim\[1\] must be an int"), + (dict(box_dim=(32,), swizzle=2), "swizzle must be a TensorMapSwizzle"), + (dict(box_dim=(32,), interleave=0), "interleave must be a TensorMapInterleave"), + ], + ids=["box_dim_non_iterable", "box_dim_non_int_element", "swizzle_wrong_type", "interleave_wrong_type"], + ) + def test_options_rejects_invalid(self, kwargs, match): + with pytest.raises(TypeError, match=match): + TensorMapDescriptorOptions(**kwargs) + + @pytest.mark.parametrize( + ("view_dtype", "data_type", "match"), + [ + (None, np.complex128, "Unsupported dtype"), # explicit unsupported dtype + (None, None, "Cannot infer TMA data type"), # nothing to infer from + (np.dtype(np.complex64), None, "Unsupported dtype"), # view's dtype unsupported + ], + ids=["explicit_unsupported", "cannot_infer", "view_dtype_unsupported"], + ) + def test_resolve_data_type_rejects(self, view_dtype, data_type, match): + with pytest.raises(ValueError, match=match): + _resolve_data_type(_DtypeView(view_dtype), data_type) + + def test_coerce_requires_box_dim_without_options(self): + with pytest.raises(TypeError, match="box_dim is required unless options is provided"): + _coerce_tensor_map_descriptor_options( + None, + None, + element_strides=None, + data_type=None, + interleave=TensorMapInterleave.NONE, + swizzle=TensorMapSwizzle.NONE, + l2_promotion=TensorMapL2Promotion.NONE, + oob_fill=TensorMapOOBFill.NONE, + ) diff --git a/cuda_core/tests/test_utils.py b/cuda_core/tests/test_utils.py index ebee8d87b04..c0dffc5a323 100644 --- a/cuda_core/tests/test_utils.py +++ b/cuda_core/tests/test_utils.py @@ -3,6 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 import ctypes +import functools import math # TODO: replace optional imports with pytest.importorskip @@ -26,7 +27,7 @@ ml_dtypes = None import numpy as np import pytest -from helpers.marks import requires_module +from cuda_python_test_helpers.marks import requires_module from cuda.core import Device from cuda.core._dlpack import DLDeviceType @@ -676,20 +677,26 @@ def test_from_array_interface_unsupported_strides(init_cuda): StridedMemoryView.from_array_interface(b) -def _make_cuda_array_interface_obj(*, shape, strides, typestr=" str | Non seen.add(directory) candidate = os.path.join(directory, normalized_name) if _is_executable_candidate(candidate): - return candidate + # Return an absolute path, as the docstring promises (a relative + # search dir would otherwise leak a relative result). + return os.path.abspath(candidate) return None diff --git a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/descriptor_catalog.py b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/descriptor_catalog.py index a26862c5435..e39046eec70 100644 --- a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/descriptor_catalog.py +++ b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/descriptor_catalog.py @@ -6,11 +6,53 @@ from __future__ import annotations from dataclasses import dataclass +from pathlib import PurePosixPath from typing import Literal from cuda.pathfinder._utils.ctk_root_canary import CTK_ROOT_CANARY_ANCHOR_LIBNAMES PackagedWith = Literal["ctk", "other", "driver"] +WindowsArch = Literal["x64", "arm64"] + + +@dataclass(frozen=True, slots=True) +class WindowsSearchDirs: + """Ordered Windows search locations grouped by process architecture.""" + + x64: tuple[str, ...] = () + arm64: tuple[str, ...] = () + + @classmethod + def x64_only(cls, *paths: str) -> WindowsSearchDirs: + return cls(x64=paths) + + @classmethod + def arm64_only(cls, *paths: str) -> WindowsSearchDirs: + return cls(arm64=paths) + + def for_arch(self, target_arch: str) -> tuple[str, ...]: + if target_arch == "x64": + return self.x64 + if target_arch == "arm64": + return self.arm64 + raise ValueError(f"Unsupported Windows target architecture: {target_arch!r}") + + +# Windows CTK before 13.4 was x64-only and used the common bin directory. +# Native ARM64 support starts with the architecture-qualified 13.4 layout. +DEFAULT_WINDOWS_CTK_ANCHOR_DIRS = WindowsSearchDirs( + x64=("bin/x64", "bin"), + arm64=("bin/arm64",), +) + + +def _ctk_windows_wheel_dirs(cuda13_bin_dir: str, cuda12_dir: str) -> WindowsSearchDirs: + """Search CUDA 13 first, with the x64-only CUDA 12 wheel as an x64 fallback.""" + cuda13_bin_path = PurePosixPath(cuda13_bin_dir) + return WindowsSearchDirs( + x64=((cuda13_bin_path / "x86_64").as_posix(), cuda12_dir), + arm64=((cuda13_bin_path / "arm64").as_posix(),), + ) @dataclass(frozen=True, slots=True) @@ -19,14 +61,16 @@ class DescriptorSpec: packaged_with: PackagedWith linux_sonames: tuple[str, ...] = () windows_dlls: tuple[str, ...] = () + supported_windows_arch: tuple[WindowsArch, ...] = () site_packages_linux: tuple[str, ...] = () - site_packages_windows: tuple[str, ...] = () + site_packages_windows: WindowsSearchDirs = WindowsSearchDirs() dependencies: tuple[str, ...] = () anchor_rel_dirs_linux: tuple[str, ...] = ("lib64", "lib") - anchor_rel_dirs_windows: tuple[str, ...] = ("bin/x64", "bin") + anchor_rel_dirs_windows: WindowsSearchDirs = DEFAULT_WINDOWS_CTK_ANCHOR_DIRS ctk_root_canary_anchor_libnames: tuple[str, ...] = () requires_add_dll_directory: bool = False requires_rtld_deepbind: bool = False + requires_windows_binary_arch_check: bool = False DESCRIPTOR_CATALOG: tuple[DescriptorSpec, ...] = ( @@ -38,32 +82,36 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libcudart.so.12", "libcudart.so.13"), windows_dlls=("cudart64_12.dll", "cudart64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cuda_runtime/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cuda_runtime/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cuda_runtime/bin"), ), DescriptorSpec( name="nvfatbin", packaged_with="ctk", linux_sonames=("libnvfatbin.so.12", "libnvfatbin.so.13"), windows_dlls=("nvfatbin_120_0.dll", "nvfatbin_130_0.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/nvfatbin/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/nvfatbin/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/nvfatbin/bin"), ), DescriptorSpec( name="nvJitLink", packaged_with="ctk", linux_sonames=("libnvJitLink.so.12", "libnvJitLink.so.13"), windows_dlls=("nvJitLink_120_0.dll", "nvJitLink_130_0.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/nvjitlink/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/nvjitlink/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/nvjitlink/bin"), ), DescriptorSpec( name="nvrtc", packaged_with="ctk", linux_sonames=("libnvrtc.so.12", "libnvrtc.so.13"), windows_dlls=("nvrtc64_120_0.dll", "nvrtc64_130_0.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cuda_nvrtc/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cuda_nvrtc/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cuda_nvrtc/bin"), requires_add_dll_directory=True, ), DescriptorSpec( @@ -71,19 +119,31 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnvvm.so.4",), windows_dlls=("nvvm64.dll", "nvvm64_40_0.dll", "nvvm70.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cuda_nvcc/nvvm/lib64"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cuda_nvcc/nvvm/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cuda_nvcc/nvvm/bin"), anchor_rel_dirs_linux=("nvvm/lib64",), - anchor_rel_dirs_windows=("nvvm/bin/*", "nvvm/bin"), + # CTK 13.4 installs the ARM64 DLL directly in nvvm/bin, while x64 + # uses nvvm/bin/x64. Older x64 toolkits also used nvvm/bin, so the + # binary in the unqualified directory must be checked at runtime. + anchor_rel_dirs_windows=WindowsSearchDirs( + x64=("nvvm/bin/x64", "nvvm/bin"), + arm64=("nvvm/bin",), + ), ctk_root_canary_anchor_libnames=CTK_ROOT_CANARY_ANCHOR_LIBNAMES, + # requires_windows_binary_arch_check disambiguates pre-13.4 x64 DLLs + # from 13.4+ Arm64 DLLs in nvvm/bin; see + # _utils/windows_arch.py for the validation. + requires_windows_binary_arch_check=True, ), DescriptorSpec( name="cublas", packaged_with="ctk", linux_sonames=("libcublas.so.12", "libcublas.so.13"), windows_dlls=("cublas64_12.dll", "cublas64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cublas/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cublas/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cublas/bin"), dependencies=("cublasLt",), ), DescriptorSpec( @@ -91,16 +151,18 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libcublasLt.so.12", "libcublasLt.so.13"), windows_dlls=("cublasLt64_12.dll", "cublasLt64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cublas/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cublas/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cublas/bin"), ), DescriptorSpec( name="cufft", packaged_with="ctk", linux_sonames=("libcufft.so.11", "libcufft.so.12"), windows_dlls=("cufft64_11.dll", "cufft64_12.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cufft/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cufft/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cufft/bin"), requires_add_dll_directory=True, ), DescriptorSpec( @@ -108,8 +170,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libcufftw.so.11", "libcufftw.so.12"), windows_dlls=("cufftw64_11.dll", "cufftw64_12.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cufft/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cufft/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cufft/bin"), dependencies=("cufft",), ), DescriptorSpec( @@ -117,16 +180,18 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libcurand.so.10",), windows_dlls=("curand64_10.dll",), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/curand/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/curand/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/curand/bin"), ), DescriptorSpec( name="cusolver", packaged_with="ctk", linux_sonames=("libcusolver.so.11", "libcusolver.so.12"), windows_dlls=("cusolver64_11.dll", "cusolver64_12.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cusolver/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cusolver/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cusolver/bin"), dependencies=("nvJitLink", "cusparse", "cublasLt", "cublas"), ), DescriptorSpec( @@ -134,8 +199,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libcusolverMg.so.11", "libcusolverMg.so.12"), windows_dlls=("cusolverMg64_11.dll", "cusolverMg64_12.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cusolver/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cusolver/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cusolver/bin"), dependencies=("nvJitLink", "cublasLt", "cublas"), ), DescriptorSpec( @@ -143,8 +209,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libcusparse.so.12",), windows_dlls=("cusparse64_12.dll",), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cusparse/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cusparse/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cusparse/bin"), dependencies=("nvJitLink",), ), DescriptorSpec( @@ -152,16 +219,18 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnppc.so.12", "libnppc.so.13"), windows_dlls=("nppc64_12.dll", "nppc64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/npp/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/npp/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/npp/bin"), ), DescriptorSpec( name="nppial", packaged_with="ctk", linux_sonames=("libnppial.so.12", "libnppial.so.13"), windows_dlls=("nppial64_12.dll", "nppial64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/npp/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/npp/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/npp/bin"), dependencies=("nppc",), ), DescriptorSpec( @@ -169,8 +238,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnppicc.so.12", "libnppicc.so.13"), windows_dlls=("nppicc64_12.dll", "nppicc64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/npp/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/npp/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/npp/bin"), dependencies=("nppc",), ), DescriptorSpec( @@ -178,8 +248,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnppidei.so.12", "libnppidei.so.13"), windows_dlls=("nppidei64_12.dll", "nppidei64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/npp/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/npp/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/npp/bin"), dependencies=("nppc",), ), DescriptorSpec( @@ -187,8 +258,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnppif.so.12", "libnppif.so.13"), windows_dlls=("nppif64_12.dll", "nppif64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/npp/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/npp/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/npp/bin"), dependencies=("nppc",), ), DescriptorSpec( @@ -196,8 +268,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnppig.so.12", "libnppig.so.13"), windows_dlls=("nppig64_12.dll", "nppig64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/npp/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/npp/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/npp/bin"), dependencies=("nppc",), ), DescriptorSpec( @@ -205,8 +278,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnppim.so.12", "libnppim.so.13"), windows_dlls=("nppim64_12.dll", "nppim64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/npp/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/npp/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/npp/bin"), dependencies=("nppc",), ), DescriptorSpec( @@ -214,8 +288,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnppist.so.12", "libnppist.so.13"), windows_dlls=("nppist64_12.dll", "nppist64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/npp/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/npp/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/npp/bin"), dependencies=("nppc",), ), DescriptorSpec( @@ -223,8 +298,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnppisu.so.12", "libnppisu.so.13"), windows_dlls=("nppisu64_12.dll", "nppisu64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/npp/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/npp/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/npp/bin"), dependencies=("nppc",), ), DescriptorSpec( @@ -232,8 +308,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnppitc.so.12", "libnppitc.so.13"), windows_dlls=("nppitc64_12.dll", "nppitc64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/npp/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/npp/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/npp/bin"), dependencies=("nppc",), ), DescriptorSpec( @@ -241,8 +318,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnpps.so.12", "libnpps.so.13"), windows_dlls=("npps64_12.dll", "npps64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/npp/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/npp/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/npp/bin"), dependencies=("nppc",), ), DescriptorSpec( @@ -250,8 +328,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnvblas.so.12", "libnvblas.so.13"), windows_dlls=("nvblas64_12.dll", "nvblas64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cublas/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cublas/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cublas/bin"), dependencies=("cublas", "cublasLt"), ), DescriptorSpec( @@ -259,8 +338,9 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libnvjpeg.so.12", "libnvjpeg.so.13"), windows_dlls=("nvjpeg64_12.dll", "nvjpeg64_13.dll"), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/nvjpeg/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/nvjpeg/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/nvjpeg/bin"), ), DescriptorSpec( name="cufile", @@ -290,10 +370,16 @@ class DescriptorSpec: "cupti64_2023.1.1.dll", "cupti64_2022.4.1.dll", ), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cuda_cupti/lib"), - site_packages_windows=("nvidia/cu13/bin/x86_64", "nvidia/cuda_cupti/bin"), + site_packages_windows=_ctk_windows_wheel_dirs("nvidia/cu13/bin", "nvidia/cuda_cupti/bin"), anchor_rel_dirs_linux=("extras/CUPTI/lib64", "lib"), - anchor_rel_dirs_windows=("extras/CUPTI/lib64", "bin"), + # CTK 13.4 uses architecture-qualified CUPTI directories. Older + # Windows CUPTI toolkits were x64-only and used extras/CUPTI/lib64. + anchor_rel_dirs_windows=WindowsSearchDirs( + x64=("extras/CUPTI/lib/x64", "extras/CUPTI/lib64", "bin"), + arm64=("extras/CUPTI/lib/arm64",), + ), ctk_root_canary_anchor_libnames=CTK_ROOT_CANARY_ANCHOR_LIBNAMES, ), DescriptorSpec( @@ -301,12 +387,11 @@ class DescriptorSpec: packaged_with="ctk", linux_sonames=("libcudla.so.1",), windows_dlls=("cudla.dll",), + supported_windows_arch=("arm64",), site_packages_linux=("nvidia/cu13/lib",), # No Windows pip wheel ships cudla.dll today; it is loaded from the local # CUDA Toolkit only, so site_packages_windows is intentionally left empty. - # The Windows CUDA Toolkit ships cudla.dll under per-architecture bin - # subdirs (e.g. bin/arm64 on N1X); search those ahead of the defaults. - anchor_rel_dirs_windows=("bin/arm64", "bin/x64", "bin"), + anchor_rel_dirs_windows=WindowsSearchDirs.arm64_only("bin/arm64"), ), # ----------------------------------------------------------------------- # Third-party / separately packaged libraries @@ -338,8 +423,12 @@ class DescriptorSpec: packaged_with="other", linux_sonames=("libmathdx.so.0",), windows_dlls=("mathdx64_0.dll",), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cu12/lib"), - site_packages_windows=("nvidia/cu13/bin", "nvidia/cu12/bin"), + site_packages_windows=WindowsSearchDirs( + x64=("nvidia/cu13/bin", "nvidia/cu12/bin"), + arm64=("nvidia/cu13/bin", "nvidia/cu12/bin"), + ), dependencies=("nvrtc",), ), DescriptorSpec( @@ -347,8 +436,12 @@ class DescriptorSpec: packaged_with="other", linux_sonames=("libcudss.so.0",), windows_dlls=("cudss64_0.dll",), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cu12/lib"), - site_packages_windows=("nvidia/cu13/bin", "nvidia/cu12/bin"), + site_packages_windows=WindowsSearchDirs( + x64=("nvidia/cu13/bin", "nvidia/cu12/bin"), + arm64=("nvidia/cu13/bin", "nvidia/cu12/bin"), + ), dependencies=("cublas", "cublasLt"), ), DescriptorSpec( @@ -356,16 +449,21 @@ class DescriptorSpec: packaged_with="other", linux_sonames=("libcusparseLt.so.0",), windows_dlls=("cusparseLt.dll",), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("nvidia/cu13/lib", "nvidia/cusparselt/lib"), - site_packages_windows=("nvidia/cu13/bin/x64", "nvidia/cusparselt/bin"), + site_packages_windows=WindowsSearchDirs( + x64=("nvidia/cu13/bin/x64", "nvidia/cusparselt/bin"), + arm64=("nvidia/cu13/bin/arm64",), + ), ), DescriptorSpec( name="cutensor", packaged_with="other", linux_sonames=("libcutensor.so.2",), windows_dlls=("cutensor.dll",), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("cutensor/lib",), - site_packages_windows=("cutensor/bin",), + site_packages_windows=WindowsSearchDirs(x64=("cutensor/bin",), arm64=("cutensor/bin",)), dependencies=("cublasLt",), ), DescriptorSpec( @@ -373,8 +471,9 @@ class DescriptorSpec: packaged_with="other", linux_sonames=("libcutensorMg.so.2",), windows_dlls=("cutensorMg.dll",), + supported_windows_arch=("x64", "arm64"), site_packages_linux=("cutensor/lib",), - site_packages_windows=("cutensor/bin",), + site_packages_windows=WindowsSearchDirs(x64=("cutensor/bin",), arm64=("cutensor/bin",)), dependencies=("cutensor", "cublasLt"), ), DescriptorSpec( @@ -452,6 +551,7 @@ class DescriptorSpec: packaged_with="driver", linux_sonames=("libcuda.so.1",), windows_dlls=("nvcuda.dll",), + supported_windows_arch=("x64", "arm64"), ), DescriptorSpec( name="nvcudla", @@ -463,5 +563,6 @@ class DescriptorSpec: packaged_with="driver", linux_sonames=("libnvidia-ml.so.1",), windows_dlls=("nvml.dll",), + supported_windows_arch=("x64", "arm64"), ), ) diff --git a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_dl_linux.py b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_dl_linux.py index 10a92c20830..24d4d67c9e2 100644 --- a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_dl_linux.py +++ b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_dl_linux.py @@ -1,4 +1,4 @@ -# 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 from __future__ import annotations @@ -7,6 +7,7 @@ import ctypes import ctypes.util import os +import sys from typing import TYPE_CHECKING, cast from cuda.pathfinder._dynamic_libs.load_dl_common import LoadedDL @@ -14,7 +15,10 @@ if TYPE_CHECKING: from cuda.pathfinder._dynamic_libs.lib_descriptor import LibDescriptor -CDLL_MODE = os.RTLD_NOW | os.RTLD_GLOBAL +if sys.platform == "linux": + CDLL_MODE = os.RTLD_NOW | os.RTLD_GLOBAL +else: + CDLL_MODE = 0 def _load_libdl() -> ctypes.CDLL: @@ -132,27 +136,35 @@ def _candidate_sonames(desc: LibDescriptor) -> list[str]: return candidates -def check_if_already_loaded_from_elsewhere(desc: LibDescriptor, _have_abs_path: bool) -> LoadedDL | None: - for soname in _candidate_sonames(desc): - try: - handle = ctypes.CDLL(soname, mode=os.RTLD_NOLOAD) - except OSError: - continue - else: - return LoadedDL( - abs_path_for_dynamic_library(desc.name, handle), - True, - handle._handle, - "was-already-loaded-from-elsewhere", - ) - return None - - -def _load_lib(desc: LibDescriptor, filename: str) -> ctypes.CDLL: - cdll_mode = CDLL_MODE - if desc.requires_rtld_deepbind: - cdll_mode |= os.RTLD_DEEPBIND - return ctypes.CDLL(filename, cdll_mode) +if sys.platform == "linux": + + def check_if_already_loaded_from_elsewhere(desc: LibDescriptor, _have_abs_path: bool) -> LoadedDL | None: + for soname in _candidate_sonames(desc): + try: + handle = ctypes.CDLL(soname, mode=os.RTLD_NOLOAD) + except OSError: + continue + else: + return LoadedDL( + abs_path_for_dynamic_library(desc.name, handle), + True, + handle._handle, + "was-already-loaded-from-elsewhere", + ) + return None + + def _load_lib(desc: LibDescriptor, filename: str) -> ctypes.CDLL: + cdll_mode = CDLL_MODE + if desc.requires_rtld_deepbind: + cdll_mode |= os.RTLD_DEEPBIND + return ctypes.CDLL(filename, cdll_mode) +else: + + def check_if_already_loaded_from_elsewhere(_desc: LibDescriptor, _have_abs_path: bool) -> LoadedDL | None: + raise RuntimeError(f"check_if_already_loaded_from_elsewhere() is not supported on platform {sys.platform!r}") + + def _load_lib(_desc: LibDescriptor, _filename: str) -> ctypes.CDLL: + raise RuntimeError(f"_load_lib() is not supported on platform {sys.platform!r}") def load_with_system_search(desc: LibDescriptor) -> LoadedDL | None: diff --git a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_dl_windows.py b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_dl_windows.py index 5069a624790..e9cfbb52366 100644 --- a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_dl_windows.py +++ b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_dl_windows.py @@ -1,4 +1,4 @@ -# 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 from __future__ import annotations @@ -7,6 +7,8 @@ import ctypes.wintypes import os import struct +import sys +import warnings from typing import TYPE_CHECKING from cuda.pathfinder._dynamic_libs.load_dl_common import LoadedDL @@ -21,7 +23,10 @@ POINTER_ADDRESS_SPACE = 2 ** (struct.calcsize("P") * 8) # Set up kernel32 functions with proper types -kernel32 = ctypes.windll.kernel32 # type: ignore[attr-defined] +windll = getattr(ctypes, "windll", None) +if windll is None: + raise RuntimeError("ctypes.windll is required on Windows") +kernel32 = windll.kernel32 # GetModuleHandleW kernel32.GetModuleHandleW.argtypes = [ctypes.wintypes.LPCWSTR] @@ -43,9 +48,10 @@ ] kernel32.GetModuleFileNameW.restype = ctypes.wintypes.DWORD -# AddDllDirectory (Windows 7+) -kernel32.AddDllDirectory.argtypes = [ctypes.wintypes.LPCWSTR] -kernel32.AddDllDirectory.restype = ctypes.c_void_p # DLL_DIRECTORY_COOKIE + +# GetLastError +kernel32.GetLastError.argtypes = [] +kernel32.GetLastError.restype = ctypes.wintypes.DWORD def ctypes_handle_to_unsigned_int(handle: ctypes.wintypes.HMODULE) -> int: @@ -69,10 +75,24 @@ def add_dll_directory(dll_abs_path: str) -> None: dirpath = os.path.dirname(dll_abs_path) assert os.path.isdir(dirpath), dll_abs_path - # Add the DLL directory to the native search path. AddDllDirectory only - # affects the LOAD_LIBRARY_SEARCH_USER_DIRS search; PATH is updated - # unconditionally below to also cover legacy dependent-DLL resolution. - kernel32.AddDllDirectory(dirpath) + # Add the DLL directory to the native search path via the stdlib wrapper + # around AddDllDirectory. This only affects the LOAD_LIBRARY_SEARCH_USER_DIRS + # search; PATH is updated unconditionally below to also cover legacy + # dependent-DLL resolution. The returned handle is intentionally discarded: + # the directory must stay on the search path for the process lifetime, and + # the handle has no finalizer, so dropping it does not remove the directory. + try: + if sys.platform == "win32": + os.add_dll_directory(dirpath) + except OSError as e: + # Warn instead of failing silently; the PATH update below is a weaker + # fallback that newer loaders may ignore. + warnings.warn( + f"os.add_dll_directory({dirpath!r}) failed ({e}); " + "falling back to process-global PATH mutation for dependent-DLL resolution.", + RuntimeWarning, + stacklevel=2, + ) # Update PATH as a fallback for dependent DLL resolution curr_path = os.environ.get("PATH") @@ -86,7 +106,7 @@ def abs_path_for_dynamic_library(libname: str, handle: ctypes.wintypes.HMODULE) length = kernel32.GetModuleFileNameW(handle, buffer, len(buffer)) if length == 0: - error_code = ctypes.GetLastError() # type: ignore[attr-defined] + error_code = kernel32.GetLastError() raise RuntimeError(f"GetModuleFileNameW failed for {libname!r} (error code: {error_code})") # If buffer was too small, try with larger buffer @@ -94,7 +114,7 @@ def abs_path_for_dynamic_library(libname: str, handle: ctypes.wintypes.HMODULE) buffer = ctypes.create_unicode_buffer(32768) # Extended path length length = kernel32.GetModuleFileNameW(handle, buffer, len(buffer)) if length == 0: - error_code = ctypes.GetLastError() # type: ignore[attr-defined] + error_code = kernel32.GetLastError() raise RuntimeError(f"GetModuleFileNameW failed for {libname!r} (error code: {error_code})") return buffer.value @@ -160,7 +180,7 @@ def load_with_abs_path(desc: LibDescriptor, found_path: str, found_via: str | No handle = kernel32.LoadLibraryExW(found_path, None, flags) if not handle: - error_code = ctypes.GetLastError() # type: ignore[attr-defined] + error_code = kernel32.GetLastError() raise RuntimeError(f"Failed to load DLL at {found_path}: Windows error {error_code}") return LoadedDL(found_path, False, ctypes_handle_to_unsigned_int(handle), found_via) diff --git a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_nvidia_dynamic_lib.py b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_nvidia_dynamic_lib.py index 95a71825793..53446107da3 100644 --- a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_nvidia_dynamic_lib.py +++ b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/load_nvidia_dynamic_lib.py @@ -34,6 +34,7 @@ build_dynamic_lib_subprocess_command, parse_dynamic_lib_subprocess_payload, ) +from cuda.pathfinder._dynamic_libs.supported_nvidia_libs import ALL_AVAILABLE_LIBNAMES from cuda.pathfinder._utils.platform_aware import IS_WINDOWS if TYPE_CHECKING: @@ -42,9 +43,6 @@ # All libnames recognized by load_nvidia_dynamic_lib, across all categories # (CTK, third-party, driver). _ALL_KNOWN_LIBNAMES: frozenset[str] = frozenset(LIB_DESCRIPTORS) -_ALL_SUPPORTED_LIBNAMES: frozenset[str] = frozenset( - name for name, desc in LIB_DESCRIPTORS.items() if (desc.windows_dlls if IS_WINDOWS else desc.linux_sonames) -) _PLATFORM_NAME = "Windows" if IS_WINDOWS else "Linux" _CANARY_PROBE_TIMEOUT_SECONDS = 10.0 @@ -308,9 +306,9 @@ def load_nvidia_dynamic_lib(libname: str) -> LoadedDL: ) if libname not in _ALL_KNOWN_LIBNAMES: raise DynamicLibUnknownError(f"Unknown library name: {libname!r}. Known names: {sorted(_ALL_KNOWN_LIBNAMES)}") - if libname not in _ALL_SUPPORTED_LIBNAMES: + if libname not in ALL_AVAILABLE_LIBNAMES: raise DynamicLibNotAvailableError( f"Library name {libname!r} is known but not available on {_PLATFORM_NAME}. " - f"Supported names on {_PLATFORM_NAME}: {sorted(_ALL_SUPPORTED_LIBNAMES)}" + f"Supported names on {_PLATFORM_NAME}: {sorted(ALL_AVAILABLE_LIBNAMES)}" ) return _load_lib_no_cache(libname) diff --git a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/platform_loader.py b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/platform_loader.py index 9b108a57acc..64bf55efe3d 100644 --- a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/platform_loader.py +++ b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/platform_loader.py @@ -1,4 +1,4 @@ -# 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 """Platform loader seam for OS-specific dynamic linking. @@ -16,11 +16,11 @@ from __future__ import annotations +import sys from typing import Protocol from cuda.pathfinder._dynamic_libs.lib_descriptor import LibDescriptor from cuda.pathfinder._dynamic_libs.load_dl_common import LoadedDL -from cuda.pathfinder._utils.platform_aware import IS_WINDOWS class PlatformLoader(Protocol): @@ -31,7 +31,7 @@ def load_with_system_search(self, desc: LibDescriptor) -> LoadedDL | None: ... def load_with_abs_path(self, desc: LibDescriptor, found_path: str, found_via: str | None = None) -> LoadedDL: ... -if IS_WINDOWS: +if sys.platform == "win32": from cuda.pathfinder._dynamic_libs import load_dl_windows as _impl else: from cuda.pathfinder._dynamic_libs import load_dl_linux as _impl diff --git a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/search_platform.py b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/search_platform.py index 37fd6eb1700..2d6a5f016a7 100644 --- a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/search_platform.py +++ b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/search_platform.py @@ -14,12 +14,14 @@ import os from collections.abc import Sequence from dataclasses import dataclass +from pathlib import PurePath from typing import Protocol, cast from cuda.pathfinder._dynamic_libs.lib_descriptor import LibDescriptor from cuda.pathfinder._dynamic_libs.supported_nvidia_libs import is_suppressed_dll_file from cuda.pathfinder._utils.find_sub_dirs import find_sub_dirs_all_sitepackages from cuda.pathfinder._utils.platform_aware import IS_WINDOWS +from cuda.pathfinder._utils.windows_arch import windows_pe_matches_arch, windows_python_arch def _no_such_file_in_sub_dirs( @@ -41,7 +43,7 @@ def _find_so_in_rel_dirs( sub_dirs_searched: list[tuple[str, ...]] = [] file_wild = so_basename + "*" for rel_dir in rel_dirs: - sub_dir = tuple(rel_dir.split(os.path.sep)) + sub_dir = PurePath(rel_dir).parts for abs_dir in find_sub_dirs_all_sitepackages(sub_dir): # Exact unversioned match first; fall back to versioned names because some # distros only ship lib.so. (e.g. conda libcupti). Only one match @@ -61,12 +63,15 @@ def _find_so_in_rel_dirs( return None -def _find_dll_under_dir(dirpath: str, file_wild: str) -> str | None: +def _find_dll_under_dir(dirpath: str, file_wild: str, target_arch: str | None = None) -> str | None: for path in sorted(glob.glob(os.path.join(dirpath, file_wild))): if not os.path.isfile(path): continue - if not is_suppressed_dll_file(os.path.basename(path)): - return path + if is_suppressed_dll_file(os.path.basename(path)): + continue + if target_arch is not None and not windows_pe_matches_arch(path, target_arch): + continue + return path return None @@ -78,7 +83,7 @@ def _find_dll_in_rel_dirs( ) -> str | None: sub_dirs_searched: list[tuple[str, ...]] = [] for rel_dir in rel_dirs: - sub_dir = tuple(rel_dir.split(os.path.sep)) + sub_dir = PurePath(rel_dir).parts for abs_dir in find_sub_dirs_all_sitepackages(sub_dir): dll_name = _find_dll_under_dir(abs_dir, lib_searched_for) if dll_name is not None: @@ -109,7 +114,7 @@ def find_in_site_packages( def find_in_lib_dir( self, lib_dir: str, - libname: str, + desc: LibDescriptor, lib_searched_for: str, error_messages: list[str], attachments: list[str], @@ -142,7 +147,7 @@ def find_in_site_packages( def find_in_lib_dir( self, lib_dir: str, - _libname: str, + _desc: LibDescriptor, lib_searched_for: str, error_messages: list[str], attachments: list[str], @@ -173,17 +178,19 @@ def find_in_lib_dir( @dataclass(frozen=True, slots=True) class WindowsSearchPlatform: + target_arch: str + def lib_searched_for(self, libname: str) -> str: return f"{libname}*.dll" def site_packages_rel_dirs(self, desc: LibDescriptor) -> tuple[str, ...]: - return cast(tuple[str, ...], desc.site_packages_windows) + return cast(tuple[str, ...], desc.site_packages_windows.for_arch(self.target_arch)) def conda_anchor_point(self, conda_prefix: str) -> str: return os.path.join(conda_prefix, "Library") def anchor_rel_dirs(self, desc: LibDescriptor) -> tuple[str, ...]: - return cast(tuple[str, ...], desc.anchor_rel_dirs_windows) + return cast(tuple[str, ...], desc.anchor_rel_dirs_windows.for_arch(self.target_arch)) def find_in_site_packages( self, @@ -197,16 +204,20 @@ def find_in_site_packages( def find_in_lib_dir( self, lib_dir: str, - libname: str, + desc: LibDescriptor, _lib_searched_for: str, error_messages: list[str], attachments: list[str], ) -> str | None: - file_wild = libname + "*.dll" - dll_name = _find_dll_under_dir(lib_dir, file_wild) + file_wild = desc.name + "*.dll" + target_arch = self.target_arch if desc.requires_windows_binary_arch_check else None + dll_name = _find_dll_under_dir(lib_dir, file_wild, target_arch) if dll_name is not None: return dll_name - error_messages.append(f"No such file: {file_wild}") + if target_arch is None: + error_messages.append(f"No such file: {file_wild}") + else: + error_messages.append(f"No {target_arch}-compatible PE file: {file_wild}") attachments.append(f' listdir("{lib_dir}"):') if not os.path.isdir(lib_dir): attachments.append(" DIRECTORY DOES NOT EXIST") @@ -216,4 +227,10 @@ def find_in_lib_dir( return None -PLATFORM: SearchPlatform = WindowsSearchPlatform() if IS_WINDOWS else LinuxSearchPlatform() +def _platform_for_current_system() -> SearchPlatform: + if IS_WINDOWS: + return WindowsSearchPlatform(target_arch=windows_python_arch()) + return LinuxSearchPlatform() + + +PLATFORM = _platform_for_current_system() diff --git a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/search_steps.py b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/search_steps.py index 55d8a8aa674..5901094fcaa 100644 --- a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/search_steps.py +++ b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/search_steps.py @@ -88,7 +88,7 @@ def _find_using_lib_dir(ctx: SearchContext, lib_dir: str | None) -> str | None: str | None, ctx.platform.find_in_lib_dir( lib_dir, - ctx.libname, + ctx.desc, ctx.lib_searched_for, ctx.error_messages, ctx.attachments, @@ -121,13 +121,14 @@ def _derive_ctk_root_windows(resolved_lib_path: str) -> str | None: Supports: - ``$CTK_ROOT/bin/x64/foo.dll`` (CTK 13 style) + - ``$CTK_ROOT/bin/arm64/foo.dll`` (Windows on Arm CTK 13 style) - ``$CTK_ROOT/bin/foo.dll`` (CTK 12 style) """ import ntpath lib_dir = ntpath.dirname(resolved_lib_path) basename = ntpath.basename(lib_dir).lower() - if basename == "x64": + if basename in ("x64", "arm64"): parent = ntpath.dirname(lib_dir) if ntpath.basename(parent).lower() == "bin": return ntpath.dirname(parent) diff --git a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/supported_nvidia_libs.py b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/supported_nvidia_libs.py index db06411c6d0..daf696b638e 100644 --- a/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/supported_nvidia_libs.py +++ b/cuda_pathfinder/cuda/pathfinder/_dynamic_libs/supported_nvidia_libs.py @@ -6,12 +6,18 @@ The canonical data entry point is :mod:`descriptor_catalog`. This module keeps historical constant names for backward compatibility by deriving them from the catalog. + +The unsuffixed ``SUPPORTED_LIBNAMES_WINDOWS`` and +``SITE_PACKAGES_LIBDIRS_WINDOWS*`` constants retain their historical x64 +meaning for compatibility, but are not recommended for new code. Use the +explicit ``*_X64`` or ``*_ARM64`` projection instead. Never combine the two +architecture projections. """ from __future__ import annotations from cuda.pathfinder._dynamic_libs.descriptor_catalog import DESCRIPTOR_CATALOG -from cuda.pathfinder._utils.platform_aware import IS_WINDOWS +from cuda.pathfinder._utils.platform_aware import IS_WINDOWS, IS_WINDOWS_ARM64, IS_WINDOWS_X64 _CTK_DESCRIPTORS = tuple(desc for desc in DESCRIPTOR_CATALOG if desc.packaged_with == "ctk") _OTHER_DESCRIPTORS = tuple(desc for desc in DESCRIPTOR_CATALOG if desc.packaged_with == "other") @@ -26,10 +32,30 @@ desc.name for desc in _CTK_DESCRIPTORS if desc.windows_dlls and not desc.linux_sonames ) +if not IS_WINDOWS: + ALL_AVAILABLE_LIBNAMES = frozenset(desc.name for desc in DESCRIPTOR_CATALOG if desc.linux_sonames) +else: + assert IS_WINDOWS_X64 != IS_WINDOWS_ARM64 + _current_windows_arch = "x64" if IS_WINDOWS_X64 else "arm64" + ALL_AVAILABLE_LIBNAMES = frozenset( + desc.name for desc in DESCRIPTOR_CATALOG if _current_windows_arch in desc.supported_windows_arch + ) + SUPPORTED_LIBNAMES_LINUX = SUPPORTED_LIBNAMES_COMMON + SUPPORTED_LIBNAMES_LINUX_ONLY -SUPPORTED_LIBNAMES_WINDOWS = SUPPORTED_LIBNAMES_COMMON + SUPPORTED_LIBNAMES_WINDOWS_ONLY +SUPPORTED_LIBNAMES_WINDOWS_X64 = tuple(desc.name for desc in _CTK_DESCRIPTORS if "x64" in desc.supported_windows_arch) +SUPPORTED_LIBNAMES_WINDOWS_ARM64 = tuple( + desc.name for desc in _CTK_DESCRIPTORS if "arm64" in desc.supported_windows_arch +) +# Backward-compatible alias preserves the historical x64 meaning. +SUPPORTED_LIBNAMES_WINDOWS = SUPPORTED_LIBNAMES_WINDOWS_X64 SUPPORTED_LIBNAMES_ALL = SUPPORTED_LIBNAMES_COMMON + SUPPORTED_LIBNAMES_LINUX_ONLY + SUPPORTED_LIBNAMES_WINDOWS_ONLY -SUPPORTED_LIBNAMES = SUPPORTED_LIBNAMES_WINDOWS if IS_WINDOWS else SUPPORTED_LIBNAMES_LINUX +if not IS_WINDOWS: + SUPPORTED_LIBNAMES = SUPPORTED_LIBNAMES_LINUX +elif IS_WINDOWS_X64: + SUPPORTED_LIBNAMES = SUPPORTED_LIBNAMES_WINDOWS_X64 +else: + assert IS_WINDOWS_ARM64 + SUPPORTED_LIBNAMES = SUPPORTED_LIBNAMES_WINDOWS_ARM64 DIRECT_DEPENDENCIES_CTK = {desc.name: desc.dependencies for desc in _CTK_DESCRIPTORS if desc.dependencies} DIRECT_DEPENDENCIES = {desc.name: desc.dependencies for desc in DESCRIPTOR_CATALOG if desc.dependencies} @@ -51,7 +77,6 @@ desc.name for desc in DESCRIPTOR_CATALOG if desc.requires_rtld_deepbind and desc.linux_sonames ) -# Based on output of toolshed/make_site_packages_libdirs_linux.py SITE_PACKAGES_LIBDIRS_LINUX_CTK = { desc.name: desc.site_packages_linux for desc in _CTK_DESCRIPTORS if desc.site_packages_linux } @@ -60,13 +85,29 @@ } SITE_PACKAGES_LIBDIRS_LINUX = SITE_PACKAGES_LIBDIRS_LINUX_CTK | SITE_PACKAGES_LIBDIRS_LINUX_OTHER -SITE_PACKAGES_LIBDIRS_WINDOWS_CTK = { - desc.name: desc.site_packages_windows for desc in _CTK_DESCRIPTORS if desc.site_packages_windows +# Architecture-specific Windows projections. Keep these separate: combining +# them would make the table unsafe to consume for either process ABI. +SITE_PACKAGES_LIBDIRS_WINDOWS_CTK_X64 = { + desc.name: desc.site_packages_windows.x64 for desc in _CTK_DESCRIPTORS if desc.site_packages_windows.x64 +} +SITE_PACKAGES_LIBDIRS_WINDOWS_CTK_ARM64 = { + desc.name: desc.site_packages_windows.arm64 for desc in _CTK_DESCRIPTORS if desc.site_packages_windows.arm64 } -SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER = { - desc.name: desc.site_packages_windows for desc in _NON_CTK_DESCRIPTORS if desc.site_packages_windows +SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER_X64 = { + desc.name: desc.site_packages_windows.x64 for desc in _NON_CTK_DESCRIPTORS if desc.site_packages_windows.x64 } -SITE_PACKAGES_LIBDIRS_WINDOWS = SITE_PACKAGES_LIBDIRS_WINDOWS_CTK | SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER +SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER_ARM64 = { + desc.name: desc.site_packages_windows.arm64 for desc in _NON_CTK_DESCRIPTORS if desc.site_packages_windows.arm64 +} +SITE_PACKAGES_LIBDIRS_WINDOWS_X64 = SITE_PACKAGES_LIBDIRS_WINDOWS_CTK_X64 | SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER_X64 +SITE_PACKAGES_LIBDIRS_WINDOWS_ARM64 = ( + SITE_PACKAGES_LIBDIRS_WINDOWS_CTK_ARM64 | SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER_ARM64 +) + +# Backward-compatible aliases preserve the historical x64 meaning. +SITE_PACKAGES_LIBDIRS_WINDOWS_CTK = SITE_PACKAGES_LIBDIRS_WINDOWS_CTK_X64 +SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER = SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER_X64 +SITE_PACKAGES_LIBDIRS_WINDOWS = SITE_PACKAGES_LIBDIRS_WINDOWS_X64 def is_suppressed_dll_file(path_basename: str) -> bool: diff --git a/cuda_pathfinder/cuda/pathfinder/_static_libs/find_static_lib.py b/cuda_pathfinder/cuda/pathfinder/_static_libs/find_static_lib.py index 804b1c04be7..ea5a740aec4 100644 --- a/cuda_pathfinder/cuda/pathfinder/_static_libs/find_static_lib.py +++ b/cuda_pathfinder/cuda/pathfinder/_static_libs/find_static_lib.py @@ -9,6 +9,7 @@ from cuda.pathfinder._utils.env_vars import get_cuda_path_or_home from cuda.pathfinder._utils.find_sub_dirs import find_sub_dirs_all_sitepackages from cuda.pathfinder._utils.platform_aware import IS_WINDOWS +from cuda.pathfinder._utils.windows_arch import windows_python_arch class StaticLibNotFoundError(RuntimeError): @@ -32,17 +33,28 @@ class _StaticLibInfo(TypedDict): site_packages_dirs: tuple[str, ...] +def _cudadevrt_info() -> _StaticLibInfo: + if not IS_WINDOWS: + return { + "filename": "libcudadevrt.a", + "ctk_rel_paths": ("lib64", "lib"), + "conda_rel_paths": ("lib",), + "site_packages_dirs": ("nvidia/cu13/lib", "nvidia/cuda_runtime/lib"), + } + + arch_dir = windows_python_arch() + component_wheel_dirs = ("nvidia/cuda_runtime/lib/x64",) if arch_dir == "x64" else () + conda_fallback_dirs = ("lib",) if arch_dir == "x64" else () + return { + "filename": "cudadevrt.lib", + "ctk_rel_paths": (os.path.join("lib", arch_dir),), + "conda_rel_paths": (os.path.join("lib", arch_dir), *conda_fallback_dirs), + "site_packages_dirs": (f"nvidia/cu13/lib/{arch_dir}", *component_wheel_dirs), + } + + _SUPPORTED_STATIC_LIBS_INFO: dict[str, _StaticLibInfo] = { - "cudadevrt": { - "filename": "cudadevrt.lib" if IS_WINDOWS else "libcudadevrt.a", - "ctk_rel_paths": (os.path.join("lib", "x64"),) if IS_WINDOWS else ("lib64", "lib"), - "conda_rel_paths": ((os.path.join("lib", "x64"), "lib") if IS_WINDOWS else ("lib",)), - "site_packages_dirs": ( - ("nvidia/cu13/lib/x64", "nvidia/cuda_runtime/lib/x64") - if IS_WINDOWS - else ("nvidia/cu13/lib", "nvidia/cuda_runtime/lib") - ), - }, + "cudadevrt": _cudadevrt_info(), } SUPPORTED_STATIC_LIBS: tuple[str, ...] = tuple(sorted(_SUPPORTED_STATIC_LIBS_INFO.keys())) diff --git a/cuda_pathfinder/cuda/pathfinder/_utils/driver_info.py b/cuda_pathfinder/cuda/pathfinder/_utils/driver_info.py index a5d4d167d33..d07c4b861d3 100644 --- a/cuda_pathfinder/cuda/pathfinder/_utils/driver_info.py +++ b/cuda_pathfinder/cuda/pathfinder/_utils/driver_info.py @@ -5,13 +5,13 @@ import ctypes import functools +import sys from collections.abc import Callable from dataclasses import dataclass from cuda.pathfinder._dynamic_libs.load_nvidia_dynamic_lib import ( load_nvidia_dynamic_lib as _load_nvidia_dynamic_lib, ) -from cuda.pathfinder._utils.platform_aware import IS_WINDOWS class QueryDriverCudaVersionError(RuntimeError): @@ -60,16 +60,16 @@ def query_driver_cuda_version() -> DriverCudaVersion: raise QueryDriverCudaVersionError("Failed to query the CUDA driver version.") from exc +if sys.platform == "win32": + _DRIVER_LIB_LOADER: Callable[[str], ctypes.CDLL] = ctypes.WinDLL +else: + _DRIVER_LIB_LOADER = ctypes.CDLL + + def _query_driver_cuda_version_int() -> int: """Return the encoded CUDA driver version from ``cuDriverGetVersion()``.""" loaded_cuda = _load_nvidia_dynamic_lib("cuda") - if IS_WINDOWS: - # `ctypes.WinDLL` exists on Windows at runtime. The ignore is only for - # Linux mypy runs, where the platform stubs do not define that attribute. - loader_cls: Callable[[str], ctypes.CDLL] = ctypes.WinDLL # type: ignore[attr-defined] - else: - loader_cls = ctypes.CDLL - driver_lib = loader_cls(loaded_cuda.abs_path) + driver_lib = _DRIVER_LIB_LOADER(loaded_cuda.abs_path) cu_driver_get_version = driver_lib.cuDriverGetVersion cu_driver_get_version.argtypes = [ctypes.POINTER(ctypes.c_int)] cu_driver_get_version.restype = ctypes.c_int diff --git a/cuda_pathfinder/cuda/pathfinder/_utils/platform_aware.py b/cuda_pathfinder/cuda/pathfinder/_utils/platform_aware.py index 72ecbc53593..af0610a6cdb 100644 --- a/cuda_pathfinder/cuda/pathfinder/_utils/platform_aware.py +++ b/cuda_pathfinder/cuda/pathfinder/_utils/platform_aware.py @@ -4,6 +4,18 @@ import sys IS_WINDOWS = sys.platform == "win32" +_WINDOWS_PYTHON_ARCH: str | None + +if IS_WINDOWS: + from cuda.pathfinder._utils.windows_arch import windows_python_arch + + _WINDOWS_PYTHON_ARCH = windows_python_arch() +else: + _WINDOWS_PYTHON_ARCH = None + +# These describe the Python process ABI, not the Windows host architecture. +IS_WINDOWS_X64 = _WINDOWS_PYTHON_ARCH == "x64" +IS_WINDOWS_ARM64 = _WINDOWS_PYTHON_ARCH == "arm64" def quote_for_shell(s: str) -> str: diff --git a/cuda_pathfinder/cuda/pathfinder/_utils/windows_arch.py b/cuda_pathfinder/cuda/pathfinder/_utils/windows_arch.py new file mode 100644 index 00000000000..9313f3a9f17 --- /dev/null +++ b/cuda_pathfinder/cuda/pathfinder/_utils/windows_arch.py @@ -0,0 +1,65 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +import sysconfig + +WINDOWS_PE_MACHINE_BY_ARCH = { + "x64": 0x8664, + "arm64": 0xAA64, +} + + +class UnsupportedArchError(RuntimeError): + """Raised when Python reports an unsupported Windows architecture.""" + + def __init__(self, platform_tag: str) -> None: + self.platform_tag = platform_tag + super().__init__( + f"Unsupported Windows Python platform tag: {platform_tag!r}; expected 'win-amd64' or 'win-arm64'" + ) + + +def windows_python_arch() -> str: + """Return the current Windows Python interpreter architecture.""" + raw_platform_tag = sysconfig.get_platform() + platform_tag = raw_platform_tag.lower().replace("_", "-") + + if platform_tag == "win-arm64": + return "arm64" + + if platform_tag == "win-amd64": + return "x64" + + raise UnsupportedArchError(raw_platform_tag) + + +def windows_pe_matches_arch(path: str, target_arch: str) -> bool: + """Return whether a Windows Portable Executable (PE) targets the requested architecture. + + PE is the file format used for Windows executables and DLLs. This reads the + PE/COFF header's machine field to distinguish x64 images from Arm64 images. + """ + expected_machine = WINDOWS_PE_MACHINE_BY_ARCH.get(target_arch) + if expected_machine is None: + raise ValueError(f"Unsupported Windows target architecture: {target_arch!r}") + + try: + with open(path, "rb") as stream: + if stream.read(2) != b"MZ": + return False + stream.seek(0x3C) + pe_offset_bytes = stream.read(4) + if len(pe_offset_bytes) != 4: + return False + stream.seek(int.from_bytes(pe_offset_bytes, "little")) + if stream.read(4) != b"PE\0\0": + return False + machine_bytes = stream.read(2) + if len(machine_bytes) != 2: + return False + except OSError: + return False + + return int.from_bytes(machine_bytes, "little") == expected_machine diff --git a/cuda_pathfinder/docs/source/api.rst b/cuda_pathfinder/docs/source/api.rst index e49478c09ec..f65014923f9 100644 --- a/cuda_pathfinder/docs/source/api.rst +++ b/cuda_pathfinder/docs/source/api.rst @@ -24,6 +24,7 @@ CUDA bitcode and static libraries. DynamicLibNotFoundError DynamicLibUnknownError DynamicLibNotAvailableError + UnsupportedArchError SUPPORTED_HEADERS_CTK find_nvidia_header_directory diff --git a/cuda_pathfinder/docs/source/install.rst b/cuda_pathfinder/docs/source/install.rst index abc8fbb9d50..53f11ebbf18 100644 --- a/cuda_pathfinder/docs/source/install.rst +++ b/cuda_pathfinder/docs/source/install.rst @@ -59,7 +59,7 @@ Installing from Source .. code-block:: console - $ git clone https://github.com/NVIDIA/cuda-python + $ git clone https://github.com/NVIDIA/cuda-python.git $ cd cuda-python/cuda_pathfinder $ pip install . @@ -68,3 +68,13 @@ For an editable install (e.g. when developing ``cuda.pathfinder`` itself): .. code-block:: console $ pip install -v -e . + +.. note:: + + The version is derived from git tags via ``setuptools-scm``, so the clone + must include tags reaching back to at least the latest ``cuda-pathfinder-v*`` + tag. Do not use ``--depth`` or ``--no-tags``: a shallow clone builds without + error but produces a bogus version such as ``0.1.dev1+g0d22cb444``. See + `Cloning the repository + `_ + for details and recovery steps. diff --git a/cuda_pathfinder/docs/source/release/1.6.1-notes.rst b/cuda_pathfinder/docs/source/release/1.6.1-notes.rst new file mode 100644 index 00000000000..919963802ff --- /dev/null +++ b/cuda_pathfinder/docs/source/release/1.6.1-notes.rst @@ -0,0 +1,43 @@ +.. SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +.. SPDX-License-Identifier: Apache-2.0 + +.. py:currentmodule:: cuda.pathfinder + +``cuda-pathfinder`` 1.6.1 Release notes +======================================= + +Highlights +---------- + +* Make Windows dynamic-library discovery architecture-aware. Pathfinder now + detects whether the current Python interpreter is x64 or Arm64, searches + only the matching CUDA Toolkit and wheel directories, and reports only the + CTK libraries available for that architecture through + ``SUPPORTED_NVIDIA_LIBNAMES``. A known library unavailable for the current + architecture raises ``DynamicLibNotAvailableError``. + +* Add Windows Arm64 discovery for CUDA 13.4 layouts while retaining legacy + CUDA 12 wheel directories as x64-only fallbacks. This includes corrected + architecture-specific locations for cuDLA, NVVM, CUPTI, and cuSPARSELt. + NVVM binaries found in an unqualified legacy directory are checked for a + matching PE machine architecture before loading. + +* Add ``UnsupportedArchError`` for unsupported Windows Python platform tags. + +* Make Windows static-library discovery architecture-aware. Searches now use + the current Python interpreter architecture to select the matching + ``lib/x64`` or ``lib/arm64`` CUDA Toolkit and wheel directories. CUDA 12 + component-wheel and legacy Conda fallbacks remain x64-only. + +Internal maintenance +-------------------- + +* Group Windows search locations by architecture in the dynamic-library + descriptor catalog. Add explicit ``_X64`` and ``_ARM64`` variants of the + internal ``SUPPORTED_LIBNAMES_WINDOWS*`` and + ``SITE_PACKAGES_LIBDIRS_WINDOWS*`` tables. Unsuffixed names remain x64 + aliases for backward compatibility. + +* Remove the obsolete descriptor-catalog writer and its catalog-update tools. + The site-packages collection scripts remain available for gathering library + paths. diff --git a/cuda_pathfinder/pixi.lock b/cuda_pathfinder/pixi.lock index 0891bddfece..bc46282b4ad 100644 --- a/cuda_pathfinder/pixi.lock +++ b/cuda_pathfinder/pixi.lock @@ -420,7 +420,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py312h68e6be4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.9-py312h68e6be4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py312h8285ef7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.3.2-py312h8285ef7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda @@ -586,7 +586,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/backports.zstd-1.3.0-py312h3d8e7d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py312hac7b6a9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py312he940de5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py312hbda70bc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.20-py312hf55c4e8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/greenlet-3.3.2-py312hf55c4e8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda @@ -863,7 +863,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/backports.zstd-1.3.0-py312h06d0912_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py312hc6d9e41_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py312hd245ac3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py312hd245ac3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py312ha1a9051_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/greenlet-3.3.2-py312ha1a9051_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda @@ -1003,9 +1003,9 @@ packages: - bzip2 >=1.0.8,<2.0a0 size: 260182 timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py312h68e6be4_0.conda - sha256: 01b815091e0c534a5f32a830b514e31c150dc2f539b7ba1d5c70b6d095a5ebcf - md5: 14f638dad5953c83443a2c4f011f1c9e +- conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.9-py312h68e6be4_0.conda + sha256: 13e37a868e52933951b3f80fd5fe953742804499f2ee2b9a123e74070c265c0d + md5: 7311d3a6721eec7d76f4a84045f1ddfd depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -1016,8 +1016,9 @@ packages: license_family: APACHE purls: - pkg:pypi/cython?source=hash-mapping - size: 3738170 - timestamp: 1767577770165 + run_exports: {} + size: 3731635 + timestamp: 1785016112258 - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py312h8285ef7_0.conda sha256: f20121b67149ff80bf951ccae7442756586d8789204cd08ade59397b22bfd098 md5: ee1b48795ceb07311dd3e665dd4f5f33 @@ -2115,21 +2116,21 @@ packages: - bzip2 >=1.0.8,<2.0a0 size: 192412 timestamp: 1771350241232 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.4-py312he940de5_0.conda - sha256: 30bfb6445b8ae8022996283faa2d918393b1f0f78e37014995e1733e50df4303 - md5: 2f50ec4afc8e9f402b9041e9cee62744 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py312hbda70bc_0.conda + sha256: 9c3df78ef64fc05aaf01b4d16ccefe25656b7aac677a3a9d5e89e0c462c65a2c + md5: 30984003a6a35ea7b9eedc979cf52c7e depends: - libgcc >=14 - libstdcxx >=14 - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/cython?source=hash-mapping - size: 3629503 - timestamp: 1767577211661 + run_exports: {} + size: 3649707 + timestamp: 1785016066705 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/debugpy-1.8.20-py312hf55c4e8_0.conda sha256: c041ed2da3fd1e237972a360cb0f532a0caf66f571fdc9ec2cc07ccb48b8c665 md5: d7ee86593223e812e41612678c26a10d @@ -4959,9 +4960,9 @@ packages: - bzip2 >=1.0.8,<2.0a0 size: 56115 timestamp: 1771350256444 -- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.4-py312hd245ac3_0.conda - sha256: 68e921fad16accb32e86c7c73abaea7d49c9346e078924d0a593f821672a5a0c - md5: 575ebca0d973015c21087b800bc48515 +- conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py312hd245ac3_0.conda + sha256: 277887d63842d6b9d8a49f6bde1c57149fd65342c85e1f3e2aa44402125d3115 + md5: 762f58961f768b8790a215a8521d33cd depends: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 @@ -4972,8 +4973,9 @@ packages: license_family: APACHE purls: - pkg:pypi/cython?source=hash-mapping - size: 3285032 - timestamp: 1767577225362 + run_exports: {} + size: 3316549 + timestamp: 1785016176418 - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.20-py312ha1a9051_0.conda sha256: 5a886b1af3c66bf58213c7f3d802ea60fe8218313d9072bc1c9e8f7840548ba0 md5: 032746a0b0663920f0afb18cec61062b diff --git a/cuda_pathfinder/pixi.toml b/cuda_pathfinder/pixi.toml index 7ebcc9644d7..c38c08c3f2e 100644 --- a/cuda_pathfinder/pixi.toml +++ b/cuda_pathfinder/pixi.toml @@ -19,7 +19,7 @@ pytest-randomly = "*" # Keep this dependency set aligned with cuda_python/docs/environment-docs.yml. [feature.docs.dependencies] python = "3.12.*" -cython = "*" +cython = ">=3.2.5,<3.3" enum_tools = "*" make = "*" myst-nb = "*" diff --git a/cuda_pathfinder/pyproject.toml b/cuda_pathfinder/pyproject.toml index 227b8fa4eb7..4fd7a5e3edf 100644 --- a/cuda_pathfinder/pyproject.toml +++ b/cuda_pathfinder/pyproject.toml @@ -103,7 +103,7 @@ tag_regex = "^cuda-pathfinder-(?Pv\\d+\\.\\d+\\.\\d+(?:[ab]\\d+)?)" git_describe_command = [ "git", "describe", "--dirty", "--tags", "--long", "--match", "cuda-pathfinder-v*[0-9]*" ] [tool.pytest.ini_options] -addopts = "--showlocals" +addopts = "--showlocals --durations=20" thread_unsafe_fixtures = ['mocker'] # Keep this authorship marker registry in sync across all pytest config roots. # Search for "agent_authored(model)" before editing. diff --git a/cuda_pathfinder/tests/test_ctk_root_discovery.py b/cuda_pathfinder/tests/test_ctk_root_discovery.py index 9ad148dccd2..731d38fdc0a 100644 --- a/cuda_pathfinder/tests/test_ctk_root_discovery.py +++ b/cuda_pathfinder/tests/test_ctk_root_discovery.py @@ -6,6 +6,7 @@ import subprocess import sys import textwrap +from pathlib import Path import pytest @@ -19,6 +20,7 @@ _try_ctk_root_canary, resolve_ctk_root_via_canary, ) +from cuda.pathfinder._dynamic_libs.search_platform import WindowsSearchPlatform from cuda.pathfinder._dynamic_libs.search_steps import ( SearchContext, _derive_ctk_root_linux, @@ -32,6 +34,7 @@ MODE_CANARY, ) from cuda.pathfinder._utils.platform_aware import IS_WINDOWS +from cuda.pathfinder._utils.windows_arch import windows_python_arch _MODULE = "cuda.pathfinder._dynamic_libs.load_nvidia_dynamic_lib" _STEPS_MODULE = "cuda.pathfinder._dynamic_libs.search_steps" @@ -60,18 +63,29 @@ def _create_nvvm_in_ctk(ctk_root): nvvm_dir = ctk_root / "nvvm" / "bin" nvvm_dir.mkdir(parents=True) nvvm_lib = nvvm_dir / "nvvm64.dll" + machine = {"x64": 0x8664, "arm64": 0xAA64}[windows_python_arch()] + image = bytearray(0x86) + image[:2] = b"MZ" + image[0x3C:0x40] = (0x80).to_bytes(4, "little") + image[0x80:0x84] = b"PE\0\0" + image[0x84:0x86] = machine.to_bytes(2, "little") + nvvm_lib.write_bytes(image) else: nvvm_dir = ctk_root / "nvvm" / "lib64" nvvm_dir.mkdir(parents=True) nvvm_lib = nvvm_dir / "libnvvm.so" - nvvm_lib.write_bytes(b"fake") + nvvm_lib.write_bytes(b"fake") return nvvm_lib def _create_cudart_in_ctk(ctk_root): """Create a fake cudart lib in the platform-appropriate CTK subdirectory.""" if IS_WINDOWS: - lib_dir = ctk_root / "bin" + # Native ARM64 uses bin/arm64 only. + if windows_python_arch() == "arm64": + lib_dir = ctk_root / "bin" / "arm64" + else: + lib_dir = ctk_root / "bin" lib_dir.mkdir(parents=True) lib_file = lib_dir / "cudart64_12.dll" else: @@ -126,6 +140,12 @@ def test_derive_ctk_root_windows_ctk13(): assert _derive_ctk_root_windows(path) == r"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v13.0" +@pytest.mark.agent_authored(model="gpt-5") +def test_derive_ctk_root_windows_ctk13_arm64(): + path = r"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v13.4\bin\arm64\cudart64_13.dll" + assert _derive_ctk_root_windows(path) == r"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v13.4" + + def test_derive_ctk_root_windows_ctk12(): path = r"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\bin\cudart64_12.dll" assert _derive_ctk_root_windows(path) == r"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8" @@ -190,6 +210,24 @@ def test_try_via_ctk_root_regular_lib(tmp_path): assert result.found_via == "system-ctk-root" +@pytest.mark.agent_authored(model="gpt-5") +def test_try_via_ctk_root_windows_arm64_prefers_arch_dir(tmp_path): + ctk_root = tmp_path / "cuda-13" + x64_dir = ctk_root / "bin" / "x64" + arm64_dir = ctk_root / "bin" / "arm64" + x64_dir.mkdir(parents=True) + arm64_dir.mkdir(parents=True) + (x64_dir / "cudart64_13.dll").write_bytes(b"fake") + arm64_lib = arm64_dir / "cudart64_13.dll" + arm64_lib.write_bytes(b"fake") + + ctx = SearchContext(LIB_DESCRIPTORS["cudart"], platform=WindowsSearchPlatform(target_arch="arm64")) + result = find_via_ctk_root(ctx, str(ctk_root)) + assert result is not None + assert result.abs_path == str(arm64_lib) + assert result.found_via == "system-ctk-root" + + # --------------------------------------------------------------------------- # _resolve_system_loaded_abs_path_in_subprocess # --------------------------------------------------------------------------- @@ -394,7 +432,7 @@ def test_resolve_ctk_root_via_canary_none_when_probe_fails(mocker): def test_resolve_ctk_root_via_canary_none_when_unrecognized(mocker): mocker.patch( f"{_MODULE}._resolve_system_loaded_abs_path_in_subprocess", - return_value=os.path.join(os.sep, "weird", "path", "libcudart.so.13"), + return_value=str(Path(os.sep, "weird", "path", "libcudart.so.13")), ) assert resolve_ctk_root_via_canary("cudart") is None diff --git a/cuda_pathfinder/tests/test_descriptor_catalog.py b/cuda_pathfinder/tests/test_descriptor_catalog.py index b2c8eece4bb..3b643aa2e77 100644 --- a/cuda_pathfinder/tests/test_descriptor_catalog.py +++ b/cuda_pathfinder/tests/test_descriptor_catalog.py @@ -13,10 +13,11 @@ import pytest -from cuda.pathfinder._dynamic_libs.descriptor_catalog import DESCRIPTOR_CATALOG, DescriptorSpec +from cuda.pathfinder._dynamic_libs.descriptor_catalog import DESCRIPTOR_CATALOG, DescriptorSpec, WindowsSearchDirs _VALID_NAME_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$") _VALID_PACKAGED_WITH_VALUES = {"ctk", "other", "driver"} +_VALID_WINDOWS_ARCHES = ("x64", "arm64") _CATALOG_BY_NAME = {spec.name: spec for spec in DESCRIPTOR_CATALOG} @@ -59,7 +60,7 @@ def test_no_self_dependency(spec: DescriptorSpec): def test_driver_libs_have_no_site_packages(spec: DescriptorSpec): """Driver libs are system-search-only; site-packages paths would be unused.""" assert not spec.site_packages_linux, f"driver lib {spec.name} has site_packages_linux" - assert not spec.site_packages_windows, f"driver lib {spec.name} has site_packages_windows" + assert spec.site_packages_windows == WindowsSearchDirs(), f"driver lib {spec.name} has site_packages_windows" @pytest.mark.parametrize( @@ -85,6 +86,35 @@ def test_windows_dlls_look_like_dlls(spec: DescriptorSpec): assert dll.endswith(".dll"), f"Unexpected Windows DLL format: {dll}" +@pytest.mark.parametrize("spec", DESCRIPTOR_CATALOG, ids=lambda s: s.name) +@pytest.mark.agent_authored(model="gpt-5") +def test_supported_windows_arch_is_explicit_and_canonical(spec: DescriptorSpec): + expected = tuple(arch for arch in _VALID_WINDOWS_ARCHES if arch in spec.supported_windows_arch) + assert spec.supported_windows_arch == expected + assert bool(spec.supported_windows_arch) == bool(spec.windows_dlls) + + +@pytest.mark.parametrize("spec", DESCRIPTOR_CATALOG, ids=lambda s: s.name) +@pytest.mark.agent_authored(model="gpt-5") +def test_windows_search_dirs_do_not_include_unsupported_arches(spec: DescriptorSpec): + if not spec.windows_dlls: + return + for arch in _VALID_WINDOWS_ARCHES: + if arch not in spec.supported_windows_arch: + assert not spec.site_packages_windows.for_arch(arch) + assert not spec.anchor_rel_dirs_windows.for_arch(arch) + + +@pytest.mark.agent_authored(model="gpt-5") +def test_cusparselt_windows_metadata_matches_wheel_layouts(): + spec = _CATALOG_BY_NAME["cusparseLt"] + assert spec.supported_windows_arch == ("x64", "arm64") + assert spec.site_packages_windows == WindowsSearchDirs( + x64=("nvidia/cu13/bin/x64", "nvidia/cusparselt/bin"), + arm64=("nvidia/cu13/bin/arm64",), + ) + + @pytest.mark.parametrize("spec", DESCRIPTOR_CATALOG, ids=lambda s: s.name) def test_ctk_root_canary_anchors_reference_known_ctk_libs(spec: DescriptorSpec): for anchor in spec.ctk_root_canary_anchor_libnames: @@ -96,3 +126,10 @@ def test_ctk_root_canary_anchors_reference_known_ctk_libs(spec: DescriptorSpec): def test_only_ctk_libs_define_ctk_root_canary_anchors(spec: DescriptorSpec): if spec.ctk_root_canary_anchor_libnames: assert spec.packaged_with == "ctk", f"{spec.name} defines canary anchors but is not a CTK lib" + + +@pytest.mark.agent_authored(model="gpt-5") +def test_only_nvvm_requires_windows_binary_arch_check(): + checked_libs = {spec.name for spec in DESCRIPTOR_CATALOG if spec.requires_windows_binary_arch_check} + + assert checked_libs == {"nvvm"} diff --git a/cuda_pathfinder/tests/test_driver_lib_loading.py b/cuda_pathfinder/tests/test_driver_lib_loading.py index b97453c9b5a..defca06abed 100644 --- a/cuda_pathfinder/tests/test_driver_lib_loading.py +++ b/cuda_pathfinder/tests/test_driver_lib_loading.py @@ -9,14 +9,15 @@ """ import os +from pathlib import Path import pytest from child_load_nvidia_dynamic_lib_helper import ( build_child_process_failed_for_libname_message, run_load_nvidia_dynamic_lib_in_subprocess, ) - from conftest import skip_if_missing_libnvcudla_so + from cuda.pathfinder._dynamic_libs.lib_descriptor import LIB_DESCRIPTORS from cuda.pathfinder._dynamic_libs.load_dl_common import DynamicLibNotFoundError, LoadedDL from cuda.pathfinder._dynamic_libs.load_nvidia_dynamic_lib import ( @@ -157,7 +158,7 @@ def raise_child_process_failed(): abs_path = payload.abs_path assert abs_path is not None info_summary_append(f"abs_path={quote_for_shell(abs_path)}") - assert os.path.isfile(abs_path) + assert Path(abs_path).is_file() def test_real_query_driver_cuda_version(info_summary_append): diff --git a/cuda_pathfinder/tests/test_find_bitcode_lib.py b/cuda_pathfinder/tests/test_find_bitcode_lib.py index 659b068f0ff..6b5f2de49eb 100644 --- a/cuda_pathfinder/tests/test_find_bitcode_lib.py +++ b/cuda_pathfinder/tests/test_find_bitcode_lib.py @@ -66,7 +66,7 @@ def _located_bitcode_lib_asserts(located_bitcode_lib): assert isinstance(located_bitcode_lib.filename, str) assert isinstance(located_bitcode_lib.found_via, str) assert located_bitcode_lib.found_via in ("site-packages", "conda", "CUDA_PATH") - assert os.path.isfile(located_bitcode_lib.abs_path) + assert Path(located_bitcode_lib.abs_path).is_file() @pytest.mark.usefixtures("clear_find_bitcode_lib_cache") @@ -83,10 +83,10 @@ def test_locate_bitcode_lib(info_summary_append, libname): info_summary_append(f"{lib_path=!r}") _located_bitcode_lib_asserts(located_lib) - assert os.path.isfile(lib_path) + assert Path(lib_path).is_file() assert lib_path == located_lib.abs_path expected_filename = located_lib.filename - assert os.path.basename(lib_path) == expected_filename + assert Path(lib_path).name == expected_filename @pytest.mark.usefixtures("clear_find_bitcode_lib_cache") @@ -156,7 +156,7 @@ def test_find_bitcode_lib_not_found_error_includes_cuda_home_directory_listing(m find_bitcode_lib("device") message = str(exc_info.value) - expected_missing_file = os.path.join(str(lib_dir), _bitcode_lib_filename("device")) + expected_missing_file = lib_dir / _bitcode_lib_filename("device") assert f"No such file: {expected_missing_file}" in message assert f'listdir("{lib_dir}"):' in message assert "README.txt" in message diff --git a/cuda_pathfinder/tests/test_find_nvidia_binaries.py b/cuda_pathfinder/tests/test_find_nvidia_binaries.py index ae439546859..2784633ff38 100644 --- a/cuda_pathfinder/tests/test_find_nvidia_binaries.py +++ b/cuda_pathfinder/tests/test_find_nvidia_binaries.py @@ -152,7 +152,7 @@ def test_find_binary_first_matching_dir_wins(monkeypatch, mocker): result = find_nvidia_binary_utility("nvcc") # Conda comes before CUDA_HOME, so the Conda hit wins and CUDA_HOME is never probed. - assert result == conda_nvcc + assert result == os.path.abspath(conda_nvcc) assert checked == [os.path.join(site_dir, "nvcc"), conda_nvcc] @@ -173,7 +173,7 @@ def test_find_binary_ctk_root_canary_fallback(monkeypatch, mocker): result = find_nvidia_binary_utility("nvcc") - assert result == ctk_nvcc + assert result == os.path.abspath(ctk_nvcc) canary_mock.assert_called_once_with() # No earlier trusted dirs existed, so the only probe is the canary bin dir. assert checked == [ctk_nvcc] @@ -218,7 +218,7 @@ def test_find_binary_canary_not_consulted_when_found_earlier(monkeypatch, mocker result = find_nvidia_binary_utility("nvcc") - assert result == conda_nvcc + assert result == os.path.abspath(conda_nvcc) canary_mock.assert_not_called() @@ -370,3 +370,27 @@ def test_caching_per_utility(): # them is None) if nvdisasm1 is not None and nvcc1 is not None: assert nvdisasm1 != nvcc1 + + +def test_resolve_in_trusted_dirs_returns_absolute_path(tmp_path, monkeypatch, mocker): + """A match found under a relative search dir must be absolutized. + + ``find_nvidia_binary_utility`` documents an absolute, separator-resolved + result. A relative search dir (e.g. a relative ``CUDA_HOME``) previously + leaked a relative path that would re-resolve against a possibly different + CWD at execution time. + """ + rel_dir = os.path.join("some", "relative", "bin") + candidate = os.path.join(rel_dir, "nvcc") + mocker.patch.object( + binary_finder_module, + "_is_executable_candidate", + side_effect=lambda path: path == candidate, + ) + + # Anchor CWD so os.path.abspath is deterministic for the assertion. + monkeypatch.chdir(tmp_path) + result = binary_finder_module._resolve_in_trusted_dirs("nvcc", [rel_dir]) + + assert os.path.isabs(result) + assert result == os.path.abspath(os.path.join(str(tmp_path), candidate)) diff --git a/cuda_pathfinder/tests/test_find_nvidia_headers.py b/cuda_pathfinder/tests/test_find_nvidia_headers.py index 90fe3cf9815..3e045dae265 100644 --- a/cuda_pathfinder/tests/test_find_nvidia_headers.py +++ b/cuda_pathfinder/tests/test_find_nvidia_headers.py @@ -20,9 +20,9 @@ from pathlib import Path import pytest +from conftest import skip_if_missing_libnvcudla_so import cuda.pathfinder._headers.find_nvidia_headers as find_nvidia_headers_module -from conftest import skip_if_missing_libnvcudla_so from cuda.pathfinder import LocatedHeaderDir, find_nvidia_header_directory, locate_nvidia_header_directory from cuda.pathfinder._dynamic_libs.load_nvidia_dynamic_lib import ( _resolve_system_loaded_abs_path_in_subprocess, @@ -138,12 +138,12 @@ def test_locate_non_ctk_headers(info_summary_append, libname): info_summary_append(f"{hdr_dir=!r}") if hdr_dir: _located_hdr_dir_asserts(located_hdr_dir) - assert os.path.isdir(hdr_dir) - assert os.path.isfile(os.path.join(hdr_dir, SUPPORTED_HEADERS_NON_CTK[libname])) + hdr_dir_path = Path(hdr_dir) + assert hdr_dir_path.is_dir() + assert (hdr_dir_path / SUPPORTED_HEADERS_NON_CTK[libname]).is_file() if have_distribution_for(libname): assert hdr_dir is not None - hdr_dir_parts = hdr_dir.split(os.path.sep) - assert "site-packages" in hdr_dir_parts + assert "site-packages" in Path(hdr_dir).parts elif STRICTNESS == "all_must_work": assert hdr_dir is not None if conda_prefix := os.environ.get("CONDA_PREFIX"): @@ -152,6 +152,8 @@ def test_locate_non_ctk_headers(info_summary_append, libname): inst_dirs = SUPPORTED_INSTALL_DIRS_NON_CTK.get(libname) if inst_dirs is not None: for inst_dir in inst_dirs: + # Absolute glob pattern: Path.glob needs a separate base dir, + # and the wildcard is not pinned to the last component. globbed = glob.glob(inst_dir) if hdr_dir in globbed: break @@ -172,9 +174,10 @@ def test_locate_ctk_headers(info_summary_append, libname): info_summary_append(f"{hdr_dir=!r}") if hdr_dir: _located_hdr_dir_asserts(located_hdr_dir) - assert os.path.isdir(hdr_dir) + hdr_dir_path = Path(hdr_dir) + assert hdr_dir_path.is_dir() h_filename = SUPPORTED_HEADERS_CTK[libname] - assert os.path.isfile(os.path.join(hdr_dir, h_filename)) + assert (hdr_dir_path / h_filename).is_file() if STRICTNESS == "all_must_work": if libname == "cudla": skip_if_missing_libnvcudla_so(libname, timeout=30) diff --git a/cuda_pathfinder/tests/test_find_static_lib.py b/cuda_pathfinder/tests/test_find_static_lib.py index e5560dcabbf..cf0e62dc8a2 100644 --- a/cuda_pathfinder/tests/test_find_static_lib.py +++ b/cuda_pathfinder/tests/test_find_static_lib.py @@ -52,7 +52,7 @@ def _located_static_lib_asserts(located_static_lib): assert isinstance(located_static_lib.filename, str) assert isinstance(located_static_lib.found_via, str) assert located_static_lib.found_via in ("site-packages", "conda", "CUDA_PATH") - assert os.path.isfile(located_static_lib.abs_path) + assert Path(located_static_lib.abs_path).is_file() @pytest.mark.usefixtures("clear_find_static_lib_cache") @@ -69,10 +69,10 @@ def test_locate_static_lib(info_summary_append, libname): info_summary_append(f"abs_path={quote_for_shell(lib_path)}") _located_static_lib_asserts(located_lib) - assert os.path.isfile(lib_path) + assert Path(lib_path).is_file() assert lib_path == located_lib.abs_path expected_filename = located_lib.filename - assert os.path.basename(lib_path) == expected_filename + assert Path(lib_path).name == expected_filename @pytest.mark.usefixtures("clear_find_static_lib_cache") @@ -81,7 +81,7 @@ def test_locate_static_lib_search_order(monkeypatch, tmp_path): conda_rel_path = CUDADEVRT_INFO["conda_rel_paths"][0] site_pkg_rel = CUDADEVRT_INFO["site_packages_dirs"][0] - site_packages_lib_dir = tmp_path / "site-packages" / Path(site_pkg_rel.replace("/", os.sep)) + site_packages_lib_dir = tmp_path / "site-packages" / Path(site_pkg_rel) site_packages_path = _make_static_lib_file(site_packages_lib_dir, filename) conda_prefix = tmp_path / "conda-prefix" @@ -143,6 +143,41 @@ def test_locate_static_lib_conda_rel_path_fallback(monkeypatch, tmp_path): assert located_lib.found_via == "conda" +@pytest.mark.parametrize( + ("target_arch", "expected_ctk_dirs", "expected_conda_dirs", "expected_site_packages_dirs"), + ( + ( + "x64", + (os.path.join("lib", "x64"),), + (os.path.join("lib", "x64"), "lib"), + ("nvidia/cu13/lib/x64", "nvidia/cuda_runtime/lib/x64"), + ), + ( + "arm64", + (os.path.join("lib", "arm64"),), + (os.path.join("lib", "arm64"),), + ("nvidia/cu13/lib/arm64",), + ), + ), +) +@pytest.mark.agent_authored(model="gpt-5.6") +def test_cudadevrt_windows_paths_follow_python_arch( + monkeypatch, + target_arch, + expected_ctk_dirs, + expected_conda_dirs, + expected_site_packages_dirs, +): + monkeypatch.setattr(find_static_lib_module, "IS_WINDOWS", True) + monkeypatch.setattr(find_static_lib_module, "windows_python_arch", lambda: target_arch) + + info = find_static_lib_module._cudadevrt_info() + + assert info["ctk_rel_paths"] == expected_ctk_dirs + assert info["conda_rel_paths"] == expected_conda_dirs + assert info["site_packages_dirs"] == expected_site_packages_dirs + + @pytest.mark.usefixtures("clear_find_static_lib_cache") def test_find_static_lib_not_found_error_includes_cuda_home_directory_listing(monkeypatch, tmp_path): filename = CUDADEVRT_INFO["filename"] @@ -167,7 +202,7 @@ def test_find_static_lib_not_found_error_includes_cuda_home_directory_listing(mo find_static_lib("cudadevrt") message = str(exc_info.value) - expected_missing_file = os.path.join(str(lib_dir), filename) + expected_missing_file = lib_dir / filename assert f"No such file: {expected_missing_file}" in message assert f'listdir("{lib_dir}"):' in message assert "README.txt" in message diff --git a/cuda_pathfinder/tests/test_lib_descriptor.py b/cuda_pathfinder/tests/test_lib_descriptor.py index cda96131e13..8715f9181cc 100644 --- a/cuda_pathfinder/tests/test_lib_descriptor.py +++ b/cuda_pathfinder/tests/test_lib_descriptor.py @@ -13,10 +13,21 @@ LIBNAMES_REQUIRING_RTLD_DEEPBIND, SITE_PACKAGES_LIBDIRS_LINUX, SITE_PACKAGES_LIBDIRS_WINDOWS, + SITE_PACKAGES_LIBDIRS_WINDOWS_ARM64, + SITE_PACKAGES_LIBDIRS_WINDOWS_CTK, + SITE_PACKAGES_LIBDIRS_WINDOWS_CTK_X64, + SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER, + SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER_X64, + SITE_PACKAGES_LIBDIRS_WINDOWS_X64, SUPPORTED_LIBNAMES, + SUPPORTED_LIBNAMES_LINUX, + SUPPORTED_LIBNAMES_WINDOWS, + SUPPORTED_LIBNAMES_WINDOWS_ARM64, + SUPPORTED_LIBNAMES_WINDOWS_X64, SUPPORTED_LINUX_SONAMES, SUPPORTED_WINDOWS_DLLS, ) +from cuda.pathfinder._utils.platform_aware import IS_WINDOWS, IS_WINDOWS_ARM64, IS_WINDOWS_X64 # --------------------------------------------------------------------------- # Registry completeness @@ -56,9 +67,49 @@ def test_site_packages_linux_match(name): assert LIB_DESCRIPTORS[name].site_packages_linux == SITE_PACKAGES_LIBDIRS_LINUX.get(name, ()) +@pytest.mark.parametrize( + ("target_arch", "site_packages_libdirs"), + [ + ("x64", SITE_PACKAGES_LIBDIRS_WINDOWS_X64), + ("arm64", SITE_PACKAGES_LIBDIRS_WINDOWS_ARM64), + ], +) @pytest.mark.parametrize("name", sorted(LIB_DESCRIPTORS)) -def test_site_packages_windows_match(name): - assert LIB_DESCRIPTORS[name].site_packages_windows == SITE_PACKAGES_LIBDIRS_WINDOWS.get(name, ()) +@pytest.mark.agent_authored(model="gpt-5") +def test_site_packages_windows_match(name, target_arch, site_packages_libdirs): + assert LIB_DESCRIPTORS[name].site_packages_windows.for_arch(target_arch) == site_packages_libdirs.get(name, ()) + + +@pytest.mark.agent_authored(model="gpt-5") +def test_legacy_site_packages_windows_tables_are_x64_aliases(): + assert SITE_PACKAGES_LIBDIRS_WINDOWS_CTK is SITE_PACKAGES_LIBDIRS_WINDOWS_CTK_X64 + assert SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER is SITE_PACKAGES_LIBDIRS_WINDOWS_OTHER_X64 + assert SITE_PACKAGES_LIBDIRS_WINDOWS is SITE_PACKAGES_LIBDIRS_WINDOWS_X64 + + +@pytest.mark.agent_authored(model="gpt-5") +def test_legacy_supported_libnames_windows_is_x64_alias(): + assert SUPPORTED_LIBNAMES_WINDOWS is SUPPORTED_LIBNAMES_WINDOWS_X64 + + +@pytest.mark.agent_authored(model="gpt-5") +def test_supported_libnames_selects_current_platform_and_arch(): + if not IS_WINDOWS: + expected = SUPPORTED_LIBNAMES_LINUX + elif IS_WINDOWS_X64: + expected = SUPPORTED_LIBNAMES_WINDOWS_X64 + else: + assert IS_WINDOWS_ARM64 + expected = SUPPORTED_LIBNAMES_WINDOWS_ARM64 + assert SUPPORTED_LIBNAMES is expected + + +@pytest.mark.agent_authored(model="gpt-5") +def test_arch_specific_ctk_libname_projections(): + assert "cudla" not in SUPPORTED_LIBNAMES_WINDOWS_X64 + assert "cudla" in SUPPORTED_LIBNAMES_WINDOWS_ARM64 + assert "nvjpeg" in SUPPORTED_LIBNAMES_WINDOWS_X64 + assert "nvjpeg" in SUPPORTED_LIBNAMES_WINDOWS_ARM64 @pytest.mark.parametrize("name", sorted(LIB_DESCRIPTORS)) diff --git a/cuda_pathfinder/tests/test_load_nvidia_dynamic_lib.py b/cuda_pathfinder/tests/test_load_nvidia_dynamic_lib.py index 3e240dcf468..66ede86c6ad 100644 --- a/cuda_pathfinder/tests/test_load_nvidia_dynamic_lib.py +++ b/cuda_pathfinder/tests/test_load_nvidia_dynamic_lib.py @@ -3,15 +3,16 @@ import os import platform +from pathlib import Path import pytest from child_load_nvidia_dynamic_lib_helper import ( build_child_process_failed_for_libname_message, run_load_nvidia_dynamic_lib_in_subprocess, ) +from conftest import skip_if_missing_libnvcudla_so from local_helpers import have_distribution -from conftest import skip_if_missing_libnvcudla_so from cuda.pathfinder import DynamicLibNotAvailableError, DynamicLibUnknownError, load_nvidia_dynamic_lib from cuda.pathfinder._dynamic_libs import load_nvidia_dynamic_lib as load_nvidia_dynamic_lib_module from cuda.pathfinder._dynamic_libs import supported_nvidia_libs @@ -25,32 +26,49 @@ assert STRICTNESS in ("see_what_works", "all_must_work") +@pytest.mark.agent_authored(model="gpt-5") +def test_loader_uses_all_available_libnames(): + assert supported_nvidia_libs.ALL_AVAILABLE_LIBNAMES == load_nvidia_dynamic_lib_module.ALL_AVAILABLE_LIBNAMES + + def test_supported_libnames_linux_sonames_consistency(): assert tuple(sorted(supported_nvidia_libs.SUPPORTED_LIBNAMES_LINUX)) == tuple( sorted(supported_nvidia_libs.SUPPORTED_LINUX_SONAMES_CTK.keys()) ) -def test_supported_libnames_windows_dlls_consistency(): - assert tuple(sorted(supported_nvidia_libs.SUPPORTED_LIBNAMES_WINDOWS)) == tuple( - sorted(supported_nvidia_libs.SUPPORTED_WINDOWS_DLLS_CTK.keys()) - ) - - def test_supported_libnames_linux_site_packages_libdirs_ctk_consistency(): assert tuple(sorted(supported_nvidia_libs.SUPPORTED_LIBNAMES_LINUX)) == tuple( sorted(supported_nvidia_libs.SITE_PACKAGES_LIBDIRS_LINUX_CTK.keys()) ) -def test_supported_libnames_windows_site_packages_libdirs_ctk_consistency(): +@pytest.mark.parametrize( + ("site_packages_libdirs", "supported_libnames"), + [ + pytest.param( + supported_nvidia_libs.SITE_PACKAGES_LIBDIRS_WINDOWS_CTK_X64, + supported_nvidia_libs.SUPPORTED_LIBNAMES_WINDOWS_X64, + id="x64", + ), + pytest.param( + supported_nvidia_libs.SITE_PACKAGES_LIBDIRS_WINDOWS_CTK_ARM64, + supported_nvidia_libs.SUPPORTED_LIBNAMES_WINDOWS_ARM64, + id="arm64", + ), + ], +) +@pytest.mark.human_reviewed +def test_supported_libnames_windows_site_packages_libdirs_ctk_consistency( + site_packages_libdirs, + supported_libnames, +): # Not every Windows CTK library ships in a pip wheel (e.g. cudla is loaded # from the local CUDA Toolkit only), so a library may legitimately omit # site_packages_windows. Only assert that every site-packages entry maps to # a supported Windows libname, not the other way around. - site_packages_libnames = set(supported_nvidia_libs.SITE_PACKAGES_LIBDIRS_WINDOWS_CTK.keys()) - supported_libnames = set(supported_nvidia_libs.SUPPORTED_LIBNAMES_WINDOWS) - assert site_packages_libnames <= supported_libnames + site_packages_libnames = set(site_packages_libdirs) + assert site_packages_libnames <= set(supported_libnames) @pytest.mark.parametrize("dict_name", ["SUPPORTED_LINUX_SONAMES", "SUPPORTED_WINDOWS_DLLS"]) @@ -88,7 +106,7 @@ def test_unknown_libname_raises_dynamic_lib_unknown_error(): def test_known_but_platform_unavailable_libname_raises_dynamic_lib_not_available_error(monkeypatch): load_nvidia_dynamic_lib.cache_clear() monkeypatch.setattr(load_nvidia_dynamic_lib_module, "_ALL_KNOWN_LIBNAMES", frozenset(("known_but_unavailable",))) - monkeypatch.setattr(load_nvidia_dynamic_lib_module, "_ALL_SUPPORTED_LIBNAMES", frozenset()) + monkeypatch.setattr(load_nvidia_dynamic_lib_module, "ALL_AVAILABLE_LIBNAMES", frozenset()) monkeypatch.setattr(load_nvidia_dynamic_lib_module, "_PLATFORM_NAME", "TestOS") with pytest.raises( DynamicLibNotAvailableError, @@ -142,4 +160,4 @@ def raise_child_process_failed(): abs_path = payload.abs_path assert abs_path is not None info_summary_append(f"abs_path={quote_for_shell(abs_path)}") - assert os.path.isfile(abs_path) # double-check the abs_path + assert Path(abs_path).is_file() # double-check the abs_path diff --git a/cuda_pathfinder/tests/test_search_steps.py b/cuda_pathfinder/tests/test_search_steps.py index 1b881707dfb..54136dc34e1 100644 --- a/cuda_pathfinder/tests/test_search_steps.py +++ b/cuda_pathfinder/tests/test_search_steps.py @@ -9,6 +9,9 @@ import pytest +from cuda.pathfinder import UnsupportedArchError +from cuda.pathfinder._dynamic_libs import search_platform as search_platform_mod +from cuda.pathfinder._dynamic_libs.descriptor_catalog import WindowsSearchDirs from cuda.pathfinder._dynamic_libs.lib_descriptor import LIB_DESCRIPTORS, LibDescriptor from cuda.pathfinder._dynamic_libs.load_dl_common import DynamicLibNotFoundError from cuda.pathfinder._dynamic_libs.search_platform import LinuxSearchPlatform, WindowsSearchPlatform @@ -23,6 +26,7 @@ find_in_site_packages, run_find_steps, ) +from cuda.pathfinder._utils import windows_arch as windows_arch_mod _STEPS_MOD = "cuda.pathfinder._dynamic_libs.search_steps" _PLAT_MOD = "cuda.pathfinder._dynamic_libs.search_platform" @@ -40,7 +44,10 @@ def _make_desc(name: str = "cudart", **overrides) -> LibDescriptor: "linux_sonames": ("libcudart.so",), "windows_dlls": ("cudart64_12.dll",), "site_packages_linux": (os.path.join("nvidia", "cuda_runtime", "lib"),), - "site_packages_windows": (os.path.join("nvidia", "cuda_runtime", "bin"),), + "site_packages_windows": WindowsSearchDirs( + x64=(os.path.join("nvidia", "cuda_runtime", "bin"),), + arm64=(os.path.join("nvidia", "cuda_runtime", "bin"),), + ), } defaults.update(overrides) return LibDescriptor(**defaults) @@ -52,6 +59,23 @@ def _ctx(desc: LibDescriptor | None = None, *, platform=None) -> SearchContext: return SearchContext(desc or _make_desc(), platform=platform) +def _patch_site_packages_search(mocker, root): + def _find_sub_dirs(sub_dirs): + path = root.joinpath(*sub_dirs) + return [str(path)] if path.is_dir() else [] + + return mocker.patch(f"{_PLAT_MOD}.find_sub_dirs_all_sitepackages", side_effect=_find_sub_dirs) + + +def _write_pe(path, machine): + image = bytearray(0x86) + image[:2] = b"MZ" + image[0x3C:0x40] = (0x80).to_bytes(4, "little") + image[0x80:0x84] = b"PE\0\0" + image[0x84:0x86] = machine.to_bytes(2, "little") + path.write_bytes(image) + + # --------------------------------------------------------------------------- # SearchContext # --------------------------------------------------------------------------- @@ -67,7 +91,7 @@ def test_lib_searched_for_linux(self): assert ctx.lib_searched_for == "libcublas.so" def test_lib_searched_for_windows(self): - ctx = SearchContext(_make_desc(name="cublas"), platform=WindowsSearchPlatform()) + ctx = SearchContext(_make_desc(name="cublas"), platform=WindowsSearchPlatform(target_arch="x64")) assert ctx.lib_searched_for == "cublas*.dll" def test_raise_not_found_includes_messages(self): @@ -83,6 +107,71 @@ def test_raise_not_found_empty_messages(self): ctx.raise_not_found() +# --------------------------------------------------------------------------- +# Windows Python architecture detection +# --------------------------------------------------------------------------- + + +class TestWindowsPythonArch: + @pytest.mark.agent_authored(model="gpt-5") + def test_linux_platform_does_not_detect_windows_arch(self, mocker): + mocker.patch.object(search_platform_mod, "IS_WINDOWS", False) + get_windows_arch = mocker.patch.object(search_platform_mod, "windows_python_arch") + + platform = search_platform_mod._platform_for_current_system() + + assert isinstance(platform, LinuxSearchPlatform) + get_windows_arch.assert_not_called() + + @pytest.mark.agent_authored(model="gpt-5") + def test_detects_sysconfig_x64(self, mocker): + mocker.patch.object(windows_arch_mod.sysconfig, "get_platform", return_value="win-amd64") + + assert windows_arch_mod.windows_python_arch() == "x64" + + @pytest.mark.agent_authored(model="gpt-5") + def test_detects_sysconfig_arm64(self, mocker): + mocker.patch.object(windows_arch_mod.sysconfig, "get_platform", return_value="win-arm64") + + assert windows_arch_mod.windows_python_arch() == "arm64" + + @pytest.mark.agent_authored(model="gpt-5") + def test_rejects_unknown_sysconfig_tag(self, mocker): + mocker.patch.object(windows_arch_mod.sysconfig, "get_platform", return_value="custom-win") + + with pytest.raises( + UnsupportedArchError, + match=r"Unsupported Windows Python platform tag: 'custom-win'.*win-amd64.*win-arm64", + ) as exc_info: + windows_arch_mod.windows_python_arch() + assert exc_info.value.platform_tag == "custom-win" + + +@pytest.mark.parametrize( + ("machine", "target_arch", "expected"), + ( + (0x8664, "x64", True), + (0x8664, "arm64", False), + (0xAA64, "x64", False), + (0xAA64, "arm64", True), + ), +) +@pytest.mark.agent_authored(model="gpt-5") +def test_windows_pe_matches_arch(tmp_path, machine, target_arch, expected): + dll = tmp_path / "test.dll" + _write_pe(dll, machine) + + assert windows_arch_mod.windows_pe_matches_arch(str(dll), target_arch) is expected + + +@pytest.mark.agent_authored(model="gpt-5") +def test_windows_pe_matches_arch_rejects_malformed_file(tmp_path): + dll = tmp_path / "test.dll" + dll.write_bytes(b"not a PE file") + + assert windows_arch_mod.windows_pe_matches_arch(str(dll), "x64") is False + + # --------------------------------------------------------------------------- # find_in_site_packages # --------------------------------------------------------------------------- @@ -90,7 +179,7 @@ def test_raise_not_found_empty_messages(self): class TestFindInSitePackages: def test_returns_none_when_no_rel_dirs(self): - desc = _make_desc(site_packages_linux=(), site_packages_windows=()) + desc = _make_desc(site_packages_linux=(), site_packages_windows=WindowsSearchDirs()) result = find_in_site_packages(_ctx(desc)) assert result is None @@ -127,13 +216,93 @@ def test_found_windows(self, mocker, tmp_path): desc = _make_desc( name="cudart", - site_packages_windows=(os.path.join("nvidia", "cuda_runtime", "bin"),), + site_packages_windows=WindowsSearchDirs( + x64=(os.path.join("nvidia", "cuda_runtime", "bin"),), + arm64=(os.path.join("nvidia", "cuda_runtime", "bin"),), + ), ) - result = find_in_site_packages(_ctx(desc, platform=WindowsSearchPlatform())) + result = find_in_site_packages(_ctx(desc, platform=WindowsSearchPlatform(target_arch="x64"))) assert result is not None assert result.abs_path == str(dll) assert result.found_via == "site-packages" + @pytest.mark.agent_authored(model="gpt-5") + def test_found_windows_arm64_prefers_cuda13_arch_dir_to_cuda12(self, mocker, tmp_path): + x86_64_dir = tmp_path / "nvidia" / "cu13" / "bin" / "x86_64" + arm64_dir = tmp_path / "nvidia" / "cu13" / "bin" / "arm64" + cuda12_dir = tmp_path / "nvidia" / "cuda_runtime" / "bin" + x86_64_dir.mkdir(parents=True) + arm64_dir.mkdir(parents=True) + cuda12_dir.mkdir(parents=True) + (x86_64_dir / "cudart64_12.dll").touch() + (cuda12_dir / "cudart64_12.dll").touch() + arm64_dll = arm64_dir / "cudart64_12.dll" + arm64_dll.touch() + + _patch_site_packages_search(mocker, tmp_path) + mocker.patch(f"{_PLAT_MOD}.is_suppressed_dll_file", return_value=False) + + desc = LIB_DESCRIPTORS["cudart"] + result = find_in_site_packages(_ctx(desc, platform=WindowsSearchPlatform(target_arch="arm64"))) + assert result is not None + assert result.abs_path == str(arm64_dll) + assert result.found_via == "site-packages" + + @pytest.mark.agent_authored(model="gpt-5") + def test_found_windows_x64_prefers_cuda13_arch_dir_to_cuda12(self, mocker, tmp_path): + x86_64_dir = tmp_path / "nvidia" / "cu13" / "bin" / "x86_64" + arm64_dir = tmp_path / "nvidia" / "cu13" / "bin" / "arm64" + cuda12_dir = tmp_path / "nvidia" / "cuda_runtime" / "bin" + x86_64_dir.mkdir(parents=True) + arm64_dir.mkdir(parents=True) + cuda12_dir.mkdir(parents=True) + x86_64_dll = x86_64_dir / "cudart64_12.dll" + x86_64_dll.touch() + (arm64_dir / "cudart64_12.dll").touch() + (cuda12_dir / "cudart64_12.dll").touch() + + _patch_site_packages_search(mocker, tmp_path) + mocker.patch(f"{_PLAT_MOD}.is_suppressed_dll_file", return_value=False) + + desc = LIB_DESCRIPTORS["cudart"] + result = find_in_site_packages(_ctx(desc, platform=WindowsSearchPlatform(target_arch="x64"))) + assert result is not None + assert result.abs_path == str(x86_64_dll) + assert result.found_via == "site-packages" + + @pytest.mark.agent_authored(model="gpt-5") + def test_found_windows_x64_uses_cuda12_when_cuda13_is_absent(self, mocker, tmp_path): + cuda12_dir = tmp_path / "nvidia" / "cuda_runtime" / "bin" + cuda12_dir.mkdir(parents=True) + cuda12_dll = cuda12_dir / "cudart64_12.dll" + cuda12_dll.touch() + + _patch_site_packages_search(mocker, tmp_path) + mocker.patch(f"{_PLAT_MOD}.is_suppressed_dll_file", return_value=False) + + desc = LIB_DESCRIPTORS["cudart"] + result = find_in_site_packages(_ctx(desc, platform=WindowsSearchPlatform(target_arch="x64"))) + assert result is not None + assert result.abs_path == str(cuda12_dll) + assert result.found_via == "site-packages" + + @pytest.mark.agent_authored(model="gpt-5") + def test_found_windows_arm64_skips_cuda12_when_cuda13_is_absent(self, mocker, tmp_path): + cuda12_dir = tmp_path / "nvidia" / "cuda_runtime" / "bin" + cuda12_dir.mkdir(parents=True) + (cuda12_dir / "cudart64_12.dll").touch() + + _patch_site_packages_search(mocker, tmp_path) + mocker.patch(f"{_PLAT_MOD}.is_suppressed_dll_file", return_value=False) + + desc = LIB_DESCRIPTORS["cudart"] + platform = WindowsSearchPlatform(target_arch="arm64") + assert platform.site_packages_rel_dirs(desc) == ("nvidia/cu13/bin/arm64",) + + result = find_in_site_packages(_ctx(desc, platform=platform)) + + assert result is None + def test_not_found_appends_error(self, mocker, tmp_path): empty_dir = tmp_path / "nvidia" / "cuda_runtime" / "lib" empty_dir.mkdir(parents=True) @@ -241,11 +410,28 @@ def test_found_windows(self, mocker, tmp_path): mocker.patch.dict(os.environ, {"CONDA_PREFIX": str(tmp_path)}) - result = find_in_conda(_ctx(platform=WindowsSearchPlatform())) + result = find_in_conda(_ctx(platform=WindowsSearchPlatform(target_arch="x64"))) assert result is not None assert result.abs_path == str(dll) assert result.found_via == "conda" + @pytest.mark.agent_authored(model="gpt-5") + def test_found_windows_arm64_prefers_arch_dir(self, mocker, tmp_path): + x64_dir = tmp_path / "Library" / "bin" / "x64" + arm64_dir = tmp_path / "Library" / "bin" / "arm64" + x64_dir.mkdir(parents=True) + arm64_dir.mkdir(parents=True) + (x64_dir / "cudart64_12.dll").touch() + arm64_dll = arm64_dir / "cudart64_12.dll" + arm64_dll.touch() + + mocker.patch.dict(os.environ, {"CONDA_PREFIX": str(tmp_path)}) + + result = find_in_conda(_ctx(platform=WindowsSearchPlatform(target_arch="arm64"))) + assert result is not None + assert result.abs_path == str(arm64_dll) + assert result.found_via == "conda" + # The next three tests cover the Linux glob fallback in # cuda.pathfinder._dynamic_libs.search_platform.LinuxSearchPlatform.find_in_lib_dir, # which is exercised by find_in_conda (and find_in_cuda_path) when the @@ -326,11 +512,57 @@ def test_found_windows(self, mocker, tmp_path): mocker.patch(f"{_STEPS_MOD}.get_cuda_path_or_home", return_value=str(tmp_path)) - result = find_in_cuda_path(_ctx(platform=WindowsSearchPlatform())) + result = find_in_cuda_path(_ctx(platform=WindowsSearchPlatform(target_arch="x64"))) assert result is not None assert result.abs_path == str(dll) assert result.found_via == "CUDA_PATH" + @pytest.mark.agent_authored(model="gpt-5") + def test_found_windows_arm64_prefers_arch_dir(self, mocker, tmp_path): + x64_dir = tmp_path / "bin" / "x64" + arm64_dir = tmp_path / "bin" / "arm64" + x64_dir.mkdir(parents=True) + arm64_dir.mkdir(parents=True) + (x64_dir / "cudart64_12.dll").touch() + arm64_dll = arm64_dir / "cudart64_12.dll" + arm64_dll.touch() + + mocker.patch(f"{_STEPS_MOD}.get_cuda_path_or_home", return_value=str(tmp_path)) + + result = find_in_cuda_path(_ctx(platform=WindowsSearchPlatform(target_arch="arm64"))) + assert result is not None + assert result.abs_path == str(arm64_dll) + assert result.found_via == "CUDA_PATH" + + @pytest.mark.parametrize( + ("target_arch", "machine", "expected_found"), + ( + ("x64", 0x8664, True), + ("x64", 0xAA64, False), + ("arm64", 0x8664, False), + ("arm64", 0xAA64, True), + ), + ) + @pytest.mark.agent_authored(model="gpt-5") + def test_nvvm_windows_checks_binary_arch(self, mocker, tmp_path, target_arch, machine, expected_found): + nvvm_dir = tmp_path / "nvvm" / "bin" + nvvm_dir.mkdir(parents=True) + dll = nvvm_dir / "nvvm64_40_0.dll" + _write_pe(dll, machine) + + mocker.patch(f"{_STEPS_MOD}.get_cuda_path_or_home", return_value=str(tmp_path)) + + ctx = _ctx(LIB_DESCRIPTORS["nvvm"], platform=WindowsSearchPlatform(target_arch=target_arch)) + result = find_in_cuda_path(ctx) + + assert (result is not None) is expected_found + if expected_found: + assert result is not None + assert result.abs_path == str(dll) + assert result.found_via == "CUDA_PATH" + else: + assert any(f"No {target_arch}-compatible PE file" in message for message in ctx.error_messages) + # --------------------------------------------------------------------------- # run_find_steps @@ -388,19 +620,63 @@ def test_early_and_late_are_disjoint(self): class TestAnchorRelDirs: """Verify that descriptor anchor paths drive directory resolution.""" + @pytest.mark.agent_authored(model="gpt-5") + def test_windows_search_dirs_arch_only_constructors(self): + assert WindowsSearchDirs.x64_only("first", "second") == WindowsSearchDirs(x64=("first", "second")) + assert WindowsSearchDirs.arm64_only("first", "second") == WindowsSearchDirs(arm64=("first", "second")) + def test_nvvm_has_custom_linux_paths(self): desc = LIB_DESCRIPTORS["nvvm"] assert desc.anchor_rel_dirs_linux == ("nvvm/lib64",) def test_nvvm_has_custom_windows_paths(self): desc = LIB_DESCRIPTORS["nvvm"] - assert desc.anchor_rel_dirs_windows == ("nvvm/bin/*", "nvvm/bin") + assert desc.anchor_rel_dirs_windows.for_arch("x64") == ("nvvm/bin/x64", "nvvm/bin") + assert desc.anchor_rel_dirs_windows.for_arch("arm64") == ("nvvm/bin",) + + @pytest.mark.agent_authored(model="gpt-5") + def test_cupti_has_custom_windows_paths(self): + desc = LIB_DESCRIPTORS["cupti"] + assert desc.anchor_rel_dirs_windows.for_arch("x64") == ( + "extras/CUPTI/lib/x64", + "extras/CUPTI/lib64", + "bin", + ) + assert desc.anchor_rel_dirs_windows.for_arch("arm64") == ("extras/CUPTI/lib/arm64",) @pytest.mark.parametrize("libname", ["cudart", "cublas", "nvrtc"]) def test_regular_ctk_libs_use_defaults(self, libname): desc = LIB_DESCRIPTORS[libname] assert desc.anchor_rel_dirs_linux == ("lib64", "lib") - assert desc.anchor_rel_dirs_windows == ("bin/x64", "bin") + assert desc.anchor_rel_dirs_windows.for_arch("x64") == ("bin/x64", "bin") + assert desc.anchor_rel_dirs_windows.for_arch("arm64") == ("bin/arm64",) + + @pytest.mark.agent_authored(model="gpt-5") + def test_cudla_uses_arm64_only_windows_anchor(self): + desc = LIB_DESCRIPTORS["cudla"] + + assert desc.anchor_rel_dirs_windows.for_arch("x64") == () + assert desc.anchor_rel_dirs_windows.for_arch("arm64") == ("bin/arm64",) + + @pytest.mark.agent_authored(model="gpt-5") + def test_windows_anchor_dirs_select_arm64(self): + desc = _make_desc( + anchor_rel_dirs_windows=WindowsSearchDirs( + x64=("bin/x64", "bin"), + arm64=("bin/arm64", "bin"), + ) + ) + assert WindowsSearchPlatform(target_arch="arm64").anchor_rel_dirs(desc) == ("bin/arm64", "bin") + + @pytest.mark.agent_authored(model="gpt-5") + def test_windows_anchor_dirs_select_x64(self): + desc = _make_desc( + anchor_rel_dirs_windows=WindowsSearchDirs( + x64=("bin/x64", "bin"), + arm64=("bin/arm64", "bin"), + ) + ) + assert WindowsSearchPlatform(target_arch="x64").anchor_rel_dirs(desc) == ("bin/x64", "bin") def test_find_lib_dir_uses_descriptor_linux(self, tmp_path): (tmp_path / "nvvm" / "lib64").mkdir(parents=True) @@ -413,11 +689,33 @@ def test_find_lib_dir_uses_descriptor_linux(self, tmp_path): def test_find_lib_dir_uses_descriptor_windows(self, tmp_path): (tmp_path / "nvvm" / "bin").mkdir(parents=True) - desc = _make_desc(name="nvvm", anchor_rel_dirs_windows=("nvvm/bin/*", "nvvm/bin")) - result = _find_lib_dir_using_anchor(desc, WindowsSearchPlatform(), str(tmp_path)) + desc = _make_desc( + name="nvvm", + anchor_rel_dirs_windows=WindowsSearchDirs( + x64=("nvvm/bin/x64", "nvvm/bin"), + arm64=("nvvm/bin/arm64", "nvvm/bin"), + ), + ) + result = _find_lib_dir_using_anchor(desc, WindowsSearchPlatform(target_arch="x64"), str(tmp_path)) assert result is not None assert result.endswith(os.path.join("nvvm", "bin")) + @pytest.mark.agent_authored(model="gpt-5") + def test_find_lib_dir_windows_arm64_uses_arm64_anchor(self, tmp_path): + (tmp_path / "bin" / "x64").mkdir(parents=True) + (tmp_path / "bin" / "arm64").mkdir(parents=True) + + desc = _make_desc( + name="cudart", + anchor_rel_dirs_windows=WindowsSearchDirs( + x64=("bin/x64", "bin"), + arm64=("bin/arm64",), + ), + ) + result = _find_lib_dir_using_anchor(desc, WindowsSearchPlatform(target_arch="arm64"), str(tmp_path)) + assert result is not None + assert result.endswith(os.path.join("bin", "arm64")) + def test_find_lib_dir_returns_none_when_no_match(self, tmp_path): desc = _make_desc(anchor_rel_dirs_linux=("nonexistent",)) assert _find_lib_dir_using_anchor(desc, LinuxSearchPlatform(), str(tmp_path)) is None diff --git a/cuda_pathfinder/tests/test_utils_driver_info.py b/cuda_pathfinder/tests/test_utils_driver_info.py index 21948dadafe..0b3cd61d299 100644 --- a/cuda_pathfinder/tests/test_utils_driver_info.py +++ b/cuda_pathfinder/tests/test_utils_driver_info.py @@ -46,7 +46,6 @@ def test_query_driver_cuda_version_uses_windll_on_windows(monkeypatch): fake_driver_lib = _FakeDriverLib(status=0, version=12080) loaded_paths: list[str] = [] - monkeypatch.setattr(driver_info, "IS_WINDOWS", True) monkeypatch.setattr( driver_info, "_load_nvidia_dynamic_lib", @@ -57,7 +56,7 @@ def fake_windll(abs_path: str): loaded_paths.append(abs_path) return fake_driver_lib - monkeypatch.setattr(driver_info.ctypes, "WinDLL", fake_windll, raising=False) + monkeypatch.setattr(driver_info, "_DRIVER_LIB_LOADER", fake_windll) assert driver_info._query_driver_cuda_version_int() == 12080 assert loaded_paths == [r"C:\Windows\System32\nvcuda.dll"] @@ -93,9 +92,8 @@ def fail_query_driver_cuda_version_int() -> int: def test_query_driver_cuda_version_int_raises_when_cuda_call_fails(monkeypatch): fake_driver_lib = _FakeDriverLib(status=1, version=0) - monkeypatch.setattr(driver_info, "IS_WINDOWS", False) monkeypatch.setattr(driver_info, "_load_nvidia_dynamic_lib", lambda _libname: _loaded_cuda("/usr/lib/libcuda.so.1")) - monkeypatch.setattr(driver_info.ctypes, "CDLL", lambda _abs_path: fake_driver_lib) + monkeypatch.setattr(driver_info, "_DRIVER_LIB_LOADER", lambda _abs_path: fake_driver_lib) with pytest.raises(RuntimeError, match=r"cuDriverGetVersion\(\) \(status=1\)"): driver_info._query_driver_cuda_version_int() diff --git a/cuda_pathfinder/tests/test_utils_find_sub_dirs.py b/cuda_pathfinder/tests/test_utils_find_sub_dirs.py index a647e66099b..56dab23dc42 100644 --- a/cuda_pathfinder/tests/test_utils_find_sub_dirs.py +++ b/cuda_pathfinder/tests/test_utils_find_sub_dirs.py @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -import os +from pathlib import Path import pytest @@ -77,7 +77,7 @@ def test_empty_parent_paths(): def test_empty_sub_dirs(test_tree): parent_paths = test_tree["parent_paths"] result = find_sub_dirs(parent_paths, ()) - expected = [p for p in parent_paths if os.path.isdir(p)] + expected = [p for p in parent_paths if Path(p).is_dir()] assert sorted(result) == sorted(expected) diff --git a/cuda_python/DESCRIPTION.rst b/cuda_python/DESCRIPTION.rst index d50092616ad..79fa69584ff 100644 --- a/cuda_python/DESCRIPTION.rst +++ b/cuda_python/DESCRIPTION.rst @@ -10,13 +10,12 @@ CUDA Python is the home for accessing NVIDIA's CUDA platform from Python. It con * `cuda.core `_: Pythonic access to CUDA Runtime and other core functionality * `cuda.bindings `_: Low-level Python bindings to CUDA C APIs * `cuda.pathfinder `_: Utilities for locating CUDA components installed in the user's Python environment -* `cuda.coop `_: A Python module providing CCCL's reusable block-wide and warp-wide *device* primitives for use within Numba CUDA kernels * `cuda.compute `_: A Python module for easy access to CCCL's highly efficient and customizable parallel algorithms, like ``sort``, ``scan``, ``reduce``, ``transform``, etc. that are callable on the *host* * `numba-cuda-mlir `_: An evolution of Numba CUDA that improves upon its technical foundation and performance to provide the future of CUDA Python JIT compilation. It currently supports developing CUDA **SIMT** kernels in Python, providing Python bindings for accelerated device libraries, and serving as a compiler for user-defined functions in accelerated libraries. * `numba.cuda `_: A Python DSL that exposes CUDA **SIMT** programming model and compiles a restricted subset of Python code into CUDA kernels and device functions * `cuda.tile `_: A new Python DSL that exposes CUDA **Tile** programming model and allows users to write NumPy-like code in CUDA kernels * `nvmath-python `_: Pythonic access to NVIDIA CPU & GPU Math Libraries, with `host `_, `device `_, and `distributed `_ APIs. It also provides low-level Python bindings to host C APIs (`nvmath.bindings `_). -* `nvshmem4py `_: Pythonic interface to the NVSHMEM library, enabling Python applications to leverage NVSHMEM's high-performance PGAS (Partitioned Global Address Space) programming model for GPU-accelerated computing +* `nvshmem4py `_: Pythonic interface to the NVSHMEM library, enabling Python applications to leverage NVSHMEM's high-performance PGAS (Partitioned Global Address Space) programming model for GPU-accelerated computing * `Nsight Python `_: Python kernel profiling interface that automates performance analysis across multiple kernel configurations using NVIDIA Nsight Tools * `CUPTI Python `_: Python APIs for creation of profiling tools that target CUDA Python applications via the CUDA Profiling Tools Interface (CUPTI) * `Accelerated Computing Hub `_: Open-source learning materials related to GPU computing. You will find user guides, tutorials, and other works freely available for all learners interested in GPU computing. diff --git a/cuda_python/docs/environment-docs.yml b/cuda_python/docs/environment-docs.yml index d6c5dde6c9b..3152f0a3a93 100644 --- a/cuda_python/docs/environment-docs.yml +++ b/cuda_python/docs/environment-docs.yml @@ -7,7 +7,7 @@ channels: dependencies: # ATTENTION: This dependency list is duplicated in # toolshed/setup-docs-env.sh. Please KEEP THEM IN SYNC! - - cython + - cython >=3.2.5,<3.3 - myst-parser - numpy - numpydoc diff --git a/cuda_python/docs/source/index.rst b/cuda_python/docs/source/index.rst index 55ef45255ad..199758f0cf8 100644 --- a/cuda_python/docs/source/index.rst +++ b/cuda_python/docs/source/index.rst @@ -10,7 +10,6 @@ multiple components: - `cuda.core`_: Pythonic access to CUDA Runtime and other core functionality - `cuda.bindings`_: Low-level Python bindings to CUDA C APIs - `cuda.pathfinder`_: Utilities for locating CUDA components installed in the user's Python environment -- `cuda.coop`_: A Python module providing CCCL's reusable block-wide and warp-wide *device* primitives for use within Numba CUDA kernels - `cuda.compute`_: A Python module for easy access to CCCL's highly efficient and customizable parallel algorithms, like ``sort``, ``scan``, ``reduce``, ``transform``, etc. that are callable on the *host* - `numba-cuda-mlir`_: An evolution of Numba CUDA that improves upon its technical foundation and performance to provide the future of CUDA Python JIT compilation. It currently supports developing CUDA **SIMT** kernels in Python, providing Python bindings for accelerated device libraries, and serving as a compiler for user-defined functions in accelerated libraries. - `numba.cuda`_: A Python DSL that exposes CUDA **SIMT** programming model and compiles a restricted subset of Python code into CUDA kernels and device functions @@ -21,7 +20,6 @@ multiple components: - `CUPTI Python`_: Python APIs for creation of profiling tools that target CUDA Python applications via the CUDA Profiling Tools Interface (CUPTI) - `Accelerated Computing Hub`_: Open-source learning materials related to GPU computing. You will find user guides, tutorials, and other works freely available for all learners interested in GPU computing. -.. _cuda.coop: https://nvidia.github.io/cccl/unstable/python/coop.html .. _cuda.compute: https://nvidia.github.io/cccl/unstable/python/compute/index.html .. _numba-cuda-mlir: https://nvidia.github.io/numba-cuda-mlir/ .. _numba.cuda: https://nvidia.github.io/numba-cuda/ @@ -31,7 +29,7 @@ multiple components: .. _device: https://docs.nvidia.com/cuda/nvmath-python/latest/overview.html#device-apis .. _distributed: https://docs.nvidia.com/cuda/nvmath-python/latest/distributed-apis/index.html .. _nvmath.bindings: https://docs.nvidia.com/cuda/nvmath-python/latest/bindings/index.html -.. _nvshmem4py: https://docs.nvidia.com/nvshmem/api/api/language_bindings/python/index.html +.. _nvshmem4py: https://docs.nvidia.com/nvshmem/api/latest/api/language_bindings/python/index.html .. _Nsight Python: https://docs.nvidia.com/nsight-python/index.html .. _CUPTI Python: https://docs.nvidia.com/cupti-python/ .. _Accelerated Computing Hub: https://github.com/NVIDIA/accelerated-computing-hub @@ -52,13 +50,12 @@ be available, please refer to the `cuda.bindings`_ documentation for installatio cuda.core cuda.bindings cuda.pathfinder - cuda.coop cuda.compute numba-cuda-mlir numba.cuda cuda.tile nvmath-python - nvshmem4py + nvshmem4py Nsight Python CUPTI Python Accelerated Computing Hub diff --git a/cuda_python_test_helpers/cuda_python_test_helpers/__init__.py b/cuda_python_test_helpers/cuda_python_test_helpers/__init__.py index 342c2477ffc..7e1e33a428b 100644 --- a/cuda_python_test_helpers/cuda_python_test_helpers/__init__.py +++ b/cuda_python_test_helpers/cuda_python_test_helpers/__init__.py @@ -1,4 +1,4 @@ -# 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 import ctypes @@ -8,6 +8,7 @@ from contextlib import suppress __all__ = [ + "IS_LINUX", "IS_WINDOWS", "IS_WSL", "libc", @@ -26,6 +27,7 @@ def _detect_wsl() -> bool: IS_WSL: bool = _detect_wsl() IS_WINDOWS: bool = platform.system() == "Windows" or sys.platform.startswith("win") +IS_LINUX: bool = not IS_WINDOWS and not IS_WSL and platform.system() == "Linux" if IS_WINDOWS: libc = ctypes.CDLL("msvcrt.dll") @@ -63,3 +65,13 @@ def under_compute_sanitizer() -> bool: # Another common indicator: sanitizer injectors are configured via env vars. inj = os.environ.get("CUDA_INJECTION64_PATH", "") return "compute-sanitizer" in inj or "cuda-memcheck" in inj + + +def driver_version_less_than(target): + from cuda.bindings import driver + + (err,) = driver.cuInit(0) + assert err == driver.CUresult.CUDA_SUCCESS + err, version = driver.cuDriverGetVersion() + assert err == driver.CUresult.CUDA_SUCCESS + return version < target diff --git a/conftest.py b/cuda_python_test_helpers/cuda_python_test_helpers/_pytest_plugin.py similarity index 72% rename from conftest.py rename to cuda_python_test_helpers/cuda_python_test_helpers/_pytest_plugin.py index 7a0c59065d5..e1da55dcaf0 100644 --- a/conftest.py +++ b/cuda_python_test_helpers/cuda_python_test_helpers/_pytest_plugin.py @@ -1,27 +1,18 @@ # SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 +"""Pytest plugin registered via the ``pytest11`` entry point. -import os +Automatically tags collected items with package markers and gates cython +tests on CUDA header availability. Loaded by pytest whenever +``cuda-python-test-helpers`` is installed, and also explicitly via +``pytest_plugins`` in each subpackage conftest so the fallback sys.path +install path is covered too. +""" import pytest -from cuda.pathfinder import get_cuda_path_or_home - - -# Please keep in sync with the copy in cuda_core/tests/conftest.py. -def _cuda_headers_available() -> bool: - """Return True if CUDA headers are available, False if no CUDA path is set. - - Raises AssertionError if a CUDA path is set but has no include/ subdirectory. - """ - cuda_path = get_cuda_path_or_home() - if cuda_path is None: - return False - assert os.path.isdir(os.path.join(cuda_path, "include")), ( - f"CUDA path {cuda_path} does not contain an 'include' subdirectory" - ) - return True +from cuda_python_test_helpers.marks import _cuda_headers_available def pytest_collection_modifyitems(config, items): # noqa: ARG001 diff --git a/cuda_python_test_helpers/cuda_python_test_helpers/arch_check.py b/cuda_python_test_helpers/cuda_python_test_helpers/arch_check.py new file mode 100644 index 00000000000..adb3563821f --- /dev/null +++ b/cuda_python_test_helpers/cuda_python_test_helpers/arch_check.py @@ -0,0 +1,93 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +from contextlib import contextmanager +from functools import cache + +import pytest + + +@cache +def hardware_supports_nvml(): + """Try the simplest NVML API to verify basic functionality. + + Returns False on platforms where NVML is unsupported (e.g. Jetson Orin). + """ + from cuda.bindings import nvml + from cuda.bindings._internal.utils import FunctionNotFoundError as NvmlSymbolNotFoundError # noqa: F401 + + nvml.init_v2() + try: + nvml.system_get_driver_branch() + except (nvml.NotSupportedError, nvml.UnknownError): + return False + else: + return True + finally: + nvml.shutdown() + + +def _should_skip_nvml_tests() -> bool: + """Return True if NVML tests should be skipped on this system. + + Checks cuda.core's compatibility gate first (if cuda.core is installed), + then falls back to a hardware-level NVML probe. + """ + try: + from cuda.core import system + + if not system.CUDA_BINDINGS_NVML_IS_COMPATIBLE: + return True + except ImportError: + pass # cuda.core not installed; skip the compat gate + return not hardware_supports_nvml() + + +skip_if_nvml_unsupported = pytest.mark.skipif( + _should_skip_nvml_tests(), + reason="NVML support requires cuda.bindings version 12.9.6+ for CUDA 12.x or 13.2.0+ for CUDA 13.x, and hardware that supports NVML", +) + + +@contextmanager +def unsupported_before(device, expected_device_arch): + """Context manager that skips or xfails when an NVML API is not supported on this device. + + ``device`` may be a raw NVML device handle (int) or any object that exposes + the handle via a ``._handle`` attribute (e.g. ``cuda.core.system.Device``). + """ + from cuda.bindings import nvml + from cuda.bindings._internal.utils import FunctionNotFoundError as NvmlSymbolNotFoundError + + handle = getattr(device, "_handle", device) + device_arch = nvml.device_get_architecture(handle) + + if isinstance(expected_device_arch, nvml.DeviceArch): + expected_device_arch_int = int(expected_device_arch) + elif expected_device_arch == "FERMI": + expected_device_arch_int = 1 + else: + expected_device_arch_int = 0 + + if expected_device_arch is None or expected_device_arch == "HAS_INFOROM" or device_arch == nvml.DeviceArch.UNKNOWN: + # We don't know if it will fail, so we tolerate either outcome. + # + # TODO: There are APIs that are documented as supported only if the + # device has an InfoROM, but I couldn't find a way to detect that. For + # now, they are just handled as "possibly failing". + try: + yield + except (nvml.NotSupportedError, nvml.FunctionNotFoundError, NvmlSymbolNotFoundError): + pytest.skip( + f"Unsupported call for device architecture {nvml.DeviceArch(device_arch).name} " + f"on device '{nvml.device_get_name(handle)}'" + ) + elif int(device_arch) < expected_device_arch_int: + # We know it will fail; assert that it does. + with pytest.raises(nvml.NotSupportedError): + yield + pytest.skip(f"Unsupported before {expected_device_arch.name}, got {nvml.device_get_name(handle)}") + else: + yield diff --git a/cuda_core/tests/helpers/marks.py b/cuda_python_test_helpers/cuda_python_test_helpers/marks.py similarity index 66% rename from cuda_core/tests/helpers/marks.py rename to cuda_python_test_helpers/cuda_python_test_helpers/marks.py index 53fcc544eb7..03d6ff2b622 100644 --- a/cuda_core/tests/helpers/marks.py +++ b/cuda_python_test_helpers/cuda_python_test_helpers/marks.py @@ -1,12 +1,15 @@ # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -"""Reusable pytest marks for cuda_core tests.""" +"""Reusable pytest marks and skip helpers for CUDA Python test suites.""" import inspect +import os import pytest +from cuda.pathfinder import get_cuda_path_or_home + def requires_module(module, *args, **kwargs): """Skip the test if a module is missing or older than required. @@ -43,3 +46,23 @@ def test_bar(): ... return pytest.mark.skipif(True, reason=str(exc)) else: return pytest.mark.skipif(False, reason="") + + +def _cuda_headers_available() -> bool: + """Return True if CUDA headers are available, False if no CUDA path is set. + + Raises AssertionError if a CUDA path is set but has no include/ subdirectory. + """ + cuda_path = get_cuda_path_or_home() + if cuda_path is None: + return False + assert os.path.isdir(os.path.join(cuda_path, "include")), ( + f"CUDA path {cuda_path} does not contain an 'include' subdirectory" + ) + return True + + +skipif_need_cuda_headers = pytest.mark.skipif( + not _cuda_headers_available(), + reason="need CUDA header", +) diff --git a/cuda_bindings/cuda/bindings/_test_helpers/mempool.py b/cuda_python_test_helpers/cuda_python_test_helpers/mempool.py similarity index 84% rename from cuda_bindings/cuda/bindings/_test_helpers/mempool.py rename to cuda_python_test_helpers/cuda_python_test_helpers/mempool.py index e2a61e48c53..c1fad576da9 100644 --- a/cuda_bindings/cuda/bindings/_test_helpers/mempool.py +++ b/cuda_python_test_helpers/cuda_python_test_helpers/mempool.py @@ -5,16 +5,11 @@ import pytest -from cuda.bindings import driver, runtime - -# Keep in sync with the fallback in cuda_core/tests/conftest.py. The cuda_core -# copy is intentionally simpler because it only handles cuda_core CUDAError -# exceptions when this helper is absent from older published bindings. def is_windows_mcdm_device(device=0): if sys.platform != "win32": return False - import cuda.bindings.nvml as nvml + from cuda.bindings import driver, nvml device_id = int(getattr(device, "device_id", device)) (err,) = driver.cuInit(0) @@ -34,6 +29,8 @@ def is_windows_mcdm_device(device=0): def xfail_if_mempool_oom(err_or_exc, api_name=None, device=0): + from cuda.bindings import driver, runtime + if api_name is not None and not isinstance(api_name, str): device = api_name api_name = None diff --git a/cuda_bindings/cuda/bindings/_test_helpers/pep723.py b/cuda_python_test_helpers/cuda_python_test_helpers/pep723.py similarity index 100% rename from cuda_bindings/cuda/bindings/_test_helpers/pep723.py rename to cuda_python_test_helpers/cuda_python_test_helpers/pep723.py diff --git a/cuda_python_test_helpers/pyproject.toml b/cuda_python_test_helpers/pyproject.toml index 85652b61c50..f20720f6158 100644 --- a/cuda_python_test_helpers/pyproject.toml +++ b/cuda_python_test_helpers/pyproject.toml @@ -1,4 +1,4 @@ -# 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 [build-system] @@ -12,7 +12,7 @@ description = "Shared test helpers for CUDA Python projects" readme = {file = "README.md", content-type = "text/markdown"} authors = [{ name = "NVIDIA Corporation" }] license = "Apache-2.0" -requires-python = ">=3.9" +requires-python = ">=3.10" classifiers = [ "Programming Language :: Python :: 3 :: Only", "Operating System :: POSIX :: Linux", diff --git a/pytest.ini b/pytest.ini index 148b722aca2..505b4269490 100644 --- a/pytest.ini +++ b/pytest.ini @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 [pytest] -addopts = --showlocals +addopts = --showlocals --durations=20 norecursedirs = cuda_bindings/examples cuda_core/examples diff --git a/toolshed/_catalog_writer.py b/toolshed/_catalog_writer.py deleted file mode 100644 index b41fb5838dd..00000000000 --- a/toolshed/_catalog_writer.py +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Shared helper for reading, updating, and rewriting descriptor_catalog.py. - -Each toolshed script that extracts data from CTK distributions or wheel -layouts uses this module to merge its findings into the authored catalog -without touching fields it doesn't own. -""" - -from __future__ import annotations - -import dataclasses -import json -import sys -from pathlib import Path - -# Ensure the cuda_pathfinder package is importable. -_REPO_ROOT = Path(__file__).resolve().parents[1] -_PATHFINDER_ROOT = _REPO_ROOT / "cuda_pathfinder" -if str(_PATHFINDER_ROOT) not in sys.path: - sys.path.insert(0, str(_PATHFINDER_ROOT)) - -from cuda.pathfinder._dynamic_libs.descriptor_catalog import ( # noqa: E402 - DESCRIPTOR_CATALOG, - DescriptorSpec, -) - -CATALOG_PATH = _PATHFINDER_ROOT / "cuda" / "pathfinder" / "_dynamic_libs" / "descriptor_catalog.py" - -_DEFAULTS = DescriptorSpec(name="", packaged_with="ctk") - -_SECTION_COMMENTS = { - "ctk": ( - " # -----------------------------------------------------------------------\n" - " # CTK (CUDA Toolkit) libraries\n" - " # -----------------------------------------------------------------------" - ), - "other": ( - " # -----------------------------------------------------------------------\n" - " # Third-party / separately packaged libraries\n" - " # -----------------------------------------------------------------------" - ), - "driver": ( - " # -----------------------------------------------------------------------\n" - " # Driver libraries (system-search only, no CTK cascade)\n" - " # -----------------------------------------------------------------------" - ), -} - - -def _quote(s: str) -> str: - return json.dumps(s) - - -def _render_tuple(values: tuple[str, ...]) -> str: - if not values: - return "()" - if len(values) == 1: - return f"({_quote(values[0])},)" - return "(" + ", ".join(_quote(v) for v in values) + ")" - - -def _render_spec(spec: DescriptorSpec) -> str: - """Render a single DescriptorSpec constructor call, omitting default-valued fields.""" - lines = [ - " DescriptorSpec(", - f" name={_quote(spec.name)},", - f' packaged_with="{spec.packaged_with}",', - ] - - tuple_fields = [ - "linux_sonames", - "windows_dlls", - "site_packages_linux", - "site_packages_windows", - "dependencies", - "anchor_rel_dirs_linux", - "anchor_rel_dirs_windows", - "ctk_root_canary_anchor_libnames", - ] - bool_fields = [ - "requires_add_dll_directory", - "requires_rtld_deepbind", - ] - - for field in tuple_fields: - value = getattr(spec, field) - default = getattr(_DEFAULTS, field) - if value != default: - lines.append(f" {field}={_render_tuple(value)},") - - for field in bool_fields: - value = getattr(spec, field) - default = getattr(_DEFAULTS, field) - if value != default: - lines.append(f" {field}={value},") - - lines.append(" ),") - return "\n".join(lines) - - -def render_catalog(specs: tuple[DescriptorSpec, ...]) -> str: - """Render the full descriptor_catalog.py file content.""" - header = '''\ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Canonical authored descriptor catalog for dynamic libraries.""" - -from __future__ import annotations - -from dataclasses import dataclass -from typing import Literal - -PackagedWith = Literal["ctk", "other", "driver"] - - -@dataclass(frozen=True, slots=True) -class DescriptorSpec: - name: str - packaged_with: PackagedWith - linux_sonames: tuple[str, ...] = () - windows_dlls: tuple[str, ...] = () - site_packages_linux: tuple[str, ...] = () - site_packages_windows: tuple[str, ...] = () - dependencies: tuple[str, ...] = () - anchor_rel_dirs_linux: tuple[str, ...] = ("lib64", "lib") - anchor_rel_dirs_windows: tuple[str, ...] = ("bin/x64", "bin") - ctk_root_canary_anchor_libnames: tuple[str, ...] = () - requires_add_dll_directory: bool = False - requires_rtld_deepbind: bool = False - - -DESCRIPTOR_CATALOG: tuple[DescriptorSpec, ...] = ( -''' - - body_parts: list[str] = [] - prev_packaged_with = None - for spec in specs: - if spec.packaged_with != prev_packaged_with: - comment = _SECTION_COMMENTS.get(spec.packaged_with) - if comment is not None: - body_parts.append(comment) - prev_packaged_with = spec.packaged_with - body_parts.append(_render_spec(spec)) - - footer = ")\n" - return header + "\n".join(body_parts) + "\n" + footer - - -def load_catalog() -> tuple[DescriptorSpec, ...]: - """Return the current DESCRIPTOR_CATALOG from disk.""" - return DESCRIPTOR_CATALOG - - -def load_catalog_as_dict() -> dict[str, DescriptorSpec]: - """Return the current catalog keyed by name.""" - return {spec.name: spec for spec in DESCRIPTOR_CATALOG} - - -def update_specs( - catalog: tuple[DescriptorSpec, ...], - updates: dict[str, dict[str, object]], -) -> tuple[DescriptorSpec, ...]: - """Apply field updates to matching specs by name, preserving order.""" - result = [] - for spec in catalog: - if spec.name in updates: - result.append(dataclasses.replace(spec, **updates[spec.name])) - else: - result.append(spec) - return tuple(result) - - -def write_catalog(specs: tuple[DescriptorSpec, ...], path: Path | None = None) -> None: - """Render and write the catalog to disk.""" - if path is None: - path = CATALOG_PATH - path.write_text(render_catalog(specs), encoding="utf-8") diff --git a/toolshed/build_pathfinder_dlls.py b/toolshed/build_pathfinder_dlls.py deleted file mode 100755 index 63abba52386..00000000000 --- a/toolshed/build_pathfinder_dlls.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# -# SPDX-License-Identifier: Apache-2.0 - -"""Scan 7z listing files for .dll names, update descriptor_catalog.py. - -Usage: - # First generate listings from CTK .exe installers: - # for exe in *.exe; do 7z l "$exe" > "${exe%.exe}.txt"; done - python toolshed/build_pathfinder_dlls.py listing1.txt [listing2.txt ...] -""" - -from __future__ import annotations - -import collections -import sys -from pathlib import Path - -sys.path.insert(0, str(Path(__file__).resolve().parent)) -from _catalog_writer import load_catalog, update_specs, write_catalog - - -def _is_suppressed_dll(libname: str, dll: str) -> bool: - if libname == "cudart": - if dll.startswith("cudart32_"): - return True - if dll == "cudart64_65.dll": - # PhysX/files/Common/cudart64_65.dll from CTK 6.5, but shipped with CTK 12.0-12.9 - return True - if dll == "cudart64_101.dll": - # GFExperience.NvStreamSrv/amd64/server/cudart64_101.dll from CTK 10.1, but shipped with CTK 12.0-12.6 - return True - elif libname == "nvrtc": - if dll.endswith(".alt.dll"): - return True - if dll.startswith("nvrtc-builtins"): - return True - elif libname == "nvvm" and dll == "nvvm32.dll": - return True - return False - - -def _parse_listings(paths: list[str]) -> set[str]: - dlls: set[str] = set() - for filename in paths: - lines_iter = iter(Path(filename).read_text().splitlines()) - for line in lines_iter: - if line.startswith("-------------------"): - break - else: - raise RuntimeError(f"------------------- NOT FOUND in {filename}") - for line in lines_iter: - if line.startswith("-------------------"): - break - assert line[52] == " ", line - assert line[53] != " ", line - path = line[53:] - if path.endswith(".dll"): - dll = path.rsplit("/", 1)[1] - dlls.add(dll) - else: - raise RuntimeError(f"------------------- NOT FOUND in {filename}") - return dlls - - -def run(listing_files: list[str]) -> None: - dlls_from_files = _parse_listings(listing_files) - catalog = load_catalog() - - # Longest-prefix-first to avoid ambiguous matches (e.g. "cufftw" before "cufft"). - ctk_names = sorted( - (spec.name for spec in catalog if spec.packaged_with == "ctk"), - key=lambda n: (-len(n), n), - ) - - dlls_in_scope: set[str] = set() - dlls_by_name: dict[str, list[str]] = collections.defaultdict(list) - suppressed: set[str] = set() - - for name in ctk_names: - for dll in sorted(dlls_from_files): - if dll not in dlls_in_scope and dll.startswith(name): - if _is_suppressed_dll(name, dll): - suppressed.add(dll) - else: - dlls_by_name[name].append(dll) - dlls_in_scope.add(dll) - - updates: dict[str, dict[str, object]] = {} - for name, dlls in dlls_by_name.items(): - updates[name] = {"windows_dlls": tuple(dlls)} - - if updates: - write_catalog(update_specs(catalog, updates)) - for name in sorted(updates): - print(f" updated {name}: windows_dlls={updates[name]['windows_dlls']}") - else: - print("No matching DLLs found.") - - if suppressed: - print(f"\nSuppressed DLLs ({len(suppressed)}):") - for dll in sorted(suppressed): - print(f" {dll}") - - out_of_scope = dlls_from_files - dlls_in_scope - if out_of_scope: - print(f"\nDLLs out of scope ({len(out_of_scope)}):") - for dll in sorted(out_of_scope): - print(f" {dll}") - - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Usage: build_pathfinder_dlls.py <7z-listing.txt> ...", file=sys.stderr) - sys.exit(1) - run(listing_files=sys.argv[1:]) diff --git a/toolshed/build_pathfinder_sonames.py b/toolshed/build_pathfinder_sonames.py deleted file mode 100755 index b3fa6c2efc9..00000000000 --- a/toolshed/build_pathfinder_sonames.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# -# SPDX-License-Identifier: Apache-2.0 - -"""Scan directories for .so files, extract SONAMEs, update descriptor_catalog.py. - -Usage: - python toolshed/build_pathfinder_sonames.py /path/to/cuda [/more/paths ...] -""" - -from __future__ import annotations - -import os -import subprocess -import sys -from pathlib import Path - -sys.path.insert(0, str(Path(__file__).resolve().parent)) -from _catalog_writer import load_catalog, update_specs, write_catalog - - -def _extract_soname(path: str) -> str | None: - try: - out = subprocess.run( # noqa: S603 - ["readelf", "-d", path], # noqa: S607 - capture_output=True, - text=True, - timeout=10, - ) - except (FileNotFoundError, subprocess.TimeoutExpired): - return None - for line in out.stdout.splitlines(): - if "SONAME" in line: - # Format: 0x000000000000000e (SONAME) Library soname: [libfoo.so.1] - start = line.find("[") - end = line.find("]") - if start != -1 and end != -1: - return line[start + 1 : end] - return None - - -def _find_sonames(roots: list[str]) -> set[str]: - sonames: set[str] = set() - for root in roots: - for dirpath, _dirnames, filenames in os.walk(root): - for fname in filenames: - if ".so" not in fname: - continue - full = os.path.join(dirpath, fname) - if os.path.islink(full): - continue - soname = _extract_soname(full) - if soname is not None: - sonames.add(soname) - return sonames - - -def run(roots: list[str]) -> None: - sonames_found = _find_sonames(roots) - catalog = load_catalog() - - updates: dict[str, dict[str, object]] = {} - matched: set[str] = set() - for spec in catalog: - if spec.packaged_with != "ctk": - continue - prefix = "lib" + spec.name + ".so" - found = tuple(sorted(s for s in sonames_found if s.startswith(prefix))) - if found: - updates[spec.name] = {"linux_sonames": found} - matched.update(found) - - if updates: - write_catalog(update_specs(catalog, updates)) - for name, upd in sorted(updates.items()): - print(f" updated {name}: linux_sonames={upd['linux_sonames']}") - else: - print("No matching sonames found.") - - unmatched = sonames_found - matched - if unmatched: - print(f"\nSONAMEs not matched to any CTK descriptor ({len(unmatched)}):") - for s in sorted(unmatched): - print(f" {s}") - - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Usage: build_pathfinder_sonames.py [ ...]", file=sys.stderr) - sys.exit(1) - run(roots=sys.argv[1:]) diff --git a/toolshed/check_cython_abi.py b/toolshed/check_cython_abi.py index 32b5e6be11e..b72edf40c5c 100644 --- a/toolshed/check_cython_abi.py +++ b/toolshed/check_cython_abi.py @@ -38,6 +38,7 @@ import ctypes import importlib import json +import re import sys import sysconfig from io import StringIO @@ -91,6 +92,21 @@ def is_cython_module(module: object) -> bool: return hasattr(module, "__pyx_capi__") +def iter_public_extension_modules(build_dir: Path): + """Yield the extension modules under `build_dir` that are part of the public ABI. + + Private modules (e.g. cuda/bindings/_internal/utils.so) are skipped. Only the + path *inside* the package is inspected: directories above it routinely start + with an underscore (manylinux installs Python under /opt/_internal, GitHub + Actions containers check out under /__w), and those must not make every + module look private. + """ + for so_path in Path(build_dir).glob(f"**/*{EXT_SUFFIX}"): + if any(part.startswith("_") for part in so_path.relative_to(build_dir).parts): + continue + yield so_path + + ###################################################################################### # STRUCTS @@ -114,6 +130,9 @@ def _format_base_type_name(bt: object) -> str: if cls == "CComplexBaseTypeNode": inner = _format_base_type_name(bt.base_type) return _unwrap_declarator(inner, bt.declarator)[0] + if cls == "CConstOrVolatileTypeNode": + # Discard const/volatile qualifiers; they don't affect ABI layout + return _format_base_type_name(bt.base_type) return cls @@ -263,6 +282,62 @@ def get_structs(module: object) -> dict: return dict(sorted(structs.items())) +_OLD_ANON_RE = re.compile(r"^anon_(struct|union)\d+$") +_NEW_ANON_RE = re.compile(r"^\w+__anon_pod\d+$") + + +def _is_anon_name(name: str) -> bool: + return bool(_OLD_ANON_RE.match(name)) or bool(_NEW_ANON_RE.match(name)) + + +def _normalize_type(type_str: str, rename_map: dict) -> str: + """Replace old anon_struct/union names in a type string using rename_map.""" + for old, new in rename_map.items(): + # Use word-boundary matching so e.g. "anon_struct1" doesn't corrupt "anon_struct12" + type_str = re.sub(r"\b" + re.escape(old) + r"\b", new, type_str) + return type_str + + +def _build_anon_rename_map(expected: dict, found: dict) -> dict: + """Match old anon_struct/union names to new MODULE__anon_pod names by field content. + + Works iteratively bottom-up: leaf anon structs (whose fields contain no anon + type references) are matched first. Their old->new mapping is then used to + normalize the field types of the remaining unmatched anon structs, which may + allow the next round to match parent structs that embed them. Repeats until + no new matches are found in a round. + """ + old_anons = {name: info for name, info in expected.items() if _is_anon_name(name)} + new_pods = {name: info for name, info in found.items() if _is_anon_name(name)} + + rename_map = {} + matched_pods = set() + unmatched_old = dict(old_anons) + + while True: + matched_this_round = {} + + for old_name, old_info in unmatched_old.items(): + # Normalize this struct's field types using mappings found so far + normalized_fields = [[_normalize_type(f[0], rename_map), f[1]] for f in old_info.get("fields", [])] + for new_name, new_info in new_pods.items(): + if new_name in matched_pods: + continue + if normalized_fields == new_info.get("fields", []): + matched_this_round[old_name] = new_name + matched_pods.add(new_name) + break + + if not matched_this_round: + break # No progress; remaining old anons have no content-matching pod + + rename_map.update(matched_this_round) + for name in matched_this_round: + del unmatched_old[name] + + return rename_map + + def _report_field_changes(name: str, expected_fields: list, found_fields: list) -> None: """Print detailed field-level differences for a struct.""" expected_dict = {f[1]: f[0] for f in expected_fields} @@ -289,12 +364,22 @@ def check_structs(expected: dict, found: dict) -> tuple[bool, bool]: has_errors = False has_allowed_changes = False + rename_map = _build_anon_rename_map(expected, found) + renamed_new = set(rename_map.values()) + for name, expected_info in expected.items(): - if name not in found: + effective_name = rename_map.get(name, name) + + if effective_name not in found: print(f" Missing struct/class: {name}") has_errors = True continue - found_info = found[name] + + if effective_name != name: + # Anon struct/union renamed to new-style anon_pod — allowed change + has_allowed_changes = True + + found_info = found[effective_name] if "basicsize" in expected_info: if "basicsize" not in found_info: @@ -310,12 +395,15 @@ def check_structs(expected: dict, found: dict) -> tuple[bool, bool]: if "fields" not in found_info: print(f" Struct {name}: field information no longer available") has_errors = True - elif found_info["fields"] != expected_info["fields"]: - _report_field_changes(name, expected_info["fields"], found_info["fields"]) - has_errors = True + else: + # Normalize old anon type names in expected field types before comparing + normalized_fields = [[_normalize_type(f[0], rename_map), f[1]] for f in expected_info["fields"]] + if found_info["fields"] != normalized_fields: + _report_field_changes(name, normalized_fields, found_info["fields"]) + has_errors = True for name in found: - if name not in expected: + if name not in expected and name not in renamed_new: print(f" Added struct/class: {name}") has_allowed_changes = True @@ -400,7 +488,7 @@ def check(package: str, abi_dir: Path) -> bool: print(f"No module found for {abi_path.relative_to(abi_dir)}") has_errors = True - for so_path in Path(build_dir).glob(f"**/*{EXT_SUFFIX}"): + for so_path in iter_public_extension_modules(build_dir): module = import_from_path(package, build_dir, so_path) if hasattr(module, "__pyx_capi__"): abi_path = so_path_to_abi_path(so_path, build_dir, abi_dir) @@ -425,7 +513,7 @@ def generate(package: str, abi_dir: Path) -> bool: return True build_dir = get_package_path(package) - for so_path in Path(build_dir).glob(f"**/*{EXT_SUFFIX}"): + for so_path in iter_public_extension_modules(build_dir): try: module = import_from_path(package, build_dir, so_path) except ImportError: diff --git a/toolshed/collect_site_packages_dll_files.ps1 b/toolshed/collect_site_packages_dll_files.ps1 index f0a6f799242..4efebbf3aab 100644 --- a/toolshed/collect_site_packages_dll_files.ps1 +++ b/toolshed/collect_site_packages_dll_files.ps1 @@ -1,12 +1,11 @@ # collect_site_packages_dll_files.ps1 -# 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 # Usage: # cd cuda-python # powershell -File toolshed\collect_site_packages_dll_files.ps1 -# python .\toolshed\make_site_packages_libdirs.py windows site_packages_dll.txt $ErrorActionPreference = 'Stop' diff --git a/toolshed/collect_site_packages_so_files.sh b/toolshed/collect_site_packages_so_files.sh index 974f6eeae86..a88652bdfe0 100755 --- a/toolshed/collect_site_packages_so_files.sh +++ b/toolshed/collect_site_packages_so_files.sh @@ -1,12 +1,11 @@ #!/bin/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 # Usage: # cd cuda-python # ./toolshed/collect_site_packages_so_files.sh -# ./toolshed/make_site_packages_libdirs.py linux site_packages_so.txt set -euo pipefail fresh_venv() { diff --git a/toolshed/make_site_packages_libdirs.py b/toolshed/make_site_packages_libdirs.py deleted file mode 100755 index e1cbcb28825..00000000000 --- a/toolshed/make_site_packages_libdirs.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""Parse collected site-packages library paths, update descriptor_catalog.py. - -Usage: - python toolshed/make_site_packages_libdirs.py linux collected_linux.txt - python toolshed/make_site_packages_libdirs.py windows collected_windows.txt -""" - -from __future__ import annotations - -import argparse -import os -import re -import sys -from pathlib import Path -from typing import Dict, Set - -sys.path.insert(0, str(Path(__file__).resolve().parent)) -from _catalog_writer import load_catalog, update_specs, write_catalog - -_SITE_PACKAGES_RE = re.compile(r"(?i)^.*?/site-packages/") - - -def _strip_site_packages_prefix(p: str) -> str: - """Remove any leading '.../site-packages/' (handles '\\' or '/', case-insensitive).""" - p = p.replace("\\", "/") - return _SITE_PACKAGES_RE.sub("", p) - - -def _parse_lines_linux(lines: list[str]) -> Dict[str, Set[str]]: - d: Dict[str, Set[str]] = {} - for raw in lines: - line = raw.strip() - if not line or line.startswith("#"): - continue - line = _strip_site_packages_prefix(line) - dirpath, fname = os.path.split(line) - # Require something like libNAME.so, libNAME.so.12, libNAME.so.12.1, etc. - i = fname.find(".so") - if not fname.startswith("lib") or i == -1: - continue - name = fname[3:i] # e.g. "libnvrtc" -> "nvrtc" - d.setdefault(name, set()).add(dirpath) - return d - - -def _extract_libname_from_dll(fname: str) -> str | None: - """Return base libname per the heuristic, or None if not a .dll.""" - base = os.path.basename(fname) - if not base.lower().endswith(".dll"): - return None - stem = base[:-4] # drop ".dll" - out = [] - for ch in stem: - if ch == "_" or ch.isdigit(): - break - out.append(ch) - name = "".join(out) - return name or None - - -def _parse_lines_windows(lines: list[str]) -> Dict[str, Set[str]]: - """Collect {libname: set(dirnames)} with deduped directories.""" - m: Dict[str, Set[str]] = {} - for raw in lines: - line = raw.strip() - if not line or line.startswith("#"): - continue - line = _strip_site_packages_prefix(line) - dirpath, fname = os.path.split(line) - libname = _extract_libname_from_dll(fname) - if not libname: - continue - m.setdefault(libname, set()).add(dirpath) - return m - - -def main() -> None: - ap = argparse.ArgumentParser( - description="Update site_packages_* in descriptor_catalog.py from collected library paths" - ) - ap.add_argument("platform", choices=["linux", "windows"]) - ap.add_argument("path", help="Text file with one library path per line") - args = ap.parse_args() - - with open(args.path, encoding="utf-8") as f: - lines = f.read().splitlines() - - if args.platform == "linux": - parsed = _parse_lines_linux(lines) - field = "site_packages_linux" - else: - parsed = _parse_lines_windows(lines) - field = "site_packages_windows" - - catalog = load_catalog() - catalog_names = {spec.name for spec in catalog} - - updates: dict[str, dict[str, object]] = {} - for name, dirs in parsed.items(): - if name in catalog_names: - updates[name] = {field: tuple(sorted(dirs))} - - if updates: - write_catalog(update_specs(catalog, updates)) - for name in sorted(updates): - print(f" updated {name}: {field}={updates[name][field]}") - else: - print("No matching libraries found.") - - unmatched = set(parsed.keys()) - catalog_names - if unmatched: - print(f"\nLibraries not in catalog ({len(unmatched)}):") - for name in sorted(unmatched): - print(f" {name}") - - -if __name__ == "__main__": - main() diff --git a/toolshed/run_stubgen_pyx.py b/toolshed/run_stubgen_pyx.py new file mode 100644 index 00000000000..1a163ff0778 --- /dev/null +++ b/toolshed/run_stubgen_pyx.py @@ -0,0 +1,54 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Run stubgen-pyx for cuda_core and normalize the generated stub headers. + +stubgen-pyx emits a path using the OS path separator in the first-line comment +(e.g. "# This file was generated by stubgen-pyx from cuda_core\\cuda\\..."). +This wrapper rewrites that separator to "/" so committed stubs are identical +across platforms. Line-ending normalization is handled by .gitattributes. + +This also forces stubgen-pyx to write files with UTF-8 encoding, which is not +the default on Windows. + +This wrapper can be removed once these stubgen-pyx issues are resolved: + https://github.com/jon-edward/stubgen-pyx/issues/41 + https://github.com/jon-edward/stubgen-pyx/issues/42 +""" + +from __future__ import annotations + +import os +import pathlib +import subprocess +import sys + +_HEADER_PREFIX = b"# This file was generated by stubgen-pyx" + + +def _normalize_stub_headers(root: pathlib.Path) -> None: + for stub in root.rglob("*.pyi"): + data = stub.read_bytes() + newline = data.find(b"\n") + first_line = data[:newline] if newline != -1 else data + if not first_line.startswith(_HEADER_PREFIX) or b"\\" not in first_line: + continue + stub.write_bytes(first_line.replace(b"\\", b"/") + data[newline:]) + + +def main() -> int: + env = os.environ.copy() + env.setdefault("PYTHONUTF8", "1") + env.setdefault("PYTHONIOENCODING", "utf-8") + result = subprocess.run( + ["stubgen-pyx", "cuda_core/cuda", "--continue-on-error", "--include-private"], # noqa: S607 + env=env, + ) + if result.returncode != 0: + return result.returncode + _normalize_stub_headers(pathlib.Path("cuda_core/cuda")) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/toolshed/setup-docs-env.sh b/toolshed/setup-docs-env.sh index 16378725e93..9acbaa8e391 100755 --- a/toolshed/setup-docs-env.sh +++ b/toolshed/setup-docs-env.sh @@ -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 # Setup a local conda environment for building the sphinx docs to mirror the CI environment @@ -39,7 +39,7 @@ echo "Creating environment '${ENV_NAME}'…" # cuda_python/docs/environment-docs.yml. Please KEEP THEM IN SYNC! conda create -y -n "${ENV_NAME}" \ "python=${PYVER}" \ - cython \ + "cython>=3.2.5,<3.3" \ myst-parser \ numpy \ numpydoc \ diff --git a/toolshed/update_catalog.py b/toolshed/update_catalog.py deleted file mode 100644 index 800451ca45d..00000000000 --- a/toolshed/update_catalog.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# -# SPDX-License-Identifier: Apache-2.0 - -"""Update descriptor_catalog.py from CTK installations. - -On Linux, scans directories for .so files and extracts SONAMEs via readelf. -On Windows, parses 7z listing files generated from CTK .exe installers. - -Usage: - # Linux — pass one or more CTK lib directories: - python toolshed/update_catalog.py /path/to/ctk12/lib64 /path/to/ctk13/lib64 - - # Windows — pass 7z listing .txt files: - # for exe in *.exe; do 7z l "$exe" > "${exe%.exe}.txt"; done - python toolshed/update_catalog.py listing12.txt listing13.txt -""" - -from __future__ import annotations - -import sys -from pathlib import Path - -sys.path.insert(0, str(Path(__file__).resolve().parent)) - - -def main() -> None: - if len(sys.argv) < 2: - print(__doc__, file=sys.stderr) - sys.exit(1) - - args = sys.argv[1:] - - if sys.platform == "win32": - from build_pathfinder_dlls import run as run_dlls - - run_dlls(listing_files=args) - else: - from build_pathfinder_sonames import run as run_sonames - - run_sonames(roots=args) - - -if __name__ == "__main__": - main()