OpenMP 中的高斯消元法

发布于 2024-11-04 04:57:21 字数 1783 浏览 1 评论 0原文

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

     }
}

Gaussian Elimination in OpenMP. I am new to openmp and wondering if I used my pragmas and barrier at correct places. my x values are different each time. Are they supposed to be the same??

#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

     }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

若言繁花未落 2024-11-11 04:57:21

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

With the current code, you have placed the OpenMP pragam on the the j and k loops. However, you have a private(i,j), which makes the variables i and j private (with no initial values). This should be private(j,k), because the j and k loop variables need to be private and i needs to be shared (since it is the loop bound for the j loop). The OpenMP barriers are not doing anything.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文