From 0e7fd2ffed1044f6cf39161b39d8b4df7805e27c Mon Sep 17 00:00:00 2001 From: "Mrozek, Michal" Date: Tue, 12 Feb 2019 10:35:22 +0100 Subject: [PATCH] Add multiEngine field to command queue with debug variable to override it. Change-Id: I3c1e424a7ad545e166e178d1726595e6d9502ca7 --- runtime/command_queue/command_queue.cpp | 4 ++++ runtime/command_queue/command_queue.h | 3 +++ runtime/os_interface/debug_variables_base.inl | 1 + .../command_queue/command_queue_tests.cpp | 18 ++++++++++++++++++ unit_tests/mocks/mock_command_queue.h | 1 + unit_tests/test_files/igdrcl.config | 1 + 6 files changed, 28 insertions(+) diff --git a/runtime/command_queue/command_queue.cpp b/runtime/command_queue/command_queue.cpp index fe6dafdc77..ced72cd6b4 100644 --- a/runtime/command_queue/command_queue.cpp +++ b/runtime/command_queue/command_queue.cpp @@ -71,6 +71,10 @@ 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/command_queue/command_queue.h b/runtime/command_queue/command_queue.h index cc156a11b2..4de1033ac4 100644 --- a/runtime/command_queue/command_queue.h +++ b/runtime/command_queue/command_queue.h @@ -406,6 +406,8 @@ class CommandQueue : public BaseObject<_cl_command_queue> { return requiresCacheFlushAfterWalker; } + bool isMultiEngineQueue() { return this->multiEngineQueue; } + // taskCount of last task uint32_t taskCount = 0; @@ -456,6 +458,7 @@ class CommandQueue : public BaseObject<_cl_command_queue> { bool mapDcFlushRequired = false; bool isSpecialCommandQueue = false; bool requiresCacheFlushAfterWalker = false; + bool multiEngineQueue = false; std::unique_ptr timestampPacketContainer; diff --git a/runtime/os_interface/debug_variables_base.inl b/runtime/os_interface/debug_variables_base.inl index 00f581b402..a8111eed97 100644 --- a/runtime/os_interface/debug_variables_base.inl +++ b/runtime/os_interface/debug_variables_base.inl @@ -122,5 +122,6 @@ 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 0b1c6f50df..aea9cc2300 100644 --- a/unit_tests/command_queue/command_queue_tests.cpp +++ b/unit_tests/command_queue/command_queue_tests.cpp @@ -23,6 +23,7 @@ #include "unit_tests/fixtures/memory_management_fixture.h" #include "unit_tests/fixtures/buffer_fixture.h" #include "unit_tests/helpers/unit_test_helper.h" +#include "unit_tests/helpers/debug_manager_state_restore.h" #include "unit_tests/libult/ult_command_stream_receiver.h" #include "unit_tests/mocks/mock_memory_manager.h" #include "unit_tests/mocks/mock_command_queue.h" @@ -976,3 +977,20 @@ TEST(CommandQueueDestructorTest, whenCommandQueueIsDestroyedThenDestroysTimestam context->release(); EXPECT_EQ(1, context->getRefInternalCount()); } + +TEST(CommandQueuePropertiesTests, whenDefaultCommandQueueIsCreatedThenItIsNotMultiEngineQueue) { + MockCommandQueue queue; + EXPECT_FALSE(queue.multiEngineQueue); + EXPECT_FALSE(queue.isMultiEngineQueue()); + 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/mocks/mock_command_queue.h b/unit_tests/mocks/mock_command_queue.h index ae4248525d..c7a4570d77 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::multiEngineQueue; using CommandQueue::obtainNewTimestampPacketNodes; using CommandQueue::requiresCacheFlushAfterWalker; using CommandQueue::throttle; diff --git a/unit_tests/test_files/igdrcl.config b/unit_tests/test_files/igdrcl.config index 24cbe735c8..299be4ef06 100644 --- a/unit_tests/test_files/igdrcl.config +++ b/unit_tests/test_files/igdrcl.config @@ -108,3 +108,4 @@ EnableCacheFlushAfterWalker = 0 EnableHostPtrTracking = 1 DisableDcFlushInEpilogue = 0 EnableCacheFlushAfterWalkerForAllQueues = 0 +ForceMultiEngineQueue = -1