[PATCH i-g-t 1/3] lib/intel_compute: loop_kernel_duration in Pipeline
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Thu Aug 21 10:12:28 UTC 2025
On Mon, Aug 18, 2025 at 07:54:44AM +0000, nishit.sharma at intel.com wrote:
> From: Nishit Sharma <nishit.sharma at intel.com>
>
> To execute KERNEL in GPU for specific duration a brief sleep is
> required. New variable loop_kernel_duration is introduced in
> struct user_execenv which holds duration for sleep and during this
> duration the GPU will be running kernel. xe_run_intel_compute_xxx()
> calls are synchronous hence to execute workload on GPU for sometime
> sleep has been called. loop_kernel_duration acts as sleep duration.
> loop_kernel_duration is checked for all pipelines. Currently xe2lpg and
> xe3lpg pipeline support loop_kernel shader hence loop_kernel_duration
> works in these pipelines only.
Generally patch is fine, but some additional information should
occur in your commit message. Kernel which you support is loop kernel
which comes from opencl/loop.cl file. This information is important
because unblock comes from cpu memory write and likely other shaders
we use in igt won't work like loop kernel.
With this information added to commit message:
Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
--
Zbigniew
>
> Signed-off-by: Nishit Sharma <nishit.sharma at intel.com>
> ---
> lib/intel_compute.c | 21 ++++++++++++++++++++-
> lib/intel_compute.h | 2 ++
> 2 files changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/lib/intel_compute.c b/lib/intel_compute.c
> index 147dd2916..125331c53 100644
> --- a/lib/intel_compute.c
> +++ b/lib/intel_compute.c
> @@ -849,6 +849,9 @@ static void compute_exec(int fd, const unsigned char *kernel,
> uint16_t devid = intel_get_drm_devid(fd);
> int entries = ARRAY_SIZE(bo_dict);
>
> + if (user && (user->kernel || user->loop_kernel_duration))
> + igt_skip("Pipeline doesn't support loop_kernel\n");
> +
> bo_execenv_create(fd, &execenv, eci, user);
>
> /* Set dynamic sizes */
> @@ -1131,6 +1134,9 @@ static void xehp_compute_exec(int fd, const unsigned char *kernel,
> uint64_t bind_output_addr = (user && user->output_addr) ? user->output_addr : ADDR_OUTPUT;
> int entries = ARRAY_SIZE(bo_dict);
>
> + if (user && (user->kernel || user->loop_kernel_duration))
> + igt_skip("Pipeline doesn't support loop_kernel\n");
> +
> bo_execenv_create(fd, &execenv, eci, user);
>
> /* Set dynamic sizes */
> @@ -1343,6 +1349,9 @@ static void xehpc_compute_exec(int fd, const unsigned char *kernel,
> uint64_t bind_output_addr = (user && user->output_addr) ? user->output_addr : ADDR_OUTPUT;
> int entries = ARRAY_SIZE(bo_dict);
>
> + if (user && (user->kernel || user->loop_kernel_duration))
> + igt_skip("Pipeline doesn't support loop_kernel\n");
> +
> bo_execenv_create(fd, &execenv, eci, user);
>
> /* Set dynamic sizes */
> @@ -1731,6 +1740,9 @@ static void xelpg_compute_exec(int fd, const unsigned char *kernel,
> uint64_t bind_output_addr = (user && user->output_addr) ? user->output_addr : ADDR_OUTPUT;
> int entries = ARRAY_SIZE(bo_dict);
>
> + if (user && (user->kernel || user->loop_kernel_duration))
> + igt_skip("Pipeline doesn't support loop_kernel\n");
> +
> bo_execenv_create(fd, &execenv, eci, user);
>
> /* Set dynamic sizes */
> @@ -1849,7 +1861,14 @@ static void xe2lpg_compute_exec(int fd, const unsigned char *kernel,
> OFFSET_KERNEL, 0, false,
> execenv.array_size);
>
> - bo_execenv_exec(&execenv, ADDR_BATCH);
> + if (user && user->loop_kernel_duration) {
> + bo_execenv_exec_async(&execenv, ADDR_BATCH);
> + igt_measured_usleep(user->loop_kernel_duration);
> + ((int *)bo_dict[4].data)[0] = MAGIC_LOOP_STOP;
> + bo_execenv_sync(&execenv);
> + user->skip_results_check = 1;
> + } else
> + bo_execenv_exec(&execenv, ADDR_BATCH);
>
> if (!user || (user && !user->skip_results_check))
> bo_check_square(input_data, output_data, execenv.array_size);
> diff --git a/lib/intel_compute.h b/lib/intel_compute.h
> index 412791d07..54a1c7f82 100644
> --- a/lib/intel_compute.h
> +++ b/lib/intel_compute.h
> @@ -63,6 +63,8 @@ struct user_execenv {
> uint64_t input_addr;
> /** @output_addr: override default address of the output array if provided */
> uint64_t output_addr;
> + /** @loop_kernel_duration: duration till kernel should execute in gpu **/
> + uint64_t loop_kernel_duration;
> };
>
> enum execenv_alloc_prefs {
> --
> 2.43.0
>
More information about the igt-dev
mailing list