MPI:Printf 语句未在正确的时间执行

Posted

技术标签:

【中文标题】MPI:Printf 语句未在正确的时间执行【英文标题】:MPI: Printf Statement is not executed at the right time 【发布时间】:2011-04-23 14:25:44 【问题描述】:

我有一个小程序。

#include "mpi.h"
#include <stdio.h>

int main(int argc, char *argv[])

int rank, size;
int buf;
int err;
MPI_Status status;

err = MPI_Init(&argc, &argv);
if(err == MPI_SUCCESS) 
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if(rank == 0) 
printf("Buffer size is less than 10\n");
printf("Enter the buffer size: ");
scanf("%d", &buf);
MPI_Send(&buf, 1, MPI_INT, 1, 10,
MPI_COMM_WORLD);

else 
MPI_Recv(&buf, 1, MPI_INT, 0, 10,
MPI_COMM_WORLD, &status);

printf("process[%d]: buffer size : %d\n", rank,buf);


err = MPI_Finalize();
return 0;

输出是:

[veda@home-pc hpc]$ mpicc test.c
[veda@home-pc hpc]$ mpiexec -np 2 a.out
Buffer size is less than 10
3
Enter the buffer size: process[0]: buffer size : 3
process[1]: buffer size : 3

在此输出中,您可以注意到

输入缓冲区大小:

在我输入缓冲区大小后正在打印/提示。

谁能告诉我如何解决这个问题。

【问题讨论】:

【参考方案1】:

我怀疑您的标准输出是行缓冲的。 "Enter the buffer size: " 直到 "process[%d]: buffer size : %d\n"(包含换行符)被打印后才会被打印。解决方法是显式刷新printfscanf之间的标准输出:

printf("Enter the buffer size: ");
fflush(stdout);
scanf("%d", &buf);

【讨论】:

This page 警告不要这样做,说printf() 之后但fflush() 之前的任何输入都会被丢弃。【参考方案2】:

你可以使用它:

puts("Enter the buffer size:");
gets(buf);

【讨论】:

【参考方案3】:

如果使用 Eclipse 进行并行编程,那么(很可能)这就是导致问题的原因。 这是 PTP 中的某种故障。您也可以通过printf 体验这一点,它仅在您的程序完成执行或关闭后打印(而不是在程序运行时)。然后尝试从命令运行您的代码行,它会工作。 否则如果它仍然被绞死或出现奇怪的行为那么尝试致电 fflush(stdout) 或 @ 987654323@在读取用户输入之前刷新所有内容。

【讨论】:

【参考方案4】:

这就是你所拥有的。

printf("Buffer size is less than 10\n");
printf("Enter the buffer size: ");

我的意思是你怀疑它会做什么?看后:if(rank==0) 明白我的意思。事实上,你甚至不使用你使用 10 的 %d。

你可能想要:

if(rank == 0) 
   printf("Enter the buffer size: ");
   scanf("%d", &buf);
   printf("Buffer size is less than %d\n", buf);
   //...

【讨论】:

以上是关于MPI:Printf 语句未在正确的时间执行的主要内容,如果未能解决你的问题,请参考以下文章

python循环语句while

SQL 命令未在更新语句中正确结束 [重复]

Scanf未在C中执行[重复]

Bash 脚本未在 Cron 中正确执行

在 MPICH 中执行混合 OpenMP/MPI 作业

ORACLE:错误错误(6,3):PL/SQL:SQL 语句被忽略和错误(8,3):PL/SQL:ORA-00933:SQL 命令未在过程中正确结束