[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