diff --git a/emper/lib/adt/LockedQueue.hpp b/emper/lib/adt/LockedQueue.hpp index a1a86180f0d320d8298c2deaa12d1c45ede42b41..6344ccd468107234f42c8cbdfa915cd4606f7452 100644 --- a/emper/lib/adt/LockedQueue.hpp +++ b/emper/lib/adt/LockedQueue.hpp @@ -29,6 +29,11 @@ class LockedQueue { return SIZE - deque.size(); } + auto usedSlots() -> size_t { + std::lock_guard<std::mutex> lock(queue_mutex); + return deque.size(); + } + auto pushBottom(const I item) -> bool { std::lock_guard<std::mutex> lock(queue_mutex); diff --git a/emper/strategies/AbstractWorkStealingScheduler.cpp b/emper/strategies/AbstractWorkStealingScheduler.cpp index 9205a6890ac5ab70c3ee853ac7b5088392c97f11..09fc49b89ca4a5fc6aac13e524a9ffb0d05851ee 100644 --- a/emper/strategies/AbstractWorkStealingScheduler.cpp +++ b/emper/strategies/AbstractWorkStealingScheduler.cpp @@ -48,7 +48,8 @@ void AbstractWorkStealingScheduler::scheduleViaWorkStealing(Fiber& fiber) { ABORT("Could not push fiber " << &fiber << " into queue"); } } else if constexpr (emper::STATS) { - awss::stats.scheduledFibersToLocal++; + uint64_t queueLength = queue.usedSlots(); + awss::stats.recordScheduledToLocalAndQueueLength(queueLength); } // Classes using this method are supposed to always invoke this diff --git a/emper/strategies/AbstractWorkStealingStats.cpp b/emper/strategies/AbstractWorkStealingStats.cpp index 0e6492a2d096c2391a71386ca07ae51a597b69c7..c6e6e79620c715b91139fe944ce98a5d56345591 100644 --- a/emper/strategies/AbstractWorkStealingStats.cpp +++ b/emper/strategies/AbstractWorkStealingStats.cpp @@ -21,6 +21,8 @@ void AbstractWorkStealingStats::print() { << std::to_string(comulatedWorkerStats.scheduledFibersToLocal) << std::endl << "total-scheduled-fibers-to-overflow-queue: " << std::to_string(comulatedWorkerStats.scheduledFibersToOverflowQueue) << std::endl + << "global-max-queue-length: " << std::to_string(comulatedWorkerStats.maxQueueLength) + << std::endl << "total-next-fiber-from-local: " << std::to_string(comulatedWorkerStats.nextFiberFromLocal) << std::endl << "total-next-fiber-hint-local: " diff --git a/emper/strategies/AbstractWorkStealingWorkerStats.cpp b/emper/strategies/AbstractWorkStealingWorkerStats.cpp index 260e5d4fbeced409950dea2f5343b11cc7fb906e..c7adae3f6b6aab1eefe381af0e3fac08d5ec187b 100644 --- a/emper/strategies/AbstractWorkStealingWorkerStats.cpp +++ b/emper/strategies/AbstractWorkStealingWorkerStats.cpp @@ -8,6 +8,7 @@ auto AbstractWorkStealingWorkerStats::operator+=(const AbstractWorkStealingWorke -> AbstractWorkStealingWorkerStats& { scheduledFibersToLocal += other.scheduledFibersToLocal; scheduledFibersToOverflowQueue += other.scheduledFibersToOverflowQueue; + maxQueueLength = std::max(maxQueueLength, other.maxQueueLength); nextFiberFromLocal += other.nextFiberFromLocal; nextFiberStolen += other.nextFiberStolen; nextFiberFromAnywhereQueue += other.nextFiberFromAnywhereQueue; @@ -27,3 +28,8 @@ void AbstractWorkStealingWorkerStats::recordFibersLiftedFromAnywhereQueue( std::max(maxFibersLiftedFromAnywhereQueue, fibersLiftedFromAnywhereQueue); avgFibersLiftedFromAnywhereQueue.update(fibersLiftedFromAnywhereQueue); } + +void AbstractWorkStealingWorkerStats::recordScheduledToLocalAndQueueLength(uint64_t queueLength) { + scheduledFibersToLocal++; + maxQueueLength = std::max(maxQueueLength, queueLength); +} diff --git a/emper/strategies/AbstractWorkStealingWorkerStats.hpp b/emper/strategies/AbstractWorkStealingWorkerStats.hpp index 35126d12537fc37fe720601f43663bbb0f2ca655..684b1d5966ac5c910f9c14125a002378dea4152a 100644 --- a/emper/strategies/AbstractWorkStealingWorkerStats.hpp +++ b/emper/strategies/AbstractWorkStealingWorkerStats.hpp @@ -15,6 +15,7 @@ class AbstractWorkStealingWorkerStats { public: uint64_t scheduledFibersToLocal = 0; uint64_t scheduledFibersToOverflowQueue = 0; + uint64_t maxQueueLength = 0; uint64_t nextFiberFromLocal = 0; uint64_t nextFiberFromHintLocal = 0; uint64_t nextFiberFromHintAnywhere = 0; @@ -29,4 +30,6 @@ class AbstractWorkStealingWorkerStats { private: void recordFibersLiftedFromAnywhereQueue(size_t fibersLiftedFromAnywhere); + + void recordScheduledToLocalAndQueueLength(uint64_t queueLength); };