gpt4 book ai didi

openmp - OpenMP 中的高斯消除

转载 作者:行者123 更新时间:2023-12-04 18:29:03 28 4
gpt4 key购买 nike

OpenMP 中的高斯消除。我是 openmp 的新手,想知道我是否在正确的地方使用了我的编译指示和屏障。我的 x 值每次都不同。他们应该是一样的吗??

#include <stdio.h>

int num;
double mm[6][7];

void gaussElimination();

int main() {
int i, j;

int k, s;

FILE *f = fopen("matrix.in", "r");
fscanf(f, "%d", &num);
for (i=0; i<num; ++i)
for (j=0; j<num+1; ++j)
fscanf(f, "%f", &mm[i][j]);
fclose(f);


for (i=0; i < num; i++)
for(j=0; j <num; j++);

gaussElimination();

for(k=0; k < num; ++k) {
for(s = 0; s < num+1; ++s)
printf("%3.2f\t", mm[k][s]);
printf("\n");
}
return 0;
}
void gaussElimination() {
int i, j, k, max;
double R;
// #pragma omp parallel for private (i, j)
for( i=0; i < num; ++i) {
max = i;
for(j= i+1; j < num; ++j)
if(mm[j][i] > mm[max][i])
max =j;

for(j=0; j < num+1; ++j) {
R = mm[max][j];
mm[max][j] = mm[i][j];
mm[i][j] = R;
}

#pragma omp parallel for private ( i, j)
for(j=num; j>= i; --j)
for(k=i+1; k <num; ++k)
mm[k][j] -= mm[k][i]/mm[i][i] * mm[i][j];
}
#pragma omp barrier

for(i = num-1; i >=0; --i) {
mm[i][num] = mm[i][num] / mm[i][i];
mm[i][i] = 1;
#pragma omp barrier
for(j= i - 1; j >= 0; --j) {
mm[j][num] -= mm[j][i] * mm[i][num];
mm[j][i] = 0;
}

#pragma omp barrier

}
}

最佳答案

使用当前代码,您已将 OpenMP pragam 放置在 j 和 k 循环上。但是,您有一个 private(i,j),它使变量 i 和 j 成为私有(private)的(没有初始值)。这应该是私有(private)的(j,k),因为 j 和 k 循环变量需要是私有(private)的并且 i 需要共享(因为它是 j 循环的循环边界)。 OpenMP 屏障没有做任何事情。

关于openmp - OpenMP 中的高斯消除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5828822/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com