首页 > 解决方案 > 将哪些 OpenMP 指令添加到多线程矩阵行列式计算器的代码中?

问题描述

这是我完成矩阵行列式计算器需要处理的一个问题。它的算法必须实现一些多线程特性,特别是通过2个或更多同时运行的线程计算结果。在获得了基本的理论经验后,我选择了 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 指令,则相同的功能可以正常工作。这样我想知道是否有可能修复导致单线程和多线程结果之间存在这种差距的错误。

标签: c++multithreadingopenmp

解决方案


推荐阅读