From 84da4648cdc9a62292e0980da12047bb5a0a312a Mon Sep 17 00:00:00 2001 From: Filip Hazubski Date: Tue, 17 Aug 2021 12:50:38 +0000 Subject: [PATCH] Refactor engineGroups container Use static array instead of the vector. Signed-off-by: Filip Hazubski --- level_zero/core/source/device/device_imp.cpp | 9 +- .../sources/cmdlist/test_cmdlist_1.cpp | 2 +- .../sources/cmdlist/test_cmdlist_3.cpp | 2 +- .../sources/cmdqueue/test_cmdqueue.cpp | 4 +- opencl/source/cl_device/cl_device_caps.cpp | 6 +- opencl/source/cl_device/cl_device_info.h | 225 +++++++++--------- ...te_command_queue_with_properties_tests.cpp | 3 +- .../command_queue/command_queue_tests.cpp | 7 +- opencl/test/unit_test/device/device_tests.cpp | 67 +++--- .../device/get_device_info_tests.cpp | 10 +- shared/source/device/device.cpp | 6 +- shared/source/device/device.h | 7 +- shared/source/device/root_device.cpp | 2 - shared/source/helpers/constants.h | 3 + .../helpers/definitions/engine_group_types.h | 7 +- shared/test/common/mocks/mock_device.cpp | 2 - 16 files changed, 182 insertions(+), 180 deletions(-) diff --git a/level_zero/core/source/device/device_imp.cpp b/level_zero/core/source/device/device_imp.cpp index 2a4c52f4c1..8312a9ba57 100644 --- a/level_zero/core/source/device/device_imp.cpp +++ b/level_zero/core/source/device/device_imp.cpp @@ -154,13 +154,12 @@ ze_result_t DeviceImp::getCommandQueueGroupProperties(uint32_t *pCount, auto &l0HwHelper = L0HwHelper::get(hardwareInfo.platform.eRenderCoreFamily); *pCount = std::min(numEngineGroups, *pCount); - for (uint32_t i = 0, engineGroupCount = 0; - i < static_cast(NEO::EngineGroupType::MaxEngineGroups) && engineGroupCount < *pCount; - i++) { + for (uint32_t i = 0, engineGroupCount = 0; engineGroupCount < *pCount; i++) { if (engineGroups[i].empty()) { continue; } + if (i == static_cast(NEO::EngineGroupType::RenderCompute)) { pCommandQueueGroupProperties[engineGroupCount].flags = ZE_COMMAND_QUEUE_GROUP_PROPERTY_FLAG_COMPUTE | ZE_COMMAND_QUEUE_GROUP_PROPERTY_FLAG_COPY | @@ -892,7 +891,7 @@ NEO::GraphicsAllocation *DeviceImp::allocateMemoryFromHostPtr(const void *buffer } ze_result_t DeviceImp::getCsrForOrdinalAndIndex(NEO::CommandStreamReceiver **csr, uint32_t ordinal, uint32_t index) { - if (ordinal >= static_cast(NEO::EngineGroupType::MaxEngineGroups)) { + if (ordinal >= CommonConstants::engineGroupCount) { return ZE_RESULT_ERROR_INVALID_ARGUMENT; } uint32_t engineGroupIndex = ordinal; @@ -926,7 +925,7 @@ ze_result_t DeviceImp::mapOrdinalForAvailableEngineGroup(uint32_t *ordinal) { const auto &engines = activeDevice->getEngineGroups(); uint32_t numNonEmptyGroups = 0; uint32_t i = 0; - for (; i < engines.size() && numNonEmptyGroups <= *ordinal; i++) { + for (; i < CommonConstants::engineGroupCount && numNonEmptyGroups <= *ordinal; i++) { if (!engines[i].empty()) { numNonEmptyGroups++; } diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_1.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_1.cpp index 1b1ffe38a6..807e622786 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_1.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_1.cpp @@ -1189,7 +1189,7 @@ TEST_F(CommandListCreate, whenInvokingAppendMemoryCopyFromContextForImmediateCom TEST_F(CommandListCreate, givenQueueDescriptionwhenCreatingImmediateCommandListForEveryEnigneThenItHasImmediateCommandQueueCreated) { auto &engines = neoDevice->getEngineGroups(); uint32_t numaAvailableEngineGroups = 0; - for (uint32_t ordinal = 0; ordinal < static_cast(NEO::EngineGroupType::MaxEngineGroups); ordinal++) { + for (uint32_t ordinal = 0; ordinal < CommonConstants::engineGroupCount; ordinal++) { if (engines[ordinal].size()) { numaAvailableEngineGroups++; } diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_3.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_3.cpp index d54fe34755..f84d3a4f15 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_3.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_3.cpp @@ -1146,7 +1146,7 @@ TEST_F(CommandListCreate, whenCreatingImmCmdListWithASyncModeAndAppendEventReset TEST_F(CommandListCreate, givenQueueDescriptionwhenCreatingImmediateCommandListForCopyEnigneThenItHasImmediateCommandQueueCreated) { auto &engines = neoDevice->getEngineGroups(); uint32_t numaAvailableEngineGroups = 0; - for (uint32_t ordinal = 0; ordinal < static_cast(NEO::EngineGroupType::MaxEngineGroups); ordinal++) { + for (uint32_t ordinal = 0; ordinal < CommonConstants::engineGroupCount; ordinal++) { if (engines[ordinal].size()) { numaAvailableEngineGroups++; } diff --git a/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue.cpp b/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue.cpp index 5413aab47b..4acc44ca5e 100644 --- a/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue.cpp @@ -916,7 +916,7 @@ HWTEST_F(ContextCreateCommandQueueTest, givenEveryPossibleGroupIndexWhenCreating ze_command_queue_handle_t commandQueue = {}; auto &engines = neoDevice->getEngineGroups(); uint32_t numaAvailableEngineGroups = 0; - for (uint32_t ordinal = 0; ordinal < static_cast(NEO::EngineGroupType::MaxEngineGroups); ordinal++) { + for (uint32_t ordinal = 0; ordinal < CommonConstants::engineGroupCount; ordinal++) { if (engines[ordinal].size()) { numaAvailableEngineGroups++; } @@ -941,7 +941,7 @@ HWTEST_F(ContextCreateCommandQueueTest, givenOrdinalBigerThanAvailableEnginesWhe ze_command_queue_handle_t commandQueue = {}; auto &engines = neoDevice->getEngineGroups(); uint32_t numaAvailableEngineGroups = 0; - for (uint32_t ordinal = 0; ordinal < static_cast(NEO::EngineGroupType::MaxEngineGroups); ordinal++) { + for (uint32_t ordinal = 0; ordinal < CommonConstants::engineGroupCount; ordinal++) { if (engines[ordinal].size()) { numaAvailableEngineGroups++; } diff --git a/opencl/source/cl_device/cl_device_caps.cpp b/opencl/source/cl_device/cl_device_caps.cpp index e059c0e661..0d32d422b5 100644 --- a/opencl/source/cl_device/cl_device_caps.cpp +++ b/opencl/source/cl_device/cl_device_caps.cpp @@ -375,9 +375,9 @@ void ClDevice::initializeCaps() { } } - const std::vector> &queueFamilies = this->getDevice().getEngineGroups(); - for (size_t queueFamilyIndex = 0u; queueFamilyIndex < queueFamilies.size(); queueFamilyIndex++) { - const std::vector &enginesInFamily = queueFamilies.at(queueFamilyIndex); + const auto &queueFamilies = this->getDevice().getEngineGroups(); + for (size_t queueFamilyIndex = 0u; queueFamilyIndex < CommonConstants::engineGroupCount; queueFamilyIndex++) { + const std::vector &enginesInFamily = queueFamilies[queueFamilyIndex]; if (enginesInFamily.size() > 0) { const auto engineGroupType = static_cast(queueFamilyIndex); cl_queue_family_properties_intel properties = {}; diff --git a/opencl/source/cl_device/cl_device_info.h b/opencl/source/cl_device/cl_device_info.h index 002a8733fa..0e079dd665 100644 --- a/opencl/source/cl_device/cl_device_info.h +++ b/opencl/source/cl_device/cl_device_info.h @@ -7,12 +7,11 @@ #pragma once +#include "shared/source/helpers/constants.h" #include "shared/source/utilities/stackvec.h" #include "opencl/extensions/public/cl_ext_private.h" -#include "engine_group_types.h" - #include namespace NEO { @@ -29,119 +28,119 @@ struct ClDeviceInfoParam { // clang-format off struct ClDeviceInfo { - cl_name_version ilsWithVersion[1]; - StackVec builtInKernelsWithVersion; - StackVec openclCAllVersions; - OpenClCFeaturesContainer openclCFeatures; - std::vector extensionsWithVersion; - cl_device_type deviceType; - size_t maxSliceCount; - size_t image3DMaxWidth; - size_t image3DMaxHeight; - size_t maxBufferSize; - size_t maxArraySize; - cl_device_fp_config singleFpConfig; - cl_device_fp_config halfFpConfig; - cl_device_fp_config doubleFpConfig; - cl_ulong globalMemCacheSize; - cl_ulong maxConstantBufferSize; - size_t maxGlobalVariableSize; - size_t globalVariablePreferredTotalSize; - size_t preferredWorkGroupSizeMultiple; - cl_device_exec_capabilities executionCapabilities; - cl_command_queue_properties queueOnHostProperties; - cl_command_queue_properties queueOnDeviceProperties; - const char *builtInKernels; - cl_platform_id platform; - const char *name; - const char *vendor; - const char *driverVersion; - const char *profile; - const char *clVersion; - const char *clCVersion; - const char *spirVersions; - const char *deviceExtensions; - const char *latestConformanceVersionPassed; - cl_device_id parentDevice; - cl_device_affinity_domain partitionAffinityDomain; - cl_uint partitionMaxSubDevices; - cl_device_partition_property partitionProperties[2]; - cl_device_partition_property partitionType[3]; - cl_device_svm_capabilities svmCapabilities; - StackVec(EngineGroupType::MaxEngineGroups)> queueFamilyProperties; - double platformHostTimerResolution; - size_t planarYuvMaxWidth; - size_t planarYuvMaxHeight; - cl_version numericClVersion; - cl_uint maxComputUnits; - cl_uint maxWorkItemDimensions; - cl_uint maxNumOfSubGroups; - cl_bool independentForwardProgress; - cl_device_atomic_capabilities atomicMemoryCapabilities; - cl_device_atomic_capabilities atomicFenceCapabilities; - cl_bool nonUniformWorkGroupSupport; - cl_bool workGroupCollectiveFunctionsSupport; - cl_bool genericAddressSpaceSupport; - cl_device_device_enqueue_capabilities deviceEnqueueSupport; - cl_bool pipeSupport; - cl_uint preferredVectorWidthChar; - cl_uint preferredVectorWidthShort; - cl_uint preferredVectorWidthInt; - cl_uint preferredVectorWidthLong; - cl_uint preferredVectorWidthFloat; - cl_uint preferredVectorWidthDouble; - cl_uint preferredVectorWidthHalf; - cl_uint nativeVectorWidthChar; - cl_uint nativeVectorWidthShort; - cl_uint nativeVectorWidthInt; - cl_uint nativeVectorWidthLong; - cl_uint nativeVectorWidthFloat; - cl_uint nativeVectorWidthDouble; - cl_uint nativeVectorWidthHalf; - cl_uint maxReadWriteImageArgs; - cl_uint imagePitchAlignment; - cl_uint imageBaseAddressAlignment; - cl_uint maxPipeArgs; - cl_uint pipeMaxActiveReservations; - cl_uint pipeMaxPacketSize; - cl_uint memBaseAddressAlign; - cl_uint minDataTypeAlignSize; - cl_device_mem_cache_type globalMemCacheType; - cl_uint maxConstantArgs; - cl_device_local_mem_type localMemType; - cl_bool endianLittle; - cl_bool deviceAvailable; - cl_bool compilerAvailable; - cl_bool linkerAvailable; - cl_uint queueOnDevicePreferredSize; - cl_uint queueOnDeviceMaxSize; - cl_uint maxOnDeviceQueues; - cl_uint maxOnDeviceEvents; - cl_bool preferredInteropUserSync; - cl_uint referenceCount; - cl_uint preferredPlatformAtomicAlignment; - cl_uint preferredGlobalAtomicAlignment; - cl_uint preferredLocalAtomicAlignment; - cl_bool hostUnifiedMemory; - cl_bool vmeAvcSupportsTextureSampler; - cl_uint vmeAvcVersion; - cl_uint vmeVersion; - cl_uint internalDriverVersion; - cl_uint grfSize; - bool preemptionSupported; - cl_device_pci_bus_info_khr pciBusInfo; + cl_name_version ilsWithVersion[1]; + StackVec builtInKernelsWithVersion; + StackVec openclCAllVersions; + OpenClCFeaturesContainer openclCFeatures; + std::vector extensionsWithVersion; + cl_device_type deviceType; + size_t maxSliceCount; + size_t image3DMaxWidth; + size_t image3DMaxHeight; + size_t maxBufferSize; + size_t maxArraySize; + cl_device_fp_config singleFpConfig; + cl_device_fp_config halfFpConfig; + cl_device_fp_config doubleFpConfig; + cl_ulong globalMemCacheSize; + cl_ulong maxConstantBufferSize; + size_t maxGlobalVariableSize; + size_t globalVariablePreferredTotalSize; + size_t preferredWorkGroupSizeMultiple; + cl_device_exec_capabilities executionCapabilities; + cl_command_queue_properties queueOnHostProperties; + cl_command_queue_properties queueOnDeviceProperties; + const char *builtInKernels; + cl_platform_id platform; + const char *name; + const char *vendor; + const char *driverVersion; + const char *profile; + const char *clVersion; + const char *clCVersion; + const char *spirVersions; + const char *deviceExtensions; + const char *latestConformanceVersionPassed; + cl_device_id parentDevice; + cl_device_affinity_domain partitionAffinityDomain; + cl_uint partitionMaxSubDevices; + cl_device_partition_property partitionProperties[2]; + cl_device_partition_property partitionType[3]; + cl_device_svm_capabilities svmCapabilities; + StackVec queueFamilyProperties; + double platformHostTimerResolution; + size_t planarYuvMaxWidth; + size_t planarYuvMaxHeight; + cl_version numericClVersion; + cl_uint maxComputUnits; + cl_uint maxWorkItemDimensions; + cl_uint maxNumOfSubGroups; + cl_bool independentForwardProgress; + cl_device_atomic_capabilities atomicMemoryCapabilities; + cl_device_atomic_capabilities atomicFenceCapabilities; + cl_bool nonUniformWorkGroupSupport; + cl_bool workGroupCollectiveFunctionsSupport; + cl_bool genericAddressSpaceSupport; + cl_device_device_enqueue_capabilities deviceEnqueueSupport; + cl_bool pipeSupport; + cl_uint preferredVectorWidthChar; + cl_uint preferredVectorWidthShort; + cl_uint preferredVectorWidthInt; + cl_uint preferredVectorWidthLong; + cl_uint preferredVectorWidthFloat; + cl_uint preferredVectorWidthDouble; + cl_uint preferredVectorWidthHalf; + cl_uint nativeVectorWidthChar; + cl_uint nativeVectorWidthShort; + cl_uint nativeVectorWidthInt; + cl_uint nativeVectorWidthLong; + cl_uint nativeVectorWidthFloat; + cl_uint nativeVectorWidthDouble; + cl_uint nativeVectorWidthHalf; + cl_uint maxReadWriteImageArgs; + cl_uint imagePitchAlignment; + cl_uint imageBaseAddressAlignment; + cl_uint maxPipeArgs; + cl_uint pipeMaxActiveReservations; + cl_uint pipeMaxPacketSize; + cl_uint memBaseAddressAlign; + cl_uint minDataTypeAlignSize; + cl_device_mem_cache_type globalMemCacheType; + cl_uint maxConstantArgs; + cl_device_local_mem_type localMemType; + cl_bool endianLittle; + cl_bool deviceAvailable; + cl_bool compilerAvailable; + cl_bool linkerAvailable; + cl_uint queueOnDevicePreferredSize; + cl_uint queueOnDeviceMaxSize; + cl_uint maxOnDeviceQueues; + cl_uint maxOnDeviceEvents; + cl_bool preferredInteropUserSync; + cl_uint referenceCount; + cl_uint preferredPlatformAtomicAlignment; + cl_uint preferredGlobalAtomicAlignment; + cl_uint preferredLocalAtomicAlignment; + cl_bool hostUnifiedMemory; + cl_bool vmeAvcSupportsTextureSampler; + cl_uint vmeAvcVersion; + cl_uint vmeVersion; + cl_uint internalDriverVersion; + cl_uint grfSize; + bool preemptionSupported; + cl_device_pci_bus_info_khr pciBusInfo; /* Extensions supported */ - bool nv12Extension; - bool vmeExtension; - bool platformLP; - bool packedYuvExtension; + bool nv12Extension; + bool vmeExtension; + bool platformLP; + bool packedYuvExtension; /*Unified Shared Memory Capabilites*/ - cl_unified_shared_memory_capabilities_intel hostMemCapabilities; - cl_unified_shared_memory_capabilities_intel deviceMemCapabilities; - cl_unified_shared_memory_capabilities_intel singleDeviceSharedMemCapabilities; - cl_unified_shared_memory_capabilities_intel crossDeviceSharedMemCapabilities; - cl_unified_shared_memory_capabilities_intel sharedSystemMemCapabilities; - StackVec supportedThreadArbitrationPolicies; + cl_unified_shared_memory_capabilities_intel hostMemCapabilities; + cl_unified_shared_memory_capabilities_intel deviceMemCapabilities; + cl_unified_shared_memory_capabilities_intel singleDeviceSharedMemCapabilities; + cl_unified_shared_memory_capabilities_intel crossDeviceSharedMemCapabilities; + cl_unified_shared_memory_capabilities_intel sharedSystemMemCapabilities; + StackVec supportedThreadArbitrationPolicies; }; // clang-format on diff --git a/opencl/test/unit_test/api/cl_create_command_queue_with_properties_tests.cpp b/opencl/test/unit_test/api/cl_create_command_queue_with_properties_tests.cpp index 6ad211ea85..5bd69025c7 100644 --- a/opencl/test/unit_test/api/cl_create_command_queue_with_properties_tests.cpp +++ b/opencl/test/unit_test/api/cl_create_command_queue_with_properties_tests.cpp @@ -522,10 +522,9 @@ TEST_F(clCreateCommandQueueWithPropertiesApi, givenValidFamilyAndIndexSelectedWh } TEST_F(clCreateCommandQueueWithPropertiesApi, givenInvalidQueueFamilySelectedWhenCreatingQueueThenFail) { - const auto &families = castToObject(testedClDevice)->getDevice().getEngineGroups(); cl_queue_properties queueProperties[] = { CL_QUEUE_FAMILY_INTEL, - families.size(), + CommonConstants::engineGroupCount, CL_QUEUE_INDEX_INTEL, 0, 0, diff --git a/opencl/test/unit_test/command_queue/command_queue_tests.cpp b/opencl/test/unit_test/command_queue/command_queue_tests.cpp index 0bf5d97fa5..b7fc293539 100644 --- a/opencl/test/unit_test/command_queue/command_queue_tests.cpp +++ b/opencl/test/unit_test/command_queue/command_queue_tests.cpp @@ -1736,8 +1736,9 @@ struct CopyOnlyQueueTests : ::testing::Test { if (device->engineGroups[static_cast(EngineGroupType::Copy)].empty()) { GTEST_SKIP(); } - device->engineGroups.clear(); - device->engineGroups.resize(static_cast(EngineGroupType::MaxEngineGroups)); + for (auto &engineGroup : device->engineGroups) { + engineGroup.clear(); + } device->engines.clear(); device->createEngine(0, typeUsageRcs); @@ -1912,4 +1913,4 @@ TEST_F(MultiTileFixture, givenNotDefaultContextWithRootDeviceAndTileIdMaskWhenQu ASSERT_NE(nullptr, queue.gpgpuEngine); EXPECT_EQ(rootCsr->isMultiOsContextCapable(), queue.getGpgpuCommandStreamReceiver().isMultiOsContextCapable()); EXPECT_EQ(rootCsr, queue.gpgpuEngine->commandStreamReceiver); -} \ No newline at end of file +} diff --git a/opencl/test/unit_test/device/device_tests.cpp b/opencl/test/unit_test/device/device_tests.cpp index 7760d1d8e9..b84d384487 100644 --- a/opencl/test/unit_test/device/device_tests.cpp +++ b/opencl/test/unit_test/device/device_tests.cpp @@ -488,8 +488,10 @@ TEST(DeviceCreation, givenDeviceWhenCheckingParentDeviceThenCorrectValueIsReturn } TEST(DeviceCreation, givenRootDeviceWithSubDevicesWhenCheckingEngineGroupsThenItHasOneNonEmptyGroup) { + static_assert(sizeof(Device::EngineGroupsT) == sizeof(std::vector) * static_cast(EngineGroupType::MaxEngineGroups), + "Expect size of EngineGroupsT to match EngineGroupType::MaxEngineGroups"); + UltDeviceFactory deviceFactory{1, 2}; - EXPECT_EQ(static_cast(EngineGroupType::MaxEngineGroups), deviceFactory.rootDevices[0]->getEngineGroups().size()); EXPECT_NE(nullptr, deviceFactory.rootDevices[0]->getNonEmptyEngineGroup(0)); EXPECT_EQ(nullptr, deviceFactory.rootDevices[0]->getNonEmptyEngineGroup(1)); } @@ -581,17 +583,17 @@ TEST(DeviceGetEngineTest, givenNoEmptyGroupsWhenGettingNonEmptyGroupsThenReturnC auto device = std::unique_ptr(MockDevice::createWithNewExecutionEnvironment(nullptr)); auto &engineGroups = device->getEngineGroups(); - engineGroups.clear(); - engineGroups.push_back(nonEmptyEngineGroup); - engineGroups.push_back(nonEmptyEngineGroup); - engineGroups.push_back(nonEmptyEngineGroup); - engineGroups.push_back(nonEmptyEngineGroup); + for (auto &engineGroup : engineGroups) { + engineGroup.clear(); + } + engineGroups[0] = nonEmptyEngineGroup; + engineGroups[1] = nonEmptyEngineGroup; + engineGroups[2] = nonEmptyEngineGroup; EXPECT_EQ(&engineGroups[0], device->getNonEmptyEngineGroup(0)); EXPECT_EQ(&engineGroups[1], device->getNonEmptyEngineGroup(1)); EXPECT_EQ(&engineGroups[2], device->getNonEmptyEngineGroup(2)); - EXPECT_EQ(&engineGroups[3], device->getNonEmptyEngineGroup(3)); - EXPECT_EQ(nullptr, device->getNonEmptyEngineGroup(4)); + EXPECT_EQ(nullptr, device->getNonEmptyEngineGroup(3)); } TEST(DeviceGetEngineTest, givenEmptyGroupsWhenGettingNonEmptyGroupsThenReturnCorrectResults) { @@ -600,14 +602,15 @@ TEST(DeviceGetEngineTest, givenEmptyGroupsWhenGettingNonEmptyGroupsThenReturnCor auto device = std::unique_ptr(MockDevice::createWithNewExecutionEnvironment(nullptr)); auto &engineGroups = device->getEngineGroups(); - engineGroups.clear(); - engineGroups.push_back(emptyEngineGroup); - engineGroups.push_back(nonEmptyEngineGroup); - engineGroups.push_back(emptyEngineGroup); - engineGroups.push_back(nonEmptyEngineGroup); + for (auto &engineGroup : engineGroups) { + engineGroup.clear(); + } + engineGroups[0] = nonEmptyEngineGroup; + engineGroups[1] = emptyEngineGroup; + engineGroups[2] = nonEmptyEngineGroup; - EXPECT_EQ(&engineGroups[1], device->getNonEmptyEngineGroup(0)); - EXPECT_EQ(&engineGroups[3], device->getNonEmptyEngineGroup(1)); + EXPECT_EQ(&engineGroups[0], device->getNonEmptyEngineGroup(0)); + EXPECT_EQ(&engineGroups[2], device->getNonEmptyEngineGroup(1)); EXPECT_EQ(nullptr, device->getNonEmptyEngineGroup(2)); } @@ -616,18 +619,18 @@ TEST(DeviceGetEngineTest, givenNoEmptyGroupsWhenGettingNonEmptyGroupIndexThenRet auto device = std::unique_ptr(MockDevice::createWithNewExecutionEnvironment(nullptr)); auto &engineGroups = device->getEngineGroups(); - engineGroups.clear(); - engineGroups.push_back(nonEmptyEngineGroup); - engineGroups.push_back(nonEmptyEngineGroup); - engineGroups.push_back(nonEmptyEngineGroup); - engineGroups.push_back(nonEmptyEngineGroup); + for (auto &engineGroup : engineGroups) { + engineGroup.clear(); + } + engineGroups[0] = nonEmptyEngineGroup; + engineGroups[1] = nonEmptyEngineGroup; + engineGroups[2] = nonEmptyEngineGroup; EXPECT_EQ(0u, device->getIndexOfNonEmptyEngineGroup(static_cast(0u))); EXPECT_EQ(1u, device->getIndexOfNonEmptyEngineGroup(static_cast(1u))); EXPECT_EQ(2u, device->getIndexOfNonEmptyEngineGroup(static_cast(2u))); - EXPECT_EQ(3u, device->getIndexOfNonEmptyEngineGroup(static_cast(3u))); + EXPECT_ANY_THROW(device->getIndexOfNonEmptyEngineGroup(static_cast(3u))); EXPECT_ANY_THROW(device->getIndexOfNonEmptyEngineGroup(static_cast(4u))); - EXPECT_ANY_THROW(device->getIndexOfNonEmptyEngineGroup(static_cast(5u))); } TEST(DeviceGetEngineTest, givenEmptyGroupsWhenGettingNonEmptyGroupIndexThenReturnCorrectResults) { @@ -636,18 +639,18 @@ TEST(DeviceGetEngineTest, givenEmptyGroupsWhenGettingNonEmptyGroupIndexThenRetur auto device = std::unique_ptr(MockDevice::createWithNewExecutionEnvironment(nullptr)); auto &engineGroups = device->getEngineGroups(); - engineGroups.clear(); - engineGroups.push_back(emptyEngineGroup); - engineGroups.push_back(nonEmptyEngineGroup); - engineGroups.push_back(emptyEngineGroup); - engineGroups.push_back(nonEmptyEngineGroup); + for (auto &engineGroup : engineGroups) { + engineGroup.clear(); + } + engineGroups[0] = nonEmptyEngineGroup; + engineGroups[1] = emptyEngineGroup; + engineGroups[2] = nonEmptyEngineGroup; - EXPECT_ANY_THROW(device->getIndexOfNonEmptyEngineGroup(static_cast(0u))); - EXPECT_EQ(0u, device->getIndexOfNonEmptyEngineGroup(static_cast(1u))); - EXPECT_ANY_THROW(device->getIndexOfNonEmptyEngineGroup(static_cast(2u))); - EXPECT_EQ(1u, device->getIndexOfNonEmptyEngineGroup(static_cast(3u))); + EXPECT_EQ(0u, device->getIndexOfNonEmptyEngineGroup(static_cast(0u))); + EXPECT_ANY_THROW(device->getIndexOfNonEmptyEngineGroup(static_cast(1u))); + EXPECT_EQ(1u, device->getIndexOfNonEmptyEngineGroup(static_cast(2u))); + EXPECT_ANY_THROW(device->getIndexOfNonEmptyEngineGroup(static_cast(3u))); EXPECT_ANY_THROW(device->getIndexOfNonEmptyEngineGroup(static_cast(4u))); - EXPECT_ANY_THROW(device->getIndexOfNonEmptyEngineGroup(static_cast(5u))); } TEST(DeviceGetEngineTest, givenDeferredContextInitializationEnabledWhenCreatingEnginesThenInitializeOnlyOsContextsWhichRequireIt) { diff --git a/opencl/test/unit_test/device/get_device_info_tests.cpp b/opencl/test/unit_test/device/get_device_info_tests.cpp index 181960d8bb..3dbd0d8674 100644 --- a/opencl/test/unit_test/device/get_device_info_tests.cpp +++ b/opencl/test/unit_test/device/get_device_info_tests.cpp @@ -727,7 +727,7 @@ HWTEST_F(GetDeviceInfoQueueFamilyTest, givenSingleDeviceWhenInitializingCapsThen size_t paramRetSize{}; cl_int retVal{}; - cl_queue_family_properties_intel families[static_cast(EngineGroupType::MaxEngineGroups)]; + cl_queue_family_properties_intel families[CommonConstants::engineGroupCount]; retVal = clDevice.getDeviceInfo(CL_DEVICE_QUEUE_FAMILY_PROPERTIES_INTEL, sizeof(families), families, ¶mRetSize); EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(2u, paramRetSize / sizeof(cl_queue_family_properties_intel)); @@ -748,7 +748,7 @@ HWTEST_F(GetDeviceInfoQueueFamilyTest, givenSubDeviceWhenInitializingCapsThenRet size_t paramRetSize{}; cl_int retVal{}; - cl_queue_family_properties_intel families[static_cast(EngineGroupType::MaxEngineGroups)]; + cl_queue_family_properties_intel families[CommonConstants::engineGroupCount]; retVal = clDevice.getDeviceInfo(CL_DEVICE_QUEUE_FAMILY_PROPERTIES_INTEL, sizeof(families), families, ¶mRetSize); EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(2u, paramRetSize / sizeof(cl_queue_family_properties_intel)); @@ -781,7 +781,7 @@ HWTEST_F(GetDeviceInfoQueueFamilyTest, givenSubDeviceWithoutSupportedEngineWhenI // subdevice 0 { - cl_queue_family_properties_intel families[static_cast(EngineGroupType::MaxEngineGroups)]; + cl_queue_family_properties_intel families[CommonConstants::engineGroupCount]; retVal = clDevice0.getDeviceInfo(CL_DEVICE_QUEUE_FAMILY_PROPERTIES_INTEL, sizeof(families), families, ¶mRetSize); EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(2u, paramRetSize / sizeof(cl_queue_family_properties_intel)); @@ -797,7 +797,7 @@ HWTEST_F(GetDeviceInfoQueueFamilyTest, givenSubDeviceWithoutSupportedEngineWhenI // subdevice 1 { - cl_queue_family_properties_intel families[static_cast(EngineGroupType::MaxEngineGroups)]; + cl_queue_family_properties_intel families[CommonConstants::engineGroupCount]; retVal = clDevice1.getDeviceInfo(CL_DEVICE_QUEUE_FAMILY_PROPERTIES_INTEL, sizeof(families), families, ¶mRetSize); EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(1u, paramRetSize / sizeof(cl_queue_family_properties_intel)); @@ -821,7 +821,7 @@ HWTEST_F(GetDeviceInfoQueueFamilyTest, givenDeviceRootDeviceWhenInitializingCaps size_t paramRetSize{}; cl_int retVal{}; - cl_queue_family_properties_intel families[static_cast(EngineGroupType::MaxEngineGroups)]; + cl_queue_family_properties_intel families[CommonConstants::engineGroupCount]; retVal = clDevice.getDeviceInfo(CL_DEVICE_QUEUE_FAMILY_PROPERTIES_INTEL, sizeof(families), families, ¶mRetSize); EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(1u, paramRetSize / sizeof(cl_queue_family_properties_intel)); diff --git a/shared/source/device/device.cpp b/shared/source/device/device.cpp index c93ba7b207..d687130691 100644 --- a/shared/source/device/device.cpp +++ b/shared/source/device/device.cpp @@ -273,8 +273,6 @@ bool Device::createEngines() { auto &hwInfo = getHardwareInfo(); auto gpgpuEngines = HwHelper::get(hwInfo.platform.eRenderCoreFamily).getGpgpuEngineInstances(hwInfo); - this->engineGroups.resize(static_cast(EngineGroupType::MaxEngineGroups)); - uint32_t deviceCsrIndex = 0; for (auto &engine : gpgpuEngines) { if (engineSupported(engine) && !createEngine(deviceCsrIndex++, engine)) { @@ -410,7 +408,7 @@ bool Device::isDebuggerActive() const { const std::vector *Device::getNonEmptyEngineGroup(size_t index) const { auto nonEmptyGroupIndex = 0u; - for (auto groupIndex = 0u; groupIndex < engineGroups.size(); groupIndex++) { + for (auto groupIndex = 0u; groupIndex < CommonConstants::engineGroupCount; groupIndex++) { const std::vector *currentGroup = &engineGroups[groupIndex]; if (currentGroup->empty()) { continue; @@ -427,7 +425,7 @@ const std::vector *Device::getNonEmptyEngineGroup(size_t index) c size_t Device::getIndexOfNonEmptyEngineGroup(EngineGroupType engineGroupType) const { const auto groupIndex = static_cast(engineGroupType); - UNRECOVERABLE_IF(groupIndex >= engineGroups.size()); + UNRECOVERABLE_IF(groupIndex >= CommonConstants::engineGroupCount); UNRECOVERABLE_IF(engineGroups[groupIndex].empty()); size_t result = 0u; diff --git a/shared/source/device/device.h b/shared/source/device/device.h index 45c92d782a..561eb457f8 100644 --- a/shared/source/device/device.h +++ b/shared/source/device/device.h @@ -33,6 +33,9 @@ struct SelectorCopyEngine : NonCopyableOrMovableClass { class Device : public ReferenceTrackedObject { public: + using EngineGroupT = std::vector; + using EngineGroupsT = EngineGroupT[CommonConstants::engineGroupCount]; + Device &operator=(const Device &) = delete; Device(const Device &) = delete; ~Device() override; @@ -56,7 +59,7 @@ class Device : public ReferenceTrackedObject { const DeviceInfo &getDeviceInfo() const; EngineControl *tryGetEngine(aub_stream::EngineType engineType, EngineUsage engineUsage); EngineControl &getEngine(aub_stream::EngineType engineType, EngineUsage engineUsage); - std::vector> &getEngineGroups() { + EngineGroupsT &getEngineGroups() { return this->engineGroups; } const std::vector *getNonEmptyEngineGroup(size_t index) const; @@ -161,7 +164,7 @@ class Device : public ReferenceTrackedObject { std::unique_ptr performanceCounters; std::vector> commandStreamReceivers; std::vector engines; - std::vector> engineGroups; + EngineGroupsT engineGroups; std::vector subdevices; PreemptionMode preemptionMode; diff --git a/shared/source/device/root_device.cpp b/shared/source/device/root_device.cpp index 371840759e..d006c006ad 100644 --- a/shared/source/device/root_device.cpp +++ b/shared/source/device/root_device.cpp @@ -54,8 +54,6 @@ bool RootDevice::createEngines() { } void RootDevice::initializeRootCommandStreamReceiver() { - this->engineGroups.resize(static_cast(EngineGroupType::MaxEngineGroups)); - std::unique_ptr rootCommandStreamReceiver(createCommandStream(*executionEnvironment, rootDeviceIndex, getDeviceBitfield())); auto &hwInfo = getHardwareInfo(); diff --git a/shared/source/helpers/constants.h b/shared/source/helpers/constants.h index a50a78ac7a..50b2e13105 100644 --- a/shared/source/helpers/constants.h +++ b/shared/source/helpers/constants.h @@ -8,6 +8,8 @@ #pragma once #include "shared/source/helpers/common_types.h" +#include "engine_group_types.h" + #include #include #include @@ -86,4 +88,5 @@ namespace CommonConstants { constexpr uint32_t unspecifiedDeviceIndex = std::numeric_limits::max(); constexpr uint32_t invalidStepping = std::numeric_limits::max(); constexpr uint32_t maximalSimdSize = 32; +constexpr uint32_t engineGroupCount = static_cast(NEO::EngineGroupType::MaxEngineGroups); } // namespace CommonConstants diff --git a/shared/source/helpers/definitions/engine_group_types.h b/shared/source/helpers/definitions/engine_group_types.h index 3e211a9328..2993958eaa 100644 --- a/shared/source/helpers/definitions/engine_group_types.h +++ b/shared/source/helpers/definitions/engine_group_types.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 Intel Corporation + * Copyright (C) 2020-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -7,7 +7,7 @@ #pragma once -#include +#include namespace NEO { @@ -17,4 +17,5 @@ enum class EngineGroupType : uint32_t { Copy, MaxEngineGroups }; -} + +} // namespace NEO diff --git a/shared/test/common/mocks/mock_device.cpp b/shared/test/common/mocks/mock_device.cpp index 249c60de5e..140c130712 100644 --- a/shared/test/common/mocks/mock_device.cpp +++ b/shared/test/common/mocks/mock_device.cpp @@ -37,7 +37,6 @@ MockDevice::MockDevice() commandStreamReceiver->setupContext(*osContext); this->engines.resize(1); this->engines[0] = {commandStreamReceiver, osContext}; - this->engineGroups.resize(static_cast(EngineGroupType::MaxEngineGroups)); initializeCaps(); } @@ -49,7 +48,6 @@ MockDevice::MockDevice(ExecutionEnvironment *executionEnvironment, uint32_t root : RootDevice(executionEnvironment, rootDeviceIndex) { UltDeviceFactory::initializeMemoryManager(*executionEnvironment); this->osTime = MockOSTime::create(); - this->engineGroups.resize(static_cast(EngineGroupType::MaxEngineGroups)); auto &hwInfo = getHardwareInfo(); executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->setHwInfo(&hwInfo); initializeCaps();