[Mesa-dev] [PATCH] i965/sched: Simplify work done by add_barrier_deps().

Kenneth Graunke kenneth at whitecape.org
Fri Aug 19 08:21:25 UTC 2016


On Thursday, August 18, 2016 5:17:43 PM PDT Matt Turner wrote:
> Scheduling barriers are implemented by placing a dependence on every
> node before and after the barrier. This is unnecessary as we can limit
> the number of nodes we place dependencies on to those between us and the
> next barrier in each direction.
> 
> Runtime of dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.23
> is reduced from ~25 minutes to a little more than three.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94681
> ---
> Would people rather I make is_scheduling_barrier() a virtual member of
> backend_instruction and move the implementations into vec4_instruction
> and fs_inst?
> 
>  src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp b/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp
> index 8afdc25..2e53f9d 100644
> --- a/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp
> @@ -86,6 +86,8 @@ public:
>      * its children, or just the issue_time if it's a leaf node.
>      */
>     int delay;
> +
> +   bool is_barrier;
>  };
>  
>  void
> @@ -772,6 +774,7 @@ schedule_node::schedule_node(backend_instruction *inst,
>     this->unblocked_time = 0;
>     this->cand_generation = 0;
>     this->delay = 0;
> +   this->is_barrier = false;
>  
>     /* We can't measure Gen6 timings directly but expect them to be much
>      * closer to Gen7 than Gen4.
> @@ -872,9 +875,13 @@ instruction_scheduler::add_barrier_deps(schedule_node *n)
>     schedule_node *prev = (schedule_node *)n->prev;
>     schedule_node *next = (schedule_node *)n->next;
>  
> +   n->is_barrier = true;
> +
>     if (prev) {
>        while (!prev->is_head_sentinel()) {
>           add_dep(prev, n, 0);
> +         if (prev->is_barrier)
> +            break;
>           prev = (schedule_node *)prev->prev;
>        }
>     }
> @@ -882,6 +889,8 @@ instruction_scheduler::add_barrier_deps(schedule_node *n)
>     if (next) {
>        while (!next->is_tail_sentinel()) {
>           add_dep(n, next, 0);
> +         if (next->is_barrier)
> +            break;
>           next = (schedule_node *)next->next;
>        }
>     }
> 

I think adding the bool is reasonable.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

Thanks for fixing this!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160819/6fe5ef32/attachment.sig>


More information about the mesa-dev mailing list