mirror of https://github.com/apache/lucene.git
LUCENE-10453: Speed up euclidean distances. (#725)
This commit is contained in:
parent
2700c6b525
commit
9d732380ae
|
@ -252,6 +252,9 @@ Optimizations
|
||||||
|
|
||||||
* LUCENE-10450: IndexSortSortedNumericDocValuesRangeQuery could be rewrite to MatchAllDocsQuery. (Lu Xugang)
|
* LUCENE-10450: IndexSortSortedNumericDocValuesRangeQuery could be rewrite to MatchAllDocsQuery. (Lu Xugang)
|
||||||
|
|
||||||
|
* LUCENE-10453: Indexing and search speedup with KNN vectors when using
|
||||||
|
euclidean distance. (Adrien Grand)
|
||||||
|
|
||||||
Changes in runtime behavior
|
Changes in runtime behavior
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
|
|
@ -133,13 +133,36 @@ public final class VectorUtil {
|
||||||
}
|
}
|
||||||
float squareSum = 0.0f;
|
float squareSum = 0.0f;
|
||||||
int dim = v1.length;
|
int dim = v1.length;
|
||||||
for (int i = 0; i < dim; i++) {
|
int i;
|
||||||
|
for (i = 0; i + 8 <= dim; i += 8) {
|
||||||
|
squareSum += squareDistanceUnrolled8(v1, v2, i);
|
||||||
|
}
|
||||||
|
for (; i < dim; i++) {
|
||||||
float diff = v1[i] - v2[i];
|
float diff = v1[i] - v2[i];
|
||||||
squareSum += diff * diff;
|
squareSum += diff * diff;
|
||||||
}
|
}
|
||||||
return squareSum;
|
return squareSum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static float squareDistanceUnrolled8(float[] v1, float[] v2, int index) {
|
||||||
|
float diff0 = v1[index + 0] - v2[index + 0];
|
||||||
|
float diff1 = v1[index + 1] - v2[index + 1];
|
||||||
|
float diff2 = v1[index + 2] - v2[index + 2];
|
||||||
|
float diff3 = v1[index + 3] - v2[index + 3];
|
||||||
|
float diff4 = v1[index + 4] - v2[index + 4];
|
||||||
|
float diff5 = v1[index + 5] - v2[index + 5];
|
||||||
|
float diff6 = v1[index + 6] - v2[index + 6];
|
||||||
|
float diff7 = v1[index + 7] - v2[index + 7];
|
||||||
|
return diff0 * diff0
|
||||||
|
+ diff1 * diff1
|
||||||
|
+ diff2 * diff2
|
||||||
|
+ diff3 * diff3
|
||||||
|
+ diff4 * diff4
|
||||||
|
+ diff5 * diff5
|
||||||
|
+ diff6 * diff6
|
||||||
|
+ diff7 * diff7;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modifies the argument to be unit length, dividing by its l2-norm. IllegalArgumentException is
|
* Modifies the argument to be unit length, dividing by its l2-norm. IllegalArgumentException is
|
||||||
* thrown for zero vectors.
|
* thrown for zero vectors.
|
||||||
|
|
Loading…
Reference in New Issue