diff --git a/cmake/link_to_faiss_lib.cmake b/cmake/link_to_faiss_lib.cmake new file mode 100644 index 0000000000..83bdaefaaf --- /dev/null +++ b/cmake/link_to_faiss_lib.cmake @@ -0,0 +1,55 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +function(link_to_faiss_lib target) + if(NOT FAISS_OPT_LEVEL STREQUAL "avx2" AND NOT FAISS_OPT_LEVEL STREQUAL "avx512" AND NOT FAISS_OPT_LEVEL STREQUAL "sve") + target_link_libraries(${target} PRIVATE faiss) + endif() + + if(FAISS_OPT_LEVEL STREQUAL "avx2") + if(NOT WIN32) + target_compile_options(${target} PRIVATE $<$:-mavx2 -mfma>) + else() + target_compile_options(${target} PRIVATE $<$:/arch:AVX2>) + endif() + target_link_libraries(${target} PRIVATE faiss_avx2) + endif() + + if(FAISS_OPT_LEVEL STREQUAL "avx512") + if(NOT WIN32) + target_compile_options(${target} PRIVATE $<$:-mavx2 -mfma -mavx512f -mavx512f -mavx512cd -mavx512vl -mavx512dq -mavx512bw>) + else() + target_compile_options(${target} PRIVATE $<$:/arch:AVX512>) + endif() + target_link_libraries(${target} PRIVATE faiss_avx512) + endif() + + if(FAISS_OPT_LEVEL STREQUAL "sve") + if(NOT WIN32) + if("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} " MATCHES "(^| )-march=native") + # Do nothing, expect SVE to be enabled by -march=native + elseif("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} " MATCHES "(^| )(-march=armv[0-9]+(\\.[1-9]+)?-[^+ ](\\+[^+$ ]+)*)") + # Add +sve + target_compile_options(${target} PRIVATE $<$,$>:${CMAKE_MATCH_2}+sve>) + elseif(NOT "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} " MATCHES "(^| )-march=armv") + # No valid -march, so specify -march=armv8-a+sve as the default + target_compile_options(${target} PRIVATE $<$,$>:-march=armv8-a+sve>) + endif() + if("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} " MATCHES "(^| )-march=native") + # Do nothing, expect SVE to be enabled by -march=native + elseif("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} " MATCHES "(^| )(-march=armv[0-9]+(\\.[1-9]+)?-[^+ ](\\+[^+$ ]+)*)") + # Add +sve + target_compile_options(${target} PRIVATE $<$,$>:${CMAKE_MATCH_2}+sve>) + elseif(NOT "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} " MATCHES "(^| )-march=armv") + # No valid -march, so specify -march=armv8-a+sve as the default + target_compile_options(${target} PRIVATE $<$,$>:-march=armv8-a+sve>) + endif() + else() + # TODO: support Windows + endif() + target_link_libraries(${target} PRIVATE faiss_sve) + endif() +endfunction() diff --git a/perf_tests/CMakeLists.txt b/perf_tests/CMakeLists.txt index b7c325dcb4..200430f04c 100644 --- a/perf_tests/CMakeLists.txt +++ b/perf_tests/CMakeLists.txt @@ -27,55 +27,7 @@ add_library(faiss_perf_tests_utils target_include_directories(faiss_perf_tests_utils PRIVATE ${PROJECT_SOURCE_DIR}/../..) -function(link_to_faiss_lib target) - if(NOT FAISS_OPT_LEVEL STREQUAL "avx2" AND NOT FAISS_OPT_LEVEL STREQUAL "avx512" AND NOT FAISS_OPT_LEVEL STREQUAL "sve") - target_link_libraries(${target} PRIVATE faiss) - endif() - - if(FAISS_OPT_LEVEL STREQUAL "avx2") - if(NOT WIN32) - target_compile_options(${target} PRIVATE $<$:-mavx2 -mfma>) - else() - target_compile_options(${target} PRIVATE $<$:/arch:AVX2>) - endif() - target_link_libraries(${target} PRIVATE faiss_avx2) - endif() - - if(FAISS_OPT_LEVEL STREQUAL "avx512") - if(NOT WIN32) - target_compile_options(${target} PRIVATE $<$:-mavx2 -mfma -mavx512f -mavx512f -mavx512cd -mavx512vl -mavx512dq -mavx512bw>) - else() - target_compile_options(${target} PRIVATE $<$:/arch:AVX512>) - endif() - target_link_libraries(${target} PRIVATE faiss_avx512) - endif() - - if(FAISS_OPT_LEVEL STREQUAL "sve") - if(NOT WIN32) - if("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} " MATCHES "(^| )-march=native") - # Do nothing, expect SVE to be enabled by -march=native - elseif("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} " MATCHES "(^| )(-march=armv[0-9]+(\\.[1-9]+)?-[^+ ](\\+[^+$ ]+)*)") - # Add +sve - target_compile_options(${target} PRIVATE $<$,$>:${CMAKE_MATCH_2}+sve>) - elseif(NOT "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} " MATCHES "(^| )-march=armv") - # No valid -march, so specify -march=armv8-a+sve as the default - target_compile_options(${target} PRIVATE $<$,$>:-march=armv8-a+sve>) - endif() - if("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} " MATCHES "(^| )-march=native") - # Do nothing, expect SVE to be enabled by -march=native - elseif("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} " MATCHES "(^| )(-march=armv[0-9]+(\\.[1-9]+)?-[^+ ](\\+[^+$ ]+)*)") - # Add +sve - target_compile_options(${target} PRIVATE $<$,$>:${CMAKE_MATCH_2}+sve>) - elseif(NOT "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} " MATCHES "(^| )-march=armv") - # No valid -march, so specify -march=armv8-a+sve as the default - target_compile_options(${target} PRIVATE $<$,$>:-march=armv8-a+sve>) - endif() - else() - # TODO: support Windows - endif() - target_link_libraries(${target} PRIVATE faiss_sve) - endif() -endfunction() +include(../cmake/link_to_faiss_lib.cmake) link_to_faiss_lib(faiss_perf_tests_utils) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index c41edf0cca..1e875cf41d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,53 +40,9 @@ set(FAISS_TEST_SRC add_executable(faiss_test ${FAISS_TEST_SRC}) -if(NOT FAISS_OPT_LEVEL STREQUAL "avx2" AND NOT FAISS_OPT_LEVEL STREQUAL "avx512" AND NOT FAISS_OPT_LEVEL STREQUAL "sve") - target_link_libraries(faiss_test PRIVATE faiss) -endif() - -if(FAISS_OPT_LEVEL STREQUAL "avx2") - if(NOT WIN32) - target_compile_options(faiss_test PRIVATE $<$:-mavx2 -mfma>) - else() - target_compile_options(faiss_test PRIVATE $<$:/arch:AVX2>) - endif() - target_link_libraries(faiss_test PRIVATE faiss_avx2) -endif() +include(../cmake/link_to_faiss_lib.cmake) -if(FAISS_OPT_LEVEL STREQUAL "avx512") - if(NOT WIN32) - target_compile_options(faiss_test PRIVATE $<$:-mavx2 -mfma -mavx512f -mavx512f -mavx512cd -mavx512vl -mavx512dq -mavx512bw>) - else() - target_compile_options(faiss_test PRIVATE $<$:/arch:AVX512>) - endif() - target_link_libraries(faiss_test PRIVATE faiss_avx512) -endif() - -if(FAISS_OPT_LEVEL STREQUAL "sve") - if(NOT WIN32) - if("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} " MATCHES "(^| )-march=native") - # Do nothing, expect SVE to be enabled by -march=native - elseif("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} " MATCHES "(^| )(-march=armv[0-9]+(\\.[1-9]+)?-[^+ ](\\+[^+$ ]+)*)") - # Add +sve - target_compile_options(faiss_test PRIVATE $<$,$>:${CMAKE_MATCH_2}+sve>) - elseif(NOT "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} " MATCHES "(^| )-march=armv") - # No valid -march, so specify -march=armv8-a+sve as the default - target_compile_options(faiss_test PRIVATE $<$,$>:-march=armv8-a+sve>) - endif() - if("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} " MATCHES "(^| )-march=native") - # Do nothing, expect SVE to be enabled by -march=native - elseif("${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} " MATCHES "(^| )(-march=armv[0-9]+(\\.[1-9]+)?-[^+ ](\\+[^+$ ]+)*)") - # Add +sve - target_compile_options(faiss_test PRIVATE $<$,$>:${CMAKE_MATCH_2}+sve>) - elseif(NOT "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} " MATCHES "(^| )-march=armv") - # No valid -march, so specify -march=armv8-a+sve as the default - target_compile_options(faiss_test PRIVATE $<$,$>:-march=armv8-a+sve>) - endif() - else() - # TODO: support Windows - endif() - target_link_libraries(faiss_test PRIVATE faiss_sve) -endif() +link_to_faiss_lib(faiss_test) include(FetchContent) FetchContent_Declare(