为什么 std::reduce 需要交换性?

Арт*_*вый 6 c++ c++17

https://en.cppreference.com/w/cpp/algorithm/reduce

它说如果操作不是可交换的,则操作的行为未定义,但为什么呢?我们只是将数组分成块,然后合并结果。是否只需要具有关联性?

int*_*jay 7

std::reduce需要结合性和交换性。并行算法显然需要关联性,因为您希望对单独的块执行计算,然后将它们组合起来。

至于可交换性:根据MSVC STL 开发人员 Billy O'Neal的 Reddit 帖子,这是允许向量化到 SIMD 指令所必需的:

交换性对于启用向量化也是必要的,因为您想要 reduce 的代码如下所示:

vecRegister = load_contiguous(first);
while (a vector register sized chunk is left) {
    first += packSize;
    vecRegister = add_packed(load_contiguous(first), vecRegister);
}
// combine vecRegister's packed components
Run Code Online (Sandbox Code Playgroud)

等等,其中给出了整数和 SSE 寄存器和 a * b * c * d * e * f * g * h 给出了类似 (a * e) * (b * f) * (c * g) * (d * h )。

大多数其他语言并没有做明确的事情来使矢量化它们的减少成为可能。如果有人想出一个引人注目的用例,没有什么说我们不能在未来添加 noncommutative_reduce 或类似的东西。