Skip to content

Commit b70ffd4

Browse files
authored
Merge branch 'branch-25.10' into all-neighbors-python-bindings
2 parents 0eb4186 + 5492a06 commit b70ffd4

10 files changed

Lines changed: 460 additions & 161 deletions

File tree

cpp/CMakeLists.txt

Lines changed: 138 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ option(CUDA_ENABLE_LINEINFO
6363
)
6464
option(CUDA_STATIC_RUNTIME "Statically link the CUDA runtime" OFF)
6565
option(CUDA_STATIC_MATH_LIBRARIES "Statically link the CUDA math libraries" OFF)
66-
option(CUVS_USE_RAFT_STATIC "Build and statically link the RAFT libraries" OFF)
66+
option(CUVS_STATIC_RAPIDS_LIBRARIES "Build and statically link RAPIDS libraries" OFF)
6767
option(CUDA_LOG_COMPILE_TIME "Write a log of compilation times to nvcc_compile_log.csv" OFF)
6868
option(DETECT_CONDA_ENV "Enable detection of conda environment for dependencies" ON)
6969
option(DISABLE_DEPRECATION_WARNINGS "Disable deprecaction warnings " ON)
@@ -83,6 +83,23 @@ elseif(NOT BUILD_SHARED_LIBS)
8383
set(BUILD_CAGRA_HNSWLIB OFF)
8484
endif()
8585

86+
if(NOT BUILD_SHARED_LIBS AND CUVS_COMPILE_DYNAMIC_ONLY)
87+
message(
88+
VERBOSE
89+
"cuVS: Ignoring `BUILD_SHARED_LIBS` and forcing shared library due to `CUVS_COMPILE_DYNAMIC_ONLY`"
90+
)
91+
endif()
92+
93+
set(cuvs_compile_mode "both")
94+
set(_cuvs_lib_targets cuvs cuvs_static)
95+
if(CUVS_COMPILE_DYNAMIC_ONLY)
96+
set(cuvs_compile_mode "shared_only")
97+
set(_cuvs_lib_targets cuvs)
98+
elseif(NOT BUILD_SHARED_LIBS)
99+
set(cuvs_compile_mode "static_only")
100+
set(_cuvs_lib_targets cuvs_static)
101+
endif()
102+
86103
# Needed because GoogleBenchmark changes the state of FindThreads.cmake, causing subsequent runs to
87104
# have different values for the `Threads::Threads` target. Setting this flag ensures
88105
# `Threads::Threads` is the same value across all builds so that cache hits occur
@@ -104,7 +121,7 @@ message(VERBOSE "cuVS: Enable lineinfo in nvcc: ${CUDA_ENABLE_LINEINFO}")
104121
message(VERBOSE "cuVS: Enable nvtx markers: ${CUVS_NVTX}")
105122
message(VERBOSE "cuVS: Statically link the CUDA runtime: ${CUDA_STATIC_RUNTIME}")
106123
message(VERBOSE "cuVS: Statically link the CUDA math libraries: ${CUDA_STATIC_MATH_LIBRARIES}")
107-
message(VERBOSE "cuVS: Build and statically link RAFT libraries: ${CUVS_USE_RAFT_STATIC}")
124+
message(VERBOSE "cuVS: Build and statically link RAPIDS libraries: ${CUVS_STATIC_RAPIDS_LIBRARIES}")
108125

109126
# Set RMM logging level
110127
set(RMM_LOGGING_LEVEL
@@ -200,7 +217,7 @@ endif()
200217

201218
# ##################################################################################################
202219
# * cuvs ---------------------------------------------------------------------
203-
if(BUILD_SHARED_LIBS)
220+
if(NOT BUILD_CPU_ONLY)
204221
add_library(
205222
cuvs-cagra-search STATIC
206223
src/neighbors/cagra_search_float.cu
@@ -519,25 +536,116 @@ if(BUILD_SHARED_LIBS)
519536
cuvs_objs PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CUVS_CXX_FLAGS}>"
520537
"$<$<COMPILE_LANGUAGE:CUDA>:${CUVS_CUDA_FLAGS}>"
521538
)
539+
540+
target_compile_definitions(
541+
cuvs_objs PRIVATE $<$<BOOL:${BUILD_CAGRA_HNSWLIB}>:CUVS_BUILD_CAGRA_HNSWLIB>
542+
$<$<BOOL:${CUVS_NVTX}>:NVTX_ENABLED>
543+
)
544+
522545
target_link_libraries(
523-
cuvs_objs PUBLIC raft::raft rmm::rmm ${CUVS_CTK_MATH_DEPENDENCIES}
524-
$<TARGET_NAME_IF_EXISTS:OpenMP::OpenMP_CXX>
546+
cuvs_objs
547+
PRIVATE raft::raft rmm::rmm ${CUVS_CTK_MATH_DEPENDENCIES}
548+
$<TARGET_NAME_IF_EXISTS:OpenMP::OpenMP_CXX> $<TARGET_NAME_IF_EXISTS:hnswlib::hnswlib>
525549
)
526550

527-
add_library(cuvs SHARED $<TARGET_OBJECTS:cuvs_objs>)
551+
target_include_directories(
552+
cuvs_objs
553+
PUBLIC "$<BUILD_INTERFACE:${DLPACK_INCLUDE_DIR}>"
554+
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
555+
INTERFACE "$<INSTALL_INTERFACE:include>"
556+
)
528557

529-
if(NOT CUVS_COMPILE_DYNAMIC_ONLY)
530-
add_library(cuvs_static STATIC $<TARGET_OBJECTS:cuvs_objs>)
558+
# Endian detection
559+
include(TestBigEndian)
560+
test_big_endian(BIG_ENDIAN)
561+
if(BIG_ENDIAN)
562+
target_compile_definitions(cuvs_objs PRIVATE CUVS_SYSTEM_LITTLE_ENDIAN=0)
563+
else()
564+
target_compile_definitions(cuvs_objs PRIVATE CUVS_SYSTEM_LITTLE_ENDIAN=1)
531565
endif()
532566

533-
target_compile_options(
534-
cuvs INTERFACE $<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:--expt-extended-lambda
535-
--expt-relaxed-constexpr>
567+
if(BUILD_MG_ALGOS)
568+
rapids_find_generate_module(
569+
NCCL
570+
HEADER_NAMES nccl.h
571+
LIBRARY_NAMES nccl
572+
)
573+
find_package(NCCL REQUIRED)
574+
target_link_libraries(cuvs_objs PUBLIC $<BUILD_LOCAL_INTERFACE:NCCL::NCCL>)
575+
576+
target_compile_definitions(cuvs_objs PUBLIC CUVS_BUILD_MG_ALGOS)
577+
target_compile_definitions(cuvs-cagra-search PUBLIC CUVS_BUILD_MG_ALGOS)
578+
endif()
579+
580+
set(CUVS_CUSOLVER_DEPENDENCY CUDA::cusolver${_ctk_static_suffix})
581+
set(CUVS_CUBLAS_DEPENDENCY CUDA::cublas${_ctk_static_suffix})
582+
set(CUVS_CURAND_DEPENDENCY CUDA::curand${_ctk_static_suffix})
583+
set(CUVS_CUSPARSE_DEPENDENCY CUDA::cusparse${_ctk_static_suffix})
584+
585+
set(CUVS_CTK_MATH_DEPENDENCIES ${CUVS_CUBLAS_DEPENDENCY} ${CUVS_CUSOLVER_DEPENDENCY}
586+
${CUVS_CUSPARSE_DEPENDENCY} ${CUVS_CURAND_DEPENDENCY}
536587
)
537588

538-
add_library(cuvs::cuvs ALIAS cuvs)
589+
if(NOT cuvs_compile_mode STREQUAL "static_only")
590+
add_library(cuvs SHARED $<TARGET_OBJECTS:cuvs_objs>)
591+
add_library(cuvs::cuvs ALIAS cuvs)
592+
set_target_properties(
593+
cuvs
594+
PROPERTIES BUILD_RPATH "\$ORIGIN"
595+
INSTALL_RPATH "\$ORIGIN"
596+
CXX_STANDARD 17
597+
CXX_STANDARD_REQUIRED ON
598+
CUDA_STANDARD 17
599+
CUDA_STANDARD_REQUIRED ON
600+
INTERFACE_POSITION_INDEPENDENT_CODE ON
601+
POSITION_INDEPENDENT_CODE ON
602+
)
603+
target_compile_options(
604+
cuvs
605+
INTERFACE $<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:--expt-extended-lambda
606+
--expt-relaxed-constexpr>
607+
PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CUVS_CXX_FLAGS}>"
608+
"$<$<COMPILE_LANGUAGE:CUDA>:${CUVS_CUDA_FLAGS}>"
609+
)
610+
target_compile_definitions(
611+
cuvs PUBLIC $<$<BOOL:${BUILD_CAGRA_HNSWLIB}>:CUVS_BUILD_CAGRA_HNSWLIB>
612+
$<$<BOOL:${CUVS_NVTX}>:NVTX_ENABLED>
613+
)
614+
615+
target_include_directories(
616+
cuvs PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
617+
"$<INSTALL_INTERFACE:include>"
618+
)
539619

540-
if(NOT CUVS_COMPILE_DYNAMIC_ONLY)
620+
target_link_libraries(
621+
cuvs
622+
PUBLIC rmm::rmm
623+
raft::raft
624+
${CUVS_CTK_MATH_DEPENDENCIES}
625+
$<BUILD_LOCAL_INTERFACE:$<TARGET_NAME_IF_EXISTS:NCCL::NCCL>>
626+
$<BUILD_LOCAL_INTERFACE:$<TARGET_NAME_IF_EXISTS:hnswlib::hnswlib>>
627+
$<$<BOOL:${CUVS_NVTX}>:CUDA::nvtx3>
628+
PRIVATE nvidia::cutlass::cutlass $<TARGET_NAME_IF_EXISTS:OpenMP::OpenMP_CXX>
629+
cuvs-cagra-search
630+
)
631+
632+
# ensure CUDA symbols aren't relocated to the middle of the debug build binaries
633+
file(
634+
WRITE "${CMAKE_CURRENT_BINARY_DIR}/fatbin.ld"
635+
[=[
636+
SECTIONS
637+
{
638+
.nvFatBinSegment : { *(.nvFatBinSegment) }
639+
.nv_fatbin : { *(.nv_fatbin) }
640+
}
641+
]=]
642+
)
643+
target_link_options(cuvs PRIVATE $<HOST_LINK:${CMAKE_CURRENT_BINARY_DIR}/fatbin.ld>)
644+
645+
endif()
646+
647+
if(NOT cuvs_compile_mode STREQUAL "shared_only")
648+
add_library(cuvs_static STATIC $<TARGET_OBJECTS:cuvs_objs>)
541649
add_library(cuvs::cuvs_static ALIAS cuvs_static)
542650

543651
set_target_properties(
@@ -552,16 +660,11 @@ if(BUILD_SHARED_LIBS)
552660
)
553661

554662
target_compile_options(cuvs_static PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CUVS_CXX_FLAGS}>")
555-
endif()
556-
557-
target_include_directories(
558-
cuvs_objs
559-
PUBLIC "$<BUILD_INTERFACE:${DLPACK_INCLUDE_DIR}>"
560-
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
561-
INTERFACE "$<INSTALL_INTERFACE:include>"
562-
)
663+
target_compile_definitions(
664+
cuvs_static PUBLIC $<$<BOOL:${BUILD_CAGRA_HNSWLIB}>:CUVS_BUILD_CAGRA_HNSWLIB>
665+
$<$<BOOL:${CUVS_NVTX}>:NVTX_ENABLED>
666+
)
563667

564-
if(NOT CUVS_COMPILE_DYNAMIC_ONLY)
565668
target_include_directories(
566669
cuvs_static
567670
PUBLIC "$<BUILD_INTERFACE:${DLPACK_INCLUDE_DIR}>"
@@ -575,102 +678,21 @@ if(BUILD_SHARED_LIBS)
575678
cuvs_static PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
576679
"$<INSTALL_INTERFACE:include>"
577680
)
578-
endif()
579-
580-
target_include_directories(
581-
cuvs PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
582-
"$<INSTALL_INTERFACE:include>"
583-
)
584-
585-
rapids_find_package(
586-
OpenMP REQUIRED
587-
BUILD_EXPORT_SET cuvs-exports
588-
INSTALL_EXPORT_SET cuvs-exports
589-
)
590-
591-
if(NOT BUILD_CPU_ONLY)
592-
593-
set(CUVS_CUSOLVER_DEPENDENCY CUDA::cusolver${_ctk_static_suffix})
594-
set(CUVS_CUBLAS_DEPENDENCY CUDA::cublas${_ctk_static_suffix})
595-
set(CUVS_CURAND_DEPENDENCY CUDA::curand${_ctk_static_suffix})
596-
set(CUVS_CUSPARSE_DEPENDENCY CUDA::cusparse${_ctk_static_suffix})
597-
598-
set(CUVS_CTK_MATH_DEPENDENCIES ${CUVS_CUBLAS_DEPENDENCY} ${CUVS_CUSOLVER_DEPENDENCY}
599-
${CUVS_CUSPARSE_DEPENDENCY} ${CUVS_CURAND_DEPENDENCY}
600-
)
601-
602-
if(BUILD_MG_ALGOS)
603-
rapids_find_generate_module(
604-
NCCL
605-
HEADER_NAMES nccl.h
606-
LIBRARY_NAMES nccl
607-
)
608-
find_package(NCCL REQUIRED)
609-
target_link_libraries(cuvs_objs PRIVATE NCCL::NCCL)
610-
target_link_libraries(cuvs PRIVATE NCCL::NCCL)
611-
endif()
612-
613-
# Keep cuVS as lightweight as possible. Only CUDA libs and rmm should be used in global target.
614681
target_link_libraries(
615-
cuvs
616-
PUBLIC rmm::rmm raft::raft ${CUVS_CTK_MATH_DEPENDENCIES}
682+
cuvs_static
683+
PUBLIC rmm::rmm
684+
raft::raft
685+
${CUVS_CTK_MATH_DEPENDENCIES}
686+
$<BUILD_LOCAL_INTERFACE:$<TARGET_NAME_IF_EXISTS:NCCL::NCCL>>
687+
$<BUILD_LOCAL_INTERFACE:$<TARGET_NAME_IF_EXISTS:hnswlib::hnswlib>>
688+
$<$<BOOL:${CUVS_NVTX}>:CUDA::nvtx3>
617689
PRIVATE nvidia::cutlass::cutlass $<TARGET_NAME_IF_EXISTS:OpenMP::OpenMP_CXX>
618-
cuvs-cagra-search
619690
)
620-
621-
if(NOT CUVS_COMPILE_DYNAMIC_ONLY)
622-
target_link_libraries(
623-
cuvs_static
624-
PUBLIC rmm::rmm raft::raft ${CUVS_CTK_MATH_DEPENDENCIES}
625-
PRIVATE nvidia::cutlass::cutlass $<TARGET_NAME_IF_EXISTS:OpenMP::OpenMP_CXX>
626-
)
627-
endif()
628-
endif()
629-
630-
if(BUILD_MG_ALGOS)
631-
target_compile_definitions(cuvs PUBLIC CUVS_BUILD_MG_ALGOS)
632-
target_compile_definitions(cuvs_objs PUBLIC CUVS_BUILD_MG_ALGOS)
633-
target_compile_definitions(cuvs-cagra-search PUBLIC CUVS_BUILD_MG_ALGOS)
634-
endif()
635-
636-
if(BUILD_CAGRA_HNSWLIB)
637-
target_link_libraries(cuvs_objs PRIVATE hnswlib::hnswlib)
638-
target_compile_definitions(cuvs PUBLIC CUVS_BUILD_CAGRA_HNSWLIB)
639-
target_compile_definitions(cuvs_objs PUBLIC CUVS_BUILD_CAGRA_HNSWLIB)
640-
endif()
641-
642-
# Endian detection
643-
include(TestBigEndian)
644-
test_big_endian(BIG_ENDIAN)
645-
if(BIG_ENDIAN)
646-
target_compile_definitions(cuvs PRIVATE CUVS_SYSTEM_LITTLE_ENDIAN=0)
647-
else()
648-
target_compile_definitions(cuvs PRIVATE CUVS_SYSTEM_LITTLE_ENDIAN=1)
649691
endif()
650692

