Skip to content

Commit 0b141ed

Browse files
Add KernelExecutionType
Add possibility to set Kernel execution type via clSetKernelExecInfo. Change-Id: I2de0bf4e067921440e34e14c6975f640d3f47162 Signed-off-by: Filip Hazubski <[email protected]>
1 parent 257275f commit 0b141ed

File tree

9 files changed

+140
-2
lines changed

9 files changed

+140
-2
lines changed

public/cl_ext_private.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2017-2019 Intel Corporation
2+
* Copyright (C) 2017-2020 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -16,6 +16,14 @@
1616

1717
#define CL_DEVICE_DRIVER_VERSION_INTEL_NEO1 0x454E4831 // Driver version is ENH1
1818

19+
/*********************************************
20+
* Internal only kernel exec info properties *
21+
*********************************************/
22+
23+
#define CL_KERNEL_EXEC_INFO_KERNEL_TYPE_INTEL 0x1000C
24+
#define CL_KERNEL_EXEC_INFO_DEFAULT_TYPE_INTEL 0x1000D
25+
#define CL_KERNEL_EXEC_INFO_CONCURRENT_TYPE_INTEL 0x1000E
26+
1927
/*********************************
2028
* cl_intel_debug_info extension *
2129
*********************************/
@@ -41,6 +49,7 @@
4149
* Internal only cl types *
4250
**************************/
4351

52+
using cl_execution_info_kernel_type_intel = cl_uint;
4453
using cl_mem_alloc_flags_intel = cl_bitfield;
4554
using cl_mem_properties_intel = cl_bitfield;
4655
using cl_mem_flags_intel = cl_mem_flags;

