2017-12-21 07:45:38 +08:00
|
|
|
/*
|
2023-09-06 19:30:16 +08:00
|
|
|
* Copyright (C) 2018-2023 Intel Corporation
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
2018-09-18 15:11:08 +08:00
|
|
|
* SPDX-License-Identifier: MIT
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/command_stream/command_stream_receiver.h"
|
2020-02-24 17:22:30 +08:00
|
|
|
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/built_ins/builtins_dispatch_builder.h"
|
|
|
|
#include "opencl/source/command_queue/command_queue_hw.h"
|
|
|
|
#include "opencl/source/command_queue/gpgpu_walker.h"
|
2019-02-27 18:39:32 +08:00
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
#include <new>
|
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
namespace NEO {
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
template <typename GfxFamily>
|
|
|
|
cl_int CommandQueueHw<GfxFamily>::enqueueKernel(
|
2021-03-09 00:27:24 +08:00
|
|
|
Kernel *pKernel,
|
2017-12-21 07:45:38 +08:00
|
|
|
cl_uint workDim,
|
|
|
|
const size_t *globalWorkOffsetIn,
|
|
|
|
const size_t *globalWorkSizeIn,
|
|
|
|
const size_t *localWorkSizeIn,
|
|
|
|
cl_uint numEventsInWaitList,
|
|
|
|
const cl_event *eventWaitList,
|
|
|
|
cl_event *event) {
|
|
|
|
|
2021-12-31 22:01:23 +08:00
|
|
|
if (workDim > device->getDeviceInfo().maxWorkItemDimensions) {
|
|
|
|
return CL_INVALID_WORK_DIMENSION;
|
|
|
|
}
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
size_t region[3] = {1, 1, 1};
|
|
|
|
size_t globalWorkOffset[3] = {0, 0, 0};
|
|
|
|
size_t workGroupSize[3] = {1, 1, 1};
|
2019-03-08 17:53:26 +08:00
|
|
|
size_t enqueuedLocalWorkSize[3] = {0, 0, 0};
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2021-03-09 00:27:24 +08:00
|
|
|
auto &kernel = *pKernel;
|
2021-03-22 23:26:03 +08:00
|
|
|
const auto &kernelInfo = kernel.getKernelInfo();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
if (!kernel.isPatched()) {
|
|
|
|
if (event) {
|
|
|
|
*event = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
return CL_INVALID_KERNEL_ARGS;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (kernel.isUsingSharedObjArgs()) {
|
|
|
|
kernel.resetSharedObjectsPatchAddresses();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool haveRequiredWorkGroupSize = false;
|
|
|
|
|
2020-10-27 22:16:42 +08:00
|
|
|
if (kernelInfo.kernelDescriptor.kernelAttributes.requiredWorkgroupSize[0] != 0) {
|
2017-12-21 07:45:38 +08:00
|
|
|
haveRequiredWorkGroupSize = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t remainder = 0;
|
2018-04-20 13:58:48 +08:00
|
|
|
size_t totalWorkItems = 1u;
|
2017-12-21 07:45:38 +08:00
|
|
|
const size_t *localWkgSizeToPass = localWorkSizeIn ? workGroupSize : nullptr;
|
2020-10-27 22:16:42 +08:00
|
|
|
size_t reqdWorkgroupSize[3] = {};
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
for (auto i = 0u; i < workDim; i++) {
|
|
|
|
region[i] = globalWorkSizeIn ? globalWorkSizeIn[i] : 0;
|
|
|
|
globalWorkOffset[i] = globalWorkOffsetIn
|
|
|
|
? globalWorkOffsetIn[i]
|
|
|
|
: 0;
|
|
|
|
|
|
|
|
if (localWorkSizeIn) {
|
|
|
|
if (haveRequiredWorkGroupSize) {
|
2020-10-27 22:16:42 +08:00
|
|
|
if (kernelInfo.kernelDescriptor.kernelAttributes.requiredWorkgroupSize[i] != localWorkSizeIn[i]) {
|
2017-12-21 07:45:38 +08:00
|
|
|
return CL_INVALID_WORK_GROUP_SIZE;
|
|
|
|
}
|
|
|
|
}
|
2018-08-13 21:58:57 +08:00
|
|
|
if (localWorkSizeIn[i] == 0) {
|
|
|
|
return CL_INVALID_WORK_GROUP_SIZE;
|
|
|
|
}
|
2019-01-30 21:09:58 +08:00
|
|
|
if (kernel.getAllowNonUniform()) {
|
2019-06-17 19:33:44 +08:00
|
|
|
workGroupSize[i] = std::min(localWorkSizeIn[i], std::max(static_cast<size_t>(1), globalWorkSizeIn[i]));
|
2019-01-30 21:09:58 +08:00
|
|
|
} else {
|
|
|
|
workGroupSize[i] = localWorkSizeIn[i];
|
|
|
|
}
|
2019-03-08 17:53:26 +08:00
|
|
|
enqueuedLocalWorkSize[i] = localWorkSizeIn[i];
|
2018-04-20 13:58:48 +08:00
|
|
|
totalWorkItems *= localWorkSizeIn[i];
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
remainder += region[i] % workGroupSize[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (remainder != 0 && !kernel.getAllowNonUniform()) {
|
|
|
|
return CL_INVALID_WORK_GROUP_SIZE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (haveRequiredWorkGroupSize) {
|
2020-10-27 22:16:42 +08:00
|
|
|
reqdWorkgroupSize[0] = kernelInfo.kernelDescriptor.kernelAttributes.requiredWorkgroupSize[0];
|
|
|
|
reqdWorkgroupSize[1] = kernelInfo.kernelDescriptor.kernelAttributes.requiredWorkgroupSize[1];
|
|
|
|
reqdWorkgroupSize[2] = kernelInfo.kernelDescriptor.kernelAttributes.requiredWorkgroupSize[2];
|
|
|
|
localWkgSizeToPass = reqdWorkgroupSize;
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
NullSurface s;
|
|
|
|
Surface *surfaces[] = {&s};
|
|
|
|
|
|
|
|
if (context->isProvidingPerformanceHints()) {
|
2021-03-22 23:26:03 +08:00
|
|
|
if (kernel.hasPrintfOutput()) {
|
2020-12-07 22:41:52 +08:00
|
|
|
context->providePerformanceHint(CL_CONTEXT_DIAGNOSTICS_LEVEL_NEUTRAL_INTEL, PRINTF_DETECTED_IN_KERNEL, kernelInfo.kernelDescriptor.kernelMetadata.kernelName.c_str());
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-07 22:41:52 +08:00
|
|
|
if (kernelInfo.builtinDispatchBuilder != nullptr) {
|
|
|
|
cl_int err = kernelInfo.builtinDispatchBuilder->validateDispatch(&kernel, workDim, Vec3<size_t>(region), Vec3<size_t>(workGroupSize), Vec3<size_t>(globalWorkOffset));
|
2017-12-21 07:45:38 +08:00
|
|
|
if (err != CL_SUCCESS)
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2020-12-07 22:41:52 +08:00
|
|
|
DBG_LOG(PrintDispatchParameters, "Kernel: ", kernelInfo.kernelDescriptor.kernelMetadata.kernelName,
|
2023-09-06 19:30:16 +08:00
|
|
|
", LWS: ", localWorkSizeIn ? localWorkSizeIn[0] : 0, ", ", localWorkSizeIn ? localWorkSizeIn[1] : 0, ", ", localWorkSizeIn ? localWorkSizeIn[2] : 0,
|
|
|
|
", GWS: ", globalWorkSizeIn[0], ", ", globalWorkSizeIn[1], ", ", globalWorkSizeIn[2],
|
|
|
|
", SIMD: ", kernelInfo.getMaxSimdSize());
|
2018-03-16 17:12:38 +08:00
|
|
|
|
2021-03-22 19:06:23 +08:00
|
|
|
if (totalWorkItems > kernel.getMaxKernelWorkGroupSize()) {
|
2018-04-20 13:58:48 +08:00
|
|
|
return CL_INVALID_WORK_GROUP_SIZE;
|
|
|
|
}
|
|
|
|
|
2022-03-21 19:08:43 +08:00
|
|
|
return enqueueHandler<CL_COMMAND_NDRANGE_KERNEL>(
|
2017-12-21 07:45:38 +08:00
|
|
|
surfaces,
|
|
|
|
false,
|
|
|
|
&kernel,
|
|
|
|
workDim,
|
|
|
|
globalWorkOffset,
|
|
|
|
region,
|
|
|
|
localWkgSizeToPass,
|
2019-03-08 17:53:26 +08:00
|
|
|
enqueuedLocalWorkSize,
|
2017-12-21 07:45:38 +08:00
|
|
|
numEventsInWaitList,
|
|
|
|
eventWaitList,
|
|
|
|
event);
|
|
|
|
}
|
2022-03-21 19:08:43 +08:00
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
} // namespace NEO
|