From fdcbcf701618612dd6509a84464e333744091ded Mon Sep 17 00:00:00 2001 From: Matthew Parkinson Date: Tue, 2 Jul 2019 14:06:24 +0100 Subject: [PATCH] Add prefetch to mpscq. --- src/ds/bits.h | 9 +++++++++ src/ds/mpscq.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/ds/bits.h b/src/ds/bits.h index f7c3d77..62e6288 100644 --- a/src/ds/bits.h +++ b/src/ds/bits.h @@ -136,6 +136,15 @@ namespace snmalloc #endif } + inline void prefetch(void* ptr) + { +#if defined(PLATFORM_IS_X86) + _mm_prefetch(reinterpret_cast(ptr), _MM_HINT_T0); +#else +# warning "Missing pause intrinsic" +#endif + } + inline uint64_t tick() { #if defined(PLATFORM_IS_X86) diff --git a/src/ds/mpscq.h b/src/ds/mpscq.h index 39ee2f9..06b7265 100644 --- a/src/ds/mpscq.h +++ b/src/ds/mpscq.h @@ -71,6 +71,7 @@ namespace snmalloc if (next != nullptr) { front = next; + bits::prefetch(&(next->next)); assert(front); std::atomic_thread_fence(std::memory_order_acquire); invariant();