Skip to content

Commit 3d13a9d

Browse files
Add info about supported thread arbitration policies
Signed-off-by: Katarzyna Cencelewska <[email protected]>
1 parent 6a4c263 commit 3d13a9d

File tree

11 files changed

+170
-14
lines changed

11 files changed

+170
-14
lines changed

opencl/extensions/public/cl_ext_private.h

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,20 @@ using cl_unified_shared_memory_capabilities_intel = cl_bitfield;
118118
#define CL_MEM_TYPE_DEVICE_INTEL 0x4198
119119
#define CL_MEM_TYPE_SHARED_INTEL 0x4199
120120

121+
/* cl_command_type */
122+
#define CL_COMMAND_MEMSET_INTEL 0x4204
123+
#define CL_COMMAND_MEMFILL_INTEL 0x4204
124+
#define CL_COMMAND_MEMCPY_INTEL 0x4205
125+
#define CL_COMMAND_MIGRATEMEM_INTEL 0x4206
126+
#define CL_COMMAND_MEMADVISE_INTEL 0x4207
127+
128+
/******************************
129+
* THREAD ARBITRATION POLICY *
130+
*******************************/
131+
132+
/* cl_device_info */
133+
#define CL_DEVICE_SUPPORTED_THREAD_ARBITRATION_POLICY_INTEL 0x4208
134+
121135
/* cl_kernel_exec_info */
122136
#define CL_KERNEL_EXEC_INFO_INDIRECT_HOST_ACCESS_INTEL 0x4200
123137
#define CL_KERNEL_EXEC_INFO_INDIRECT_DEVICE_ACCESS_INTEL 0x4201
@@ -129,13 +143,6 @@ using cl_unified_shared_memory_capabilities_intel = cl_bitfield;
129143
#define CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_AFTER_DEPENDENCY_ROUND_ROBIN_INTEL 0x10024
130144
#define CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_INTEL 0x10025
131145

132-
/* cl_command_type */
133-
#define CL_COMMAND_MEMSET_INTEL 0x4204
134-
#define CL_COMMAND_MEMFILL_INTEL 0x4204
135-
#define CL_COMMAND_MEMCPY_INTEL 0x4205
136-
#define CL_COMMAND_MIGRATEMEM_INTEL 0x4206
137-
#define CL_COMMAND_MEMADVISE_INTEL 0x4207
138-
139146
/******************************
140147
* SLICE COUNT SELECTING *
141148
*******************************/

opencl/source/cl_device/cl_device_caps.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "shared/source/os_interface/hw_info_config.h"
1616

1717
#include "opencl/source/cl_device/cl_device.h"
18+
#include "opencl/source/helpers/cl_hw_helper.h"
1819
#include "opencl/source/platform/extensions.h"
1920
#include "opencl/source/sharings/sharing_factory.h"
2021

@@ -373,7 +374,12 @@ void ClDevice::initializeCaps() {
373374
deviceInfo.queueFamilyProperties.push_back(properties);
374375
}
375376
}
376-
377+
auto &clHwHelper = NEO::ClHwHelper::get(hwInfo.platform.eRenderCoreFamily);
378+
const std::vector<uint32_t> &supportedThreadArbitrationPolicies = clHwHelper.getSupportedThreadArbitrationPolicies();
379+
deviceInfo.supportedThreadArbitrationPolicies.resize(supportedThreadArbitrationPolicies.size());
380+
for (size_t policy = 0u; policy < supportedThreadArbitrationPolicies.size(); policy++) {
381+
deviceInfo.supportedThreadArbitrationPolicies[policy] = supportedThreadArbitrationPolicies[policy];
382+
}
377383
deviceInfo.preemptionSupported = false;
378384
deviceInfo.maxGlobalVariableSize = ocl21FeaturesEnabled ? 64 * KB : 0;
379385
deviceInfo.globalVariablePreferredTotalSize = ocl21FeaturesEnabled ? static_cast<size_t>(sharedDeviceInfo.maxMemAllocSize) : 0;

opencl/source/cl_device/cl_device_info.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2017-2020 Intel Corporation
2+
* Copyright (C) 2017-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -17,6 +17,7 @@
1717
#include "opencl/source/cl_device/cl_device_info_map.h"
1818
#include "opencl/source/cl_device/cl_device_vector.h"
1919
#include "opencl/source/helpers/cl_device_helpers.h"
20+
#include "opencl/source/helpers/cl_hw_helper.h"
2021
#include "opencl/source/helpers/get_info_status_mapper.h"
2122
#include "opencl/source/platform/platform.h"
2223

