Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ set(Python3_ARCH_INCLUDE_DIR "/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/"

find_package(Python3 COMPONENTS Interpreter Development REQUIRED)

# On Linux, pybind11 modules don't need to link against libpython
# This prevents issues with static libpython that wasn't built with -fPIC
if(UNIX AND NOT APPLE)
set(Python3_LIBRARIES "")
endif()

find_package(pybind11 REQUIRED)
find_package(Threads REQUIRED)

Expand All @@ -59,11 +65,24 @@ endif()

add_subdirectory(../third_party/spdlog-1.14.1 ${CMAKE_BINARY_DIR}/spdlog_build)

# ARM platform detection and KRL integration
set(OV_PLATFORM_ARM OFF)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|ARM64|arm64")
set(OV_PLATFORM_ARM ON)
message(STATUS "Building for ARM platform with KRL support")
add_subdirectory(../third_party/krl ${CMAKE_BINARY_DIR}/krl_build)
endif()

include_directories(.)
include_directories(../third_party/)
include_directories(../third_party/leveldb-1.23/include/)
include_directories(../third_party/spdlog-1.14.1/include/)

# Add KRL include directory for ARM platform
if(OV_PLATFORM_ARM)
include_directories(../third_party/krl/include/)
endif()

if(NOT DEFINED Python3_INCLUDE_DIRS)
set(Python3_INCLUDE_DIRS
${Python3_ARCH_INCLUDE_DIR}
Expand All @@ -88,6 +107,11 @@ target_link_libraries(engine_impl PRIVATE
leveldb
)

# Link KRL library for ARM platform
if(OV_PLATFORM_ARM)
target_link_libraries(engine_impl PRIVATE krl)
endif()

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0")
target_link_libraries(engine_impl PRIVATE stdc++fs)
Expand Down
19 changes: 18 additions & 1 deletion src/index/detail/vector/common/space_ip.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,27 @@ static float inner_product_sse(const void* v1, const void* v2,
}
#endif

#if defined(OV_SIMD_NEON)
#include "krl.h"

// ARM NEON optimized inner product using KRL library
static float inner_product_neon(const void* v1, const void* v2,
const void* params) {
const float* pv1 = static_cast<const float*>(v1);
const float* pv2 = static_cast<const float*>(v2);
size_t dim = *static_cast<const size_t*>(params);
float dis = 0;
krl_ipdis(pv1, pv2, dim, &dis, 1);
return dis;
}
#endif

class InnerProductSpace : public VectorSpace<float> {
public:
explicit InnerProductSpace(size_t dim) : dim_(dim) {
#if defined(OV_SIMD_AVX512)
#if defined(OV_SIMD_NEON)
metric_func_ = inner_product_neon;
#elif defined(OV_SIMD_AVX512)
metric_func_ = inner_product_avx512;
#elif defined(OV_SIMD_AVX)
metric_func_ = inner_product_avx;
Expand Down
18 changes: 17 additions & 1 deletion src/index/detail/vector/common/space_l2.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,28 @@ static float l2_sqr_sse(const void* v1, const void* v2, const void* params) {
}
#endif

#if defined(OV_SIMD_NEON)
#include "krl.h"

// ARM NEON optimized L2 squared distance using KRL library
static float l2_sqr_neon(const void* v1, const void* v2, const void* params) {
const float* pv1 = static_cast<const float*>(v1);
const float* pv2 = static_cast<const float*>(v2);
size_t dim = *static_cast<const size_t*>(params);
float dis = 0;
krl_L2sqr(pv1, pv2, dim, &dis, 1);
return 1.0f - dis;
}
#endif

class L2Space : public VectorSpace<float> {
public:
explicit L2Space(size_t dim) : dim_(dim) {
// Select best implementation at runtime based on compile-time flags
// In a real scenario, we might want dynamic dispatch based on CPUID
#if defined(OV_SIMD_AVX512)
#if defined(OV_SIMD_NEON)
metric_func_ = l2_sqr_neon;
#elif defined(OV_SIMD_AVX512)
metric_func_ = l2_sqr_avx512;
#elif defined(OV_SIMD_AVX)
metric_func_ = l2_sqr_avx;
Expand Down
9 changes: 9 additions & 0 deletions src/index/detail/vector/common/vector_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,15 @@
#endif
#endif

// ARM Platform Detection
#if defined(__aarch64__) || defined(_M_ARM64)
#define OV_PLATFORM_ARM
#define OV_SIMD_NEON
#if defined(__ARM_FEATURE_SVE)
#define OV_SIMD_SVE
#endif
#endif

// Memory Alignment Macros
#if defined(_MSC_VER)
#define OV_ALIGN_32 __declspec(align(32))
Expand Down
33 changes: 33 additions & 0 deletions third_party/krl/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
cmake_minimum_required(VERSION 3.12)

project(krl CXX)

# Only build on ARM platform
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|ARM64|arm64")
# Set C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ARM compile options - use more conservative flags
add_compile_options(-O2 -fPIC -fvisibility=hidden)

# Minimal set for OpenViking: only krl_L2sqr and krl_ipdis (float, single-vector)
# C++ sources following OpenViking code style
set(KRL_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/src/L2distance_simd.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/IPdistance_simd.cpp
)

# Create static library
add_library(krl STATIC ${KRL_SOURCES})

# Include directories
target_include_directories(krl PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

# PIC for static library
set_target_properties(krl PROPERTIES POSITION_INDEPENDENT_CODE ON)

message(STATUS "KRL library configured for ARM platform (core distance functions only)")
else()
message(STATUS "KRL library skipped - not ARM platform")
endif()
Loading
Loading