mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-17 05:10:13 +08:00
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:
committed by
Compute-Runtime-Automation
parent
3f7269d401
commit
241d9d447a
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user