I think I agree that the the third would be a Fint, but I don&#39;t understand this stuff either.  There are three types of attributes.<div><div>MPIR_ATTR_AINT</div><div>MPIR_ATTR_PTR</div><div><div>MPIR_ATTR_INT</div><div>

An attribute created in C is a PTR, in Fortran it is an AINT, and the depricated put/get interface in Fortran sets the type to INT.  I thought it was in put/get for C, but I don&#39;t see it now.</div></div><div><br></div>
<div><a href="https://svn.mcs.anl.gov/repos/mpi/mpich2/trunk/src/mpi/attr/comm_get_attr.c">https://svn.mcs.anl.gov/repos/mpi/mpich2/trunk/src/mpi/attr/comm_get_attr.c</a></div>
<div>MPI_Comm_get_attr has a small pile of code to select the correct version and handle it correctly:</div><div><br></div><div><div><span class="Apple-tab-span" style="white-space:pre">        </span>    if (p-&gt;keyval-&gt;handle == comm_keyval) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>*flag                  = 1;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (outAttrType == MPIR_ATTR_PTR) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>    if (p-&gt;attrType == MPIR_ATTR_INT) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>/* This is the tricky case: if the system is</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span> bigendian, and we have to return a pointer to</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span> an int, then we may need to point to the </div><div><span class="Apple-tab-span" style="white-space:pre">                        </span> correct location in the word. */</div>
<div>#if defined(WORDS_LITTLEENDIAN) || (SIZEOF_VOID_P == SIZEOF_INT)</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>*(void**)attribute_val = &amp;(p-&gt;value);</div><div>#else</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>int *p_loc = (int *)&amp;(p-&gt;value);</div>
<div>#if SIZEOF_VOID_P == 2 * SIZEOF_INT</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>p_loc++;</div><div>#else </div><div>#error Expected sizeof(void*) to be either sizeof(int) or 2*sizeof(int)</div>
<div>#endif</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>*(void **)attribute_val = p_loc;</div><div>#endif</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>    }</div><div>
<span class="Apple-tab-span" style="white-space:pre">                </span>    else if (p-&gt;attrType == MPIR_ATTR_AINT) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>*(void**)attribute_val = &amp;(p-&gt;value);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>    }</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>    else {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>*(void**)attribute_val = (p-&gt;value);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>    }</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>else</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>    *(void**)attribute_val = (p-&gt;value);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>break;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>    }</div>
<div><br></div></div><div>The part that handles a larger void* than int, and especially the endian-ness part, would be easier with a union.  Since the Aint and the void* are different on our system, it would help that too.</div>
<div><br></div><div class="gmail_quote"><br>Joe Ratterman<br><a href="mailto:jratt@us.ibm.com">jratt@us.ibm.com</a></div><div class="gmail_quote"><br></div><div class="gmail_quote"><br>On Mon, Jul 20, 2009 at 5:37 PM, Dave Goodell <span dir="ltr">&lt;<a href="mailto:goodell@mcs.anl.gov" target="_blank">goodell@mcs.anl.gov</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>On Jul 16, 2009, at 4:55 PM, Joe Ratterman wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
(This is a re-send; I got a pile of python errors on the last try)<br>
</blockquote>
<br></div>
Sorry about that.  The IT department here upgraded both Trac and SVN last week and it didn&#39;t go as smoothly as it could have.  Those problems should all be resolved at this point.<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<a href="https://svn.mcs.anl.gov/repos/mpi/mpich2/trunk/test/mpi/f90/attr/fandcattrf90.f90" target="_blank">https://svn.mcs.anl.gov/repos/mpi/mpich2/trunk/test/mpi/f90/attr/fandcattrf90.f90</a><br>
<a href="https://svn.mcs.anl.gov/repos/mpi/mpich2/trunk/test/mpi/f90/attr/fandcattrc.c" target="_blank">https://svn.mcs.anl.gov/repos/mpi/mpich2/trunk/test/mpi/f90/attr/fandcattrc.c</a><br>
<br>
This test creates an attribute in F90, sets it in F90, and then reads it back in C.  It was getting the wrong answer:<br>
Expected:           5555 (0x15b3)<br>
Actual:   23858543329280 (0x15b300000000)<br>
</blockquote></div>
...<div><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
One idea that strikes me as really good is to change the &quot;value&quot; field in the MPID_Attribute structure to be a union of int, void*, and MPI_Aint types with three different names.  That would get rid of the interesting work that is required to handle 8-byte void* and 4-byte ints.  It would also make it easier to add MPI_Aint changes.  You wouldn&#39;t have to worry about the strangeness of storing an integer type in a pointer type, and it would automatically handle any differences in the sizes of the elements.  You already track the data type, so you would know into which element the attribute should be stored.<br>


<br>
Comments or questions?<br>
</blockquote>
<br></div>
Sorry for the delayed response, I was hoping that someone else who knows and likes attributes better than I do would jump in here.  Unfortunately, that doesn&#39;t seem to be happening, so I&#39;ll take a stab at this.<br>


<br>
Do you really mean that the value union should be this?<br>
--------8&lt;---------<br>
union {<br>
  MPI_Fint  f_int; /* instead of int */<br>
  void     *void_p;<br>
  MPI_Aint  a_int;<br>
} value;<br>
--------8&lt;---------<br>
<br>
This seems reasonable to me on its face, but I would feel better if someone who was more active in MPI Forum ticket #55 [1] thought so too (Rajeev?).  This is a really complicated section of the standard that always confuses me on at least one or two issues every time I look at it.<br>


<br>
-Dave<br>
<br>
[1] <a href="https://svn.mpi-forum.org/trac/mpi-forum-web/ticket/55" target="_blank">https://svn.mpi-forum.org/trac/mpi-forum-web/ticket/55</a><br>
<br>
</blockquote></div><br></div>