diff --git a/eval.py b/eval.py index 863bb0ab0eea8a337a3a4cca93d9bdae2f92b7ae..642a8071242096ef4e3278d3b02c962662d00cdb 100755 --- a/eval.py +++ b/eval.py @@ -75,6 +75,7 @@ CLIENT_CHECKOUT = EMPER_DEFAULT_CHECKOUT EMPER_FIRST_CHECKOUT = 'muhq/io-first' EMPER_LINKED_FUTURE_CHECKOUT = 'muhq/linked_future_echoserver' +EMPER_REAP_COMPLETIONS_PROVIDE_MEMORY_HEAP = 'muhq/reapCompletions_provide_memory_heap' EMPER_WAKEUP_CONDVAR_CHECKOUT = 'cfba846c7763faf63877329b227c2b23af4fc568' @@ -82,23 +83,35 @@ EMPER_BEFORE_COUNTING_TRY_LOCK_CHECKOUT = '5edc8e5eea4134badfa0bf1ee35bf8b671037 EMPER_BEFORE_BATCH_CQE_CHECKOUT = 'c8828c263618865866f20870c8488d8de11c776a' EMPER_BEFORE_CHANGES_TO_WORKER_SLEEP_ALGO = 'cfba846c7763faf63877329b227c2b23af4fc568' +EMPER_BATCH_DEQUEUE_ANYWHERE = '6d63965bccb9c9612b85bbb46c31a1eacd3c6693' + EMPER_CQ_LOCK_CHECKOUT = 'muhq/cq_lock' +EMPER_BUF_SEL_CHECKOUT = 'muhq/buffer-selection' + +EMPER_SQPOLL_CHECKOUT = 'muhq/sqpoll' + EMPER_FLAVORS = { - 'release': {}, - 'clang': { - 'build_env': { - 'CC': 'clang', - 'CXX': 'clang++' - } + 'vanilla': {}, + #'buf-sel': { + # 'checkout': EMPER_BUF_SEL_CHECKOUT, + #}, + 'pipe': { + 'meson_options': '-Dworker_sleep_strategy=pipe' + }, + 'pipe-no-completer': { + 'meson_options': '-Dworker_sleep_strategy=pipe -Dio_completer_behavior=none' }, 'no-stats': { 'meson_options': '-Dstats=False' }, + 'heap-alloc-continuation-buf': { + 'checkout': EMPER_REAP_COMPLETIONS_PROVIDE_MEMORY_HEAP + }, 'before-batch-cqe': { 'checkout': EMPER_BEFORE_BATCH_CQE_CHECKOUT, 'meson_options': '-Dlog_level=OFF', - 'patches': ['fix_free_vs_delete.patch'], + 'patches': ['fix_free_vs_delete.patch', 'before-batch-cqe.patch'], }, 'notify-all': { 'meson_options': '-Dworker_wakeup_strategy=all' @@ -106,18 +119,27 @@ EMPER_FLAVORS = { 'no-sleep': { 'meson_options': '-Dworker_sleep=false' }, - #'sqpoll': {'meson_options': '-Dio_uring_sqpoll=true'}, + 'sqpoll': { + 'meson_options': '-Dio_uring_sq_poller=one', + 'checkout': EMPER_SQPOLL_CHECKOUT, + 'patches': ['getcpu.patch'] + }, + 'sqpoll-numa': { + 'meson_options': '-Dio_uring_sq_poller=numa', + 'checkout': EMPER_SQPOLL_CHECKOUT, + 'patches': ['getcpu.patch'] + }, 'callback': { 'patches': ['use_callback_echoserver.patch'] }, 'wakeup-condvar': { 'checkout': EMPER_WAKEUP_CONDVAR_CHECKOUT, - 'patches': ['fix_free_vs_delete.patch'], + 'patches': ['fix_free_vs_delete.patch', 'wakeup-condvar.patch'], }, 'wakeup-all-condvar': { 'checkout': EMPER_WAKEUP_CONDVAR_CHECKOUT, 'meson_options': '-Dworker_wakeup_strategy=all', - 'patches': ['fix_free_vs_delete.patch'], + 'patches': ['fix_free_vs_delete.patch', 'wakeup-condvar.patch'], }, 'wakeup-futex': { 'meson_options': '-Dwakeup_semaphore_implementation=futex' @@ -145,7 +167,7 @@ EMPER_FLAVORS = { 'big-reap-cqe-section': { 'checkout': EMPER_BEFORE_COUNTING_TRY_LOCK_CHECKOUT, 'meson_options': '-Dlog_level=OFF', - 'patches': ['fix_free_vs_delete.patch'], + 'patches': ['fix_free_vs_delete.patch', 'before-batch-cqe.patch'], }, 'completer-wakeup': { 'meson_options': '-Dio_completer_behavior=maybe_wakeup' @@ -159,9 +181,21 @@ EMPER_FLAVORS = { '-Dworker_sleep=false -Dio_completer_behavior=maybe_wakeup', 'server_cmd_suffix': '100' }, + 'no-sleep-computation-1ms': { + 'meson_options': + '-Dworker_sleep=false', 'server_cmd_suffix': ' 1000' + }, + 'no-sleep-no-completer-computation-1ms': { + 'meson_options': + '-Dworker_sleep=false -Dio_completer_behavior=maybe_wakeup', + 'server_cmd_suffix': ' 1000' + }, 'computation-100us': { 'server_cmd_suffix': '100' }, + 'computation-200us': { + 'server_cmd_suffix': ' 200' + }, 'completer-wakeup-computation-100us': { 'meson_options': '-Dio_completer_behavior=maybe_wakeup', 'server_cmd_suffix': '100' @@ -179,7 +213,7 @@ EMPER_FLAVORS = { }, 'first': { 'checkout': EMPER_FIRST_CHECKOUT, - 'patches': ['fix_free_vs_delete.patch'], + 'patches': ['fix_free_vs_delete.patch', 'wakeup-condvar.patch'], }, '4': { 'server_cmd_prefix': f'env {emper_create_env_worker_count(4)}' @@ -187,6 +221,10 @@ EMPER_FLAVORS = { '20': { 'server_cmd_prefix': EMPER_20_WORKER_ENV_CMD }, + '20-nopin': { + 'server_cmd_prefix': + EMPER_20_WORKER_ENV_CMD + ' EMPER_PIN_WORKERS=false', + }, '20-computation-100us': { 'server_cmd_prefix': EMPER_20_WORKER_ENV_CMD, 'server_cmd_suffix': '100' @@ -200,25 +238,91 @@ EMPER_FLAVORS = { 'server_cmd_prefix': EMPER_20_WORKER_ENV_CMD, 'server_cmd_suffix': '200' }, - '20-nopin-computation-200us-nopin': { + '20-nopin-computation-200us': { 'server_cmd_prefix': EMPER_20_WORKER_ENV_CMD + ' EMPER_PIN_WORKERS=false', 'server_cmd_suffix': '200' }, 'linked-futures': { 'checkout': EMPER_LINKED_FUTURE_CHECKOUT, - 'patches': ['fix_free_vs_delete.patch'], + 'patches': ['fix_free_vs_delete.patch', 'wakeup-condvar.patch'], }, 'linked-futures-notify-all': { 'checkout': EMPER_LINKED_FUTURE_CHECKOUT, - 'patches': ['fix_free_vs_delete.patch'], + 'patches': ['fix_free_vs_delete.patch', 'wakeup-condvar.patch'], 'meson_options': '-Dworker_wakeup_strategy=all' }, 'before-new-worker-sleep-algo': { 'checkout': EMPER_BEFORE_CHANGES_TO_WORKER_SLEEP_ALGO, - 'patches': ['fix_free_vs_delete.patch'], + 'patches': ['fix_free_vs_delete.patch', 'before-batch-cqe.patch'], 'meson_options': '-Dlog_level=OFF', }, + 'bdqfa': { + 'checkout': EMPER_BATCH_DEQUEUE_ANYWHERE, + }, + 'bdqfa-200us': { + 'checkout': EMPER_BATCH_DEQUEUE_ANYWHERE, + 'server_cmd_suffix': '200' + }, + 'bdqfa-20-nopin': { + 'checkout': EMPER_BATCH_DEQUEUE_ANYWHERE, + 'server_cmd_prefix': + EMPER_20_WORKER_ENV_CMD + ' EMPER_PIN_WORKERS=false', + }, + 'bdqfa-20-nopin-200us': { + 'checkout': EMPER_BATCH_DEQUEUE_ANYWHERE, + 'server_cmd_prefix': + EMPER_20_WORKER_ENV_CMD + ' EMPER_PIN_WORKERS=false', + 'server_cmd_suffix': '200' + }, + 'laws': { + 'meson_options': ('-Ddefault_scheduling_strategy=locality_aware_work_stealing ' + '-Dset_affinity_on_block=true'), + }, + 'laws-200us': { + 'meson_options': ('-Ddefault_scheduling_strategy=locality_aware_work_stealing ' + '-Dset_affinity_on_block=true'), + 'server_cmd_suffix': '200' + }, + 'laws-20-nopin': { + 'server_cmd_prefix': + EMPER_20_WORKER_ENV_CMD + ' EMPER_PIN_WORKERS=false', + 'meson_options': ('-Ddefault_scheduling_strategy=locality_aware_work_stealing ' + '-Dset_affinity_on_block=true'), + }, + 'laws-20-nopin-200us': { + 'server_cmd_prefix': + EMPER_20_WORKER_ENV_CMD + ' EMPER_PIN_WORKERS=false', + 'meson_options': ('-Ddefault_scheduling_strategy=locality_aware_work_stealing ' + '-Dset_affinity_on_block=true'), + 'server_cmd_suffix': '200' + }, + 'laws-bdqfa': { + 'checkout': EMPER_BATCH_DEQUEUE_ANYWHERE, + 'meson_options': ('-Ddefault_scheduling_strategy=locality_aware_work_stealing ' + '-Dset_affinity_on_block=true'), + }, + 'laws-bdqfa-200us': { + 'checkout': EMPER_BATCH_DEQUEUE_ANYWHERE, + 'meson_options': ('-Ddefault_scheduling_strategy=locality_aware_work_stealing ' + '-Dset_affinity_on_block=true'), + 'server_cmd_suffix': '200' + }, + 'laws-bdqfa-20-nopin': { + 'checkout': EMPER_BATCH_DEQUEUE_ANYWHERE, + 'server_cmd_prefix': + EMPER_20_WORKER_ENV_CMD + ' EMPER_PIN_WORKERS=false', + 'meson_options': ('-Ddefault_scheduling_strategy=locality_aware_work_stealing ' + '-Dset_affinity_on_block=true'), + }, + 'laws-bdqfa-20-nopin-200us': { + 'checkout': EMPER_BATCH_DEQUEUE_ANYWHERE, + 'server_cmd_prefix': + EMPER_20_WORKER_ENV_CMD + ' EMPER_PIN_WORKERS=false', + 'meson_options': ('-Ddefault_scheduling_strategy=locality_aware_work_stealing ' + '-Dset_affinity_on_block=true'), + 'server_cmd_suffix': '200' + }, } CONS = [500, 1000, 5000, 10000, 15000, 20000, 25000] diff --git a/patches/before-batch-cqe.patch b/patches/before-batch-cqe.patch new file mode 100644 index 0000000000000000000000000000000000000000..cace59428e49f32fd4dbf20ca8efe2eed4f08812 --- /dev/null +++ b/patches/before-batch-cqe.patch @@ -0,0 +1,30 @@ +diff --git a/emper/strategies/ws/WsScheduler.hpp b/emper/strategies/ws/WsScheduler.hpp +index 63a634d..911512d 100644 +--- a/emper/strategies/ws/WsScheduler.hpp ++++ b/emper/strategies/ws/WsScheduler.hpp +@@ -13,11 +13,7 @@ class WsStrategy; + class WsScheduler : public AbstractWorkStealingScheduler { + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wattributes" +- WsStrategy& wsStrategy +-#ifndef EMPER_STATS +- ATTR_UNUSED +-#endif +- ; ++ WsStrategy& wsStrategy ATTR_UNUSED ; + #pragma GCC diagnostic pop + + protected: +diff --git a/tests/SimpleActorTest.cpp b/tests/SimpleActorTest.cpp +index 76b4cfe..94059a2 100644 +--- a/tests/SimpleActorTest.cpp ++++ b/tests/SimpleActorTest.cpp +@@ -49,7 +49,7 @@ static void mainFiber(void* runtime_ptr) { + CPS cps; + for (unsigned int fiberNum = 0; fiberNum < FIBER_COUNT; ++fiberNum) { + spawn( +- [&sumActor, fiberNum] { ++ [&sumActor] { + WDBG(Dispatcher::getCurrentFiber() + << " (" << fiberNum << ") starts to count to " << FIBERS_COUNT_TO); + for (uint64_t i = 1; i <= FIBERS_COUNT_TO; ++i) { diff --git a/patches/getcpu.patch b/patches/getcpu.patch new file mode 100644 index 0000000000000000000000000000000000000000..8f6c274e0758047d8e669ccf1d3d75e366894f9e --- /dev/null +++ b/patches/getcpu.patch @@ -0,0 +1,21 @@ +diff --git a/emper/io/IoContext.cpp b/emper/io/IoContext.cpp +index 3e0ef11..16a70eb 100644 +--- a/emper/io/IoContext.cpp ++++ b/emper/io/IoContext.cpp +@@ -6,6 +6,7 @@ + #include <liburing/io_uring.h> // for io_uring_cqe, io_uring_params, IORI... + #include <numa.h> + #include <sched.h> ++#include <syscall.h> + #include <sys/eventfd.h> // for eventfd + #include <unistd.h> // for close + +@@ -365,7 +366,7 @@ IoContext::IoContext(Runtime &runtime, size_t uring_entries) : runtime(runtime) + } else if constexpr (emper::IO_SQ_POLLER == IoSqPoller::numa) { + // get our numa node + unsigned cpu, node; +- int err = getcpu(&cpu, &node); ++ int err = syscall(__NR_getcpu, &cpu, &node); + if (unlikely(err)) { + DIE_MSG_ERRNO("getcpu failed"); + } diff --git a/patches/wakeup-condvar.patch b/patches/wakeup-condvar.patch new file mode 100644 index 0000000000000000000000000000000000000000..99dae2fd47d7594e0131ec88d8aa484fd0cf56b4 --- /dev/null +++ b/patches/wakeup-condvar.patch @@ -0,0 +1,17 @@ +diff --git a/emper/strategies/ws/WsScheduler.hpp b/emper/strategies/ws/WsScheduler.hpp +index 63a634d..911512d 100644 +--- a/emper/strategies/ws/WsScheduler.hpp ++++ b/emper/strategies/ws/WsScheduler.hpp +@@ -13,11 +13,7 @@ class WsStrategy; + class WsScheduler : public AbstractWorkStealingScheduler { + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wattributes" +- WsStrategy& wsStrategy +-#ifndef EMPER_STATS +- ATTR_UNUSED +-#endif +- ; ++ WsStrategy& wsStrategy ATTR_UNUSED ; + #pragma GCC diagnostic pop + + protected: