diff --git a/.devcontainer/cuda12.9-conda/devcontainer.json b/.devcontainer/cuda12.9-conda/devcontainer.json index 4fd6571c..89457df2 100644 --- a/.devcontainer/cuda12.9-conda/devcontainer.json +++ b/.devcontainer/cuda12.9-conda/devcontainer.json @@ -47,7 +47,7 @@ "./features/src/utils", "./features/src/rapids-build-utils" ], - "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config,conda/pkgs,conda/${localWorkspaceFolderBasename}-cuda12.9-envs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph}"], + "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config,conda/pkgs,conda/${localWorkspaceFolderBasename}-cuda12.9-envs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph,cuopt}"], "postAttachCommand": ["/bin/bash", "-c", "if [ ${CODESPACES:-false} = 'true' ]; then . devcontainer-utils-post-attach-command; fi"], "workspaceFolder": "/home/coder", "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/devcontainers,type=bind,consistency=consistent", @@ -66,6 +66,7 @@ "source=${localWorkspaceFolder}/../cugraph,target=/home/coder/cugraph,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../cugraph-gnn,target=/home/coder/cugraph-gnn,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../nx-cugraph,target=/home/coder/nx-cugraph,type=bind,consistency=consistent", + "source=${localWorkspaceFolder}/../cuopt,target=/home/coder/cuopt,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.aws,target=/home/coder/.aws,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.cache,target=/home/coder/.cache,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.config,target=/home/coder/.config,type=bind,consistency=consistent", diff --git a/.devcontainer/cuda12.9-pip/devcontainer.json b/.devcontainer/cuda12.9-pip/devcontainer.json index ff7e9bb7..bdc58eb3 100644 --- a/.devcontainer/cuda12.9-pip/devcontainer.json +++ b/.devcontainer/cuda12.9-pip/devcontainer.json @@ -22,6 +22,7 @@ "cuDNNVersion": "9", "installcuBLAS": true, "installcuDNN": true, + "installcuDSS": true, "installcuSOLVER": true, "installcuRAND": true, "installcuSPARSE": true, @@ -35,7 +36,7 @@ "./features/src/utils", "./features/src/rapids-build-utils" ], - "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config/pip,local/share/${localWorkspaceFolderBasename}-cuda12.9-venvs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph}"], + "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config/pip,local/share/${localWorkspaceFolderBasename}-cuda12.9-venvs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph,cuopt}"], "postAttachCommand": ["/bin/bash", "-c", "if [ ${CODESPACES:-false} = 'true' ]; then . devcontainer-utils-post-attach-command; fi"], "workspaceFolder": "/home/coder", "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/devcontainers,type=bind,consistency=consistent", @@ -54,6 +55,7 @@ "source=${localWorkspaceFolder}/../cugraph,target=/home/coder/cugraph,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../cugraph-gnn,target=/home/coder/cugraph-gnn,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../nx-cugraph,target=/home/coder/nx-cugraph,type=bind,consistency=consistent", + "source=${localWorkspaceFolder}/../cuopt,target=/home/coder/cuopt,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.aws,target=/home/coder/.aws,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.cache,target=/home/coder/.cache,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.config,target=/home/coder/.config,type=bind,consistency=consistent", diff --git a/.devcontainer/cuda13.0-conda/devcontainer.json b/.devcontainer/cuda13.0-conda/devcontainer.json index 22e6d878..b5cf3d38 100644 --- a/.devcontainer/cuda13.0-conda/devcontainer.json +++ b/.devcontainer/cuda13.0-conda/devcontainer.json @@ -47,7 +47,7 @@ "./features/src/utils", "./features/src/rapids-build-utils" ], - "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config,conda/pkgs,conda/${localWorkspaceFolderBasename}-cuda13.0-envs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph}"], + "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config,conda/pkgs,conda/${localWorkspaceFolderBasename}-cuda13.0-envs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph,cuopt}"], "postAttachCommand": ["/bin/bash", "-c", "if [ ${CODESPACES:-false} = 'true' ]; then . devcontainer-utils-post-attach-command; fi"], "workspaceFolder": "/home/coder", "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/devcontainers,type=bind,consistency=consistent", @@ -66,6 +66,7 @@ "source=${localWorkspaceFolder}/../cugraph,target=/home/coder/cugraph,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../cugraph-gnn,target=/home/coder/cugraph-gnn,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../nx-cugraph,target=/home/coder/nx-cugraph,type=bind,consistency=consistent", + "source=${localWorkspaceFolder}/../cuopt,target=/home/coder/cuopt,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.aws,target=/home/coder/.aws,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.cache,target=/home/coder/.cache,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.config,target=/home/coder/.config,type=bind,consistency=consistent", diff --git a/.devcontainer/cuda13.0-pip/devcontainer.json b/.devcontainer/cuda13.0-pip/devcontainer.json index 3bb567c1..2831e2c0 100644 --- a/.devcontainer/cuda13.0-pip/devcontainer.json +++ b/.devcontainer/cuda13.0-pip/devcontainer.json @@ -22,6 +22,7 @@ "cuDNNVersion": "9", "installcuBLAS": true, "installcuDNN": true, + "installcuDSS": true, "installcuSOLVER": true, "installcuRAND": true, "installcuSPARSE": true, @@ -35,7 +36,7 @@ "./features/src/utils", "./features/src/rapids-build-utils" ], - "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config/pip,local/share/${localWorkspaceFolderBasename}-cuda13.0-venvs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph}"], + "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config/pip,local/share/${localWorkspaceFolderBasename}-cuda13.0-venvs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph,cuopt}"], "postAttachCommand": ["/bin/bash", "-c", "if [ ${CODESPACES:-false} = 'true' ]; then . devcontainer-utils-post-attach-command; fi"], "workspaceFolder": "/home/coder", "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/devcontainers,type=bind,consistency=consistent", @@ -54,6 +55,7 @@ "source=${localWorkspaceFolder}/../cugraph,target=/home/coder/cugraph,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../cugraph-gnn,target=/home/coder/cugraph-gnn,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../nx-cugraph,target=/home/coder/nx-cugraph,type=bind,consistency=consistent", + "source=${localWorkspaceFolder}/../cuopt,target=/home/coder/cuopt,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.aws,target=/home/coder/.aws,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.cache,target=/home/coder/.cache,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.config,target=/home/coder/.config,type=bind,consistency=consistent", diff --git a/.devcontainer/cuda13.1-conda/devcontainer.json b/.devcontainer/cuda13.1-conda/devcontainer.json index 9a81af83..96de4f55 100644 --- a/.devcontainer/cuda13.1-conda/devcontainer.json +++ b/.devcontainer/cuda13.1-conda/devcontainer.json @@ -47,7 +47,7 @@ "./features/src/utils", "./features/src/rapids-build-utils" ], - "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config,conda/pkgs,conda/${localWorkspaceFolderBasename}-cuda13.1-envs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph}"], + "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config,conda/pkgs,conda/${localWorkspaceFolderBasename}-cuda13.1-envs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph,cuopt}"], "postAttachCommand": ["/bin/bash", "-c", "if [ ${CODESPACES:-false} = 'true' ]; then . devcontainer-utils-post-attach-command; fi"], "workspaceFolder": "/home/coder", "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/devcontainers,type=bind,consistency=consistent", @@ -66,6 +66,7 @@ "source=${localWorkspaceFolder}/../cugraph,target=/home/coder/cugraph,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../cugraph-gnn,target=/home/coder/cugraph-gnn,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../nx-cugraph,target=/home/coder/nx-cugraph,type=bind,consistency=consistent", + "source=${localWorkspaceFolder}/../cuopt,target=/home/coder/cuopt,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.aws,target=/home/coder/.aws,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.cache,target=/home/coder/.cache,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.config,target=/home/coder/.config,type=bind,consistency=consistent", diff --git a/.devcontainer/cuda13.1-pip/devcontainer.json b/.devcontainer/cuda13.1-pip/devcontainer.json index 091d4bb7..dfb80eb6 100644 --- a/.devcontainer/cuda13.1-pip/devcontainer.json +++ b/.devcontainer/cuda13.1-pip/devcontainer.json @@ -22,6 +22,7 @@ "cuDNNVersion": "9", "installcuBLAS": true, "installcuDNN": true, + "installcuDSS": true, "installcuSOLVER": true, "installcuRAND": true, "installcuSPARSE": true, @@ -35,7 +36,7 @@ "./features/src/utils", "./features/src/rapids-build-utils" ], - "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config/pip,local/share/${localWorkspaceFolderBasename}-cuda13.1-venvs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph}"], + "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config/pip,local/share/${localWorkspaceFolderBasename}-cuda13.1-venvs,log/devcontainer-utils} ${localWorkspaceFolder}/../{rmm,dask-cuda,kvikio,ucxx,cudf,rapidsmpf,raft,cuvs,cuml,cugraph,cugraph-gnn,nx-cugraph,cuopt}"], "postAttachCommand": ["/bin/bash", "-c", "if [ ${CODESPACES:-false} = 'true' ]; then . devcontainer-utils-post-attach-command; fi"], "workspaceFolder": "/home/coder", "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/devcontainers,type=bind,consistency=consistent", @@ -54,6 +55,7 @@ "source=${localWorkspaceFolder}/../cugraph,target=/home/coder/cugraph,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../cugraph-gnn,target=/home/coder/cugraph-gnn,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../nx-cugraph,target=/home/coder/nx-cugraph,type=bind,consistency=consistent", + "source=${localWorkspaceFolder}/../cuopt,target=/home/coder/cuopt,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.aws,target=/home/coder/.aws,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.cache,target=/home/coder/.cache,type=bind,consistency=consistent", "source=${localWorkspaceFolder}/../.config,target=/home/coder/.config,type=bind,consistency=consistent", diff --git a/.devcontainer/rapids.Dockerfile b/.devcontainer/rapids.Dockerfile index a86b7ccc..c64c52b8 100644 --- a/.devcontainer/rapids.Dockerfile +++ b/.devcontainer/rapids.Dockerfile @@ -20,6 +20,12 @@ RUN apt update -y \ liblapack-dev \ # rapidsmpf dependencies libnuma-dev \ + # cuOpt dependencies + libtbb-dev \ + libboost-dev \ + libboost-iostreams-dev \ + libboost-serialization-dev \ + libboost-program-options-dev \ && rm -rf /tmp/* /var/tmp/* /var/cache/apt/* /var/lib/apt/lists/*; ENV DEFAULT_VIRTUAL_ENV=rapids diff --git a/.github/workflows/build-all-rapids-repos.yml b/.github/workflows/build-all-rapids-repos.yml index 12b3b251..52989221 100644 --- a/.github/workflows/build-all-rapids-repos.yml +++ b/.github/workflows/build-all-rapids-repos.yml @@ -40,7 +40,7 @@ jobs: matrix: include: - libs: "rmm ucxx kvikio dask-cuda cudf cudf_kafka rapidsmpf" - - libs: "rmm ucxx dask-cuda raft cuvs cuml" + - libs: "rmm ucxx dask-cuda raft cuvs cuml cuopt" - libs: "rmm ucxx dask-cuda raft cugraph cugraph-gnn nx-cugraph" with: @@ -105,32 +105,32 @@ jobs: rapids-post-start-command; # Configure all the C++ libs - run_command "Configure C++ libraries" bash -c "\ - time configure-all \ - -j${PARALLEL_LEVEL} \ - -GNinja \ - -Wno-dev \ - -DBUILD_TESTS=ON \ - -DBUILD_BENCHMARKS=ON \ - -DBUILD_PRIMS_BENCH=ON \ - -DBUILD_SHARED_LIBS=ON \ - -DRAFT_COMPILE_LIBRARY=ON \ - -DBUILD_CUGRAPH_MG_TESTS=ON 2>&1 \ + run_command "Configure C++ libraries" bash -ceuo pipefail "\ + time configure-all \ + -j${PARALLEL_LEVEL} \ + -GNinja \ + -Wno-dev \ + -DBUILD_TESTS=ON \ + -DBUILD_BENCHMARKS=ON \ + -DBUILD_PRIMS_BENCH=ON \ + -DBUILD_SHARED_LIBS=ON \ + -DRAFT_COMPILE_LIBRARY=ON \ + -DBUILD_CUGRAPH_MG_TESTS=ON 2>&1 \ | tee -a telemetry-artifacts/build.log"; # Build all the C++ libs - run_command "Build C++ libraries" bash -c "\ + run_command "Build C++ libraries" bash -ceuo pipefail "\ time build-all-cpp -j${PARALLEL_LEVEL} 2>&1 | tee -a telemetry-artifacts/build.log"; # Build all the Python libs - run_command "Build Python libraries" bash -c "\ + run_command "Build Python libraries" bash -ceuo pipefail "\ time build-all-python -j${PARALLEL_LEVEL} 2>&1 | tee -a telemetry-artifacts/build.log"; # Print cache and dist stats - run_command "sccache stats" bash -c "\ + run_command "sccache stats" bash -ceuo pipefail "\ sccache --show-adv-stats | tee -a telemetry-artifacts/sccache-stats.txt"; # Print build times - run_command "Build times" bash -c "\ + run_command "Build times" bash -ceuo pipefail "\ find /var/log/devcontainer-utils/ -type f -name 'build-*-time.log' -print0 \ | xargs -0 -n1 grep -H real | sed 's/real\t/ /g' || :" # Nonfatal if not found diff --git a/.github/workflows/test-rapids-build-times.yml b/.github/workflows/test-rapids-build-times.yml index 5816091c..2cb6b6d6 100644 --- a/.github/workflows/test-rapids-build-times.yml +++ b/.github/workflows/test-rapids-build-times.yml @@ -127,7 +127,7 @@ jobs: } # Clone all the repos - time run_command "Clone RAPIDS repositories" bash -c "\ + time run_command "Clone RAPIDS repositories" bash -ceuo pipefail "\ RAPIDS_TO_UCXX_BRANCH=\"$(convert_ucx_branch ucxx '${{ inputs.branch }}')\"; CLONE_ARGS=(-j$(nproc) -q -v --clone-upstream --depth 1 --single-branch --shallow-submodules --no-update-env); clone-all -b \"${{ inputs.branch }}\" \${CLONE_ARGS[*]} >/dev/null 2>&1; @@ -136,13 +136,13 @@ jobs: sleep 1 - time run_command "Create RAPIDS python environment" bash -c "\ + time run_command "Create RAPIDS python environment" bash -ceuo pipefail "\ rapids-post-start-command >/dev/null" 2>&1 sleep 1 # Configure all the C++ libs - time run_command "Configure C++ libraries" bash -c "\ + time run_command "Configure C++ libraries" bash -ceuo pipefail "\ configure-all \ -j${PARALLEL_LEVEL} \ -GNinja \ @@ -162,11 +162,11 @@ jobs: "SCCACHE_S3_USE_PREPROCESSOR_CACHE_MODE=1" ; do # Restart sccache - run_command "Start sccache (${ENVVAR})" bash -c "\ + run_command "Start sccache (${ENVVAR})" bash -ceuo pipefail "\ ${ENVVAR} devcontainer-utils-start-sccache --kill-all >/dev/null 2>&1" # Build all the C++ libs - time run_command "Build C++ libraries (${ENVVAR})" bash -c "\ + time run_command "Build C++ libraries (${ENVVAR})" bash -ceuo pipefail "\ ${ENVVAR} build-all-cpp -j${PARALLEL_LEVEL} >/dev/null" 2>&1 sleep 1 @@ -176,12 +176,12 @@ jobs: sccache --show-adv-stats # Print build times - run_command "Build times (${ENVVAR})" bash -c "\ + run_command "Build times (${ENVVAR})" bash -ceuo pipefail "\ find /var/log/devcontainer-utils/ -type f -name 'build-*-time.log' -print0 \ | xargs -0 -n1 grep -H real | sed 's/real\t/ /g' || : # Nonfatal if not found" # Clean - run_command "Clean (${ENVVAR})" bash -c "\ + run_command "Clean (${ENVVAR})" bash -ceuo pipefail "\ find /var/log/devcontainer-utils/ -type f -name 'build-*-time.log' -delete >/dev/null 2>&1 || : # Nonfatal if not found find ~/ -maxdepth 4 -type l -path '*/cpp/build/latest' -print0 | xargs -P$(nproc) -0 -n1 ninja clean -C >/dev/null 2>&1 || : # Nonfatal if not found" done diff --git a/features/src/cuda/devcontainer-feature.json b/features/src/cuda/devcontainer-feature.json index 638f30d8..3bd9535a 100644 --- a/features/src/cuda/devcontainer-feature.json +++ b/features/src/cuda/devcontainer-feature.json @@ -1,7 +1,7 @@ { "name": "CUDA Toolkit", "id": "cuda", - "version": "26.4.0", + "version": "26.4.1", "description": "A feature to install the NVIDIA CUDA Toolkit", "options": { "version": { @@ -64,6 +64,11 @@ "default": false, "description": "Install CUDA Deep Neural Network Library (cuDNN)" }, + "installcuDSS": { + "type": "boolean", + "default": false, + "description": "Install CUDA Direct Solver of Sparse Linear Systems (cuDSS)" + }, "installcuTensor": { "type": "boolean", "default": false, diff --git a/features/src/cuda/install.sh b/features/src/cuda/install.sh index 7e0b218d..07843ea9 100644 --- a/features/src/cuda/install.sh +++ b/features/src/cuda/install.sh @@ -186,6 +186,10 @@ if [ "${INSTALLCUDNN:-false}" = true ]; then fi fi +if "${INSTALLCUDSS:-false}"; then + PKGS+=("cudss-cuda-${cuda_ver_major}"); +fi + if [ "${INSTALLNCCL:-false}" = true ] \ && test -n "$(apt-cache search libnccl2 2>/dev/null)" \ && apt-cache policy libnccl2 2>/dev/null | grep -q "+${cuda_tag}"; then diff --git a/features/src/llvm/devcontainer-feature.json b/features/src/llvm/devcontainer-feature.json index 4b80836a..07e40634 100644 --- a/features/src/llvm/devcontainer-feature.json +++ b/features/src/llvm/devcontainer-feature.json @@ -1,7 +1,7 @@ { "name": "LLVM compilers and tools", "id": "llvm", - "version": "26.4.0", + "version": "26.4.1", "description": "A feature to install LLVM compilers and tools", "options": { "version": { @@ -25,6 +25,12 @@ "type": "string", "default": "all", "description": "LLVM packages to install." + }, + "repoVersionOverride": { + "type": "string", + "default": "", + "proposals": ["", "latest"], + "description": "Override the apt repo version component (i.e. `llvm-toolchain-jammy-`) in case the LLVM repo is in a transitional state and the desired version isn't published to the version-specific URL yet." } }, "containerEnv": { diff --git a/features/src/llvm/install.sh b/features/src/llvm/install.sh index c6b585f2..aad632b5 100755 --- a/features/src/llvm/install.sh +++ b/features/src/llvm/install.sh @@ -8,6 +8,7 @@ cd "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"; . ./common/install.sh; LLVM_VERSION="${VERSION:-}"; +export LLVM_REPO_VERSION_OVERRIDE="${REPOVERSIONOVERRIDE:-}"; check_packages \ git \ diff --git a/features/src/llvm/llvm.sh b/features/src/llvm/llvm.sh index 4b0e1bd3..096ec7d7 100755 --- a/features/src/llvm/llvm.sh +++ b/features/src/llvm/llvm.sh @@ -38,13 +38,13 @@ if [[ ${#missing_binaries[@]} -gt 0 ]] ; then fi # Set default values for commandline arguments -DISTRO=$(lsb_release -is) -VERSION=$(lsb_release -sr) +DISTRO="$(lsb_release -is)" +VERSION="$(lsb_release -sr)" UBUNTU_CODENAME="" CODENAME_FROM_ARGUMENTS="" # Obtain VERSION_CODENAME and UBUNTU_CODENAME (for Ubuntu and its derivatives) source /etc/os-release -DISTRO=${DISTRO,,} +DISTRO="${DISTRO,,}" case ${DISTRO} in debian) if [[ "${VERSION}" == "unstable" ]] || [[ "${VERSION}" == "testing" ]] || [[ "${VERSION_CODENAME}" == "bookworm" ]]; then @@ -54,23 +54,23 @@ case ${DISTRO} in LINKNAME= else # "stable" Debian release - CODENAME=${VERSION_CODENAME} - LINKNAME=-${CODENAME} + CODENAME="${VERSION_CODENAME}" + LINKNAME="-${CODENAME}" fi ;; *) # ubuntu and its derivatives if [[ -n "${UBUNTU_CODENAME}" ]]; then - CODENAME=${UBUNTU_CODENAME} + CODENAME="${UBUNTU_CODENAME}" if [[ -n "${CODENAME}" ]]; then - LINKNAME=-${CODENAME} + LINKNAME="-${CODENAME}" fi fi ;; esac # read command line arguments -LLVM_VERSION=$1; +LLVM_VERSION="${1:-}"; PKG=(${*:2}); while getopts ":hm:n:" arg; do @@ -79,15 +79,15 @@ while getopts ":hm:n:" arg; do usage ;; m) - BASE_URL=${OPTARG} + BASE_URL="${OPTARG}" ;; n) - CODENAME=${OPTARG} + CODENAME="${OPTARG}" if [[ "${CODENAME}" == "unstable" ]]; then # link name does not apply to unstable repository LINKNAME= else - LINKNAME=-${CODENAME} + LINKNAME="-${CODENAME}" fi CODENAME_FROM_ARGUMENTS="true" ;; @@ -129,18 +129,22 @@ LLVM_VERSION_STRING="${LLVM_VERSION_PATTERNS[$LLVM_VERSION]}" # join the repository name if [[ -n "${CODENAME}" ]]; then - retry_count=0; + if [ "${LLVM_REPO_VERSION_OVERRIDE:-}" = latest ]; then + LLVM_VERSION_STRING="" + else + retry_count=0; - while ! wget --no-hsts -q --method=HEAD \ - "${BASE_URL}/${CODENAME}/dists/llvm-toolchain${LINKNAME}${LLVM_VERSION_PATTERNS[$LLVM_VERSION]}/Release" >/dev/null 2>&1; do - if test $(( retry_count++ )) -ge 5; then - LLVM_VERSION_STRING= - break; - fi - sleep_time=$((retry_count * 5)) - echo "Attempt $retry_count failed! Trying again in $sleep_time seconds..." - sleep $sleep_time - done + while ! wget --no-hsts -q --method=HEAD \ + "${BASE_URL}/${CODENAME}/dists/llvm-toolchain${LINKNAME}${LLVM_VERSION_PATTERNS[$LLVM_VERSION]}/Release" >/dev/null 2>&1; do + if test $(( retry_count++ )) -ge 5; then + LLVM_VERSION_STRING="" + break; + fi + sleep_time="$((retry_count * 5))" + echo "Attempt $retry_count failed! Trying again in $sleep_time seconds..." + sleep "$sleep_time" + done + fi REPO_NAME="deb ${BASE_URL}/${CODENAME}/ llvm-toolchain${LINKNAME}${LLVM_VERSION_STRING} main" diff --git a/features/src/rapids-build-utils/devcontainer-feature.json b/features/src/rapids-build-utils/devcontainer-feature.json index 2f13b102..11f4257e 100644 --- a/features/src/rapids-build-utils/devcontainer-feature.json +++ b/features/src/rapids-build-utils/devcontainer-feature.json @@ -1,7 +1,7 @@ { "name": "NVIDIA RAPIDS devcontainer build utilities", "id": "rapids-build-utils", - "version": "26.4.1", + "version": "26.4.2", "description": "A feature to install the RAPIDS devcontainer build utilities", "containerEnv": { "BASH_ENV": "/etc/bash.bash_env" diff --git a/features/src/rapids-build-utils/opt/rapids-build-utils/manifest.yaml b/features/src/rapids-build-utils/opt/rapids-build-utils/manifest.yaml index 67ed96aa..21debac7 100755 --- a/features/src/rapids-build-utils/opt/rapids-build-utils/manifest.yaml +++ b/features/src/rapids-build-utils/opt/rapids-build-utils/manifest.yaml @@ -225,13 +225,18 @@ repos: - name: cugraph sub_dir: cpp depends: [rmm, ucxx, raft, cuvs] - parallelism: - max_device_obj_memory_usage: 6Gi + env: | + CFLAGS=-D_GLIBCXX_USE_TBB_PAR_BACKEND=0 + CXXFLAGS=-D_GLIBCXX_USE_TBB_PAR_BACKEND=0 + CUDAFLAGS=-D_GLIBCXX_USE_TBB_PAR_BACKEND=0 test: ci/run_ctests.sh - name: cugraph_etl sub_dir: cpp/libcugraph_etl depends: [cudf, cugraph] - args: {install: *rapids_build_backend_args} + env: | + CFLAGS=-D_GLIBCXX_USE_TBB_PAR_BACKEND=0 + CXXFLAGS=-D_GLIBCXX_USE_TBB_PAR_BACKEND=0 + CUDAFLAGS=-D_GLIBCXX_USE_TBB_PAR_BACKEND=0 python: - name: libcugraph sub_dir: python/libcugraph @@ -280,3 +285,22 @@ repos: - name: nx-cugraph sub_dir: . args: {install: *rapids_build_backend_args} + +- name: cuopt + path: cuopt + git: {<<: *git_defaults, repo: cuopt, upstream: NVIDIA} + cpp: + - name: cuopt + sub_dir: cpp + depends: [rmm, raft] + env: | + CUDSS_DIR=/usr + python: + - name: libcuopt + sub_dir: python/libcuopt + depends: [cuopt] + args: {install: *rapids_build_backend_args} + - name: cuopt + sub_dir: python/cuopt + depends: [cuopt, cudf, raft] + args: {install: *rapids_build_backend_args} diff --git a/matrix.yml b/matrix.yml index 7202c54a..533366ef 100644 --- a/matrix.yml +++ b/matrix.yml @@ -40,6 +40,8 @@ x-ucx-rapids: &ucx_rapids { name: "ucx", version: "1.19.0" } x-openmpi: &openmpi { name: "openmpi", version: "5.0.7" } x-cccl-dev: &cccl_dev { name: "cccl-dev", hide: true, doxygenVersion: "1.9.6" } +x-clangd-dev-bionic: &clangd_dev_bionic { name: "llvm", version: "22", packages: "clangd", repoVersionOverride: "latest", hide: true } +x-clangd-dev-jammy: &clangd_dev_jammy { name: "llvm", version: "22", packages: "clangd", repoVersionOverride: "latest", hide: true } x-clangd-dev: &clangd_dev { name: "llvm", version: "22", packages: "clangd", hide: true } x-clang-format-cccl: &clang_format_cccl { name: "llvm", version: "21", packages: "clang-format llvm-tools", hide: true } x-clang-format-rapids: &clang_format_rapids { name: "llvm", version: "16", packages: "clang-format", hide: true } @@ -77,56 +79,56 @@ include: - os: "ubuntu:20.04" images: - - { features: [*python, *dood, *gcc_7, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_7, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_8, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_8, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_9, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_9, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_10, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_10, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - - { features: [*python, *dood, *llvm_14, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_14, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *gcc_7, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_bionic, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_7, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_bionic, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_8, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_bionic, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_8, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_bionic, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_9, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_bionic, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_9, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_bionic, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_10, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_bionic, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_10, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_bionic, *cccl_dev], env: *gcc_env } + + - { features: [*python, *dood, *llvm_14, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_bionic, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_14, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_bionic, *cccl_dev], env: *llvm_env } - os: "ubuntu:22.04" images: - - { features: [*python, *dood, *gcc_11, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_11, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_11, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_11, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_12, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_12, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_12, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - { features: [*python, *dood, *gcc_12, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_11, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_11, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_11, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_11, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_12, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_12, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_12, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *gcc_env } + - { features: [*python, *dood, *gcc_12, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *gcc_env } # This is only used for testing python -- CTKk 12.0 + gcc13 don't play nice together, but # that doesn't matter for running python tests, and pinning all python jobs at 13 simplifies # things significantly. - - { features: [*python, *dood, *gcc_13, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *gcc_env } - - - { features: [*python, *dood, *llvm_15, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_15, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_15, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_15, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_16, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_16, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_16, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_16, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_17, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_17, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_17, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_17, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_18, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_18, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_18, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_18, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_19, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_19, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_19, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_19, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_20, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } - - { features: [*python, *dood, *llvm_21, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *gcc_13, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *gcc_env } + + - { features: [*python, *dood, *llvm_15, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_15, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_15, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_15, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_16, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_16, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_16, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_16, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_17, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_17, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_17, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_17, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_18, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_18, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_18, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_18, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_19, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_19, { <<: *cuda_prev_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_19, { <<: *cuda_curr_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_19, { <<: *cuda_curr_max, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_20, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } + - { features: [*python, *dood, *llvm_21, { <<: *cuda_prev_min, <<: *cccl_cuda_opts }, *clang_format_cccl, *clangd_dev_jammy, *cccl_dev], env: *llvm_env } - os: "ubuntu:24.04" images: