MPI:Printf语句未在合适的时间执行

时间:2010-10-11 00:25:05

标签: c multithreading printf mpi

我有一个小程序。

#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

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

  

输入缓冲区大小:

输入缓冲区大小后,

正在打印/提示。

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

4 个答案:

答案 0 :(得分:11)

我怀疑你的标准输出是行缓冲的。在打印"Enter the buffer size: "(包含换行符)之前,不会打印"process[%d]: buffer size : %d\n"。解决方案是明确刷新printfscanf之间的标准输出:

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

答案 1 :(得分:1)

你可以使用它:

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

答案 2 :(得分:1)

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

如果它仍然被绞死或发出奇怪的行为那么尝试调用
{{ 1}}或fflush(stdout)
在读取用户输入之前刷新所有内容。

答案 3 :(得分:-1)

那就是你所拥有的。

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

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

你可能想要:

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