文章

Intel TBB 并行计算

0. TBB简介

Intel TBB 主要功能模块:

  • 并行算法
  • 任务调度
  • 并行容器
  • 同步原语
  • 内存分配器

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 进行授权