mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-09 14:33:04 +08:00
Optimize BCS flushing scheme [2/n]
Change-Id: I6f1e0115b9c45f89afb86f8fd2304604243541df Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:
committed by
sys_ocldev
parent
d4b12c97d4
commit
86dc5bacc7
@@ -7,11 +7,13 @@
|
||||
|
||||
#include "shared/source/helpers/timestamp_packet.h"
|
||||
#include "shared/test/unit_test/helpers/debug_manager_state_restore.h"
|
||||
#include "shared/test/unit_test/utilities/base_object_utils.h"
|
||||
|
||||
#include "opencl/source/event/async_events_handler.h"
|
||||
#include "opencl/source/event/event.h"
|
||||
#include "opencl/source/event/user_event.h"
|
||||
#include "opencl/test/unit_test/mocks/mock_async_event_handler.h"
|
||||
#include "opencl/test/unit_test/mocks/mock_command_queue.h"
|
||||
#include "opencl/test/unit_test/mocks/mock_context.h"
|
||||
#include "test.h"
|
||||
|
||||
@@ -32,7 +34,7 @@ class AsyncEventsHandlerTests : public ::testing::Test {
|
||||
}
|
||||
void setTaskStamp(uint32_t taskLevel, uint32_t taskCount) {
|
||||
this->taskLevel.store(taskLevel);
|
||||
this->updateTaskCount(taskCount);
|
||||
this->updateTaskCount(taskCount, 0);
|
||||
}
|
||||
|
||||
MOCK_METHOD2(wait, bool(bool blocking, bool quickKmdSleep));
|
||||
@@ -46,36 +48,34 @@ class AsyncEventsHandlerTests : public ::testing::Test {
|
||||
dbgRestore.reset(new DebugManagerStateRestore());
|
||||
DebugManager.flags.EnableAsyncEventsHandler.set(false);
|
||||
handler.reset(new MockHandler());
|
||||
context = new NiceMock<MockContext>();
|
||||
context = make_releaseable<NiceMock<MockContext>>();
|
||||
|
||||
event1 = new NiceMock<MyEvent>(context, nullptr, CL_COMMAND_BARRIER, CompletionStamp::notReady, CompletionStamp::notReady);
|
||||
event2 = new NiceMock<MyEvent>(context, nullptr, CL_COMMAND_BARRIER, CompletionStamp::notReady, CompletionStamp::notReady);
|
||||
event3 = new NiceMock<MyEvent>(context, nullptr, CL_COMMAND_BARRIER, CompletionStamp::notReady, CompletionStamp::notReady);
|
||||
}
|
||||
commandQueue = make_releaseable<MockCommandQueue>(context.get(), context->getDevice(0), nullptr);
|
||||
|
||||
void TearDown() override {
|
||||
context->release();
|
||||
event1->release();
|
||||
event2->release();
|
||||
event3->release();
|
||||
*(commandQueue->getGpgpuCommandStreamReceiver().getTagAddress()) = 0;
|
||||
|
||||
event1 = make_releaseable<NiceMock<MyEvent>>(context.get(), commandQueue.get(), CL_COMMAND_BARRIER, CompletionStamp::notReady, CompletionStamp::notReady);
|
||||
event2 = make_releaseable<NiceMock<MyEvent>>(context.get(), commandQueue.get(), CL_COMMAND_BARRIER, CompletionStamp::notReady, CompletionStamp::notReady);
|
||||
event3 = make_releaseable<NiceMock<MyEvent>>(context.get(), commandQueue.get(), CL_COMMAND_BARRIER, CompletionStamp::notReady, CompletionStamp::notReady);
|
||||
}
|
||||
|
||||
std::unique_ptr<DebugManagerStateRestore> dbgRestore;
|
||||
std::unique_ptr<MockHandler> handler;
|
||||
int counter = 0;
|
||||
|
||||
NiceMock<MyEvent> *event1 = nullptr;
|
||||
NiceMock<MyEvent> *event2 = nullptr;
|
||||
NiceMock<MyEvent> *event3 = nullptr;
|
||||
NiceMock<MockContext> *context = nullptr;
|
||||
ReleaseableObjectPtr<NiceMock<MockContext>> context;
|
||||
ReleaseableObjectPtr<MockCommandQueue> commandQueue;
|
||||
ReleaseableObjectPtr<NiceMock<MyEvent>> event1;
|
||||
ReleaseableObjectPtr<NiceMock<MyEvent>> event2;
|
||||
ReleaseableObjectPtr<NiceMock<MyEvent>> event3;
|
||||
};
|
||||
|
||||
TEST_F(AsyncEventsHandlerTests, givenEventsWhenListIsProcessedThenUpdateExecutionStatus) {
|
||||
event1->setTaskStamp(0, 0);
|
||||
event2->setTaskStamp(0, 0);
|
||||
|
||||
handler->registerEvent(event1);
|
||||
handler->registerEvent(event2);
|
||||
handler->registerEvent(event1.get());
|
||||
handler->registerEvent(event2.get());
|
||||
|
||||
EXPECT_EQ(CL_QUEUED, event1->getExecutionStatus());
|
||||
EXPECT_EQ(CL_QUEUED, event2->getExecutionStatus());
|
||||
@@ -91,7 +91,7 @@ TEST_F(AsyncEventsHandlerTests, givenEventsWhenListIsProcessedThenUpdateExecutio
|
||||
TEST_F(AsyncEventsHandlerTests, WhenProcessIsCompletedThenRefInternalCountIsDecremented) {
|
||||
event1->setTaskStamp(CompletionStamp::notReady, 0);
|
||||
|
||||
handler->registerEvent(event1);
|
||||
handler->registerEvent(event1.get());
|
||||
EXPECT_EQ(2, event1->getRefInternalCount());
|
||||
handler->process();
|
||||
EXPECT_TRUE(handler->peekIsListEmpty());
|
||||
@@ -103,7 +103,7 @@ TEST_F(AsyncEventsHandlerTests, givenNotCalledCallbacksWhenListIsProcessedThenDo
|
||||
event1->setTaskStamp(CompletionStamp::notReady, 0);
|
||||
event1->addCallback(&this->callbackFcn, CL_SUBMITTED, &submittedCounter);
|
||||
event1->addCallback(&this->callbackFcn, CL_COMPLETE, &completeCounter);
|
||||
handler->registerEvent(event1);
|
||||
handler->registerEvent(event1.get());
|
||||
|
||||
auto expect = [&](int status, int sCounter, int cCounter, bool empty) {
|
||||
EXPECT_EQ(status, event1->getExecutionStatus());
|
||||
@@ -160,10 +160,10 @@ TEST_F(AsyncEventsHandlerTests, givenExternallSynchronizedEventWhenListIsProcess
|
||||
}
|
||||
|
||||
TEST_F(AsyncEventsHandlerTests, givenDoubleRegisteredEventWhenListIsProcessedAndNoCallbacksToProcessThenUnregister) {
|
||||
event1->setTaskStamp(CompletionStamp::notReady - 1, 0);
|
||||
event1->setTaskStamp(CompletionStamp::notReady - 1, CompletionStamp::notReady + 1);
|
||||
event1->addCallback(&this->callbackFcn, CL_SUBMITTED, &counter);
|
||||
handler->registerEvent(event1);
|
||||
handler->registerEvent(event1);
|
||||
handler->registerEvent(event1.get());
|
||||
handler->registerEvent(event1.get());
|
||||
|
||||
handler->process();
|
||||
EXPECT_EQ(CL_SUBMITTED, event1->getExecutionStatus());
|
||||
@@ -178,9 +178,9 @@ TEST_F(AsyncEventsHandlerTests, givenEventsNotHandledByHandlderWhenDestructingTh
|
||||
event1->addCallback(&this->callbackFcn, CL_SUBMITTED, &counter);
|
||||
event2->addCallback(&this->callbackFcn, CL_SUBMITTED, &counter);
|
||||
|
||||
myHandler->registerEvent(event1);
|
||||
myHandler->registerEvent(event1.get());
|
||||
myHandler->process();
|
||||
myHandler->registerEvent(event2);
|
||||
myHandler->registerEvent(event2.get());
|
||||
|
||||
EXPECT_FALSE(myHandler->peekIsListEmpty());
|
||||
EXPECT_FALSE(myHandler->peekIsRegisterListEmpty());
|
||||
@@ -202,9 +202,9 @@ TEST_F(AsyncEventsHandlerTests, givenEventsNotHandledByHandlderWhenAsyncExecutio
|
||||
event1->addCallback(&this->callbackFcn, CL_SUBMITTED, &counter);
|
||||
event2->addCallback(&this->callbackFcn, CL_SUBMITTED, &counter);
|
||||
|
||||
handler->registerEvent(event1);
|
||||
handler->registerEvent(event1.get());
|
||||
handler->process();
|
||||
handler->registerEvent(event2);
|
||||
handler->registerEvent(event2.get());
|
||||
|
||||
EXPECT_FALSE(handler->peekIsListEmpty());
|
||||
EXPECT_FALSE(handler->peekIsRegisterListEmpty());
|
||||
@@ -231,15 +231,15 @@ TEST_F(AsyncEventsHandlerTests, WhenHandlerIsRegisteredThenThreadIsCreated) {
|
||||
event1->setTaskStamp(CompletionStamp::notReady, 0);
|
||||
|
||||
EXPECT_FALSE(handler->openThreadCalled);
|
||||
handler->registerEvent(event1);
|
||||
handler->registerEvent(event1.get());
|
||||
EXPECT_TRUE(handler->openThreadCalled);
|
||||
}
|
||||
|
||||
TEST_F(AsyncEventsHandlerTests, WhenProcessingAsynchronouslyThenBothThreadsCompelete) {
|
||||
DebugManager.flags.EnableAsyncEventsHandler.set(true);
|
||||
|
||||
event1->setTaskStamp(CompletionStamp::notReady, 0);
|
||||
event2->setTaskStamp(CompletionStamp::notReady, 0);
|
||||
event1->setTaskStamp(CompletionStamp::notReady, CompletionStamp::notReady + 1);
|
||||
event2->setTaskStamp(CompletionStamp::notReady, CompletionStamp::notReady + 1);
|
||||
|
||||
event1->addCallback(&this->callbackFcn, CL_SUBMITTED, &counter);
|
||||
event2->addCallback(&this->callbackFcn, CL_SUBMITTED, &counter);
|
||||
@@ -309,14 +309,14 @@ TEST_F(AsyncEventsHandlerTests, givenRegistredEventsWhenProcessIsCalledThenRetur
|
||||
event3->setTaskStamp(0, 3);
|
||||
|
||||
event2->addCallback(&this->callbackFcn, CL_COMPLETE, &event2Counter);
|
||||
handler->registerEvent(event2);
|
||||
handler->registerEvent(event2.get());
|
||||
event1->addCallback(&this->callbackFcn, CL_COMPLETE, &event1Counter);
|
||||
handler->registerEvent(event1);
|
||||
handler->registerEvent(event1.get());
|
||||
event3->addCallback(&this->callbackFcn, CL_COMPLETE, &event3Counter);
|
||||
handler->registerEvent(event3);
|
||||
handler->registerEvent(event3.get());
|
||||
|
||||
auto sleepCandidate = handler->process();
|
||||
EXPECT_EQ(event1, sleepCandidate);
|
||||
EXPECT_EQ(event1.get(), sleepCandidate);
|
||||
|
||||
event1->setStatus(CL_COMPLETE);
|
||||
event2->setStatus(CL_COMPLETE);
|
||||
@@ -327,12 +327,12 @@ TEST_F(AsyncEventsHandlerTests, givenEventWithoutCallbacksWhenProcessedThenDontR
|
||||
event1->setTaskStamp(0, 1);
|
||||
event2->setTaskStamp(0, 2);
|
||||
|
||||
handler->registerEvent(event1);
|
||||
handler->registerEvent(event1.get());
|
||||
event2->addCallback(&this->callbackFcn, CL_COMPLETE, &counter);
|
||||
handler->registerEvent(event2);
|
||||
handler->registerEvent(event2.get());
|
||||
|
||||
auto sleepCandidate = handler->process();
|
||||
EXPECT_EQ(event2, sleepCandidate);
|
||||
EXPECT_EQ(event2.get(), sleepCandidate);
|
||||
|
||||
event2->setStatus(CL_COMPLETE);
|
||||
}
|
||||
@@ -340,7 +340,7 @@ TEST_F(AsyncEventsHandlerTests, givenEventWithoutCallbacksWhenProcessedThenDontR
|
||||
TEST_F(AsyncEventsHandlerTests, givenSleepCandidateWhenProcessedThenCallWaitWithQuickKmdSleepRequest) {
|
||||
event1->setTaskStamp(0, 1);
|
||||
event1->addCallback(&this->callbackFcn, CL_COMPLETE, &counter);
|
||||
handler->registerEvent(event1);
|
||||
handler->registerEvent(event1.get());
|
||||
handler->allowAsyncProcess.store(true);
|
||||
|
||||
// break infinite loop after first iteartion
|
||||
|
||||
Reference in New Issue
Block a user