<div dir="ltr">The linear_alloc stuff that marek added to ralloc also does slab allocation and can be parented off a ralloc context.  Did you consider that?<br><div><br><div class="gmail_quote"><div dir="ltr">On Tue, Nov 20, 2018 at 6:40 PM Ian Romanick <<a href="mailto:idr@freedesktop.org">idr@freedesktop.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com" target="_blank">ian.d.romanick@intel.com</a>><br>
<br>
This pass allocates a large number of two different data structures.<br>
This data only lives during the pass.  Use the slab allocator to reduce<br>
the memory overhead (from 5 pointers + possible padding per allocation<br>
to nearly zero per allocation) and potentially improve performance.<br>
<br>
NOTE: I have not measured the performace delta across this patch<br>
individually.<br>
<br>
Changes in peak memory usage according to Valgrind massif:<br>
<br>
mean soft fp64 using uint64:   1,343,998,123 => 1,343,998,123<br>
gfxbench5 aztec ruins high 11:    62,415,414 =>    62,415,414<br>
deus ex mankind divided 148:      62,317,965 =>    62,317,965<br>
deus ex mankind divided 2890:     72,585,466 =>    72,603,614<br>
dirt showdown 676:                75,203,703 =>    72,450,311<br>
dolphin ubershaders 210:          83,185,248 =>    81,041,040<br>
<br>
Signed-off-by: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com" target="_blank">ian.d.romanick@intel.com</a>><br>
---<br>
 src/compiler/nir/nir_phi_builder.c | 16 ++++++++++++++--<br>
 1 file changed, 14 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/src/compiler/nir/nir_phi_builder.c b/src/compiler/nir/nir_phi_builder.c<br>
index 36ab9888f48..4d4d81fcd59 100644<br>
--- a/src/compiler/nir/nir_phi_builder.c<br>
+++ b/src/compiler/nir/nir_phi_builder.c<br>
@@ -23,6 +23,7 @@<br>
<br>
 #include "nir_phi_builder.h"<br>
 #include "nir/nir_vla.h"<br>
+#include "util/slab.h"<br>
<br>
 struct nir_phi_builder {<br>
    nir_shader *shader;<br>
@@ -60,6 +61,8 @@ struct nir_phi_builder {<br>
     *    one of the defs provided by nir_phi_builder_value_set_blocK_def().<br>
     */<br>
    struct hash_table *value_block_def_hash;<br>
+   struct slab_mempool value_pool;<br>
+   struct slab_mempool key_pool;<br>
 };<br>
<br>
 #define NEEDS_PHI ((nir_ssa_def *)(intptr_t)-1)<br>
@@ -134,6 +137,11 @@ nir_phi_builder_create(nir_function_impl *impl)<br>
                                                       phi_builder_key_hash,<br>
                                                       phi_builder_key_equals);<br>
<br>
+   slab_create(&pb->value_pool, sizeof(struct nir_phi_builder_value),<br>
+               (16 * 1024 - sizeof(void *)) / sizeof(struct nir_phi_builder_value));<br>
+   slab_create(&pb->key_pool, sizeof(struct phi_builder_key),<br>
+               (16 * 1024 - sizeof(void *)) / sizeof(struct phi_builder_key));<br>
+<br>
    return pb;<br>
 }<br>
<br>
@@ -144,7 +152,7 @@ nir_phi_builder_add_value(struct nir_phi_builder *pb, unsigned num_components,<br>
    struct nir_phi_builder_value *val;<br>
    unsigned i, w_start = 0, w_end = 0;<br>
<br>
-   val = rzalloc_size(pb, sizeof(*val));<br>
+   val = slab_alloc_st(&pb->value_pool);<br>
    val->builder = pb;<br>
    val->num_components = num_components;<br>
    val->bit_size = bit_size;<br>
@@ -211,7 +219,7 @@ nir_phi_builder_value_set_block_def(struct nir_phi_builder_value *val,<br>
    if (he != NULL) {<br>
       he->data = def;<br>
    } else {<br>
-      struct phi_builder_key *kp = ralloc(val->builder, struct phi_builder_key);<br>
+      struct phi_builder_key *kp = slab_alloc_st(&val->builder->key_pool);<br>
<br>
       kp->val = k.val;<br>
       kp->block_index = k.block_index;<br>
@@ -362,5 +370,9 @@ nir_phi_builder_finish(struct nir_phi_builder *pb)<br>
       }<br>
    }<br>
<br>
+   slab_flush_st(&pb->value_pool);<br>
+   slab_flush_st(&pb->key_pool);<br>
+   slab_destroy(&pb->value_pool);<br>
+   slab_destroy(&pb->key_pool);<br>
    ralloc_free(pb);<br>
 }<br>
-- <br>
2.14.4<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">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/mailman/listinfo/mesa-dev</a><br>
</blockquote></div></div></div>