summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eval/src/vespa/eval/instruction/dense_hamming_distance.cpp22
-rw-r--r--searchlib/src/vespa/searchlib/tensor/hamming_distance.cpp19
2 files changed, 3 insertions, 38 deletions
diff --git a/eval/src/vespa/eval/instruction/dense_hamming_distance.cpp b/eval/src/vespa/eval/instruction/dense_hamming_distance.cpp
index 2a68663631a..acb3e85657b 100644
--- a/eval/src/vespa/eval/instruction/dense_hamming_distance.cpp
+++ b/eval/src/vespa/eval/instruction/dense_hamming_distance.cpp
@@ -4,6 +4,7 @@
#include <vespa/eval/eval/operation.h>
#include <vespa/eval/eval/value.h>
#include <vespa/eval/eval/hamming_distance.h>
+#include <vespa/vespalib/util/hamming_distance.h>
#include <vespa/log/log.h>
LOG_SETUP(".eval.instruction.dense_hamming_distance");
@@ -14,27 +15,6 @@ using namespace tensor_function;
namespace {
-
-size_t binary_hamming_distance(const void *lhs, const void *rhs, size_t sz) {
- const uint64_t *words_a = static_cast<const uint64_t *>(lhs);
- const uint64_t *words_b = static_cast<const uint64_t *>(rhs);
- size_t sum = 0;
- size_t i = 0;
- for (; i * 8 + 7 < sz; ++i) {
- uint64_t xor_bits = words_a[i] ^ words_b[i];
- sum += __builtin_popcountl(xor_bits);
- }
- if (__builtin_expect((i * 8 < sz), false)) {
- const uint8_t *bytes_a = static_cast<const uint8_t *>(lhs);
- const uint8_t *bytes_b = static_cast<const uint8_t *>(rhs);
- for (i *= 8; i < sz; ++i) {
- uint64_t xor_bits = bytes_a[i] ^ bytes_b[i];
- sum += __builtin_popcountl(xor_bits);
- }
- }
- return sum;
-};
-
void int8_hamming_to_double_op(InterpretedFunction::State &state, uint64_t vector_size) {
const auto &lhs = state.peek(1);
const auto &rhs = state.peek(0);
diff --git a/searchlib/src/vespa/searchlib/tensor/hamming_distance.cpp b/searchlib/src/vespa/searchlib/tensor/hamming_distance.cpp
index ef00321a145..b52ae4d8033 100644
--- a/searchlib/src/vespa/searchlib/tensor/hamming_distance.cpp
+++ b/searchlib/src/vespa/searchlib/tensor/hamming_distance.cpp
@@ -1,6 +1,7 @@
// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "hamming_distance.h"
+#include <vespa/vespalib/util/hamming_distance.h>
using vespalib::typify_invoke;
using vespalib::eval::TypifyCellType;
@@ -34,25 +35,9 @@ HammingDistance::calc(const vespalib::eval::TypedCells& lhs,
{
constexpr auto expected = vespalib::eval::CellType::INT8;
if (__builtin_expect((lhs.type == expected && rhs.type == expected), true)) {
- const uint64_t *words_a = static_cast<const uint64_t *>(lhs.data);
- const uint64_t *words_b = static_cast<const uint64_t *>(rhs.data);
- size_t sum = 0;
size_t sz = lhs.size;
assert(sz == rhs.size);
- size_t i = 0;
- for (; i * 8 + 7 < sz; ++i) {
- uint64_t xor_bits = words_a[i] ^ words_b[i];
- sum += __builtin_popcountl(xor_bits);
- }
- if (__builtin_expect((i * 8 < sz), false)) {
- const uint8_t *bytes_a = static_cast<const uint8_t *>(lhs.data);
- const uint8_t *bytes_b = static_cast<const uint8_t *>(rhs.data);
- for (i *= 8; i < sz; ++i) {
- uint64_t xor_bits = bytes_a[i] ^ bytes_b[i];
- sum += __builtin_popcountl(xor_bits);
- }
- }
- return (double)sum;
+ return (double) vespalib::binary_hamming_distance(lhs.data, rhs.data, sz);
} else {
return typify_invoke<2,TypifyCellType,CalcHamming>(lhs.type, rhs.type, lhs, rhs);
}