MPI:程序在scanf挂起
我已经写了一个简单的MPI程序。我没有在程序中进行任何处理。它只有MPI框架和用于读取变量的行。但是,程序在运行时被挂起。它打印一些新行,然后永远挂起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
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
。