TBB并行计算

最近在看并行计算的书,虽然找工作结束了,花钱买的书不能浪费了不看,还是稍微学习一下。书里介绍了并行计算的很多平台,比如OpenMP,TBB…,目前看到了并行计算的各种模式,还尚未阅读到具体的应用部分,在网上摘录了一些代码,自己稍微修改了下,做个记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <tbb/tbb.h>
#include <tbb/blocked_range.h>
#include <iostream>
using namespace std;
using namespace tbb;

typedef vector<int>::iterator IntVecIt;

// 创建body_reduce结构体,operator函数表示在parallel_reduce 中输入blocked_range调用的函数

struct body_reduce
{
int value;
void operator()(const blocked_range<IntVecIt>&r)
{
for (auto i = r.begin(); i != r.end(); i++)
value += *i;
}
body_reduce(): value(0) {}
body_reduce(body_reduce& b, split s):value(b.value) {}

void join(body_reduce& rhs) {
value += rhs.value;
}
};

// 创建body_parallel_for结构体,operator函数表示在调用parallel_for时,对blocked_range的每个元素并行执行的操作
struct body_parallel_for
{
void operator()(const blocked_range<IntVecIt>&r)const
{
for (auto i = r.begin(); i != r.end(); i++)
cout << *i << " ";
}
};

// 创建body_parallel_scan 模板类,对blocked_range进行扫描归约

template<typename T>
class body_parallel_scan
{
T _sum;
T* const _y;
const T* const _x;
public:
body_parallel_scan(const T x[], T y[]) :_sum(0), _x(x), _y(y) {}
T get_sum() const
{
return _sum;
}

template<typename Tag>
void operator()(const blocked_range<int>& r, Tag)
{
T temp = _sum;
for (auto i = r.begin(); i< r.end(); i++)
{
temp += _x[i];
// 如果扫描到了当前range的最后一步,可以赋值对应索引的结果
if (Tag::is_final_scan())
_y[i] = temp;
}
_sum = temp;
}

body_parallel_scan(body_parallel_scan& b, split) :_x(b._x), _y(b._y), _sum(0) {}

void reverse_join(body_parallel_scan& a)
{
_sum += a._sum;
}
void assign(body_parallel_scan& b)
{
_sum = b._sum;
}

};


struct student {
size_t score;
size_t age;
};

// 创建compare结构体,其中operator函数表示student对象的比较大小,被parallel_sort调用
struct compare {
bool operator()(const student& st1, const student& st2)const
{
// 从小到大排序
if ((st1.score + st1.age) > (st2.score + st2.age))
return false;
else
return true;
}
};

int main()
{
// intel TBB 基本使用操作
// 初始化vector,数据为0~99
vector<int> vec;
for (int i = 0; i < 100; i++)
vec.push_back(i);

// 归约法1
body_reduce b1;
parallel_reduce(blocked_range<IntVecIt>(vec.begin(), vec.end()), b1);
cout << "归约法1结果="<< b1.value << endl;

// 归约法2
int result_body_reduce = parallel_reduce(blocked_range<IntVecIt>(vec.begin(), vec.end());
return 0;
}
Thank you for every coin~