OpenMP中的高斯消除

时间:2011-04-29 06:45:16

标签: openmp

OpenMP中的高斯消除。我是openmp的新手,想知道我是否在正确的地方使用了我的pragma和屏障。我的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

     }
}

1 个答案:

答案 0 :(得分:1)

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