Skip to content

Commit c6bf97c

Browse files
fix: counter based event overflow handling
Source: 3291d25 Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
1 parent 14b06bb commit c6bf97c

File tree

11 files changed

+164
-77
lines changed

11 files changed

+164
-77
lines changed

level_zero/core/source/cmdlist/cmdlist_hw.inl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,15 +202,15 @@ void CommandListCoreFamily<gfxCoreFamily>::handleInOrderCounterOverflow(bool cop
202202
CommandListCoreFamily<gfxCoreFamily>::appendWaitOnInOrderDependency(inOrderExecInfo, nullptr, inOrderExecInfo->getCounterValue() + 1, inOrderExecInfo->getAllocationOffset(), false, true, false, false,
203203
isDualStreamCopyOffloadOperation(copyOffloadOperation));
204204

205-
inOrderExecInfo->resetCounterValue();
206-
207205
uint32_t newOffset = 0;
208206
if (inOrderExecInfo->getAllocationOffset() == 0) {
209207
// multitile immediate writes are uint64_t aligned
210208
newOffset = alignUp(this->partitionCount * device->getL0GfxCoreHelper().getImmediateWritePostSyncOffset(), MemoryConstants::cacheLineSize * 4);
209+
UNRECOVERABLE_IF(newOffset == 0);
211210
}
212211

213212
inOrderExecInfo->setAllocationOffset(newOffset);
213+
inOrderExecInfo->resetCounterValue();
214214
inOrderExecInfo->initializeAllocationsFromHost();
215215

216216
CommandListCoreFamily<gfxCoreFamily>::appendSignalInOrderDependencyCounter(nullptr, copyOffloadOperation, false, false, false); // signal counter on new offset
@@ -3040,7 +3040,7 @@ bool CommandListCoreFamily<gfxCoreFamily>::handleInOrderImplicitDependencies(boo
30403040
}
30413041

30423042
if (hasInOrderDependencies()) {
3043-
if (inOrderExecInfo->isCounterAlreadyDone(inOrderExecInfo->getCounterValue())) {
3043+
if (inOrderExecInfo->isCounterAlreadyDone(inOrderExecInfo->getCounterValue(), inOrderExecInfo->getAllocationOffset())) {
30443044
this->latestOperationHasOptimizedCbEvent = false;
30453045
return false;
30463046
}
@@ -4769,7 +4769,7 @@ void CommandListCoreFamily<gfxCoreFamily>::patchInOrderCmds() {
47694769
}
47704770
template <GFXCORE_FAMILY gfxCoreFamily>
47714771
bool CommandListCoreFamily<gfxCoreFamily>::hasInOrderDependencies() const {
4772-
return (inOrderExecInfo.get() && inOrderExecInfo->getCounterValue() > 0);
4772+
return (inOrderExecInfo.get() && inOrderExecInfo->getCounterValue() > inOrderExecInfo->getInitialCounterValue());
47734773
}
47744774

47754775
template <GFXCORE_FAMILY gfxCoreFamily>

level_zero/core/source/cmdlist/cmdlist_hw_immediate.inl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,9 +1237,9 @@ ze_result_t CommandListCoreFamilyImmediate<gfxCoreFamily>::hostSynchronize(uint6
12371237

12381238
uint64_t inOrderSyncValue = this->inOrderExecInfo.get() ? inOrderExecInfo->getCounterValue() : 0;
12391239

1240-
if (inOrderWaitAllowed) {
1240+
if (inOrderWaitAllowed && !inOrderExecInfo->isCounterAlreadyDone(inOrderExecInfo->getCounterValue(), inOrderExecInfo->getAllocationOffset())) {
12411241
status = synchronizeInOrderExecution(timeout, (waitQueue == this->cmdQImmediateCopyOffload));
1242-
} else {
1242+
} else if (!inOrderWaitAllowed) {
12431243
const int64_t timeoutInMicroSeconds = timeout / 1000;
12441244
const auto indefinitelyPoll = timeout == std::numeric_limits<uint64_t>::max();
12451245
const auto waitStatus = waitCsr->waitForCompletionWithTimeout(NEO::WaitParams{indefinitelyPoll, !indefinitelyPoll, false, timeoutInMicroSeconds}, waitTaskCount);
@@ -1252,7 +1252,7 @@ ze_result_t CommandListCoreFamilyImmediate<gfxCoreFamily>::hostSynchronize(uint6
12521252

12531253
if (status != ZE_RESULT_NOT_READY) {
12541254
if (isInOrderExecutionEnabled()) {
1255-
inOrderExecInfo->setLastWaitedCounterValue(inOrderSyncValue);
1255+
inOrderExecInfo->setLastWaitedCounterValue(inOrderSyncValue, inOrderExecInfo->getAllocationOffset());
12561256
}
12571257

12581258
if (this->isTbxMode && (status == ZE_RESULT_SUCCESS)) {

level_zero/core/source/event/event.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,7 @@ void Event::unsetInOrderExecInfo() {
700700
void Event::resetInOrderTimestampNode(NEO::TagNodeBase *newNode, uint32_t partitionCount) {
701701
if (inOrderIncrementValue == 0 || !newNode) {
702702
for (auto &node : inOrderTimestampNode) {
703-
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue);
703+
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue, this->getInOrderAllocationOffset());
704704
}
705705

706706
inOrderTimestampNode.clear();
@@ -725,7 +725,7 @@ void Event::resetAdditionalTimestampNode(NEO::TagNodeBase *newNode, uint32_t par
725725
} else if (resetAggregatedEvent) {
726726
// If we are resetting aggregated event, we need to clear all additional timestamp nodes
727727
for (auto &node : additionalTimestampNode) {
728-
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue);
728+
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue, this->getInOrderAllocationOffset());
729729
}
730730
additionalTimestampNode.clear();
731731
}
@@ -736,7 +736,7 @@ void Event::resetAdditionalTimestampNode(NEO::TagNodeBase *newNode, uint32_t par
736736
for (auto &node : additionalTimestampNode) {
737737
if (inOrderExecInfo) {
738738
// Push to temp node vector and releaseNotUsedTempTimestampNodes will clear when needed
739-
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue);
739+
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue, this->getInOrderAllocationOffset());
740740
} else {
741741
node->returnTag();
742742
}

level_zero/core/source/event/event_impl.inl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ ze_result_t EventImp<TagSizeT>::queryCounterBasedEventStatus() {
305305

306306
auto waitValue = getInOrderExecSignalValueWithSubmissionCounter();
307307

308-
if (!inOrderExecInfo->isCounterAlreadyDone(waitValue)) {
308+
if (!inOrderExecInfo->isCounterAlreadyDone(waitValue, this->getInOrderAllocationOffset())) {
309309
bool signaled = true;
310310

311311
if (this->optimizedCbEvent) {
@@ -327,7 +327,7 @@ ze_result_t EventImp<TagSizeT>::queryCounterBasedEventStatus() {
327327
if (!signaled) {
328328
return ZE_RESULT_NOT_READY;
329329
}
330-
inOrderExecInfo->setLastWaitedCounterValue(waitValue);
330+
inOrderExecInfo->setLastWaitedCounterValue(waitValue, this->getInOrderAllocationOffset());
331331
}
332332

333333
handleSuccessfulHostSynchronization();
@@ -770,7 +770,7 @@ ze_result_t EventImp<TagSizeT>::hostSynchronize(uint64_t timeout) {
770770
if (this->optimizedCbEvent) {
771771
synchronizeTimestampCompletionWithTimeout();
772772
if (this->isTimestampPopulated()) {
773-
inOrderExecInfo->setLastWaitedCounterValue(getInOrderExecSignalValueWithSubmissionCounter());
773+
inOrderExecInfo->setLastWaitedCounterValue(getInOrderExecSignalValueWithSubmissionCounter(), this->getInOrderAllocationOffset());
774774
handleSuccessfulHostSynchronization();
775775
ret = ZE_RESULT_SUCCESS;
776776
this->optimizedCbEvent = false;

level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -328,25 +328,24 @@ HWTEST_F(InOrderCmdListTests, givenCounterBasedEventsWhenHostWaitsAreCalledThenL
328328
EXPECT_EQ(ZE_RESULT_SUCCESS, status);
329329

330330
auto counterValue = events[1]->inOrderExecSignalValue;
331-
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(counterValue));
332-
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(events[0]->inOrderExecSignalValue));
333-
EXPECT_FALSE(inOrderExecInfo->isCounterAlreadyDone(counterValue + 1));
331+
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(counterValue, 0));
332+
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(events[0]->inOrderExecSignalValue, 0));
333+
EXPECT_FALSE(inOrderExecInfo->isCounterAlreadyDone(counterValue + 1, 0));
334334

335335
// setting lower counter ignored
336-
inOrderExecInfo->setLastWaitedCounterValue(counterValue - 1);
337-
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(counterValue));
338-
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(events[0]->inOrderExecSignalValue));
339-
EXPECT_FALSE(inOrderExecInfo->isCounterAlreadyDone(counterValue + 1));
336+
inOrderExecInfo->setLastWaitedCounterValue(counterValue - 1, 0);
337+
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(counterValue, 0));
338+
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(events[0]->inOrderExecSignalValue, 0));
339+
EXPECT_FALSE(inOrderExecInfo->isCounterAlreadyDone(counterValue + 1, 0));
340340

341341
status = events[0]->hostSynchronize(-1);
342342
EXPECT_EQ(ZE_RESULT_SUCCESS, status);
343-
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(counterValue));
344-
EXPECT_FALSE(inOrderExecInfo->isCounterAlreadyDone(counterValue + 1));
343+
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(counterValue, 0));
344+
EXPECT_FALSE(inOrderExecInfo->isCounterAlreadyDone(counterValue + 1, 0));
345345

346-
// setting offset disables mechanism
347346
inOrderExecInfo->setAllocationOffset(4u);
348-
EXPECT_FALSE(inOrderExecInfo->isCounterAlreadyDone(0u));
349-
EXPECT_FALSE(inOrderExecInfo->isCounterAlreadyDone(counterValue));
347+
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(0u, 0));
348+
EXPECT_TRUE(inOrderExecInfo->isCounterAlreadyDone(counterValue, 0));
350349

351350
completeHostAddress<FamilyType::gfxCoreFamily, WhiteBox<L0::CommandListCoreFamilyImmediate<FamilyType::gfxCoreFamily>>>(immCmdList.get());
352351
}
@@ -529,9 +528,9 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, InOrderCmdListTests, givenCounterBasedTimestampEven
529528
cmdList->appendLaunchKernel(kernel->toHandle(), groupCount, event3->toHandle(), 0, nullptr, launchParams);
530529
event3->hostEventSetValue(Event::STATE_CLEARED);
531530

532-
event1->getInOrderExecInfo()->setLastWaitedCounterValue(2);
533-
event2->getInOrderExecInfo()->setLastWaitedCounterValue(2);
534-
event3->getInOrderExecInfo()->setLastWaitedCounterValue(3);
531+
event1->getInOrderExecInfo()->setLastWaitedCounterValue(2, 0);
532+
event2->getInOrderExecInfo()->setLastWaitedCounterValue(2, 0);
533+
event3->getInOrderExecInfo()->setLastWaitedCounterValue(3, 0);
535534

536535
EXPECT_EQ(ZE_RESULT_SUCCESS, event1->queryStatus());
537536
EXPECT_EQ(ZE_RESULT_SUCCESS, event2->queryStatus());
@@ -1781,7 +1780,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, InOrderCmdListTests, givenImmediateCmdListWhenDispa
17811780
EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode);
17821781
}
17831782
if (!events[0]->inOrderTimestampNode.empty()) {
1784-
copyOnlyCmdList->inOrderExecInfo->pushTempTimestampNode(events[0]->inOrderTimestampNode[0], events[0]->inOrderExecSignalValue);
1783+
copyOnlyCmdList->inOrderExecInfo->pushTempTimestampNode(events[0]->inOrderTimestampNode[0], events[0]->inOrderExecSignalValue, 0);
17851784
}
17861785
events[0]->inOrderTimestampNode.clear();
17871786
events[0]->makeCounterBasedInitiallyDisabled(eventPool->getAllocation());
@@ -5217,12 +5216,13 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, InOrderCmdListTests, givenInOrderModeWhenCallingSyn
52175216
ultCsr->forceReturnGpuHang = false;
52185217
forceFail = false;
52195218
callCounter = 0;
5219+
immCmdList->getInOrderExecInfo()->addCounterValue(1);
52205220
EXPECT_EQ(ZE_RESULT_SUCCESS, immCmdList->hostSynchronize(std::numeric_limits<uint64_t>::max(), false));
52215221
EXPECT_EQ(downloadedAlloc, expectedAlloc);
52225222

5223-
EXPECT_EQ(failCounter, callCounter);
5224-
EXPECT_EQ(failCounter - 1, ultCsr->checkGpuHangDetectedCalled);
5225-
EXPECT_EQ(1u, *hostAddress);
5223+
EXPECT_EQ(failCounter + 1, callCounter);
5224+
EXPECT_EQ(failCounter, ultCsr->checkGpuHangDetectedCalled);
5225+
EXPECT_EQ(2u, *hostAddress);
52265226
}
52275227

52285228
immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, nullptr, 0, nullptr, launchParams);
@@ -5310,16 +5310,18 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, InOrderCmdListTests, givenDebugFlagSetWhenCallingSy
53105310

