Return valid TaskLevel for UserEvent and GlSyncEvent

Change-Id: Ic2bcb64e92e07b94c1af47b109af1274bf6c8c3e
Signed-off-by: Dunajski, Bartosz <bartosz.dunajski@intel.com>
This commit is contained in:
Dunajski, Bartosz
2018-12-04 14:36:08 +01:00
committed by sys_ocldev
parent 2ca3e4c4e5
commit a35e3b792d
7 changed files with 60 additions and 15 deletions

View File

@ -544,7 +544,7 @@ inline void Event::unblockEventBy(Event &event, uint32_t taskLevel, int32_t tran
DBG_LOG(EventsDebugEnable, "Event", this, "is unblocked by", &event);
if (this->taskLevel == Event::eventNotReady) {
this->taskLevel = taskLevel;
this->taskLevel = std::max(cmdQueue->getCommandStreamReceiver().peekTaskLevel(), taskLevel);
} else {
this->taskLevel = std::max(this->taskLevel.load(), taskLevel);
}

View File

@ -32,13 +32,10 @@ bool UserEvent::wait(bool blocking, bool useQuickKmdSleep) {
}
uint32_t UserEvent::getTaskLevel() {
uint32_t taskLevel = 0;
if (ctx != nullptr) {
Device *pDevice = ctx->getDevice(0);
auto csr = pDevice->getDefaultEngine().commandStreamReceiver;
taskLevel = csr->peekTaskLevel();
if (peekExecutionStatus() == CL_COMPLETE) {
return 0;
}
return taskLevel;
return Event::eventNotReady;
}
bool UserEvent::isInitialEventStatus() const {

View File

@ -53,7 +53,9 @@ void GlSyncEvent::updateExecutionStatus() {
}
uint32_t GlSyncEvent::getTaskLevel() {
auto csr = ctx->getDevice(0)->getDefaultEngine().commandStreamReceiver;
return csr->peekTaskLevel();
if (peekExecutionStatus() == CL_COMPLETE) {
return 0;
}
return Event::eventNotReady;
}
} // namespace OCLRT

View File

@ -1344,7 +1344,7 @@ TEST(EventCallback, GivenEventWithCallbacksOnPeekHasCallbacksReturnsTrue) {
}
TEST_F(EventTest, addChildForEventUncompleted) {
VirtualEvent virtualEvent;
VirtualEvent virtualEvent(pCmdQ, &mockContext);
{
Event event(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, 0, 0);
event.addChild(virtualEvent);
@ -1366,8 +1366,29 @@ TEST(Event, whenCreatingRegularEventsThenExternalSynchronizationIsNotRequired) {
virtualEvent->release();
}
HWTEST_F(EventTest, givenEventWithNotReadyTaskLevelWhenUnblockedThenGetTaskLevelFromCsrIfGreaterThanParent) {
uint32_t initialTaskLevel = 10;
Event parentEventWithGreaterTaskLevel(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, initialTaskLevel + 5, 0);
Event parentEventWithLowerTaskLevel(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, initialTaskLevel - 5, 0);
Event childEvent0(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, Event::eventNotReady, Event::eventNotReady);
Event childEvent1(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, Event::eventNotReady, Event::eventNotReady);
auto &csr = reinterpret_cast<UltCommandStreamReceiver<FamilyType> &>(pCmdQ->getCommandStreamReceiver());
csr.taskLevel = initialTaskLevel;
parentEventWithGreaterTaskLevel.addChild(childEvent0);
parentEventWithLowerTaskLevel.addChild(childEvent1);
parentEventWithGreaterTaskLevel.setStatus(CL_COMPLETE);
parentEventWithLowerTaskLevel.setStatus(CL_COMPLETE);
EXPECT_EQ(parentEventWithGreaterTaskLevel.getTaskLevel() + 1, childEvent0.getTaskLevel());
EXPECT_EQ(csr.taskLevel, childEvent1.getTaskLevel());
}
TEST_F(EventTest, addChildForEventCompleted) {
VirtualEvent virtualEvent;
VirtualEvent virtualEvent(pCmdQ, &mockContext);
{
Event event(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, 0, 0);
event.setStatus(CL_COMPLETE);

View File

@ -291,7 +291,7 @@ TEST(EventsTracker, givenSubmittedUserEventThenDumpingWithProperLabel) {
EventsTracker::dumpNode(&uEvent, stream, map);
expected << "e0[label=\"{------USER_EVENT ptr=" << &uEvent
<< "------||CL_SUBMITTED|task count=NOT_READY, level=0|CALLBACKS=FALSE}\",color=red];\n";
<< "------||CL_SUBMITTED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n";
EXPECT_STREQ(expected.str().c_str(), stream.str().c_str());
}
@ -431,6 +431,9 @@ TEST(EventsTracker, givenTwoEventsWithCommonParentEventThenDumpingProperGraph) {
EXPECT_STREQ(expected.str().c_str(), stream.str().c_str());
uEventChild1.updateCompletionStamp(0, 0, 0);
uEventChild2.updateCompletionStamp(0, 0, 0);
uEvent.updateCompletionStamp(0, 0, 0);
uEvent.setStatus(0);
}
@ -605,6 +608,10 @@ TEST(EventsTracker, givenEventsWithDependenciesBetweenThemThenDumpingProperGraph
EXPECT_STREQ(expected.str().c_str(), evTrackerMock.streamMock.c_str());
uEventChild1.updateCompletionStamp(0, 0, 0);
uEventChild2.updateCompletionStamp(0, 0, 0);
uEvent2.updateCompletionStamp(0, 0, 0);
uEvent1.updateCompletionStamp(0, 0, 0);
uEvent2.setStatus(0);
uEvent1.setStatus(0);
}

View File

@ -147,6 +147,22 @@ TEST(UserEvent, userEventAfterSetingStatusIsReadyForSubmission) {
EXPECT_TRUE(uEvent.isReadyForSubmission());
}
TEST(UserEvent, givenUserEventWhenStatusIsCompletedThenReturnZeroTaskLevel) {
UserEvent uEvent;
uEvent.setStatus(CL_QUEUED);
EXPECT_EQ(Event::eventNotReady, uEvent.getTaskLevel());
uEvent.setStatus(CL_SUBMITTED);
EXPECT_EQ(Event::eventNotReady, uEvent.getTaskLevel());
uEvent.setStatus(CL_RUNNING);
EXPECT_EQ(Event::eventNotReady, uEvent.getTaskLevel());
uEvent.setStatus(CL_COMPLETE);
EXPECT_EQ(0u, uEvent.getTaskLevel());
}
typedef HelloWorldTest<HelloWorldFixtureFactory> EventTests;
TEST_F(EventTests, blockedUserEventPassedToEnqueueNdRangeWithoutReturnEventIsNotSubmittedToCSR) {
@ -519,7 +535,7 @@ TEST_F(EventTests, enqueueWithAbortedUserEventDoesntFlushToCSR) {
EXPECT_EQ(taskCount, taskCountAfter);
Event *pChildEvent = (Event *)retEvent;
EXPECT_EQ(Event::eventNotReady, pChildEvent->taskLevel);
EXPECT_EQ(Event::eventNotReady, pChildEvent->getTaskLevel());
cl_int eventStatus = 0;
retVal = clGetEventInfo(retEvent, CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &eventStatus, NULL);

View File

@ -972,13 +972,15 @@ HWTEST_F(glSharingTests, givenSyncObjectWhenCreateEventIsCalledThenCreateGLSyncO
auto &csr = reinterpret_cast<MockDevice *>(context.getDevice(0))->getUltCommandStreamReceiver<FamilyType>();
csr.taskLevel = 123;
auto csrTaskLevel = csr.peekTaskLevel();
auto eventObj = castToObject<Event>(event);
EXPECT_TRUE(eventObj->getCommandType() == CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR);
EXPECT_TRUE(eventObj->peekExecutionStatus() == CL_SUBMITTED);
EXPECT_EQ(Event::eventNotReady, eventObj->taskLevel);
EXPECT_EQ(csrTaskLevel, eventObj->getTaskLevel());
EXPECT_EQ(Event::eventNotReady, eventObj->getTaskLevel());
EXPECT_EQ(1, GLRetainSyncCalled);
eventObj->setStatus(CL_COMPLETE);
EXPECT_EQ(0u, eventObj->getTaskLevel());
clReleaseEvent(event);
EXPECT_EQ(1, GLReleaseSyncCalled);
}