MPI:程序在 scanf 处挂起
MPI: Program hanged at scanf
我写了一个简单的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;
}
scanf 从 STDIN 读取函数并将其存储在选择的变量中,在您的例子中为 N。
当你写一个MPI程序时,mpi_init后面的代码是每个进程独立执行的。
它会运行 直到 printf 语句(每个进程将并行执行 printf)。一旦遇到 scanf,程序就会停止执行,因为它现在需要来自未提供的 STDIN 的输入。
问题已通过刷新标准输出解决。
如果您正在使用 Eclipse 进行并行编程,那么(很可能)这就是导致问题的原因。
这是 PTP 中的某种故障。您也可以使用 printf
来体验这一点,它仅在您的程序完成执行或关闭后打印(而不是在程序处于 运行 时)。
Then 从命令行尝试 运行 你的代码,它会工作。
如果它仍然挂起或者你没有使用 Eclipse 进行并行编程,
然后 尝试调用 fflush(stdout)
或 while ((c = getchar()) != '\n' && c != EOF);
在读取用户输入之前刷新所有内容。
我写了一个简单的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;
}
scanf 从 STDIN 读取函数并将其存储在选择的变量中,在您的例子中为 N。
当你写一个MPI程序时,mpi_init后面的代码是每个进程独立执行的。
它会运行 直到 printf 语句(每个进程将并行执行 printf)。一旦遇到 scanf,程序就会停止执行,因为它现在需要来自未提供的 STDIN 的输入。
问题已通过刷新标准输出解决。
如果您正在使用 Eclipse 进行并行编程,那么(很可能)这就是导致问题的原因。
这是 PTP 中的某种故障。您也可以使用 printf
来体验这一点,它仅在您的程序完成执行或关闭后打印(而不是在程序处于 运行 时)。
Then 从命令行尝试 运行 你的代码,它会工作。
如果它仍然挂起或者你没有使用 Eclipse 进行并行编程,
然后 尝试调用 fflush(stdout)
或 while ((c = getchar()) != '\n' && c != EOF);
在读取用户输入之前刷新所有内容。