Intel TBB 并行计算
0. TBB简介
Intel TBB 主要功能模块:
- 并行算法
- 任务调度
- 并行容器
- 同步原语
- 内存分配器
1. 编译及链接
参考之前文档Intel TBB malloc 使用 (windows)
(2024-08-13)。
2. 并行计算
头文件包含:
1
2
3
#include <oneapi/tbb/parallel_sort.h>
#include <tbb/parallel_for.h>
#include <tbb/tbb.h>
2.1 sort
1
2
3
4
5
std::vector<dataxy_info_t> data_xy_info;
//...
tbb::parallel_sort(data_xy_info.begin(), data_xy_info.end(),
[](const dataxy_info_t& a, const dataxy_info_t& b) { return (a.x_ < b.x_); });
对150万数据排序,时间对比:
1
2
[2024-08-28 12:44:37.924] [info] 02. Sorted 1503894 samples in 80.45 ms (TBB sort)
[2024-08-28 12:44:42.610] [info] 11. Sorted 1503894 samples in 206.20 ms (std sort)
2.2 parallel_for_each
1
2
// void parse_dataxy_info(dataxy_info_t& info);
tbb::parallel_for_each(data_xy_info.begin(), data_xy_info.end(), parse_dataxy_info);
2.3 基于分块的 parallel_for
NOTE: 如果需要使用到任务共享写变量,需要添加锁,或者使用原子变量。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
{
std::atomic_int overflow_acc{}, underflow_acc{};
auto statistic_abnormal_func = [&](const sample_data_t& sample) {
if (sample.mapped_pos_.y_ < 0) {
underflow_acc++;
} else if (sample.mapped_pos_.y_ > 255) {
overflow_acc++;
}
};
tbb::parallel_for(
tbb::blocked_range<size_t>(0, ds.ds_.size()),
[&](const tbb::blocked_range<size_t>& r) {
for (size_t i = r.begin(); i != r.end(); i++) {
statistic_abnormal_func(ds.ds_[i]);
}
},
tbb::auto_partitioner());
if (overflow_acc > 0 || underflow_acc > 0) {
//SPDLOG_WARN("samples overflow {}. underflow {} in dataset", overflow_acc.load(), underflow_acc.load());
samples_overflow_acc2 += overflow_acc.load();
samples_underflow_acc2 += underflow_acc.load();
}
}
3. 任务调度及线程池
TODO
4. 并行容器
concurrent_vector
等。
TODO
5. 资料
本文由作者按照 CC BY 4.0 进行授权