runtime/api/api.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4468,6 +4468,18 @@ cl_int CL_API_CALL clSetKernelExecInfo(cl_kernel kernel,
44684468
TRACING_EXIT(clSetKernelExecInfo, &retVal);
44694469
return retVal;
44704470
}
4471+
case CL_KERNEL_EXEC_INFO_KERNEL_TYPE_INTEL: {
4472+
if (paramValueSize != sizeof(cl_execution_info_kernel_type_intel) ||
4473+
paramValue == nullptr) {
4474+
retVal = CL_INVALID_VALUE;
4475+
TRACING_EXIT(clSetKernelExecInfo, &retVal);
4476+
return retVal;
4477+
}
4478+
auto kernelType = *static_cast<const cl_execution_info_kernel_type_intel *>(paramValue);
4479+
retVal = pKernel->setKernelExecutionType(kernelType);
4480+
TRACING_EXIT(clSetKernelExecInfo, &retVal);
4481+
return retVal;
4482+
}
44714483
default: {
44724484
retVal = CL_INVALID_VALUE;
44734485
TRACING_EXIT(clSetKernelExecInfo, &retVal);

runtime/kernel/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Copyright (C) 2018-2019 Intel Corporation
2+
# Copyright (C) 2018-2020 Intel Corporation
33
#
44
# SPDX-License-Identifier: MIT
55
#
@@ -13,6 +13,7 @@ set(RUNTIME_SRCS_KERNEL
1313
${CMAKE_CURRENT_SOURCE_DIR}/kernel.cpp
1414
${CMAKE_CURRENT_SOURCE_DIR}/kernel.h
1515
${CMAKE_CURRENT_SOURCE_DIR}/kernel.inl
16+
${CMAKE_CURRENT_SOURCE_DIR}/kernel_execution_type.h
1617
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/kernel_extra.cpp
1718
)
1819
target_sources(${NEO_STATIC_LIB_NAME} PRIVATE ${RUNTIME_SRCS_KERNEL})

runtime/kernel/kernel.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,21 @@ void Kernel::clearUnifiedMemoryExecInfo() {
984984
kernelUnifiedMemoryGfxAllocations.clear();
985985
}
986986

987+
cl_int Kernel::setKernelExecutionType(cl_execution_info_kernel_type_intel executionType) {
988+
switch (executionType) {
989+
case CL_KERNEL_EXEC_INFO_DEFAULT_TYPE_INTEL:
990+
this->executionType = KernelExecutionType::Default;
991+
break;
992+
case CL_KERNEL_EXEC_INFO_CONCURRENT_TYPE_INTEL:
993+
this->executionType = KernelExecutionType::Concurrent;
994+
break;
995+
default: {
996+
return CL_INVALID_VALUE;
997+
}
998+
}
999+
return CL_SUCCESS;
1000+
}
1001+
9871002
uint32_t Kernel::getMaxWorkGroupCount(const cl_uint workDim, const size_t *localWorkSize) const {
9881003
auto &hardwareInfo = getDevice().getHardwareInfo();
9891004
auto executionEnvironment = kernelInfo.patchInfo.executionEnvironment;

runtime/kernel/kernel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "runtime/device_queue/device_queue.h"
1919
#include "runtime/helpers/base_object.h"
2020
#include "runtime/helpers/properties_helper.h"
21+
#include "runtime/kernel/kernel_execution_type.h"
2122
#include "runtime/program/kernel_info.h"
2223
#include "runtime/program/program.h"
2324

@@ -396,6 +397,7 @@ class Kernel : public BaseObject<_cl_kernel> {
396397

397398
bool areStatelessWritesUsed() { return containsStatelessWrites; }
398399
int setKernelThreadArbitrationPolicy(uint32_t propertyValue);
400+
cl_int setKernelExecutionType(cl_execution_info_kernel_type_intel executionType);
399401
void setThreadArbitrationPolicy(uint32_t policy) {
400402
this->threadArbitrationPolicy = policy;
401403
}
@@ -523,6 +525,7 @@ class Kernel : public BaseObject<_cl_kernel> {
523525
uint32_t startOffset = 0;
524526
uint32_t statelessUncacheableArgsCount = 0;
525527
uint32_t threadArbitrationPolicy = ThreadArbitrationPolicy::NotPresent;
528+
KernelExecutionType executionType = KernelExecutionType::Default;
526529

527530
std::vector<PatchInfoData> patchInfoDataList;
528531
std::unique_ptr<ImageTransformer> imageTransformer;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright (C) 2020 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#pragma once
9+
10+
namespace NEO {
11+
enum class KernelExecutionType {
12+
Default = 0x0u,
13+
Concurrent = 0x1u
14+
};
15+
} // namespace NEO

unit_tests/api/cl_set_kernel_exec_info_tests.inl

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,4 +263,61 @@ HWTEST_F(clSetKernelExecInfoTests, givenInvalidThreadArbitrationPolicyWhenSettin
263263
);
264264
EXPECT_EQ(CL_INVALID_VALUE, retVal);
265265
}
266+
267+
HWTEST_F(clSetKernelExecInfoTests, givenInvalidParamSizeWhenSettingKernelExecutionTypeThenClInvalidValueErrorIsReturned) {
268+
cl_execution_info_kernel_type_intel kernelExecutionType;
269+
270+
retVal = clSetKernelExecInfo(
271+
pMockKernel, // cl_kernel kernel
272+
CL_KERNEL_EXEC_INFO_KERNEL_TYPE_INTEL, // cl_kernel_exec_info param_name
273+
sizeof(cl_execution_info_kernel_type_intel) - 1, // size_t param_value_size
274+
&kernelExecutionType // const void *param_value
275+
);
276+
EXPECT_EQ(CL_INVALID_VALUE, retVal);
277+
}
278+
279+
HWTEST_F(clSetKernelExecInfoTests, givenInvalidParamValueWhenSettingKernelExecutionTypeThenClInvalidValueErrorIsReturned) {
280+
retVal = clSetKernelExecInfo(
281+
pMockKernel, // cl_kernel kernel
282+
CL_KERNEL_EXEC_INFO_KERNEL_TYPE_INTEL, // cl_kernel_exec_info param_name
283+
sizeof(cl_execution_info_kernel_type_intel), // size_t param_value_size
284+
nullptr // const void *param_value
285+
);
286+
EXPECT_EQ(CL_INVALID_VALUE, retVal);
287+
}
288+
289+
HWTEST_F(clSetKernelExecInfoTests, givenDifferentExecutionTypesWhenSettingAdditionalKernelInfoThenCorrectValuesAreSet) {
290+
cl_kernel_exec_info paramName = CL_KERNEL_EXEC_INFO_KERNEL_TYPE_INTEL;
291+
size_t paramSize = sizeof(cl_execution_info_kernel_type_intel);
292+
cl_execution_info_kernel_type_intel kernelExecutionType = -1;
293+
294+
retVal = clSetKernelExecInfo(
295+
pMockKernel, // cl_kernel kernel
296+
paramName, // cl_kernel_exec_info param_name
297+
paramSize, // size_t param_value_size
298+
&kernelExecutionType // const void *param_value
299+
);
300+
EXPECT_EQ(CL_INVALID_VALUE, retVal);
301+
302+
kernelExecutionType = CL_KERNEL_EXEC_INFO_DEFAULT_TYPE_INTEL;
303+
retVal = clSetKernelExecInfo(
304+
pMockKernel, // cl_kernel kernel
305+
paramName, // cl_kernel_exec_info param_name
306+
paramSize, // size_t param_value_size
307+
&kernelExecutionType // const void *param_value
308+
);
309+
EXPECT_EQ(CL_SUCCESS, retVal);
310+
EXPECT_EQ(KernelExecutionType::Default, pMockKernel->executionType);
311+
312+
kernelExecutionType = CL_KERNEL_EXEC_INFO_CONCURRENT_TYPE_INTEL;
313+
retVal = clSetKernelExecInfo(
314+
pMockKernel, // cl_kernel kernel
315+
paramName, // cl_kernel_exec_info param_name
316+
paramSize, // size_t param_value_size
317+
&kernelExecutionType // const void *param_value
318+
);
319+
EXPECT_EQ(CL_SUCCESS, retVal);
320+
EXPECT_EQ(KernelExecutionType::Concurrent, pMockKernel->executionType);
321+
}
322+
266323
} // namespace ULT

unit_tests/kernel/kernel_tests.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2902,6 +2902,31 @@ TEST(KernelTest, givenPolicyWhensetKernelThreadArbitrationPolicyThenExpectedClVa
29022902
EXPECT_EQ(CL_INVALID_VALUE, kernel.mockKernel->setKernelThreadArbitrationPolicy(notExistPolicy));
29032903
}
29042904

2905+
TEST(KernelTest, GivenDifferentValuesWhenSetKernelExecutionTypeIsCalledThenCorrectValueIsSet) {
2906+
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(platformDevices[0]));
2907+
MockKernelWithInternals mockKernelWithInternals(*device);
2908+
auto &kernel = *mockKernelWithInternals.mockKernel;
2909+
cl_int retVal;
2910+
2911+
EXPECT_EQ(KernelExecutionType::Default, kernel.executionType);
2912+
2913+
retVal = kernel.setKernelExecutionType(-1);
2914+
EXPECT_EQ(CL_INVALID_VALUE, retVal);
2915+
EXPECT_EQ(KernelExecutionType::Default, kernel.executionType);
2916+
2917+
retVal = kernel.setKernelExecutionType(CL_KERNEL_EXEC_INFO_CONCURRENT_TYPE_INTEL);
2918+
EXPECT_EQ(CL_SUCCESS, retVal);
2919+
EXPECT_EQ(KernelExecutionType::Concurrent, kernel.executionType);
2920+
2921+
retVal = kernel.setKernelExecutionType(-1);
2922+
EXPECT_EQ(CL_INVALID_VALUE, retVal);
2923+
EXPECT_EQ(KernelExecutionType::Concurrent, kernel.executionType);
2924+
2925+
retVal = kernel.setKernelExecutionType(CL_KERNEL_EXEC_INFO_DEFAULT_TYPE_INTEL);
2926+
EXPECT_EQ(CL_SUCCESS, retVal);
2927+
EXPECT_EQ(KernelExecutionType::Default, kernel.executionType);
2928+
}
2929+
29052930
namespace NEO {
29062931

29072932
template <typename GfxFamily>

unit_tests/mocks/mock_kernel.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class MockKernel : public Kernel {
3030
using Kernel::allBufferArgsStateful;
3131
using Kernel::auxTranslationRequired;
3232
using Kernel::containsStatelessWrites;
33+
using Kernel::executionType;
3334
using Kernel::isSchedulerKernel;
3435
using Kernel::kernelArgHandlers;
3536
using Kernel::kernelArgRequiresCacheFlush;

0 commit comments

Comments
 (0)