diff mbox

[i-g-t,09/11] trace.pl: Add support for colouring context execution

Message ID 20180306124315.30208-10-tvrtko.ursulin@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Tvrtko Ursulin March 6, 2018, 12:43 p.m. UTC
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Add the command line switch which uses different colours for different
context execution boxes.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: John Harrison <John.C.Harrison@intel.com>
---
 scripts/trace.pl | 41 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 39 insertions(+), 2 deletions(-)

Comments

Lionel Landwerlin April 18, 2018, 5:02 p.m. UTC | #1
One suggestion below, otherwise :

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>

On 06/03/18 04:43, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> Add the command line switch which uses different colours for different
> context execution boxes.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: John Harrison <John.C.Harrison@intel.com>
> ---
>   scripts/trace.pl | 41 +++++++++++++++++++++++++++++++++++++++--
>   1 file changed, 39 insertions(+), 2 deletions(-)
>
> diff --git a/scripts/trace.pl b/scripts/trace.pl
> index e7ce273ef26a..ff61dea0768d 100755
> --- a/scripts/trace.pl
> +++ b/scripts/trace.pl
> @@ -40,6 +40,7 @@ my $trace = 0;
>   my $avg_delay_stats = 0;
>   my $squash_context_id = 0;
>   my $gpu_timeline = 0;
> +my $colour_contexts = 0;
>   
>   my @args;
>   
> @@ -110,6 +111,8 @@ Usage:
>         --squash-ctx-id			Squash context id by substracting engine
>   					id from ctx id.
>         --gpu-timeline			Draw overall GPU busy timeline.
> +      --colour-contexts / -c		Use different colours for different
> +					context execution boxes.
>   ENDHELP
>   
>   		exit 0;
> @@ -279,6 +282,20 @@ sub arg_skip_box
>   	return @_;
>   }
>   
> +sub arg_colour_contexts
> +{
> +	return unless scalar(@_);
> +
> +	if ($_[0] eq '--colour-contexts' or
> +	    $_[0] eq '--color-contexts' or
> +	    $_[0] eq '-c') {
> +		shift @_;
> +		$colour_contexts = 1;
> +	}
> +
> +	return @_;
> +}
> +
>   @args = @ARGV;
>   while (@args) {
>   	my $left = scalar(@args);
> @@ -294,6 +311,7 @@ while (@args) {
>   	@args = arg_split_requests(@args);
>   	@args = arg_ignore_ring(@args);
>   	@args = arg_skip_box(@args);
> +	@args = arg_colour_contexts(@args);
>   
>   	last if $left == scalar(@args);
>   }
> @@ -581,6 +599,7 @@ foreach my $key (@sorted_keys) {
>   
>   my $last_ts = 0;
>   my $first_ts;
> +my $min_ctx;
>   
>   foreach my $key (@sorted_keys) {
>   	my $ring = $db{$key}->{'ring'};
> @@ -590,6 +609,8 @@ foreach my $key (@sorted_keys) {
>   
>   	$first_ts = $db{$key}->{'queue'} if not defined $first_ts or $db{$key}->{'queue'} < $first_ts;
>   	$last_ts = $end if $end > $last_ts;
> +	$min_ctx = $db{$key}->{'ctx'} if not defined $min_ctx or
> +					 $db{$key}->{'ctx'} < $min_ctx;
>   
>   	$db{$key}->{'context-complete-delay'} = $end - $notify;
>   	$db{$key}->{'execute-delay'} = $start - $db{$key}->{'submit'};
> @@ -721,6 +742,8 @@ foreach my $key (keys %reqwait) {
>   say sprintf('GPU: %.2f%% idle, %.2f%% busy',
>   	     $flat_busy{'gpu-idle'}, $flat_busy{'gpu-busy'}) unless $html;
>   
> +my $execute_colour = $colour_contexts ? 'multi-colour' : 'pink';
> +
>   print <<ENDHTML if $html;
>   <!DOCTYPE HTML>
>   <html>
> @@ -741,7 +764,7 @@ print <<ENDHTML if $html;
>   <button onclick="toggleStackSubgroups()">Toggle stacking</button>
>   
>   <p>
> -pink = requests executing on the GPU<br>
> +$execute_colour = requests executing on the GPU<br>
>   grey = runnable requests waiting for a slot on GPU<br>
>   blue = requests waiting on fences and dependencies before they are runnable<br>
>   </p>
> @@ -861,6 +884,19 @@ sub sortQueue {
>   	return $val;
>   }
>   
> +my @html_colours = ( 'Pink', 'Green', 'Purple', 'Gold', 'Cyan', 'Brown',
> +		     'DeepPink', 'LightGreen', 'Plum', 'Orange', 'Teal', 'Peru',
> +		     'Indigo', 'Khaki', 'Coral', 'Olive' );

One way to generate as many colors as you need is to use hsv and divide 
the hue range into as many colors you need.
Then the color for element X is X * 360 / n_colors (http://colorizer.org/)

Just a suggestion :)

> +
> +sub ctx_colour
> +{
> +       my ($ctx) = (@_);
> +
> +       return 'Pink' unless $colour_contexts;
> +
> +       return $html_colours[($ctx - $min_ctx) % scalar(@html_colours)];
> +}
> +
>   my $i = 0;
>   foreach my $key (sort sortQueue keys %db) {
>   	my ($name, $ctx, $seqno) = ($db{$key}->{'name'}, $db{$key}->{'ctx'}, $db{$key}->{'seqno'});
> @@ -898,7 +934,8 @@ foreach my $key (sort sortQueue keys %db) {
>   		if (exists $db{$key}->{'incomplete'}) {
>   			$style = 'color: white; background-color: red;';
>   		} else {
> -			$style = 'color: black; background-color: pink;';
> +			$style = 'color: black; background-color: ' .
> +				  ctx_colour($ctx) . ';';
>   		}
>   		$content = "$name <small>$db{$key}->{'port'}</small>";
>   		$content .= ' <small><i>???</i></small> ' if exists $db{$key}->{'incomplete'};
diff mbox

Patch

diff --git a/scripts/trace.pl b/scripts/trace.pl
index e7ce273ef26a..ff61dea0768d 100755
--- a/scripts/trace.pl
+++ b/scripts/trace.pl
@@ -40,6 +40,7 @@  my $trace = 0;
 my $avg_delay_stats = 0;
 my $squash_context_id = 0;
 my $gpu_timeline = 0;
+my $colour_contexts = 0;
 
 my @args;
 
@@ -110,6 +111,8 @@  Usage:
       --squash-ctx-id			Squash context id by substracting engine
 					id from ctx id.
       --gpu-timeline			Draw overall GPU busy timeline.
+      --colour-contexts / -c		Use different colours for different
+					context execution boxes.
 ENDHELP
 
 		exit 0;
@@ -279,6 +282,20 @@  sub arg_skip_box
 	return @_;
 }
 
+sub arg_colour_contexts
+{
+	return unless scalar(@_);
+
+	if ($_[0] eq '--colour-contexts' or
+	    $_[0] eq '--color-contexts' or
+	    $_[0] eq '-c') {
+		shift @_;
+		$colour_contexts = 1;
+	}
+
+	return @_;
+}
+
 @args = @ARGV;
 while (@args) {
 	my $left = scalar(@args);
@@ -294,6 +311,7 @@  while (@args) {
 	@args = arg_split_requests(@args);
 	@args = arg_ignore_ring(@args);
 	@args = arg_skip_box(@args);
+	@args = arg_colour_contexts(@args);
 
 	last if $left == scalar(@args);
 }
@@ -581,6 +599,7 @@  foreach my $key (@sorted_keys) {
 
 my $last_ts = 0;
 my $first_ts;
+my $min_ctx;
 
 foreach my $key (@sorted_keys) {
 	my $ring = $db{$key}->{'ring'};
@@ -590,6 +609,8 @@  foreach my $key (@sorted_keys) {
 
 	$first_ts = $db{$key}->{'queue'} if not defined $first_ts or $db{$key}->{'queue'} < $first_ts;
 	$last_ts = $end if $end > $last_ts;
+	$min_ctx = $db{$key}->{'ctx'} if not defined $min_ctx or
+					 $db{$key}->{'ctx'} < $min_ctx;
 
 	$db{$key}->{'context-complete-delay'} = $end - $notify;
 	$db{$key}->{'execute-delay'} = $start - $db{$key}->{'submit'};
@@ -721,6 +742,8 @@  foreach my $key (keys %reqwait) {
 say sprintf('GPU: %.2f%% idle, %.2f%% busy',
 	     $flat_busy{'gpu-idle'}, $flat_busy{'gpu-busy'}) unless $html;
 
+my $execute_colour = $colour_contexts ? 'multi-colour' : 'pink';
+
 print <<ENDHTML if $html;
 <!DOCTYPE HTML>
 <html>
@@ -741,7 +764,7 @@  print <<ENDHTML if $html;
 <button onclick="toggleStackSubgroups()">Toggle stacking</button>
 
 <p>
-pink = requests executing on the GPU<br>
+$execute_colour = requests executing on the GPU<br>
 grey = runnable requests waiting for a slot on GPU<br>
 blue = requests waiting on fences and dependencies before they are runnable<br>
 </p>
@@ -861,6 +884,19 @@  sub sortQueue {
 	return $val;
 }
 
+my @html_colours = ( 'Pink', 'Green', 'Purple', 'Gold', 'Cyan', 'Brown',
+		     'DeepPink', 'LightGreen', 'Plum', 'Orange', 'Teal', 'Peru',
+		     'Indigo', 'Khaki', 'Coral', 'Olive' );
+
+sub ctx_colour
+{
+       my ($ctx) = (@_);
+
+       return 'Pink' unless $colour_contexts;
+
+       return $html_colours[($ctx - $min_ctx) % scalar(@html_colours)];
+}
+
 my $i = 0;
 foreach my $key (sort sortQueue keys %db) {
 	my ($name, $ctx, $seqno) = ($db{$key}->{'name'}, $db{$key}->{'ctx'}, $db{$key}->{'seqno'});
@@ -898,7 +934,8 @@  foreach my $key (sort sortQueue keys %db) {
 		if (exists $db{$key}->{'incomplete'}) {
 			$style = 'color: white; background-color: red;';
 		} else {
-			$style = 'color: black; background-color: pink;';
+			$style = 'color: black; background-color: ' .
+				  ctx_colour($ctx) . ';';
 		}
 		$content = "$name <small>$db{$key}->{'port'}</small>";
 		$content .= ' <small><i>???</i></small> ' if exists $db{$key}->{'incomplete'};