[PATCH i-g-t, v3 6/6] lib/intel_compute: Allow the user to override input and output addresses
Francois Dugast
francois.dugast at intel.com
Wed Feb 26 11:24:07 UTC 2025
The user can specify custom GPU addresses to be used for the input and
output arrays, otherwise default values will be used. If a compatible
VM is also provided in user_execenv, the user can even create its own
arrays and pass their addresses in user_execenv, for example with SVM.
Signed-off-by: Francois Dugast <francois.dugast at intel.com>
---
lib/intel_compute.c | 124 +++++++++++++++++++++++++++++++-------------
lib/intel_compute.h | 4 ++
2 files changed, 91 insertions(+), 37 deletions(-)
diff --git a/lib/intel_compute.c b/lib/intel_compute.c
index 4818c0ff7..a789755b7 100644
--- a/lib/intel_compute.c
+++ b/lib/intel_compute.c
@@ -708,6 +708,8 @@ static void compute_exec(int fd, const unsigned char *kernel,
};
struct bo_execenv execenv;
float *input_data, *output_data;
+ uint64_t bind_input_addr = (user && user->input_addr) ? user->input_addr : ADDR_INPUT;
+ uint64_t bind_output_addr = (user && user->output_addr) ? user->output_addr : ADDR_OUTPUT;
uint16_t devid = intel_get_drm_devid(fd);
bo_execenv_create(fd, &execenv, eci, user);
@@ -719,16 +721,24 @@ static void compute_exec(int fd, const unsigned char *kernel,
memcpy(bo_dict[0].data, kernel, size);
create_dynamic_state(bo_dict[1].data, OFFSET_KERNEL);
- create_surface_state(bo_dict[2].data, ADDR_INPUT, ADDR_OUTPUT);
- create_indirect_data(bo_dict[3].data, ADDR_INPUT, ADDR_OUTPUT,
+ create_surface_state(bo_dict[2].data, bind_input_addr, bind_output_addr);
+ create_indirect_data(bo_dict[3].data, bind_input_addr, bind_output_addr,
IS_DG1(devid) ? 0x200 : 0x40, SIZE_DATA);
- input_data = (float *) bo_dict[4].data;
- output_data = (float *) bo_dict[5].data;
- srand(time(NULL));
+ if (user && user->input_addr) {
+ input_data = (float *) user->input_addr;
+ } else {
+ input_data = (float *) bo_dict[4].data;
+ srand(time(NULL));
- for (int i = 0; i < SIZE_DATA; i++)
- input_data[i] = rand() / (float)RAND_MAX;
+ for (int i = 0; i < SIZE_DATA; i++)
+ input_data[i] = rand() / (float)RAND_MAX;
+ }
+
+ if (user && user->output_addr)
+ output_data = (float *) user->output_addr;
+ else
+ output_data = (float *) bo_dict[5].data;
if (IS_DG1(devid))
dg1_compute_exec_compute(bo_dict[6].data,
@@ -995,6 +1005,8 @@ static void xehp_compute_exec(int fd, const unsigned char *kernel,
};
struct bo_execenv execenv;
float *input_data, *output_data;
+ uint64_t bind_input_addr = (user && user->input_addr) ? user->input_addr : ADDR_INPUT;
+ uint64_t bind_output_addr = (user && user->output_addr) ? user->output_addr : ADDR_OUTPUT;
bo_execenv_create(fd, &execenv, eci, user);
@@ -1005,16 +1017,24 @@ static void xehp_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);
- xehp_create_surface_state(bo_dict[7].data, ADDR_INPUT, ADDR_OUTPUT);
+ xehp_create_surface_state(bo_dict[2].data, bind_input_addr, bind_output_addr);
+ xehp_create_indirect_data(bo_dict[3].data, bind_input_addr, bind_output_addr, SIZE_DATA);
+ xehp_create_surface_state(bo_dict[7].data, bind_input_addr, bind_output_addr);
- input_data = (float *) bo_dict[4].data;
- output_data = (float *) bo_dict[5].data;
- srand(time(NULL));
+ if (user && user->input_addr) {
+ input_data = (float *) user->input_addr;
+ } else {
+ input_data = (float *) bo_dict[4].data;
+ srand(time(NULL));
- for (int i = 0; i < SIZE_DATA; i++)
- input_data[i] = rand() / (float)RAND_MAX;
+ for (int i = 0; i < SIZE_DATA; i++)
+ input_data[i] = rand() / (float)RAND_MAX;
+ }
+
+ if (user && user->output_addr)
+ output_data = (float *) user->output_addr;
+ else
+ output_data = (float *) bo_dict[5].data;
xehp_compute_exec_compute(bo_dict[8].data,
ADDR_GENERAL_STATE_BASE,
@@ -1209,6 +1229,8 @@ static void xehpc_compute_exec(int fd, const unsigned char *kernel,
};
struct bo_execenv execenv;
float *input_data, *output_data;
+ uint64_t bind_input_addr = (user && user->input_addr) ? user->input_addr : ADDR_INPUT;
+ uint64_t bind_output_addr = (user && user->output_addr) ? user->output_addr : ADDR_OUTPUT;
bo_execenv_create(fd, &execenv, eci, user);
@@ -1218,14 +1240,22 @@ static void xehpc_compute_exec(int fd, const unsigned char *kernel,
bo_execenv_bind(&execenv, bo_dict, XEHPC_BO_DICT_ENTRIES);
memcpy(bo_dict[0].data, kernel, size);
- xehpc_create_indirect_data(bo_dict[1].data, ADDR_INPUT, ADDR_OUTPUT, SIZE_DATA);
+ xehpc_create_indirect_data(bo_dict[1].data, bind_input_addr, bind_output_addr, SIZE_DATA);
- input_data = (float *) bo_dict[2].data;
- output_data = (float *) bo_dict[3].data;
- srand(time(NULL));
+ if (user && user->input_addr) {
+ input_data = (float *) user->input_addr;
+ } else {
+ input_data = (float *) bo_dict[2].data;
+ srand(time(NULL));
- for (int i = 0; i < SIZE_DATA; i++)
- input_data[i] = rand() / (float)RAND_MAX;
+ for (int i = 0; i < SIZE_DATA; i++)
+ input_data[i] = rand() / (float)RAND_MAX;
+ }
+
+ if (user && user->output_addr)
+ output_data = (float *) user->output_addr;
+ else
+ output_data = (float *) bo_dict[3].data;
xehpc_compute_exec_compute(bo_dict[5].data,
ADDR_GENERAL_STATE_BASE,
@@ -1572,6 +1602,8 @@ static void xelpg_compute_exec(int fd, const unsigned char *kernel,
struct bo_execenv execenv;
float *input_data, *output_data;
+ uint64_t bind_input_addr = (user && user->input_addr) ? user->input_addr : ADDR_INPUT;
+ uint64_t bind_output_addr = (user && user->output_addr) ? user->output_addr : ADDR_OUTPUT;
bo_execenv_create(fd, &execenv, eci, user);
@@ -1583,16 +1615,24 @@ static void xelpg_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);
- xehp_create_surface_state(bo_dict[7].data, ADDR_INPUT, ADDR_OUTPUT);
+ xehp_create_surface_state(bo_dict[2].data, bind_input_addr, bind_output_addr);
+ xehp_create_indirect_data(bo_dict[3].data, bind_input_addr, bind_output_addr, SIZE_DATA);
+ xehp_create_surface_state(bo_dict[7].data, bind_input_addr, bind_output_addr);
- input_data = (float *) bo_dict[4].data;
- output_data = (float *) bo_dict[5].data;
- srand(time(NULL));
+ if (user && user->input_addr) {
+ input_data = (float *) user->input_addr;
+ } else {
+ input_data = (float *) bo_dict[4].data;
+ srand(time(NULL));
- for (int i = 0; i < SIZE_DATA; i++)
- input_data[i] = rand() / (float)RAND_MAX;
+ for (int i = 0; i < SIZE_DATA; i++)
+ input_data[i] = rand() / (float)RAND_MAX;
+ }
+
+ if (user && user->output_addr)
+ output_data = (float *) user->output_addr;
+ else
+ output_data = (float *) bo_dict[5].data;
xelpg_compute_exec_compute(bo_dict[8].data,
ADDR_GENERAL_STATE_BASE,
@@ -1665,6 +1705,8 @@ static void xe2lpg_compute_exec(int fd, const unsigned char *kernel,
struct bo_execenv execenv;
float *input_data, *output_data;
+ uint64_t bind_input_addr = (user && user->input_addr) ? user->input_addr : ADDR_INPUT;
+ uint64_t bind_output_addr = (user && user->output_addr) ? user->output_addr : ADDR_OUTPUT;
bo_execenv_create(fd, &execenv, eci, user);
@@ -1675,16 +1717,24 @@ 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);
- xehp_create_surface_state(bo_dict[7].data, ADDR_INPUT, ADDR_OUTPUT);
+ xehp_create_surface_state(bo_dict[2].data, bind_input_addr, bind_output_addr);
+ xehp_create_indirect_data(bo_dict[3].data, bind_input_addr, bind_output_addr, SIZE_DATA);
+ xehp_create_surface_state(bo_dict[7].data, bind_input_addr, bind_output_addr);
- input_data = (float *) bo_dict[4].data;
- output_data = (float *) bo_dict[5].data;
- srand(time(NULL));
+ if (user && user->input_addr) {
+ input_data = (float *) user->input_addr;
+ } else {
+ input_data = (float *) bo_dict[4].data;
+ srand(time(NULL));
- for (int i = 0; i < SIZE_DATA; i++)
- input_data[i] = rand() / (float)RAND_MAX;
+ for (int i = 0; i < SIZE_DATA; i++)
+ input_data[i] = rand() / (float)RAND_MAX;
+ }
+
+ if (user && user->output_addr)
+ output_data = (float *) user->output_addr;
+ else
+ output_data = (float *) bo_dict[5].data;
xe2lpg_compute_exec_compute(bo_dict[8].data,
ADDR_GENERAL_STATE_BASE,
diff --git a/lib/intel_compute.h b/lib/intel_compute.h
index dc0fe2ec2..9abef3084 100644
--- a/lib/intel_compute.h
+++ b/lib/intel_compute.h
@@ -55,6 +55,10 @@ struct user_execenv {
unsigned int kernel_size;
/** @skip_results_check: do not verify correctness of the results if true */
bool skip_results_check;
+ /** @input_addr: override default address of the input array if provided */
+ uint64_t input_addr;
+ /** @output_addr: override default address of the output array if provided */
+ uint64_t output_addr;
};
extern const struct intel_compute_kernels intel_compute_square_kernels[];
--
2.43.0
More information about the igt-dev
mailing list