Hi<br>
<br>
I'm using MPICH <a href="http://1.2.5.2">1.2.5.2</a>, and the portland group fortran compiler.<br>
<br>
I'm having some issues with mpiallgatherv.<br>
<br>
The first issue, is I can't seem to find any documentation about the
details of the displacement array - in fortran, should the first
displacement be 1 or 0 (I suspect it should be 1 from testing, but I
can't get the results I'm expecting from either 1 or 0 - see below).<br>
<br>
The second bigger issue, is I'm expecting the parts that are gathered
from the various processes should be assembled in process order - this
does not seem to happen. Probably the best way to illustrate what I'm
really getting at is with a small test program I wrote and it's output,
and what I'm expecting as output.<br>
<br>
Here's the testprogram and header file<br>
//////mpicoms.h///////<br>
include 'mpif.h'<br>
integer m_rank, m_size,status(MPI_STATUS_SIZE),mpi_err<br>
common/MPIBLK/m_rank,m_size,mpi_err<br>
<br>
/////mpitestallgatherv.for/////<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PROGRAM mpitest<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; implicit none<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; include 'mpicoms.h'<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer mydata(2,1), alldata(2,3)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer recvcnts(3)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer displs(3)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recvcnts(1)=2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recvcnts(2)=2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recvcnts(3)=2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displs(1)=1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displs(2)=3<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displs(3)=5<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CALL MPI_INIT(mpi_err)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call MPI_COMM_SIZE(MPI_COMM_WORLD, m_size, mpi_err)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call MPI_COMM_RANK(MPI_COMM_WORLD, m_rank, mpi_err)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mydata(1,1)=m_rank+5<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mydata(2,1)=m_rank+6<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call MPI_ALLGATHERV(mydata, 2, MPI_INTEGER, alldata, recvcnts, displs,<br>
&nbsp;&nbsp;&nbsp;&nbsp; *MPI_INTEGER, MPI_COMM_WORLD, mpi_err)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call MPI_FINALIZE(mpi_err)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(*,*) &quot;this is node &quot;, m_rank<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(*,*) &quot;mydata =&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(*,*) mydata(1,1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(*,*) mydata(2,1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(*,*) &quot;alldata=&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(*,*) mydata(1,1),' ',mydata(1,2),' ',mydata(1,3)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(*,*) mydata(2,1),' ',mydata(2,2),' ',mydata(2,3)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stop<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br>
<br>
The output I receive from running this on 3 processors (of which this
little test is rather hardcoded for) is the following (with some
rearrangement and adjusted spacing for readability):<br>
<br>
&nbsp;this is node 0<br>

&nbsp;mydata =<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6<br>

&nbsp;alldata=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7<br>
<br>
&nbsp;this is node 1<br>
&nbsp;mydata =<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7<br>
&nbsp;alldata=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7<br>
<br>
&nbsp;this is node 2<br>
&nbsp;mydata =<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8<br>
&nbsp;alldata=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7<br>
<br>
<br>
What I'm expecting is alldata on all 3 processes should look like this<br>
&nbsp;alldata=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8<br>
<br>
i.e. be in process order (of course keeping in mind that arrays are column major in fortran), and not duplicated.<br>
<br>
Am I doing something wrong? Is this not the output I should be expecting from allgatherv?<br>
<br>
I also know that allgatherv isn't necessary with this example because
all of the processes send the same number of entries, but the real
program I'm working on, that isn't the case and the vector version of
the call is needed.<br>
<br>
Thanks<br>
Andrew Hakman<br>