From 1120316af333a007207c4ca7ed9b1f97d159b83f Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 2 Oct 2020 14:35:08 -0400 Subject: [PATCH] issue #68 - added support for prefetch in MSVC --- parallel_hashmap/phmap.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/parallel_hashmap/phmap.h b/parallel_hashmap/phmap.h index 460392a..2b093c3 100644 --- a/parallel_hashmap/phmap.h +++ b/parallel_hashmap/phmap.h @@ -1600,7 +1600,11 @@ public: // specific benchmarks indicating its importance. void prefetch_hash(size_t hash) const { (void)hash; -#if defined(__GNUC__) +#if defined(_MSC_VER) + auto seq = probe(hash); + _mm_prefetch((const char *)(ctrl_ + seq.offset()), _MM_HINT_NTA); + _mm_prefetch((const char *)(slots_ + seq.offset()), _MM_HINT_NTA); +#elif defined(__GNUC__) auto seq = probe(hash); __builtin_prefetch(static_cast(ctrl_ + seq.offset())); __builtin_prefetch(static_cast(slots_ + seq.offset())); @@ -3070,13 +3074,11 @@ public: template void prefetch(const key_arg& key) const { (void)key; -#if 0 && defined(__GNUC__) size_t hashval = HashElement{hash_ref()}(key); const Inner& inner = sets_[subidx(hashval)]; const auto& set = inner.set_; - typename Lockable::UniqueLock m(inner); + typename Lockable::SharedLock m(const_cast(inner)); set.prefetch_hash(hashval); -#endif // __GNUC__ } // The API of find() has two extensions.