Benchmarks: https://pastebin.com/tZ7dr67W. Works well especially on smaller ranges. After a week on spending optimizing NEON SIMD where I almost managed to make hash tables work with NEON SIMD without performance hits (still 1 cycle to optimize and I gave up a little), I found an interesting optimization for aarch64 to use cls instruction (count leading sign bits). The loop has a property that ctrl_ group is not matched against count when the first slot is empty or deleted. ``` void skip_empty_or_deleted() { while (IsEmptyOrDeleted(*ctrl_)) { uint32_t shift = Group{ctrl_}.CountLeadingEmptyOrDeleted(); ctrl_ += shift; slot_ += shift; } ... } ``` However, `kEmpty` and `kDeleted` have format of `1xxxxxx0` and `~ctrl & (ctrl >> 7)` always sets the lowest bit to 1. In naive implementation, it does +1 to start counting zero bits, however, in aarch64 we may start counting one bits immediately. This saves 1 cycle and 5% of iteration performance. Then it becomes hard to find a supported and sustainable C++ version of it. `__clsll` is not supported by GCC and was supported only since clang 8, `__builtin_clrsb` is not producing optimal codegen for clang. `__rbit` is not supported by GCC and there is no intrinsic to do that, however, in clang we have `__builtin_bitreverse{32,64}`. For now I decided to enable this only for clang, only if they have appropriate builtins. PiperOrigin-RevId: 451168570 Change-Id: I7e9256a60aecdc88ced4e6eb15ebc257281b6664
| Name |
Last commit
|
Last Update |
|---|---|---|
| .. | ||
| btree.h | Loading commit data... | |
| btree_container.h | Loading commit data... | |
| common.h | Loading commit data... | |
| compressed_tuple.h | Loading commit data... | |
| compressed_tuple_test.cc | Loading commit data... | |
| container_memory.h | Loading commit data... | |
| container_memory_test.cc | Loading commit data... | |
| counting_allocator.h | Loading commit data... | |
| hash_function_defaults.h | Loading commit data... | |
| hash_function_defaults_test.cc | Loading commit data... | |
| hash_generator_testing.cc | Loading commit data... | |
| hash_generator_testing.h | Loading commit data... | |
| hash_policy_testing.h | Loading commit data... | |
| hash_policy_testing_test.cc | Loading commit data... | |
| hash_policy_traits.h | Loading commit data... | |
| hash_policy_traits_test.cc | Loading commit data... | |
| hashtable_debug.h | Loading commit data... | |
| hashtable_debug_hooks.h | Loading commit data... | |
| hashtablez_sampler.cc | Loading commit data... | |
| hashtablez_sampler.h | Loading commit data... | |
| hashtablez_sampler_force_weak_definition.cc | Loading commit data... | |
| hashtablez_sampler_test.cc | Loading commit data... | |
| inlined_vector.h | Loading commit data... | |
| layout.h | Loading commit data... | |
| layout_benchmark.cc | Loading commit data... | |
| layout_test.cc | Loading commit data... | |
| node_slot_policy.h | Loading commit data... | |
| node_slot_policy_test.cc | Loading commit data... | |
| raw_hash_map.h | Loading commit data... | |
| raw_hash_set.cc | Loading commit data... | |
| raw_hash_set.h | Loading commit data... | |
| raw_hash_set_allocator_test.cc | Loading commit data... | |
| raw_hash_set_benchmark.cc | Loading commit data... | |
| raw_hash_set_probe_benchmark.cc | Loading commit data... | |
| raw_hash_set_test.cc | Loading commit data... | |
| test_instance_tracker.cc | Loading commit data... | |
| test_instance_tracker.h | Loading commit data... | |
| test_instance_tracker_test.cc | Loading commit data... | |
| tracked.h | Loading commit data... | |
| unordered_map_constructor_test.h | Loading commit data... | |
| unordered_map_lookup_test.h | Loading commit data... | |
| unordered_map_members_test.h | Loading commit data... | |
| unordered_map_modifiers_test.h | Loading commit data... | |
| unordered_map_test.cc | Loading commit data... | |
| unordered_set_constructor_test.h | Loading commit data... | |
| unordered_set_lookup_test.h | Loading commit data... | |
| unordered_set_members_test.h | Loading commit data... | |
| unordered_set_modifiers_test.h | Loading commit data... | |
| unordered_set_test.cc | Loading commit data... |