C++ Library Extensions 2022.12.09
To help learn modern C++ programming
052-fibonacci.cpp
Go to the documentation of this file.
1#include <iostream>
2#include <tbb/tbb.h>
3
4template<typename Type>
5Type fibonacci_loop(Type n)
6{
7 if(n < 2) // n = 0 or 1
8 return n;
9 else
10 {
11 Type fn_2 = 0, fn_1 = 1, fn;
12
13 for(Type i = 2; i <= n; ++i)
14 {
15 fn = fn_2 + fn_1;
16
17 fn_2 = fn_1; fn_1 = fn;
18 }
19
20 return fn;
21 }
22}
23
24template<typename Type>
26{
27 if( n < 2)
28 return n;
29 else
31}
32
33template<typename Type, auto go_serial = Type{16} >
34class fibonacci: public tbb::task
35{
36 private:
37 Type m_n;
38 Type* const m_fn_ptr;
39
40 using base = tbb::task;
41
42 public:
43 fibonacci(Type n, Type* const fn_ptr): m_n{n}, m_fn_ptr{fn_ptr} { }
44
45 base* execute() override
46 {
47 if( m_n < go_serial)
48 {
49 *m_fn_ptr = fibonacci_loop(m_n);
50 }
51 else
52 {
53 Type fn_2, fn_1;
54
55 auto& task_n_2 = *new(base::allocate_child()) fibonacci{m_n-2, &fn_2};
56 auto& task_n_1 = *new(base::allocate_child()) fibonacci{m_n-1, &fn_1};
57
58 base::set_ref_count(3);
59
60 base::spawn(task_n_1);
61 base::spawn_and_wait_for_all(task_n_2);
62
63 *m_fn_ptr = fn_2 + fn_1;
64 }
65
66 return nullptr;
67 }
68};
69
70template<typename Type>
72{
73 Type fn;
74
75 auto& task = *new(tbb::task::allocate_root()) fibonacci{n, &fn};
76
77 tbb::task::spawn_root_and_wait(task);
78
79 return fn;
80}
81
82int main()
83{
84 for(int i=0; i <= 10; ++i)
85 {
87 }
88}
auto & cout
Type fibonacci_recursion(Type n)
Type fibonacci_loop(Type n)
Type parallel_fibonacci(Type n)
int main()
auto & endl
fibonacci(Type n, Type *const fn_ptr)
base * execute() override