<p dir="ltr">FYI, we use ralloc for a lot more than just the glsl compiler so the first few changes make me a bit nervous.  There was someone working on making our driver more I undefined-memory-friendly but I don't know what happened to those patches.</p>
<div class="gmail_extra"><br><div class="gmail_quote">On Oct 8, 2016 3:58 AM, "Marek Olšák" <<a href="mailto:maraeo@gmail.com">maraeo@gmail.com</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
This patch series reduces the number of malloc calls in the GLSL<br>
compiler by 63%. That leads to better compile times and less heap<br>
thrashing.<br>
<br>
It's done by switching memory allocations in the GLSL compiler to my<br>
new linear allocator that allocates out of a fixed-sized buffer with<br>
a monotonically increasing offset. If more buffers are needed, it<br>
chains them.<br>
<br>
The new allocator is used in all places where short-lived allocations<br>
are used with a high number of malloc calls. The series also contains<br>
other improvements not related to the new allocator that also improve<br>
compile times. The results are below.<br>
<br>
I tested my shader-db with shaders only being compiled to TGSI.<br>
(noop gallium driver)<br>
<br>
<br>
master + libc's malloc:<br>
<br>
 real   0m54.182s<br>
 user   3m33.640s<br>
 sys    0m0.620s<br>
 maxmem 275 MB<br>
<br>
<br>
master + jemalloc preloaded:<br>
<br>
 real   0m45.044s<br>
 user   2m56.356s<br>
 sys    0m1.652s<br>
 maxmem 284 MB<br>
<br>
<br>
the series + libc's malloc:<br>
<br>
 real   0m46.221s<br>
 user   3m2.080s<br>
 sys    0m0.544s<br>
 maxmem 270 MB<br>
<br>
<br>
the series + jemalloc preloaded:<br>
<br>
 real   0m40.729s<br>
 user   2m39.564s<br>
 sys    0m1.232s<br>
 maxmem 284 MB<br>
<br>
<br>
The series without jemalloc almost caught up with jemalloc + master.<br>
However, jemalloc also benefits.<br>
<br>
Current Mesa needs 54.182s and it drops to 40.729s with my series and<br>
jemalloc. The total change in compile time is -25% if we incorporate<br>
both. Without jemalloc, the difference is only -14.7%.<br>
<br>
With radeonsi, the improvement is approx. slightly more than 1/2 of that<br>
(if you add the LLVM time). However, radeonsi also has asynchronous<br>
shader compilation hiding LLVM overhead in some cases, so it depends.<br>
<br>
Drivers with faster compiler backends will benefit more than radeonsi,<br>
but will probably not reach -25% or -14.7% (except softpipe, which uses<br>
TGSI as-is).<br>
<br>
The memory usage looks reasonable in all tested cases.<br>
<br>
Note: One of the first patches moves memset from ralloc to rzalloc.<br>
I tested and fixed the GLSL source -> TGSI path, but other codepaths<br>
may break, and you need to use valgrind to find all uninitialized<br>
variables that relied on ralloc doing memset (if there are any).<br>
<br>
You can also find it here:<br>
<a href="https://cgit.freedesktop.org/~mareko/mesa/log/?h=glsl-alloc-rework" rel="noreferrer" target="_blank">https://cgit.freedesktop.org/~<wbr>mareko/mesa/log/?h=glsl-alloc-<wbr>rework</a><br>
<br>
Please review.<br>
<br>
 src/compiler/glsl/ast.h                             |   4 +-<br>
 src/compiler/glsl/ast_to_hir.<wbr>cpp                    |   4 +-<br>
 src/compiler/glsl/ast_type.cpp                      |  13 ++-<br>
 src/compiler/glsl/glcpp/glcpp-<wbr>lex.l                 |   2 +-<br>
 src/compiler/glsl/glcpp/glcpp-<wbr>parse.y               | 203 +++++++++++++++++-------------<wbr>--------<br>
 src/compiler/glsl/glcpp/glcpp.<wbr>h                     |   1 +<br>
 src/compiler/glsl/glsl_lexer.<wbr>ll                     |  16 +--<br>
 src/compiler/glsl/glsl_parser.<wbr>yy                    | 202 +++++++++++++++++++-----------<wbr>--------<br>
 src/compiler/glsl/glsl_parser_<wbr>extras.cpp            |   6 +-<br>
 src/compiler/glsl/glsl_parser_<wbr>extras.h              |   4 +-<br>
 src/compiler/glsl/glsl_symbol_<wbr>table.cpp             |  19 ++--<br>
 src/compiler/glsl/glsl_symbol_<wbr>table.h               |   1 +<br>
 src/compiler/glsl/ir.cpp                            |   4 +<br>
 src/compiler/glsl/ir.h                              |  13 ++-<br>
 src/compiler/glsl/link_<wbr>uniform_blocks.cpp           |   2 +-<br>
 src/compiler/glsl/list.h                            |   2 +-<br>
 src/compiler/glsl/lower_<wbr>packed_varyings.cpp         |   8 +-<br>
 src/compiler/glsl/opt_<wbr>constant_propagation.cpp      |  14 ++-<br>
 src/compiler/glsl/opt_copy_<wbr>propagation.cpp          |   7 +-<br>
 src/compiler/glsl/opt_copy_<wbr>propagation_elements.cpp |  19 ++--<br>
 src/compiler/glsl/opt_dead_<wbr>code_local.cpp           |  12 ++-<br>
 src/compiler/glsl_types.cpp                         |  38 +------<br>
 src/compiler/glsl_types.h                           |   6 +-<br>
 src/compiler/nir/nir.c                              |   8 +-<br>
 src/compiler/spirv/vtn_<wbr>variables.c                  |   3 +-<br>
 src/gallium/drivers/freedreno/<wbr>ir3/ir3.c             |   2 +-<br>
 src/gallium/drivers/vc4/vc4_<wbr>cl.c                    |   2 +-<br>
 src/gallium/drivers/vc4/vc4_<wbr>program.c               |   2 +-<br>
 src/gallium/drivers/vc4/vc4_<wbr>simulator.c             |   5 +-<br>
 src/mesa/drivers/dri/i965/brw_<wbr>state_batch.c         |   5 +-<br>
 src/util/ralloc.c                                   | 392 ++++++++++++++++++++++++++++++<wbr>++++++++++++++++++++++++++++++<wbr>++++++++++---<br>
 src/util/ralloc.h                                   |  93 ++++++++++++++++--<br>
 32 files changed, 782 insertions(+), 330 deletions(-)<br>
<br>
Marek<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</blockquote></div><br></div>