feature: optimize programming wait events from the same in-order cmdlist

Related-To: NEO-7966

Signed-off-by: Dunajski, Bartosz <bartosz.dunajski@intel.com>
This commit is contained in:
Dunajski, Bartosz
2023-07-07 11:34:53 +00:00
committed by Compute-Runtime-Automation
parent 3f7269d401
commit 241d9d447a
5 changed files with 107 additions and 44 deletions

View File

@@ -326,6 +326,7 @@ struct CommandListCoreFamily : CommandListImp {
NEO::PreemptionMode obtainKernelPreemptionMode(Kernel *kernel);
virtual bool isRelaxedOrderingDispatchAllowed(uint32_t numWaitEvents) const { return false; }
virtual void setupFlushMethod(const NEO::RootDeviceEnvironment &rootDeviceEnvironment) {}
bool isInOrderEventWaitRequired(const Event &event) const;
};
template <PRODUCT_FAMILY gfxProductFamily>

View File

@@ -2210,6 +2210,11 @@ void CommandListCoreFamily<gfxCoreFamily>::appendWaitOnInOrderDependency(NEO::Gr
}
}
template <GFXCORE_FAMILY gfxCoreFamily>
bool CommandListCoreFamily<gfxCoreFamily>::isInOrderEventWaitRequired(const Event &event) const {
return (event.getInOrderExecDataAllocation() != this->inOrderDependencyCounterAllocation);
}
template <GFXCORE_FAMILY gfxCoreFamily>
ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendWaitOnEvents(uint32_t numEvents, ze_event_handle_t *phEvent, bool relaxedOrderingAllowed, bool trackDependencies, bool signalInOrderCompletion) {
signalInOrderCompletion &= this->inOrderExecutionEnabled;
@@ -2252,10 +2257,7 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendWaitOnEvents(uint32_t nu
}
if (event->isInOrderExecEvent()) {
bool eventFromPreviousAppend = (event->getInOrderExecDataAllocation() == this->inOrderDependencyCounterAllocation) &&
(event->getInOrderExecSignalValue() == this->inOrderDependencyCounter);
if (!eventFromPreviousAppend) {
if (isInOrderEventWaitRequired(*event)) {
CommandListCoreFamily<gfxCoreFamily>::appendWaitOnInOrderDependency(event->getInOrderExecDataAllocation(), event->getInOrderExecSignalValue(), event->getInOrderAllocationOffset(), relaxedOrderingAllowed);
}
continue;

View File

@@ -187,6 +187,7 @@ struct CommandListCoreFamilyImmediate : public CommandListCoreFamily<gfxCoreFami
bool hasStallingCmdsForRelaxedOrdering(uint32_t numWaitEvents, bool relaxedOrderingDispatch) const;
void setupFlushMethod(const NEO::RootDeviceEnvironment &rootDeviceEnvironment) override;
void handleInOrderDependencyCounter();
bool isSkippingInOrderBarrierAllowed(ze_event_handle_t hSignalEvent, uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents) const;
MOCKABLE_VIRTUAL void checkAssert();
ComputeFlushMethodType computeFlushMethod = nullptr;

View File

@@ -438,6 +438,25 @@ ze_result_t CommandListCoreFamilyImmediate<gfxCoreFamily>::appendLaunchKernelInd
return flushImmediate(ret, true, hasStallingCmdsForRelaxedOrdering(numWaitEvents, relaxedOrderingDispatch), relaxedOrderingDispatch, hSignalEvent);
}
template <GFXCORE_FAMILY gfxCoreFamily>
bool CommandListCoreFamilyImmediate<gfxCoreFamily>::isSkippingInOrderBarrierAllowed(ze_event_handle_t hSignalEvent, uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents) const {
uint32_t eventsToWait = numWaitEvents;
for (uint32_t i = 0; i < numWaitEvents; i++) {
if (!CommandListCoreFamily<gfxCoreFamily>::isInOrderEventWaitRequired(*Event::fromHandle(phWaitEvents[i]))) {
eventsToWait--;
}
}
if (eventsToWait > 0) {
return false;
}
auto signalEvent = Event::fromHandle(hSignalEvent);
return !(signalEvent && signalEvent->isEventTimestampFlagSet());
}
template <GFXCORE_FAMILY gfxCoreFamily>
ze_result_t CommandListCoreFamilyImmediate<gfxCoreFamily>::appendBarrier(
ze_event_handle_t hSignalEvent,
@@ -445,21 +464,12 @@ ze_result_t CommandListCoreFamilyImmediate<gfxCoreFamily>::appendBarrier(
ze_event_handle_t *phWaitEvents) {
ze_result_t ret = ZE_RESULT_SUCCESS;
if (isInOrderExecutionEnabled() && numWaitEvents == 0) {
auto signalEvent = Event::fromHandle(hSignalEvent);
bool earlyReturn = true;
if (signalEvent) {
if (signalEvent->isEventTimestampFlagSet()) {
earlyReturn = false;
} else {
signalEvent->enableInOrderExecMode(*this->inOrderDependencyCounterAllocation, this->inOrderDependencyCounter, this->inOrderAllocationOffset);
}
if (isInOrderExecutionEnabled() && isSkippingInOrderBarrierAllowed(hSignalEvent, numWaitEvents, phWaitEvents)) {
if (hSignalEvent) {
Event::fromHandle(hSignalEvent)->enableInOrderExecMode(*this->inOrderDependencyCounterAllocation, this->inOrderDependencyCounter, this->inOrderAllocationOffset);
}
if (earlyReturn) {
return ZE_RESULT_SUCCESS;
}
return ZE_RESULT_SUCCESS;
}
if (this->isFlushTaskSubmissionEnabled) {