#include "pls/pls.h" #include "benchmark_runner.h" constexpr int MAX_STACK_SIZE = 4096 * 1; int pls_fib(int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } int a, b; pls::spawn([n, &a]() { a = pls_fib(n - 1); }); pls::spawn_and_sync([n, &b]() { b = pls_fib(n - 2); }); return a + b; } int main(int argc, char **argv) { auto settings = benchmark_runner::parse_parameters(argc, argv); string test_name = to_string(settings.num_threads_) + ".csv"; string full_directory = settings.output_directory_ + "/PLS_v3/"; benchmark_runner runner{full_directory, test_name}; pls::scheduler scheduler{(unsigned) settings.num_threads_, settings.size_ + 2, MAX_STACK_SIZE}; volatile int res; if (settings.type_ == benchmark_runner::benchmark_settings::ISOLATED) { printf("Running isolated measurement...\n"); runner.enable_memory_stats(); runner.pre_allocate_stats(); runner.run_iterations(settings.iterations_, [&]() { scheduler.perform_work([&]() { res = pls_fib(settings.size_); }); }); runner.commit_results(true); } else { printf("Running periodic measurement...\n"); runner.enable_wall_time_stats(); runner.pre_allocate_stats(); runner.run_periodic(settings.iterations_, settings.interval_period_, settings.interval_deadline_, [&]() { scheduler.perform_work([&]() { res = pls_fib(settings.size_); }); }); runner.commit_results(true); } return 0; }