2011-04-29 46 views
3

OpenMP中的高斯消除。我是openmp新手,想知道我是否在正確的地方使用了我的編譯指示和屏障。我的x值每次都不一樣。他們應該是一樣的嗎?OpenMP中的高斯消除

#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 

    } 
} 
+0

對於(j = 0; j evnu 2011-04-29 06:54:31

+0

@evnu不,它不符合,但它符合,奇怪 – james 2011-04-29 06:58:12

+1

當然它編譯,它只是意味着for循環遍歷空的語句。所以它什麼都不做。 – evnu 2011-04-29 07:01:38

回答

1

使用當前代碼,您已將OpenMP pragam放置在j和k循環中。然而,你有一個私有的(i,j),它使變量i和j私有(沒有初始值)。這應該是private(j,k),因爲j和k循環變量需要是私有的,我需要共享(因爲它是j循環的循環)。 OpenMP障礙沒有做任何事情。

+0

我是OpenMP的新手,但我同意屏障沒有任何影響。 – Chiffa 2015-05-12 12:50:14