Skip to content

Commit 7a5d387

Browse files
[SYCL] Do not lock unconditionally while access queue_iml::MMissedCleanupRequests (#17883)
queue_impl::MMissedCleanupRequests is empty on hot path, use a flag to avoid locking when empty. --------- Co-authored-by: aelovikov-intel <andrei.elovikov@intel.com>
1 parent a1bfa4b commit 7a5d387

File tree

2 files changed

+19
-17
lines changed

2 files changed

+19
-17
lines changed

sycl/source/detail/queue_impl.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -615,12 +615,12 @@ void queue_impl::wait(const detail::code_location &CodeLoc) {
615615
WeakEvents.swap(MEventsWeak);
616616
SharedEvents.swap(MEventsShared);
617617

618-
{
619-
std::lock_guard<std::mutex> RequestLock(MMissedCleanupRequestsMtx);
620-
for (auto &UpdatedGraph : MMissedCleanupRequests)
621-
doUnenqueuedCommandCleanup(UpdatedGraph);
622-
MMissedCleanupRequests.clear();
623-
}
618+
MMissedCleanupRequests.unset(
619+
[&](MissedCleanupRequestsType &MissedCleanupRequests) {
620+
for (auto &UpdatedGraph : MissedCleanupRequests)
621+
doUnenqueuedCommandCleanup(UpdatedGraph);
622+
MissedCleanupRequests.clear();
623+
});
624624
}
625625
// If the queue is either a host one or does not support OOO (and we use
626626
// multiple in-order queues as a result of that), wait for each event
@@ -797,8 +797,10 @@ void queue_impl::revisitUnenqueuedCommandsState(
797797
if (Lock.owns_lock())
798798
doUnenqueuedCommandCleanup(CompletedHostTask->getCommandGraph());
799799
else {
800-
std::lock_guard<std::mutex> RequestLock(MMissedCleanupRequestsMtx);
801-
MMissedCleanupRequests.push_back(CompletedHostTask->getCommandGraph());
800+
MMissedCleanupRequests.set(
801+
[&](MissedCleanupRequestsType &MissedCleanupRequests) {
802+
MissedCleanupRequests.push_back(CompletedHostTask->getCommandGraph());
803+
});
802804
}
803805
}
804806

sycl/source/detail/queue_impl.hpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -842,12 +842,12 @@ class queue_impl {
842842
// dependency so in the case where some commands were not enqueued
843843
// (blocked), we track them to prevent barrier from being enqueued
844844
// earlier.
845-
{
846-
std::lock_guard<std::mutex> RequestLock(MMissedCleanupRequestsMtx);
847-
for (auto &UpdatedGraph : MMissedCleanupRequests)
848-
doUnenqueuedCommandCleanup(UpdatedGraph);
849-
MMissedCleanupRequests.clear();
850-
}
845+
MMissedCleanupRequests.unset(
846+
[&](MissedCleanupRequestsType &MissedCleanupRequests) {
847+
for (auto &UpdatedGraph : MissedCleanupRequests)
848+
doUnenqueuedCommandCleanup(UpdatedGraph);
849+
MissedCleanupRequests.clear();
850+
});
851851
auto &Deps = MGraph.expired() ? MDefaultGraphDeps : MExtGraphDeps;
852852
if (Type == CGType::Barrier && !Deps.UnenqueuedCmdEvents.empty()) {
853853
Handler.depends_on(Deps.UnenqueuedCmdEvents);
@@ -1104,9 +1104,9 @@ class queue_impl {
11041104
unsigned long long MQueueID;
11051105
static std::atomic<unsigned long long> MNextAvailableQueueID;
11061106

1107-
std::deque<std::shared_ptr<ext::oneapi::experimental::detail::graph_impl>>
1108-
MMissedCleanupRequests;
1109-
std::mutex MMissedCleanupRequestsMtx;
1107+
using MissedCleanupRequestsType = std::deque<
1108+
std::shared_ptr<ext::oneapi::experimental::detail::graph_impl>>;
1109+
CheckLockCheck<MissedCleanupRequestsType> MMissedCleanupRequests;
11101110

11111111
friend class sycl::ext::oneapi::experimental::detail::node_impl;
11121112

0 commit comments

Comments
 (0)