从MPI的外部文件读取输入整数

时间:2017-05-31 22:00:30

标签: mpi

我怎样才能读取mpi的外部输入文件?我需要从外部文件(zadanie4_vstup.txt)中读取一个整数来计算简单的阶乘。我试图用MPI_Init()中的第二个参数替换int变量(n)的地址,但它看起来是无意义的。 谢谢。

#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 个答案:

答案 0 :(得分: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