53115311
// success
53125312
{
5313+
immCmdList->getInOrderExecInfo()->addCounterValue(1);
5314+
53135315
ultCsr->checkGpuHangDetectedCalled = 0;
53145316
ultCsr->forceReturnGpuHang = false;
53155317
forceFail = false;
53165318
callCounter = 0;
53175319
EXPECT_EQ(downloadedAlloc, hostAlloc);
53185320
EXPECT_EQ(ZE_RESULT_SUCCESS, immCmdList->hostSynchronize(std::numeric_limits<uint64_t>::max(), false));
53195321

5320-
EXPECT_EQ(failCounter, callCounter);
5321-
EXPECT_EQ(failCounter - 1, ultCsr->checkGpuHangDetectedCalled);
5322-
EXPECT_EQ(1u, *hostAddress);
5322+
EXPECT_EQ(failCounter + 1, callCounter);
5323+
EXPECT_EQ(failCounter, ultCsr->checkGpuHangDetectedCalled);
5324+
EXPECT_EQ(2u, *hostAddress);
53235325
}
53245326

53255327
immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, nullptr, 0, nullptr, launchParams);

level_zero/core/test/unit_tests/sources/event/test_event.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4957,12 +4957,12 @@ HWTEST2_F(EventMultiTileDynamicPacketUseTest, givenEventCounterBasedUsedCreatedO
49574957
event2->eventPoolAllocation = nullptr;
49584958

49594959
auto inOrderExecInfo0 = NEO::InOrderExecInfo::create(device->getDeviceInOrderCounterAllocator()->getTag(), nullptr, *device->getNEODevice(), 1, false);
4960-
inOrderExecInfo0->setLastWaitedCounterValue(1);
4960+
inOrderExecInfo0->setLastWaitedCounterValue(1, 0);
49614961
event0->updateInOrderExecState(inOrderExecInfo0, 1, 0);
49624962

49634963
uint64_t counter = 2;
49644964
auto inOrderExecInfo1 = NEO::InOrderExecInfo::createFromExternalAllocation(*device->getNEODevice(), nullptr, 0x1, nullptr, &counter, 1, 1, 1);
4965-
inOrderExecInfo1->setLastWaitedCounterValue(1);
4965+
inOrderExecInfo1->setLastWaitedCounterValue(1, 0);
49664966
event1->updateInOrderExecState(inOrderExecInfo1, 1, 0);
49674967

49684968
MockGraphicsAllocation mockAlloc(rootDeviceIndex, nullptr, 1);

shared/source/debug_settings/debug_variables_base.inl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, ForceInOrderImmediateCmdListExecution, -1, "-1:
270270
DECLARE_DEBUG_VARIABLE(int32_t, ForceInOrderEvents, -1, "-1: default, 0: disabled, 1: Enable all Events as in-order, to rely on command list counter value")
271271
DECLARE_DEBUG_VARIABLE(int32_t, ForceCopyOperationOffloadForComputeCmdList, -1, "-1: default, 0: disabled, 1: Enabled for immediate in-order cmd lists, 2: Enabled for all types. If enabled, all compute cmdlist will try to offload copy operations to copy engine")
272272
DECLARE_DEBUG_VARIABLE(int32_t, EnableImplicitConvertionToCounterBasedEvents, -1, "-1: default, 0: Disable, 1: Enable. If enabled, try to convert Regular Events used on Immediate CL to CounterBased")
273+
DECLARE_DEBUG_VARIABLE(int64_t, InitialCounterBasedEventValue, -1, "-1: default, >=0: initial value set during counter creation")
273274
DECLARE_DEBUG_VARIABLE(int32_t, ForceTlbFlush, -1, "-1: default, 0: Tlb flush disabled, 1: Tlb Flush enabled")
274275
DECLARE_DEBUG_VARIABLE(int32_t, AllowDcFlush, -1, "-1: default, 0: DC flush disabled, 1: DC flush enabled")
275276
DECLARE_DEBUG_VARIABLE(int32_t, DebugSetMemoryDiagnosticsDelay, -1, "-1: default, >=0: delay time in minutes necessary for completion of Memory diagnostics")

shared/source/helpers/in_order_cmd_helpers.cpp

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ InOrderExecInfo::InOrderExecInfo(TagNodeBase *deviceCounterNode, TagNodeBase *ho
7373
deviceAddress = deviceCounterNode->getGpuAddress();
7474
}
7575

76-
isTbx = device.getDefaultEngine().commandStreamReceiver->isTbxMode();
76+
auto csr = device.getDefaultEngine().commandStreamReceiver;
77+
isTbx = csr->isTbxMode();
78+
immWritePostSyncWriteOffset = std::max(csr->getImmWritePostSyncWriteOffset(), static_cast<uint32_t>(sizeof(uint64_t)));
7779

7880
reset();
7981
}
@@ -98,20 +100,28 @@ void InOrderExecInfo::uploadToTbx(TagNodeBase &node, size_t size) {
98100
}
99101

