<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div><br></div>Is there a significant cost to have the MPI implementation provide a check for aliasing?<div><br><div><font face="Courier New">int bytes;MPI_Aint N;</font></div><div><font face="Courier New">MPI_Type_size(type,bytes);</font></div><div><font face="Courier New">N=bytes*(MPI_Aint)n; /* most functions need to compute these two terms already anyways */<br></font><div><font face="Courier New">assert(s2>s1?s1+N>s2:s2+N>s1)</font></div><div><br></div><div>For properly reentrant functions this could prevent many bugs (I had noticed this was in the MPIR functions in the OP).</div><div><br></div><div>It would make the statement "Unless specified otherwise, an argument of type OUT or type INOUT cannot be aliased with any other argument passed to an MPI procedure.” a nice hard rule that you catch earlier in the call graph.</div><div><br></div><div>Brian</div><div><br></div><div><div><div>On Aug 22, 2014, at 7:56 AM, Balaji, Pavan <<a href="mailto:balaji@anl.gov">balaji@anl.gov</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><br>That’s not “aliased” (as per the MPI standard), since the input and output buffers are not overlapping (I would have preferred saying “overlapping” to “aliased”).<br><br>Note that the example in the standard that shows overlapping uses copyIntBuffer(a,b,7), not copyIntBuffer(a,b,3).<br><br>  — Pavan<br><br>On Aug 22, 2014, at 9:37 AM, Michael L. Stokes <<a href="mailto:Michael.Stokes@uah.edu">Michael.Stokes@uah.edu</a>> wrote:<br><br><blockquote type="cite">The MPI spec you reference gives an example of aliasing (bottom p.10, top p.11).  Would the following also<br>be considered aliasing?<br><br>#include <stdio.h><br>#include <stdlib.h><br><br>void copyIntBuffer( int *pin, int *pout, int len ) {<br>  int i;<br>  for(i=0; i<len; ++i)<br>      *pout++ = *pin++;<br>};<br><br>int main() {<br>  int array[10]={0,1,2,3,4,5,6,7,8,9};<br>  int *a = &array[0];<br>  int *b = &array[3];<br>  copyIntBuffer(a,b,3);<br>  return 0;<br>}<br><br>It is my belief that a definition of a term is much better than an example, albeit more difficult.<br><br>My $.05<br>Mike<br><br><br>On 08/22/2014 08:25 AM, Carsten Clauss wrote:<br><blockquote type="cite">MPI-3, Section 2.3, page 10: "Unless specified otherwise, an argument of type OUT or type INOUT cannot be aliased with any other argument passed to an MPI procedure."<br><br>Cheers,<br>Carsten<br><br>On 08/22/2014 03:10 PM, Balaji, Pavan wrote:<br><blockquote type="cite"><br>On Aug 22, 2014, at 7:59 AM, Balaji, Pavan <<a href="mailto:balaji@anl.gov">balaji@anl.gov</a>> wrote:<br><br><blockquote type="cite">On Aug 21, 2014, at 8:42 PM, Nick Radcliffe <<a href="mailto:nradclif@cray.com">nradclif@cray.com</a>> wrote:<br><br><blockquote type="cite"><blockquote type="cite">If buffers overlap, use memmov and not memcpy:<br></blockquote><br>Good point, you would have to use memmov in general for overlapping source and target buffers. I was thinking of the special case where the source and target buffers are identical.<br><br><blockquote type="cite">I don’t think so.  It’s an incorrect program to get from a buffer to itself.  MPICH is being helpful is catching this user error.<br></blockquote><br>Do you know where in the standard this is specified? I'm having trouble finding it.<br></blockquote><br>The parameter in PUT is a “const void *”.  It’s read-only for MPI.<br></blockquote><br>It’s less clear for GET, but the standard says it’s equivalent to sending and receiving, which should imply overlapping buffers is invalid.  Either way, I can’t imagine that not being the intention of the RMA working group (I’m a part of it).<br><br>In MPI-2, this was not a problem at all since we couldn’t send data from the local public window to a remote public window (two simultaneous locks were not allowed; FENCE didn’t allow load/store and PUT/GET in the same epoch, etc.).  In MPI-3 we allowed this, but forgot to make it clear that they shouldn’t overlap.<br><br>We should try to make it clearer in the standard, though I don’t think it’s valid even in MPI-3.<br><br>  — Pavan<br><br>-- <br>Pavan Balaji  ✉️<br><a href="http://www.mcs.anl.gov/~balaji">http://www.mcs.anl.gov/~balaji</a><br><br>_______________________________________________<br>discuss mailing list     discuss@mpich.org<br>To manage subscription options or unsubscribe:<br>https://lists.mpich.org/mailman/listinfo/discuss<br><br></blockquote><br></blockquote><br>_______________________________________________<br>discuss mailing list     <a href="mailto:discuss@mpich.org">discuss@mpich.org</a><br>To manage subscription options or unsubscribe:<br><a href="https://lists.mpich.org/mailman/listinfo/discuss">https://lists.mpich.org/mailman/listinfo/discuss</a><br></blockquote><br>--<br>Pavan Balaji  ✉️<br><a href="http://www.mcs.anl.gov/~balaji">http://www.mcs.anl.gov/~balaji</a><br><br>_______________________________________________<br>discuss mailing list     discuss@mpich.org<br>To manage subscription options or unsubscribe:<br>https://lists.mpich.org/mailman/listinfo/discuss</blockquote></div><br><div apple-content-edited="true">
<span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px;"><div><div><font class="Apple-style-span" face="'Courier New'">Brian Van Straalen         Lawrence Berkeley Lab</font></div><div><font class="Apple-style-span" face="'Courier New'"><a href="mailto:BVStraalen@lbl.gov">BVStraalen@lbl.gov</a>         Computational Research</font></div><div><font class="Apple-style-span" face="'Courier New'">(510) 486-4976             Division (<a href="http://crd.lbl.gov">crd.lbl.gov</a>)</font></div></div><div><br></div><div><br></div></span><br class="Apple-interchange-newline">
</div>
<br></div></div></div></body></html>