@@ -237,6 +238,10 @@ cl_int ClDevice::getDeviceInfo(cl_device_info paramName,
237238
src = deviceInfo.extensionsWithVersion.data();
238239
retSize = srcSize = deviceInfo.extensionsWithVersion.size() * sizeof(cl_name_version);
239240
break;
241+
case CL_DEVICE_SUPPORTED_THREAD_ARBITRATION_POLICY_INTEL:
242+
src = deviceInfo.supportedThreadArbitrationPolicies.data();
243+
retSize = srcSize = deviceInfo.supportedThreadArbitrationPolicies.size() * sizeof(cl_uint);
244+
break;
240245
default:
241246
if (getDeviceInfoForImage(paramName, src, srcSize, retSize) && !getSharedDeviceInfo().imageSupport) {
242247
src = &value;

opencl/source/cl_device/cl_device_info.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2017-2020 Intel Corporation
2+
* Copyright (C) 2017-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -132,6 +132,7 @@ struct ClDeviceInfo {
132132
cl_unified_shared_memory_capabilities_intel singleDeviceSharedMemCapabilities;
133133
cl_unified_shared_memory_capabilities_intel crossDeviceSharedMemCapabilities;
134134
cl_unified_shared_memory_capabilities_intel sharedSystemMemCapabilities;
135+
StackVec<uint32_t, 4> supportedThreadArbitrationPolicies;
135136
};
136137
// clang-format on
137138

opencl/source/helpers/cl_hw_helper.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "igfxfmid.h"
1414

1515
#include <string>
16+
#include <vector>
1617

1718
namespace NEO {
1819

@@ -31,6 +32,8 @@ class ClHwHelper {
3132
virtual bool getQueueFamilyName(std::string &name, EngineGroupType type) const = 0;
3233
virtual cl_ulong getKernelPrivateMemSize(const KernelInfo &kernelInfo) const = 0;
3334
virtual bool preferBlitterForLocalToLocalTransfers() const = 0;
35+
virtual bool isSupportedKernelThreadArbitrationPolicy() const = 0;
36+
virtual std::vector<uint32_t> getSupportedThreadArbitrationPolicies() const = 0;
3437

3538
protected:
3639
virtual bool hasStatelessAccessToBuffer(const KernelInfo &kernelInfo) const = 0;
@@ -52,10 +55,11 @@ class ClHwHelperHw : public ClHwHelper {
5255
bool getQueueFamilyName(std::string &name, EngineGroupType type) const override;
5356
cl_ulong getKernelPrivateMemSize(const KernelInfo &kernelInfo) const override;
5457
bool preferBlitterForLocalToLocalTransfers() const override;
58+
bool isSupportedKernelThreadArbitrationPolicy() const override;
59+
std::vector<uint32_t> getSupportedThreadArbitrationPolicies() const override;
5560

5661
protected:
5762
bool hasStatelessAccessToBuffer(const KernelInfo &kernelInfo) const override;
58-
5963
ClHwHelperHw() = default;
6064
};
6165

opencl/source/helpers/cl_hw_helper_base.inl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,12 @@ template <typename GfxFamily>
4343
inline bool ClHwHelperHw<GfxFamily>::preferBlitterForLocalToLocalTransfers() const {
4444
return false;
4545
}
46+
template <typename GfxFamily>
47+
bool ClHwHelperHw<GfxFamily>::isSupportedKernelThreadArbitrationPolicy() const { return true; }
48+
49+
template <typename GfxFamily>
50+
std::vector<uint32_t> ClHwHelperHw<GfxFamily>::getSupportedThreadArbitrationPolicies() const {
51+
return std::vector<uint32_t>{CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_OLDEST_FIRST_INTEL, CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_ROUND_ROBIN_INTEL, CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_AFTER_DEPENDENCY_ROUND_ROBIN_INTEL};
52+
}
4653

4754
} // namespace NEO

opencl/source/kernel/kernel_extra.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "shared/source/debug_settings/debug_settings_manager.h"
99

10+
#include "opencl/source/helpers/cl_hw_helper.h"
1011
#include "opencl/source/kernel/kernel.h"
1112

1213
namespace NEO {
@@ -16,7 +17,12 @@ bool Kernel::requiresCacheFlushCommand(const CommandQueue &commandQueue) const {
1617
void Kernel::reconfigureKernel() {
1718
}
1819
int Kernel::setKernelThreadArbitrationPolicy(uint32_t policy) {
19-
if (policy == CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_ROUND_ROBIN_INTEL) {
20+
auto hwInfo = clDevice.getHardwareInfo();
21+
auto &hwHelper = NEO::ClHwHelper::get(hwInfo.platform.eRenderCoreFamily);
22+
if (!hwHelper.isSupportedKernelThreadArbitrationPolicy()) {
23+
this->threadArbitrationPolicy = ThreadArbitrationPolicy::NotPresent;
24+
return CL_INVALID_DEVICE;
25+
} else if (policy == CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_ROUND_ROBIN_INTEL) {
2026
this->threadArbitrationPolicy = ThreadArbitrationPolicy::RoundRobin;
2127
} else if (policy == CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_OLDEST_FIRST_INTEL) {
2228
this->threadArbitrationPolicy = ThreadArbitrationPolicy::AgeBased;

opencl/test/unit_test/api/cl_get_device_info_tests.inl

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include "shared/source/device/device.h"
99
#include "shared/source/helpers/hw_info.h"
1010

11+
#include "opencl/source/helpers/cl_hw_helper.h"
12+
1113
#include "cl_api_tests.h"
1214

1315
#include <cstring>
@@ -273,6 +275,49 @@ TEST_F(clGetDeviceInfoTests, GivenClDeviceIlVersionParamWhenGettingDeviceInfoThe
273275
EXPECT_EQ(CL_SUCCESS, retVal);
274276
EXPECT_STREQ("SPIR-V_1.2 ", paramValue.get());
275277
}
278+
using matcherAtMostGen12lp = IsAtMostGfxCore<IGFX_GEN12LP_CORE>;
279+
HWTEST2_F(clGetDeviceInfoTests, givenClDeviceSupportedThreadArbitrationPolicyIntelWhenCallClGetDeviceInfoThenProperArrayIsReturned, matcherAtMostGen12lp) {
280+
cl_device_info paramName = 0;
281+
cl_uint paramValue[3];
282+
size_t paramSize = sizeof(paramValue);
283+
size_t paramRetSize = 0;
284+
285+
paramName = CL_DEVICE_SUPPORTED_THREAD_ARBITRATION_POLICY_INTEL;
286+
cl_uint expectedRetValue[] = {CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_OLDEST_FIRST_INTEL, CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_ROUND_ROBIN_INTEL, CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_AFTER_DEPENDENCY_ROUND_ROBIN_INTEL};
287+
288+
retVal = clGetDeviceInfo(
289+
testedClDevice,
290+
paramName,
291+
paramSize,
292+
paramValue,
293+
&paramRetSize);
294+
EXPECT_EQ(CL_SUCCESS, retVal);
295+
EXPECT_EQ(sizeof(expectedRetValue), paramRetSize);
296+
EXPECT_TRUE(memcmp(expectedRetValue, paramValue, sizeof(expectedRetValue)) == 0);
297+
}
298+
299+
HWTEST_F(clGetDeviceInfoTests, givenClDeviceSupportedThreadArbitrationPolicyIntelWhenThreadArbitrationPolicyChangeNotSupportedAndCallClGetDeviceInfoThenParamRetSizeIsZero) {
300+
auto &hwHelper = NEO::ClHwHelper::get(defaultHwInfo->platform.eRenderCoreFamily);
301+
if (hwHelper.isSupportedKernelThreadArbitrationPolicy()) {
302+
GTEST_SKIP();
303+
}
304+
cl_device_info paramName = 0;
305+
cl_uint paramValue[3];
306+
size_t paramSize = sizeof(paramValue);
307+
size_t paramRetSize = 0;
308+
309+
paramName = CL_DEVICE_SUPPORTED_THREAD_ARBITRATION_POLICY_INTEL;
310+
311+
retVal = clGetDeviceInfo(
312+
testedClDevice,
313+
paramName,
314+
paramSize,
315+
paramValue,
316+
&paramRetSize);
317+
318+
EXPECT_EQ(CL_SUCCESS, retVal);
319+
EXPECT_EQ(0u, paramRetSize);
320+
}
276321

277322
//------------------------------------------------------------------------------
278323
struct GetDeviceInfoP : public ApiFixture<>,

opencl/test/unit_test/api/cl_set_kernel_exec_info_tests.inl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*
66
*/
77

8+
#include "opencl/source/helpers/cl_hw_helper.h"
89
#include "opencl/test/unit_test/command_stream/thread_arbitration_policy_helper.h"
910
#include "opencl/test/unit_test/mocks/mock_kernel.h"
1011
#include "test.h"
@@ -66,6 +67,10 @@ TEST_F(clSetKernelExecInfoTests, GivenNullKernelWhenSettingAdditionalKernelInfoT
6667
}
6768

6869
TEST_F(clSetKernelExecInfoTests, GivenDeviceNotSupportingSvmWhenSettingKernelExecInfoThenErrorIsReturnedOnSvmRelatedParams) {
70+
auto &hwHelper = NEO::ClHwHelper::get(pDevice->getHardwareInfo().platform.eRenderCoreFamily);
71+
if (!hwHelper.isSupportedKernelThreadArbitrationPolicy()) {
72+
GTEST_SKIP();
73+
}
6974
auto hwInfo = executionEnvironment->rootDeviceEnvironments[ApiFixture::testedRootDeviceIndex]->getMutableHardwareInfo();
7075
VariableBackup<bool> ftrSvm{&hwInfo->capabilityTable.ftrSvm, false};
7176

@@ -298,6 +303,10 @@ TEST_F(clSetKernelExecInfoTests, givenNonExistingParamNameWithValuesWhenSettingA
298303
}
299304

300305
HWTEST_F(clSetKernelExecInfoTests, givenKernelExecInfoThreadArbitrationPolicyWhenSettingAdditionalKernelInfoThenSuccessIsReturned) {
306+
auto &hwHelper = NEO::ClHwHelper::get(pDevice->getHardwareInfo().platform.eRenderCoreFamily);
307+
if (!hwHelper.isSupportedKernelThreadArbitrationPolicy()) {
308+
GTEST_SKIP();
309+
}
301310
uint32_t newThreadArbitrationPolicy = CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_ROUND_ROBIN_INTEL;
302311
size_t ptrSizeInBytes = sizeof(uint32_t *);
303312

@@ -312,7 +321,28 @@ HWTEST_F(clSetKernelExecInfoTests, givenKernelExecInfoThreadArbitrationPolicyWhe
312321
EXPECT_EQ(getNewKernelArbitrationPolicy(newThreadArbitrationPolicy), pMockKernel->getThreadArbitrationPolicy());
313322
}
314323

324+
HWTEST_F(clSetKernelExecInfoTests, givenKernelExecInfoThreadArbitrationPolicyWhenNotSupportedAndSettingAdditionalKernelInfoThenClInvalidDeviceIsReturned) {
325+
auto &hwHelper = NEO::ClHwHelper::get(pDevice->getHardwareInfo().platform.eRenderCoreFamily);
326+
if (hwHelper.isSupportedKernelThreadArbitrationPolicy()) {
327+
GTEST_SKIP();
328+
}
329+
uint32_t newThreadArbitrationPolicy = CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_ROUND_ROBIN_INTEL;
330+
size_t ptrSizeInBytes = sizeof(uint32_t *);
331+
332+
retVal = clSetKernelExecInfo(
333+
pMockMultiDeviceKernel, // cl_kernel kernel
334+
CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_INTEL, // cl_kernel_exec_info param_name
335+
ptrSizeInBytes, // size_t param_value_size
336+
&newThreadArbitrationPolicy // const void *param_value
337+
);
338+
EXPECT_EQ(CL_INVALID_DEVICE, retVal);
339+
}
340+
315341
HWTEST_F(clSetKernelExecInfoTests, givenInvalidThreadArbitrationPolicyWhenSettingAdditionalKernelInfoThenClInvalidValueIsReturned) {
342+
auto &hwHelper = NEO::ClHwHelper::get(pDevice->getHardwareInfo().platform.eRenderCoreFamily);
343+
if (!hwHelper.isSupportedKernelThreadArbitrationPolicy()) {
344+
GTEST_SKIP();
345+
}
316346
uint32_t invalidThreadArbitrationPolicy = 0;
317347
size_t ptrSizeInBytes = 1 * sizeof(uint32_t *);
318348

opencl/test/unit_test/command_queue/enqueue_handler_tests.cpp

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "shared/test/unit_test/utilities/base_object_utils.h"
1313

1414
#include "opencl/source/event/user_event.h"
15+
#include "opencl/source/helpers/cl_hw_helper.h"
1516
#include "opencl/source/platform/platform.h"
1617
#include "opencl/test/unit_test/command_stream/thread_arbitration_policy_helper.h"
1718
#include "opencl/test/unit_test/fixtures/enqueue_handler_fixture.h"
@@ -498,8 +499,12 @@ HWTEST_F(EnqueueHandlerTest, givenEnqueueHandlerWhenSubCaptureIsOnThenActivateSu
498499
mockCmdQ->release();
499500
}
500501

501-
HWTEST_F(EnqueueHandlerTest, givenEnqueueHandlerWhenClSetKernelExecInfoAlreadysetKernelThreadArbitrationPolicyThenRequiredThreadArbitrationPolicyIsSetProperly) {
502+
HWTEST_F(EnqueueHandlerTest, givenEnqueueHandlerWhenClSetKernelExecInfoAlreadySetKernelThreadArbitrationPolicyThenRequiredThreadArbitrationPolicyIsSetProperly) {
502503
REQUIRE_SVM_OR_SKIP(pClDevice);
504+
auto &hwHelper = NEO::ClHwHelper::get(pClDevice->getHardwareInfo().platform.eRenderCoreFamily);
505+
if (!hwHelper.isSupportedKernelThreadArbitrationPolicy()) {
506+
GTEST_SKIP();
507+
}
503508
DebugManagerStateRestore stateRestore;
504509
DebugManager.flags.AUBDumpSubCaptureMode.set(static_cast<int32_t>(AubSubCaptureManager::SubCaptureMode::Filter));
505510

@@ -529,6 +534,42 @@ HWTEST_F(EnqueueHandlerTest, givenEnqueueHandlerWhenClSetKernelExecInfoAlreadyse
529534
mockCmdQ->release();
530535
}
531536

537+
HWTEST_F(EnqueueHandlerTest, givenEnqueueHandlerWhenNotSupportedPolicyChangeThenRequiredThreadArbitrationPolicyNotChangedAndIsSetAsDefault) {
538+
auto &hwHelper = NEO::ClHwHelper::get(pClDevice->getHardwareInfo().platform.eRenderCoreFamily);
539+
if (hwHelper.isSupportedKernelThreadArbitrationPolicy()) {
540+
GTEST_SKIP();
541+
}
542+
DebugManagerStateRestore stateRestore;
543+
DebugManager.flags.AUBDumpSubCaptureMode.set(static_cast<int32_t>(AubSubCaptureManager::SubCaptureMode::Filter));
544+
545+
MockKernelWithInternals kernelInternals(*pClDevice, context);
546+
Kernel *kernel = kernelInternals.mockKernel;
547+
MockMultiDispatchInfo multiDispatchInfo(pClDevice, kernel);
548+
549+
uint32_t euThreadSetting = CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_ROUND_ROBIN_INTEL;
550+
size_t ptrSizeInBytes = 1 * sizeof(uint32_t *);
551+
auto retVal = clSetKernelExecInfo(
552+
kernelInternals.mockMultiDeviceKernel, // cl_kernel kernel
553+
CL_KERNEL_EXEC_INFO_THREAD_ARBITRATION_POLICY_INTEL, // cl_kernel_exec_info param_name
554+
ptrSizeInBytes, // size_t param_value_size
555+
&euThreadSetting // const void *param_value
556+
);
557+
EXPECT_EQ(CL_INVALID_DEVICE, retVal);
558+
auto mockCmdQ = new MockCommandQueueHw<FamilyType>(context, pClDevice, 0);
559+
560+
mockCmdQ->template enqueueHandler<CL_COMMAND_NDRANGE_KERNEL>(nullptr,
561+
0,
562+
false,
563+
multiDispatchInfo,
564+
0,
565+
nullptr,
566+
nullptr);
567+
EXPECT_NE(getNewKernelArbitrationPolicy(euThreadSetting), pDevice->getUltCommandStreamReceiver<FamilyType>().requiredThreadArbitrationPolicy);
568+
EXPECT_EQ(0u, pDevice->getUltCommandStreamReceiver<FamilyType>().requiredThreadArbitrationPolicy);
569+
570+
mockCmdQ->release();
571+
}
572+
532573
HWTEST_F(EnqueueHandlerTest, givenKernelUsingSyncBufferWhenEnqueuingKernelThenSshIsCorrectlyProgrammed) {
533574
using BINDING_TABLE_STATE = typename FamilyType::BINDING_TABLE_STATE;
534575
using RENDER_SURFACE_STATE = typename FamilyType::RENDER_SURFACE_STATE;

0 commit comments

Comments
 (0)