From 1114361994b71683807c45560a3cda94a350f212 Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Mon, 15 Jul 2019 11:13:40 +0200 Subject: [PATCH] Add API for querying number of slices Related-To: NEO-3426 Change-Id: I2893be858de9f0f6516ca6ded61123c2c15f1494 Signed-off-by: Mateusz Jablonski --- public/cl_ext_private.h | 10 +++++++ runtime/device/device_caps.cpp | 1 + runtime/device/device_info.cpp | 21 +++++++------- runtime/device/device_info.h | 1 + runtime/device/device_info_map.h | 21 +++++++------- unit_tests/api/cl_get_device_info_tests.inl | 32 ++++++++++++++++++++- 6 files changed, 65 insertions(+), 21 deletions(-) diff --git a/public/cl_ext_private.h b/public/cl_ext_private.h index c034417518..56ed39f9a8 100644 --- a/public/cl_ext_private.h +++ b/public/cl_ext_private.h @@ -110,3 +110,13 @@ using cl_unified_shared_memory_capabilities_intel = cl_bitfield; #define CL_COMMAND_MEMCPY_INTEL 0x4205 #define CL_COMMAND_MIGRATEMEM_INTEL 0x4206 #define CL_COMMAND_MEMADVISE_INTEL 0x4207 + +/****************************** +* SLICE COUNT SELECTING * +*******************************/ + +/* cl_device_info */ +#define CL_DEVICE_SLICE_COUNT_INTEL 0x10020 + +/* cl_queue_properties */ +#define CL_QUEUE_SLICE_COUNT_INTEL 0x10021 diff --git a/runtime/device/device_caps.cpp b/runtime/device/device_caps.cpp index c53f678b89..ca3e7217b8 100644 --- a/runtime/device/device_caps.cpp +++ b/runtime/device/device_caps.cpp @@ -247,6 +247,7 @@ void Device::initializeCaps() { deviceInfo.maxComputUnits = systemInfo.EUCount; deviceInfo.maxConstantArgs = 8; deviceInfo.maxNumEUsPerSubSlice = 0; + deviceInfo.maxSliceCount = systemInfo.SliceCount; deviceInfo.numThreadsPerEU = 0; auto simdSizeUsed = DebugManager.flags.UseMaxSimdSizeToDeduceMaxWorkgroupSize.get() ? 32 : 8; diff --git a/runtime/device/device_info.cpp b/runtime/device/device_info.cpp index fc6f098e4d..b10811b953 100644 --- a/runtime/device/device_info.cpp +++ b/runtime/device/device_info.cpp @@ -74,15 +74,19 @@ cl_int Device::getDeviceInfo(cl_device_info paramName, const void *src = nullptr; // clang-format off + // please keep alphabetical order switch (paramName) { case CL_DEVICE_ADDRESS_BITS: getCap(src, srcSize, retSize); break; case CL_DEVICE_AVAILABLE: getCap(src, srcSize, retSize); break; - case CL_DEVICE_AVC_ME_VERSION_INTEL: getCap(src, srcSize, retSize); break; - case CL_DEVICE_AVC_ME_SUPPORTS_TEXTURE_SAMPLER_USE_INTEL: getCap(src, srcSize, retSize); break; case CL_DEVICE_AVC_ME_SUPPORTS_PREEMPTION_INTEL: getCap(src, srcSize, retSize); break; + case CL_DEVICE_AVC_ME_SUPPORTS_TEXTURE_SAMPLER_USE_INTEL: getCap(src, srcSize, retSize); break; + case CL_DEVICE_AVC_ME_VERSION_INTEL: getCap(src, srcSize, retSize); break; case CL_DEVICE_BUILT_IN_KERNELS: getStr(src, srcSize, retSize); break; case CL_DEVICE_COMPILER_AVAILABLE: getCap(src, srcSize, retSize); break; + case CL_DEVICE_CROSS_DEVICE_SHARED_MEM_CAPABILITIES_INTEL: getCap(src, srcSize, retSize); break; + case CL_DEVICE_DEVICE_MEM_CAPABILITIES_INTEL: getCap(src, srcSize, retSize); break; case CL_DEVICE_DOUBLE_FP_CONFIG: getCap(src, srcSize, retSize); break; + case CL_DEVICE_DRIVER_VERSION_INTEL: getCap(src, srcSize, retSize); break; case CL_DEVICE_ENDIAN_LITTLE: getCap(src, srcSize, retSize); break; case CL_DEVICE_ERROR_CORRECTION_SUPPORT: getCap(src, srcSize, retSize); break; case CL_DEVICE_EXECUTION_CAPABILITIES: getCap(src, srcSize, retSize); break; @@ -93,6 +97,7 @@ cl_int Device::getDeviceInfo(cl_device_info paramName, case CL_DEVICE_GLOBAL_MEM_SIZE: getCap(src, srcSize, retSize); break; case CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE: getCap(src, srcSize, retSize); break; case CL_DEVICE_HALF_FP_CONFIG: getCap(src, srcSize, retSize); break; + case CL_DEVICE_HOST_MEM_CAPABILITIES_INTEL: getCap(src, srcSize, retSize); break; case CL_DEVICE_HOST_UNIFIED_MEMORY: getCap(src, srcSize, retSize); break; case CL_DEVICE_IL_VERSION: getStr(src, srcSize, retSize); break; case CL_DEVICE_IMAGE2D_MAX_HEIGHT: getCap(src, srcSize, retSize); break; @@ -164,7 +169,10 @@ cl_int Device::getDeviceInfo(cl_device_info paramName, case CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE: getCap(src, srcSize, retSize); break; case CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES: getCap(src, srcSize, retSize); break; case CL_DEVICE_QUEUE_ON_HOST_PROPERTIES: getCap(src, srcSize, retSize); break; + case CL_DEVICE_SHARED_SYSTEM_MEM_CAPABILITIES_INTEL: getCap(src, srcSize, retSize); break; + case CL_DEVICE_SINGLE_DEVICE_SHARED_MEM_CAPABILITIES_INTEL: getCap(src, srcSize, retSize); break; case CL_DEVICE_SINGLE_FP_CONFIG: getCap(src, srcSize, retSize); break; + case CL_DEVICE_SLICE_COUNT_INTEL: getCap(src, srcSize, retSize); break; case CL_DEVICE_SPIR_VERSIONS: getStr(src, srcSize, retSize); break; case CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS: getCap(src, srcSize, retSize); break; case CL_DEVICE_SUB_GROUP_SIZES_INTEL: getCap(src, srcSize, retSize); break; @@ -173,14 +181,7 @@ cl_int Device::getDeviceInfo(cl_device_info paramName, case CL_DEVICE_VENDOR: getStr(src, srcSize, retSize); break; case CL_DEVICE_VENDOR_ID: getCap(src, srcSize, retSize); break; case CL_DEVICE_VERSION: getStr(src, srcSize, retSize); break; - case CL_DRIVER_VERSION: getStr(src, srcSize, retSize); break; - case CL_DEVICE_DRIVER_VERSION_INTEL: getCap(src, srcSize, retSize); break; - case CL_DEVICE_HOST_MEM_CAPABILITIES_INTEL: getCap(src, srcSize, retSize); break; - case CL_DEVICE_DEVICE_MEM_CAPABILITIES_INTEL: getCap(src, srcSize, retSize); break; - case CL_DEVICE_SINGLE_DEVICE_SHARED_MEM_CAPABILITIES_INTEL: getCap(src, srcSize, retSize); break; - case CL_DEVICE_CROSS_DEVICE_SHARED_MEM_CAPABILITIES_INTEL: getCap(src, srcSize, retSize); break; - case CL_DEVICE_SHARED_SYSTEM_MEM_CAPABILITIES_INTEL: getCap(src, srcSize, retSize); break; - // clang-format on + case CL_DRIVER_VERSION: getStr(src, srcSize, retSize); break; // clang-format on case CL_DEVICE_NUM_SIMULTANEOUS_INTEROPS_INTEL: if (simultaneousInterops.size() > 1u) { srcSize = retSize = sizeof(cl_uint); diff --git a/runtime/device/device_info.h b/runtime/device/device_info.h index 7bcfff1f94..54c42dae2c 100644 --- a/runtime/device/device_info.h +++ b/runtime/device/device_info.h @@ -18,6 +18,7 @@ struct DeviceInfo { cl_device_type deviceType; size_t maxWorkGroupSize; size_t maxNumEUsPerSubSlice; + size_t maxSliceCount; cl_ulong maxMemAllocSize; size_t imageMaxBufferSize; size_t image2DMaxWidth; diff --git a/runtime/device/device_info_map.h b/runtime/device/device_info_map.h index ddee993f73..6f9aae1408 100644 --- a/runtime/device/device_info_map.h +++ b/runtime/device/device_info_map.h @@ -36,14 +36,18 @@ struct Map {}; // Map::getValue - ie. return deviceInfo.AddressBits ////////////////////////////////////////////////////// // clang-format off +// please keep alphabetical order template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; -template<> struct Map : public MapBase {}; -template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; +template<> struct Map : public MapBase {}; +template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; +template<> struct Map : public MapBase {}; +template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; +template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; @@ -54,6 +58,7 @@ template<> struct Map : template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; +template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; @@ -124,21 +129,17 @@ template<> struct Map : template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; +template<> struct Map : public MapBase {}; +template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; +template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; -template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; +template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; template<> struct Map : public MapBase {}; -template<> struct Map : public MapBase {}; -template<> struct Map : public MapBase {}; -template<> struct Map : public MapBase {}; -template<> struct Map : public MapBase {}; -template<> struct Map : public MapBase {}; -template<> struct Map : public MapBase {}; - // clang-format on } // namespace DeviceInfoTable diff --git a/unit_tests/api/cl_get_device_info_tests.inl b/unit_tests/api/cl_get_device_info_tests.inl index f172acd142..b50ce6d857 100644 --- a/unit_tests/api/cl_get_device_info_tests.inl +++ b/unit_tests/api/cl_get_device_info_tests.inl @@ -14,10 +14,40 @@ using namespace NEO; -typedef api_tests clGetDeviceInfoTests; +using clGetDeviceInfoTests = api_tests; namespace ULT { +TEST_F(clGetDeviceInfoTests, givenNeoDeviceWhenAskedForSliceCountThenNumberOfSlicesIsReturned) { + cl_device_info paramName = 0; + size_t paramSize = 0; + void *paramValue = nullptr; + size_t paramRetSize = 0; + + size_t numSlices = 0; + paramName = CL_DEVICE_SLICE_COUNT_INTEL; + + retVal = clGetDeviceInfo( + devices[0], + paramName, + 0, + nullptr, + ¶mRetSize); + + EXPECT_EQ(sizeof(size_t), paramRetSize); + paramSize = paramRetSize; + paramValue = &numSlices; + + retVal = clGetDeviceInfo( + devices[0], + paramName, + paramSize, + paramValue, + ¶mRetSize); + + EXPECT_EQ(platformDevices[0]->gtSystemInfo.SliceCount, numSlices); +} + TEST_F(clGetDeviceInfoTests, GivenGpuDeviceWhenGettingDeviceInfoThenDeviceTypeGpuIsReturned) { cl_device_info paramName = 0; size_t paramSize = 0;