[llvm] [offload] add properties to the olLaunchKernel (PR #176742)
Ćukasz Plewa via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 19 04:17:07 PST 2026
https://github.com/lplewa created https://github.com/llvm/llvm-project/pull/176742
This patch adds properties argument to olLaunchKernel that can be used to implement extensions
>From 36fe4935ec5b8dda9e5fbbf2469d423694b6f059 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Plewa?= <lukasz.plewa at intel.com>
Date: Thu, 18 Dec 2025 14:28:10 +0100
Subject: [PATCH] [offload] add properties to the olLaunchKernel
This patch adds properties argument to olLaunchKernel that can be used
to implement extensions
---
offload/liboffload/API/Kernel.td | 48 +++++++++++++++----
offload/liboffload/src/OffloadImpl.cpp | 16 ++++++-
.../level_zero/src/L0Kernel.cpp | 28 ++++++++---
.../Conformance/lib/DeviceContext.cpp | 2 +-
4 files changed, 78 insertions(+), 16 deletions(-)
diff --git a/offload/liboffload/API/Kernel.td b/offload/liboffload/API/Kernel.td
index 2f5692a19d712..be79f7d4da519 100644
--- a/offload/liboffload/API/Kernel.td
+++ b/offload/liboffload/API/Kernel.td
@@ -20,20 +20,52 @@ def ol_kernel_launch_size_args_t : Struct {
];
}
+def OL_KERNEL_LAUNCH_PROP_END : Macro {
+ let desc = "last element of the ol_kernel_launch_prop_t array";
+ let value = "{OL_KERNEL_LAUNCH_PROP_TYPE_NONE, NULL}";
+}
+
+def ol_kernel_launch_prop_type_t : Enum {
+ let desc = "Defines structure type";
+ // TODO: Convert to typed enum
+ // let is_typed = 1;
+ let etors = [Etor<"none", "Used for null terminating property array">,
+ Etor<"size", "Array of the arguments sizes.">,
+ ];
+}
+
+def ol_kernel_launch_prop_t : Struct {
+ let desc = "Optional properties for kernel launch.";
+ let members = [StructMember<"ol_kernel_launch_prop_type_t", "type",
+ "Type of the data field">,
+ StructMember<"void *", "data",
+ "Pointer to property-specific data.">];
+}
+
def olLaunchKernel : Function {
let desc = "Enqueue a kernel launch with the specified size and parameters.";
let details = [
"If a queue is not specified, kernel execution happens synchronously",
"ArgumentsData may be set to NULL (to indicate no parameters)"
];
- let params = [
- Param<"ol_queue_handle_t", "Queue", "handle of the queue", PARAM_IN_OPTIONAL>,
- Param<"ol_device_handle_t", "Device", "handle of the device to execute on", PARAM_IN>,
- Param<"ol_symbol_handle_t", "Kernel", "handle of the kernel", PARAM_IN>,
- Param<"const void*", "ArgumentsData", "pointer to the kernel argument struct", PARAM_IN_OPTIONAL>,
- Param<"size_t", "ArgumentsSize", "size of the kernel argument struct", PARAM_IN>,
- Param<"const ol_kernel_launch_size_args_t*", "LaunchSizeArgs", "pointer to the struct containing launch size parameters", PARAM_IN>,
- ];
+ let params =
+ [Param<"ol_queue_handle_t", "Queue", "handle of the queue",
+ PARAM_IN_OPTIONAL>,
+ Param<"ol_device_handle_t", "Device",
+ "handle of the device to execute on", PARAM_IN>,
+ Param<"ol_symbol_handle_t", "Kernel", "handle of the kernel",
+ PARAM_IN>,
+ Param<"const void*", "ArgumentsData",
+ "pointer to the kernel argument struct", PARAM_IN_OPTIONAL>,
+ Param<"size_t", "ArgumentsSize", "size of the kernel argument struct",
+ PARAM_IN>,
+ Param<"const ol_kernel_launch_size_args_t*", "LaunchSizeArgs",
+ "pointer to the struct containing launch size parameters",
+ PARAM_IN>,
+ Param<"const ol_kernel_launch_prop_t*", "Properties",
+ "Array of optional properties, last element must be "
+ "OL_KERNEL_LAUNCH_PROP_END",
+ PARAM_IN_OPTIONAL>];
let returns = [
Return<"OL_ERRC_INVALID_ARGUMENT", ["`ArgumentsSize > 0 && ArgumentsData == NULL`"]>,
Return<"OL_ERRC_INVALID_DEVICE", ["If Queue is non-null but does not belong to Device"]>,
diff --git a/offload/liboffload/src/OffloadImpl.cpp b/offload/liboffload/src/OffloadImpl.cpp
index 4a4f6652054a1..4f08e61ed9471 100644
--- a/offload/liboffload/src/OffloadImpl.cpp
+++ b/offload/liboffload/src/OffloadImpl.cpp
@@ -1075,7 +1075,8 @@ Error olCalculateOptimalOccupancy_impl(ol_device_handle_t Device,
Error olLaunchKernel_impl(ol_queue_handle_t Queue, ol_device_handle_t Device,
ol_symbol_handle_t Kernel, const void *ArgumentsData,
size_t ArgumentsSize,
- const ol_kernel_launch_size_args_t *LaunchSizeArgs) {
+ const ol_kernel_launch_size_args_t *LaunchSizeArgs,
+ const ol_kernel_launch_prop_t *Properties) {
auto *DeviceImpl = Device->Device;
if (Queue && Device != Queue->Device) {
return createOffloadError(
@@ -1098,6 +1099,19 @@ Error olLaunchKernel_impl(ol_queue_handle_t Queue, ol_device_handle_t Device,
LaunchArgs.ThreadLimit[2] = LaunchSizeArgs->GroupSize.z;
LaunchArgs.DynCGroupMem = LaunchSizeArgs->DynSharedMemory;
+ while (Properties && Properties->type != OL_KERNEL_LAUNCH_PROP_TYPE_NONE) {
+ switch (Properties->type) {
+ case OL_KERNEL_LAUNCH_PROP_TYPE_SIZE:
+ LaunchArgs.ArgSizes = const_cast<int64_t *>(
+ reinterpret_cast<const int64_t *>(Properties->data));
+ break;
+ default:
+ return createOffloadError(ErrorCode::INVALID_ENUMERATION,
+ "olLaunchKernel property enum '%i' is invalid",
+ Properties->type);
+ }
+ Properties++;
+ }
KernelLaunchParamsTy Params;
Params.Data = const_cast<void *>(ArgumentsData);
Params.Size = ArgumentsSize;
diff --git a/offload/plugins-nextgen/level_zero/src/L0Kernel.cpp b/offload/plugins-nextgen/level_zero/src/L0Kernel.cpp
index 5659d0c46724b..e3d4b3a6c400e 100644
--- a/offload/plugins-nextgen/level_zero/src/L0Kernel.cpp
+++ b/offload/plugins-nextgen/level_zero/src/L0Kernel.cpp
@@ -421,7 +421,7 @@ Error L0KernelTy::launchImpl(GenericDeviceTy &GenericDevice,
auto zeKernel = getZeKernel();
auto DeviceId = l0Device.getDeviceId();
- int32_t NumArgs = KernelArgs.NumArgs;
+
INFO(OMP_INFOTYPE_PLUGIN_KERNEL, DeviceId, "Launching kernel " DPxMOD "...\n",
DPxPTR(zeKernel));
@@ -447,17 +447,33 @@ Error L0KernelTy::launchImpl(GenericDeviceTy &GenericDevice,
return Err;
// Set kernel arguments.
- for (int32_t I = 0; I < NumArgs; I++) {
+ char *Arg = static_cast<char *>(LaunchParams.Data);
+
+ size_t NumArgs = 0;
+ size_t TotalArgSize = 0;
+
+ if (LaunchParams.Size != 0 && KernelArgs.ArgSizes == nullptr) {
+ return Plugin::error(ErrorCode::INVALID_ARGUMENT,
+ "Level zero requires kernel argument sizes.");
+ }
+
+ while (TotalArgSize < LaunchParams.Size) {
+ TotalArgSize += KernelArgs.ArgSizes[NumArgs];
+ NumArgs++;
+ }
+
+ for (size_t I = 0; I < NumArgs; I++) {
// Scope code to ease integration with downstream custom code.
{
- void *Arg = (static_cast<void **>(LaunchParams.Data))[I];
- CALL_ZE_RET_ERROR(zeKernelSetArgumentValue, zeKernel, I, sizeof(Arg),
- Arg == nullptr ? nullptr : &Arg);
+ CALL_ZE_RET_ERROR(zeKernelSetArgumentValue, zeKernel, I,
+ KernelArgs.ArgSizes[I], Arg);
+
INFO(OMP_INFOTYPE_PLUGIN_KERNEL, DeviceId,
- "Kernel Pointer argument %" PRId32 " (value: " DPxMOD
+ "Kernel Pointer argument %zu (value: " DPxMOD
") was set successfully for device %s.\n",
I, DPxPTR(Arg), IdStr);
}
+ Arg += KernelArgs.ArgSizes[I];
}
if (auto Err = setIndirectFlags(l0Device, KEnv))
diff --git a/offload/unittests/Conformance/lib/DeviceContext.cpp b/offload/unittests/Conformance/lib/DeviceContext.cpp
index 6c3425f1e17c2..6e3a4fe9097d2 100644
--- a/offload/unittests/Conformance/lib/DeviceContext.cpp
+++ b/offload/unittests/Conformance/lib/DeviceContext.cpp
@@ -296,7 +296,7 @@ void DeviceContext::launchKernelImpl(
LaunchSizeArgs.DynSharedMemory = 0;
OL_CHECK(olLaunchKernel(nullptr, DeviceHandle, KernelHandle, KernelArgs,
- KernelArgsSize, &LaunchSizeArgs));
+ KernelArgsSize, &LaunchSizeArgs, NULL));
}
[[nodiscard]] llvm::StringRef DeviceContext::getName() const noexcept {
More information about the llvm-commits
mailing list