100102
void InOrderExecInfo::initializeAllocationsFromHost() {
103+
const uint64_t initialValue = getInitialCounterValue();
104+
101105
if (deviceCounterNode) {
102-
const size_t deviceAllocationWriteSize = sizeof(uint64_t) * numDevicePartitionsToWait;
103-
memset(ptrOffset(deviceCounterNode->getCpuBase(), allocationOffset), 0, deviceAllocationWriteSize);
106+
for (uint32_t i = 0; i < numDevicePartitionsToWait; i++) {
107+
uint64_t *ptr = reinterpret_cast<uint64_t *>(ptrOffset(deviceCounterNode->getCpuBase(), allocationOffset + (i * immWritePostSyncWriteOffset)));
108+
*ptr = initialValue;
109+
}
104110

105111
if (isTbx) {
112+
const size_t deviceAllocationWriteSize = alignUp(sizeof(uint64_t), immWritePostSyncWriteOffset) * numDevicePartitionsToWait;
106113
uploadToTbx(*deviceCounterNode, deviceAllocationWriteSize);
107114
}
108115
}
109116

110117
if (hostCounterNode) {
111-
const size_t hostAllocationWriteSize = sizeof(uint64_t) * numHostPartitionsToWait;
112-
memset(ptrOffset(hostCounterNode->getCpuBase(), allocationOffset), 0, hostAllocationWriteSize);
118+
for (uint32_t i = 0; i < numHostPartitionsToWait; i++) {
119+
uint64_t *ptr = reinterpret_cast<uint64_t *>(ptrOffset(hostCounterNode->getCpuBase(), allocationOffset + (i * immWritePostSyncWriteOffset)));
120+
*ptr = initialValue;
121+
}
113122

114123
if (isTbx) {
124+
const size_t hostAllocationWriteSize = alignUp(sizeof(uint64_t), immWritePostSyncWriteOffset) * numHostPartitionsToWait;
115125
uploadToTbx(*hostCounterNode, hostAllocationWriteSize);
116126
}
117127
}
@@ -125,6 +135,11 @@ void InOrderExecInfo::reset() {
125135
initializeAllocationsFromHost();
126136
}
127137

138+
void InOrderExecInfo::resetCounterValue() {
139+
counterValue = getInitialCounterValue();
140+
lastWaitedCounterValue[allocationOffset != 0].store(getInitialCounterValue());
141+
}
142+
128143
NEO::GraphicsAllocation *InOrderExecInfo::getDeviceCounterAllocation() const {
129144
if (externalDeviceAllocation) {
130145
return externalDeviceAllocation;
@@ -143,19 +158,20 @@ uint64_t InOrderExecInfo::getBaseHostGpuAddress() const {
143158
return hostCounterNode->getGpuAddress();
144159
}
145160

146-
void InOrderExecInfo::pushTempTimestampNode(TagNodeBase *node, uint64_t value) {
161+
void InOrderExecInfo::pushTempTimestampNode(TagNodeBase *node, uint64_t value, uint32_t allocationOffset) {
147162
std::unique_lock<std::mutex> lock(mutex);
148163

149-
tempTimestampNodes.emplace_back(node, value);
164+
tempTimestampNodes.emplace_back(node, std::make_pair(value, allocationOffset));
150165
}
151166

152167
void InOrderExecInfo::releaseNotUsedTempTimestampNodes(bool forceReturn) {
153168
std::unique_lock<std::mutex> lock(mutex);
154169

155-
std::vector<std::pair<TagNodeBase *, uint64_t>> tempVector;
170+
std::vector<std::pair<TagNodeBase *, CounterAndOffsetPairT>> tempVector;
156171

157172
for (auto &node : tempTimestampNodes) {
158-
if (forceReturn || lastWaitedCounterValue >= node.second) {
173+
const auto &counterAndOffsetPair = node.second;
174+
if (forceReturn || isCounterAlreadyDone(counterAndOffsetPair.first, counterAndOffsetPair.second)) {
159175
node.first->returnTag();
160176
} else {
161177
tempVector.push_back(node);
@@ -179,4 +195,8 @@ uint64_t InOrderExecInfo::getDeviceNodeGpuAddress() const {
179195
return 0;
180196
}
181197

198+
uint64_t InOrderExecInfo::getInitialCounterValue() const {
199+
return debugManager.flags.InitialCounterBasedEventValue.getIfNotDefault<uint64_t>(0);
200+
}
201+
182202
} // namespace NEO

0 commit comments

Comments
 (0)