"Smith, Barry F." <[email protected]> writes:

>> On May 2, 2019, at 6:15 PM, Jed Brown <[email protected]> wrote:
>> 
>> I think this is a consequence of PetscViewerFlush_ASCII flushing any
>> synchronized messages (code is basically copied from
>> PetscSynchronizedFlush).
>> 
>>  if (vascii->allowsynchronized) {
>>    PetscMPIInt   tag,i,j,n = 0,dummy = 0;
>>    char          *message;
>>    MPI_Status    status;
>> 
>>    ierr = PetscCommDuplicate(comm,&comm,&tag);CHKERRQ(ierr);
>> 
>>    /* First processor waits for messages from all other processors */
>>    if (!rank) {
>> 
>> 
>> But if all ranks don't agree about whether synchronized messages may
>> exist, then this slow code path would always be taken.  In the current
>> code, PetscViewerASCIIPopSynchronized doesn't do anything other than
>> tracking that the pushes were matched.  It should probably flush
>
>    What about the push? Does it need to do a flush also?  Note that the 
> queued up messages are not tagged by the synchronized count so with 
> multiple pushes there can be jumbled mess. 

I would think printing in the order of the pops would be okay.  It means
each push would use a fresh buffer so only the content printed inside
that level of nesting would print.  SegBuffer would be convenient for
this buffer management.

>> (or
>> provide equivalent semantic on ordering).
>
> Maybe the whole chunk of code
>
>  if (vascii->allowsynchronized) {
>    PetscMPIInt   tag,i,j,n = 0,dummy = 0;
>     ....
>
> could just be moved to the Pop. Or even better if possible have it call 
> PetscSynchronizedFlush()  and
> avoid the duplicate code. I'm not sure why I duplicated the code  but there 
> must have been a reason.

Yup, but it should be possible to deduplicate, even if via an internal helper.

> The current code is a bit defective. Maybe the push/pop model should be 
> abandoned and instead require that Allow be closed before another one is 
> open. So PetscViewerASCIIOpenSynchronized(), synchronized writes, 
> PetscViewerASCIICloseSynchronized() and the close automatically flushes. I'm 
> not sure if the current routines are used in a nested manner (nor how to 
> search for that ;)).

Insert a check for allowsynchronized > 1 and run the test suite.

> After a few hours I'm becoming more convinced that the reason for the 
> Allow/Push/Pop model is just to avoid the global synchronization.

I suspect that's right.

Reply via email to