util/hash_table: added hash functions for integer types
authorAnthony Pesch <inolen@gmail.com>
Sat, 18 Jan 2020 06:38:31 +0000 (01:38 -0500)
committerMarge Bot <eric+marge@anholt.net>
Thu, 23 Jan 2020 17:06:57 +0000 (17:06 +0000)
A few hash_table users roll their own integer hash functions which
call _mesa_hash_data to perform the hashing which ultimately calls
into XXH32 with a dynamic key length. When using small keys with a
constant size the hash rate can be greatly improved by inlining
XXH32 and providing it a constant key length, see:
https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html

Additionally, this patch removes calls to _mesa_key_hash_string and
makes them instead call _mesa_has_string directly, matching the new
integer hash functions.

Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3475>

20 files changed:
src/compiler/glsl/gl_nir_lower_samplers_as_deref.c
src/compiler/glsl/glcpp/glcpp-parse.y
src/compiler/glsl/link_interface_blocks.cpp
src/compiler/glsl/link_uniform_blocks.cpp
src/compiler/glsl/link_varyings.cpp
src/compiler/glsl/lower_int64.cpp
src/compiler/glsl/lower_named_interface_blocks.cpp
src/compiler/glsl/lower_output_reads.cpp
src/compiler/glsl/string_to_uint_map.h
src/compiler/glsl/tests/varyings_test.cpp
src/compiler/glsl_types.cpp
src/compiler/nir/nir_print.c
src/intel/perf/gen_perf.c
src/mesa/program/symbol_table.c
src/util/hash_table.c
src/util/hash_table.h
src/util/tests/hash_table/destroy_callback.c
src/util/tests/hash_table/insert_and_lookup.c
src/util/tests/hash_table/remove_key.c
src/util/tests/hash_table/replacement.c

index d949e3d78f56d6854bed8c57e6459c3107727a35..dde858f9cfc15c86e4cede3087ca21d09c6c577d 100644 (file)
@@ -168,7 +168,7 @@ lower_deref(nir_builder *b, struct lower_samplers_as_deref_state *state,
       return deref;
    }
 
-   uint32_t hash = _mesa_key_hash_string(name);
+   uint32_t hash = _mesa_hash_string(name);
    struct hash_entry *h =
       _mesa_hash_table_search_pre_hashed(state->remap_table, hash, name);
 
