Skip to content

Commit 9896beb

Browse files
simshifacebook-github-bot
authored andcommitted
fix: gpu tests link failure with static lib (#4137)
Summary: # The bug build gpu test with static lib failed undefined reference from gpu source code to cpu source, e.g. `GpuAutoTune.cpp:(.text+0x3bc): undefined reference to 'typeinfo for faiss::Index'` # build config: `cmake -S . -B build -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=ON -DFAISS_ENABLE_GPU=ON` the link command would be like: `c++ -o faiss/gpu/test/TestCodePacking faiss/libfaiss.a -Wl,--push-state,--whole-archive faiss/gpu/libfaiss_gpu.a -Wl,--pop-state ...` key point is linking to faiss_gpu after faiss which is a classic link order issue of "undefined reference" # my fix: make faiss_gpu an `OBJECT` library. # Bouns TestXXX files get small because '--whole-archive' propagated to test link command. Pull Request resolved: #4137 Reviewed By: asadoughi Differential Revision: D68639371 Pulled By: gtwang01 fbshipit-source-id: 1d482b4311f8e52de0d709b03348eae72c64c544
1 parent 6c04699 commit 9896beb

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

faiss/gpu/CMakeLists.txt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -258,12 +258,12 @@ if(FAISS_ENABLE_CUVS)
258258
utils/CuvsUtils.cu)
259259
endif()
260260

261-
add_library(faiss_gpu STATIC ${FAISS_GPU_SRC})
262-
set_target_properties(faiss_gpu PROPERTIES
261+
add_library(faiss_gpu_objs OBJECT ${FAISS_GPU_SRC})
262+
set_target_properties(faiss_gpu_objs PROPERTIES
263263
POSITION_INDEPENDENT_CODE ON
264264
WINDOWS_EXPORT_ALL_SYMBOLS ON
265265
)
266-
target_include_directories(faiss_gpu PUBLIC
266+
target_include_directories(faiss_gpu_objs PUBLIC
267267
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>)
268268

269269
if(FAISS_ENABLE_CUVS)
@@ -298,7 +298,7 @@ if(FAISS_ENABLE_CUVS)
298298
utils/CuvsUtils.cu
299299
TARGET_DIRECTORY faiss
300300
PROPERTIES COMPILE_OPTIONS "-fvisibility=hidden")
301-
target_compile_definitions(faiss_gpu PUBLIC USE_NVIDIA_CUVS=1)
301+
target_compile_definitions(faiss_gpu_objs PUBLIC USE_NVIDIA_CUVS=1)
302302
endif()
303303

304304
if (FAISS_ENABLE_ROCM)
@@ -308,11 +308,13 @@ endif()
308308
# Export FAISS_GPU_HEADERS variable to parent scope.
309309
set(FAISS_GPU_HEADERS ${FAISS_GPU_HEADERS} PARENT_SCOPE)
310310

311-
target_link_libraries(faiss PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,faiss_gpu>")
312-
target_link_libraries(faiss_avx2 PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,faiss_gpu>")
313-
target_link_libraries(faiss_avx512 PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,faiss_gpu>")
314-
target_link_libraries(faiss_avx512_spr PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,faiss_gpu>")
315-
target_link_libraries(faiss_sve PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,faiss_gpu>")
311+
target_link_libraries(faiss PRIVATE faiss_gpu_objs)
312+
target_link_libraries(faiss_avx2 PRIVATE faiss_gpu_objs)
313+
target_link_libraries(faiss_avx512 PRIVATE faiss_gpu_objs)
314+
target_link_libraries(faiss_avx512_spr PRIVATE faiss_gpu_objs)
315+
target_link_libraries(faiss_sve PRIVATE faiss_gpu_objs)
316+
317+
install(TARGETS faiss_gpu_objs EXPORT faiss-targets)
316318

317319
foreach(header ${FAISS_GPU_HEADERS})
318320
get_filename_component(dir ${header} DIRECTORY )
@@ -322,8 +324,8 @@ foreach(header ${FAISS_GPU_HEADERS})
322324
endforeach()
323325

324326
if (FAISS_ENABLE_ROCM)
325-
target_link_libraries(faiss_gpu PRIVATE hip::host roc::hipblas)
326-
target_compile_options(faiss_gpu PRIVATE)
327+
target_link_libraries(faiss_gpu_objs PRIVATE hip::host roc::hipblas)
328+
target_compile_options(faiss_gpu_objs PRIVATE)
327329
else()
328330
# Prepares a host linker script and enables host linker to support
329331
# very large device object files.
@@ -338,12 +340,12 @@ else()
338340
}
339341
]=]
340342
)
341-
target_link_options(faiss_gpu PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/fatbin.ld")
343+
target_link_options(faiss_gpu_objs PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/fatbin.ld")
342344

343345

344346
find_package(CUDAToolkit REQUIRED)
345-
target_link_libraries(faiss_gpu PRIVATE CUDA::cudart CUDA::cublas $<$<BOOL:${FAISS_ENABLE_CUVS}>:cuvs::cuvs> $<$<BOOL:${FAISS_ENABLE_CUVS}>:OpenMP::OpenMP_CXX>)
346-
target_compile_options(faiss_gpu PRIVATE
347+
target_link_libraries(faiss_gpu_objs PRIVATE CUDA::cudart CUDA::cublas $<$<BOOL:${FAISS_ENABLE_CUVS}>:cuvs::cuvs> $<$<BOOL:${FAISS_ENABLE_CUVS}>:OpenMP::OpenMP_CXX>)
348+
target_compile_options(faiss_gpu_objs PRIVATE
347349
$<$<COMPILE_LANGUAGE:CUDA>:-Xfatbin=-compress-all
348350
--expt-extended-lambda --expt-relaxed-constexpr
349351
$<$<BOOL:${FAISS_ENABLE_CUVS}>:-Xcompiler=${OpenMP_CXX_FLAGS}>>)

0 commit comments

Comments
 (0)