Skip to content

Commit 34ff585

Browse files
Add capability to csr to allow N:1 aggregation when ooq is created.
- This allows applications to force the N:1 aggregation by creating out of order queue. - That switches csr to N:1 submission model where commands from multiple command streams may be aggregated. - That forces scenarios returning an event to be aggregated as well. Change-Id: I8fd8d7f88bb2665234ee90870133120b206710a8
1 parent 82c9acd commit 34ff585

File tree

5 files changed

+46
-3
lines changed

5 files changed

+46
-3
lines changed

runtime/command_queue/command_queue_hw.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class CommandQueueHw : public CommandQueue {
6666

6767
if (getCmdQueueProperties<cl_queue_properties>(properties, CL_QUEUE_PROPERTIES) & static_cast<cl_queue_properties>(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE)) {
6868
device->getCommandStreamReceiver().overrideDispatchPolicy(DispatchMode::BatchedDispatch);
69+
device->getCommandStreamReceiver().enableNTo1SubmissionModel();
6970
}
7071
}
7172

runtime/command_queue/enqueue_common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ CompletionStamp CommandQueueHw<GfxFamily>::enqueueNonBlocked(
556556
dispatchFlags.implicitFlush = implicitFlush;
557557
dispatchFlags.flushStampReference = this->flushStamp->getStampReference();
558558
dispatchFlags.preemptionMode = PreemptionHelper::taskPreemptionMode(*device, multiDispatchInfo);
559-
dispatchFlags.outOfOrderExecutionAllowed = !eventBuilder.getEvent() || this->isOOQEnabled();
559+
dispatchFlags.outOfOrderExecutionAllowed = !eventBuilder.getEvent() || commandStreamReceiver.isNTo1SubmissionModelEnabled();
560560

561561
DEBUG_BREAK_IF(taskLevel >= Event::eventNotReady);
562562

runtime/command_stream/command_stream_receiver.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ class CommandStreamReceiver {
104104

105105
uint32_t peekLatestFlushedTaskCount() const { return latestFlushedTaskCount; }
106106

107+
void enableNTo1SubmissionModel() { this->nTo1SubmissionModelEnabled = true; }
108+
bool isNTo1SubmissionModelEnabled() const { return this->nTo1SubmissionModelEnabled; }
107109
void overrideDispatchPolicy(DispatchMode overrideValue) { this->dispatchMode = overrideValue; }
108110

109111
virtual void overrideMediaVFEStateDirty(bool dirty) { mediaVfeStateDirty = dirty; }
@@ -173,6 +175,7 @@ class CommandStreamReceiver {
173175
std::unique_ptr<OSInterface> osInterface;
174176
std::unique_ptr<SubmissionAggregator> submissionAggregator;
175177

178+
bool nTo1SubmissionModelEnabled = false;
176179
DispatchMode dispatchMode = DispatchMode::ImmediateDispatch;
177180
bool disableL3Cache = false;
178181
uint32_t requiredScratchSize = 0;

unit_tests/api/cl_create_command_queue_tests.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,16 @@ HWTEST_F(clCreateCommandQueueTest, givenOoqParametersWhenQueueIsCreatedThenComma
8484
EXPECT_EQ(DispatchMode::BatchedDispatch, csr.dispatchMode);
8585
retVal = clReleaseCommandQueue(cmdq);
8686
}
87+
88+
HWTEST_F(clCreateCommandQueueTest, givenOoqParametersWhenQueueIsCreatedThenCommandStreamReceiverSwitchesToNTo1SubmissionModel) {
89+
cl_int retVal = CL_SUCCESS;
90+
cl_queue_properties ooq = CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE;
91+
auto &csr = reinterpret_cast<UltCommandStreamReceiver<FamilyType> &>(pContext->getDevice(0)->getCommandStreamReceiver());
92+
EXPECT_FALSE(csr.isNTo1SubmissionModelEnabled());
93+
94+
auto cmdq = clCreateCommandQueue(pContext, devices[0], ooq, &retVal);
95+
EXPECT_TRUE(csr.isNTo1SubmissionModelEnabled());
96+
retVal = clReleaseCommandQueue(cmdq);
97+
}
98+
8799
} // namespace ULT

unit_tests/command_queue/enqueue_kernel_tests.cpp

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,13 +1469,14 @@ HWTEST_F(EnqueueKernelTest, givenInOrderCommandQueueWhenEnqueueKernelReturningEv
14691469
clReleaseEvent(event);
14701470
}
14711471

1472-
HWTEST_F(EnqueueKernelTest, givenOutOfOrderCommandQueueWhenEnqueueKernelReturningEventIsMadeThenPipeControlPositionIsRecorded) {
1473-
const cl_queue_properties props[3] = {CL_QUEUE_PROPERTIES, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, 0};
1472+
HWTEST_F(EnqueueKernelTest, givenInOrderCommandQueueWhenEnqueueKernelReturningEventIsMadeAndCommandStreamReceiverIsInNTo1ModeThenPipeControlPositionIsRecorded) {
1473+
const cl_queue_properties props[] = {0};
14741474
auto inOrderQueue = clCreateCommandQueueWithProperties(context, pDevice, props, nullptr);
14751475

14761476
auto mockCsr = new MockCsrHw2<FamilyType>(pDevice->getHardwareInfo());
14771477
mockCsr->overrideDispatchPolicy(DispatchMode::BatchedDispatch);
14781478
pDevice->resetCommandStreamReceiver(mockCsr);
1479+
mockCsr->enableNTo1SubmissionModel();
14791480

14801481
auto mockedSubmissionsAggregator = new mockSubmissionsAggregator();
14811482
mockCsr->overrideSubmissionAggregator(mockedSubmissionsAggregator);
@@ -1486,6 +1487,32 @@ HWTEST_F(EnqueueKernelTest, givenOutOfOrderCommandQueueWhenEnqueueKernelReturnin
14861487

14871488
clEnqueueNDRangeKernel(inOrderQueue, mockKernel.mockKernel, 1, nullptr, gws, nullptr, 0, nullptr, &event);
14881489

1490+
EXPECT_FALSE(mockedSubmissionsAggregator->peekCmdBufferList().peekIsEmpty());
1491+
auto cmdBuffer = mockedSubmissionsAggregator->peekCmdBufferList().peekHead();
1492+
EXPECT_NE(nullptr, cmdBuffer->pipeControlThatMayBeErasedLocation);
1493+
EXPECT_NE(nullptr, cmdBuffer->epiloguePipeControlLocation);
1494+
1495+
clReleaseCommandQueue(inOrderQueue);
1496+
clReleaseEvent(event);
1497+
}
1498+
1499+
HWTEST_F(EnqueueKernelTest, givenOutOfOrderCommandQueueWhenEnqueueKernelReturningEventIsMadeThenPipeControlPositionIsRecorded) {
1500+
auto mockCsr = new MockCsrHw2<FamilyType>(pDevice->getHardwareInfo());
1501+
mockCsr->overrideDispatchPolicy(DispatchMode::BatchedDispatch);
1502+
pDevice->resetCommandStreamReceiver(mockCsr);
1503+
1504+
auto mockedSubmissionsAggregator = new mockSubmissionsAggregator();
1505+
mockCsr->overrideSubmissionAggregator(mockedSubmissionsAggregator);
1506+
1507+
const cl_queue_properties props[3] = {CL_QUEUE_PROPERTIES, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, 0};
1508+
auto inOrderQueue = clCreateCommandQueueWithProperties(context, pDevice, props, nullptr);
1509+
1510+
MockKernelWithInternals mockKernel(*pDevice);
1511+
size_t gws[3] = {1, 0, 0};
1512+
cl_event event;
1513+
1514+
clEnqueueNDRangeKernel(inOrderQueue, mockKernel.mockKernel, 1, nullptr, gws, nullptr, 0, nullptr, &event);
1515+
14891516
EXPECT_FALSE(mockedSubmissionsAggregator->peekCmdBufferList().peekIsEmpty());
14901517
auto cmdBuffer = mockedSubmissionsAggregator->peekCmdBufferList().peekHead();
14911518
EXPECT_NE(nullptr, cmdBuffer->pipeControlThatMayBeErasedLocation);

0 commit comments

Comments
 (0)