我想将向量的所有元素相乘。然而,下面的代码片段
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>());
我想念什么?
您的
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;
}