MPI:程序在scanf挂起

MPI:程序在scanf挂起,c,parallel-processing,mpi,C,Parallel Processing,Mpi,我已经写了一个简单的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_Sta

我已经写了一个简单的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;
}
从STDIN读取一个函数,并将其存储在所选变量中(在您的示例N中)

编写MPI程序时,MPI_init之后的代码由每个进程独立执行


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

通过冲洗标准液解决了问题

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

如果它仍然被挂起,或者您没有使用Eclipse进行并行编程,
然后
尝试调用
fflush(stdout)
while((c=getchar())!='\n'&&c!=EOF)
在读取用户输入之前刷新所有内容。

那么,如果删除MPI调用会发生什么?通过刷新标准输出解决了这个问题。不知道为什么会出现问题。对于大多数MPI库来说,这个答案并不准确。即使将代码放在MPI_INIT之前,对于大多数实现,每个进程仍将执行一次。在MPI中处理用户输入的正确方法是使用文件或命令行参数,而不是
stdin