| //===-- 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"]>, |
| ]; |
| } |