且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在具有并行执行策略的<;numeric>;中使用std::Reduce()中的BinaryOp

更新时间:2022-03-10 19:19:12

来自cppreferencebinary_op如果binary_op不是关联的或非可交换的,则行为是不确定的。&q;这是您观察到的;您的行为不是可交换的。

您的二元操作假设第一个参数始终是累加器,第二个参数始终是元素值。通常情况并非如此。例如,最简单的并行缩减形式是将范围一分为二,分别缩减,然后使用相同的操作合并结果-在您的情况下,这将丢失一半的值的跟踪。
您真正需要的是std::transform_reduce。如
r = std::transform_reduce(
        std::execution::par, citBegin, citEnd, 0ull,
        std::plus<uint64_t>{}, f);