1. std::reduce
定义与头文件
std::reduce
是 C++ 17 引入的并行算法,定义在 <numeric>
头文件中,用于对指定范围内的元素进行归约操作(如求和、求积等)。
函数原型
template< class ExecutionPolicy, class ForwardIt >
typename std::iterator_traits<ForwardIt>::value_type
reduce( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last );
template< class ExecutionPolicy, class ForwardIt, class T >
T reduce( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, T init );
ExecutionPolicy
:执行策略类型,用于指定算法的执行方式(如串行、并行等)。ForwardIt
:前向迭代器类型,指定元素范围。T
:初始值的类型。policy
:执行策略对象。first
:指向范围起始位置的迭代器。last
:指向范围结束位置的迭代器。init
:可选的初始值。
功能
- 第一个重载形式没有初始值,它会对
[first, last)
范围内的元素进行归约操作。对于数值类型,默认的归约操作是求和。 - 第二个重载形式接受一个初始值
init
,归约操作会从init
开始,将范围内的元素依次与当前结果进行合并。
示例代码
#include <iostream>
#include <vector>
#include <numeric>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
int sum = std::reduce(vec.begin(), vec.end()); // 对vec中的元素进行求和操作
std::cout << "Sum: " << sum << std::endl;
return 0;
}
2. std::execution::par
定义与头文件
std::execution::par
是 C++ 17 引入的执行策略对象,定义在 <execution>
头文件中,用于指定算法以并行方式执行。
功能
std::execution::par
告诉支持执行策略的算法(如 std::reduce
)使用并行执行模式。在多核处理器系统中,算法会将任务分解为多个子任务,并在多个线程上同时执行,以提高计算效率。
示例代码
#include <iostream>
#include <vector>
#include <numeric>
#include <execution>
int main() {
std::vector<int> vec(1000000);
std::iota(vec.begin(), vec.end(), 1);
int sum = std::reduce(std::execution::par, vec.begin(), vec.end());
/*std::reduce 使用 std::execution::par 执行策略,会并行地对 vec 中的元素进行求和操作,
充分利用多核处理器的性能。需要注意的是,并行执行可能会带来一些额外的开销(如线程创建和同步),
因此对于小规模数据,并行执行可能并不比串行执行快。*/
std::cout << "Sum: " << sum << std::endl;
return 0;
}