Skip to content
2 changes: 1 addition & 1 deletion cmake/RAPIDS.cmake
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# =============================================================================
# cmake-format: off
# SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION.
# SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# cmake-format: on
# =============================================================================
Expand Down
88 changes: 57 additions & 31 deletions cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# =============================================================================
# cmake-format: off
# SPDX-FileCopyrightText: Copyright (c) 2018-2026, NVIDIA CORPORATION. SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright (c) 2018-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# cmake-format: on
#
Expand All @@ -24,12 +24,10 @@ include(rapids-cuda)
include(rapids-export)
include(rapids-find)

rapids_cuda_init_architectures(NVForest)

project(
NVForest
VERSION "${RAPIDS_VERSION}"
LANGUAGES CXX CUDA)
LANGUAGES CXX)

# Write the version header
rapids_cmake_write_version_file(include/nvforest/version_config.hpp)
Expand Down Expand Up @@ -70,6 +68,7 @@ option(NVFOREST_EXCLUDE_RAFT_FROM_ALL "Exclude RAFT targets from nvForest's 'all
option(NVFOREST_EXCLUDE_TREELITE_FROM_ALL "Exclude Treelite targets from nvForest's 'all' target" OFF)
option(NVFOREST_RAFT_CLONE_ON_PIN "Explicitly clone RAFT branch when pinned to non-feature branch" ON)

message(VERBOSE "NVFOREST_CPP: Enabling GPU: ${NVFOREST_ENABLE_GPU}")
message(VERBOSE "NVFOREST_CPP: Building nvForest algorithm tests: ${BUILD_NVFOREST_TESTS}")
message(VERBOSE "NVFOREST_CPP: Enabling detection of conda environment for dependencies: ${DETECT_CONDA_ENV}")
message(VERBOSE "NVFOREST_CPP: Disabling OpenMP: ${DISABLE_OPENMP}")
Expand All @@ -81,6 +80,18 @@ message(VERBOSE "NVFOREST_CPP: Cache build artifacts with ccache: ${USE_CCACHE}"
message(VERBOSE "NVFOREST_CPP: Build and statically link RAFT library: ${NVFOREST_USE_RAFT_STATIC}")
message(VERBOSE "NVFOREST_CPP: Build and statically link Treelite library: ${NVFOREST_USE_TREELITE_STATIC}")

if(NVFOREST_ENABLE_GPU)
rapids_cuda_init_architectures(NVForest)
enable_language(CUDA)
# Invoke rapids_cuda_set_architectures() manually This step is needed because we are lazily initializing CUDA archs
# after the project() call
foreach(icl IN LISTS CMAKE_PROJECT_NVForest_INCLUDE)
if(icl MATCHES "rapids-cmake-src")
include(${icl})
endif()
endforeach()
endif()

# Set RMM logging level
set(RMM_LOGGING_LEVEL
"INFO"
Expand Down Expand Up @@ -148,22 +159,26 @@ if(NOT DISABLE_OPENMP)
endif()

# CUDA runtime
rapids_cuda_init_runtime(USE_STATIC ON)

# * find CUDAToolkit package
# * determine GPU architectures
# * enable the CMake CUDA language
# * set other CUDA compilation flags
rapids_find_package(
CUDAToolkit REQUIRED
BUILD_EXPORT_SET nvforest-exports
INSTALL_EXPORT_SET nvforest-exports)
include(cmake/modules/ConfigureCUDA.cmake)
if(NVFOREST_ENABLE_GPU)
rapids_cuda_init_runtime(USE_STATIC ON)

# * find CUDAToolkit package
# * determine GPU architectures
# * enable the CMake CUDA language
# * set other CUDA compilation flags
rapids_find_package(
CUDAToolkit REQUIRED
BUILD_EXPORT_SET nvforest-exports
INSTALL_EXPORT_SET nvforest-exports)
include(cmake/modules/ConfigureCUDA.cmake)
endif()

if(USE_CCACHE)
set(CMAKE_C_COMPILER_LAUNCHER ccache)
set(CMAKE_CXX_COMPILER_LAUNCHER ccache)
set(CMAKE_CUDA_COMPILER_LAUNCHER ccache)
if(NVFOREST_ENABLE_GPU)
set(CMAKE_CUDA_COMPILER_LAUNCHER ccache)
endif()
endif()

# ######################################################################################################################
Expand All @@ -183,8 +198,10 @@ endif()

# CCCL before RMM, and RMM before RAFT
include(cmake/thirdparty/get_cccl.cmake)
include(cmake/thirdparty/get_rmm.cmake)
include(cmake/thirdparty/get_raft.cmake)
if(NVFOREST_ENABLE_GPU)
include(cmake/thirdparty/get_rmm.cmake)
include(cmake/thirdparty/get_raft.cmake)
endif()
include(cmake/thirdparty/get_treelite.cmake)

if(BUILD_NVFOREST_TESTS)
Expand All @@ -195,15 +212,17 @@ endif()
# ######################################################################################################################
# * build libnvforest++ shared library -------------------------------------------

file(
WRITE "${CMAKE_CURRENT_BINARY_DIR}/fatbin.ld"
[=[
SECTIONS
{
.nvFatBinSegment : { *(.nvFatBinSegment) }
.nv_fatbin : { *(.nv_fatbin) }
}
]=])
if(NVFOREST_ENABLE_GPU)
file(
WRITE "${CMAKE_CURRENT_BINARY_DIR}/fatbin.ld"
[=[
SECTIONS
{
.nvFatBinSegment : { *(.nvFatBinSegment) }
.nv_fatbin : { *(.nv_fatbin) }
}
]=])
endif()

# Copy the interface include directories from INCLUDED_TARGET to TARGET. This is necessary when INCLUDED_TARGET was
# compiled statically but includes public APIs that may still require consumers to have the same interface headers
Expand Down Expand Up @@ -259,10 +278,11 @@ set_target_properties(
# set target compile options
CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
CUDA_STANDARD 20
CUDA_STANDARD_REQUIRED ON
POSITION_INDEPENDENT_CODE ON
INTERFACE_POSITION_INDEPENDENT_CODE ON)
if(NVFOREST_ENABLE_GPU)
set_target_properties(${NVFOREST_CPP_TARGET} PROPERTIES CUDA_STANDARD 20 CUDA_STANDARD_REQUIRED ON)
endif()

target_compile_definitions(${NVFOREST_CPP_TARGET} PRIVATE NVFOREST_CPP_API)

Expand Down Expand Up @@ -291,16 +311,22 @@ elseif(NVFOREST_EXPORT_TREELITE_LINKAGE)
list(APPEND _nvforest_cpp_public_libs ${TREELITE_LIBS})
endif()

if(NVFOREST_ENABLE_GPU)
list(APPEND _nvforest_cpp_public_libs rmm::rmm raft::raft CUDA::cudart_static)
endif()

# These are always private:
list(APPEND _nvforest_cpp_private_libs ${TREELITE_LIBS} ${OpenMP_CXX_LIB_NAMES})

target_link_libraries(
${NVFOREST_CPP_TARGET}
PUBLIC rapids_logger::rapids_logger rmm::rmm raft::raft CUDA::cudart_static ${_nvforest_cpp_public_libs}
PUBLIC rapids_logger::rapids_logger ${_nvforest_cpp_public_libs}
PRIVATE ${_nvforest_cpp_private_libs})

# Ensure CUDA symbols aren't relocated to the middle of the debug build binaries
target_link_options(${NVFOREST_CPP_TARGET} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/fatbin.ld")
if(NVFOREST_ENABLE_GPU)
target_link_options(${NVFOREST_CPP_TARGET} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/fatbin.ld")
endif()

# ######################################################################################################################
# * build test executables ---------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
Expand Down
18 changes: 11 additions & 7 deletions cpp/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# =============================================================================
# cmake-format: off
# SPDX-FileCopyrightText: Copyright (c) 2018-2026, NVIDIA CORPORATION. SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright (c) 2018-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# cmake-format: on
#
Expand Down Expand Up @@ -44,15 +44,16 @@ function(ConfigureTest)
target_link_libraries(
${_NVFOREST_TEST_NAME}
PRIVATE ${NVFOREST_CPP_TARGET}
rmm::rmm
raft::raft
GTest::gtest
GTest::gtest_main
GTest::gmock
${OpenMP_CXX_LIB_NAMES}
Threads::Threads
${TREELITE_LIBS}
$<TARGET_NAME_IF_EXISTS:conda_env>)
if(NVFOREST_ENABLE_GPU)
target_link_libraries(${_NVFOREST_TEST_NAME} PRIVATE rmm::rmm raft::raft)
endif()

target_compile_options(${_NVFOREST_TEST_NAME} PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${NVFOREST_CXX_FLAGS}>"
"$<$<COMPILE_LANGUAGE:CUDA>:${NVFOREST_CUDA_FLAGS}>")
Expand All @@ -63,9 +64,10 @@ function(ConfigureTest)
${_NVFOREST_TEST_NAME}
PROPERTIES INSTALL_RPATH "\$ORIGIN/../../../lib"
CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
CUDA_STANDARD 20
CUDA_STANDARD_REQUIRED ON)
CXX_STANDARD_REQUIRED ON)
if(NVFOREST_ENABLE_GPU)
set_target_properties(${_NVFOREST_TEST_NAME} PROPERTIES CUDA_STANDARD 20 CUDA_STANDARD_REQUIRED ON)
endif()

set(_NVFOREST_TEST_COMPONENT_NAME testing)

Expand All @@ -81,7 +83,9 @@ endfunction()
# ######################################################################################################################
# * Build ml_test executable -------------------------------------------------
ConfigureTest(NAME HOST_BUFFER_TEST raft_proto/buffer.cpp)
ConfigureTest(NAME DEVICE_BUFFER_TEST raft_proto/buffer.cu)
if(NVFOREST_ENABLE_GPU)
ConfigureTest(NAME DEVICE_BUFFER_TEST raft_proto/buffer.cu)
endif()
ConfigureTest(NAME FOREST_TRAVERSAL_TEST forest/traversal_forest.cpp)
ConfigureTest(NAME SHARED_MEMORY_BUFFER_TEST infer_kernel/shared_memory_buffer.cu)
ConfigureTest(NAME TREELITE_TRAVERSAL_TEST forest/treelite_traversal.cpp)
Expand Down
2 changes: 1 addition & 1 deletion cpp/tests/infer_kernel/shared_memory_buffer.cu
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

Expand Down
Loading