概述
oneAPI Threading Building Blocks(oneTBB)是一个支持使用标准ISO C++代码进行可扩展并行编程的库。
安装与配置
从源代码编译安装oneTBB
首先,要确保系统中已经正确安装了CMake,然后我们就可以从源码构建oneTBB了
git clone https://github.com/uxlfoundation/oneTBB.git
cd oneTBB
# Create binary directory for out-of-source build
mkdir build && cd build
# configure
cmake ..
# Build
cmake --build . --config Release
# Install
cmake --install . --prefix install
使用示例
算法
parallel_for
oneapi::tbb::parallel_for(range, body, partitioner);
- range:迭代范围(如 tbb::blocked_range<size_t>(0, N))
- body:循环体(Lambda 或仿函数对象)
- partitioner(可选):任务划分策略(如 auto_partitioner)
parallel_for 用于将循环体中的迭代任务并行化。它能够自动将循环的迭代分配到多个线程中执行,从而充分利用多核处理器的计算能力,提高程序的性能。
以下是一个使用parallel_for并行计算每个元素的平方的示例代码:
#include <oneapi/tbb.h>
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> data(100); // 创建一个大小为100的vector
int value = 1; // 初始值
std::generate(data.begin(), data.end(), [&]() { return value++; });
for (auto num : data) {
std::cout << num << " ";
}
std::cout << std::endl;
oneapi::tbb::parallel_for(oneapi::tbb::blocked_range<size_t>(0, data.size()),
[&](const oneapi::tbb::blocked_range<size_t>& r) {
for (size_t i = r.begin(); i < r.end(); ++i) {
data[i] = data[i] * data[i];
}
}
);
for (auto num : data) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
parallel_pipeline
parallel_invoke
parallel_invoke 函数用于并发执行多个函数。传递给 parallel_invoke 的每个函数都可能与其它函数同时执行。
#include <oneapi/tbb.h>
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
oneapi::tbb::parallel_invoke(
[]() { std::cout << " Hello " << std::endl; },
[]() { std::cout << " TBB! " << std::endl; }
);
return 0;
}
parallel_reduce
parallel_reduce 用于并行化累加操作。它将一个范围分成多个子范围,并在每个子范围内独立计算部分结果,最后将这些部分结果合并。
以下是一个使用parallel_reduce计算从1到100的和的示例代码:
#include <oneapi/tbb.h>
#include <iostream>
int main() {
int sum = oneapi::tbb::parallel_reduce(
oneapi::tbb::blocked_range<int>(1, 101), 0,
[](oneapi::tbb::blocked_range<int> const& r, int init) -> int {
for (int v = r.begin(); v != r.end(); v++) {
init += v;
}
return init;
},
[](int lhs, int rhs) -> int {
return lhs + rhs;
}
);
std::cout << "Sum: " << sum << std::endl;
return 0;
}
- oneapi::tbb::blocked_range(1, 101)
定义了一个范围,从 1 到 100(包含 1,不包含 101)。blocked_range 是 TBB 中的一个类,用于表示一个可分割的范围。 - 初始值 0
- 累加函数
[](oneapi::tbb::blocked_range<int> const& r, int init) -> int {
for (int v = r.begin(); v != r.end(); v++) {
init += v;
}
return init;
}
- 合并函数
[](int lhs, int rhs) -> int {
return lhs + rhs;
}
- 运行结果
运行这段代码后,输出结果为:
Sum: 5050
社区与支持
TBB的开源社区非常活跃,开发者可以通过以下方式获取支持:
- GitHub仓库: https://github.com/oneapi-src/oneTBB
- 官方文档: https://www.intel.com/content/www/us/en/docs/onetbb/get-started-guide/2022-0/overview.html