Skip to content

Commit 39affb7

Browse files
committed
perf(distance): optimize uint8 SIMD horizontal reduction and streamline instruction dispatch
1 parent e569e22 commit 39affb7

1 file changed

Lines changed: 5 additions & 6 deletions

File tree

cpp/deglib/include/deglib/distance/uint8_l2.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,14 @@ class L2Uint8 {
5050
// faster path for dimensions that are known to be SIMD-aligned.
5151

5252
DEGLIB_TARGET_AVX2 inline static int64_t uint8_l2_hsum256(__m256i s) {
53-
__m128i sum128 = _mm_add_epi32(_mm256_extracti128_si256(s, 0), _mm256_extracti128_si256(s, 1));
54-
alignas(16) int sum_array[4];
55-
_mm_store_si128(reinterpret_cast<__m128i*>(sum_array), sum128);
56-
return static_cast<int64_t>(sum_array[0] + sum_array[1] + sum_array[2] + sum_array[3]);
53+
__m128i sum128 = _mm_add_epi32(_mm256_castsi256_si128(s), _mm256_extracti128_si256(s, 1));
54+
sum128 = _mm_add_epi32(sum128, _mm_shuffle_epi32(sum128, _MM_SHUFFLE(1, 0, 3, 2)));
55+
sum128 = _mm_add_epi32(sum128, _mm_shuffle_epi32(sum128, _MM_SHUFFLE(2, 3, 0, 1)));
56+
return static_cast<int64_t>(_mm_cvtsi128_si32(sum128));
5757
}
5858

5959
DEGLIB_TARGET_AVX512 inline static int64_t uint8_l2_hsum512(__m512i s) {
60-
__m256i sum256 = _mm256_add_epi32(_mm512_castsi512_si256(s), _mm512_extracti64x4_epi64(s, 1));
61-
return uint8_l2_hsum256(sum256);
60+
return static_cast<int64_t>(_mm512_reduce_add_epi32(s));
6261
}
6362
template <ResidualMode Mode = ResidualMode::Full>
6463
class L2Uint8_AVX512 {

0 commit comments

Comments
 (0)