diff --git a/emper/Emper.hpp b/emper/Emper.hpp new file mode 100644 index 0000000000000000000000000000000000000000..4e5545d2a76d888d1d60fb4ee3f2c2bbdf60e475 --- /dev/null +++ b/emper/Emper.hpp @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright © 2020 Florian Schmaus +#pragma once + +#include <emper-config.h> + +namespace emper { +static const bool STATS = +#ifdef EMPER_STATS + true +#else + false +#endif + ; + +} // namespace emper diff --git a/emper/Runtime.cpp b/emper/Runtime.cpp index b413c74256efb132fa50c5e23ecf9e2ae4b8f0b6..48f1a8b96978f1cd8f1fcb5c5b568ebd47d1a349 100644 --- a/emper/Runtime.cpp +++ b/emper/Runtime.cpp @@ -12,10 +12,11 @@ #include <cstdlib> // for rand, srand, abort #include <memory> // for __shared_ptr_access, shared_ptr -#include "Common.hpp" // for DIE_MSG_ERRNO, DIE, DIE_MSG -#include "ContextManager.hpp" // for ContextManager -#include "Debug.hpp" // for DBG, ABORT, LOGD, LOGE -#include "Dispatcher.hpp" // for Dispatcher +#include "Common.hpp" // for DIE_MSG_ERRNO, DIE, DIE_MSG +#include "ContextManager.hpp" // for ContextManager +#include "Debug.hpp" // for DBG, ABORT, LOGD, LOGE +#include "Dispatcher.hpp" // for Dispatcher +#include "Emper.hpp" #include "Fiber.hpp" // for Fiber #include "RuntimeStrategy.hpp" // for RuntimeStrategy #include "RuntimeStrategyStats.hpp" // for RuntimeStrategyStats @@ -80,12 +81,12 @@ Runtime::Runtime(workerid_t workerCount, RuntimeStrategy& strategy, unsigned int if (errno) DIE_MSG_ERRNO("pthread_create() failed"); } -#ifdef EMPER_STATS - int res = std::atexit(&printLastRuntimeStats); - if (res) { - DIE_MSG("could not register printStats() with at_exit()"); + if constexpr (emper::STATS) { + int res = std::atexit(&printLastRuntimeStats); + if (res) { + DIE_MSG("could not register printStats() with at_exit()"); + } } -#endif } Runtime::~Runtime() { diff --git a/emper/strategies/laws/LawsDispatcher.cpp b/emper/strategies/laws/LawsDispatcher.cpp index a935e55bdd11bf6a76fc38fa3d85553c2795a3a1..8c42f22fe1214295879cb9a60a9a7b40291fd5bd 100644 --- a/emper/strategies/laws/LawsDispatcher.cpp +++ b/emper/strategies/laws/LawsDispatcher.cpp @@ -2,11 +2,14 @@ // Copyright © 2020 Florian Schmaus #include "LawsDispatcher.hpp" -#include "LawsStrategy.hpp" // IWYU pragma: keep -#include "Runtime.hpp" -#include "emper-config.h" +#include <atomic> // for atomic, memory_order_relaxed -class Fiber; +#include "Common.hpp" // for DIE_MSG +#include "Emper.hpp" +#include "Fiber.hpp" // for Fiber +#include "LawsStrategy.hpp" // for LawsStrategy, LawsStrategy::FiberSource +#include "Runtime.hpp" +#include "emper-config.h" // for EMPER_WORKER_SLEEP void LawsDispatcher::dispatchLoop() { while (true) { @@ -24,27 +27,28 @@ void LawsDispatcher::dispatchLoop() { // boolean initialize to true in order to check if this fiber // is runnable. if (isRunnable(fiber)) { -#ifdef EMPER_STATS - LawsStrategy::FiberSource fiberSource = - static_cast<LawsStrategy::FiberSource>(fiber->getFlag()); - switch (fiberSource) { - case LawsStrategy::FiberSource::fromPriority: - lawsStrategy.dispatchedFiberFromPriority.fetch_add(1, std::memory_order_relaxed); - break; - case LawsStrategy::FiberSource::fromLocal: - lawsStrategy.dispatchedFiberFromLocal.fetch_add(1, std::memory_order_relaxed); - break; - case LawsStrategy::FiberSource::stolen: - lawsStrategy.dispatchedFiberStolen.fetch_add(1, std::memory_order_relaxed); - break; - case LawsStrategy::FiberSource::mainThread: - lawsStrategy.dispatchedFiberFromMainThread.fetch_add(1, std::memory_order_relaxed); - break; - default: - DIE_MSG("Unknown fiber flag: " << flag); - break; + if constexpr (emper::STATS) { + LawsStrategy::FiberSource fiberSource = + static_cast<LawsStrategy::FiberSource>(fiber->getFlag()); + switch (fiberSource) { + case LawsStrategy::FiberSource::fromPriority: + lawsStrategy.dispatchedFiberFromPriority.fetch_add(1, std::memory_order_relaxed); + break; + case LawsStrategy::FiberSource::fromLocal: + lawsStrategy.dispatchedFiberFromLocal.fetch_add(1, std::memory_order_relaxed); + break; + case LawsStrategy::FiberSource::stolen: + lawsStrategy.dispatchedFiberStolen.fetch_add(1, std::memory_order_relaxed); + break; + case LawsStrategy::FiberSource::mainThread: + lawsStrategy.dispatchedFiberFromMainThread.fetch_add(1, std::memory_order_relaxed); + break; + default: + DIE_MSG("Unknown fiber flag: " << flag); + break; + } } -#endif + // The fiber was marked das runnable. Run it now. dispatch(fiber); // Update the affinity if one was set. diff --git a/emper/strategies/laws/LawsScheduler.cpp b/emper/strategies/laws/LawsScheduler.cpp index 98031bc76c61ef1b51a4efe03335851270fc9867..43dbfdda1270146161eb6e6d69d95427d886f667 100644 --- a/emper/strategies/laws/LawsScheduler.cpp +++ b/emper/strategies/laws/LawsScheduler.cpp @@ -2,11 +2,14 @@ // Copyright © 2020 Florian Schmaus #include "LawsScheduler.hpp" +#include <atomic> // for atomic, memory_order_relaxed + #include "Common.hpp" #include "Debug.hpp" +#include "Emper.hpp" #include "LawsStrategy.hpp" // IWYU pragma: keep #include "Runtime.hpp" -#include "emper-config.h" +#include "emper-config.h" // for EMPER_WORKER_SLEEP #define EMPER_OVERFLOW_QUEUE @@ -47,9 +50,9 @@ void LawsScheduler::schedule(Fiber& fiber) { // We found a fiber to schedule on a remote prority queue. increaseRefCount(fiber); priorityQueues[affinity]->enqueue(&fiber); -#ifdef EMPER_STATS - lawsStrategy.scheduledFibersToRemotePriority.fetch_add(1, std::memory_order_relaxed); -#endif + if constexpr (emper::STATS) { + lawsStrategy.scheduledFibersToRemotePriority.fetch_add(1, std::memory_order_relaxed); + } } scheduleToLocalWsQueue: @@ -61,9 +64,9 @@ scheduleToLocalWsQueue: ABORT("Could not push fiber " << &fiber << " into queue"); #endif } else { -#ifdef EMPER_STATS - lawsStrategy.scheduledFibersToLocal.fetch_add(1, std::memory_order_relaxed); -#endif + if constexpr (emper::STATS) { + lawsStrategy.scheduledFibersToLocal.fetch_add(1, std::memory_order_relaxed); + } } #ifdef EMPER_WORKER_SLEEP @@ -75,20 +78,22 @@ auto LawsScheduler::nextFiber() -> Fiber* { Fiber* fiber = priorityQueue.dequeue(); if (fiber != nullptr) { // We fetched a fiber from your local priority queue. -#ifdef EMPER_STATS - unsigned int flag = static_cast<unsigned int>(LawsStrategy::FiberSource::fromPriority); - fiber->setFlag(flag); -#endif + if constexpr (emper::STATS) { + unsigned int flag = static_cast<unsigned int>(LawsStrategy::FiberSource::fromPriority); + fiber->setFlag(flag); + } + return fiber; } bool poped = queue.popBottom(&fiber); if (likely(poped)) { -#ifdef EMPER_STATS - unsigned int flag = static_cast<unsigned int>(LawsStrategy::FiberSource::fromLocal); - fiber->setFlag(flag); -#endif + if constexpr (emper::STATS) { + unsigned int flag = static_cast<unsigned int>(LawsStrategy::FiberSource::fromLocal); + fiber->setFlag(flag); + } + return fiber; } @@ -100,10 +105,11 @@ auto LawsScheduler::nextFiber() -> Fiber* { poped = queues[victim]->popTop(&fiber); if (poped) { -#ifdef EMPER_STATS - unsigned int flag = static_cast<unsigned int>(LawsStrategy::FiberSource::stolen); - fiber->setFlag(flag); -#endif + if (emper::STATS) { + unsigned int flag = static_cast<unsigned int>(LawsStrategy::FiberSource::stolen); + fiber->setFlag(flag); + } + return fiber; } @@ -112,10 +118,11 @@ auto LawsScheduler::nextFiber() -> Fiber* { // Try the main thread queue to get work as last resort. poped = mainThreadQueue->popTop(&fiber); if (poped) { -#ifdef EMPER_STATS - unsigned int flag = static_cast<unsigned int>(LawsStrategy::FiberSource::mainThread); - fiber->setFlag(flag); -#endif + if constexpr (emper::STATS) { + unsigned int flag = static_cast<unsigned int>(LawsStrategy::FiberSource::mainThread); + fiber->setFlag(flag); + } + return fiber; } diff --git a/emper/strategies/ws/WsScheduler.cpp b/emper/strategies/ws/WsScheduler.cpp index a64f50107cb513777b616c7ffb983be67151b1f4..e7cd5ce30fa58644c2cb64faf51f1d81bd3cfe13 100644 --- a/emper/strategies/ws/WsScheduler.cpp +++ b/emper/strategies/ws/WsScheduler.cpp @@ -2,12 +2,15 @@ // Copyright © 2020 Florian Schmaus #include "WsScheduler.hpp" +#include <atomic> #include <ostream> #include "Common.hpp" #include "Debug.hpp" +#include "Emper.hpp" #include "Runtime.hpp" #include "emper-config.h" +#include "strategies/ws/WsStrategy.hpp" class Fiber; @@ -35,9 +38,9 @@ void WsScheduler::schedule(Fiber& fiber) { ABORT("Could not push fiber " << &fiber << " into queue"); } -#ifdef EMPER_STATS - wsStrategy.scheduledFibers.fetch_add(1, std::memory_order_relaxed); -#endif + if constexpr (emper::STATS) { + wsStrategy.scheduledFibers.fetch_add(1, std::memory_order_relaxed); + } #ifdef EMPER_WORKER_SLEEP notifyRuntimeAboutNewWork(); @@ -49,9 +52,9 @@ auto WsScheduler::nextFiber() -> Fiber* { bool poped = queue.popBottom(&fiber); if (likely(poped)) { -#ifdef EMPER_STATS - wsStrategy.nextFiberFromLocal.fetch_add(1, std::memory_order_relaxed); -#endif + if constexpr (emper::STATS) { + wsStrategy.nextFiberFromLocal.fetch_add(1, std::memory_order_relaxed); + } return fiber; } @@ -66,9 +69,10 @@ auto WsScheduler::nextFiber() -> Fiber* { poped = queues[victim]->popTop(&fiber); if (poped) { -#ifdef EMPER_STATS - wsStrategy.nextFiberStolen.fetch_add(1, std::memory_order_relaxed); -#endif + if constexpr (emper::STATS) { + wsStrategy.nextFiberStolen.fetch_add(1, std::memory_order_relaxed); + } + return fiber; } }