From a8db48dbcad93d36e9a1a2a11420bf12caaa4aff Mon Sep 17 00:00:00 2001 From: "Dunajski, Bartosz" Date: Sat, 23 Mar 2019 14:26:06 +0100 Subject: [PATCH] Refactor Device::getEngine to get Engine by its type Change-Id: I640b32c0d226686e6648d39dd62404f5d507c98f Signed-off-by: Dunajski, Bartosz --- runtime/command_queue/command_queue_hw.h | 2 +- runtime/device/device.cpp | 10 +++++ runtime/device/device.h | 8 +--- unit_tests/device/device_tests.cpp | 38 ++++++++++++------- .../memory_manager/memory_manager_tests.cpp | 8 ++-- unit_tests/mocks/mock_device.h | 1 + 6 files changed, 43 insertions(+), 24 deletions(-) diff --git a/runtime/command_queue/command_queue_hw.h b/runtime/command_queue/command_queue_hw.h index 09194e8b8c..8cc6f5555b 100644 --- a/runtime/command_queue/command_queue_hw.h +++ b/runtime/command_queue/command_queue_hw.h @@ -36,7 +36,7 @@ class CommandQueueHw : public CommandQueue { if (clPriority & static_cast(CL_QUEUE_PRIORITY_LOW_KHR)) { priority = QueuePriority::LOW; - this->engine = &device->getEngine(EngineInstanceConstants::lowPriorityGpgpuEngineIndex); + this->engine = &device->getEngine(EngineType::ENGINE_RCS, true); } else if (clPriority & static_cast(CL_QUEUE_PRIORITY_MED_KHR)) { priority = QueuePriority::MEDIUM; } else if (clPriority & static_cast(CL_QUEUE_PRIORITY_HIGH_KHR)) { diff --git a/runtime/device/device.cpp b/runtime/device/device.cpp index b556186a72..e0a5327c85 100644 --- a/runtime/device/device.cpp +++ b/runtime/device/device.cpp @@ -277,4 +277,14 @@ void Device::initMaxPowerSavingMode() { engine.commandStreamReceiver->peekKmdNotifyHelper()->initMaxPowerSavingMode(); } } + +EngineControl &Device::getEngine(EngineType engineType, bool lowPriority) { + for (auto &engine : engines) { + if (engine.osContext->getEngineType() == engineType && + engine.osContext->isLowPriority() == lowPriority) { + return engine; + } + } + UNRECOVERABLE_IF(true); +} } // namespace OCLRT diff --git a/runtime/device/device.h b/runtime/device/device.h index daa7d5505b..4b1ad94d68 100644 --- a/runtime/device/device.h +++ b/runtime/device/device.h @@ -72,7 +72,7 @@ class Device : public BaseObject<_cl_device_id> { deviceInfo.force32BitAddressess = value; } - EngineControl &getEngine(uint32_t engineId); + EngineControl &getEngine(EngineType engineType, bool lowPriority); EngineControl &getDefaultEngine(); const char *getProductAbbrev() const; @@ -173,12 +173,8 @@ inline void Device::getCap(const void *&src, retSize = size = DeviceInfoTable::Map::size; } -inline EngineControl &Device::getEngine(uint32_t engineId) { - return engines[engineId]; -} - inline EngineControl &Device::getDefaultEngine() { - return getEngine(defaultEngineIndex); + return engines[defaultEngineIndex]; } inline MemoryManager *Device::getMemoryManager() const { diff --git a/unit_tests/device/device_tests.cpp b/unit_tests/device/device_tests.cpp index 027b93de35..5b65d35fcc 100644 --- a/unit_tests/device/device_tests.cpp +++ b/unit_tests/device/device_tests.cpp @@ -47,14 +47,26 @@ TEST_F(DeviceTest, getSupportedClVersion) { EXPECT_EQ(version, version2); } -TEST_F(DeviceTest, getTagAddress) { - for (uint32_t i = 0; i < static_cast(HwHelper::get(platformDevices[0]->pPlatform->eRenderCoreFamily).getGpgpuEngineInstances().size()); i++) { - auto tagAddress = pDevice->getEngine(i).commandStreamReceiver->getTagAddress(); +TEST_F(DeviceTest, givenDeviceWhenEngineIsCreatedThenSetInitialValueForTag) { + for (auto &engine : pDevice->engines) { + auto tagAddress = engine.commandStreamReceiver->getTagAddress(); ASSERT_NE(nullptr, const_cast(tagAddress)); EXPECT_EQ(initialHardwareTag, *tagAddress); } } +TEST_F(DeviceTest, givenDeviceWhenAskedForSpecificEngineThenRetrunIt) { + auto &engines = HwHelper::get(platformDevices[0]->pPlatform->eRenderCoreFamily).getGpgpuEngineInstances(); + for (uint32_t i = 0; i < engines.size(); i++) { + bool lowPriority = (EngineInstanceConstants::lowPriorityGpgpuEngineIndex == i); + auto &deviceEngine = pDevice->getEngine(engines[i], lowPriority); + EXPECT_EQ(deviceEngine.osContext->getEngineType(), engines[i]); + EXPECT_EQ(deviceEngine.osContext->isLowPriority(), lowPriority); + } + + EXPECT_THROW(pDevice->getEngine(EngineType::ENGINE_VCS, false), std::exception); +} + TEST_F(DeviceTest, WhenGetOSTimeThenNotNull) { auto pDevice = std::unique_ptr(MockDevice::createWithNewExecutionEnvironment(nullptr)); @@ -159,22 +171,22 @@ TEST(DeviceCreation, givenMultiDeviceWhenTheyAreCreatedThenEachOsContextHasUniqu const size_t numDevices = 2; const auto &numGpgpuEngines = static_cast(HwHelper::get(platformDevices[0]->pPlatform->eRenderCoreFamily).getGpgpuEngineInstances().size()); - auto device1 = std::unique_ptr(Device::create(nullptr, executionEnvironment, 0u)); - auto device2 = std::unique_ptr(Device::create(nullptr, executionEnvironment, 1u)); + auto device1 = std::unique_ptr(Device::create(nullptr, executionEnvironment, 0u)); + auto device2 = std::unique_ptr(Device::create(nullptr, executionEnvironment, 1u)); auto ®isteredEngines = executionEnvironment->memoryManager->getRegisteredEngines(); EXPECT_EQ(numGpgpuEngines * numDevices, registeredEngines.size()); for (uint32_t i = 0; i < numGpgpuEngines; i++) { - EXPECT_EQ(i, device1->getEngine(i).osContext->getContextId()); - EXPECT_EQ(1u, device1->getEngine(i).osContext->getDeviceBitfield().to_ulong()); - EXPECT_EQ(i + numGpgpuEngines, device2->getEngine(i).osContext->getContextId()); - EXPECT_EQ(2u, device2->getEngine(i).osContext->getDeviceBitfield().to_ulong()); + EXPECT_EQ(i, device1->engines[i].osContext->getContextId()); + EXPECT_EQ(1u, device1->engines[i].osContext->getDeviceBitfield().to_ulong()); + EXPECT_EQ(i + numGpgpuEngines, device2->engines[i].osContext->getContextId()); + EXPECT_EQ(2u, device2->engines[i].osContext->getDeviceBitfield().to_ulong()); EXPECT_EQ(registeredEngines[i].commandStreamReceiver, - device1->getEngine(i).commandStreamReceiver); + device1->engines[i].commandStreamReceiver); EXPECT_EQ(registeredEngines[i + numGpgpuEngines].commandStreamReceiver, - device2->getEngine(i).commandStreamReceiver); + device2->engines[i].commandStreamReceiver); } EXPECT_EQ(numGpgpuEngines * numDevices, executionEnvironment->memoryManager->getRegisteredEnginesCount()); } @@ -202,8 +214,8 @@ TEST(DeviceCreation, givenMultiDeviceWhenTheyAreCreatedThenEachDeviceHasSeperate for (uint32_t i = 0; i < static_cast(numGpgpuEngines); i++) { EXPECT_NE(nullptr, executionEnvironment->commandStreamReceivers[0][i]); EXPECT_NE(nullptr, executionEnvironment->commandStreamReceivers[1][i]); - EXPECT_EQ(executionEnvironment->commandStreamReceivers[0][i].get(), device1->getEngine(i).commandStreamReceiver); - EXPECT_EQ(executionEnvironment->commandStreamReceivers[1][i].get(), device2->getEngine(i).commandStreamReceiver); + EXPECT_EQ(executionEnvironment->commandStreamReceivers[0][i].get(), device1->engines[i].commandStreamReceiver); + EXPECT_EQ(executionEnvironment->commandStreamReceivers[1][i].get(), device2->engines[i].commandStreamReceiver); } } diff --git a/unit_tests/memory_manager/memory_manager_tests.cpp b/unit_tests/memory_manager/memory_manager_tests.cpp index cd2933855a..c7e365d99d 100644 --- a/unit_tests/memory_manager/memory_manager_tests.cpp +++ b/unit_tests/memory_manager/memory_manager_tests.cpp @@ -1472,8 +1472,8 @@ using GraphicsAllocationTests = ::testing::Test; HWTEST_F(GraphicsAllocationTests, givenAllocationUsedOnlyByNonDefaultCsrWhenCheckingUsageBeforeDestroyThenStoreItAsTemporaryAllocation) { auto device = std::unique_ptr(MockDevice::createWithNewExecutionEnvironment(platformDevices[0])); - auto nonDefaultOsContext = device->getEngine(EngineInstanceConstants::lowPriorityGpgpuEngineIndex).osContext; - auto nonDefaultCsr = reinterpret_cast *>(device->getEngine(EngineInstanceConstants::lowPriorityGpgpuEngineIndex).commandStreamReceiver); + auto nonDefaultOsContext = device->engines[EngineInstanceConstants::lowPriorityGpgpuEngineIndex].osContext; + auto nonDefaultCsr = reinterpret_cast *>(device->engines[EngineInstanceConstants::lowPriorityGpgpuEngineIndex].commandStreamReceiver); auto memoryManager = device->getExecutionEnvironment()->memoryManager.get(); auto graphicsAllocation = memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize}); @@ -1519,8 +1519,8 @@ HWTEST_F(GraphicsAllocationTests, givenAllocationUsedByManyOsContextsWhenCheckin memoryManager->multiContextResourceDestructor.reset(multiContextDestructor); auto device = std::unique_ptr(MockDevice::create(platformDevices[0], executionEnvironment, 0u)); - auto nonDefaultOsContext = device->getEngine(EngineInstanceConstants::lowPriorityGpgpuEngineIndex).osContext; - auto nonDefaultCsr = reinterpret_cast *>(device->getEngine(EngineInstanceConstants::lowPriorityGpgpuEngineIndex).commandStreamReceiver); + auto nonDefaultOsContext = device->engines[EngineInstanceConstants::lowPriorityGpgpuEngineIndex].osContext; + auto nonDefaultCsr = reinterpret_cast *>(device->engines[EngineInstanceConstants::lowPriorityGpgpuEngineIndex].commandStreamReceiver); auto defaultCsr = reinterpret_cast *>(device->getDefaultEngine().commandStreamReceiver); auto defaultOsContext = device->getDefaultEngine().osContext; diff --git a/unit_tests/mocks/mock_device.h b/unit_tests/mocks/mock_device.h index 970c3dce99..ba9c5556a2 100644 --- a/unit_tests/mocks/mock_device.h +++ b/unit_tests/mocks/mock_device.h @@ -19,6 +19,7 @@ extern CommandStreamReceiver *createCommandStream(ExecutionEnvironment &executio class MockDevice : public Device { public: + using Device::engines; using Device::executionEnvironment; using Device::initializeCaps;