2017-05-31 70 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);' –