[PATCH i-g-t v2 4/4] lib/intel_compute: refactor to remove code duplication

Francois Dugast francois.dugast at intel.com
Wed May 28 09:20:44 UTC 2025


On Thu, May 22, 2025 at 09:55:15AM +0200, Zbigniew Kempczyński wrote:
> Establishing input and output data looks same in all compute functions.
> Create a functions to avoid code duplication.
> 
> Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> Cc: Francois Dugast <francois.dugast at intel.com>

Reviewed-by: Francois Dugast <francois.dugast at intel.com>

> ---
>  lib/intel_compute.c | 110 ++++++++++++++++----------------------------
>  1 file changed, 40 insertions(+), 70 deletions(-)
> 
> diff --git a/lib/intel_compute.c b/lib/intel_compute.c
> index d47e2b08ef..06f831f68c 100644
> --- a/lib/intel_compute.c
> +++ b/lib/intel_compute.c
> @@ -122,6 +122,36 @@ static void bo_check_square(float *input, float *output, int size)
>  	}
>  }
>  
> +static float *get_input_data(const struct bo_execenv *execenv,
> +			     const struct user_execenv *user,
> +			     void *data)
> +{
> +	float *input_data;
> +
> +	if (user && user->input_addr) {
> +		input_data = from_user_pointer(user->input_addr);
> +	} else {
> +		input_data = (float *) data;
> +		bo_randomize(input_data, execenv->array_size);
> +	}
> +
> +	return input_data;
> +}
> +
> +static float *get_output_data(const struct bo_execenv *execenv,
> +			      const struct user_execenv *user,
> +			      void *data)
> +{
> +	float *output_data;
> +
> +	if (user && user->output_addr)
> +		output_data = from_user_pointer(user->output_addr);
> +	else
> +		output_data = (float *) data;
> +
> +	return output_data;
> +}
> +
>  static void bo_execenv_create(int fd, struct bo_execenv *execenv,
>  			      struct drm_xe_engine_class_instance *eci,
>  			      struct user_execenv *user)
> @@ -809,20 +839,8 @@ static void compute_exec(int fd, const unsigned char *kernel,
>  	create_indirect_data(bo_dict[3].data, bind_input_addr, bind_output_addr,
>  			     IS_DG1(devid) ? 0x200 : 0x40, execenv.array_size);
>  
> -	if (user && user->input_addr) {
> -		input_data = from_user_pointer(user->input_addr);
> -	} else {
> -		input_data = (float *) bo_dict[4].data;
> -		srand(time(NULL));
> -
> -		for (int i = 0; i < execenv.array_size; i++)
> -			input_data[i] = rand() / (float)RAND_MAX;
> -	}
> -
> -	if (user && user->output_addr)
> -		output_data = from_user_pointer(user->output_addr);
> -	else
> -		output_data = (float *) bo_dict[5].data;
> +	input_data = get_input_data(&execenv, user, bo_dict[4].data);
> +	output_data = get_output_data(&execenv, user, bo_dict[5].data);
>  
>  	if (IS_DG1(devid))
>  		dg1_compute_exec_compute(bo_dict[6].data,
> @@ -1109,20 +1127,8 @@ static void xehp_compute_exec(int fd, const unsigned char *kernel,
>  				  execenv.array_size);
>  	xehp_create_surface_state(bo_dict[7].data, bind_input_addr, bind_output_addr);
>  
> -	if (user && user->input_addr) {
> -		input_data = from_user_pointer(user->input_addr);
> -	} else {
> -		input_data = (float *) bo_dict[4].data;
> -		srand(time(NULL));
> -
> -		for (int i = 0; i < execenv.array_size; i++)
> -			input_data[i] = rand() / (float)RAND_MAX;
> -	}
> -
> -	if (user && user->output_addr)
> -		output_data = from_user_pointer(user->output_addr);
> -	else
> -		output_data = (float *) bo_dict[5].data;
> +	input_data = get_input_data(&execenv, user, bo_dict[4].data);
> +	output_data = get_output_data(&execenv, user, bo_dict[5].data);
>  
>  	xehp_compute_exec_compute(bo_dict[8].data,
>  				  ADDR_GENERAL_STATE_BASE,
> @@ -1334,20 +1340,8 @@ static void xehpc_compute_exec(int fd, const unsigned char *kernel,
>  	xehpc_create_indirect_data(bo_dict[1].data, bind_input_addr, bind_output_addr,
>  				   execenv.array_size);
>  
> -	if (user && user->input_addr) {
> -		input_data = from_user_pointer(user->input_addr);
> -	} else {
> -		input_data = (float *) bo_dict[2].data;
> -		srand(time(NULL));
> -
> -		for (int i = 0; i < execenv.array_size; i++)
> -			input_data[i] = rand() / (float)RAND_MAX;
> -	}
> -
> -	if (user && user->output_addr)
> -		output_data = from_user_pointer(user->output_addr);
> -	else
> -		output_data = (float *) bo_dict[3].data;
> +	input_data = get_input_data(&execenv, user, bo_dict[2].data);
> +	output_data = get_output_data(&execenv, user, bo_dict[3].data);
>  
>  	xehpc_compute_exec_compute(bo_dict[5].data,
>  				   ADDR_GENERAL_STATE_BASE,
> @@ -1742,20 +1736,8 @@ static void xelpg_compute_exec(int fd, const unsigned char *kernel,
>  				   execenv.array_size);
>  	xehp_create_surface_state(bo_dict[7].data, bind_input_addr, bind_output_addr);
>  
> -	if (user && user->input_addr) {
> -		input_data = from_user_pointer(user->input_addr);
> -	} else {
> -		input_data = (float *) bo_dict[4].data;
> -		srand(time(NULL));
> -
> -		for (int i = 0; i < execenv.array_size; i++)
> -			input_data[i] = rand() / (float)RAND_MAX;
> -	}
> -
> -	if (user && user->output_addr)
> -		output_data = from_user_pointer(user->output_addr);
> -	else
> -		output_data = (float *) bo_dict[5].data;
> +	input_data = get_input_data(&execenv, user, bo_dict[4].data);
> +	output_data = get_output_data(&execenv, user, bo_dict[5].data);
>  
>  	xelpg_compute_exec_compute(bo_dict[8].data,
>  				   ADDR_GENERAL_STATE_BASE,
> @@ -1849,20 +1831,8 @@ static void xe2lpg_compute_exec(int fd, const unsigned char *kernel,
>  				   execenv.array_size);
>  	xehp_create_surface_state(bo_dict[7].data, bind_input_addr, bind_output_addr);
>  
> -	if (user && user->input_addr) {
> -		input_data = from_user_pointer(user->input_addr);
> -	} else {
> -		input_data = (float *) bo_dict[4].data;
> -		srand(time(NULL));
> -
> -		for (int i = 0; i < execenv.array_size; i++)
> -			input_data[i] = rand() / (float)RAND_MAX;
> -	}
> -
> -	if (user && user->output_addr)
> -		output_data = from_user_pointer(user->output_addr);
> -	else
> -		output_data = (float *) bo_dict[5].data;
> +	input_data = get_input_data(&execenv, user, bo_dict[4].data);
> +	output_data = get_output_data(&execenv, user, bo_dict[5].data);
>  
>  	xe2lpg_compute_exec_compute(bo_dict[8].data,
>  				    ADDR_GENERAL_STATE_BASE,
> -- 
> 2.43.0
> 


More information about the igt-dev mailing list