Какие инструкции OpenMP нужно добавить в код для многопоточного матричного калькулятора определителей? - PullRequest
0 голосов
/ 24 апреля 2020

Вот проблема, которую мне нужно решить, чтобы заполнить матричный калькулятор определителя. Его алгоритм должен реализовывать некоторые многопоточные функции, в частности, вычислять результат для двух или более одновременно работающих потоков. Получив базовый 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 вообще опущены. Таким образом, я задаюсь вопросом, возможно ли исправить ошибки, которые приводят к такому разрыву между только многопоточными результатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...