From c51b301357b858719418d72bd1dc4c295aab1454 Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Mon, 2 Nov 2026 16:14:30 -0500 Subject: [PATCH 1/2] Link libcuvs conda package with lld Add a `build-for-packaging` CMake preset (Release build, all supported GPU architectures, lld linker) and use it for the libcuvs conda build via build.sh's --cmake-args. Only the libcuvs recipe changes; the cuvs and cuvs-bench recipes and the wheel builds are unchanged. build.sh passes CMAKE_BUILD_TYPE and CMAKE_CUDA_ARCHITECTURES as -D flags ahead of --cmake-args. Command-line -D values take precedence over a preset's cache variables, so --gpu-arch and a non-Release build type still apply when the preset is selected; the setting the preset adds in the build.sh path is the linker. Measured link times, default GNU ld vs lld 23.1.4 (CUDA 13.3, conda GCC 13.3, CMAKE_CUDA_ARCHITECTURES=RAPIDS as with build.sh --allgpuarch, 64 cores, idle machine, median of 5 interleaved runs of the link commands taken from `ninja -t commands`): libcuvs.so (274 MB) 3.88 s -> 0.56 s (6.9x faster) libcuvs_c.so (3.6 MB) 0.21 s -> 0.06 s (3.8x faster) A single-architecture (sm_75) build shows the same: libcuvs.so goes from 3.68 s to 0.48 s (7.7x). Trade-offs and limits of the measurement: - This saves about 3.3 s per libcuvs.so link, against an all-arch compile of roughly 85 minutes. Link time barely grows with the number of GPU architectures because the extra size is embedded device code. - The lld-linked libcuvs.so is about 7 MB larger (the unloaded .strtab symbol-name table) and its peak RSS is higher (723 MB -> 976 MB). - The tests and bench-ann executables the recipe also links were not measured. --- conda/recipes/libcuvs/recipe.yaml | 3 ++- cpp/CMakePresets.json | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 cpp/CMakePresets.json diff --git a/conda/recipes/libcuvs/recipe.yaml b/conda/recipes/libcuvs/recipe.yaml index 9e152da9c5..c30d3add01 100644 --- a/conda/recipes/libcuvs/recipe.yaml +++ b/conda/recipes/libcuvs/recipe.yaml @@ -32,7 +32,7 @@ outputs: export CXXFLAGS=$(echo $CXXFLAGS | sed -E 's@\-fdebug\-prefix\-map[^ ]*@@g') set +x - ./build.sh libcuvs bench-ann tests --allgpuarch --mnmg-tests --build-metrics=compile_lib --incl-cache-stats --no-nvtx -n + ./build.sh libcuvs bench-ann tests --allgpuarch --mnmg-tests --build-metrics=compile_lib --incl-cache-stats --no-nvtx -n --cmake-args=\"--preset=build-for-packaging\" cmake --build cpp/build --target cuvs cuvs_c ./examples/build.sh --allgpuarch @@ -76,6 +76,7 @@ outputs: - ${{ compiler("cuda") }} - cuda-version =${{ cuda_version }} - cmake ${{ cmake_version }} + - lld - ninja - python - if: cuda_major == "13" diff --git a/cpp/CMakePresets.json b/cpp/CMakePresets.json new file mode 100644 index 0000000000..a3d94aa08c --- /dev/null +++ b/cpp/CMakePresets.json @@ -0,0 +1,19 @@ +{ + "version": 6, + "cmakeMinimumRequired": { + "major": 3, + "minor": 25, + "patch": 0 + }, + "configurePresets": [ + { + "name": "build-for-packaging", + "displayName": "package build (flags for production)", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_CUDA_ARCHITECTURES": "RAPIDS", + "CMAKE_LINKER_TYPE": "LLD" + } + } + ] +} From ca09b0986071bd7d9750f42c40aa9bf4eee02eb3 Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Mon, 2 Nov 2026 16:14:34 -0500 Subject: [PATCH 2/2] Add lld to conda build dependencies Developers who build with build.sh can now select the build-for-packaging preset (--cmake-args="--preset=build-for-packaging") without installing lld separately. Regenerate the conda environment files. --- conda/environments/all_cuda-129_arch-aarch64.yaml | 1 + conda/environments/all_cuda-129_arch-x86_64.yaml | 1 + conda/environments/all_cuda-134_arch-aarch64.yaml | 1 + conda/environments/all_cuda-134_arch-x86_64.yaml | 1 + conda/environments/bench_ann_cuda-129_arch-aarch64.yaml | 1 + conda/environments/bench_ann_cuda-129_arch-x86_64.yaml | 1 + conda/environments/bench_ann_cuda-134_arch-aarch64.yaml | 1 + conda/environments/bench_ann_cuda-134_arch-x86_64.yaml | 1 + conda/environments/go_cuda-129_arch-aarch64.yaml | 1 + conda/environments/go_cuda-129_arch-x86_64.yaml | 1 + conda/environments/go_cuda-134_arch-aarch64.yaml | 1 + conda/environments/go_cuda-134_arch-x86_64.yaml | 1 + conda/environments/rust_cuda-129_arch-aarch64.yaml | 1 + conda/environments/rust_cuda-129_arch-x86_64.yaml | 1 + conda/environments/rust_cuda-134_arch-aarch64.yaml | 1 + conda/environments/rust_cuda-134_arch-x86_64.yaml | 1 + dependencies.yaml | 1 + 17 files changed, 17 insertions(+) diff --git a/conda/environments/all_cuda-129_arch-aarch64.yaml b/conda/environments/all_cuda-129_arch-aarch64.yaml index 481affa0b2..61a91156f9 100644 --- a/conda/environments/all_cuda-129_arch-aarch64.yaml +++ b/conda/environments/all_cuda-129_arch-aarch64.yaml @@ -30,6 +30,7 @@ dependencies: - libnvjitlink-dev - libopenblas<=0.3.30 - librmm==26.12.*,>=0.0.0a0 +- lld - make - maven>=3.10.0,<3.11.0 - nccl>=2.19 diff --git a/conda/environments/all_cuda-129_arch-x86_64.yaml b/conda/environments/all_cuda-129_arch-x86_64.yaml index 30467281b9..76a0f04edc 100644 --- a/conda/environments/all_cuda-129_arch-x86_64.yaml +++ b/conda/environments/all_cuda-129_arch-x86_64.yaml @@ -29,6 +29,7 @@ dependencies: - libkvikio==26.12.*,>=0.0.0a0 - libnvjitlink-dev - librmm==26.12.*,>=0.0.0a0 +- lld - make - maven>=3.10.0,<3.11.0 - nccl>=2.19 diff --git a/conda/environments/all_cuda-134_arch-aarch64.yaml b/conda/environments/all_cuda-134_arch-aarch64.yaml index cb4428956d..3e19b10213 100644 --- a/conda/environments/all_cuda-134_arch-aarch64.yaml +++ b/conda/environments/all_cuda-134_arch-aarch64.yaml @@ -32,6 +32,7 @@ dependencies: - libnvjitlink-dev - libopenblas<=0.3.30 - librmm==26.12.*,>=0.0.0a0 +- lld - make - maven>=3.10.0,<3.11.0 - nccl>=2.19 diff --git a/conda/environments/all_cuda-134_arch-x86_64.yaml b/conda/environments/all_cuda-134_arch-x86_64.yaml index 992c5a5148..5e6dd64da3 100644 --- a/conda/environments/all_cuda-134_arch-x86_64.yaml +++ b/conda/environments/all_cuda-134_arch-x86_64.yaml @@ -31,6 +31,7 @@ dependencies: - libkvikio==26.12.*,>=0.0.0a0 - libnvjitlink-dev - librmm==26.12.*,>=0.0.0a0 +- lld - make - maven>=3.10.0,<3.11.0 - nccl>=2.19 diff --git a/conda/environments/bench_ann_cuda-129_arch-aarch64.yaml b/conda/environments/bench_ann_cuda-129_arch-aarch64.yaml index e2e44560aa..7006d57152 100644 --- a/conda/environments/bench_ann_cuda-129_arch-aarch64.yaml +++ b/conda/environments/bench_ann_cuda-129_arch-aarch64.yaml @@ -31,6 +31,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - librmm==26.12.*,>=0.0.0a0 +- lld - matplotlib-base>=3.9 - nccl>=2.19 - ninja diff --git a/conda/environments/bench_ann_cuda-129_arch-x86_64.yaml b/conda/environments/bench_ann_cuda-129_arch-x86_64.yaml index e8cee3f0f8..32816eb9a0 100644 --- a/conda/environments/bench_ann_cuda-129_arch-x86_64.yaml +++ b/conda/environments/bench_ann_cuda-129_arch-x86_64.yaml @@ -33,6 +33,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - librmm==26.12.*,>=0.0.0a0 +- lld - matplotlib-base>=3.9 - mkl-devel=2023 - nccl>=2.19 diff --git a/conda/environments/bench_ann_cuda-134_arch-aarch64.yaml b/conda/environments/bench_ann_cuda-134_arch-aarch64.yaml index fc872d4451..11ce95f73d 100644 --- a/conda/environments/bench_ann_cuda-134_arch-aarch64.yaml +++ b/conda/environments/bench_ann_cuda-134_arch-aarch64.yaml @@ -33,6 +33,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - librmm==26.12.*,>=0.0.0a0 +- lld - matplotlib-base>=3.9 - nccl>=2.19 - ninja diff --git a/conda/environments/bench_ann_cuda-134_arch-x86_64.yaml b/conda/environments/bench_ann_cuda-134_arch-x86_64.yaml index 9a1e6000e2..74a4efb2cf 100644 --- a/conda/environments/bench_ann_cuda-134_arch-x86_64.yaml +++ b/conda/environments/bench_ann_cuda-134_arch-x86_64.yaml @@ -35,6 +35,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - librmm==26.12.*,>=0.0.0a0 +- lld - matplotlib-base>=3.9 - mkl-devel=2023 - nccl>=2.19 diff --git a/conda/environments/go_cuda-129_arch-aarch64.yaml b/conda/environments/go_cuda-129_arch-aarch64.yaml index 1c5360b50b..7a0465cc7b 100644 --- a/conda/environments/go_cuda-129_arch-aarch64.yaml +++ b/conda/environments/go_cuda-129_arch-aarch64.yaml @@ -27,6 +27,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - libraft==26.12.*,>=0.0.0a0 +- lld - nccl>=2.19 - ninja - sysroot_linux-aarch64==2.28 diff --git a/conda/environments/go_cuda-129_arch-x86_64.yaml b/conda/environments/go_cuda-129_arch-x86_64.yaml index bb80d91328..e3daee3519 100644 --- a/conda/environments/go_cuda-129_arch-x86_64.yaml +++ b/conda/environments/go_cuda-129_arch-x86_64.yaml @@ -27,6 +27,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - libraft==26.12.*,>=0.0.0a0 +- lld - nccl>=2.19 - ninja - sysroot_linux-64==2.28 diff --git a/conda/environments/go_cuda-134_arch-aarch64.yaml b/conda/environments/go_cuda-134_arch-aarch64.yaml index ac64865e27..cd91d02460 100644 --- a/conda/environments/go_cuda-134_arch-aarch64.yaml +++ b/conda/environments/go_cuda-134_arch-aarch64.yaml @@ -27,6 +27,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - libraft==26.12.*,>=0.0.0a0 +- lld - nccl>=2.19 - ninja - sysroot_linux-aarch64==2.28 diff --git a/conda/environments/go_cuda-134_arch-x86_64.yaml b/conda/environments/go_cuda-134_arch-x86_64.yaml index 863335cc93..768aaea85a 100644 --- a/conda/environments/go_cuda-134_arch-x86_64.yaml +++ b/conda/environments/go_cuda-134_arch-x86_64.yaml @@ -27,6 +27,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - libraft==26.12.*,>=0.0.0a0 +- lld - nccl>=2.19 - ninja - sysroot_linux-64==2.28 diff --git a/conda/environments/rust_cuda-129_arch-aarch64.yaml b/conda/environments/rust_cuda-129_arch-aarch64.yaml index 8d500c35d7..7cd8a6f292 100644 --- a/conda/environments/rust_cuda-129_arch-aarch64.yaml +++ b/conda/environments/rust_cuda-129_arch-aarch64.yaml @@ -22,6 +22,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - libraft==26.12.*,>=0.0.0a0 +- lld - make - nccl>=2.19 - ninja diff --git a/conda/environments/rust_cuda-129_arch-x86_64.yaml b/conda/environments/rust_cuda-129_arch-x86_64.yaml index 7729a54464..b15633bd21 100644 --- a/conda/environments/rust_cuda-129_arch-x86_64.yaml +++ b/conda/environments/rust_cuda-129_arch-x86_64.yaml @@ -22,6 +22,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - libraft==26.12.*,>=0.0.0a0 +- lld - make - nccl>=2.19 - ninja diff --git a/conda/environments/rust_cuda-134_arch-aarch64.yaml b/conda/environments/rust_cuda-134_arch-aarch64.yaml index 0b1e057d05..34ee78dfef 100644 --- a/conda/environments/rust_cuda-134_arch-aarch64.yaml +++ b/conda/environments/rust_cuda-134_arch-aarch64.yaml @@ -22,6 +22,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - libraft==26.12.*,>=0.0.0a0 +- lld - make - nccl>=2.19 - ninja diff --git a/conda/environments/rust_cuda-134_arch-x86_64.yaml b/conda/environments/rust_cuda-134_arch-x86_64.yaml index ff8704105a..fc981f9483 100644 --- a/conda/environments/rust_cuda-134_arch-x86_64.yaml +++ b/conda/environments/rust_cuda-134_arch-x86_64.yaml @@ -22,6 +22,7 @@ dependencies: - libcuvs==26.12.*,>=0.0.0a0 - libnvjitlink-dev - libraft==26.12.*,>=0.0.0a0 +- lld - make - nccl>=2.19 - ninja diff --git a/dependencies.yaml b/dependencies.yaml index 81065245d0..82299e63d0 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -297,6 +297,7 @@ dependencies: - c-compiler - cuda-nvcc - cxx-compiler + - lld specific: - output_types: conda matrices: