From 95f5e7ee350e84fcd6a423e62d942a874755714c Mon Sep 17 00:00:00 2001 From: Rahul Rampure Date: Mon, 27 Oct 2025 19:11:59 +0530 Subject: [PATCH 1/2] Fix CMake Bugs --- CMakeLists.txt | 4 +++- c_api/CMakeLists.txt | 24 ++++++++++-------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5440be22f6..f385899b39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,7 +58,9 @@ set(CMAKE_CXX_STANDARD 17) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") # Valid values are "generic", "avx2", "avx512", "avx512_spr", "sve". -option(FAISS_OPT_LEVEL "" "generic") +if(NOT DEFINED FAISS_OPT_LEVEL) + set(FAISS_OPT_LEVEL "generic" CACHE STRING "Optimization level (generic, avx2, avx512, etc.)") +endif() option(FAISS_ENABLE_GPU "Enable support for GPU indexes." ON) option(FAISS_GPU_STATIC "Link GPU libraries statically." OFF) option(FAISS_ENABLE_CUVS "Enable cuVS for GPU indexes." OFF) diff --git a/c_api/CMakeLists.txt b/c_api/CMakeLists.txt index 23c88b6e7b..98191dc721 100644 --- a/c_api/CMakeLists.txt +++ b/c_api/CMakeLists.txt @@ -39,13 +39,7 @@ set(FAISS_C_SRC ) add_library(faiss_c ${FAISS_C_SRC}) -if(FAISS_OPT_LEVEL STREQUAL "generic") - target_link_libraries(faiss_c PRIVATE faiss) -elseif(FAISS_OPT_LEVEL STREQUAL "avx2") - target_link_libraries(faiss_c PRIVATE faiss_avx2) -elseif(FAISS_OPT_LEVEL STREQUAL "avx512") - target_link_libraries(faiss_c PRIVATE faiss_avx512) -endif() +target_link_libraries(faiss_c PRIVATE faiss) add_library(faiss_c_avx2 ${FAISS_C_SRC}) target_link_libraries(faiss_c_avx2 PRIVATE faiss_avx2) @@ -131,13 +125,15 @@ file(GLOB FAISS_C_API_HEADERS faiss_install_headers("${FAISS_C_API_HEADERS}" c_api) -install(TARGETS faiss_c - EXPORT faiss-targets - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} -) +if(FAISS_OPT_LEVEL STREQUAL "generic") + install(TARGETS faiss_c + EXPORT faiss-targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + ) +endif() if(FAISS_OPT_LEVEL STREQUAL "avx2") install(TARGETS faiss_c_avx2 EXPORT faiss-targets From afe2846de713531f6bce95b5679963e8f08e6b9f Mon Sep 17 00:00:00 2001 From: Rahul Rampure Date: Tue, 4 Nov 2025 19:26:16 +0530 Subject: [PATCH 2/2] add gpu method and further fix gpu c_api --- c_api/gpu/CMakeLists.txt | 40 +++++++++++++++++++--------------- c_api/gpu/DeviceUtils_c.cpp | 8 +++++++ c_api/gpu/DeviceUtils_c.h | 3 +++ faiss/gpu/utils/DeviceUtils.cu | 6 +++++ faiss/gpu/utils/DeviceUtils.h | 3 +++ 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/c_api/gpu/CMakeLists.txt b/c_api/gpu/CMakeLists.txt index 3c7214a576..dab8951dfd 100644 --- a/c_api/gpu/CMakeLists.txt +++ b/c_api/gpu/CMakeLists.txt @@ -3,31 +3,35 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -target_sources(faiss_c PRIVATE - DeviceUtils_c.cpp - GpuAutoTune_c.cpp - GpuClonerOptions_c.cpp - GpuIndex_c.cpp - GpuResources_c.cpp - StandardGpuResources_c.cpp -) +foreach(lib faiss_c faiss_c_avx2 faiss_c_avx512 faiss_c_avx512_spr faiss_c_sve) + if (TARGET ${lib}) + target_sources(${lib} PRIVATE + DeviceUtils_c.cpp + GpuAutoTune_c.cpp + GpuClonerOptions_c.cpp + GpuIndex_c.cpp + GpuResources_c.cpp + StandardGpuResources_c.cpp + ) + endif() +endforeach() file(GLOB FAISS_C_API_GPU_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h") faiss_install_headers("${FAISS_C_API_GPU_HEADERS}" c_api/gpu) if (FAISS_ENABLE_ROCM) - target_link_libraries(faiss_c PUBLIC hip::host roc::hipblas) - target_link_libraries(faiss_c_avx2 PUBLIC hip::host roc::hipblas) - target_link_libraries(faiss_c_avx512 PUBLIC hip::host roc::hipblas) - target_link_libraries(faiss_c_avx512_spr PUBLIC hip::host roc::hipblas) - target_link_libraries(faiss_c_sve PUBLIC hip::host roc::hipblas) + foreach(lib faiss_c faiss_c_avx2 faiss_c_avx512 faiss_c_avx512_spr faiss_c_sve) + if (TARGET ${lib}) + target_link_libraries(${lib} PUBLIC hip::host roc::hipblas) + endif() + endforeach() else() find_package(CUDAToolkit REQUIRED) - target_link_libraries(faiss_c PUBLIC CUDA::cudart CUDA::cublas $<$:cuvs::cuvs>) - target_link_libraries(faiss_c_avx2 PUBLIC CUDA::cudart CUDA::cublas $<$:cuvs::cuvs>) - target_link_libraries(faiss_c_avx512 PUBLIC CUDA::cudart CUDA::cublas $<$:cuvs::cuvs>) - target_link_libraries(faiss_c_avx512_spr PUBLIC CUDA::cudart CUDA::cublas $<$:cuvs::cuvs>) - target_link_libraries(faiss_c_sve PUBLIC CUDA::cudart CUDA::cublas $<$:cuvs::cuvs>) + foreach(lib faiss_c faiss_c_avx2 faiss_c_avx512 faiss_c_avx512_spr faiss_c_sve) + if (TARGET ${lib}) + target_link_libraries(${lib} PUBLIC CUDA::cudart CUDA::cublas $<$:cuvs::cuvs>) + endif() + endforeach() endif() add_executable(example_gpu_c EXCLUDE_FROM_ALL example_gpu_c.c) diff --git a/c_api/gpu/DeviceUtils_c.cpp b/c_api/gpu/DeviceUtils_c.cpp index 37850d39a0..f1443f2499 100644 --- a/c_api/gpu/DeviceUtils_c.cpp +++ b/c_api/gpu/DeviceUtils_c.cpp @@ -44,3 +44,11 @@ int faiss_gpu_sync_all_devices() { } CATCH_AND_HANDLE } + +/// Synchronizes the CPU against the specified device +int faiss_gpu_sync_device(int device) { + try { + faiss::gpu::synchronizeDevice(device); + } + CATCH_AND_HANDLE +} diff --git a/c_api/gpu/DeviceUtils_c.h b/c_api/gpu/DeviceUtils_c.h index b5c67e97ad..7f544fa21d 100644 --- a/c_api/gpu/DeviceUtils_c.h +++ b/c_api/gpu/DeviceUtils_c.h @@ -31,6 +31,9 @@ int faiss_gpu_profiler_stop(); /// cudaDeviceSynchronize for each device) int faiss_gpu_sync_all_devices(); +/// Synchronizes the CPU against the specified device +int faiss_gpu_sync_device(int device); + #ifdef __cplusplus } #endif diff --git a/faiss/gpu/utils/DeviceUtils.cu b/faiss/gpu/utils/DeviceUtils.cu index 123c8e05e8..92bd4312ce 100644 --- a/faiss/gpu/utils/DeviceUtils.cu +++ b/faiss/gpu/utils/DeviceUtils.cu @@ -56,6 +56,12 @@ void synchronizeAllDevices() { } } +// synchronize only the specified device +void synchronizeDevice(int device) { + DeviceScope scope(device); + CUDA_VERIFY(cudaDeviceSynchronize()); +} + const cudaDeviceProp& getDeviceProperties(int device) { static std::mutex mutex; static std::unordered_map properties; diff --git a/faiss/gpu/utils/DeviceUtils.h b/faiss/gpu/utils/DeviceUtils.h index edb1b71572..d21e6a1d13 100644 --- a/faiss/gpu/utils/DeviceUtils.h +++ b/faiss/gpu/utils/DeviceUtils.h @@ -34,6 +34,9 @@ void profilerStop(); /// cudaDeviceSynchronize for each device) void synchronizeAllDevices(); +/// Synchronizes the CPU against the specified device +void synchronizeDevice(int device); + /// Returns a cached cudaDeviceProp for the given device const cudaDeviceProp& getDeviceProperties(int device);