深入浅出(十一)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,
[](const tbb::blocked_range
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
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
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
// 串行
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
// 并行
start = std::chrono::high_resolution_clock::now();
sum = tbb::parallel_reduce(
tbb::blocked_range
0LL,
[&](const tbb::blocked_range
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
return 0;
}
✔️ 实际可见大规模数据上的并行加速效果。