[PATCH i-g-t 3/5] lib/intel_compute: Allow the user to provide a custom compute kernel
Francois Dugast
francois.dugast at intel.com
Fri Feb 21 13:37:42 UTC 2025
Hi Zbigniew,
On Thu, Feb 13, 2025 at 08:00:06AM +0100, Zbigniew Kempczyński wrote:
> On Wed, Feb 05, 2025 at 11:17:04AM +0100, Francois Dugast wrote:
> > Allow the user to provide a custom compute kernel which will be used
> > instead of the default compute square one. This will be helpful to
> > try out corner cases which require a specific compute kernel.
> >
> > Signed-off-by: Francois Dugast <francois.dugast at intel.com>
> > ---
> > lib/intel_compute.c | 26 ++++++++++++++++++--------
> > lib/intel_compute.h | 2 ++
> > 2 files changed, 20 insertions(+), 8 deletions(-)
> >
> > diff --git a/lib/intel_compute.c b/lib/intel_compute.c
> > index e0776fb6d..a826d58c0 100644
> > --- a/lib/intel_compute.c
> > +++ b/lib/intel_compute.c
> > @@ -1770,6 +1770,8 @@ static bool __run_intel_compute_kernel(int fd,
> > unsigned int batch;
> > const struct intel_compute_kernels *kernels = intel_compute_square_kernels;
> > enum intel_driver driver = get_intel_driver(fd);
> > + const unsigned char *kernel;
> > + unsigned int kernel_size;
> >
> > for (batch = 0; batch < ARRAY_SIZE(intel_compute_batches); batch++) {
> > if (ip_ver == intel_compute_batches[batch].ip_ver)
> > @@ -1787,16 +1789,24 @@ static bool __run_intel_compute_kernel(int fd,
> > return false;
> > }
> >
> > - while (kernels->kernel) {
> > - if (ip_ver == kernels->ip_ver)
> > - break;
> > - kernels++;
> > + /* If the user provides a kernel, use it */
> > + if (user && user->kernel) {
> > + kernel = user->kernel;
> > + kernel_size = user->kernel_size;
> > + } else {
> > + while (kernels->kernel) {
> > + if (ip_ver == kernels->ip_ver)
> > + break;
> > + kernels++;
> > + }
> > + if (!kernels->kernel)
> > + return false;
> > + kernel = kernels->kernel;
> > + kernel_size = kernels->size;
>
> According to how we build pipeline indirect data we're limited to
> three arguments - *input, *output, count. Allowing the user to provide
> a custom kernel won't work unless type constraint will be met.
> I don't like this change, because someone who doesn't know how
> this work will start providing its own kernels will be surprised
> it doesn't work.
The way we statically build the pipeline indirect data is a good
balance of simplicity and flexibility, as we can test a lot even
with the constraint *input, *output, count.
More complex KMD tests will require simple specific kernels which
still comply with this constraint. For example the one below can
trigger a page fault at 0x10000 from the compute kernel context
so that we run other checks in KMD, all from IGT:
__kernel void square(__global float* input,
__global float* output,
const unsigned int count) {
int i = get_global_id(0);
const __global uint* addr = 0x10000;
output[i] = *addr;
}
This is the reason for allowing custom compute kernels. This way
we can leverage the existing lib/intel_compute infrastructure to
test corner cases. I believe having this possibility is far more
important than the risk of a user incorrectly expecting IGT to
provide a full "compute runtime" able to run any kernel.
Would you be fine if the doc of struct user_execenv::kernel would
make the constraint of *input, *output, count explicit?
If not, what about replacing "const unsigned char *kernel" with
an enum which would be used to obtain the right kernel from a
library of "approved" kernels in intel_compute_kernels.c?
Francois
>
> --
> Zbigniew
>
> > }
> > - if (!kernels->kernel)
> > - return false;
> >
> > - intel_compute_batches[batch].compute_exec(fd, kernels->kernel,
> > - kernels->size, eci, user);
> > + intel_compute_batches[batch].compute_exec(fd, kernel,
> > + kernel_size, eci, user);
> >
> > return true;
> > }
> > diff --git a/lib/intel_compute.h b/lib/intel_compute.h
> > index c4b4ee5e1..6096bb83a 100644
> > --- a/lib/intel_compute.h
> > +++ b/lib/intel_compute.h
> > @@ -35,6 +35,8 @@ struct intel_compute_kernels {
> >
> > struct user_execenv {
> > uint32_t vm;
> > + const unsigned char *kernel;
> > + unsigned int kernel_size;
> > };
> >
> > extern const struct intel_compute_kernels intel_compute_square_kernels[];
> > --
> > 2.43.0
> >
More information about the igt-dev
mailing list