From patchwork Wed Jul 11 22:07:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Harrison X-Patchwork-Id: 10520643 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C5D48605DC for ; Wed, 11 Jul 2018 22:07:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A95E529877 for ; Wed, 11 Jul 2018 22:07:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9B66F2989C; Wed, 11 Jul 2018 22:07:21 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A8B2129877 for ; Wed, 11 Jul 2018 22:07:20 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 001596EE28; Wed, 11 Jul 2018 22:07:19 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by gabe.freedesktop.org (Postfix) with ESMTPS id 72D4A6EE1D; Wed, 11 Jul 2018 22:07:18 +0000 (UTC) X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Jul 2018 15:07:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.51,339,1526367600"; d="scan'208,223"; a="71999644" Received: from johnharr-mobl3.ger.corp.intel.com (HELO [10.255.75.4]) ([10.255.75.4]) by orsmga001.jf.intel.com with ESMTP; 11 Jul 2018 15:07:13 -0700 To: Tvrtko Ursulin , igt-dev@lists.freedesktop.org References: <20180709132004.14468-1-tvrtko.ursulin@linux.intel.com> <20180709132004.14468-3-tvrtko.ursulin@linux.intel.com> From: John Harrison Message-ID: <2977b001-a780-e19e-60e6-53c3c4744f54@Intel.com> Date: Wed, 11 Jul 2018 15:07:12 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20180709132004.14468-3-tvrtko.ursulin@linux.intel.com> Content-Language: en-US Subject: Re: [Intel-gfx] [PATCH i-g-t 02/11] trace.pl: Improve readability of graphical timeline representation X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gfx@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP On 7/9/2018 6:19 AM, Tvrtko Ursulin wrote: > From: Tvrtko Ursulin > > We add stripes for different stages of request execution so it is easier > to follow one context in the multi-colour mode. > > Vertical stripe pattern indicates pipeline "blockages" - requests waiting > for dependencies before they are runnable. > > Diagonal stripes indicate runnable requests waiting for GPU time. > > Horizontal strips are requests executing on the GPU. > > Also use this new multi-coloured mode from media-bench.pl. > > v2: > John Harrison: > * Mention media-bench.pl in the commit. > * Fix HTML for single colour mode. > > v3: > * Rebase. > * Apply stripes to legacy colouring as well. > > v4: > John Harrison: > * Use per context colours for ctxsave and incomplete boxes. > * Clearer timeline legend. > > Signed-off-by: Tvrtko Ursulin > Cc: John Harrison > --- > scripts/media-bench.pl | 2 +- > scripts/trace.pl | 112 ++++++++++++++++++++++++++++++++--------- > 2 files changed, 90 insertions(+), 24 deletions(-) > > diff --git a/scripts/media-bench.pl b/scripts/media-bench.pl > index c5628c7f2836..375844d9cdf6 100755 > --- a/scripts/media-bench.pl > +++ b/scripts/media-bench.pl > @@ -207,7 +207,7 @@ sub trace_workload > show_cmd($cmd); > system($cmd); > > - $cmd = "perf script | $tracepl --html -x ctxsave -s "; > + $cmd = "perf script | $tracepl --html -x ctxsave -s -c "; > $cmd .= join ' ', map("-i $_", @skip_engine); > $cmd .= " > ${file}.html"; > show_cmd($cmd); > diff --git a/scripts/trace.pl b/scripts/trace.pl > index fd414f5a4b1e..1ec8b297d15e 100755 > --- a/scripts/trace.pl > +++ b/scripts/trace.pl > @@ -727,9 +727,14 @@ foreach my $key (keys %reqwait) { > say sprintf('GPU: %.2f%% idle, %.2f%% busy', > $flat_busy{'gpu-idle'}, $flat_busy{'gpu-busy'}) unless $html; > > -my $queued_colour = $colour_contexts ? 'multi-colour light' : 'blue'; > -my $runnable_colour = $colour_contexts ? 'multi-colour dark' : 'grey'; > -my $execute_colour = $colour_contexts ? 'multi-colour' : 'pink'; > +my $timeline_text = $colour_contexts ? > + 'Per context coloured shading like:' : 'Box shading like:'; > + > +my $queued_style = box_style($min_ctx, 'queue'); > +my $ready_style = box_style($min_ctx, 'ready'); > +my $execute_style = box_style($min_ctx, 'execute'); > +my $ctxsave_style = box_style($min_ctx, 'ctxsave'); > +my $incomplete_style = box_style($min_ctx, 'incomplete'); In context colouring mode, the legend is not especially useful as it is only coloured for one particular context (which at least for all of my traces, is the system context that only appears at the very end as a flush) and has no indication that other contexts will be significantly different. Also, I find the black text is really hard to read against the dark colour backgrounds. Plus the boxes are too small to actually work out what the shading is (for 'ready' and 'incomplete' if not all of them). See attached patch for some tweaks. Basically, add all contexts to the key in colour mode, make the boxes bigger and use white text for most of it. Although the thought occurs that it might be worth limiting the legend to only four or five contexts and just putting an 'etc' at the end if there are more. Otherwise a trace with hundreds of contexts could be a problem! I'm guessing in that case, the difference in colour from one context to the next will be pretty minimal anyway. > > print < > @@ -751,9 +756,28 @@ print < > >

