Почему tbb::parallel_reduce выдает неверное значение
возникла проблема с tbb::parallel_reduce. Есть цикл для заполнения матрицы, в котором также нужно вычислить сумму всех коэффициентов матрицы. Проблема в том, что значения вычисленной суммы последовательной и параллельной реализаций не совпадают. В коде ниже проблем не вижу. Есть подозрение, что дело в настройках проекта, но не могу найти информацию по тому с чем именно это может быть связано.
#include <iostream>
#include <tbb/tbb.h>
#include <omp.h>
using namespace tbb;
int main()
{
const int RHRW = 9;
const double PI = atan(1.0) * 4;
double matr_coef[RHRW * 2 + 1][RHRW * 2 + 1];
double sum = 0.0;
for (int y = -RHRW; y <= RHRW; y++)
{
for (int x = -RHRW; x <= RHRW; x++)
{
matr_coef[y + RHRW][x + RHRW] = (1.0 / (2.0 * PI * RHRW * RHRW)) *
exp(-1.0 * (x * x + y * y) / (2.0 * RHRW * RHRW));
sum += matr_coef[y + RHRW][x + RHRW];
}
}
std::cout << sum << std::endl;
double sum2 = tbb::parallel_reduce(
tbb::blocked_range<int>(-RHRW, RHRW),
0.0,
[&](tbb::blocked_range<int> r, double running_total)
{
for (int y = r.begin(); y <= r.end(); y++)
{
for (int x = -RHRW; x <= RHRW; x++)
{
matr_coef[y + RHRW][x + RHRW] = (1.0 / (2.0 * PI * RHRW * RHRW)) *
exp(-1.0 * (x * x + y * y) / (2.0 * RHRW * RHRW));
running_total += matr_coef[y + RHRW][x + RHRW];
}
}
return running_total;
}, std::plus<double>());
std::cout << sum2 << std::endl;
}
Ответы (1 шт):
Автор решения: Sianez Sianez
→ Ссылка
Разобрался сам, оказалось, что parallel_reduce неправильно обрабатывал сравнение "<=", его заменил на "<" и в blocked_range расширил диапазон на единицу