Skip to content

Commit 921f76e

Browse files
Calculate timeout using CCSes count
Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
1 parent d46ed9a commit 921f76e

File tree

6 files changed

+172
-0
lines changed

6 files changed

+172
-0
lines changed

shared/source/debug_settings/debug_variables_base.inl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionNewResourceTlbFlush, -1, "-1: dr
295295
DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionDisableMonitorFence, -1, "Disable dispatching monitor fence commands")
296296
DECLARE_DEBUG_VARIABLE(int32_t, EnableDirectSubmissionController, -1, "Enable direct submission terminating after given timeout, -1: default, 0: disabled, 1: enabled")
297297
DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionControllerTimeout, -1, "Set direct submission controller timeout, -1: default 5000 us, >=0: timeout in us")
298+
DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionControllerDivisor, -1, "Set direct submission controller timeout divider, -1: default 2, >0: divider value")
298299
DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionForceLocalMemoryStorageMode, -1, "Force local memory storage for command/ring/semaphore buffer, -1: default - for all engines, 0: disabled, 1: for multiOsContextCapable engine, 2: for all engines")
299300
DECLARE_DEBUG_VARIABLE(int32_t, EnableRingSwitchTagUpdateWa, -1, "-1: default, 0 - disable, 1 - enable. If enabled, completionRingBuffers wont be updated if ring is not runnning.")
300301
DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionReadBackCommandBuffer, -1, "-1: default - disabled, 0 - disable, 1 - enable. If enabled, read first dword of cmd buffer after handling residency.")

shared/source/direct_submission/direct_submission_controller.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "shared/source/direct_submission/direct_submission_controller.h"
99

1010
#include "shared/source/command_stream/command_stream_receiver.h"
11+
#include "shared/source/os_interface/os_context.h"
1112
#include "shared/source/os_interface/os_thread.h"
1213

1314
#include <chrono>
@@ -18,6 +19,9 @@ DirectSubmissionController::DirectSubmissionController() {
1819
if (DebugManager.flags.DirectSubmissionControllerTimeout.get() != -1) {
1920
timeout = DebugManager.flags.DirectSubmissionControllerTimeout.get();
2021
}
22+
if (DebugManager.flags.DirectSubmissionControllerDivisor.get() != -1) {
23+
timeoutDivisor = DebugManager.flags.DirectSubmissionControllerDivisor.get();
24+
}
2125

2226
directSubmissionControllingThread = Thread::create(controlDirectSubmissionsState, reinterpret_cast<void *>(this));
2327
};
@@ -33,6 +37,7 @@ DirectSubmissionController::~DirectSubmissionController() {
3337
void DirectSubmissionController::registerDirectSubmission(CommandStreamReceiver *csr) {
3438
std::lock_guard<std::mutex> lock(directSubmissionsMutex);
3539
directSubmissions.insert(std::make_pair(csr, DirectSubmissionState{}));
40+
this->adjustTimeout(csr);
3641
}
3742

3843
void DirectSubmissionController::unregisterDirectSubmission(CommandStreamReceiver *csr) {
@@ -92,4 +97,13 @@ void DirectSubmissionController::sleep() {
9297
std::this_thread::sleep_for(std::chrono::microseconds(this->timeout));
9398
}
9499

100+
void DirectSubmissionController::adjustTimeout(CommandStreamReceiver *csr) {
101+
if (EngineHelpers::isCcs(csr->getOsContext().getEngineType())) {
102+
this->ccsCount++;
103+
if (this->ccsCount > 1u) {
104+
this->timeout /= this->timeoutDivisor;
105+
}
106+
}
107+
}
108+
95109
} // namespace NEO

shared/source/direct_submission/direct_submission_controller.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ class DirectSubmissionController {
3939
void checkNewSubmissions();
4040
MOCKABLE_VIRTUAL void sleep();
4141

42+
void adjustTimeout(CommandStreamReceiver *csr);
43+
44+
uint32_t ccsCount = 0u;
4245
std::unordered_map<CommandStreamReceiver *, DirectSubmissionState> directSubmissions;
4346
std::mutex directSubmissionsMutex;
4447

@@ -47,5 +50,6 @@ class DirectSubmissionController {
4750
std::atomic_bool runControlling = false;
4851

4952
int timeout = 5000;
53+
int timeoutDivisor = 4;
5054
};
5155
} // namespace NEO

shared/test/common/test_files/igdrcl.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ DirectSubmissionPrintBuffers = 0
101101
USMEvictAfterMigration = 0
102102
EnableDirectSubmissionController = -1
103103
DirectSubmissionControllerTimeout = -1
104+
DirectSubmissionControllerDivisor = -1
104105
UseVmBind = -1
105106
PassBoundBOToExec = -1
106107
EnableNullHardware = 0

shared/test/unit_test/direct_submission/direct_submission_controller_mock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ struct DirectSubmissionControllerMock : public DirectSubmissionController {
1717
using DirectSubmissionController::directSubmissionsMutex;
1818
using DirectSubmissionController::keepControlling;
1919
using DirectSubmissionController::timeout;
20+
using DirectSubmissionController::timeoutDivisor;
2021

2122
void sleep() override {
2223
DirectSubmissionController::sleep();

shared/test/unit_test/direct_submission/direct_submission_controller_tests.cpp

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
#include "shared/test/common/helpers/debug_manager_state_restore.h"
9+
#include "shared/test/common/helpers/engine_descriptor_helper.h"
910
#include "shared/test/common/mocks/mock_command_stream_receiver.h"
1011
#include "shared/test/common/mocks/mock_execution_environment.h"
1112
#include "shared/test/common/test_macros/test.h"
@@ -22,13 +23,26 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerTimeoutWhen
2223
EXPECT_EQ(controller.timeout, 14);
2324
}
2425

26+
TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllertimeoutDivisorWhenCreateObjectThentimeoutDivisorIsEqualWithDebugFlag) {
27+
DebugManagerStateRestore restorer;
28+
DebugManager.flags.DirectSubmissionControllerDivisor.set(4);
29+
30+
DirectSubmissionControllerMock controller;
31+
32+
EXPECT_EQ(controller.timeoutDivisor, 4);
33+
}
34+
2535
TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenRegisterDirectSubmissionWorksThenItIsMonitoringItsState) {
2636
MockExecutionEnvironment executionEnvironment;
2737
executionEnvironment.prepareRootDeviceEnvironments(1);
2838
executionEnvironment.initializeMemoryManager();
2939

3040
DeviceBitfield deviceBitfield(1);
3141
MockCommandStreamReceiver csr(executionEnvironment, 0, deviceBitfield);
42+
std::unique_ptr<OsContext> osContext(OsContext::create(nullptr, 0,
43+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
44+
PreemptionMode::ThreadGroup, deviceBitfield)));
45+
csr.setupContext(*osContext.get());
3246
csr.taskCount.store(5u);
3347

