Вот проблема, которую мне нужно решить, чтобы заполнить матричный калькулятор определителя. Его алгоритм должен реализовывать некоторые многопоточные функции, в частности, вычислять результат для двух или более одновременно работающих потоков. Получив базовый c опыт работы с теорией, я выбрал OpenMP для продолжения кодирования, поэтому просто взгляните на определение функции, для которой я ищу любое решение:
void calcDeterm(std::vector<std::vector<double>> &input) {
int i, j, k;
double temp;
long double determSeq = 1; // single thread matrix det
long double determPar = 1; // multithread matrix det
omp_set_dynamic(0);
omp_set_num_threads(2);
#pragma omp parallel for private(j,k,temp) shared(i)
for (i = 0; i < inputPar.size(); i++) {
for (j = i + 1; j < inputPar.size(); j++) {
if (inputPar[i][i] == 0) {
if (inputPar[i][j] == 0)
temp = 0;
} else
temp = inputPar[j][i] / inputPar[i][i];
for (k = i; k < inputPar.size(); k++)
inputPar[j][k] = inputPar[j][k] - inputPar[i][k] * temp;
}
std::cout << omp_get_num_threads() << std::endl;
}
#pragma omp parallel for reduction(*:determPar)
for (i = 0; i < inputPar.size(); i++)
determPar *= inputPar[i][i];
...
}
Этот код работает с двумя параллельными потоками, и оба существуют, когда вся программа проходит проверку. Единственная проблема возникает, как только я вижу результаты, предоставляемые одно- и многопоточными алгоритмами - сравнивая их, я обнаруживаю здесь существенные различия во всех сериях тестов. На самом деле, функция, код которой размещен выше, дает совершенно неверный результат, поскольку ее невозможно проверить онлайн-калькулятором со встроенным определителем. И наоборот, та же самая функция работает упорядоченно, если инструкции #pragma вообще опущены. Таким образом, я задаюсь вопросом, возможно ли исправить ошибки, которые приводят к такому разрыву между только многопоточными результатами.