C++23 tbb:parallel_reduce 与 std::乘以减少

问题描述 投票:0回答:1

我想将向量的所有元素相乘。然而,下面的代码片段

long doulbe sum = parallel_reduce(
        blocked_range<long double>(0, sum1.size()), 1.0L /* Identity for Multiplication */,
        [&](tbb::blocked_range<long double> r, long double running_total)
        {
            for (size_t i = r.begin(); i < r.end(); i++)
                running_total *= sum1[i];
            return running_total;
        },
        std::multiplies<long double>());

产生错误的结果。

accumulate
给出正确的结果:

long double sum2 = accumulate(sum1.begin(), sum1.end(), 1.0L, std::multiplies<long double>());

我想念什么?

c++ mapreduce tbb c++23
1个回答
0
投票

您的

parallel_reduce
代码的问题是它没有正确处理缩减步骤。
parallel_reduce
算法要求您指定如何组合来自不同线程的部分结果。在您的情况下,您需要确保部分乘积正确相乘。

#include <tbb/tbb.h>
#include <vector>
#include <numeric>

long double parallel_product(const std::vector<long double>& sum1) {
    return tbb::parallel_reduce(
        tbb::blocked_range<size_t>(0, sum1.size()), 1.0L /* Identity for Multiplication */,
        [&](const tbb::blocked_range<size_t>& r, long double running_total) {
            for (size_t i = r.begin(); i < r.end(); i++) {
                running_total *= sum1[i];
            }
            return running_total;
        },
        std::multiplies<long double>());
}

int main() {
    std::vector<long double> sum1 = {1.0L, 2.0L, 3.0L, 4.0L};

    long double sum2 = std::accumulate(sum1.begin(), sum1.end(), 1.0L, std::multiplies<long double>());
    long double sum_parallel = parallel_product(sum1);

    std::cout << "Accumulate result: " << sum2 << std::endl;
    std::cout << "Parallel reduce result: " << sum_parallel << std::endl;

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.