<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 12, 2021 at 6:49 PM Barry Smith <<a href="mailto:bsmith@petsc.dev">bsmith@petsc.dev</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><div><br></div><div>   Fande,</div><div><br></div>   /* hope that any still active tags were issued right at the beginning of the run */<div><br></div><div>   PETSc actually starts with *maxval (see line 130). It is only when it runs out that it does this silly thing for the reason indicated in the comment. </div><div><br></div><div>   PETSc should actually keep track which of which tags have been "returned" and if the counter gets to zero use those returned tags instead of starting again at the top which could clash with the same value used for another reason. In other words the current code is buggy,  but it has always been "good enough".</div></div></blockquote><div><br></div><div>I agreed that it is "good enough" for most people for most cases. However, I was worried that there is almost no way to debug once we reuse active tags. At least it is not easy to debug.</div><div><br></div><div>Thanks,</div><div><br></div><div>Fande</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><div><br></div><div>  Barry</div><div><br></div><div><br><div><br><blockquote type="cite"><div>On Jan 12, 2021, at 10:41 AM, Fande Kong <<a href="mailto:fdkong.jd@gmail.com" target="_blank">fdkong.jd@gmail.com</a>> wrote:</div><br><div><div dir="ltr"><div dir="ltr">Hi All,<br><div><br></div><div>I am curious about why we subtract 128 from the max value of tag? Can we directly use the max tag value?</div><div><br></div><div>Thanks,</div><div><br></div><div>Fande,</div><div><br></div><div><br></div><div><div>PetscErrorCode  PetscCommGetNewTag(MPI_Comm comm,PetscMPIInt *tag)</div><div>{</div><div>  PetscErrorCode   ierr;</div><div>  PetscCommCounter *counter;</div><div>   PetscMPIInt      *maxval,flg;</div><div><br></div><div><br></div><div>  MPI_Comm_get_attr(comm,Petsc_Counter_keyval,&counter,&flg);</div><div>  if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"Bad MPI communicator supplied; must be a PETSc communicator");</div><div><br></div><div> if (counter->tag < 1) {</div><div>  PetscInfo1(NULL,"Out of tags for object, starting to recycle. Comm reference count %d\n",counter->refcount);</div><div>  MPI_Comm_get_attr(MPI_COMM_WORLD,MPI_TAG_UB,&maxval,&flg);</div><div>    if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"MPI error: MPI_Comm_get_attr() is not returning a MPI_TAG_UB");</div><div>   <font color="#ff0000"> counter->tag = *maxval - 128;</font> /* hope that any still active tags were issued right at the beginning of the run */</div><div>  }</div><div><br></div><div>  *tag = counter->tag--;</div><div>   if (PetscDefined(USE_DEBUG)) {</div><div>     /*</div><div>     Hanging here means that some processes have called PetscCommGetNewTag() and others have not.</div><div>      */</div><div>    MPI_Barrier(comm);</div><div>  }</div><div>  return(0);</div><div>}</div></div></div></div>
</div></blockquote></div><br></div></div></blockquote></div></div>