mirror of
https://github.com/facebookresearch/faiss.git
synced 2026-10-12 02:13:36 +00:00
Add sve targets (#2886)
Summary: related: https://github.com/facebookresearch/faiss/issues/2884 This PR contains below changes: - Add new optlevel `sve` - ARM SVE is _extension_ of ARMv8, so it should be treated similar to AVX2 IMO - Add targets for ARM SVE, `faiss_sve` and `swigfaiss_sve` - These targets will be built when you give `-DFAISS_OPT_LEVEL=sve` at build time - Design decision: Don't fix SVE register length. - The python package of faiss is "fat binary" (for example, the package for avx2 contains `_swigfaiss_avx2.so` and `_swigfaiss.so`) - SVE is scalable instruction set (= doesn't fix vector length), but actually we can specify the vector length at compile time. - [with `-msve-vector-length=` option](https://developer.arm.com/documentation/101726/4-0/Coding-for-Scalable-Vector-Extension--SVE-/SVE-Vector-Length-Specific--VLS--programming) - When this option is specified, the binary can't work correctly on the CPU which has other vector length rather than specified at compile time - When we use fixed vector length, SVE-supported faiss python package will contain 7 shared libraries like `_swigfaiss.so` , `_swigfaiss_sve.so` , `_swigfaiss_sve128.so` , `_swigfaiss_sve256.so` , `_swigfaiss_sve512.so` , `_swigfaiss_sve1024.so` , and `_swigfaiss_sve2048.so` . The package size will be exploded. - For these reason, I don't specify the vector length at compile time and `faiss_sve` detects the vector length at run time. - Add a mechanism of detecting ARM SVE on runtime environment and importing `swigfaiss_sve` dynamically - Currently it only supports Linux, but there is no SVE environment with non-Linux OS now, as far as I know NOTE: I plan to make one more PR about add some SVE implementation after this PR merged. This PR only contains adding sve target. Pull Request resolved: https://github.com/facebookresearch/faiss/pull/2886 Reviewed By: ramilbakhshyiev Differential Revision: D60386983 Pulled By: mengdilin fbshipit-source-id: 7e66162ee53ce88fbfb6636e7bf705b44e6c3282
This commit is contained in:
committed by
Facebook GitHub Bot
parent
7178bf8a1d
commit
4eeaa42b93
@@ -19,3 +19,4 @@
|
||||
/tests/gtest/
|
||||
faiss/python/swigfaiss_avx2.swig
|
||||
faiss/python/swigfaiss_avx512.swig
|
||||
faiss/python/swigfaiss_sve.swig
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@ set(CMAKE_CXX_STANDARD 17)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||
|
||||
# Valid values are "generic", "avx2", "avx512".
|
||||
# Valid values are "generic", "avx2", "avx512", "sve".
|
||||
option(FAISS_OPT_LEVEL "" "generic")
|
||||
option(FAISS_ENABLE_GPU "Enable support for GPU indexes." ON)
|
||||
option(FAISS_ENABLE_RAFT "Enable RAFT for GPU indexes." OFF)
|
||||
|
||||
+4
-2
@@ -122,8 +122,10 @@ Several options can be passed to CMake, among which:
|
||||
- `-DCMAKE_BUILD_TYPE=Release` in order to enable generic compiler
|
||||
optimization options (enables `-O3` on gcc for instance),
|
||||
- `-DFAISS_OPT_LEVEL=avx2` in order to enable the required compiler flags to
|
||||
generate code using optimized SIMD instructions (possible values are `generic`,
|
||||
`avx2` and `avx512`, by increasing order of optimization),
|
||||
generate code using optimized SIMD/Vector instructions. possible values are
|
||||
below:
|
||||
- On x86\_64, `generic`, `avx2` and `avx512`, by increasing order of optimization,
|
||||
- On aarch64, `generic` and `sve` , by increasing order of optimization,
|
||||
- BLAS-related options:
|
||||
- `-DBLA_VENDOR=Intel10_64_dyn -DMKL_LIBRARIES=/path/to/mkl/libs` to use the
|
||||
Intel MKL BLAS implementation, which is significantly faster than OpenBLAS
|
||||
|
||||
@@ -264,6 +264,31 @@ else()
|
||||
add_compile_options(/bigobj)
|
||||
endif()
|
||||
|
||||
add_library(faiss_sve ${FAISS_SRC})
|
||||
if(NOT FAISS_OPT_LEVEL STREQUAL "sve")
|
||||
set_target_properties(faiss_sve PROPERTIES EXCLUDE_FROM_ALL TRUE)
|
||||
endif()
|
||||
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_sve PRIVATE $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:DEBUG>>:${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_sve PRIVATE $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:DEBUG>>:-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_sve PRIVATE $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:RELEASE>>:${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_sve PRIVATE $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:RELEASE>>:-march=armv8-a+sve>)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Handle `#include <faiss/foo.h>`.
|
||||
target_include_directories(faiss PUBLIC
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>)
|
||||
@@ -273,6 +298,9 @@ target_include_directories(faiss_avx2 PUBLIC
|
||||
# Handle `#include <faiss/foo.h>`.
|
||||
target_include_directories(faiss_avx512 PUBLIC
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>)
|
||||
# Handle `#include <faiss/foo.h>`.
|
||||
target_include_directories(faiss_sve PUBLIC
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>)
|
||||
|
||||
set_target_properties(faiss PROPERTIES
|
||||
POSITION_INDEPENDENT_CODE ON
|
||||
@@ -286,11 +314,16 @@ set_target_properties(faiss_avx512 PROPERTIES
|
||||
POSITION_INDEPENDENT_CODE ON
|
||||
WINDOWS_EXPORT_ALL_SYMBOLS ON
|
||||
)
|
||||
set_target_properties(faiss_sve PROPERTIES
|
||||
POSITION_INDEPENDENT_CODE ON
|
||||
WINDOWS_EXPORT_ALL_SYMBOLS ON
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
target_compile_definitions(faiss PRIVATE FAISS_MAIN_LIB)
|
||||
target_compile_definitions(faiss_avx2 PRIVATE FAISS_MAIN_LIB)
|
||||
target_compile_definitions(faiss_avx512 PRIVATE FAISS_MAIN_LIB)
|
||||
target_compile_definitions(faiss_sve PRIVATE FAISS_MAIN_LIB)
|
||||
endif()
|
||||
|
||||
string(FIND "${CMAKE_CXX_FLAGS}" "FINTEGER" finteger_idx)
|
||||
@@ -299,11 +332,13 @@ if (${finteger_idx} EQUAL -1)
|
||||
endif()
|
||||
target_compile_definitions(faiss_avx2 PRIVATE FINTEGER=int)
|
||||
target_compile_definitions(faiss_avx512 PRIVATE FINTEGER=int)
|
||||
target_compile_definitions(faiss_sve PRIVATE FINTEGER=int)
|
||||
|
||||
find_package(OpenMP REQUIRED)
|
||||
target_link_libraries(faiss PRIVATE OpenMP::OpenMP_CXX)
|
||||
target_link_libraries(faiss_avx2 PRIVATE OpenMP::OpenMP_CXX)
|
||||
target_link_libraries(faiss_avx512 PRIVATE OpenMP::OpenMP_CXX)
|
||||
target_link_libraries(faiss_sve PRIVATE OpenMP::OpenMP_CXX)
|
||||
|
||||
find_package(MKL)
|
||||
if(MKL_FOUND)
|
||||
@@ -315,11 +350,13 @@ else()
|
||||
target_link_libraries(faiss PRIVATE ${BLAS_LIBRARIES})
|
||||
target_link_libraries(faiss_avx2 PRIVATE ${BLAS_LIBRARIES})
|
||||
target_link_libraries(faiss_avx512 PRIVATE ${BLAS_LIBRARIES})
|
||||
target_link_libraries(faiss_sve PRIVATE ${BLAS_LIBRARIES})
|
||||
|
||||
find_package(LAPACK REQUIRED)
|
||||
target_link_libraries(faiss PRIVATE ${LAPACK_LIBRARIES})
|
||||
target_link_libraries(faiss_avx2 PRIVATE ${LAPACK_LIBRARIES})
|
||||
target_link_libraries(faiss_avx512 PRIVATE ${LAPACK_LIBRARIES})
|
||||
target_link_libraries(faiss_sve PRIVATE ${LAPACK_LIBRARIES})
|
||||
endif()
|
||||
|
||||
install(TARGETS faiss
|
||||
@@ -343,6 +380,13 @@ if(FAISS_OPT_LEVEL STREQUAL "avx512")
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
)
|
||||
endif()
|
||||
if(FAISS_OPT_LEVEL STREQUAL "sve")
|
||||
install(TARGETS faiss_sve
|
||||
EXPORT faiss-targets
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
)
|
||||
endif()
|
||||
|
||||
foreach(header ${FAISS_HEADERS})
|
||||
get_filename_component(dir ${header} DIRECTORY )
|
||||
|
||||
@@ -296,6 +296,7 @@ set(FAISS_GPU_HEADERS ${FAISS_GPU_HEADERS} PARENT_SCOPE)
|
||||
target_link_libraries(faiss PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,faiss_gpu>")
|
||||
target_link_libraries(faiss_avx2 PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,faiss_gpu>")
|
||||
target_link_libraries(faiss_avx512 PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,faiss_gpu>")
|
||||
target_link_libraries(faiss_sve PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,faiss_gpu>")
|
||||
|
||||
foreach(header ${FAISS_GPU_HEADERS})
|
||||
get_filename_component(dir ${header} DIRECTORY )
|
||||
|
||||
@@ -50,10 +50,12 @@ endmacro()
|
||||
# we duplicate the source in order to override the module name.
|
||||
configure_file(swigfaiss.swig ${CMAKE_CURRENT_SOURCE_DIR}/swigfaiss_avx2.swig COPYONLY)
|
||||
configure_file(swigfaiss.swig ${CMAKE_CURRENT_SOURCE_DIR}/swigfaiss_avx512.swig COPYONLY)
|
||||
configure_file(swigfaiss.swig ${CMAKE_CURRENT_SOURCE_DIR}/swigfaiss_sve.swig COPYONLY)
|
||||
|
||||
configure_swigfaiss(swigfaiss.swig)
|
||||
configure_swigfaiss(swigfaiss_avx2.swig)
|
||||
configure_swigfaiss(swigfaiss_avx512.swig)
|
||||
configure_swigfaiss(swigfaiss_sve.swig)
|
||||
|
||||
if(TARGET faiss)
|
||||
# Manually add headers as extra dependencies of swigfaiss.
|
||||
@@ -62,11 +64,13 @@ if(TARGET faiss)
|
||||
list(APPEND SWIG_MODULE_swigfaiss_EXTRA_DEPS "${faiss_SOURCE_DIR}/faiss/${h}")
|
||||
list(APPEND SWIG_MODULE_swigfaiss_avx2_EXTRA_DEPS "${faiss_SOURCE_DIR}/faiss/${h}")
|
||||
list(APPEND SWIG_MODULE_swigfaiss_avx512_EXTRA_DEPS "${faiss_SOURCE_DIR}/faiss/${h}")
|
||||
list(APPEND SWIG_MODULE_swigfaiss_sve_EXTRA_DEPS "${faiss_SOURCE_DIR}/faiss/${h}")
|
||||
endforeach()
|
||||
foreach(h ${FAISS_GPU_HEADERS})
|
||||
list(APPEND SWIG_MODULE_swigfaiss_EXTRA_DEPS "${faiss_SOURCE_DIR}/faiss/gpu/${h}")
|
||||
list(APPEND SWIG_MODULE_swigfaiss_avx2_EXTRA_DEPS "${faiss_SOURCE_DIR}/faiss/gpu/${h}")
|
||||
list(APPEND SWIG_MODULE_swigfaiss_avx512_EXTRA_DEPS "${faiss_SOURCE_DIR}/faiss/gpu/${h}")
|
||||
list(APPEND SWIG_MODULE_swigfaiss_sve_EXTRA_DEPS "${faiss_SOURCE_DIR}/faiss/gpu/${h}")
|
||||
endforeach()
|
||||
else()
|
||||
find_package(faiss REQUIRED)
|
||||
@@ -112,16 +116,30 @@ if(NOT FAISS_OPT_LEVEL STREQUAL "avx512")
|
||||
set_target_properties(swigfaiss_avx512 PROPERTIES EXCLUDE_FROM_ALL TRUE)
|
||||
endif()
|
||||
|
||||
set_property(SOURCE swigfaiss_sve.swig
|
||||
PROPERTY SWIG_MODULE_NAME swigfaiss_sve)
|
||||
swig_add_library(swigfaiss_sve
|
||||
TYPE SHARED
|
||||
LANGUAGE python
|
||||
SOURCES swigfaiss_sve.swig
|
||||
)
|
||||
set_property(TARGET swigfaiss_sve PROPERTY SWIG_COMPILE_OPTIONS -doxygen)
|
||||
if(NOT FAISS_OPT_LEVEL STREQUAL "sve")
|
||||
set_target_properties(swigfaiss_sve PROPERTIES EXCLUDE_FROM_ALL TRUE)
|
||||
endif()
|
||||
|
||||
if(NOT WIN32)
|
||||
# NOTE: Python does not recognize the dylib extension.
|
||||
set_target_properties(swigfaiss PROPERTIES SUFFIX .so)
|
||||
set_target_properties(swigfaiss_avx2 PROPERTIES SUFFIX .so)
|
||||
set_target_properties(swigfaiss_avx512 PROPERTIES SUFFIX .so)
|
||||
set_target_properties(swigfaiss_sve PROPERTIES SUFFIX .so)
|
||||
else()
|
||||
# we need bigobj for the swig wrapper
|
||||
target_compile_options(swigfaiss PRIVATE /bigobj)
|
||||
target_compile_options(swigfaiss_avx2 PRIVATE /bigobj)
|
||||
target_compile_options(swigfaiss_avx512 PRIVATE /bigobj)
|
||||
target_compile_options(swigfaiss_sve PRIVATE /bigobj)
|
||||
endif()
|
||||
|
||||
if(FAISS_ENABLE_GPU)
|
||||
@@ -132,6 +150,7 @@ if(FAISS_ENABLE_GPU)
|
||||
target_link_libraries(swigfaiss PRIVATE CUDA::cudart $<$<BOOL:${FAISS_ENABLE_RAFT}>:raft::raft> $<$<BOOL:${FAISS_ENABLE_RAFT}>:nvidia::cutlass::cutlass>)
|
||||
target_link_libraries(swigfaiss_avx2 PRIVATE CUDA::cudart $<$<BOOL:${FAISS_ENABLE_RAFT}>:raft::raft> $<$<BOOL:${FAISS_ENABLE_RAFT}>:nvidia::cutlass::cutlass>)
|
||||
target_link_libraries(swigfaiss_avx512 PRIVATE CUDA::cudart $<$<BOOL:${FAISS_ENABLE_RAFT}>:raft::raft> $<$<BOOL:${FAISS_ENABLE_RAFT}>:nvidia::cutlass::cutlass>)
|
||||
target_link_libraries(swigfaiss_sve PRIVATE CUDA::cudart $<$<BOOL:${FAISS_ENABLE_RAFT}>:raft::raft> $<$<BOOL:${FAISS_ENABLE_RAFT}>:nvidia::cutlass::cutlass>)
|
||||
endif()
|
||||
|
||||
find_package(OpenMP REQUIRED)
|
||||
@@ -157,11 +176,19 @@ target_link_libraries(swigfaiss_avx512 PRIVATE
|
||||
OpenMP::OpenMP_CXX
|
||||
)
|
||||
|
||||
target_link_libraries(swigfaiss_sve PRIVATE
|
||||
faiss_sve
|
||||
Python::Module
|
||||
Python::NumPy
|
||||
OpenMP::OpenMP_CXX
|
||||
)
|
||||
|
||||
# Hack so that python_callbacks.h can be included as
|
||||
# `#include <faiss/python/python_callbacks.h>`.
|
||||
target_include_directories(swigfaiss PRIVATE ${PROJECT_SOURCE_DIR}/../..)
|
||||
target_include_directories(swigfaiss_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/../..)
|
||||
target_include_directories(swigfaiss_avx512 PRIVATE ${PROJECT_SOURCE_DIR}/../..)
|
||||
target_include_directories(swigfaiss_sve PRIVATE ${PROJECT_SOURCE_DIR}/../..)
|
||||
|
||||
find_package(Python REQUIRED
|
||||
COMPONENTS Development NumPy
|
||||
@@ -186,6 +213,7 @@ target_include_directories(faiss_python_callbacks PRIVATE ${Python_INCLUDE_DIRS}
|
||||
target_link_libraries(swigfaiss PRIVATE faiss_python_callbacks)
|
||||
target_link_libraries(swigfaiss_avx2 PRIVATE faiss_python_callbacks)
|
||||
target_link_libraries(swigfaiss_avx512 PRIVATE faiss_python_callbacks)
|
||||
target_link_libraries(swigfaiss_sve PRIVATE faiss_python_callbacks)
|
||||
|
||||
configure_file(setup.py setup.py COPYONLY)
|
||||
configure_file(__init__.py __init__.py COPYONLY)
|
||||
|
||||
+35
-1
@@ -24,6 +24,23 @@ def supported_instruction_sets():
|
||||
>>> supported_instruction_sets() # for ARM
|
||||
{"NEON", "ASIMD", ...}
|
||||
"""
|
||||
|
||||
# Old numpy.core._multiarray_umath.__cpu_features__ doesn't support Arm SVE,
|
||||
# so let's read Features in numpy.distutils.cpuinfo and search 'sve' entry
|
||||
def is_sve_supported():
|
||||
if platform.machine() != "aarch64":
|
||||
return False
|
||||
# Currently SVE is only supported on Linux
|
||||
if platform.system() != "Linux":
|
||||
return False
|
||||
# Numpy 2.0 supports SVE detection by __cpu_features__, so just skip
|
||||
import numpy
|
||||
if Version(numpy.__version__) >= Version("2.0"):
|
||||
return False
|
||||
# platform-dependent legacy fallback using numpy.distutils.cpuinfo
|
||||
import numpy.distutils.cpuinfo
|
||||
return "sve" in numpy.distutils.cpuinfo.cpu.info[0].get('Features', "").split()
|
||||
|
||||
import numpy
|
||||
if Version(numpy.__version__) >= Version("1.19"):
|
||||
# use private API as next-best thing until numpy/numpy#18058 is solved
|
||||
@@ -31,6 +48,8 @@ def supported_instruction_sets():
|
||||
# __cpu_features__ is a dictionary with CPU features
|
||||
# as keys, and True / False as values
|
||||
supported = {k for k, v in __cpu_features__.items() if v}
|
||||
if is_sve_supported():
|
||||
supported.add("SVE")
|
||||
for f in os.getenv("FAISS_DISABLE_CPU_FEATURES", "").split(", \t\n\r"):
|
||||
supported.discard(f)
|
||||
return supported
|
||||
@@ -46,10 +65,13 @@ def supported_instruction_sets():
|
||||
result.add("AVX2")
|
||||
if "avx512" in numpy.distutils.cpuinfo.cpu.info[0].get('flags', ""):
|
||||
result.add("AVX512")
|
||||
if is_sve_supported():
|
||||
result.add("SVE")
|
||||
for f in os.getenv("FAISS_DISABLE_CPU_FEATURES", "").split(", \t\n\r"):
|
||||
result.discard(f)
|
||||
return result
|
||||
return set()
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
instruction_sets = None
|
||||
@@ -92,6 +114,18 @@ if has_AVX2 and not loaded:
|
||||
# reset so that we load without AVX2 below
|
||||
loaded = False
|
||||
|
||||
has_SVE = "SVE" in instruction_sets
|
||||
if has_SVE and not loaded:
|
||||
try:
|
||||
logger.info("Loading faiss with SVE support.")
|
||||
from .swigfaiss_sve import *
|
||||
logger.info("Successfully loaded faiss with SVE support.")
|
||||
loaded = True
|
||||
except ImportError as e:
|
||||
logger.info(f"Could not load library with SVE support due to:\n{e!r}")
|
||||
# reset so that we load without SVE below
|
||||
loaded = False
|
||||
|
||||
if not loaded:
|
||||
# we import * so that the symbol X can be accessed as faiss.X
|
||||
logger.info("Loading faiss.")
|
||||
|
||||
+10
-2
@@ -26,14 +26,17 @@ prefix = "Release/" * (platform.system() == 'Windows')
|
||||
swigfaiss_generic_lib = f"{prefix}_swigfaiss{ext}"
|
||||
swigfaiss_avx2_lib = f"{prefix}_swigfaiss_avx2{ext}"
|
||||
swigfaiss_avx512_lib = f"{prefix}_swigfaiss_avx512{ext}"
|
||||
swigfaiss_sve_lib = f"{prefix}_swigfaiss_sve{ext}"
|
||||
|
||||
found_swigfaiss_generic = os.path.exists(swigfaiss_generic_lib)
|
||||
found_swigfaiss_avx2 = os.path.exists(swigfaiss_avx2_lib)
|
||||
found_swigfaiss_avx512 = os.path.exists(swigfaiss_avx512_lib)
|
||||
found_swigfaiss_sve = os.path.exists(swigfaiss_sve_lib)
|
||||
|
||||
assert (found_swigfaiss_generic or found_swigfaiss_avx2 or found_swigfaiss_avx512), \
|
||||
assert (found_swigfaiss_generic or found_swigfaiss_avx2 or found_swigfaiss_avx512 or found_swigfaiss_sve), \
|
||||
f"Could not find {swigfaiss_generic_lib} or " \
|
||||
f"{swigfaiss_avx2_lib} or {swigfaiss_avx512_lib}. Faiss may not be compiled yet."
|
||||
f"{swigfaiss_avx2_lib} or {swigfaiss_avx512_lib} or {swigfaiss_sve_lib}. " \
|
||||
f"Faiss may not be compiled yet."
|
||||
|
||||
if found_swigfaiss_generic:
|
||||
print(f"Copying {swigfaiss_generic_lib}")
|
||||
@@ -50,6 +53,11 @@ if found_swigfaiss_avx512:
|
||||
shutil.copyfile("swigfaiss_avx512.py", "faiss/swigfaiss_avx512.py")
|
||||
shutil.copyfile(swigfaiss_avx512_lib, f"faiss/_swigfaiss_avx512{ext}")
|
||||
|
||||
if found_swigfaiss_sve:
|
||||
print(f"Copying {swigfaiss_sve_lib}")
|
||||
shutil.copyfile("swigfaiss_sve.py", "faiss/swigfaiss_sve.py")
|
||||
shutil.copyfile(swigfaiss_sve_lib, f"faiss/_swigfaiss_sve{ext}")
|
||||
|
||||
long_description="""
|
||||
Faiss is a library for efficient similarity search and clustering of dense
|
||||
vectors. It contains algorithms that search in sets of vectors of any size,
|
||||
|
||||
@@ -119,6 +119,8 @@ std::string get_compile_options() {
|
||||
options += "AVX2 ";
|
||||
#elif __AVX512F__
|
||||
options += "AVX512 ";
|
||||
#elif defined(__ARM_FEATURE_SVE)
|
||||
options += "SVE NEON ";
|
||||
#elif defined(__aarch64__)
|
||||
options += "NEON ";
|
||||
#else
|
||||
|
||||
+27
-1
@@ -40,7 +40,7 @@ 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")
|
||||
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()
|
||||
|
||||
@@ -62,6 +62,32 @@ if(FAISS_OPT_LEVEL STREQUAL "avx512")
|
||||
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 $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:DEBUG>>:${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 $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:DEBUG>>:-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 $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:RELEASE>>:${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 $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:RELEASE>>:-march=armv8-a+sve>)
|
||||
endif()
|
||||
else()
|
||||
# TODO: support Windows
|
||||
endif()
|
||||
target_link_libraries(faiss_test PRIVATE faiss_sve)
|
||||
endif()
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
googletest
|
||||
|
||||
Reference in New Issue
Block a user