oneTBB的编译使用

概述

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值