public inbox for igt-dev@lists.freedesktop.org
 help / color / mirror / Atom feed
* [igt-dev] [PATCH i-g-t] tools/intel_gpu_power: Intel GPU idle/busy power measurement
@ 2023-01-20 16:38 Ashutosh Dixit
  2023-01-20 17:59 ` [igt-dev] ✓ Fi.CI.BAT: success for tools/intel_gpu_power: Intel GPU idle/busy power measurement (rev3) Patchwork
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Ashutosh Dixit @ 2023-01-20 16:38 UTC (permalink / raw)
  To: igt-dev; +Cc: Badal Nilawar

In several instances (e.g. when investigating GPU power limits) it is very
useful to be able to measure GPU power easily. Since we already have all
ingredients for doing so, add a tool to measure Intel GPU power when idle
and power under load.

v2: Use softpin/allocator (Riana)

Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
---
 tools/intel_gpu_power.c | 76 +++++++++++++++++++++++++++++++++++++++++
 tools/meson.build       |  1 +
 2 files changed, 77 insertions(+)
 create mode 100644 tools/intel_gpu_power.c

diff --git a/tools/intel_gpu_power.c b/tools/intel_gpu_power.c
new file mode 100644
index 00000000000..d9e71581707
--- /dev/null
+++ b/tools/intel_gpu_power.c
@@ -0,0 +1,76 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2022 Intel Corporation
+ */
+
+#include "igt.h"
+#include "i915/gem.h"
+#include "igt_power.h"
+
+static int measure_power(int i915, const char *domain, bool load)
+{
+	const intel_ctx_t *ctx = intel_ctx_create_all_physical(i915);
+	uint64_t ahnd = get_reloc_ahnd(i915, ctx->id);
+	int ret, sleep_duration_sec = 2;
+	struct power_sample sample[2];
+	struct igt_power pwr;
+	igt_spin_t *spin;
+
+	gem_quiescent_gpu(i915);
+	if (load) {
+		spin = igt_spin_new(i915, .ahnd = ahnd, .ctx = ctx,
+				    .engine = ALL_ENGINES,
+				    .flags = IGT_SPIN_POLL_RUN);
+		/* Wait till at least one spinner starts */
+		igt_spin_busywait_until_started(spin);
+	}
+
+	ret = igt_power_open(i915, &pwr, domain);
+	if (ret)
+		return ret;
+	igt_power_get_energy(&pwr, &sample[0]);
+	usleep(sleep_duration_sec * USEC_PER_SEC);
+	igt_power_get_energy(&pwr, &sample[1]);
+	igt_info("Measured power: %g mW\n", igt_power_get_mW(&pwr, &sample[0], &sample[1]));
+
+	igt_power_close(&pwr);
+	igt_free_spins(i915);
+	put_ahnd(ahnd);
+	intel_ctx_destroy(i915, ctx);
+
+	return 0;
+}
+
+static void usage(const char *name)
+{
+	igt_info("Usage: %s [options]\n", name);
+	igt_info("-i/--idle  Measure idle power\n");
+	igt_info("-b/--busy  Measure power under load\n");
+}
+
+int main(int argc, char *argv[])
+{
+	int i915 = drm_open_driver_master(DRIVER_INTEL);
+	static struct option long_options[] = {
+		{"idle", 0, 0, 'i'},
+		{"busy", 0, 0, 'b'},
+		{ 0, 0, 0, 0 }
+	};
+	int opt = getopt_long(argc, argv, "ib", long_options, NULL);
+	int ret = 0;
+
+	switch (opt) {
+	case 'i':
+		ret = measure_power(i915, "gpu", false);
+		break;
+	case 'b':
+		ret = measure_power(i915, "gpu", true);
+		break;
+	default:
+		usage(argv[0]);
+		break;
+	}
+
+	close(i915);
+	return ret;
+}
diff --git a/tools/meson.build b/tools/meson.build
index d2defec8703..4bbbd993cac 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -22,6 +22,7 @@ tools_progs = [
 	'intel_error_decode',
 	'intel_forcewaked',
 	'intel_gpu_frequency',
+	'intel_gpu_power',
 	'intel_firmware_decode',
 	'intel_framebuffer_dump',
 	'intel_gpu_time',
-- 
2.38.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread
* [igt-dev] [PATCH i-g-t] tools/intel_gpu_power: Intel GPU idle/busy power measurement
@ 2023-01-19  5:01 Ashutosh Dixit
  0 siblings, 0 replies; 7+ messages in thread
From: Ashutosh Dixit @ 2023-01-19  5:01 UTC (permalink / raw)
  To: igt-dev; +Cc: Badal Nilawar

In several instances (e.g. when investigating GPU power limits) it is very
useful to be able to measure GPU power easily. Since we already have all
ingredients for doing so, add a tool to measure Intel GPU power when idle
and power under load.

Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
---
 tools/intel_gpu_power.c | 73 +++++++++++++++++++++++++++++++++++++++++
 tools/meson.build       |  1 +
 2 files changed, 74 insertions(+)
 create mode 100644 tools/intel_gpu_power.c

diff --git a/tools/intel_gpu_power.c b/tools/intel_gpu_power.c
new file mode 100644
index 00000000000..3f73e10bf60
--- /dev/null
+++ b/tools/intel_gpu_power.c
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2022 Intel Corporation
+ */
+
+#include "igt.h"
+#include "i915/gem.h"
+#include "igt_power.h"
+
+static int measure_power(int i915, const char *domain, bool load)
+{
+	const intel_ctx_t *ctx = intel_ctx_create_all_physical(i915);
+	int ret, sleep_duration_sec = 2;
+	struct power_sample sample[2];
+	struct igt_power pwr;
+	igt_spin_t *spin;
+
+	gem_quiescent_gpu(i915);
+	if (load) {
+		spin = igt_spin_new(i915, .ctx = ctx, .engine = ALL_ENGINES,
+				    .flags = IGT_SPIN_POLL_RUN);
+		/* Wait till at least one spinner starts */
+		igt_spin_busywait_until_started(spin);
+	}
+
+	ret = igt_power_open(i915, &pwr, domain);
+	if (ret)
+		return ret;
+	igt_power_get_energy(&pwr, &sample[0]);
+	usleep(sleep_duration_sec * USEC_PER_SEC);
+	igt_power_get_energy(&pwr, &sample[1]);
+	igt_info("Measured power: %g mW\n", igt_power_get_mW(&pwr, &sample[0], &sample[1]));
+
+	igt_power_close(&pwr);
+	igt_free_spins(i915);
+	intel_ctx_destroy(i915, ctx);
+
+	return 0;
+}
+
+static void usage(const char *name)
+{
+	igt_info("Usage: %s [options]\n", name);
+	igt_info("-i/--idle  Measure idle power\n");
+	igt_info("-b/--busy  Measure power under load\n");
+}
+
+int main(int argc, char *argv[])
+{
+	int i915 = drm_open_driver_master(DRIVER_INTEL);
+	static struct option long_options[] = {
+		{"idle", 0, 0, 'i'},
+		{"busy", 0, 0, 'b'},
+		{ 0, 0, 0, 0 }
+	};
+	int opt = getopt_long(argc, argv, "ib", long_options, NULL);
+	int ret = 0;
+
+	switch (opt) {
+	case 'i':
+		ret = measure_power(i915, "gpu", false);
+		break;
+	case 'b':
+		ret = measure_power(i915, "gpu", true);
+		break;
+	default:
+		usage(argv[0]);
+		break;
+	}
+
+	close(i915);
+	return ret;
+}
diff --git a/tools/meson.build b/tools/meson.build
index d2defec8703..4bbbd993cac 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -22,6 +22,7 @@ tools_progs = [
 	'intel_error_decode',
 	'intel_forcewaked',
 	'intel_gpu_frequency',
+	'intel_gpu_power',
 	'intel_firmware_decode',
 	'intel_framebuffer_dump',
 	'intel_gpu_time',
-- 
2.38.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread
* [igt-dev] [PATCH i-g-t] tools/intel_gpu_power: Intel GPU idle/busy power measurement
@ 2023-01-19  3:43 Ashutosh Dixit
  0 siblings, 0 replies; 7+ messages in thread
From: Ashutosh Dixit @ 2023-01-19  3:43 UTC (permalink / raw)
  To: igt-dev

In several instances (e.g. when investigating GPU power limits) it is very
useful to be able to measure GPU power easily. Since we already have all
ingredients for doing so, add a tool to measure Intel GPU power when idle
and power under load.

Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
---
 tools/intel_gpu_power.c | 60 +++++++++++++++++++++++++++++++++++++++++
 tools/meson.build       |  5 ++++
 2 files changed, 65 insertions(+)
 create mode 100644 tools/intel_gpu_power.c

diff --git a/tools/intel_gpu_power.c b/tools/intel_gpu_power.c
new file mode 100644
index 00000000000..ae5285e1a85
--- /dev/null
+++ b/tools/intel_gpu_power.c
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2022 Intel Corporation
+ */
+
+#include "igt.h"
+#include "i915/gem.h"
+#include "igt_power.h"
+
+IGT_TEST_DESCRIPTION("Intel gpu power measurement");
+
+static void measure_power(int i915, const char *domain, bool load)
+{
+	const intel_ctx_t *ctx = intel_ctx_create_all_physical(i915);
+	struct power_sample sample[2];
+	int sleep_duration_sec = 2;
+	struct igt_power pwr;
+	igt_spin_t *spin;
+
+	gem_quiescent_gpu(i915);
+	if (load) {
+		spin = igt_spin_new(i915, .ctx = ctx, .engine = ALL_ENGINES,
+				    .flags = IGT_SPIN_POLL_RUN);
+		/* Wait till at least one spinner starts */
+		igt_spin_busywait_until_started(spin);
+	}
+
+	igt_require(!igt_power_open(i915, &pwr, domain));
+	igt_power_get_energy(&pwr, &sample[0]);
+	usleep(sleep_duration_sec * USEC_PER_SEC);
+	igt_power_get_energy(&pwr, &sample[1]);
+	igt_info("Measured power: %g mW\n", igt_power_get_mW(&pwr, &sample[0], &sample[1]));
+
+	igt_power_close(&pwr);
+	igt_free_spins(i915);
+	intel_ctx_destroy(i915, ctx);
+}
+
+igt_main
+{
+	int i915;
+
+	igt_fixture {
+		i915 = drm_open_driver_master(DRIVER_INTEL);
+	}
+
+	igt_describe("Measure idle gpu power");
+	igt_subtest("idle") {
+		measure_power(i915, "gpu", false);
+	}
+
+	igt_describe("Measure gpu power with load");
+	igt_subtest("busy") {
+		measure_power(i915, "gpu", true);
+	}
+
+	igt_fixture {
+		close(i915);
+	}
+}
diff --git a/tools/meson.build b/tools/meson.build
index d2defec8703..e0058940ce0 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -84,6 +84,11 @@ install_data('intel_gpu_abrt', install_dir : bindir)
 
 install_subdir('registers', install_dir : datadir)
 
+executable('intel_gpu_power', 'intel_gpu_power.c',
+	   install : true,
+	   install_rpath : bindir_rpathdir,
+	   dependencies : [lib_igt,cairo])
+
 executable('intel_gpu_top', 'intel_gpu_top.c',
 	   install : true,
 	   install_rpath : bindir_rpathdir,
-- 
2.38.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-01-21 20:01 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-01-20 16:38 [igt-dev] [PATCH i-g-t] tools/intel_gpu_power: Intel GPU idle/busy power measurement Ashutosh Dixit
2023-01-20 17:59 ` [igt-dev] ✓ Fi.CI.BAT: success for tools/intel_gpu_power: Intel GPU idle/busy power measurement (rev3) Patchwork
2023-01-20 18:00 ` [igt-dev] [PATCH i-g-t] tools/intel_gpu_power: Intel GPU idle/busy power measurement Kamil Konieczny
2023-01-21  2:05   ` Dixit, Ashutosh
2023-01-21 20:01 ` [igt-dev] ✓ Fi.CI.IGT: success for tools/intel_gpu_power: Intel GPU idle/busy power measurement (rev3) Patchwork
  -- strict thread matches above, loose matches on Subject: below --
2023-01-19  5:01 [igt-dev] [PATCH i-g-t] tools/intel_gpu_power: Intel GPU idle/busy power measurement Ashutosh Dixit
2023-01-19  3:43 Ashutosh Dixit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox