mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-11 15:16:54 +08:00
Moved L1 distance to halfutils [skip ci]
This commit is contained in:
@@ -22,6 +22,7 @@
|
|||||||
float (*HalfvecL2SquaredDistance) (int dim, half * ax, half * bx);
|
float (*HalfvecL2SquaredDistance) (int dim, half * ax, half * bx);
|
||||||
float (*HalfvecInnerProduct) (int dim, half * ax, half * bx);
|
float (*HalfvecInnerProduct) (int dim, half * ax, half * bx);
|
||||||
double (*HalfvecCosineSimilarity) (int dim, half * ax, half * bx);
|
double (*HalfvecCosineSimilarity) (int dim, half * ax, half * bx);
|
||||||
|
float (*HalfvecL1Distance) (int dim, half * ax, half * bx);
|
||||||
|
|
||||||
static float
|
static float
|
||||||
HalfvecL2SquaredDistanceDefault(int dim, half * ax, half * bx)
|
HalfvecL2SquaredDistanceDefault(int dim, half * ax, half * bx)
|
||||||
@@ -191,6 +192,18 @@ HalfvecCosineSimilarityF16c(int dim, half * ax, half * bx)
|
|||||||
}
|
}
|
||||||
#endif
|
#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
|
#ifdef HALFVEC_DISPATCH
|
||||||
#define CPU_FEATURE_FMA (1 << 12)
|
#define CPU_FEATURE_FMA (1 << 12)
|
||||||
#define CPU_FEATURE_OSXSAVE (1 << 27)
|
#define CPU_FEATURE_OSXSAVE (1 << 27)
|
||||||
@@ -237,6 +250,7 @@ HalfvecInit(void)
|
|||||||
HalfvecL2SquaredDistance = HalfvecL2SquaredDistanceDefault;
|
HalfvecL2SquaredDistance = HalfvecL2SquaredDistanceDefault;
|
||||||
HalfvecInnerProduct = HalfvecInnerProductDefault;
|
HalfvecInnerProduct = HalfvecInnerProductDefault;
|
||||||
HalfvecCosineSimilarity = HalfvecCosineSimilarityDefault;
|
HalfvecCosineSimilarity = HalfvecCosineSimilarityDefault;
|
||||||
|
HalfvecL1Distance = HalfvecL1DistanceDefault;
|
||||||
|
|
||||||
#ifdef HALFVEC_DISPATCH
|
#ifdef HALFVEC_DISPATCH
|
||||||
if (SupportsCpuFeature(CPU_FEATURE_AVX | CPU_FEATURE_F16C | CPU_FEATURE_FMA))
|
if (SupportsCpuFeature(CPU_FEATURE_AVX | CPU_FEATURE_F16C | CPU_FEATURE_FMA))
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
extern float (*HalfvecL2SquaredDistance) (int dim, half * ax, half * bx);
|
extern float (*HalfvecL2SquaredDistance) (int dim, half * ax, half * bx);
|
||||||
extern float (*HalfvecInnerProduct) (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 double (*HalfvecCosineSimilarity) (int dim, half * ax, half * bx);
|
||||||
|
extern float (*HalfvecL1Distance) (int dim, half * ax, half * bx);
|
||||||
|
|
||||||
void HalfvecInit(void);
|
void HalfvecInit(void);
|
||||||
|
|
||||||
|
|||||||
@@ -683,17 +683,10 @@ halfvec_l1_distance(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
HalfVector *a = PG_GETARG_HALFVEC_P(0);
|
HalfVector *a = PG_GETARG_HALFVEC_P(0);
|
||||||
HalfVector *b = PG_GETARG_HALFVEC_P(1);
|
HalfVector *b = PG_GETARG_HALFVEC_P(1);
|
||||||
half *ax = a->x;
|
|
||||||
half *bx = b->x;
|
|
||||||
float distance = 0.0;
|
|
||||||
|
|
||||||
CheckDims(a, b);
|
CheckDims(a, b);
|
||||||
|
|
||||||
/* Auto-vectorized */
|
PG_RETURN_FLOAT8((double) HalfvecL1Distance(a->dim, a->x, b->x));
|
||||||
for (int i = 0; i < a->dim; i++)
|
|
||||||
distance += fabsf(HalfToFloat4(ax[i]) - HalfToFloat4(bx[i]));
|
|
||||||
|
|
||||||
PG_RETURN_FLOAT8((double) distance);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user