Commit b8ebbc2e by Abseil Team Committed by Copybara-Service

Adding sw prefetchers to absl::hash.

PiperOrigin-RevId: 547850162
Change-Id: I43208c7fa1eaa2a7acfad5891b80c150ee58c65f
parent 1adf896e
...@@ -183,6 +183,7 @@ cc_library( ...@@ -183,6 +183,7 @@ cc_library(
deps = [ deps = [
"//absl/base:config", "//absl/base:config",
"//absl/base:endian", "//absl/base:endian",
"//absl/base:prefetch",
"//absl/numeric:int128", "//absl/numeric:int128",
], ],
) )
......
...@@ -165,6 +165,7 @@ absl_cc_library( ...@@ -165,6 +165,7 @@ absl_cc_library(
absl::config absl::config
absl::endian absl::endian
absl::int128 absl::int128
absl::prefetch
) )
absl_cc_test( absl_cc_test(
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "absl/hash/internal/low_level_hash.h" #include "absl/hash/internal/low_level_hash.h"
#include "absl/base/internal/unaligned_access.h" #include "absl/base/internal/unaligned_access.h"
#include "absl/base/prefetch.h"
#include "absl/numeric/int128.h" #include "absl/numeric/int128.h"
namespace absl { namespace absl {
...@@ -29,6 +30,8 @@ static uint64_t Mix(uint64_t v0, uint64_t v1) { ...@@ -29,6 +30,8 @@ static uint64_t Mix(uint64_t v0, uint64_t v1) {
uint64_t LowLevelHash(const void* data, size_t len, uint64_t seed, uint64_t LowLevelHash(const void* data, size_t len, uint64_t seed,
const uint64_t salt[5]) { const uint64_t salt[5]) {
// Prefetch the cacheline that data resides in.
PrefetchToLocalCache(data);
const uint8_t* ptr = static_cast<const uint8_t*>(data); const uint8_t* ptr = static_cast<const uint8_t*>(data);
uint64_t starting_length = static_cast<uint64_t>(len); uint64_t starting_length = static_cast<uint64_t>(len);
uint64_t current_state = seed ^ salt[0]; uint64_t current_state = seed ^ salt[0];
...@@ -40,6 +43,9 @@ uint64_t LowLevelHash(const void* data, size_t len, uint64_t seed, ...@@ -40,6 +43,9 @@ uint64_t LowLevelHash(const void* data, size_t len, uint64_t seed,
uint64_t duplicated_state = current_state; uint64_t duplicated_state = current_state;
do { do {
// Always prefetch the next cacheline.
PrefetchToLocalCache(ptr + ABSL_CACHELINE_SIZE);
uint64_t a = absl::base_internal::UnalignedLoad64(ptr); uint64_t a = absl::base_internal::UnalignedLoad64(ptr);
uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8); uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8);
uint64_t c = absl::base_internal::UnalignedLoad64(ptr + 16); uint64_t c = absl::base_internal::UnalignedLoad64(ptr + 16);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment