Skip to content

Commit 704b230

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

File tree

11 files changed

+165
-77
lines changed

11 files changed

+165
-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
@@ -211,15 +211,15 @@ void CommandListCoreFamily<gfxCoreFamily>::handleInOrderCounterOverflow(bool cop
211211
CommandListCoreFamily<gfxCoreFamily>::appendWaitOnInOrderDependency(inOrderExecInfo, nullptr, inOrderExecInfo->getCounterValue() + 1, inOrderExecInfo->getAllocationOffset(), false, true, false, false,
212212
isDualStreamCopyOffloadOperation(copyOffloadOperation));
213213

214-
inOrderExecInfo->resetCounterValue();
215-
216214
uint32_t newOffset = 0;
217215
if (inOrderExecInfo->getAllocationOffset() == 0) {
218216
// multitile immediate writes are uint64_t aligned
219217
newOffset = alignUp(this->partitionCount * device->getL0GfxCoreHelper().getImmediateWritePostSyncOffset(), MemoryConstants::cacheLineSize * 4);
218+
UNRECOVERABLE_IF(newOffset == 0);
220219
}
221220

222221
inOrderExecInfo->setAllocationOffset(newOffset);
222+
inOrderExecInfo->resetCounterValue();
223223
inOrderExecInfo->initializeAllocationsFromHost();
224224

225225
CommandListCoreFamily<gfxCoreFamily>::appendSignalInOrderDependencyCounter(nullptr, copyOffloadOperation, false, false, false); // signal counter on new offset
@@ -3066,7 +3066,7 @@ bool CommandListCoreFamily<gfxCoreFamily>::handleInOrderImplicitDependencies(boo
30663066
}
30673067

30683068
if (hasInOrderDependencies()) {
3069-
if (inOrderExecInfo->isCounterAlreadyDone(inOrderExecInfo->getCounterValue())) {
3069+
if (inOrderExecInfo->isCounterAlreadyDone(inOrderExecInfo->getCounterValue(), inOrderExecInfo->getAllocationOffset())) {
30703070
this->latestOperationHasOptimizedCbEvent = false;
30713071
return false;
30723072
}
@@ -4795,7 +4795,7 @@ void CommandListCoreFamily<gfxCoreFamily>::patchInOrderCmds() {
47954795
}
47964796
template <GFXCORE_FAMILY gfxCoreFamily>
47974797
bool CommandListCoreFamily<gfxCoreFamily>::hasInOrderDependencies() const {
4798-
return (inOrderExecInfo.get() && inOrderExecInfo->getCounterValue() > 0);
4798+
return (inOrderExecInfo.get() && inOrderExecInfo->getCounterValue() > inOrderExecInfo->getInitialCounterValue());
47994799
}
48004800

48014801
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
@@ -1222,9 +1222,9 @@ ze_result_t CommandListCoreFamilyImmediate<gfxCoreFamily>::hostSynchronize(uint6
12221222

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

1225-
if (inOrderWaitAllowed) {
1225+
if (inOrderWaitAllowed && !inOrderExecInfo->isCounterAlreadyDone(inOrderExecInfo->getCounterValue(), inOrderExecInfo->getAllocationOffset())) {
12261226
status = synchronizeInOrderExecution(timeout, (waitQueue == this->cmdQImmediateCopyOffload));
1227-
} else {
1227+
} else if (!inOrderWaitAllowed) {
12281228
const auto indefinitelyPoll = timeout == std::numeric_limits<uint64_t>::max();
12291229
auto waitStatus = NEO::WaitStatus::notReady;
12301230

@@ -1247,7 +1247,7 @@ ze_result_t CommandListCoreFamilyImmediate<gfxCoreFamily>::hostSynchronize(uint6
12471247

12481248
if (status != ZE_RESULT_NOT_READY) {
12491249
if (isInOrderExecutionEnabled()) {
1250-
inOrderExecInfo->setLastWaitedCounterValue(inOrderSyncValue);
1250+
inOrderExecInfo->setLastWaitedCounterValue(inOrderSyncValue, inOrderExecInfo->getAllocationOffset());
12511251
}
12521252

12531253
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
@@ -721,7 +721,7 @@ void Event::unsetInOrderExecInfo() {
721721
void Event::resetInOrderTimestampNode(NEO::TagNodeBase *newNode, uint32_t partitionCount) {
722722
if (inOrderIncrementValue == 0 || !newNode) {
723723
for (auto &node : inOrderTimestampNode) {
724-
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue);
724+
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue, this->getInOrderAllocationOffset());
725725
}
726726

727727
inOrderTimestampNode.clear();
@@ -746,7 +746,7 @@ void Event::resetAdditionalTimestampNode(NEO::TagNodeBase *newNode, uint32_t par
746746
} else if (resetAggregatedEvent) {
747747
// If we are resetting aggregated event, we need to clear all additional timestamp nodes
748748
for (auto &node : additionalTimestampNode) {
749-
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue);
749+
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue, this->getInOrderAllocationOffset());
750750
}
751751
additionalTimestampNode.clear();
752752
}
@@ -757,7 +757,7 @@ void Event::resetAdditionalTimestampNode(NEO::TagNodeBase *newNode, uint32_t par
757757
for (auto &node : additionalTimestampNode) {
758758
if (inOrderExecInfo) {
759759
// Push to temp node vector and releaseNotUsedTempTimestampNodes will clear when needed
760-
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue);
760+
inOrderExecInfo->pushTempTimestampNode(node, inOrderExecSignalValue, this->getInOrderAllocationOffset());
761761
} else {
762762
node->returnTag();
763763
}

level_zero/core/source/event/event_impl.inl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ ze_result_t EventImp<TagSizeT>::queryCounterBasedEventStatus(int64_t timeSinceWa
298298

299299
auto waitValue = getInOrderExecSignalValueWithSubmissionCounter();
300300

301-
if (!inOrderExecInfo->isCounterAlreadyDone(waitValue)) {
301+
if (!inOrderExecInfo->isCounterAlreadyDone(waitValue, this->getInOrderAllocationOffset())) {
302302
bool signaled = true;
303303

304304
if (this->optimizedCbEvent) {
@@ -320,7 +320,7 @@ ze_result_t EventImp<TagSizeT>::queryCounterBasedEventStatus(int64_t timeSinceWa
320320
if (!signaled) {
321321
return ZE_RESULT_NOT_READY;
322322
}
323-
inOrderExecInfo->setLastWaitedCounterValue(waitValue);
323+
inOrderExecInfo->setLastWaitedCounterValue(waitValue, this->getInOrderAllocationOffset());
324324
}
325325

326326
handleSuccessfulHostSynchronization();
@@ -764,7 +764,7 @@ ze_result_t EventImp<TagSizeT>::hostSynchronize(uint64_t timeout) {
764764
if (this->optimizedCbEvent) {
765765
synchronizeTimestampCompletionWithTimeout();
766766
if (this->isTimestampPopulated()) {
767-
inOrderExecInfo->setLastWaitedCounterValue(getInOrderExecSignalValueWithSubmissionCounter());
767+
inOrderExecInfo->setLastWaitedCounterValue(getInOrderExecSignalValueWithSubmissionCounter(), this->getInOrderAllocationOffset());
768768
handleSuccessfulHostSynchronization();
769769
ret = ZE_RESULT_SUCCESS;
770770
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
}
@@ -526,9 +525,9 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, InOrderCmdListTests, givenCounterBasedTimestampEven
526525
cmdList->appendLaunchKernel(kernel->toHandle(), groupCount, event3->toHandle(), 0, nullptr, launchParams);
527526
event3->hostEventSetValue(Event::STATE_CLEARED);
528527

529-
event1->getInOrderExecInfo()->setLastWaitedCounterValue(2);
530-
event2->getInOrderExecInfo()->setLastWaitedCounterValue(2);
531-
event3->getInOrderExecInfo()->setLastWaitedCounterValue(3);
528+
event1->getInOrderExecInfo()->setLastWaitedCounterValue(2, 0);
529+
event2->getInOrderExecInfo()->setLastWaitedCounterValue(2, 0);
530+
event3->getInOrderExecInfo()->setLastWaitedCounterValue(3, 0);
532531

533532
EXPECT_EQ(ZE_RESULT_SUCCESS, event1->queryStatus(0));
534533
EXPECT_EQ(ZE_RESULT_SUCCESS, event2->queryStatus(0));
@@ -1778,7 +1777,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, InOrderCmdListTests, givenImmediateCmdListWhenDispa
17781777
EXPECT_EQ(Event::CounterBasedMode::implicitlyEnabled, events[0]->counterBasedMode);
17791778
}
17801779
if (!events[0]->inOrderTimestampNode.empty()) {
1781-
copyOnlyCmdList->inOrderExecInfo->pushTempTimestampNode(events[0]->inOrderTimestampNode[0], events[0]->inOrderExecSignalValue);
1780+
copyOnlyCmdList->inOrderExecInfo->pushTempTimestampNode(events[0]->inOrderTimestampNode[0], events[0]->inOrderExecSignalValue, 0);
17821781
}
17831782
events[0]->inOrderTimestampNode.clear();
17841783
events[0]->makeCounterBasedInitiallyDisabled(eventPool->getAllocation());
@@ -5214,12 +5213,13 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, InOrderCmdListTests, givenInOrderModeWhenCallingSyn
52145213
ultCsr->forceReturnGpuHang = false;
52155214
forceFail = false;
52165215
callCounter = 0;
5216+
immCmdList->getInOrderExecInfo()->addCounterValue(1);
52175217
EXPECT_EQ(ZE_RESULT_SUCCESS, immCmdList->hostSynchronize(std::numeric_limits<uint64_t>::max(), false));
52185218
EXPECT_EQ(downloadedAlloc, expectedAlloc);
52195219

5220-
EXPECT_EQ(failCounter, callCounter);
5221-
EXPECT_EQ(failCounter - 1, ultCsr->checkGpuHangDetectedCalled);
5222-
EXPECT_EQ(1u, *hostAddress);
5220+
EXPECT_EQ(failCounter + 1, callCounter);
5221+
EXPECT_EQ(failCounter, ultCsr->checkGpuHangDetectedCalled);
5222+
EXPECT_EQ(2u, *hostAddress);
52235223
}
52245224

52255225
immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, nullptr, 0, nullptr, launchParams);
@@ -5307,16 +5307,18 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, InOrderCmdListTests, givenDebugFlagSetWhenCallingSy
53075307

53085308
// success
53095309
{
5310+
immCmdList->getInOrderExecInfo()->addCounterValue(1);
5311+
53105312
ultCsr->checkGpuHangDetectedCalled = 0;
53115313
ultCsr->forceReturnGpuHang = false;
53125314
forceFail = false;
53135315
callCounter = 0;
53145316
EXPECT_EQ(downloadedAlloc, hostAlloc);
53155317
EXPECT_EQ(ZE_RESULT_SUCCESS, immCmdList->hostSynchronize(std::numeric_limits<uint64_t>::max(), false));
53165318

5317-
EXPECT_EQ(failCounter, callCounter);
5318-
EXPECT_EQ(failCounter - 1, ultCsr->checkGpuHangDetectedCalled);
5319-
EXPECT_EQ(1u, *hostAddress);
5319+
EXPECT_EQ(failCounter + 1, callCounter);
5320+
EXPECT_EQ(failCounter, ultCsr->checkGpuHangDetectedCalled);
5321+
EXPECT_EQ(2u, *hostAddress);
53205322
}
53215323

53225324
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
@@ -5125,12 +5125,12 @@ HWTEST2_F(EventMultiTileDynamicPacketUseTest, givenEventCounterBasedUsedCreatedO
51255125
event2->eventPoolAllocation = nullptr;
51265126

51275127
auto inOrderExecInfo0 = NEO::InOrderExecInfo::create(device->getDeviceInOrderCounterAllocator()->getTag(), nullptr, *device->getNEODevice(), 1, false);
5128-
inOrderExecInfo0->setLastWaitedCounterValue(1);
5128+
inOrderExecInfo0->setLastWaitedCounterValue(1, 0);
51295129
event0->updateInOrderExecState(inOrderExecInfo0, 1, 0);
51305130

51315131
uint64_t counter = 2;
51325132
auto inOrderExecInfo1 = NEO::InOrderExecInfo::createFromExternalAllocation(*device->getNEODevice(), nullptr, 0x1, nullptr, &counter, 1, 1, 1);
5133-
inOrderExecInfo1->setLastWaitedCounterValue(1);
5133+
inOrderExecInfo1->setLastWaitedCounterValue(1, 0);
51345134
event1->updateInOrderExecState(inOrderExecInfo1, 1, 0);
51355135

51365136
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
@@ -268,6 +268,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, ForceInOrderImmediateCmdListExecution, -1, "-1:
268268
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")
269269
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")
270270
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")
271+
DECLARE_DEBUG_VARIABLE(int64_t, InitialCounterBasedEventValue, -1, "-1: default, >=0: initial value set during counter creation")
271272
DECLARE_DEBUG_VARIABLE(int32_t, ForceTlbFlush, -1, "-1: default, 0: Tlb flush disabled, 1: Tlb Flush enabled")
272273
DECLARE_DEBUG_VARIABLE(int32_t, AllowDcFlush, -1, "-1: default, 0: DC flush disabled, 1: DC flush enabled")
273274
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: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "shared/source/command_stream/command_stream_receiver.h"
1111
#include "shared/source/device/device.h"
12+
#include "shared/source/helpers/aligned_memory.h"
1213
#include "shared/source/helpers/gfx_core_helper.h"
1314
#include "shared/source/memory_manager/allocation_properties.h"
1415
#include "shared/source/utilities/tag_allocator.h"
@@ -73,7 +74,9 @@ InOrderExecInfo::InOrderExecInfo(TagNodeBase *deviceCounterNode, TagNodeBase *ho
7374
deviceAddress = deviceCounterNode->getGpuAddress();
7475
}
7576

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

7881
reset();
7982
}
@@ -98,20 +101,28 @@ void InOrderExecInfo::uploadToTbx(TagNodeBase &node, size_t size) {
98101
}
99102

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

105112
if (isTbx) {
113+
const size_t deviceAllocationWriteSize = alignUp(sizeof(uint64_t), immWritePostSyncWriteOffset) * numDevicePartitionsToWait;
106114
uploadToTbx(*deviceCounterNode, deviceAllocationWriteSize);
107115
}
108116
}
109117

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

114124
if (isTbx) {
125+
const size_t hostAllocationWriteSize = alignUp(sizeof(uint64_t), immWritePostSyncWriteOffset) * numHostPartitionsToWait;
115126
uploadToTbx(*hostCounterNode, hostAllocationWriteSize);
116127
}
117128
}
@@ -126,6 +137,11 @@ void InOrderExecInfo::reset() {
126137
initializeAllocationsFromHost();
127138
}
128139

140+
void InOrderExecInfo::resetCounterValue() {
141+
counterValue = getInitialCounterValue();
142+
lastWaitedCounterValue[allocationOffset != 0].store(getInitialCounterValue());
143+
}
144+
129145
NEO::GraphicsAllocation *InOrderExecInfo::getDeviceCounterAllocation() const {
130146
if (externalDeviceAllocation) {
131147
return externalDeviceAllocation;
@@ -144,19 +160,20 @@ uint64_t InOrderExecInfo::getBaseHostGpuAddress() const {
144160
return hostCounterNode->getGpuAddress();
145161
}
146162

147-
void InOrderExecInfo::pushTempTimestampNode(TagNodeBase *node, uint64_t value) {
163+
void InOrderExecInfo::pushTempTimestampNode(TagNodeBase *node, uint64_t value, uint32_t allocationOffset) {
148164
std::unique_lock<std::mutex> lock(mutex);
149165

150-
tempTimestampNodes.emplace_back(node, value);
166+
tempTimestampNodes.emplace_back(node, std::make_pair(value, allocationOffset));
151167
}
152168

153169
void InOrderExecInfo::releaseNotUsedTempTimestampNodes(bool forceReturn) {
154170
std::unique_lock<std::mutex> lock(mutex);
155171

156-
std::vector<std::pair<TagNodeBase *, uint64_t>> tempVector;
172+
std::vector<std::pair<TagNodeBase *, CounterAndOffsetPairT>> tempVector;
157173

158174
for (auto &node : tempTimestampNodes) {
159-
if (forceReturn || lastWaitedCounterValue >= node.second) {
175+
const auto &counterAndOffsetPair = node.second;
176+
if (forceReturn || isCounterAlreadyDone(counterAndOffsetPair.first, counterAndOffsetPair.second)) {
160177
node.first->returnTag();
161178
} else {
162179
tempVector.push_back(node);
@@ -180,4 +197,8 @@ uint64_t InOrderExecInfo::getDeviceNodeGpuAddress() const {
180197
return 0;
181198
}
182199

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

0 commit comments

Comments
 (0)