Skip to content
Open
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
34 changes: 17 additions & 17 deletions src/VecSim/spaces/IP/IP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@ float SQ8_FP32_InnerProduct_Impl(const void *pVect1v, const void *pVect2v, size_
// Combine accumulators
float quantized_dot = (sum0 + sum1) + (sum2 + sum3);

// Get quantization parameters from stored vector (pVect1 is SQ8)
const float *params = reinterpret_cast<const float *>(pVect1 + dimension);
const float min_val = params[sq8::MIN_VAL];
const float delta = params[sq8::DELTA];
// Storage metadata follows a byte payload and is not necessarily float-aligned.
const auto *params = pVect1 + dimension;
const float min_val = load_unaligned<float>(params + sq8::MIN_VAL * sizeof(float));
const float delta = load_unaligned<float>(params + sq8::DELTA * sizeof(float));

// Get precomputed y_sum from query blob (pVect2 is FP32, stored after the dim floats)
const float y_sum = pVect2[dimension + sq8::SUM_QUERY];
Expand Down Expand Up @@ -152,17 +152,17 @@ float SQ8_SQ8_InnerProduct_Impl(const void *pVect1v, const void *pVect2v, size_t
product += pVect1[i] * pVect2[i];
}

// Get quantization parameters from pVect1
const float *params1 = reinterpret_cast<const float *>(pVect1 + dimension);
const float min_val1 = params1[sq8::MIN_VAL];
const float delta1 = params1[sq8::DELTA];
const float sum1 = params1[sq8::SUM];
// Metadata follows byte payloads and is not necessarily float-aligned.
const auto *params1 = pVect1 + dimension;
const float min_val1 = load_unaligned<float>(params1 + sq8::MIN_VAL * sizeof(float));
const float delta1 = load_unaligned<float>(params1 + sq8::DELTA * sizeof(float));
const float sum1 = load_unaligned<float>(params1 + sq8::SUM * sizeof(float));

// Get quantization parameters from pVect2
const float *params2 = reinterpret_cast<const float *>(pVect2 + dimension);
const float min_val2 = params2[sq8::MIN_VAL];
const float delta2 = params2[sq8::DELTA];
const float sum2 = params2[sq8::SUM];
const auto *params2 = pVect2 + dimension;
const float min_val2 = load_unaligned<float>(params2 + sq8::MIN_VAL * sizeof(float));
const float delta2 = load_unaligned<float>(params2 + sq8::DELTA * sizeof(float));
const float sum2 = load_unaligned<float>(params2 + sq8::SUM * sizeof(float));

// Apply the algebraic formula using precomputed sums:
// IP = min1*sum2 + min2*sum1 + delta1*delta2*Σ(q1[i]*q2[i]) - dim*min1*min2
Expand Down Expand Up @@ -265,8 +265,8 @@ float INT8_Cosine(const void *pVect1v, const void *pVect2v, size_t dimension) {
const auto *pVect1 = static_cast<const int8_t *>(pVect1v);
const auto *pVect2 = static_cast<const int8_t *>(pVect2v);
// We expect the vectors' norm to be stored at the end of the vector.
float norm_v1 = *reinterpret_cast<const float *>(pVect1 + dimension);
float norm_v2 = *reinterpret_cast<const float *>(pVect2 + dimension);
const float norm_v1 = load_unaligned<float>(pVect1 + dimension);
const float norm_v2 = load_unaligned<float>(pVect2 + dimension);
return 1.0f - float(INTEGER_InnerProductImp(pVect1, pVect2, dimension)) / (norm_v1 * norm_v2);
}

Expand All @@ -280,7 +280,7 @@ float UINT8_Cosine(const void *pVect1v, const void *pVect2v, size_t dimension) {
const auto *pVect1 = static_cast<const uint8_t *>(pVect1v);
const auto *pVect2 = static_cast<const uint8_t *>(pVect2v);
// We expect the vectors' norm to be stored at the end of the vector.
float norm_v1 = *reinterpret_cast<const float *>(pVect1 + dimension);
float norm_v2 = *reinterpret_cast<const float *>(pVect2 + dimension);
const float norm_v1 = load_unaligned<float>(pVect1 + dimension);
const float norm_v2 = load_unaligned<float>(pVect2 + dimension);
return 1.0f - float(INTEGER_InnerProductImp(pVect1, pVect2, dimension)) / (norm_v1 * norm_v2);
}
6 changes: 3 additions & 3 deletions src/VecSim/spaces/IP/IP_AVX2_FMA_SQ8_FP32.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,9 @@ float SQ8_FP32_InnerProductImp_FMA(const void *pVect1v, const void *pVect2v, siz

// Get quantization parameters from stored vector (after quantized data)
const uint8_t *pVect1Base = static_cast<const uint8_t *>(pVect1v);
const float *params1 = reinterpret_cast<const float *>(pVect1Base + dimension);
const float min_val = params1[sq8::MIN_VAL];
const float delta = params1[sq8::DELTA];
const auto *params1 = pVect1Base + dimension;
const float min_val = load_unaligned<float>(params1 + sq8::MIN_VAL * sizeof(float));
const float delta = load_unaligned<float>(params1 + sq8::DELTA * sizeof(float));

// Get precomputed y_sum from query blob (stored after the dim floats)
const float y_sum = static_cast<const float *>(pVect2v)[dimension + sq8::SUM_QUERY];
Expand Down
6 changes: 3 additions & 3 deletions src/VecSim/spaces/IP/IP_AVX2_SQ8_FP32.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,9 @@ float SQ8_FP32_InnerProductImp_AVX2(const void *pVect1v, const void *pVect2v, si

// Get quantization parameters from stored vector (after quantized data)
const uint8_t *pVect1Base = static_cast<const uint8_t *>(pVect1v);
const float *params1 = reinterpret_cast<const float *>(pVect1Base + dimension);
const float min_val = params1[sq8::MIN_VAL];
const float delta = params1[sq8::DELTA];
const auto *params1 = pVect1Base + dimension;
const float min_val = load_unaligned<float>(params1 + sq8::MIN_VAL * sizeof(float));
const float delta = load_unaligned<float>(params1 + sq8::DELTA * sizeof(float));

// Get precomputed y_sum from query blob (stored after the dim floats)
const float y_sum = static_cast<const float *>(pVect2v)[dimension + sq8::SUM_QUERY];
Expand Down
6 changes: 2 additions & 4 deletions src/VecSim/spaces/IP/IP_AVX512F_BW_VL_VNNI_INT8.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,7 @@ template <unsigned char residual> // 0..63
float INT8_CosineSIMD64_AVX512F_BW_VL_VNNI(const void *pVect1v, const void *pVect2v,
size_t dimension) {
float ip = INT8_InnerProductImp<residual>(pVect1v, pVect2v, dimension);
float norm_v1 =
*reinterpret_cast<const float *>(static_cast<const int8_t *>(pVect1v) + dimension);
float norm_v2 =
*reinterpret_cast<const float *>(static_cast<const int8_t *>(pVect2v) + dimension);
const float norm_v1 = load_unaligned<float>(static_cast<const int8_t *>(pVect1v) + dimension);
const float norm_v2 = load_unaligned<float>(static_cast<const int8_t *>(pVect2v) + dimension);
return 1.0f - ip / (norm_v1 * norm_v2);
}
6 changes: 3 additions & 3 deletions src/VecSim/spaces/IP/IP_AVX512F_BW_VL_VNNI_SQ8_FP32.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,9 @@ float SQ8_FP32_InnerProductImp_AVX512(const void *pVec1v, const void *pVec2v, si
// Get quantization parameters from stored vector (after quantized data)
// Use the original base pointer since pVec1 has been advanced
const uint8_t *pVec1Base = static_cast<const uint8_t *>(pVec1v);
const float *params1 = reinterpret_cast<const float *>(pVec1Base + dimension);
const float min_val = params1[sq8::MIN_VAL];
const float delta = params1[sq8::DELTA];
const auto *params1 = pVec1Base + dimension;
const float min_val = load_unaligned<float>(params1 + sq8::MIN_VAL * sizeof(float));
const float delta = load_unaligned<float>(params1 + sq8::DELTA * sizeof(float));

// Get precomputed y_sum from query blob (stored after the dim floats)
// Use the original base pointer since pVec2 has been advanced
Expand Down
16 changes: 8 additions & 8 deletions src/VecSim/spaces/IP/IP_AVX512F_BW_VL_VNNI_SQ8_SQ8.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,15 @@ float SQ8_SQ8_InnerProductImp(const void *pVec1v, const void *pVec2v, size_t dim
const uint8_t *pVec1 = static_cast<const uint8_t *>(pVec1v);
const uint8_t *pVec2 = static_cast<const uint8_t *>(pVec2v);

const float *params1 = reinterpret_cast<const float *>(pVec1 + dimension);
const float min1 = params1[sq8::MIN_VAL];
const float delta1 = params1[sq8::DELTA];
const float sum1 = params1[sq8::SUM]; // Precomputed sum of original float elements
const auto *params1 = pVec1 + dimension;
const float min1 = load_unaligned<float>(params1 + sq8::MIN_VAL * sizeof(float));
const float delta1 = load_unaligned<float>(params1 + sq8::DELTA * sizeof(float));
const float sum1 = load_unaligned<float>(params1 + sq8::SUM * sizeof(float));

const float *params2 = reinterpret_cast<const float *>(pVec2 + dimension);
const float min2 = params2[sq8::MIN_VAL];
const float delta2 = params2[sq8::DELTA];
const float sum2 = params2[sq8::SUM]; // Precomputed sum of original float elements
const auto *params2 = pVec2 + dimension;
const float min2 = load_unaligned<float>(params2 + sq8::MIN_VAL * sizeof(float));
const float delta2 = load_unaligned<float>(params2 + sq8::DELTA * sizeof(float));
const float sum2 = load_unaligned<float>(params2 + sq8::SUM * sizeof(float));

// Apply the algebraic formula using precomputed sums:
// IP = min1*sum2 + min2*sum1 + δ1*δ2 * Σ(q1[i]*q2[i]) - dim*min1*min2
Expand Down
6 changes: 2 additions & 4 deletions src/VecSim/spaces/IP/IP_AVX512F_BW_VL_VNNI_UINT8.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,7 @@ template <unsigned char residual> // 0..63
float UINT8_CosineSIMD64_AVX512F_BW_VL_VNNI(const void *pVect1v, const void *pVect2v,
size_t dimension) {
float ip = UINT8_InnerProductImp<residual>(pVect1v, pVect2v, dimension);
float norm_v1 =
*reinterpret_cast<const float *>(static_cast<const uint8_t *>(pVect1v) + dimension);
float norm_v2 =
*reinterpret_cast<const float *>(static_cast<const uint8_t *>(pVect2v) + dimension);
const float norm_v1 = load_unaligned<float>(static_cast<const uint8_t *>(pVect1v) + dimension);
const float norm_v2 = load_unaligned<float>(static_cast<const uint8_t *>(pVect2v) + dimension);
return 1.0f - ip / (norm_v1 * norm_v2);
}
6 changes: 2 additions & 4 deletions src/VecSim/spaces/IP/IP_NEON_DOTPROD_INT8.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,7 @@ float INT8_InnerProductSIMD16_NEON_DOTPROD(const void *pVect1v, const void *pVec
template <unsigned char residual> // 0..63
float INT8_CosineSIMD_NEON_DOTPROD(const void *pVect1v, const void *pVect2v, size_t dimension) {
float ip = INT8_InnerProductImp<residual>(pVect1v, pVect2v, dimension);
float norm_v1 =
*reinterpret_cast<const float *>(static_cast<const uint8_t *>(pVect1v) + dimension);
float norm_v2 =
*reinterpret_cast<const float *>(static_cast<const uint8_t *>(pVect2v) + dimension);
const float norm_v1 = load_unaligned<float>(static_cast<const uint8_t *>(pVect1v) + dimension);
const float norm_v2 = load_unaligned<float>(static_cast<const uint8_t *>(pVect2v) + dimension);
return 1.0f - ip / (norm_v1 * norm_v2);
}
16 changes: 8 additions & 8 deletions src/VecSim/spaces/IP/IP_NEON_DOTPROD_SQ8_SQ8.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,15 @@ float SQ8_SQ8_InnerProductSIMD64_NEON_DOTPROD_IMP(const void *pVec1v, const void
const uint8_t *pVec1 = static_cast<const uint8_t *>(pVec1v);
const uint8_t *pVec2 = static_cast<const uint8_t *>(pVec2v);

const float *params1 = reinterpret_cast<const float *>(pVec1 + dimension);
const float min1 = params1[sq8::MIN_VAL];
const float delta1 = params1[sq8::DELTA];
const float sum1 = params1[sq8::SUM]; // Precomputed sum of original float elements
const auto *params1 = pVec1 + dimension;
const float min1 = load_unaligned<float>(params1 + sq8::MIN_VAL * sizeof(float));
const float delta1 = load_unaligned<float>(params1 + sq8::DELTA * sizeof(float));
const float sum1 = load_unaligned<float>(params1 + sq8::SUM * sizeof(float));

const float *params2 = reinterpret_cast<const float *>(pVec2 + dimension);
const float min2 = params2[sq8::MIN_VAL];
const float delta2 = params2[sq8::DELTA];
const float sum2 = params2[sq8::SUM]; // Precomputed sum of original float elements
const auto *params2 = pVec2 + dimension;
const float min2 = load_unaligned<float>(params2 + sq8::MIN_VAL * sizeof(float));
const float delta2 = load_unaligned<float>(params2 + sq8::DELTA * sizeof(float));
const float sum2 = load_unaligned<float>(params2 + sq8::SUM * sizeof(float));

// Apply algebraic formula using precomputed sums:
// IP = min1*sum2 + min2*sum1 + δ1*δ2 * Σ(q1*q2) - dim*min1*min2
Expand Down
6 changes: 2 additions & 4 deletions src/VecSim/spaces/IP/IP_NEON_DOTPROD_UINT8.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,7 @@ float UINT8_InnerProductSIMD16_NEON_DOTPROD(const void *pVect1v, const void *pVe
template <unsigned char residual> // 0..63
float UINT8_CosineSIMD_NEON_DOTPROD(const void *pVect1v, const void *pVect2v, size_t dimension) {
float ip = UINT8_InnerProductImp<residual>(pVect1v, pVect2v, dimension);
float norm_v1 =
*reinterpret_cast<const float *>(static_cast<const uint8_t *>(pVect1v) + dimension);
float norm_v2 =
*reinterpret_cast<const float *>(static_cast<const uint8_t *>(pVect2v) + dimension);
const float norm_v1 = load_unaligned<float>(static_cast<const uint8_t *>(pVect1v) + dimension);
const float norm_v2 = load_unaligned<float>(static_cast<const uint8_t *>(pVect2v) + dimension);
return 1.0f - ip / (norm_v1 * norm_v2);
}
6 changes: 2 additions & 4 deletions src/VecSim/spaces/IP/IP_NEON_INT8.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,7 @@ float INT8_InnerProductSIMD16_NEON(const void *pVect1v, const void *pVect2v, siz
template <unsigned char residual> // 0..63
float INT8_CosineSIMD_NEON(const void *pVect1v, const void *pVect2v, size_t dimension) {
float ip = INT8_InnerProductImp<residual>(pVect1v, pVect2v, dimension);
float norm_v1 =
*reinterpret_cast<const float *>(static_cast<const uint8_t *>(pVect1v) + dimension);
float norm_v2 =
*reinterpret_cast<const float *>(static_cast<const uint8_t *>(pVect2v) + dimension);
const float norm_v1 = load_unaligned<float>(static_cast<const uint8_t *>(pVect1v) + dimension);
const float norm_v2 = load_unaligned<float>(static_cast<const uint8_t *>(pVect2v) + dimension);
return 1.0f - ip / (norm_v1 * norm_v2);
}
6 changes: 3 additions & 3 deletions src/VecSim/spaces/IP/IP_NEON_SQ8_FP32.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,9 @@ float SQ8_FP32_InnerProductSIMD16_NEON_IMP(const void *pVect1v, const void *pVec

// Get quantization parameters from stored vector (after quantized data)
const uint8_t *pVect1Base = static_cast<const uint8_t *>(pVect1v);
const float *params1 = reinterpret_cast<const float *>(pVect1Base + dimension);
const float min_val = params1[sq8::MIN_VAL];
const float delta = params1[sq8::DELTA];
const auto *params1 = pVect1Base + dimension;
const float min_val = load_unaligned<float>(params1 + sq8::MIN_VAL * sizeof(float));
const float delta = load_unaligned<float>(params1 + sq8::DELTA * sizeof(float));

// Get precomputed y_sum from query blob (stored after the dim floats)
const float y_sum = static_cast<const float *>(pVect2v)[dimension + sq8::SUM_QUERY];
Expand Down
16 changes: 8 additions & 8 deletions src/VecSim/spaces/IP/IP_NEON_SQ8_SQ8.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,16 +48,16 @@ float SQ8_SQ8_InnerProductSIMD64_NEON_IMP(const void *pVec1v, const void *pVec2v
const uint8_t *pVec1 = static_cast<const uint8_t *>(pVec1v);
const uint8_t *pVec2 = static_cast<const uint8_t *>(pVec2v);

const float *params1 = reinterpret_cast<const float *>(pVec1 + dimension);
const float min1 = params1[sq8::MIN_VAL];
const float delta1 = params1[sq8::DELTA];
const float sum1 = params1[sq8::SUM]; // Precomputed sum of original float elements
const auto *params1 = pVec1 + dimension;
const float min1 = load_unaligned<float>(params1 + sq8::MIN_VAL * sizeof(float));
const float delta1 = load_unaligned<float>(params1 + sq8::DELTA * sizeof(float));
const float sum1 = load_unaligned<float>(params1 + sq8::SUM * sizeof(float));

// Get dequantization parameters and precomputed values from the end of pVec2
const float *params2 = reinterpret_cast<const float *>(pVec2 + dimension);
const float min2 = params2[sq8::MIN_VAL];
const float delta2 = params2[sq8::DELTA];
const float sum2 = params2[sq8::SUM]; // Precomputed sum of original float elements
const auto *params2 = pVec2 + dimension;
const float min2 = load_unaligned<float>(params2 + sq8::MIN_VAL * sizeof(float));
const float delta2 = load_unaligned<float>(params2 + sq8::DELTA * sizeof(float));
const float sum2 = load_unaligned<float>(params2 + sq8::SUM * sizeof(float));

// Apply algebraic formula using precomputed sums:
// IP = min1*sum2 + min2*sum1 + δ1*δ2 * Σ(q1*q2) - dim*min1*min2
Expand Down
6 changes: 2 additions & 4 deletions src/VecSim/spaces/IP/IP_NEON_UINT8.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,7 @@ float UINT8_InnerProductSIMD16_NEON(const void *pVect1v, const void *pVect2v, si
template <unsigned char residual> // 0..63
float UINT8_CosineSIMD_NEON(const void *pVect1v, const void *pVect2v, size_t dimension) {
float ip = UINT8_InnerProductImp<residual>(pVect1v, pVect2v, dimension);
float norm_v1 =
*reinterpret_cast<const float *>(static_cast<const uint8_t *>(pVect1v) + dimension);
float norm_v2 =
*reinterpret_cast<const float *>(static_cast<const uint8_t *>(pVect2v) + dimension);
const float norm_v1 = load_unaligned<float>(static_cast<const uint8_t *>(pVect1v) + dimension);
const float norm_v2 = load_unaligned<float>(static_cast<const uint8_t *>(pVect2v) + dimension);
return 1.0f - ip / (norm_v1 * norm_v2);
}
8 changes: 4 additions & 4 deletions src/VecSim/spaces/IP/IP_SSE4_SQ8_FP32.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ using sq8 = vecsim_types::sq8;
static inline void InnerProductStepSQ8_FP32(const uint8_t *&pVect1, const float *&pVect2,
__m128 &sum) {
// Load 4 uint8 elements and convert to float
__m128i v1_i = _mm_cvtepu8_epi32(_mm_cvtsi32_si128(*reinterpret_cast<const int32_t *>(pVect1)));
__m128i v1_i = _mm_cvtepu8_epi32(_mm_cvtsi32_si128(load_unaligned<int32_t>(pVect1)));
pVect1 += 4;

__m128 v1_f = _mm_cvtepi32_ps(v1_i);
Expand Down Expand Up @@ -111,9 +111,9 @@ float SQ8_FP32_InnerProductSIMD16_SSE4_IMP(const void *pVect1v, const void *pVec

// Get quantization parameters from stored vector (after quantized data)
const uint8_t *pVect1Base = static_cast<const uint8_t *>(pVect1v);
const float *params1 = reinterpret_cast<const float *>(pVect1Base + dimension);
const float min_val = params1[sq8::MIN_VAL];
const float delta = params1[sq8::DELTA];
const auto *params1 = pVect1Base + dimension;
const float min_val = load_unaligned<float>(params1 + sq8::MIN_VAL * sizeof(float));
const float delta = load_unaligned<float>(params1 + sq8::DELTA * sizeof(float));

// Get precomputed y_sum from query blob (stored after the dim floats)
const float *pVect2Base = static_cast<const float *>(pVect2v);
Expand Down
6 changes: 2 additions & 4 deletions src/VecSim/spaces/IP/IP_SVE_INT8.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,7 @@ float INT8_InnerProductSIMD_SVE(const void *pVect1v, const void *pVect2v, size_t
template <bool partial_chunk, unsigned char additional_steps>
float INT8_CosineSIMD_SVE(const void *pVect1v, const void *pVect2v, size_t dimension) {
float ip = INT8_InnerProductImp<partial_chunk, additional_steps>(pVect1v, pVect2v, dimension);
float norm_v1 =
*reinterpret_cast<const float *>(static_cast<const int8_t *>(pVect1v) + dimension);
float norm_v2 =
*reinterpret_cast<const float *>(static_cast<const int8_t *>(pVect2v) + dimension);
const float norm_v1 = load_unaligned<float>(static_cast<const int8_t *>(pVect1v) + dimension);
const float norm_v2 = load_unaligned<float>(static_cast<const int8_t *>(pVect2v) + dimension);
return 1.0f - ip / (norm_v1 * norm_v2);
}
6 changes: 3 additions & 3 deletions src/VecSim/spaces/IP/IP_SVE_SQ8_FP32.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,9 @@ float SQ8_FP32_InnerProductSIMD_SVE_IMP(const void *pVect1v, const void *pVect2v
float quantized_dot = svaddv_f32(pg, sum);

// Get quantization parameters from stored vector (after quantized data)
const float *params1 = reinterpret_cast<const float *>(pVect1 + dimension);
const float min_val = params1[sq8::MIN_VAL];
const float delta = params1[sq8::DELTA];
const auto *params1 = pVect1 + dimension;
const float min_val = load_unaligned<float>(params1 + sq8::MIN_VAL * sizeof(float));
const float delta = load_unaligned<float>(params1 + sq8::DELTA * sizeof(float));

// Get precomputed y_sum from query blob (stored after the dim floats)
const float y_sum = pVect2[dimension + sq8::SUM_QUERY];
Expand Down
Loading
Loading