c++ - 将哪些 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 指令,则相同的功能可以正常工作。这样我想知道是否有可能修复导致单线程和多线程结果之间存在这种差距的错误。
解决方案
推荐阅读
- python - Python 3 字符串是 Unicode 字符串,而不是字节数组
- rust - 在创建该类型的线程局部变量的闭包中“使用来自外部函数的类型变量”
- ios - 使用 Swift 将身份验证凭据添加到 iOS 上的钥匙串
- css - textarea white-space nowrap 结合 readonly
- octave - Octave中的@符号是什么?
- linux - 使用现有的 docker 镜像创建新的 Docker 镜像
- node.js - 在 Microsoft Luis 中,如何为实体数组建模?
- python-3.x - Python中的欧拉方法实现给出了稳定的结果,但它应该是不稳定的
- vim - 如何在垂直拆分中打开标签?
- java - OnClickListener 只激活一次