blob: 06778105e01947551d67684fb5736d9b440657d6 [file] [edit]
//===-- Kernel.td - Kernel definitions for Offload ---------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file contains Offload API definitions related to kernels
//
//===----------------------------------------------------------------------===//
def ol_kernel_launch_size_args_t : Struct {
let desc = "Size-related arguments for a kernel launch.";
let members = [
StructMember<"size_t", "Dimensions", "Number of work dimensions">,
StructMember<"struct ol_dimensions_t", "NumGroups", "Number of work groups in each dimension">,
StructMember<"struct ol_dimensions_t", "GroupSize", "Size of a work group in each dimension">,
StructMember<"size_t", "DynSharedMemory", "Size of dynamic shared memory in bytes.">
];
}
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";
let is_typed = 1;
let etors =
[TaggedEtor<"none", "void *", "Used for null terminating property array">,
TaggedEtor<"is_cooperative ", "bool *", "Cooperative kernel launch">];
}
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 arguments specified as an array of pointers and sizes.";
let details = [
"If a queue is not specified, kernel execution happens synchronously",
"Each element of ArgPtrs points to the value of the corresponding kernel argument",
"Each element of ArgSizes specifies the size in bytes of the corresponding argument",
"NumArgs must match the number of arguments expected by the kernel",
"ArgPtrs and ArgSizes must both be NULL (when NumArgs == 0) or both be non-NULL"
];
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 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>,
Param<"size_t", "NumArgs", "number of kernel arguments", PARAM_IN>,
Param<"void**", "ArgPtrs", "array of pointers, each pointing to a kernel argument value", PARAM_IN_OPTIONAL>,
Param<"const size_t*", "ArgSizes", "array of kernel argument sizes", PARAM_IN_OPTIONAL>,
];
let returns = [
Return<"OL_ERRC_INVALID_ARGUMENT", [
"`(ArgPtrs == NULL) != (ArgSizes == NULL)`",
"`NumArgs > 0 && (ArgPtrs == NULL || ArgSizes == NULL)`",
"NumArgs does not match the number of arguments expected by the kernel",
]>,
Return<"OL_ERRC_INVALID_DEVICE", ["If Queue is non-null but does not belong to Device"]>,
Return<"OL_ERRC_SYMBOL_KIND", ["The provided symbol is not a kernel"]>,
];
}
def olCalculateOptimalOccupancy : Function {
let desc = "Given dynamic memory size, query the device for a workgroup size that will result in optimal occupancy.";
let details = [
"For most devices, this will be the largest workgroup size that will result in all work items fitting on the device at once.",
];
let params = [
Param<"ol_device_handle_t", "Device", "device intended to run the kernel", PARAM_IN>,
Param<"ol_symbol_handle_t", "Kernel", "handle of the kernel", PARAM_IN>,
Param<"size_t", "SharedMemory", "dynamic shared memory required per work item in bytes", PARAM_IN>,
Param<"size_t*", "GroupSize", "optimal block size", PARAM_OUT>
];
let returns = [
Return<"OL_ERRC_SYMBOL_KIND", ["The provided symbol is not a kernel"]>,
Return<"OL_ERRC_UNSUPPORTED", ["The backend cannot provide this information"]>,
];
}
def olGetKernelMaxCooperativeGroupCount : Function {
let desc = "Query the maximum number of work groups that can be launched "
"cooperatively for a kernel.";
let details =
["This function returns the maximum number of work groups that can "
"participate in a cooperative launch for the given kernel.",
"The maximum count depends on the work group size and dynamic shared "
"memory usage.",
];
let params = [Param<"ol_device_handle_t", "Device",
"device intended to run the kernel", PARAM_IN>,
Param<"ol_symbol_handle_t", "Kernel", "handle of the kernel",
PARAM_IN>,
Param<"const ol_kernel_launch_size_args_t*", "LaunchSizeArgs",
"launch size parameters", PARAM_IN>,
Param<"uint32_t*", "MaxGroupCount",
"maximum number of cooperative groups", PARAM_OUT>];
let returns =
[Return<"OL_ERRC_SYMBOL_KIND", ["The provided symbol is not a kernel"]>,
Return<
"OL_ERRC_UNSUPPORTED", ["Cooperative launch is not supported or "
"backend cannot provide this information"]>,
];
}