From bb84792cff4ca84a3796df6a12671a011b819073 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Mon, 1 Jul 2024 13:07:34 -0700 Subject: [PATCH] Use avx512f across entire checkRangeRead call tree Keeping the avx fallback --- ConflictSet.cpp | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 1c964f2..c179d67 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -1907,9 +1907,9 @@ bool scan16(const InternalVersionT *vs, const uint8_t *is, int begin, int end, // // always_inline So that we can optimize when begin or end is a constant. template -inline __attribute((always_inline)) bool scan16(const InternalVersionT *vs, - int begin, int end, - InternalVersionT readVersion) { +inline __attribute__((always_inline)) bool +scan16(const InternalVersionT *vs, int begin, int end, + InternalVersionT readVersion) { assert(0 <= begin && begin < 16); assert(0 <= end && end <= 16); assert(begin <= end); @@ -2512,6 +2512,33 @@ bool checkRangeReadImpl(Node *n, std::span begin, return checkRangeLeftSide.ok & checkRangeRightSide.ok; } +#ifdef __x86_64__ +// Explicitly instantiate with target avx512f attribute so the compiler can +// inline compare16_32bit_avx512, and generally use avx512f within more +// functions +template __attribute__((target("avx512f"))) bool +scan16(const InternalVersionT *vs, const uint8_t *is, int begin, int end, + InternalVersionT readVersion); +template __attribute__((always_inline, target("avx512f"))) bool +scan16(const InternalVersionT *vs, int begin, int end, + InternalVersionT readVersion); +template __attribute__((target("avx512f"))) bool +checkMaxBetweenExclusive(Node *n, int begin, int end, + InternalVersionT readVersion); +template __attribute__((target("avx512f"))) bool +checkRangeStartsWith(Node *n, std::span key, int begin, + int end, InternalVersionT readVersion, + ConflictSet::Impl *impl); +template __attribute__((target("avx512f"))) bool +CheckRangeLeftSide::step(); +template __attribute__((target("avx512f"))) bool +CheckRangeRightSide::step(); +template __attribute__((target("avx512f"))) bool +checkRangeReadImpl(Node *n, std::span begin, + std::span end, + InternalVersionT readVersion, ConflictSet::Impl *impl); +#endif + #if defined(__SANITIZE_THREAD__) || !defined(__x86_64__) bool checkRangeRead(Node *n, std::span begin, std::span end, InternalVersionT readVersion,