> -$execute_colour = requests executing on the GPU
> -$runnable_colour = runnable requests waiting for a slot on GPU
> -$queued_colour = requests waiting on fences and dependencies before they are runnable
> +Timeline request view: > + > + > + > + > + > + > + > + > + > + > + > + > +
$timeline_text
QUEUED
READY
EXECUTE
CTXSAVE
(INCOMPLETE)
> +

> +

> + > +QUEUED = requests executing on the GPU
> +READY = runnable requests waiting for a slot on GPU
> +EXECUTE = requests waiting on fences and dependencies before they are runnable
> +CTXSAVE = GPU saving the context image
> +
>

>

> Boxes are in format 'ctx-id/seqno'. > @@ -873,17 +897,31 @@ sub sortQueue { > > sub ctx_colour > { > - my ($ctx, $stage) = (@_); > + my ($ctx, $stage, $lfac) = (@_); > my ($s, $l); > my $val; > > unless ($colour_contexts) { > if ($stage eq 'queue') { > - return 'lightblue;'; > + $val = 210; > + $s = 65; > + $l = 52; > } elsif ($stage eq 'ready') { > - return 'lightgrey;'; > + $val = 0; > + $s = 0; > + $l = 47; > } elsif ($stage eq 'execute') { > - return 'pink;'; > + $val = 346; > + $s = 68; > + $l = 65; > + } elsif ($stage eq 'ctxsave') { > + $val = 26; > + $s = 90; > + $l = 52; > + } elsif ($stage eq 'incomplete') { > + $val = 0; > + $s = 85; > + $l = 50; > } > } else { > if ($stage eq 'queue') { > @@ -895,12 +933,45 @@ sub ctx_colour > } elsif ($stage eq 'execute') { > $s = 80; > $l = 65; > + } elsif ($stage eq 'ctxsave') { > + $s = 75; > + $l = 70; > + } elsif ($stage eq 'incomplete') { > + $s = 80; > + $l = 25; > } > + > + $val = int(360 / ($max_ctx - $min_ctx + 1)) * ($ctx - $min_ctx); > } > > - $val = int(360 / ($max_ctx - $min_ctx + 1)) * ($ctx - $min_ctx); > + $l = int($l * $lfac); > > - return "hsl($val, $s%, $l%);"; > + return "hsl($val, $s%, $l%)"; > +} > + > +sub box_style > +{ > + my ($ctx, $stage) = @_; > + my $deg; > + > + if ($stage eq 'queue') { > + $deg = 90; > + } elsif ($stage eq 'ready') { > + $deg = 45; > + } elsif ($stage eq 'execute') { > + $deg = 0; > + } elsif ($stage eq 'ctxsave') { > + $deg = 105; > + } elsif ($stage eq 'incomplete') { > + $deg = 0; > + } > + > + return 'color: black; background: repeating-linear-gradient(' . > + $deg . 'deg, ' . > + ctx_colour($ctx, $stage, 1.0) . ', ' . > + ctx_colour($ctx, $stage, 1.0) . ' 10px, ' . > + ctx_colour($ctx, $stage, 0.90) . ' 10px, ' . > + ctx_colour($ctx, $stage, 0.90) . ' 20px);'; > } > > my $i = 0; > @@ -917,8 +988,7 @@ foreach my $key (sort sortQueue keys %db) { > # submit to execute > unless (exists $skip_box{'queue'}) { > $skey = 2 * $max_seqno * $ctx + 2 * $seqno; > - $style = 'color: black; background-color: ' . > - ctx_colour($ctx, 'queue'); > + $style = box_style($ctx, 'queue'); > $content = "$name
$db{$key}->{'submit-delay'}us ($db{$key}->{'execute-delay'}us)"; > $startend = 'start: \'' . ts($queue) . '\', end: \'' . ts($submit) . '\''; > print "\t{id: $i, key: $skey, $type group: $group, subgroup: 1, subgroupOrder: 1, content: '$content', $startend, style: \'$style\'},\n"; > @@ -928,8 +998,7 @@ foreach my $key (sort sortQueue keys %db) { > # execute to start > unless (exists $skip_box{'ready'}) { > $skey = 2 * $max_seqno * $ctx + 2 * $seqno + 1; > - $style = 'color: black; background-color: ' . > - ctx_colour($ctx, 'ready'); > + $style = box_style($ctx, 'ready'); > $content = "$name
$db{$key}->{'execute-delay'}us
"; > $startend = 'start: \'' . ts($submit) . '\', end: \'' . ts($start) . '\''; > print "\t{id: $i, key: $skey, $type group: $group, subgroup: 1, subgroupOrder: 2, content: '$content', $startend, style: \'$style\'},\n"; > @@ -939,12 +1008,9 @@ foreach my $key (sort sortQueue keys %db) { > # start to user interrupt > unless (exists $skip_box{'execute'}) { > $skey = -2 * $max_seqno * $ctx - 2 * $seqno - 1; > - if (exists $db{$key}->{'incomplete'}) { > - $style = 'color: white; background-color: red;'; > - } else { > - $style = 'color: black; background-color: ' . > - ctx_colour($ctx, 'execute'); > - } > + $style = box_style($ctx, > + exists $db{$key}->{'incomplete'} ? > + 'incomplete' : 'execute'); > $content = "$name $db{$key}->{'port'}"; > $content .= ' ??? ' if exists $db{$key}->{'incomplete'}; > $content .= ' ++ ' if exists $db{$key}->{'no-end'}; > @@ -958,7 +1024,7 @@ foreach my $key (sort sortQueue keys %db) { > # user interrupt to context complete > unless (exists $skip_box{'ctxsave'}) { > $skey = -2 * $max_seqno * $ctx - 2 * $seqno; > - $style = 'color: black; background-color: orange;'; > + $style = box_style($ctx, 'ctxsave'); > my $ctxsave = $db{$key}->{'end'} - $db{$key}->{'notify'}; > $content = "$name
${ctxsave}us
"; > $content .= ' ??? ' if exists $db{$key}->{'incomplete'}; From df66e1353cc9550fb0a8a79b98dc8f8dc85ed993 Mon Sep 17 00:00:00 2001 From: John Harrison Date: Tue, 10 Jul 2018 14:53:16 -0700 Subject: [PATCH 01/21] trace.pl: Improved key/colours --- scripts/trace.pl | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/scripts/trace.pl b/scripts/trace.pl index 60a8e441..38379737 100755 --- a/scripts/trace.pl +++ b/scripts/trace.pl @@ -740,6 +740,29 @@ my $timeline_text = $colour_contexts ? 'Per context coloured shading like:' : 'Box shading like:'; my %ctx_colours; +my $ctx_table; + +sub generate_ctx_table +{ + my @states = ("queue", "ready", "execute", "ctxsave", "incomplete"); + my @ctxts; + + if( $colour_contexts ) { + @ctxts = sort keys %ctxdb; + } else { + @ctxts = ($min_ctx); + } + + $ctx_table = ""; + foreach my $ctx (@ctxts) { + $ctx_table .= "\n"; + $ctx_table .= " Context: $ctx\n" if $colour_contexts; + foreach my $state (@states) { + $ctx_table .= "

   " . uc($state) . "   

 

\n"; + } + $ctx_table .= ""; + } +} sub generate_ctx_colours { @@ -753,12 +776,7 @@ sub generate_ctx_colours generate_ctx_colours() if $html and $colour_contexts; - -my $queued_style = box_style($min_ctx, 'queue'); -my $ready_style = box_style($min_ctx, 'ready'); -my $execute_style = box_style($min_ctx, 'execute'); -my $ctxsave_style = box_style($min_ctx, 'ctxsave'); -my $incomplete_style = box_style($min_ctx, 'incomplete'); +generate_ctx_table() if $html; print < @@ -780,24 +798,16 @@ print <Timeline request view: - - - - - - - - - - -
$timeline_text
QUEUED
READY
EXECUTE
CTXSAVE
(INCOMPLETE)
+$ctx_table +

-QUEUED = requests executing on the GPU
+QUEUE = requests executing on the GPU
READY = runnable requests waiting for a slot on GPU
EXECUTE = requests waiting on fences and dependencies before they are runnable
CTXSAVE = GPU saving the context image
+INCOMPLETE = request has stopped executing but is not yet complete (e.g. it was pre-empted)

@@ -974,9 +984,11 @@ sub box_style { my ($ctx, $stage) = @_; my $deg; + my $text_col = 'white'; if ($stage eq 'queue') { $deg = 90; + $text_col = 'black' if $colour_contexts; } elsif ($stage eq 'ready') { $deg = 45; } elsif ($stage eq 'execute') { @@ -987,7 +999,7 @@ sub box_style $deg = 0; } - return 'color: black; background: repeating-linear-gradient(' . + return "color: $text_col; background: repeating-linear-gradient(" . $deg . 'deg, ' . ctx_colour($ctx, $stage, 1.0) . ', ' . ctx_colour($ctx, $stage, 1.0) . ' 10px, ' .