English 中文(简体)
MPI: 书面声明未在适当时间执行
原标题:MPI: Printf Statement is not executed at the right time

我有一个小型方案。

#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
");
printf("进入缓冲地带: ");
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
", 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
进入缓冲地带: process[0]: buffer size : 3
process[1]: buffer size : 3

在这一产出中,你可以注意到:

进入缓冲地带:

在我进入缓冲地带后,正在印刷/投稿。

人人都能告诉我如何解决这一问题。

最佳回答

I suspect your standard output is line-buffered. The "Enter the buffer size: " is not printed until "process[%d]: buffer size : %d " (containing a newline) is printed. The solution is to explicitly flush the standard output between the printf and the scanf:

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

您可以使用:

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

If you are using Eclipse for parallel programming, then (most probably) that is what causes the issue.
It is some kind of glitch in PTP. You can also experience this with printf, it only prints after your program has finished execution or was shut down (not while the program is running).
Then try running your code from the command line, it will work.

Else (If it still gets hanged or gives weird behaviour) then try calling
fflush(stdout) or while ((c = getchar()) != && c != EOF);
to flush everything before reading user input.

确实,你拥有的东西。

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

我指的是你怀疑它会做些什么? 查阅:if(rank=0),看我的含义。 事实上,你甚至没有使用你使用10 %的人。

也许希望:

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




相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签