Я хочу умножить все элементы вектора. Однако следующий фрагмент кода
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;
}
Вы меняете только тип с
long doubleнаsize_t. Как это приводит к «неправильной обработке этапа сокращения»?