[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