深入浅出(十一)TBB库

📅 2025-08-18 13:20:52 ✍️ admin 👁️ 9059 ❤️ 570
深入浅出(十一)TBB库

TBB库

1. TBB库简介1.1 TBB库下载1.2 TBB库特性

2. TBB库部署2.1 TBB库直接下载2.2 TBB库编译

3. TBB C++示例3.1. parallel_for(并行循环)3.2. parallel_reduce(并行归约,求和)3.3. task_group(动态任务调度)3.4. flow::graph(异步数据流图)3.5. 并发容器:concurrent_vector(线程安全容器)3.6. 🎯简单性能对比:serial vs parallel

1. TBB库简介

TBB(oneTBB,原 Intel Threading Building Blocks), TBB 是一个由 Intel 开发的 现代 C++ 并行计算库,主要用于在多核 CPU 上开发高性能、多线程程序。

➤ 本质: ✔️ 任务并行库(Task-based parallelism) ✔️ 跨平台、跨编译器(MSVC/GCC/Clang) ✔️ 纯 C++ 实现(无特殊硬件或操作系统依赖) ✔️ 不属于 OpenMP、MPI 类的线程库,而是高层抽象(任务而非线程管理)

TBB能做什么?

场景TBB解决方式大数据遍历/循环并行tbb::parallel_for, tbb::parallel_reduce异步任务调度tbb::task_group, tbb::task_arena多线程流水线/流式处理tbb::flow::graph (flow graph API)内存池 / 并发容器tbb::concurrent_vector, tbb::concurrent_queue自动任务分配与负载均衡TBB 内部智能线程池(非手动 std::thread)

1.1 TBB库下载

源说明官网地址https://www.intel.com/content/www/us/en/developer/tools/oneapi/onetbb.htmlGitHub地址https://github.com/oneapi-src/oneTBB官方文档https://oneapi-src.github.io/oneTBB/TBB动态库https://download.csdn.net/download/qq_43572400/90982826

1.2 TBB库特性

TBB的特点(vs传统线程库)

特性说明对比 std::thread / OpenMP任务而非线程你描述“任务”,TBB管理线程池std::thread 需手动管理自动负载均衡根据 CPU 核数动态分配任务OpenMP 静态划分可组合性好多个 parallel_for 可嵌套/组合OpenMP 嵌套复杂,易死锁支持异步流式计算flow::graph 构建复杂异步流水线std::future难以扩展并发数据结构内置线程安全容器(map、queue等)std::mutex需手动实现

官方支持的平台

平台支持情况备注Windows✅ 支持MSVC、Clang、MinGW,支持 Win32/UWPLinux✅ 支持GCC、Clang,支持 x86、x86_64、ARM64macOS✅ 支持Clang,支持 Apple Silicon(M1/M2)FreeBSD⚠️ 部分支持官方未经常测试,但社区可用

限制

特性说明图形库(如 OpenGL/DirectX)不包含,TBB 仅处理任务并行(与 UI/图形解耦)非 POSIX/Win32 系统可能需要适配,如某些嵌入式系统UWP/沙盒平台需要 UWP 专用构建(但 UWP 仍支持部分功能)

2. TBB库部署

使用 Git 上的源码自行编译(推荐)优点

项目说明最新版本/修复/特性可立即获取官方最新 bug 修复或功能。全平台适配你可以自行指定 Windows/Linux/Mac 配置。可控性强可根据实际需求裁剪、调试。支持特定编译器/选项适配如 MSVC2022、Clang 最新版本。自定义CMake选项比如关闭测试、开启静态库、指定安装路径。

2.1 TBB库直接下载

下载对应平台的库文件 【oneapi-tbb-2022.1.0-win】示例 库包含了release和debug版本,如果只需要某一个版本可以手动删除。否则可参考CMake编译

2.2 TBB库编译

下载源码

配置安装目录

编译过程。选择release→ALL_BUILD→INSTALL

编译生成结果

3. TBB C++示例

3.1. parallel_for(并行循环)

#include

#include

int main() {

tbb::parallel_for(0, 10, [](int i){

std::cout << "Index: " << i << std::endl;

});

return 0;

}

💡 多线程自动划分 0~9 范围,输出顺序非保证。

3.2. parallel_reduce(并行归约,求和)

#include

#include

#include

int main() {

int sum = tbb::parallel_reduce(

tbb::blocked_range(0, 100),

0,

[](const tbb::blocked_range& r, int init) {

for (int i = r.begin(); i != r.end(); ++i)

init += i;

return init;

},

std::plus()

);

std::cout << "Sum: " << sum << std::endl; // 0+1+...+99 = 4950

return 0;

}

3.3. task_group(动态任务调度)

#include

#include

int main() {

tbb::task_group tg;

tg.run([]{ std::cout << "Task A\n"; }); // 启动Task A

tg.run([]{ std::cout << "Task B\n"; }); // 启动Task B

tg.wait(); // 等待全部完成

return 0;

}

✔️ 支持任务递归、嵌套,无需手动管理线程。

3.4. flow::graph(异步数据流图)

#include

#include

int main() {

tbb::flow::graph g;

tbb::flow::function_node node(g, tbb::flow::unlimited, [](int x){

std::cout << "Processing: " << x << std::endl;

});

node.try_put(42); // 传入数据流

node.try_put(100); // 另一个数据

g.wait_for_all(); // 等待流完成

return 0;

}

✔️ 实现异步生产-消费模型(例如图像/数据处理管线)。

3.5. 并发容器:concurrent_vector(线程安全容器)

#include

#include

#include

int main() {

tbb::concurrent_vector vec;

tbb::parallel_for(0, 10, [&](int i){

vec.push_back(i); // 线程安全

});

for (int v : vec) std::cout << v << " ";

std::cout << std::endl;

return 0;

}

✔️ 无需锁,多个线程可以安全写入。

3.6. 🎯简单性能对比:serial vs parallel

#include

#include

#include

#include

int main() {

const int N = 100000000;

std::vector data(N, 1);

// 串行

auto start = std::chrono::high_resolution_clock::now();

long long sum = 0;

for (int v : data) sum += v;

auto end = std::chrono::high_resolution_clock::now();

std::cout << "Serial sum: " << sum << ", Time: "

<< std::chrono::duration(end-start).count() << "s\n";

// 并行

start = std::chrono::high_resolution_clock::now();

sum = tbb::parallel_reduce(

tbb::blocked_range(0, data.size()),

0LL,

[&](const tbb::blocked_range& r, long long init) {

for(size_t i = r.begin(); i != r.end(); ++i) init += data[i];

return init;

},

std::plus()

);

end = std::chrono::high_resolution_clock::now();

std::cout << "Parallel sum: " << sum << ", Time: "

<< std::chrono::duration(end-start).count() << "s\n";

return 0;

}

✔️ 实际可见大规模数据上的并行加速效果。