提问人:Anton Rydahl 提问时间:9/6/2023 最后编辑:genpfaultAnton Rydahl 更新时间:9/9/2023 访问量:3510
为什么 C++ 标准中没有平行的“std::accumulate”?
Why is there no parallel `std::accumulate` in the C++ standard?
问:
我认为 C++ 标准中没有 std::accumulate
的并行版本令人困惑。在我看来,并行实现它是微不足道的,例如,基于 OpenMP 或 SIMD 指令。有没有人很好地解释为什么标准委员会选择引入并行版本而不是?是因为迭代器类型不同吗?std::reduce
std::accumulate
答:
66赞
Nicol Bolas
9/6/2023
#1
他们引入了,因为不能像它所写的那样并行化。reduce
accumulate
C++ 标准定义了各种函数的预期行为。 定义如下:accumulate
通过使用初始值初始化累加器来计算其结果,然后使用 或 为 迭代器按顺序排列。
acc
init
acc = std::move(acc) + *i
acc = binary_op(std::move(acc), *i)
i
[first, last)
强调是后加的。这两个词使算法变得不可比拟。而且由于这些词是标准的一部分,因此允许用户依赖“按顺序”保证。它们可以进行或非关联操作,这些操作依赖于操作的顺序。因此,委员会不能在不破坏一堆代码的情况下删除这些单词。accumulate
operator+
binary_op
而且他们不希望有一个与非并行版本行为根本不同的并行版本。因此,在没有“按顺序”保证的情况下引入(以及有助于使其可并行化的其他语言)。accumulate
reduce
评论
7赞
10762409
9/7/2023
值得注意的是,即使它是非交换的,只要是关联的,就可以编写 std::accumulate 的并行版本,例如,如果正在做矩阵乘法。binary_op
binary_op
binary_op
4赞
Peter Cordes
9/7/2023
不可并行化,除非在假设规则的限制范围内。例如,编译器仍然可以对 的数组进行自动矢量化,因为它是真正关联的,这与 FP 加法不同。如果 GCC 预计它会盈利,它甚至可以并行化它(gcc.gnu.org/wiki/AutoParInGCC)。因此,它的真正好处是将 FP 数组或 FP 点积相加。并且要使线程级并行性明确用于实际的编译器/优化器,而不是像 SIMD 并行性那样必须发明的东西。std::accumulate
uint32_t
-ftree-parallelize-loops=4
std::reduce
评论
std::reduce
std::accumulate()
std::accumulate