[Mesa-dev] [PATCH 00/14] [RFC] Optimizations on copy propagation

Thomas Helland thomashelland90 at gmail.com
Sun Jan 1 18:37:44 UTC 2017


Hi all.

This is a series I've put together to lower the overhead of
the copy propagation pass in glsl. The series is not refined,
so please treat it as a proof of concept / RFC.

The first five patches might be merge-ready, but their benefit is
quite low compared to the actual major change here.

The series goes on to copy our existing hash table implementation,
and modify it in steps to allow insertion of multiple data entries
with the same key. I've kept the series in steps corresponding to
the way I worked when modifying it, as I found it nice for clarity.
There is some obvious cleanups and squashing that will need to happen
before this can be considered for merging.

The major change is the last patch. This uses the new hash table in
our copy propagation pass. This effectively makes the algorithm
O(2n) instead of O(n^2), which is a big win. I tested with the
shader mentioned in [1] but took the shaders and made a shader_test
that I used in conjunction with shader-db to do testing.
I cut down on the ridiculous amount of expression some, to make it
even compile in a reasonable time on my poor laptop.

So, on to the results. Compilation of the aforementioned shader
went from 98 to 75 seconds. Perf shows that previously we spent
19% of the time walking the acp-table with _mesa_hash_table_next_entry.
After this series, the hash table is practically gone from the profile.
This is a major win, and I'm guite happy with the results.
There is obviously a lot more work to be done though.

Please leave critical feedback and ideas. This was merely a test
from my part, but it seems there is some opportunities here.

https://bugs.freedesktop.org/show_bug.cgi?id=94477

Thomas Helland (14):
  glsl: Don't rehash the values when copying to new table
  glsl: Don't compute the hash when we already have it available
  nir: Remove unused include of nir_array
  nir: Move nir_array to util, and rename to dyn_array
  glsl: Use dyn_array instead of the exec_list
  util: Make a copy of the existing hash table implementation
  util: Add field for pointing to next data
  util: Implement the insertion functionality
  util: Implement deletion of entries
  util: Add a comment about ordering of entries with matching keys
  util: Implement returning the last added entry on search
  util: Rename functions and structs
  util: Use hashing functions from hash_table.h
  glsl: Restructure copy propagation to use the non replacing hash table

 src/compiler/Makefile.sources                      |   1 -
 src/compiler/glsl/opt_copy_propagation.cpp         | 112 +++--
 .../glsl/opt_copy_propagation_elements.cpp         |   6 +-
 src/compiler/nir/nir_lower_locals_to_regs.c        |   1 -
 src/compiler/spirv/vtn_cfg.c                       |   6 +-
 src/compiler/spirv/vtn_private.h                   |   4 +-
 src/util/Makefile.sources                          |   3 +
 src/{compiler/nir/nir_array.h => util/dyn_array.h} |  18 +-
 src/util/non_replacing_hash_table.c                | 513 +++++++++++++++++++++
 src/util/non_replacing_hash_table.h                | 135 ++++++
 10 files changed, 743 insertions(+), 56 deletions(-)
 rename src/{compiler/nir/nir_array.h => util/dyn_array.h} (86%)
 create mode 100644 src/util/non_replacing_hash_table.c
 create mode 100644 src/util/non_replacing_hash_table.h

-- 
2.11.0



More information about the mesa-dev mailing list