Skip to content

Commit c99b223

Browse files
Implement cl_intel_device_attribute_query extension
Related-To: NEO-5759 Signed-off-by: Milczarek, Slawomir <[email protected]>
1 parent 1b513b5 commit c99b223

21 files changed

+325
-15
lines changed

opencl/extensions/public/cl_ext_private.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,21 @@ typedef struct _cl_queue_family_properties_intel {
192192
cl_uint count;
193193
char name[CL_QUEUE_FAMILY_MAX_NAME_SIZE_INTEL];
194194
} cl_queue_family_properties_intel;
195+
196+
/******************************
197+
* DEVICE ATTRIBUTE QUERY *
198+
*******************************/
199+
200+
/* For GPU devices, version 1.0.0: */
201+
#define CL_DEVICE_IP_VERSION_INTEL 0x4250
202+
#define CL_DEVICE_ID_INTEL 0x4251
203+
#define CL_DEVICE_NUM_SLICES_INTEL 0x4252
204+
#define CL_DEVICE_NUM_SUB_SLICES_PER_SLICE_INTEL 0x4253
205+
#define CL_DEVICE_NUM_EUS_PER_SUB_SLICE_INTEL 0x4254
206+
#define CL_DEVICE_NUM_THREADS_PER_EU_INTEL 0x4255
207+
#define CL_DEVICE_FEATURE_CAPABILITIES_INTEL 0x4256
208+
209+
typedef cl_bitfield cl_device_feature_capabilities_intel;
210+
211+
/* For GPU devices, version 1.0.0: */
212+
#define CL_DEVICE_FEATURE_FLAG_DP4A_INTEL (1 << 0)

opencl/source/cl_device/cl_device_info.cpp

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "shared/source/device/device.h"
1111
#include "shared/source/device/device_info.h"
1212
#include "shared/source/helpers/get_info.h"
13+
#include "shared/source/helpers/hw_helper.h"
1314
#include "shared/source/os_interface/os_time.h"
1415

