diff --git a/build.sh b/build.sh index 1ee8e87fc..b5c35f510 100755 --- a/build.sh +++ b/build.sh @@ -89,6 +89,7 @@ CACHE_ARGS=() PYTHON_ARGS_FOR_INSTALL=("-m" "pip" "install" "--no-build-isolation" "--no-deps") LOGGING_ACTIVE_LEVEL="INFO" FETCH_RAPIDS=ON +PARALLEL_LEVEL=${PARALLEL_LEVEL:=$(nproc)} # Set defaults for vars that may not have been defined externally # FIXME: if PREFIX is not set, check CONDA_PREFIX, but there is no fallback @@ -379,14 +380,17 @@ if buildAll || hasArg libcuopt; then -DSKIP_ROUTING_BUILD=${SKIP_ROUTING_BUILD} \ -DWRITE_FATBIN=${WRITE_FATBIN} \ -DHOST_LINEINFO=${HOST_LINEINFO} \ + -DPARALLEL_LEVEL="${PARALLEL_LEVEL}" \ -DINSTALL_TARGET="${INSTALL_TARGET}" \ "${CACHE_ARGS[@]}" \ "${EXTRA_CMAKE_ARGS[@]}" \ "${REPODIR}"/cpp + JFLAG="${PARALLEL_LEVEL:+-j${PARALLEL_LEVEL}}" if hasArg -n; then - cmake --build "${LIBCUOPT_BUILD_DIR}" ${VERBOSE_FLAG} + # Manual make invocation to start its jobserver + make ${JFLAG} -C "${REPODIR}/cpp" LIBCUOPT_BUILD_DIR="${LIBCUOPT_BUILD_DIR}" VERBOSE_FLAG="${VERBOSE_FLAG}" PARALLEL_LEVEL="${PARALLEL_LEVEL}" ninja-build else - cmake --build "${LIBCUOPT_BUILD_DIR}" --target ${INSTALL_TARGET} ${VERBOSE_FLAG} -j"${PARALLEL_LEVEL}" + cmake --build "${LIBCUOPT_BUILD_DIR}" --target ${INSTALL_TARGET} ${VERBOSE_FLAG} ${JFLAG} fi fi diff --git a/conda/recipes/libcuopt/recipe.yaml b/conda/recipes/libcuopt/recipe.yaml index 8e56c6934..b4cccd714 100644 --- a/conda/recipes/libcuopt/recipe.yaml +++ b/conda/recipes/libcuopt/recipe.yaml @@ -58,6 +58,7 @@ cache: - ${{ stdlib("c") }} - cuda-version =${{ cuda_version }} - cmake ${{ cmake_version }} + - make - ninja - tbb-devel - zlib diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index fac00c66a..f3c59ba4e 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -150,6 +150,15 @@ if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 12.9 AND CMAKE_CUDA_COMPILE endif() list(APPEND CUOPT_CUDA_FLAGS -fopenmp) +# Add jobserver flags for parallel compilation if PARALLEL_LEVEL is set +if(PARALLEL_LEVEL AND NOT "${PARALLEL_LEVEL}" STREQUAL "") + message(STATUS "Enabling nvcc parallel compilation support") + list(APPEND CUOPT_CUDA_FLAGS --threads=0 --split-compile=0) + if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0) + message(STATUS "Enabling nvcc jobserver support (NVCC >= 13.0)") + list(APPEND CUOPT_CUDA_FLAGS --jobserver) + endif() +endif() if(NOT DISABLE_OPENMP) find_package(OpenMP) diff --git a/cpp/Makefile b/cpp/Makefile new file mode 100644 index 000000000..d451e9bed --- /dev/null +++ b/cpp/Makefile @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Makefile + +LIBCUOPT_BUILD_DIR ?= cpp/build +VERBOSE_FLAG ?= +PARALLEL_LEVEL ?= + +.PHONY: all ninja-build + +all: ninja-build + +ninja-build: + cmake --build $(LIBCUOPT_BUILD_DIR) $(VERBOSE_FLAG) $(if $(PARALLEL_LEVEL),-j$(PARALLEL_LEVEL),)