You can explicitly specify the type of buffering
that you want to get with setvbuf() C function.
It can be block-buffered, line-buffered and unbuffered.

Stdout is line-buffered by default.
To make it un-buffered, you need something like this:

setvbuf(stdout, NULL, _IONBF, 0)

-- YK

On 30-Mar-11 1:13 PM, Jeff Squyres wrote:
> I don't remember this being a function of the C language or the compiler; I'm 
> pretty sure you can change whether stdout is line buffered or not at the OS 
> level.
> 
> As for OMPI, we deliberately set each MPI process' stdout to be line buffered 
> before relaying it up to the mpirun process.  This was because we wanted to 
> limit non-MPI network traffic (i.e., bundle more output into fewer, longer 
> messages, rather than more, shorter messages -- i.e., less overall network 
> and CPU overhead).  I don't know if that makes anything more or less friendly 
> to interactive computing; I don't think using fflush() or \n is onerous.
> 
> Indeed, stdout / stdin processing likely isn't part of the high performance 
> section of your application, so we figured it was an easy tradeoff to make 
> (i.e., less network overhead leading to potentially better MPI message 
> performance).
> 
> 
> On Mar 30, 2011, at 3:31 AM, Meilin Bai wrote:
> 
>> You remind me. I now realize that it is not an matter of compiler, but an 
>> issue of C language. The printf() function in C doesn't print messages onto 
>> the standard ouput immediately, but instead stores them in a buffer. Only in 
>> some cases does the standard output work, defined in standard C:
>>      1. The buffer is full or freshed compulsively (like use fflush()).
>>      2. When a newline comes (\n).
>>      3. Needs reading from buffer (such as scanf()).
>>
>> Some compilers may deal with this function, and compiled by Mpich2 this code 
>> seems be well-off.
>>
>> Thanks very much.
>>
>>
>> On Wed, Mar 30, 2011 at 3:39 PM, Pascal Deveze<pascal.dev...@bull.net>  
>> wrote:
>> Maybe this could solve your problem: Just add \n in the string you want to 
>> display:
>> printf("Please give N= \n");
>>
>> Of course, this will return, but the string is displayed. This run by me 
>> without the fflush().
>>
>> On the other hand, do you really observe that the time of the scanf () and 
>> the time to enter "N" be insignificant ?
>>
>> Pascal
>>
>> Meilin Bai a écrit :
>>> So it means that MPI doesn't suit to interactive programming? Though we can 
>>> really use fflush(stdout) to get the right order, it takes too more time, 
>>> and it's said that using fflush() is not a good progrmming style in C.
>>>
>>> On the other hand, in Fortran language, this situation won't exist. Maybe 
>>> it is because I/O implement is a built-in part of Fortran, while in C/C++ 
>>> it is realized only through function like scanf, printf, et al?
>>>
>>>
>>>
>>> On Wed, Mar 30, 2011 at 2:38 AM, Prentice Bisbal<prent...@ias.edu>  wrote:
>>> On 03/29/2011 01:29 PM, Meilin Bai wrote:
>>>> Dear open-mpi users:
>>>>
>>>> I come across a little problem when running a MPI C program compiled
>>>> with Open MPI 1.4.3. A part of codes as follows:
>>>>
>>>>      MPI_Init(&argc,&argv);
>>>>      MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
>>>>      MPI_Comm_rank(MPI_COMM_WORLD,&myid);
>>>>      MPI_Get_processor_name(processor_name,&namelen);
>>>>      if (myid == 0) {
>>>>           printf("Please give N= ");
>>>>           //fflush(stdout);
>>>>           scanf("%d",&n);
>>>>           startwtime = MPI_Wtime();
>>>>       }
>>>>
>>>> If comment out the sentence of "fflush(stdout);", it doesn't print out
>>>> the message till I input an integer n. And if I add the fflush function
>>>> between them, it works as expected, though comsumming time obviously.
>>>>
>>>> However, when I compiled it with Mpich2-1.3.2p1, without fflush function
>>>> in the code, it works correctly.
>>>>
>>>> Can anyone know what the matter is.
>>>>
>>>
>>> The Open MPI Developers (Jeff, Ralph, etc) can confirm this:
>>>
>>> The MPI standard doesn't have a lot of strict requirements for I/O
>>> behavior like this, so implementations are allowed to buffer I/O if they
>>> want. There is nothing wrong with requiring fflush(stdout) in order to
>>> get the behavior you want. In fact, if you check some text books on MPI
>>> programming, I'm pretty sure they recommend using fflush to minimize
>>> this problem.
>>>
>>> MPICH behaves differently because its developers made different design
>>> choices.
>>>
>>> Neither behavior is "wrong".
>>>
>>> --
>>> Prentice
>>> _______________________________________________
>>> users mailing list
>>> us...@open-mpi.org
>>> http://www.open-mpi.org/mailman/listinfo.cgi/users
>>>
>>>
>>>
>>> -- 
>>> Meilin Bai
>>>
>>>
>>> _______________________________________________
>>> users mailing list
>>>
>>> us...@open-mpi.org
>>> http://www.open-mpi.org/mailman/listinfo.cgi/users
>>
>>
>> _______________________________________________
>> users mailing list
>> us...@open-mpi.org
>> http://www.open-mpi.org/mailman/listinfo.cgi/users
>>
>>
>>
>> -- 
>> Meilin Bai
>> School of Electronic Engineering and Computer Science, Peking University
>> Beijing 100871, China
>> E-Mail: meilin....@gmail.com
>>             mei...@pku.edu.cn
>> MSN: meilin....@hotmail.com
>> Cellular: +86-1342-619-8430
>>
>> _______________________________________________
>> users mailing list
>> us...@open-mpi.org
>> http://www.open-mpi.org/mailman/listinfo.cgi/users
> 
> 

Reply via email to