@@ -325,7 +325,7 @@ gl_nir_lower_samplers_as_deref(nir_shader *shader,
 
    state.shader = shader;
    state.shader_program = shader_program;
-   state.remap_table = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+   state.remap_table = _mesa_hash_table_create(NULL, _mesa_hash_string,
                                                _mesa_key_string_equal);
 
    nir_foreach_function(function, shader) {
index 514dbe7a4c43acb4a2d032c03a63a005b52cf847..1e57cccc4d1218fa0ab99e0db67a1c20ca241fb0 100644 (file)
@@ -1469,7 +1469,7 @@ glcpp_parser_create(struct gl_context *gl_ctx,
    parser = ralloc (NULL, glcpp_parser_t);
 
    glcpp_lex_init_extra (parser, &parser->scanner);
-   parser->defines = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+   parser->defines = _mesa_hash_table_create(NULL, _mesa_hash_string,
                                              _mesa_key_string_equal);
    parser->linalloc = linear_alloc_parent(parser, 0);
    parser->active = NULL;
index deb544e3ce6d0156023aa2e7b0f7fe9b6ebb6529..4471b41cf0e9a0fbc36d33a07e4db474456983a2 100644 (file)
@@ -220,7 +220,7 @@ class interface_block_definitions
 public:
    interface_block_definitions()
       : mem_ctx(ralloc_context(NULL)),
-        ht(_mesa_hash_table_create(NULL, _mesa_key_hash_string,
+        ht(_mesa_hash_table_create(NULL, _mesa_hash_string,
                                    _mesa_key_string_equal))
    {
    }
index 4670a24598a5ebadf87aab54e5384c1e692ca6c7..1603cbd59afec5b516a05c2bd841a2a758e5f8f0 100644 (file)
@@ -409,7 +409,7 @@ link_uniform_blocks(void *mem_ctx,
     * the hash is organized by block-name.
     */
    struct hash_table *block_hash =
-      _mesa_hash_table_create(mem_ctx, _mesa_key_hash_string,
+      _mesa_hash_table_create(mem_ctx, _mesa_hash_string,
                               _mesa_key_string_equal);
 
    if (block_hash == NULL) {
index c7774a2531bcef8e90db407a037ff6122dfe7131..0868d1504db92f7cac523f532898cc7221fdafbb 100644 (file)
@@ -2583,13 +2583,13 @@ assign_varying_locations(struct gl_context *ctx,
                            consumer ? consumer->Stage : MESA_SHADER_NONE);
    void *hash_table_ctx = ralloc_context(NULL);
    hash_table *tfeedback_candidates =
-         _mesa_hash_table_create(hash_table_ctx, _mesa_key_hash_string,
+         _mesa_hash_table_create(hash_table_ctx, _mesa_hash_string,
                                  _mesa_key_string_equal);
    hash_table *consumer_inputs =
-         _mesa_hash_table_create(hash_table_ctx, _mesa_key_hash_string,
+         _mesa_hash_table_create(hash_table_ctx, _mesa_hash_string,
                                  _mesa_key_string_equal);
    hash_table *consumer_interface_inputs =
-         _mesa_hash_table_create(hash_table_ctx, _mesa_key_hash_string,
+         _mesa_hash_table_create(hash_table_ctx, _mesa_hash_string,
                                  _mesa_key_string_equal);
    ir_variable *consumer_inputs_with_locations[VARYING_SLOT_TESS_MAX] = {
       NULL,
index 2d4fdbb1a55feee62aeae7e5f966e1c715282882..43774d6ab334d9ba8d8f0546ea3852402c5402fd 100644 (file)
@@ -73,7 +73,7 @@ public:
         function_list(), added_functions(&function_list, mem_ctx)
    {
       functions = _mesa_hash_table_create(mem_ctx,
-                                          _mesa_key_hash_string,
+                                          _mesa_hash_string,
                                           _mesa_key_string_equal);
 
       foreach_in_list(ir_instruction, node, instructions) {
index 498954a33e5a3d052b29ffed5f66b0f61b2f7a09..01c50932a9a4c17a1e209a77f7a5ab0faa5eb8f2 100644 (file)
@@ -125,7 +125,7 @@ public:
 void
 flatten_named_interface_blocks_declarations::run(exec_list *instructions)
 {
-   interface_namespace = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+   interface_namespace = _mesa_hash_table_create(NULL, _mesa_hash_string,
                                                  _mesa_key_string_equal);
 
    /* First pass: adjust instance block variables with an instance name
index 4f90c7385add4de1af861f185f3c64d8e01776d7..7a182130b2e2770a20eb996e85fabf017c7a5c63 100644 (file)
@@ -72,7 +72,7 @@ static unsigned
 hash_table_var_hash(const void *key)
 {
    const ir_variable * var = static_cast<const ir_variable *>(key);
-   return _mesa_key_hash_string(var->name);
+   return _mesa_hash_string(var->name);
 }
 
 output_read_remover::output_read_remover(unsigned stage)
index e0533ec6ea5bd6fb74984f4f3cc2356157c3e34e..6f9251f90c36216008b5da30d41721ada6d82164 100644 (file)
@@ -61,7 +61,7 @@ struct string_to_uint_map {
 public:
    string_to_uint_map()
    {
-      this->ht = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+      this->ht = _mesa_hash_table_create(NULL, _mesa_hash_string,
                                          _mesa_key_string_equal);
    }
 
index 7495773485894d5e093aa37887e6371d921bd22f..4ad73be381eb98b9ba1daa7614dc20c232cdac25 100644 (file)
@@ -80,11 +80,11 @@ link_varyings::SetUp()
    this->ir.make_empty();
 
    this->consumer_inputs =
-         _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+         _mesa_hash_table_create(NULL, _mesa_hash_string,
                                  _mesa_key_string_equal);
 
    this->consumer_interface_inputs =
-         _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+         _mesa_hash_table_create(NULL, _mesa_hash_string,
                                  _mesa_key_string_equal);
 
    /* Needs to happen after glsl type initialization */
index b357ed0823baf562dadd43134794ca629df3f470..79e2f684fcfd2f5fe6bddc520156f8d6518d6535 100644 (file)
@@ -642,7 +642,7 @@ glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns,
 
       if (explicit_matrix_types == NULL) {
          explicit_matrix_types =
-            _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+            _mesa_hash_table_create(NULL, _mesa_hash_string,
                                     _mesa_key_string_equal);
       }
 
@@ -1007,7 +1007,7 @@ glsl_type::get_array_instance(const glsl_type *base,
    assert(glsl_type_users > 0);
 
    if (array_types == NULL) {
-      array_types = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+      array_types = _mesa_hash_table_create(NULL, _mesa_hash_string,
                                             _mesa_key_string_equal);
    }
 
index 9a03f6eee707f4654e5a3ef9aa69b2440bf7ac0d..eaf902b4cd46078c4e5a58017bf0c3f70a5a18a6 100644 (file)
@@ -1486,7 +1486,7 @@ init_print_state(print_state *state, nir_shader *shader, FILE *fp)
    state->fp = fp;
    state->shader = shader;
    state->ht = _mesa_pointer_hash_table_create(NULL);
-   state->syms = _mesa_set_create(NULL, _mesa_key_hash_string,
+   state->syms = _mesa_set_create(NULL, _mesa_hash_string,
                                   _mesa_key_string_equal);
    state->index = 0;
 }
index 38dc0166106327ca8effe057d03526ae1cd6d08a..ceb10f5af120a75384c27bfaec73c7920bc8bf0c 100644 (file)
@@ -967,7 +967,7 @@ load_oa_metrics(struct gen_perf_config *perf, int fd,
       return false;
 
    perf->oa_metrics_table =
-      _mesa_hash_table_create(perf, _mesa_key_hash_string,
+      _mesa_hash_table_create(perf, _mesa_hash_string,
                               _mesa_key_string_equal);
 
    /* Index all the metric sets mesa knows about before looking to see what
index 0dcb1f292c91c546bac9817345ab41db77571a6a..ae7a1175e4048744146a8aad63d61010022e6f6c 100644 (file)
@@ -292,7 +292,7 @@ _mesa_symbol_table_ctor(void)
     struct _mesa_symbol_table *table = calloc(1, sizeof(*table));
 
     if (table != NULL) {
-       table->ht = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+       table->ht = _mesa_hash_table_create(NULL, _mesa_hash_string,
                                            _mesa_key_string_equal);
 
        _mesa_symbol_table_push_scope(table);
index 48d59e48431561db671d3cfdc3582eb7efc1f4a5..6bac4a4f68e8832bb9979fba33e5c25cfd5e6f55 100644 (file)
@@ -555,6 +555,24 @@ _mesa_hash_data(const void *data, size_t size)
    return XXH32(data, size, 0);
 }
 
+uint32_t
+_mesa_hash_int(const void *key)
+{
+   return XXH32(key, sizeof(int), 0);
+}
+
+uint32_t
+_mesa_hash_uint(const void *key)
+{
+   return XXH32(key, sizeof(unsigned), 0);
+}
+
+uint32_t
+_mesa_hash_u32(const void *key)
+{
+   return XXH32(key, 4, 0);
+}
+
 /** FNV-1a string hash implementation */
 uint32_t
 _mesa_hash_string(const void *_key)
@@ -570,6 +588,32 @@ _mesa_hash_string(const void *_key)
    return hash;
 }
 
+uint32_t
+_mesa_hash_pointer(const void *pointer)
+{
+   uintptr_t num = (uintptr_t) pointer;
+   return (uint32_t) ((num >> 2) ^ (num >> 6) ^ (num >> 10) ^ (num >> 14));
+}
+
+bool
+_mesa_key_int_equal(const void *a, const void *b)
+{
+   return *((const int *)a) == *((const int *)b);
+}
+
+bool
+_mesa_key_uint_equal(const void *a, const void *b)
+{
+
+   return *((const unsigned *)a) == *((const unsigned *)b);
+}
+
+bool
+_mesa_key_u32_equal(const void *a, const void *b)
+{
+   return *((const uint32_t *)a) == *((const uint32_t *)b);
+}
+
 /**
  * String compare function for use as the comparison callback in
  * _mesa_hash_table_create().
index e2cd889f6da59f86a042b07d247951dd72711f63..b1eb9d4e217d743d850e0eb3c6fb5f2f0f23f426 100644 (file)
@@ -109,21 +109,19 @@ _mesa_hash_table_random_entry(struct hash_table *ht,
                               bool (*predicate)(struct hash_entry *entry));
 
 uint32_t _mesa_hash_data(const void *data, size_t size);
+
+uint32_t _mesa_hash_int(const void *key);
+uint32_t _mesa_hash_uint(const void *key);
+uint32_t _mesa_hash_u32(const void *key);
 uint32_t _mesa_hash_string(const void *key);
+uint32_t _mesa_hash_pointer(const void *pointer);
+
+bool _mesa_key_int_equal(const void *a, const void *b);
+bool _mesa_key_uint_equal(const void *a, const void *b);
+bool _mesa_key_u32_equal(const void *a, const void *b);
 bool _mesa_key_string_equal(const void *a, const void *b);
 bool _mesa_key_pointer_equal(const void *a, const void *b);
 
-static inline uint32_t _mesa_key_hash_string(const void *key)
-{
-   return _mesa_hash_string((const char *)key);
-}
-
-static inline uint32_t _mesa_hash_pointer(const void *pointer)
-{
-   uintptr_t num = (uintptr_t) pointer;
-   return (uint32_t) ((num >> 2) ^ (num >> 6) ^ (num >> 10) ^ (num >> 14));
-}
-
 struct hash_table *
 _mesa_pointer_hash_table_create(void *mem_ctx);
 
index 3a050ff2ae297e1ca7be49763feb506193589bb1..e6c7ac5c16f5748305d177cffd97675c5b71b56f 100644 (file)
@@ -56,7 +56,7 @@ main(int argc, char **argv)
    (void) argc;
    (void) argv;
 
-   ht = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+   ht = _mesa_hash_table_create(NULL, _mesa_hash_string,
                                 _mesa_key_string_equal);
 
    _mesa_hash_table_insert(ht, str1, NULL);
index 1fd7353689fcb6f64e38a82ce4a22fad3024be14..f12446490537d1f919fc08170a85f74a3fc5d696 100644 (file)
@@ -43,7 +43,7 @@ main(int argc, char **argv)
    (void) argc;
    (void) argv;
 
-   ht = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+   ht = _mesa_hash_table_create(NULL, _mesa_hash_string,
                                 _mesa_key_string_equal);
 
    _mesa_hash_table_insert(ht, str1, NULL);
index 6df6d7d036667fdc7d1ce7f60847257d047aa1aa..1abc68dfc907b44d2d0eb8e167eae84e45e6aa38 100644 (file)
@@ -40,7 +40,7 @@ main(int argc, char **argv)
    (void) argc;
    (void) argv;
 
-   ht = _mesa_hash_table_create(NULL, _mesa_key_hash_string, _mesa_key_string_equal);
+   ht = _mesa_hash_table_create(NULL, _mesa_hash_string, _mesa_key_string_equal);
 
    _mesa_hash_table_insert(ht, str1, NULL);
    _mesa_hash_table_insert(ht, str2, NULL);
index e74e63453c4f76795aa7dbf6ac679b9278711dba..a3759a3c93c27e04e4469205aae2f405cd2a07ac 100644 (file)
@@ -45,7 +45,7 @@ main(int argc, char **argv)
 
    assert(str1 != str2);
 
-   ht = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
+   ht = _mesa_hash_table_create(NULL, _mesa_hash_string,
                                 _mesa_key_string_equal);
 
    _mesa_hash_table_insert(ht, str1, str1);