3448
DirectSubmissionControllerMock controller;
@@ -69,6 +83,10 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenTimeout
6983

7084
DeviceBitfield deviceBitfield(1);
7185
MockCommandStreamReceiver csr(executionEnvironment, 0, deviceBitfield);
86+
std::unique_ptr<OsContext> osContext(OsContext::create(nullptr, 0,
87+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
88+
PreemptionMode::ThreadGroup, deviceBitfield)));
89+
csr.setupContext(*osContext.get());
7290
csr.initializeTagAllocation();
7391
*csr.tagAddress = 9u;
7492
csr.taskCount.store(9u);
@@ -115,4 +133,137 @@ TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWithNotStar
115133
controller.directSubmissionControllingThread.reset();
116134
}
117135

136+
TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerWhenRegisterCsrsThenTimeoutIsAdjusted) {
137+
MockExecutionEnvironment executionEnvironment;
138+
executionEnvironment.prepareRootDeviceEnvironments(1);
139+
executionEnvironment.initializeMemoryManager();
140+
DeviceBitfield deviceBitfield(1);
141+
142+
MockCommandStreamReceiver csr(executionEnvironment, 0, deviceBitfield);
143+
std::unique_ptr<OsContext> osContext(OsContext::create(nullptr, 0,
144+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
145+
PreemptionMode::ThreadGroup, deviceBitfield)));
146+
csr.setupContext(*osContext.get());
147+
148+
MockCommandStreamReceiver csr1(executionEnvironment, 0, deviceBitfield);
149+
std::unique_ptr<OsContext> osContext1(OsContext::create(nullptr, 0,
150+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
151+
PreemptionMode::ThreadGroup, deviceBitfield)));
152+
csr1.setupContext(*osContext1.get());
153+
154+
MockCommandStreamReceiver csr2(executionEnvironment, 0, deviceBitfield);
155+
std::unique_ptr<OsContext> osContext2(OsContext::create(nullptr, 0,
156+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
157+
PreemptionMode::ThreadGroup, deviceBitfield)));
158+
csr2.setupContext(*osContext2.get());
159+
160+
MockCommandStreamReceiver csr3(executionEnvironment, 0, deviceBitfield);
161+
std::unique_ptr<OsContext> osContext3(OsContext::create(nullptr, 0,
162+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::Regular},
163+
PreemptionMode::ThreadGroup, deviceBitfield)));
164+
csr3.setupContext(*osContext3.get());
165+
166+
MockCommandStreamReceiver csr4(executionEnvironment, 0, deviceBitfield);
167+
std::unique_ptr<OsContext> osContext4(OsContext::create(nullptr, 0,
168+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::Regular},
169+
PreemptionMode::ThreadGroup, deviceBitfield)));
170+
csr4.setupContext(*osContext4.get());
171+
172+
DirectSubmissionControllerMock controller;
173+
controller.keepControlling.store(false);
174+
controller.directSubmissionControllingThread->join();
175+
controller.directSubmissionControllingThread.reset();
176+
177+
EXPECT_EQ(controller.timeout, 5000);
178+
179+
controller.registerDirectSubmission(&csr);
180+
EXPECT_EQ(controller.timeout, 5000);
181+
182+
controller.registerDirectSubmission(&csr3);
183+
EXPECT_EQ(controller.timeout, 5000);
184+
185+
controller.registerDirectSubmission(&csr1);
186+
EXPECT_EQ(controller.timeout, 1250);
187+
188+
controller.registerDirectSubmission(&csr2);
189+
EXPECT_EQ(controller.timeout, 312);
190+
191+
controller.registerDirectSubmission(&csr4);
192+
EXPECT_EQ(controller.timeout, 312);
193+
194+
controller.unregisterDirectSubmission(&csr);
195+
controller.unregisterDirectSubmission(&csr1);
196+
controller.unregisterDirectSubmission(&csr2);
197+
controller.unregisterDirectSubmission(&csr3);
198+
controller.unregisterDirectSubmission(&csr4);
199+
}
200+
201+
TEST(DirectSubmissionControllerTests, givenDirectSubmissionControllerDirectSubmissionControllerDivisorSetWhenRegisterCsrsThenTimeoutIsAdjusted) {
202+
DebugManagerStateRestore restorer;
203+
DebugManager.flags.DirectSubmissionControllerDivisor.set(5);
204+
205+
MockExecutionEnvironment executionEnvironment;
206+
executionEnvironment.prepareRootDeviceEnvironments(1);
207+
executionEnvironment.initializeMemoryManager();
208+
DeviceBitfield deviceBitfield(1);
209+
210+
MockCommandStreamReceiver csr(executionEnvironment, 0, deviceBitfield);
211+
std::unique_ptr<OsContext> osContext(OsContext::create(nullptr, 0,
212+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
213+
PreemptionMode::ThreadGroup, deviceBitfield)));
214+
csr.setupContext(*osContext.get());
215+
216+
MockCommandStreamReceiver csr1(executionEnvironment, 0, deviceBitfield);
217+
std::unique_ptr<OsContext> osContext1(OsContext::create(nullptr, 0,
218+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
219+
PreemptionMode::ThreadGroup, deviceBitfield)));
220+
csr1.setupContext(*osContext1.get());
221+
222+
MockCommandStreamReceiver csr2(executionEnvironment, 0, deviceBitfield);
223+
std::unique_ptr<OsContext> osContext2(OsContext::create(nullptr, 0,
224+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_CCS, EngineUsage::Regular},
225+
PreemptionMode::ThreadGroup, deviceBitfield)));
226+
csr2.setupContext(*osContext2.get());
227+
228+
MockCommandStreamReceiver csr3(executionEnvironment, 0, deviceBitfield);
229+
std::unique_ptr<OsContext> osContext3(OsContext::create(nullptr, 0,
230+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::Regular},
231+
PreemptionMode::ThreadGroup, deviceBitfield)));
232+
csr3.setupContext(*osContext3.get());
233+
234+
MockCommandStreamReceiver csr4(executionEnvironment, 0, deviceBitfield);
235+
std::unique_ptr<OsContext> osContext4(OsContext::create(nullptr, 0,
236+
EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::Regular},
237+
PreemptionMode::ThreadGroup, deviceBitfield)));
238+
csr4.setupContext(*osContext4.get());
239+
240+
DirectSubmissionControllerMock controller;
241+
controller.keepControlling.store(false);
242+
controller.directSubmissionControllingThread->join();
243+
controller.directSubmissionControllingThread.reset();
244+
245+
EXPECT_EQ(controller.timeout, 5000);
246+
247+
controller.registerDirectSubmission(&csr);
248+
EXPECT_EQ(controller.timeout, 5000);
249+
250+
controller.registerDirectSubmission(&csr3);
251+
EXPECT_EQ(controller.timeout, 5000);
252+
253+
controller.registerDirectSubmission(&csr1);
254+
EXPECT_EQ(controller.timeout, 1000);
255+
256+
controller.registerDirectSubmission(&csr2);
257+
EXPECT_EQ(controller.timeout, 200);
258+
259+
controller.registerDirectSubmission(&csr4);
260+
EXPECT_EQ(controller.timeout, 200);
261+
262+
controller.unregisterDirectSubmission(&csr);
263+
controller.unregisterDirectSubmission(&csr1);
264+
controller.unregisterDirectSubmission(&csr2);
265+
controller.unregisterDirectSubmission(&csr3);
266+
controller.unregisterDirectSubmission(&csr4);
267+
}
268+
118269
} // namespace NEO

0 commit comments

Comments
 (0)