[igt-dev] [PATCH i-g-t 9/9] tools/intel_gpu_top: Add ability to show memory region breakdown

Kamil Konieczny kamil.konieczny at linux.intel.com
Fri Nov 3 19:04:12 UTC 2023


Hi Tvrtko,
On 2023-10-12 at 09:15:47 +0100, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> 
> Similar as we can toggle between aggregated engines and clients, add the
> capability to toggle between aggregated and per memory region stats.
> 
> It starts in aggregated mode by default and interactive command 'm' and
> command line switch '-m' can be used to toggle that.
> 
> Both only affect the interactive view, while JSON output always contains
> separate memory regions.
> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Reviewed-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>

> ---
>  man/intel_gpu_top.rst |  4 ++++
>  tools/intel_gpu_top.c | 55 ++++++++++++++++++++++++++++++++++---------
>  2 files changed, 48 insertions(+), 11 deletions(-)
> 
> diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
> index 9499f87f1b4d..44a54a5f219d 100644
> --- a/man/intel_gpu_top.rst
> +++ b/man/intel_gpu_top.rst
> @@ -55,6 +55,9 @@ OPTIONS
>  -p
>     Default to showing physical engines instead of aggregated classes.
>  
> +-m
> +   Default to showing all memory regions separately.
> +
>  RUNTIME CONTROL
>  ===============
>  
> @@ -68,6 +71,7 @@ Supported keys:
>  |    's'    Toggle between sort modes (runtime, total runtime, pid, client id).
>  |    'i'    Toggle display of clients which used no GPU time.
>  |    'H'    Toggle between per PID aggregation and individual clients.
> +|    'm'    Toggle between aggregated memory regions and full breakdown.
>  
>  DEVICE SELECTION
>  ================
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index 2c09895c79dd..046ead15a122 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -138,6 +138,7 @@ struct intel_clients {
>  
>  static struct termios termios_orig;
>  static bool class_view;
> +static bool aggregate_regions;
>  
>  /* Maps i915 fdinfo names to indices */
>  static const char *memory_region_map[] = {
> @@ -1050,6 +1051,7 @@ usage(const char *appname)
>  		"\t[-L]            List all cards.\n"
>  		"\t[-d <device>]   Device filter, please check manual page for more details.\n"
>  		"\t[-p]            Default to showing physical engines instead of classes.\n"
> +		"\t[-m]            Default to showing all memory regions.\n"
>  		"\n",
>  		appname, DEFAULT_PERIOD_MS);
>  	igt_device_print_filter_types();
> @@ -2032,6 +2034,7 @@ print_clients_header(struct igt_drm_clients *clients, int lines,
>  
>  	if (output_mode == INTERACTIVE) {
>  		int len, num_active = 0;
> +		unsigned int i;
>  
>  		if (lines++ >= con_h)
>  			return lines;
> @@ -2042,11 +2045,17 @@ print_clients_header(struct igt_drm_clients *clients, int lines,
>  		if (lines++ >= con_h || len >= con_w)
>  			return lines;
>  
> -		if (iclients->regions)
> -			len += printf("     MEM      RSS ");
> +		if (iclients->regions) {
> +			if (aggregate_regions) {
> +				len += printf("     MEM      RSS ");
> +			} else {
> +				len += printf("     RAM      RSS ");
> +				if (iclients->regions->num_regions > 1)
> +					len += printf("    VRAM     VRSS ");
> +			}
> +		}
>  
>  		if (iclients->classes.num_engines) {
> -			unsigned int i;
>  			int width;
>  
>  			for (i = 0; i <= iclients->classes.max_engine_id; i++) {
> @@ -2120,15 +2129,26 @@ print_client(struct igt_drm_client *c, struct engines *engines, double t, int li
>  		len = printf("%*s ", clients->max_pid_len, c->pid_str);
>  
>  		if (iclients->regions) {
> -			uint64_t sz;
> +			if (aggregate_regions) {
> +				uint64_t sz;
>  
> -			for (sz = 0, i = 0; i <= c->regions->max_region_id; i++)
> -				sz += c->memory[i].total;
> -			len += print_size(sz);
> +				for (sz = 0, i = 0;
> +				     i <= c->regions->max_region_id; i++)
> +					sz += c->memory[i].total;
> +				len += print_size(sz);
>  
> -			for (sz = 0, i = 0; i <= c->regions->max_region_id; i++)
> -				sz += c->memory[i].resident;
> -			len += print_size(sz);
> +				for (sz = 0, i = 0;
> +				     i <= c->regions->max_region_id; i++)
> +					sz += c->memory[i].resident;
> +				len += print_size(sz);
> +			} else {
> +				len += print_size(c->memory[0].total);
> +				len += print_size(c->memory[0].resident);
> +				if (c->regions->num_regions > 1) {
> +					len += print_size(c->memory[1].total);
> +					len += print_size(c->memory[1].resident);
> +				}
> +			}
>  		}
>  
>  		for (i = 0; i <= iclients->classes.max_engine_id; i++) {
> @@ -2405,6 +2425,13 @@ static void process_normal_stdin(void)
>  			else
>  				header_msg = "Showing individual clients.";
>  			break;
> +		case 'm':
> +			aggregate_regions ^= true;
> +			if (aggregate_regions)
> +				header_msg = "Aggregating memory regions.";
> +			else
> +				header_msg = "Showing memory regions.";
> +			break;
>  		};
>  	}
>  }
> @@ -2453,6 +2480,7 @@ static void show_help_screen(void)
>  "    's'    Toggle between sort modes (runtime, total runtime, pid, client id).\n"
>  "    'i'    Toggle display of clients which used no GPU time.\n"
>  "    'H'    Toggle between per PID aggregation and individual clients.\n"
> +"    'm'    Toggle between aggregated memory regions and full breakdown.\n"
>  "\n"
>  "    'h' or 'q'    Exit interactive help.\n"
>  "\n");
> @@ -2580,6 +2608,7 @@ int main(int argc, char **argv)
>  {
>  	unsigned int period_us = DEFAULT_PERIOD_MS * 1000;
>  	bool physical_engines = false;
> +	bool separate_regions = false;
>  	struct intel_clients iclients;
>  	int con_w = -1, con_h = -1;
>  	char *output_path = NULL;
> @@ -2592,7 +2621,7 @@ int main(int argc, char **argv)
>  	struct timespec ts;
>  
>  	/* Parse options */
> -	while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
> +	while ((ch = getopt(argc, argv, "o:s:d:mpcJLlh")) != -1) {
>  		switch (ch) {
>  		case 'o':
>  			output_path = optarg;
> @@ -2606,6 +2635,9 @@ int main(int argc, char **argv)
>  		case 'p':
>  			physical_engines = true;
>  			break;
> +		case 'm':
> +			separate_regions = true;
> +			break;
>  		case 'c':
>  			output_mode = CSV;
>  			break;
> @@ -2649,6 +2681,7 @@ int main(int argc, char **argv)
>  		fprintf(stderr, "Failed to install signal handler!\n");
>  
>  	class_view = !physical_engines;
> +	aggregate_regions = !separate_regions;
>  
>  	switch (output_mode) {
>  	case INTERACTIVE:
> -- 
> 2.39.2
> 


More information about the igt-dev mailing list