diff --git a/runtime/command_queue/command_queue.cpp b/runtime/command_queue/command_queue.cpp index f12c51e19c..a1bde00252 100644 --- a/runtime/command_queue/command_queue.cpp +++ b/runtime/command_queue/command_queue.cpp @@ -74,10 +74,6 @@ CommandQueue::CommandQueue(Context *context, Device *deviceId, const cl_queue_pr } processProperties(properties); - - if (DebugManager.flags.ForceMultiEngineQueue.get() > -1) { - this->multiEngineQueue = DebugManager.flags.ForceMultiEngineQueue.get(); - } } CommandQueue::~CommandQueue() { diff --git a/runtime/execution_environment/execution_environment.cpp b/runtime/execution_environment/execution_environment.cpp index 08ac839d22..da7ed6b533 100644 --- a/runtime/execution_environment/execution_environment.cpp +++ b/runtime/execution_environment/execution_environment.cpp @@ -94,4 +94,13 @@ BuiltIns *ExecutionEnvironment::getBuiltIns() { } return this->builtins.get(); } + +EngineControl *ExecutionEnvironment::getEngineControlForSpecialCsr() { + EngineControl *engine = nullptr; + if (specialCommandStreamReceiver.get()) { + engine = memoryManager->getRegisteredEngineForCsr(specialCommandStreamReceiver.get()); + } + return engine; +} + } // namespace OCLRT diff --git a/runtime/execution_environment/execution_environment.h b/runtime/execution_environment/execution_environment.h index 06a3da0cfb..e0a286a926 100644 --- a/runtime/execution_environment/execution_environment.h +++ b/runtime/execution_environment/execution_environment.h @@ -17,14 +17,15 @@ namespace OCLRT { class AubCenter; -class GmmHelper; +class BuiltIns; class CommandStreamReceiver; +class CompilerInterface; +class GmmHelper; class MemoryManager; class SourceLevelDebugger; -class CompilerInterface; -class BuiltIns; -struct HardwareInfo; class OSInterface; +struct EngineControl; +struct HardwareInfo; using CsrContainer = std::vector>>; @@ -50,6 +51,7 @@ class ExecutionEnvironment : public ReferenceTrackedObject GmmHelper *getGmmHelper() const; MOCKABLE_VIRTUAL CompilerInterface *getCompilerInterface(); BuiltIns *getBuiltIns(); + EngineControl *getEngineControlForSpecialCsr(); std::unique_ptr osInterface; std::unique_ptr memoryManager; diff --git a/runtime/memory_manager/memory_manager.cpp b/runtime/memory_manager/memory_manager.cpp index 8ecb8f67de..f72ee468e0 100644 --- a/runtime/memory_manager/memory_manager.cpp +++ b/runtime/memory_manager/memory_manager.cpp @@ -345,6 +345,17 @@ EngineControlContainer &MemoryManager::getRegisteredEngines() { return registeredEngines; } +EngineControl *MemoryManager::getRegisteredEngineForCsr(CommandStreamReceiver *commandStreamReceiver) { + EngineControl *engineCtrl = nullptr; + for (auto &engine : registeredEngines) { + if (engine.commandStreamReceiver == commandStreamReceiver) { + engineCtrl = &engine; + break; + } + } + return engineCtrl; +} + CommandStreamReceiver *MemoryManager::getDefaultCommandStreamReceiver(uint32_t deviceId) const { return executionEnvironment.commandStreamReceivers[deviceId][defaultEngineIndex].get(); } diff --git a/runtime/memory_manager/memory_manager.h b/runtime/memory_manager/memory_manager.h index 4eba701f2e..2e591dd896 100644 --- a/runtime/memory_manager/memory_manager.h +++ b/runtime/memory_manager/memory_manager.h @@ -187,6 +187,7 @@ class MemoryManager { uint32_t getRegisteredEnginesCount() const { return static_cast(registeredEngines.size()); } CommandStreamReceiver *getDefaultCommandStreamReceiver(uint32_t deviceId) const; EngineControlContainer &getRegisteredEngines(); + EngineControl *getRegisteredEngineForCsr(CommandStreamReceiver *commandStreamReceiver); HostPtrManager *getHostPtrManager() const { return hostPtrManager.get(); } void setDefaultEngineIndex(uint32_t index) { defaultEngineIndex = index; } diff --git a/runtime/os_interface/debug_variables_base.inl b/runtime/os_interface/debug_variables_base.inl index b7181dc158..87da855e23 100644 --- a/runtime/os_interface/debug_variables_base.inl +++ b/runtime/os_interface/debug_variables_base.inl @@ -120,6 +120,5 @@ DECLARE_DEBUG_VARIABLE(int32_t, NodeOrdinal, -1, "-1: default do not override, 0 DECLARE_DEBUG_VARIABLE(int32_t, OverrideThreadArbitrationPolicy, -1, "-1 (dont override) or any valid config (0: Age Based, 1: Round Robin)") DECLARE_DEBUG_VARIABLE(int32_t, OverrideAubDeviceId, -1, "-1 dont override, any other: use this value for AUB generation device id") DECLARE_DEBUG_VARIABLE(int32_t, EnableTimestampPacket, -1, "-1: default, 0: disable, 1:enable. Write Timestamp Packet for each set of gpu walkers") -DECLARE_DEBUG_VARIABLE(int32_t, ForceMultiEngineQueue, -1, "-1 no change, 0: force false 1:force true. Forces multi engine queue flag in command queue") DECLARE_DEBUG_VARIABLE(bool, UseMaxSimdSizeToDeduceMaxWorkgroupSize, false, "With this flag on, max workgroup size is deduced using SIMD32 instead of SIMD8, this causes the max wkg size to be 4 times bigger") DECLARE_DEBUG_VARIABLE(bool, ReturnRawGpuTimestamps, false, "Driver returns raw GPU tiemstamps instead of calculated ones.") diff --git a/unit_tests/command_queue/command_queue_tests.cpp b/unit_tests/command_queue/command_queue_tests.cpp index dc2adc8f3e..b2bab064aa 100644 --- a/unit_tests/command_queue/command_queue_tests.cpp +++ b/unit_tests/command_queue/command_queue_tests.cpp @@ -984,12 +984,3 @@ TEST(CommandQueuePropertiesTests, whenDefaultCommandQueueIsCreatedThenItIsNotMul queue.multiEngineQueue = true; EXPECT_TRUE(queue.isMultiEngineQueue()); } -TEST(CommandQueuePropertiesTests, whenDebugVariableOverridesMultiEngineVariableThenItIsSetToTrue) { - DebugManagerStateRestore restore; - DebugManager.flags.ForceMultiEngineQueue.set(1u); - MockCommandQueue queue; - EXPECT_TRUE(queue.isMultiEngineQueue()); - DebugManager.flags.ForceMultiEngineQueue.set(0u); - MockCommandQueue queue2; - EXPECT_FALSE(queue2.isMultiEngineQueue()); -} diff --git a/unit_tests/execution_environment/execution_environment_tests.cpp b/unit_tests/execution_environment/execution_environment_tests.cpp index 5c66f79014..e104d7e911 100644 --- a/unit_tests/execution_environment/execution_environment_tests.cpp +++ b/unit_tests/execution_environment/execution_environment_tests.cpp @@ -7,6 +7,7 @@ #include "runtime/aub/aub_center.h" #include "runtime/built_ins/built_ins.h" +#include "runtime/command_stream/preemption.h" #include "runtime/compiler_interface/compiler_interface.h" #include "runtime/device/device.h" #include "runtime/execution_environment/execution_environment.h" @@ -279,3 +280,31 @@ HWTEST_F(ExecutionEnvironmentHw, givenHwHelperInputWhenInitializingCsrThenCreate auto csr2 = static_cast *>(executionEnvironment.commandStreamReceivers[2][0].get()); EXPECT_EQ(UnitTestHelper::isPageTableManagerSupported(localHwInfo), csr2->createPageTableManagerCalled); } + +TEST(ExecutionEnvironment, whenSpecialCsrNotExistThenReturnNullSpecialEngineControl) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->initializeCommandStreamReceiver(platformDevices[0], 0, 0); + executionEnvironment->initializeMemoryManager(false, false, 0, 0); + EXPECT_NE(nullptr, executionEnvironment->memoryManager); + auto engineControl = executionEnvironment->getEngineControlForSpecialCsr(); + EXPECT_EQ(nullptr, engineControl); +} + +TEST(ExecutionEnvironment, whenSpecialCsrExistsThenReturnSpecialEngineControl) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->initializeCommandStreamReceiver(platformDevices[0], 0, 0); + executionEnvironment->initializeMemoryManager(false, false, 0, 0); + EXPECT_NE(nullptr, executionEnvironment->memoryManager); + + executionEnvironment->specialCommandStreamReceiver.reset(createCommandStream(platformDevices[0], *executionEnvironment)); + auto engineType = HwHelper::get(platformDevices[0]->pPlatform->eRenderCoreFamily).getGpgpuEngineInstances()[0]; + auto osContext = executionEnvironment->memoryManager->createAndRegisterOsContext(executionEnvironment->specialCommandStreamReceiver.get(), + engineType, + 1, + PreemptionHelper::getDefaultPreemptionMode(*platformDevices[0])); + executionEnvironment->specialCommandStreamReceiver->setupContext(*osContext); + + auto engineControl = executionEnvironment->getEngineControlForSpecialCsr(); + ASSERT_NE(nullptr, engineControl); + EXPECT_EQ(executionEnvironment->specialCommandStreamReceiver.get(), engineControl->commandStreamReceiver); +} diff --git a/unit_tests/memory_manager/memory_manager_tests.cpp b/unit_tests/memory_manager/memory_manager_tests.cpp index 5e682a1d59..e1be9e76da 100644 --- a/unit_tests/memory_manager/memory_manager_tests.cpp +++ b/unit_tests/memory_manager/memory_manager_tests.cpp @@ -1703,3 +1703,15 @@ TEST(MemoryAllocationTest, givenMemoryPoolWhenPassedToMemoryAllocationConstructo MemoryAllocation allocation{GraphicsAllocation::AllocationType::COMMAND_BUFFER, nullptr, nullptr, 0, 0, 0, MemoryPool::System64KBPages, false}; EXPECT_EQ(MemoryPool::System64KBPages, allocation.getMemoryPool()); } + +TEST_F(MemoryAllocatorTest, whenCommandStreamerIsRegisteredThenReturnAssociatedEngineControl) { + auto engineControl = memoryManager->getRegisteredEngineForCsr(csr); + ASSERT_NE(nullptr, engineControl); + EXPECT_EQ(csr, engineControl->commandStreamReceiver); +} + +TEST_F(MemoryAllocatorTest, whenCommandStreamerIsNotRegisteredThenReturnNullEngineControl) { + CommandStreamReceiver *dummyCsr = reinterpret_cast(0x1); + auto engineControl = memoryManager->getRegisteredEngineForCsr(dummyCsr); + EXPECT_EQ(nullptr, engineControl); +} diff --git a/unit_tests/mocks/mock_command_queue.h b/unit_tests/mocks/mock_command_queue.h index 5766742c69..c341ee77a5 100644 --- a/unit_tests/mocks/mock_command_queue.h +++ b/unit_tests/mocks/mock_command_queue.h @@ -17,6 +17,7 @@ namespace OCLRT { class MockCommandQueue : public CommandQueue { public: using CommandQueue::device; + using CommandQueue::engine; using CommandQueue::multiEngineQueue; using CommandQueue::obtainNewTimestampPacketNodes; using CommandQueue::requiresCacheFlushAfterWalker; diff --git a/unit_tests/test_files/igdrcl.config b/unit_tests/test_files/igdrcl.config index e7672414f3..528ec276ef 100644 --- a/unit_tests/test_files/igdrcl.config +++ b/unit_tests/test_files/igdrcl.config @@ -106,4 +106,3 @@ EnableCacheFlushAfterWalker = 0 EnableHostPtrTracking = 1 DisableDcFlushInEpilogue = 0 EnableCacheFlushAfterWalkerForAllQueues = 0 -ForceMultiEngineQueue = -1