[PATCH i-g-t, v2 09/11] lib/intel_compute: Fix enqueued local size starting with xelpg
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Tue Apr 15 05:23:32 UTC 2025
On Wed, Apr 02, 2025 at 05:20:07PM +0200, Francois Dugast wrote:
> The metadata of the compute kernel used for xelpg shows the arguments
> positions has changed. The enqueued_local_size comes at offset 52, right
> after the value of the "count" argument. Create a new create_indirect_data
> function matching this.
>
> Relevant part of the kernel metadata:
>
> - arg_type: arg_bypointer
> offset: 32
> size: 8
> arg_index: 0
> addrmode: stateless
> addrspace: global
> access_type: readwrite
> - arg_type: arg_bypointer
> offset: 40
> size: 8
> arg_index: 1
> addrmode: stateless
> addrspace: global
> access_type: readwrite
> - arg_type: arg_byvalue
> offset: 48
> size: 4
> arg_index: 2
> - arg_type: enqueued_local_size
> offset: 52
> size: 12
>
> Signed-off-by: Francois Dugast <francois.dugast at intel.com>
Are you using some compilation flags for ocloc? For MTL I've
different metadata layout.
--
Zbigniew
> ---
> lib/intel_compute.c | 31 ++++++++++++++++++++++++++++---
> 1 file changed, 28 insertions(+), 3 deletions(-)
>
> diff --git a/lib/intel_compute.c b/lib/intel_compute.c
> index d723ecd0c..9be3b0490 100644
> --- a/lib/intel_compute.c
> +++ b/lib/intel_compute.c
> @@ -1263,6 +1263,31 @@ static void xehpc_compute_exec(int fd, const unsigned char *kernel,
> bo_execenv_destroy(&execenv);
> }
>
> +static void xelpg_create_indirect_data(uint32_t *addr_bo_buffer_batch,
> + uint64_t addr_input,
> + uint64_t addr_output,
> + unsigned int loop_count)
> +{
> + int b = 0;
> +
> + addr_bo_buffer_batch[b++] = addr_input & 0xffffffff;
> + addr_bo_buffer_batch[b++] = addr_input >> 32;
> + addr_bo_buffer_batch[b++] = addr_output & 0xffffffff;
> + addr_bo_buffer_batch[b++] = addr_output >> 32;
> + addr_bo_buffer_batch[b++] = loop_count;
> + addr_bo_buffer_batch[b++] = 0x00000400; // Enqueued local size X
> + addr_bo_buffer_batch[b++] = 0x00000001; // Enqueued local size Y
> + addr_bo_buffer_batch[b++] = 0x00000001; // Enqueued local size Z
> + addr_bo_buffer_batch[b++] = 0x00000000;
> + addr_bo_buffer_batch[b++] = 0x00000000;
> + addr_bo_buffer_batch[b++] = 0x00000000;
> + addr_bo_buffer_batch[b++] = 0x00000000;
> + addr_bo_buffer_batch[b++] = 0x00000000;
> + addr_bo_buffer_batch[b++] = 0x00000000;
> + addr_bo_buffer_batch[b++] = 0x00000000;
> + addr_bo_buffer_batch[b++] = 0x00000000;
> +}
> +
> static void xelpg_compute_exec_compute(uint32_t *addr_bo_buffer_batch,
> uint64_t addr_general_state_base,
> uint64_t addr_surface_state_base,
> @@ -1595,7 +1620,7 @@ static void xelpg_compute_exec(int fd, const unsigned char *kernel,
>
> create_dynamic_state(bo_dict[1].data, OFFSET_KERNEL);
> xehp_create_surface_state(bo_dict[2].data, ADDR_INPUT, ADDR_OUTPUT);
> - xehp_create_indirect_data(bo_dict[3].data, ADDR_INPUT, ADDR_OUTPUT, SIZE_DATA);
> + xelpg_create_indirect_data(bo_dict[3].data, ADDR_INPUT, ADDR_OUTPUT, SIZE_DATA);
> xehp_create_surface_state(bo_dict[7].data, ADDR_INPUT, ADDR_OUTPUT);
>
> input_data = (float *) bo_dict[4].data;
> @@ -1688,7 +1713,7 @@ static void xe2lpg_compute_exec(int fd, const unsigned char *kernel,
> memcpy(bo_dict[0].data, kernel, size);
> create_dynamic_state(bo_dict[1].data, OFFSET_KERNEL);
> xehp_create_surface_state(bo_dict[2].data, ADDR_INPUT, ADDR_OUTPUT);
> - xehp_create_indirect_data(bo_dict[3].data, ADDR_INPUT, ADDR_OUTPUT, SIZE_DATA);
> + xelpg_create_indirect_data(bo_dict[3].data, ADDR_INPUT, ADDR_OUTPUT, SIZE_DATA);
> xehp_create_surface_state(bo_dict[7].data, ADDR_INPUT, ADDR_OUTPUT);
>
> input_data = (float *) bo_dict[4].data;
> @@ -2011,7 +2036,7 @@ static void xe2lpg_compute_preempt_exec(int fd, const unsigned char *long_kernel
>
> create_dynamic_state(bo_dict_short[1].data, OFFSET_KERNEL);
> xehp_create_surface_state(bo_dict_short[2].data, ADDR_INPUT, ADDR_OUTPUT);
> - xehp_create_indirect_data(bo_dict_short[3].data, ADDR_INPUT, ADDR_OUTPUT, SIZE_DATA);
> + xelpg_create_indirect_data(bo_dict_short[3].data, ADDR_INPUT, ADDR_OUTPUT, SIZE_DATA);
> xehp_create_surface_state(bo_dict_short[7].data, ADDR_INPUT, ADDR_OUTPUT);
>
> input_data = (float *) bo_dict_long[4].data;
> --
> 2.43.0
>
More information about the igt-dev
mailing list