【问题标题】:MPI: Program hanged at scanfMPI:程序在 scanf 处挂起
【发布时间】:2015-03-04 07:44:50
【问题描述】:

我编写了一个简单的 MPI 程序。我没有在程序中进行任何处理。它只有 MPI 框架和读取变量的行。但是,程序在运行时被挂起。它打印几个换行符,然后永远挂起。

int main(int argc, char* argv[]) {
    int my_rank; /* rank of process */
    int p; /* number of processes */
    int tag = 0; /* tag for messages */
    long N;
    MPI_Status status; /* return status for receive */

    /* start up MPI */
    MPI_Init(&argc, &argv);

    /* find out process rank */
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    /* find out number of processes */
    MPI_Comm_size(MPI_COMM_WORLD, &p);


    printf("\nEnter the number of random points to generate: ");
    scanf("%ld", &N);

    if (my_rank == 0) {

    }

    /* shut down MPI */
    MPI_Finalize();

    return 0;
}

【问题讨论】:

  • 那么,如果删除 MPI 调用会发生什么?
  • 问题已通过刷新标准输出解决。不知道为什么会导致问题。

标签: c parallel-processing mpi


【解决方案1】:

如果使用 Eclipse 进行并行编程,那么(很可能)这就是导致问题的原因。
这是 PTP 中的某种故障。您也可以通过printf 体验这一点,它仅在您的程序完成执行或关闭后打印(而不是在程序运行时)。
然后尝试从命令运行您的代码行,它会工作。

如果它仍然挂起或没有使用 Eclipse 进行并行编程
那么尝试调用 @987654322 @ 或 while ((c = getchar()) != '\n' && c != EOF); 在读取用户输入之前刷新所有内容。

【讨论】:

    【解决方案2】:

    scanf 从 STDIN 读取一个函数并将其存储在选择的变量中,在您的情况下为 N。

    编写MPI程序时,mpi_init之后的代码由各个进程独立执行。

    它将运行良好,直到 printf 语句(每个进程将并行执行 printf)。一旦遇到 scanf,程序就会停止执行,因为它现在需要来自未提供的 STDIN 的输入。

    【讨论】:

    • 这个答案对于大多数 MPI 库来说并不准确。即使您将代码放在MPI_INIT 之前,对于大多数实现,它仍然会在每个进程中执行一次。在 MPI 中处理用户输入的正确方法是使用文件或命令行参数而不是 stdin
    【解决方案3】:

    问题已通过刷新标准输出解决。

    【讨论】:

      猜你喜欢
      • 2019-01-03
      • 2015-05-18
      • 2015-12-30
      • 2016-01-23
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      相关资源
      最近更新 更多