并行提案 N3554 中的 [包含/排除]_scan算法<algorithm>

Algorithm for [inclusive/exclusive]_scan in parallel <algorithm> proposal N3554

本文关键字:算法 scan lt gt algorithm 排除 N3554 中的 包含 并行      更新时间:2023-10-16

针对C++14的建议N3554(并行算法库)提出了当前std::partial_sum的并行版本,例如:

template<
    class ExecutionPolicy,
    class InputIterator,
    class OutputIterator,
    class BinaryOperation>
OutputIterator inclusive_scan(
    ExecutionPolicy &&exec,
    InputIterator first,
    InputIterator last,
    OutputIterator result,
    BinaryOperation binary_op);

带解释

效果:对于[result,result+(last-first)]中的每个迭代器i,执行*i=prefix_sum,其中prefix_sum是相应和init+*iter_0+*iter_1+*iter_2的结果+…或binary_op对于范围[first,first+(i-result)-1)中的每个迭代器iter_j…和的操作数顺序未指定。


如何将此操作并行?似乎,几乎根据定义,每个输出prefixsum都必须为下一个要计算的输出进行计算——本质上导致串行操作。


编辑非常感谢Aasmund Eldhuset的回答。就我个人而言,我发现"前缀和Guy E.Blelloch的"及其应用"是非常有用的。

Parallel prefix sum是一种经典的分布式编程算法,它优雅地使用了减少后的分布(如本文所示)。关键的观察结果是,在知道前导项之前,可以计算部分和的部分