diff --git a/src/halfutils.c b/src/halfutils.c index 810229e..1d8266a 100644 --- a/src/halfutils.c +++ b/src/halfutils.c @@ -22,6 +22,7 @@ float (*HalfvecL2SquaredDistance) (int dim, half * ax, half * bx); float (*HalfvecInnerProduct) (int dim, half * ax, half * bx); double (*HalfvecCosineSimilarity) (int dim, half * ax, half * bx); +float (*HalfvecL1Distance) (int dim, half * ax, half * bx); static float HalfvecL2SquaredDistanceDefault(int dim, half * ax, half * bx) @@ -191,6 +192,18 @@ HalfvecCosineSimilarityF16c(int dim, half * ax, half * bx) } #endif +static float +HalfvecL1DistanceDefault(int dim, half * ax, half * bx) +{ + float distance = 0.0; + + /* Auto-vectorized */ + for (int i = 0; i < dim; i++) + distance += fabsf(HalfToFloat4(ax[i]) - HalfToFloat4(bx[i])); + + return distance; +} + #ifdef HALFVEC_DISPATCH #define CPU_FEATURE_FMA (1 << 12) #define CPU_FEATURE_OSXSAVE (1 << 27) @@ -237,6 +250,7 @@ HalfvecInit(void) HalfvecL2SquaredDistance = HalfvecL2SquaredDistanceDefault; HalfvecInnerProduct = HalfvecInnerProductDefault; HalfvecCosineSimilarity = HalfvecCosineSimilarityDefault; + HalfvecL1Distance = HalfvecL1DistanceDefault; #ifdef HALFVEC_DISPATCH if (SupportsCpuFeature(CPU_FEATURE_AVX | CPU_FEATURE_F16C | CPU_FEATURE_FMA)) diff --git a/src/halfutils.h b/src/halfutils.h index 959d96e..5f6e9cd 100644 --- a/src/halfutils.h +++ b/src/halfutils.h @@ -13,6 +13,7 @@ extern float (*HalfvecL2SquaredDistance) (int dim, half * ax, half * bx); extern float (*HalfvecInnerProduct) (int dim, half * ax, half * bx); extern double (*HalfvecCosineSimilarity) (int dim, half * ax, half * bx); +extern float (*HalfvecL1Distance) (int dim, half * ax, half * bx); void HalfvecInit(void); diff --git a/src/halfvec.c b/src/halfvec.c index 42b4fb2..508ddc3 100644 --- a/src/halfvec.c +++ b/src/halfvec.c @@ -683,17 +683,10 @@ halfvec_l1_distance(PG_FUNCTION_ARGS) { HalfVector *a = PG_GETARG_HALFVEC_P(0); HalfVector *b = PG_GETARG_HALFVEC_P(1); - half *ax = a->x; - half *bx = b->x; - float distance = 0.0; CheckDims(a, b); - /* Auto-vectorized */ - for (int i = 0; i < a->dim; i++) - distance += fabsf(HalfToFloat4(ax[i]) - HalfToFloat4(bx[i])); - - PG_RETURN_FLOAT8((double) distance); + PG_RETURN_FLOAT8((double) HalfvecL1Distance(a->dim, a->x, b->x)); } /*