From 4e093f95be92aaf68bc0e63ab1f06dd3ace67c00 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Thu, 18 Apr 2024 14:13:12 -0700 Subject: [PATCH] Improved consistency of CPU dispatching code --- src/bitutils.h | 13 +++++++++---- src/halfvec.h | 3 ++- src/vector.c | 20 ++++++-------------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/bitutils.h b/src/bitutils.h index 10fa06d..1efebd5 100644 --- a/src/bitutils.h +++ b/src/bitutils.h @@ -2,19 +2,24 @@ #define BITUTILS_H /* Only enable for more recent compilers */ +/* TODO Move to better place */ #if defined(__x86_64__) && defined(__GNUC__) && __GNUC__ >= 8 -#define BIT_DISPATCH +#define USE_DISPATCH #elif defined(__x86_64__) && defined(__clang_major__) && __clang_major__ >= 7 -#define BIT_DISPATCH +#define USE_DISPATCH #elif defined(_M_AMD64) && defined(_MSC_VER) && _MSC_VER >= 1920 -#define BIT_DISPATCH +#define USE_DISPATCH #endif /* target_clones requires glibc */ -#if defined(BIT_DISPATCH) && defined(__gnu_linux__) +#if defined(USE_DISPATCH) && defined(__gnu_linux__) #define USE_TARGET_CLONES #endif +#if defined(USE_DISPATCH) +#define BIT_DISPATCH +#endif + extern uint64 (*BitHammingDistance) (uint32 bytes, unsigned char *ax, unsigned char *bx, uint64 distance); extern double (*BitJaccardDistance) (uint32 bytes, unsigned char *ax, unsigned char *bx, uint64 ab, uint64 aa, uint64 bb); diff --git a/src/halfvec.h b/src/halfvec.h index 5378b2c..80efa13 100644 --- a/src/halfvec.h +++ b/src/halfvec.h @@ -5,10 +5,11 @@ #include +#include "bitutils.h" #include "fmgr.h" #include "vector.h" -#if defined(__x86_64__) || defined(_M_AMD64) +#if defined(USE_DISPATCH) #define HALFVEC_DISPATCH #endif diff --git a/src/vector.c b/src/vector.c index a3e0132..5883843 100644 --- a/src/vector.c +++ b/src/vector.c @@ -34,18 +34,10 @@ #define STATE_DIMS(x) (ARR_DIMS(x)[0] - 1) #define CreateStateDatums(dim) palloc(sizeof(Datum) * (dim + 1)) -/* target_clones requires glibc */ -#if defined(__gnu_linux__) && defined(__has_attribute) -/* Use separate line for portability */ -#if __has_attribute(target_clones) -#define HAVE_TARGET_CLONES -#endif -#endif - -#if defined(__x86_64__) && defined(HAVE_TARGET_CLONES) && !defined(__FMA__) -#define VECTOR_DISPATCH __attribute__((target_clones("default", "fma"))) +#if defined(USE_TARGET_CLONES) && !defined(__FMA__) +#define VECTOR_TARGET_CLONES __attribute__((target_clones("default", "fma"))) #else -#define VECTOR_DISPATCH +#define VECTOR_TARGET_CLONES #endif PG_MODULE_MAGIC; @@ -573,7 +565,7 @@ halfvec_to_vector(PG_FUNCTION_ARGS) PG_RETURN_POINTER(result); } -VECTOR_DISPATCH static float +VECTOR_TARGET_CLONES static float VectorL2SquaredDistance(int dim, float *ax, float *bx) { float distance = 0.0; @@ -620,7 +612,7 @@ vector_l2_squared_distance(PG_FUNCTION_ARGS) PG_RETURN_FLOAT8((double) VectorL2SquaredDistance(a->dim, a->x, b->x)); } -VECTOR_DISPATCH static float +VECTOR_TARGET_CLONES static float VectorInnerProduct(int dim, float *ax, float *bx) { float distance = 0.0; @@ -662,7 +654,7 @@ vector_negative_inner_product(PG_FUNCTION_ARGS) PG_RETURN_FLOAT8((double) -VectorInnerProduct(a->dim, a->x, b->x)); } -VECTOR_DISPATCH static double +VECTOR_TARGET_CLONES static double VectorCosineSimilarity(int dim, float *ax, float *bx) { float similarity = 0.0;