【问题标题】:Read input integer from external file for MPI从外部文件中读取输入整数用于 MPI
【发布时间】:2017-05-31 22:00:29
【问题描述】:

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

#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();

}

【问题讨论】:

  • 首先,你应该只在等级 0 上使用 fopen()/fclose() fw
  • 您可能还想仅读取 rank 0 上的输入文件,然后 MPI_Bcast() 将其读取到所有其他 rank

标签: mpi


【解决方案1】:

这是您的程序的一个版本,它在命令行上读取 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

【讨论】:

  • 谢谢你,吉尔
  • MPI_Reduce 是个好主意。但我仍然没有下定决心从外部来源获取阶乘变量。请问如何将源放在rank0上?
  • if (0 == me) { FILE *fr = fopen("inputfile.txt", "r"); fscanf(fr, "%d", &amp;n); } MPI_Bcast(&amp;n, 1, MPI_INT, 0, MPI_COMM_WORLD);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多