2017-05-31 66 views
1

如何讀取mpi的外部輸入文件?我需要從外部文件(zadanie4_vstup.txt)中讀取一個整數,以計算簡單因式分解。我嘗試用int變量(n)的地址替換MPI_Init()中的第二個參數,但它看起來是無意義的。 謝謝。從MPI的外部文件讀取輸入整數

#include <stdio.h> 
#include <mpi.h> 

int main(int argc, char ** argv) 
{ 
    FILE *fr, *fw; 

    fr = fopen("zadanie4_vstup.txt", "r"); 
    fw = fopen("zadanie4_vystup.txt", "w"); 


    int nproc, me; 
    int fakt=1, i, buff, n; 
    MPI_Status stat; 

    fscanf(fr, "%d", &n); 

    MPI_Init(&argc, &argv); 

    MPI_Comm_size(MPI_COMM_WORLD, &nproc); 
    MPI_Comm_rank(MPI_COMM_WORLD, &me); 

    #pragma omp parallel for private(i) reduction(*:fakt) 
    for(i=me*n/nproc+1; i<=(me+1)*n/nproc; i++) { 
     fakt *= i; 
    } 

    if(nproc > 1) { 
     if(me == 0) { 
     for(i=1; i<nproc; i++) { 
      MPI_Recv(&buff, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &stat); 
      fakt*=buff; 
     } 
     } else { 
     MPI_Send(&fakt, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); 
     } 
    } 
    if(me == 0) { 
     fprintf(fw, "%d! = %d\n", n, fakt); 
    } 

    fclose(fr); 
    fclose(fw); 

    MPI_Finalize(); 

}

+1

第一簡化了通信,則應該只'fopen()函數/ FCLOSE()''上的排名爲0。 –

+1

fw'你也許還想讀取輸入文件只在等級0,然後MPI_Bcast()'它到所有其他的隊列 –

回答

0

這裏是你的程序,在命令行上讀取n的一個版本。

音符我通過使用MPI_Reduce()

#include <stdio.h> 
#include <stdlib.h> 

#include <mpi.h> 

int main(int argc, char *argv[]) { 
    int nproc, me; 
    int fakt=1, res, i, buff, n; 
    MPI_Status stat; 

    MPI_Init(&argc, &argv); 

    n = atoi(argv[1]); 

    MPI_Comm_size(MPI_COMM_WORLD, &nproc); 
    MPI_Comm_rank(MPI_COMM_WORLD, &me); 

    #pragma omp parallel for private(i) reduction(*:fakt) 
    for(i=me*n/nproc+1; i<=(me+1)*n/nproc; i++) { 
     fakt *= i; 
    } 

    MPI_Reduce(&fakt, &res, 1, MPI_INT, MPI_PROD, 0, MPI_COMM_WORLD); 
    if(me == 0) { 
     printf("%d! = %d\n", n, res); 
    } 


    MPI_Finalize(); 
    return 0; 
} 

例如

$ mpirun -np 4 ./fakt 6 
6! = 720 
+0

謝謝,吉爾 – Jozef

+0

MPI_Reduce是個好主意。但我仍然沒有決心從外部來源考慮變量因子。我怎樣才能把源碼放在rank0上? – Jozef

+0

'if(0 == me){ FILE * fr = fopen(「inputfile.txt」,「r」); fscanf(fr,「%d」,&n); } MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);' –