@@ -335,6 +335,45 @@ if(FAISS_ENABLE_SVS)
335335 )
336336endif ()
337337
338+ # -------------------- ARM aarch64 sra_krl sources --------------------
339+ # On aarch64, add sra_krl sources. Source code uses #ifdef __aarch64__.
340+ #
341+ # These .c files contain C++ features (template, constexpr, #include <cstring>)
342+ # so they MUST be compiled as C++. The public API headers (krl.h) already wrap
343+ # function declarations with extern "C" { }, ensuring C linkage for symbols.
344+ set (KRL_SRC)
345+ if (CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch64|arm64|ARM64)" )
346+ message (STATUS "ARM aarch64 detected: adding sra_krl sources" )
347+
348+ set (KRL_SRC
349+ sra_krl/src/IPdistance_simd_f16f32.c
350+ sra_krl/src/IPdistance_simd.c
351+ sra_krl/src/IPdistance_simd_s8.c
352+ sra_krl/src/krl_handles.c
353+ sra_krl/src/L2distance_simd_f16f32.c
354+ sra_krl/src/L2distance_simd.c
355+ sra_krl/src/L2distance_simd_u8.c
356+ sra_krl/src/matrix_block_transpose.c
357+ sra_krl/src/MinMax_quant.c
358+ sra_krl/src/pq_search_with_table_8bit.c
359+ )
360+
361+
362+ # Force C++ compilation: these .c files use template, constexpr, <cstring>
363+ set_source_files_properties (${KRL_SRC} PROPERTIES LANGUAGE CXX)
364+
365+ set (KRL_COMPILE_FLAGS "-march=armv8.2-a+fp16+fp16fml+dotprod+sve+rcpc" )
366+
367+ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang" )
368+ set_source_files_properties (${KRL_SRC} PROPERTIES
369+ COMPILE_FLAGS "${KRL_COMPILE_FLAGS} "
370+ )
371+ endif ()
372+
373+ # Add KRL sources to main FAISS_SRC
374+ list (APPEND FAISS_SRC ${KRL_SRC} )
375+ endif ()
376+
338377if (NOT WIN32 )
339378 list (APPEND FAISS_SRC invlists/OnDiskInvertedLists.cpp)
340379 list (APPEND FAISS_HEADERS invlists/OnDiskInvertedLists.h)
@@ -345,6 +384,14 @@ set(FAISS_HEADERS ${FAISS_HEADERS} PARENT_SCOPE)
345384
346385add_library (faiss ${FAISS_SRC} )
347386
387+ # -------------------- aarch64 sra_krl include dirs for faiss --------------------
388+ if (CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch64|arm64|ARM64)" )
389+ target_include_directories (faiss PUBLIC
390+ $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR } /sra_krl /include >
391+ $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} /faiss /sra_krl >
392+ )
393+ endif ()
394+
348395add_library (faiss_avx2 ${FAISS_SRC} )
349396if (NOT FAISS_OPT_LEVEL STREQUAL "avx2" AND NOT FAISS_OPT_LEVEL STREQUAL "avx512" AND NOT FAISS_OPT_LEVEL STREQUAL "avx512_spr" )
350397 set_target_properties (faiss_avx2 PROPERTIES EXCLUDE_FROM_ALL TRUE )
@@ -422,6 +469,14 @@ endif()
422469target_sources (faiss_sve PRIVATE ${FAISS_SIMD_NEON_SRC} ${FAISS_SIMD_SVE_SRC} )
423470target_compile_definitions (faiss_sve PRIVATE COMPILE_SIMD_ARM_NEON COMPILE_SIMD_ARM_SVE )
424471
472+ # -------------------- aarch64 sra_krl include dirs for faiss_sve --------------------
473+ if (CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch64|arm64|ARM64)" )
474+ target_include_directories (faiss_sve PUBLIC
475+ $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR } /sra_krl /include >
476+ $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} /faiss /sra_krl >
477+ )
478+ endif ()
479+
425480# =============================================================================
426481# Dynamic Dispatch Mode
427482# When FAISS_OPT_LEVEL=dd, the main faiss library is built with runtime SIMD
@@ -616,6 +671,13 @@ endif()
616671# Note: FAISS_OPT_LEVEL=dd builds DD support into main faiss target,
617672# so no separate faiss_dd install is needed
618673
674+ # -------------------- Install KRL headers (aarch64 only) --------------------
675+ if (CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch64|arm64|ARM64)" )
676+ install (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR } /sra_krl/include/
677+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} /faiss/sra_krl/include
678+ FILES_MATCHING PATTERN "*.h" )
679+ endif ()
680+
619681foreach (header ${FAISS_HEADERS} )
620682 get_filename_component (dir ${header} DIRECTORY )
621683 install (FILES ${header}
0 commit comments