1516
#include "opencl/source/cl_device/cl_device.h"
@@ -65,7 +66,7 @@ cl_int ClDevice::getDeviceInfo(cl_device_info paramName,
6566
size_t srcSize = GetInfo::invalidSourceSize;
6667
size_t retSize = 0;
6768
size_t value = 0u;
68-
cl_uint param;
69+
ClDeviceInfoParam param{};
6970
const void *src = nullptr;
7071

7172
// clang-format off
@@ -176,17 +177,17 @@ cl_int ClDevice::getDeviceInfo(cl_device_info paramName,
176177
case CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES:
177178
if (paramValueSize == sizeof(cl_bool)) {
178179
srcSize = retSize = sizeof(cl_bool);
179-
param = (deviceInfo.deviceEnqueueSupport > 0u) ? CL_TRUE : CL_FALSE;
180-
src = &param;
180+
param.boolean = (deviceInfo.deviceEnqueueSupport > 0u) ? CL_TRUE : CL_FALSE;
181+
src = &param.boolean;
181182
} else {
182183
getCap<CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES>(src, srcSize, retSize);
183184
}
184185
break;
185186
case CL_DEVICE_NUM_SIMULTANEOUS_INTEROPS_INTEL:
186187
if (simultaneousInterops.size() > 1u) {
187188
srcSize = retSize = sizeof(cl_uint);
188-
param = 1u;
189-
src = &param;
189+
param.uint = 1u;
190+
src = &param.uint;
190191
}
191192
break;
192193
case CL_DEVICE_SIMULTANEOUS_INTEROPS_INTEL:
@@ -202,9 +203,9 @@ cl_int ClDevice::getDeviceInfo(cl_device_info paramName,
202203
case CL_DEVICE_REFERENCE_COUNT: {
203204
cl_int ref = this->getReference();
204205
DEBUG_BREAK_IF(ref != 1 && !deviceInfo.parentDevice);
205-
param = static_cast<cl_uint>(ref);
206-
src = &param;
207-
retSize = srcSize = sizeof(param);
206+
param.uint = static_cast<cl_uint>(ref);
207+
src = &param.uint;
208+
retSize = srcSize = sizeof(param.uint);
208209
break;
209210
}
210211
case CL_DEVICE_PARTITION_PROPERTIES:
@@ -242,6 +243,49 @@ cl_int ClDevice::getDeviceInfo(cl_device_info paramName,
242243
src = deviceInfo.supportedThreadArbitrationPolicies.data();
243244
retSize = srcSize = deviceInfo.supportedThreadArbitrationPolicies.size() * sizeof(cl_uint);
244245
break;
246+
case CL_DEVICE_IP_VERSION_INTEL: {
247+
auto &clHwHelper = ClHwHelper::get(getHardwareInfo().platform.eRenderCoreFamily);
248+
param.uint = clHwHelper.getDeviceIpVersion(getHardwareInfo());
249+
src = &param.uint;
250+
retSize = srcSize = sizeof(cl_version);
251+
break;
252+
}
253+
case CL_DEVICE_ID_INTEL:
254+
param.uint = getHardwareInfo().platform.usDeviceID;
255+
src = &param.uint;
256+
retSize = srcSize = sizeof(cl_uint);
257+
break;
258+
case CL_DEVICE_NUM_SLICES_INTEL:
259+
param.uint = static_cast<cl_uint>(getHardwareInfo().gtSystemInfo.SliceCount * ((subDevices.size() > 0) ? subDevices.size() : 1));
260+
src = &param.uint;
261+
retSize = srcSize = sizeof(cl_uint);
262+
break;
263+
case CL_DEVICE_NUM_SUB_SLICES_PER_SLICE_INTEL: {
264+
const auto &gtSysInfo = getHardwareInfo().gtSystemInfo;
265+
param.uint = gtSysInfo.SubSliceCount / gtSysInfo.SliceCount;
266+
src = &param.uint;
267+
retSize = srcSize = sizeof(cl_uint);
268+
break;
269+
}
270+
case CL_DEVICE_NUM_EUS_PER_SUB_SLICE_INTEL:
271+
param.uint = getHardwareInfo().gtSystemInfo.MaxEuPerSubSlice;
272+
src = &param.uint;
273+
retSize = srcSize = sizeof(cl_uint);
274+
break;
275+
case CL_DEVICE_NUM_THREADS_PER_EU_INTEL: {
276+
const auto &gtSysInfo = getHardwareInfo().gtSystemInfo;
277+
param.uint = gtSysInfo.ThreadCount / gtSysInfo.EUCount;
278+
src = &param.uint;
279+
retSize = srcSize = sizeof(cl_uint);
280+
break;
281+
}
282+
case CL_DEVICE_FEATURE_CAPABILITIES_INTEL: {
283+
auto &clHwHelper = ClHwHelper::get(getHardwareInfo().platform.eRenderCoreFamily);
284+
param.bitfield = clHwHelper.getSupportedDeviceFeatureCapabilities();
285+
src = &param.bitfield;
286+
retSize = srcSize = sizeof(cl_device_feature_capabilities_intel);
287+
break;
288+
}
245289
default:
246290
if (getDeviceInfoForImage(paramName, src, srcSize, retSize) && !getSharedDeviceInfo().imageSupport) {
247291
src = &value;

opencl/source/cl_device/cl_device_info.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ namespace NEO {
1919

2020
using OpenClCFeaturesContainer = StackVec<cl_name_version, 15>;
2121

22+
struct ClDeviceInfoParam {
23+
union {
24+
cl_bool boolean;
25+
cl_uint uint;
26+
cl_bitfield bitfield;
27+
};
28+
};
29+
2230
// clang-format off
2331
struct ClDeviceInfo {
2432
cl_name_version ilsWithVersion[1];

opencl/source/gen11/cl_hw_helper_gen11.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ void populateFactoryTable<ClHwHelperHw<Family>>() {
2323
clHwHelperFactory[gfxCore] = &ClHwHelperHw<Family>::get();
2424
}
2525

26+
template <>
27+
cl_version ClHwHelperHw<Family>::getDeviceIpVersion(const HardwareInfo &hwInfo) const {
28+
return makeDeviceIpVersion(11, 0, 0);
29+
}
30+
2631
template class ClHwHelperHw<Family>;
2732

2833
} // namespace NEO

opencl/source/gen12lp/cl_hw_helper_gen12lp.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ void populateFactoryTable<ClHwHelperHw<Family>>() {
2323
clHwHelperFactory[gfxCore] = &ClHwHelperHw<Family>::get();
2424
}
2525

26+
template <>
27+
cl_device_feature_capabilities_intel ClHwHelperHw<Family>::getSupportedDeviceFeatureCapabilities() const {
28+
return CL_DEVICE_FEATURE_FLAG_DP4A_INTEL;
29+
}
30+
31+
template <>
32+
cl_version ClHwHelperHw<Family>::getDeviceIpVersion(const HardwareInfo &hwInfo) const {
33+
return makeDeviceIpVersion(12, 0, makeDeviceRevision(hwInfo));
34+
}
35+
2636
template class ClHwHelperHw<Family>;
2737

2838
} // namespace NEO

opencl/source/gen8/cl_hw_helper_gen8.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ void populateFactoryTable<ClHwHelperHw<Family>>() {
2323
clHwHelperFactory[gfxCore] = &ClHwHelperHw<Family>::get();
2424
}
2525

26+
template <>
27+
cl_version ClHwHelperHw<Family>::getDeviceIpVersion(const HardwareInfo &hwInfo) const {
28+
return makeDeviceIpVersion(8, 0, 0);
29+
}
30+
2631
template class ClHwHelperHw<Family>;
2732

2833
} // namespace NEO

opencl/source/gen9/cl_hw_helper_gen9.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ void populateFactoryTable<ClHwHelperHw<Family>>() {
2323
clHwHelperFactory[gfxCore] = &ClHwHelperHw<Family>::get();
2424
}
2525

26+
template <>
27+
cl_version ClHwHelperHw<Family>::getDeviceIpVersion(const HardwareInfo &hwInfo) const {
28+
return makeDeviceIpVersion(9, 0, 0);
29+
}
30+
2631
template class ClHwHelperHw<Family>;
2732

2833
} // namespace NEO
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2018-2020 Intel Corporation
2+
* Copyright (C) 2018-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -8,5 +8,5 @@
88
#include "opencl/source/helpers/cl_device_helpers.h"
99

1010
namespace NEO {
11-
void ClDeviceHelper::getExtraDeviceInfo(const ClDevice &clDevice, cl_device_info paramName, cl_uint &param, const void *&src, size_t &size, size_t &retSize) {}
11+
void ClDeviceHelper::getExtraDeviceInfo(const ClDevice &clDevice, cl_device_info paramName, ClDeviceInfoParam &param, const void *&src, size_t &size, size_t &retSize) {}
1212
} // namespace NEO

opencl/source/helpers/cl_device_helpers.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2018-2020 Intel Corporation
2+
* Copyright (C) 2018-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -11,8 +11,9 @@
1111
#include <cstdint>
1212
namespace NEO {
1313
class ClDevice;
14+
struct ClDeviceInfoParam;
1415

1516
namespace ClDeviceHelper {
16-
void getExtraDeviceInfo(const ClDevice &clDevice, cl_device_info paramName, cl_uint &param, const void *&src, size_t &size, size_t &retSize);
17+
void getExtraDeviceInfo(const ClDevice &clDevice, cl_device_info paramName, ClDeviceInfoParam &param, const void *&src, size_t &size, size_t &retSize);
1718
}; // namespace ClDeviceHelper
1819
} // namespace NEO
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
/*
2-
* Copyright (C) 2020 Intel Corporation
2+
* Copyright (C) 2020-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
66
*/
77

88
#include "opencl/source/helpers/cl_hw_helper.h"
99

10+
#include "shared/source/helpers/hw_info.h"
11+
1012
namespace NEO {
1113

1214
ClHwHelper *clHwHelperFactory[IGFX_MAX_CORE] = {};
@@ -15,4 +17,12 @@ ClHwHelper &ClHwHelper::get(GFXCORE_FAMILY gfxCore) {
1517
return *clHwHelperFactory[gfxCore];
1618
}
1719

20+
uint8_t ClHwHelper::makeDeviceRevision(const HardwareInfo &hwInfo) {
21+
return static_cast<uint8_t>(!hwInfo.capabilityTable.isIntegratedDevice);
22+
}
23+
24+
cl_version ClHwHelper::makeDeviceIpVersion(uint16_t major, uint8_t minor, uint8_t revision) {
25+
return (major << 16) | (minor << 8) | revision;
26+
}
27+
1828
} // namespace NEO

0 commit comments

Comments
 (0)