Skip to content

Commit bcd9b2f

Browse files
Add debug flag to override command queue synchronous mode
Signed-off-by: Zbigniew Zdanowicz <[email protected]>
1 parent 2940450 commit bcd9b2f

File tree

5 files changed

+81
-7
lines changed

5 files changed

+81
-7
lines changed

level_zero/core/source/cmdqueue/cmdqueue.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ namespace L0 {
2323

2424
CommandQueueAllocatorFn commandQueueFactory[IGFX_MAX_PRODUCT] = {};
2525

26+
CommandQueueImp::CommandQueueImp(Device *device, NEO::CommandStreamReceiver *csr, const ze_command_queue_desc_t *desc)
27+
: device(device), csr(csr), desc(*desc) {
28+
int overrideCmdQueueSyncMode = NEO::DebugManager.flags.OverrideCmdQueueSynchronousMode.get();
29+
if (overrideCmdQueueSyncMode != -1) {
30+
this->desc.mode = static_cast<ze_command_queue_mode_t>(overrideCmdQueueSyncMode);
31+
}
32+
}
33+
2634
ze_result_t CommandQueueImp::destroy() {
2735
delete this;
2836
return ZE_RESULT_SUCCESS;
@@ -130,7 +138,7 @@ CommandQueue *CommandQueue::create(uint32_t productFamily, Device *device, NEO::
130138
return commandQueue;
131139
}
132140

133-
ze_command_queue_mode_t CommandQueueImp::getSynchronousMode() {
141+
ze_command_queue_mode_t CommandQueueImp::getSynchronousMode() const {
134142
return desc.mode;
135143
}
136144

level_zero/core/source/cmdqueue/cmdqueue_imp.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,7 @@ struct CommandQueueImp : public CommandQueue {
6060
NEO::CSRequirements::csOverfetchSize;
6161

6262
CommandQueueImp() = delete;
63-
CommandQueueImp(Device *device, NEO::CommandStreamReceiver *csr, const ze_command_queue_desc_t *desc)
64-
: device(device), csr(csr), desc(*desc) {
65-
}
63+
CommandQueueImp(Device *device, NEO::CommandStreamReceiver *csr, const ze_command_queue_desc_t *desc);
6664

6765
ze_result_t destroy() override;
6866

@@ -77,7 +75,7 @@ struct CommandQueueImp : public CommandQueue {
7775
NEO::CommandStreamReceiver *getCsr() { return csr; }
7876

7977
void reserveLinearStreamSize(size_t size);
80-
ze_command_queue_mode_t getSynchronousMode();
78+
ze_command_queue_mode_t getSynchronousMode() const;
8179
virtual void dispatchTaskCountWrite(NEO::LinearStream &commandStream, bool flushDataCache) = 0;
8280
virtual bool getPreemptionCmdProgramming() = 0;
8381

@@ -90,7 +88,7 @@ struct CommandQueueImp : public CommandQueue {
9088

9189
Device *device = nullptr;
9290
NEO::CommandStreamReceiver *csr = nullptr;
93-
const ze_command_queue_desc_t desc;
91+
ze_command_queue_desc_t desc;
9492
NEO::LinearStream *commandStream = nullptr;
9593
std::atomic<uint32_t> taskCount{0};
9694
std::vector<Kernel *> printfFunctionContainer;

level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1576,5 +1576,71 @@ TEST_F(CommandQueueInitTests, givenMultipleSubDevicesWhenInitializingThenAllocat
15761576

15771577
commandQueue->destroy();
15781578
}
1579+
1580+
TEST_F(CommandQueueCreate, givenOverrideCmdQueueSyncModeToDefaultWhenCommandQueueIsCreatedWithSynchronousModeThenDefaultModeIsSelected) {
1581+
DebugManagerStateRestore restore;
1582+
NEO::DebugManager.flags.OverrideCmdQueueSynchronousMode.set(0);
1583+
1584+
ze_command_queue_desc_t desc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC};
1585+
desc.mode = ZE_COMMAND_QUEUE_MODE_SYNCHRONOUS;
1586+
ze_result_t returnValue = ZE_RESULT_ERROR_DEVICE_LOST;
1587+
L0::CommandQueue *commandQueue = CommandQueue::create(productFamily,
1588+
device,
1589+
neoDevice->getDefaultEngine().commandStreamReceiver,
1590+
&desc,
1591+
false,
1592+
false,
1593+
returnValue);
1594+
ASSERT_NE(nullptr, commandQueue);
1595+
EXPECT_EQ(returnValue, ZE_RESULT_SUCCESS);
1596+
auto cmdQueueSynchronousMode = reinterpret_cast<L0::CommandQueueImp *>(commandQueue)->getSynchronousMode();
1597+
EXPECT_EQ(ZE_COMMAND_QUEUE_MODE_DEFAULT, cmdQueueSynchronousMode);
1598+
1599+
commandQueue->destroy();
1600+
}
1601+
1602+
TEST_F(CommandQueueCreate, givenOverrideCmdQueueSyncModeToAsynchronousWhenCommandQueueIsCreatedWithSynchronousModeThenAsynchronousModeIsSelected) {
1603+
DebugManagerStateRestore restore;
1604+
NEO::DebugManager.flags.OverrideCmdQueueSynchronousMode.set(2);
1605+
1606+
ze_command_queue_desc_t desc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC};
1607+
desc.mode = ZE_COMMAND_QUEUE_MODE_SYNCHRONOUS;
1608+
ze_result_t returnValue = ZE_RESULT_ERROR_DEVICE_LOST;
1609+
L0::CommandQueue *commandQueue = CommandQueue::create(productFamily,
1610+
device,
1611+
neoDevice->getDefaultEngine().commandStreamReceiver,
1612+
&desc,
1613+
false,
1614+
false,
1615+
returnValue);
1616+
ASSERT_NE(nullptr, commandQueue);
1617+
EXPECT_EQ(returnValue, ZE_RESULT_SUCCESS);
1618+
auto cmdQueueSynchronousMode = reinterpret_cast<L0::CommandQueueImp *>(commandQueue)->getSynchronousMode();
1619+
EXPECT_EQ(ZE_COMMAND_QUEUE_MODE_ASYNCHRONOUS, cmdQueueSynchronousMode);
1620+
1621+
commandQueue->destroy();
1622+
}
1623+
1624+
TEST_F(CommandQueueCreate, givenOverrideCmdQueueSyncModeToSynchronousWhenCommandQueueIsCreatedWithAsynchronousModeThenSynchronousModeIsSelected) {
1625+
DebugManagerStateRestore restore;
1626+
NEO::DebugManager.flags.OverrideCmdQueueSynchronousMode.set(1);
1627+
1628+
ze_command_queue_desc_t desc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC};
1629+
desc.mode = ZE_COMMAND_QUEUE_MODE_ASYNCHRONOUS;
1630+
ze_result_t returnValue = ZE_RESULT_ERROR_DEVICE_LOST;
1631+
L0::CommandQueue *commandQueue = CommandQueue::create(productFamily,
1632+
device,
1633+
neoDevice->getDefaultEngine().commandStreamReceiver,
1634+
&desc,
1635+
false,
1636+
false,
1637+
returnValue);
1638+
ASSERT_NE(nullptr, commandQueue);
1639+
EXPECT_EQ(returnValue, ZE_RESULT_SUCCESS);
1640+
auto cmdQueueSynchronousMode = reinterpret_cast<L0::CommandQueueImp *>(commandQueue)->getSynchronousMode();
1641+
EXPECT_EQ(ZE_COMMAND_QUEUE_MODE_SYNCHRONOUS, cmdQueueSynchronousMode);
1642+
1643+
commandQueue->destroy();
1644+
}
15791645
} // namespace ult
15801646
} // namespace L0

opencl/test/unit_test/test_files/igdrcl.config

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,4 +299,5 @@ EnableUserFenceUseCtxId = -1
299299
EnableResourceTags = 0
300300
SetKmdWaitTimeout = -1
301301
OverrideNotifyEnableForTagUpdatePostSync = -1
302-
Force32BitDriverSupport = -1
302+
Force32BitDriverSupport = -1
303+
OverrideCmdQueueSynchronousMode = -1

shared/source/debug_settings/debug_variables_base.inl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, EnableImmediateVmBindExt, -1, "Use immediate bin
149149
DECLARE_DEBUG_VARIABLE(int32_t, ForceExecutionTile, -1, "-1: default, 0+: given tile is choosen as submission, must be used with EnableWalkerPartition = 0.")
150150
DECLARE_DEBUG_VARIABLE(int32_t, OverrideTimestampPacketSize, -1, "-1: default, >0: size in bytes. 4 and 8 supported for experiments")
151151
DECLARE_DEBUG_VARIABLE(int32_t, OverrideMaxWorkGroupCount, -1, "-1: default, >0: Max WG size")
152+
DECLARE_DEBUG_VARIABLE(int32_t, OverrideCmdQueueSynchronousMode, -1, "Overrides all command queues synchronous mode: -1: do not override, 0: implicit driver behavior, 1: synchronous, 2: asynchronous")
152153

153154
/*LOGGING FLAGS*/
154155
DECLARE_DEBUG_VARIABLE(int32_t, PrintDriverDiagnostics, -1, "prints driver diagnostics messages to standard output, value corresponds to hint level")

0 commit comments

Comments
 (0)