651-
file(
652-
WRITE "${CMAKE_CURRENT_BINARY_DIR}/fatbin.ld"
653-
[=[
654-
SECTIONS
655-
{
656-
.nvFatBinSegment : { *(.nvFatBinSegment) }
657-
.nv_fatbin : { *(.nv_fatbin) }
658-
}
659-
]=]
660-
)
661-
662693
# ################################################################################################
663694
# * NVTX support in cuvs -----------------------------------------------------
664-
665-
if(CUVS_NVTX)
666-
# This enables NVTX within the project with no option to disable it downstream.
667-
target_link_libraries(cuvs PUBLIC CUDA::nvtx3)
668-
target_compile_definitions(cuvs_objs PUBLIC NVTX_ENABLED)
669-
target_compile_definitions(cuvs PUBLIC NVTX_ENABLED)
670-
671-
target_link_libraries(cuvs-cagra-search PUBLIC CUDA::nvtx3)
672-
target_compile_definitions(cuvs-cagra-search PUBLIC NVTX_ENABLED)
673-
else()
695+
if(NOT CUVS_NVTX)
674696
# Allow enable NVTX downstream if not set here. This creates a new option at build/install time,
675697
# which is set by default to OFF, but can be enabled in the dependent project.
676698
get_property(
@@ -693,25 +715,6 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$<BOOL:${CUVS_NVTX}>:NVTX_ENAB
693715
)
694716
endif()
695717

696-
set_target_properties(
697-
cuvs
698-
PROPERTIES BUILD_RPATH "\$ORIGIN"
699-
INSTALL_RPATH "\$ORIGIN"
700-
CXX_STANDARD 17
701-
CXX_STANDARD_REQUIRED ON
702-
CUDA_STANDARD 17
703-
CUDA_STANDARD_REQUIRED ON
704-
INTERFACE_POSITION_INDEPENDENT_CODE ON
705-
POSITION_INDEPENDENT_CODE ON
706-
)
707-
708-
target_compile_options(
709-
cuvs PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CUVS_CXX_FLAGS}>"
710-
"$<$<COMPILE_LANGUAGE:CUDA>:${CUVS_CUDA_FLAGS}>"
711-
)
712-
# ensure CUDA symbols aren't relocated to the middle of the debug build binaries
713-
target_link_options(cuvs PRIVATE $<HOST_LINK:${CMAKE_CURRENT_BINARY_DIR}/fatbin.ld>)
714-
715718
# ################################################################################################
716719
# * cuvs_c -------------------------------------------------------------------------------
717720

@@ -740,14 +743,7 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$<BOOL:${CUVS_NVTX}>:NVTX_ENAB
740743
src/distance/pairwise_distance_c.cpp
741744
${CUVS_C_MG_ALGOS}
742745
)
743-
744-
if(BUILD_CAGRA_HNSWLIB)
745-
target_link_libraries(cuvs_c PRIVATE hnswlib::hnswlib)
746-
target_compile_definitions(cuvs_c PUBLIC CUVS_BUILD_CAGRA_HNSWLIB)
747-
endif()
748-
749746
add_library(cuvs::c_api ALIAS cuvs_c)
750-
751747
set_target_properties(
752748
cuvs_c
753749
PROPERTIES BUILD_RPATH "\$ORIGIN"
@@ -759,6 +755,10 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$<BOOL:${CUVS_NVTX}>:NVTX_ENAB
759755
EXPORT_NAME c_api
760756
)
761757

758+
target_compile_definitions(
759+
cuvs_c PUBLIC $<$<BOOL:${BUILD_CAGRA_HNSWLIB}>:CUVS_BUILD_CAGRA_HNSWLIB>
760+
)
761+
762762
target_compile_options(cuvs_c PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CUVS_CXX_FLAGS}>")
763763

764764
target_include_directories(
@@ -771,7 +771,7 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$<BOOL:${CUVS_NVTX}>:NVTX_ENAB
771771
target_link_libraries(
772772
cuvs_c
773773
PUBLIC cuvs::cuvs ${CUVS_CTK_MATH_DEPENDENCIES}
774-
PRIVATE raft::raft
774+
PRIVATE raft::raft $<TARGET_NAME_IF_EXISTS:hnswlib::hnswlib>
775775
)
776776

777777
# ensure CUDA symbols aren't relocated to the middle of the debug build binaries
@@ -784,11 +784,6 @@ target_compile_definitions(cuvs::cuvs INTERFACE $<$<BOOL:${CUVS_NVTX}>:NVTX_ENAB
784784
include(GNUInstallDirs)
785785
include(CPack)
786786

787-
set(_cuvs_lib_targets cuvs)
788-
if(NOT CUVS_COMPILE_DYNAMIC_ONLY)
789-
list(APPEND _cuvs_lib_targets cuvs_static)
790-
endif()
791-
792787
install(
793788
TARGETS ${_cuvs_lib_targets}
794789
DESTINATION ${lib_dir}

0 commit comments

Comments
 (0)