[Mesa-dev] [PATCH 00/15] GLSL memory allocation rework for faster compilation

Marek Olšák maraeo at gmail.com
Sat Oct 8 10:58:24 UTC 2016


Hi,

This patch series reduces the number of malloc calls in the GLSL
compiler by 63%. That leads to better compile times and less heap
thrashing.

It's done by switching memory allocations in the GLSL compiler to my
new linear allocator that allocates out of a fixed-sized buffer with
a monotonically increasing offset. If more buffers are needed, it
chains them.

The new allocator is used in all places where short-lived allocations
are used with a high number of malloc calls. The series also contains
other improvements not related to the new allocator that also improve
compile times. The results are below.

I tested my shader-db with shaders only being compiled to TGSI.
(noop gallium driver)


master + libc's malloc:

 real	0m54.182s
 user	3m33.640s
 sys	0m0.620s
 maxmem 275 MB


master + jemalloc preloaded:

 real	0m45.044s
 user	2m56.356s
 sys	0m1.652s
 maxmem 284 MB


the series + libc's malloc:

 real	0m46.221s
 user	3m2.080s
 sys	0m0.544s
 maxmem 270 MB


the series + jemalloc preloaded:

 real	0m40.729s
 user	2m39.564s
 sys	0m1.232s
 maxmem 284 MB


The series without jemalloc almost caught up with jemalloc + master.
However, jemalloc also benefits.

Current Mesa needs 54.182s and it drops to 40.729s with my series and
jemalloc. The total change in compile time is -25% if we incorporate
both. Without jemalloc, the difference is only -14.7%.

With radeonsi, the improvement is approx. slightly more than 1/2 of that
(if you add the LLVM time). However, radeonsi also has asynchronous
shader compilation hiding LLVM overhead in some cases, so it depends.

Drivers with faster compiler backends will benefit more than radeonsi,
but will probably not reach -25% or -14.7% (except softpipe, which uses
TGSI as-is).

The memory usage looks reasonable in all tested cases.

Note: One of the first patches moves memset from ralloc to rzalloc.
I tested and fixed the GLSL source -> TGSI path, but other codepaths
may break, and you need to use valgrind to find all uninitialized
variables that relied on ralloc doing memset (if there are any).

You can also find it here:
https://cgit.freedesktop.org/~mareko/mesa/log/?h=glsl-alloc-rework

Please review.

 src/compiler/glsl/ast.h                             |   4 +-
 src/compiler/glsl/ast_to_hir.cpp                    |   4 +-
 src/compiler/glsl/ast_type.cpp                      |  13 ++-
 src/compiler/glsl/glcpp/glcpp-lex.l                 |   2 +-
 src/compiler/glsl/glcpp/glcpp-parse.y               | 203 +++++++++++++++++---------------------
 src/compiler/glsl/glcpp/glcpp.h                     |   1 +
 src/compiler/glsl/glsl_lexer.ll                     |  16 +--
 src/compiler/glsl/glsl_parser.yy                    | 202 +++++++++++++++++++-------------------
 src/compiler/glsl/glsl_parser_extras.cpp            |   6 +-
 src/compiler/glsl/glsl_parser_extras.h              |   4 +-
 src/compiler/glsl/glsl_symbol_table.cpp             |  19 ++--
 src/compiler/glsl/glsl_symbol_table.h               |   1 +
 src/compiler/glsl/ir.cpp                            |   4 +
 src/compiler/glsl/ir.h                              |  13 ++-
 src/compiler/glsl/link_uniform_blocks.cpp           |   2 +-
 src/compiler/glsl/list.h                            |   2 +-
 src/compiler/glsl/lower_packed_varyings.cpp         |   8 +-
 src/compiler/glsl/opt_constant_propagation.cpp      |  14 ++-
 src/compiler/glsl/opt_copy_propagation.cpp          |   7 +-
 src/compiler/glsl/opt_copy_propagation_elements.cpp |  19 ++--
 src/compiler/glsl/opt_dead_code_local.cpp           |  12 ++-
 src/compiler/glsl_types.cpp                         |  38 +------
 src/compiler/glsl_types.h                           |   6 +-
 src/compiler/nir/nir.c                              |   8 +-
 src/compiler/spirv/vtn_variables.c                  |   3 +-
 src/gallium/drivers/freedreno/ir3/ir3.c             |   2 +-
 src/gallium/drivers/vc4/vc4_cl.c                    |   2 +-
 src/gallium/drivers/vc4/vc4_program.c               |   2 +-
 src/gallium/drivers/vc4/vc4_simulator.c             |   5 +-
 src/mesa/drivers/dri/i965/brw_state_batch.c         |   5 +-
 src/util/ralloc.c                                   | 392 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 src/util/ralloc.h                                   |  93 ++++++++++++++++--
 32 files changed, 782 insertions(+), 330 deletions(-)

Marek


More information about the mesa-dev mailing list