main.cpp 2.57 KB
Newer Older
1 2
#include <iostream>
#include <chrono>
3

4 5 6
#include "pls/internal/scheduling/scheduler.h"
#include "pls/internal/scheduling/parallel_result.h"
#include "pls/internal/scheduling/scheduler_memory.h"
7
#include "pls/internal/base/thread.h"
8

9 10
using namespace pls::internal;

11
constexpr size_t NUM_THREADS = 2;
12 13 14 15 16

constexpr size_t NUM_TASKS = 64;
constexpr size_t MAX_TASK_STACK_SIZE = 0;

constexpr size_t NUM_CONTS = 64;
17
constexpr size_t MAX_CONT_SIZE = 256;
18

19
std::atomic<int> count{0};
20
scheduling::parallel_result<int> fib(int n) {
21
  base::this_thread::sleep(100);
22
//  std::cout << "Fib(" << n << "): " << count++ << ", " << scheduling::thread_state::get().get_id() << std::endl;
23 24 25 26 27 28 29 30 31 32 33
  if (n == 0) {
    return 0;
  }
  if (n == 1) {
    return 1;
  }

  return scheduling::scheduler::par([=]() {
    return fib(n - 1);
  }, [=]() {
    return fib(n - 2);
34 35
  }).then([=](int a, int b) {
    scheduling::parallel_result<int> result{a + b};
36
    base::this_thread::sleep(100);
37
//    std::cout << "Done Fib(" << n << "): " << (a + b) << ", " << scheduling::thread_state::get().get_id() << std::endl;
38
    return result;
39 40 41 42
  });
}

int fib_normal(int n) {
43
//  std::cout << "Fib(" << n << "): " << count++ << std::endl;
44 45 46 47 48 49 50
  if (n == 0) {
    return 0;
  }
  if (n == 1) {
    return 1;
  }

51
  int result = fib_normal(n - 1) + fib_normal(n - 2);
52
//  std::cout << "Done Fib(" << n << "): " << result << std::endl;
53
  return result;
54
}
55

56
int main() {
57 58 59 60 61
  scheduling::static_scheduler_memory<NUM_THREADS,
                                      NUM_TASKS,
                                      MAX_TASK_STACK_SIZE,
                                      NUM_CONTS,
                                      MAX_CONT_SIZE> static_scheduler_memory;
62

63
  scheduling::scheduler scheduler{static_scheduler_memory, NUM_THREADS};
64

65
  auto start = std::chrono::steady_clock::now();
66
//  std::cout << "fib = " << fib_normal(10) << std::endl;
67
  auto end = std::chrono::steady_clock::now();
68
  std::cout << "Normal:     " << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count()
69
            << std::endl;
70

71 72 73
  start = std::chrono::steady_clock::now();

  scheduler.perform_work([]() {
74 75 76 77 78 79 80 81
//    return scheduling::scheduler::par([]() {
//      return scheduling::parallel_result<int>(0);
//    }, []() {
//      return fib(16);
//    }).then([](int, int b) {
//      std::cout << "fib = " << (b) << std::endl;
//      return scheduling::parallel_result<int>{0};
//    });
82
    return fib(10);
83
  });
84

85
  end = std::chrono::steady_clock::now();
86
  std::cout << "Framework: " << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() << std::endl;
87

88
  return 0;
89
}