I guess I should have sent it out earlier.  Thanks for taking a look at it, and let me know if you have any questions for future use.<div><br></div><div>Joe Ratterman<div><br><div><br><div class="gmail_quote">On Wed, Oct 6, 2010 at 7:25 AM, Dave Goodell <span dir="ltr">&lt;<a href="mailto:goodell@mcs.anl.gov">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;">I sent a longer response to Joe&#39;s mail last night, but it appears to have gotten clogged in the pipes somewhere...<br>

<br>
Basically, this patch appears to be a dup of a ticket (#1061?). I tried applying it but it causes a lot of problems in ch3 that aren&#39;t easy to solve. We should integrate this sort of functionality, but we might need to do it slightly differently. I just haven&#39;t had the time recently.<br>

<br>
We should not attempt to slip this in at this late stage for 1.3.<br>
<font color="#888888"><br>
-Dave<br>
</font><div><div></div><div class="h5"><br>
On Oct 6, 2010, at 7:44 AM, Pavan Balaji &lt;<a href="mailto:balaji@mcs.anl.gov">balaji@mcs.anl.gov</a>&gt; wrote:<br>
<br>
&gt;<br>
&gt; Thanks Joe. This looks good, though we&#39;ll need to port it to CH3 as well.<br>
&gt;<br>
&gt; mpich2-core: Should this go into 1.3? This is an ADI change (though fairly minor). But we are already at 1.3rc2, so I don&#39;t know if we want to make such a change at this point.<br>
&gt;<br>
&gt; -- Pavan<br>
&gt;<br>
&gt; On 10/05/2010 04:40 PM, Joe Ratterman wrote:<br>
&gt;&gt; From: Joe Ratterman&lt;<a href="mailto:jratt@us.ibm.com">jratt@us.ibm.com</a>&gt;<br>
&gt;&gt;<br>
&gt;&gt;   Currently, all implementations of a communicator rank list must<br>
&gt;&gt;   contain an actual list at least as long as the number of ranks in<br>
&gt;&gt;   the communicator.  This is because &quot;comm_ptr-&gt;local_vcr[i]&quot; is<br>
&gt;&gt;   assumed to work.<br>
&gt;&gt;<br>
&gt;&gt;   To avoid the list, it is possible to change the MPID_VCR API.<br>
&gt;&gt;   Basically, all places that were previously passed<br>
&gt;&gt;   &quot;comm_ptr-&gt;local_vcr[i]&quot; now contain &quot;comm_ptr-&gt;local_vcr, i&quot;.  This<br>
&gt;&gt;   means that the VCR table can be something other than a list, and<br>
&gt;&gt;   that callers are requesting some processing on the &quot;i&quot;th value<br>
&gt;&gt;   instead of actually passing the &quot;i&quot;th value into the function.<br>
&gt;&gt;<br>
&gt;&gt;   This patch makes the necessary changes to the core of MPICH2 1.3rc2,<br>
&gt;&gt;   as well as changing an alternative version of the &quot;dcmf&quot; device.<br>
&gt;&gt;<br>
&gt;&gt; Signed-off-by: Joe Ratterman&lt;<a href="mailto:jratt@us.ibm.com">jratt@us.ibm.com</a>&gt;<br>
&gt;&gt; ---<br>
&gt;&gt;  mpich2/src/include/mpiimpl.h                 |    4 ++--<br>
&gt;&gt;  mpich2/src/mpi/comm/comm_create.c            |    4 ++--<br>
&gt;&gt;  mpich2/src/mpi/comm/comm_group.c             |    2 +-<br>
&gt;&gt;  mpich2/src/mpi/comm/comm_remote_group.c      |    2 +-<br>
&gt;&gt;  mpich2/src/mpi/comm/comm_split.c             |   12 ++++++------<br>
&gt;&gt;  mpich2/src/mpi/comm/commutil.c               |   10 +++++-----<br>
&gt;&gt;  mpich2/src/mpi/comm/intercomm_create.c       |   10 +++++-----<br>
&gt;&gt;  mpich2/src/mpi/comm/intercomm_merge.c        |    8 ++++----<br>
&gt;&gt;  mpich2/src/mpi/group/grouputil.c             |    2 +-<br>
&gt;&gt;  mpich2/src/mpid/dcmfd/include/mpidi_hooks.h  |    3 ++-<br>
&gt;&gt;  mpich2/src/mpid/dcmfd/include/mpidi_macros.h |    2 +-<br>
&gt;&gt;  mpich2/src/mpid/dcmfd/src/mpid_init.c        |    4 ++--<br>
&gt;&gt;  mpich2/src/mpid/dcmfd/src/mpid_vc.c          |   16 ++++++++--------<br>
&gt;&gt;  13 files changed, 40 insertions(+), 39 deletions(-)<br>
&gt;&gt;<br>
&gt;&gt; diff --git a/mpich2/src/include/mpiimpl.h b/mpich2/src/include/mpiimpl.h<br>
&gt;&gt; index 013b4fe..6fd86fd 100644<br>
&gt;&gt; --- a/mpich2/src/include/mpiimpl.h<br>
&gt;&gt; +++ b/mpich2/src/include/mpiimpl.h<br>
&gt;&gt; @@ -3116,7 +3116,7 @@ int MPID_VCRT_Get_ptr(MPID_VCRT vcrt, MPID_VCR **vc_pptr);<br>
&gt;&gt;  /*@<br>
&gt;&gt;    MPID_VCR_Dup - Create a duplicate reference to a virtual connection<br>
&gt;&gt;    @*/<br>
&gt;&gt; -int MPID_VCR_Dup(MPID_VCR orig_vcr, MPID_VCR * new_vcr);<br>
&gt;&gt; +int MPID_VCR_Dup(const MPID_VCR *orig_vcr, unsigned origin_index, MPID_VCR *new_vcr, unsigned new_index);<br>
&gt;&gt;<br>
&gt;&gt;  /*@<br>
&gt;&gt;     MPID_VCR_Get_lpid - Get the local process id that corresponds to a<br>
&gt;&gt; @@ -3129,7 +3129,7 @@ int MPID_VCR_Dup(MPID_VCR orig_vcr, MPID_VCR * new_vcr);<br>
&gt;&gt;     processes may use different ids to identify the same target process<br>
&gt;&gt;    @*/<br>
&gt;&gt;  /* We macro-ized this at the device. */<br>
&gt;&gt; -int MPID_VCR_Get_lpid(MPID_VCR vcr, int * lpid_ptr);<br>
&gt;&gt; +int MPID_VCR_Get_lpid(MPID_VCR *vcr, unsigned index, int * lpid_ptr);<br>
&gt;&gt;<br>
&gt;&gt;  /* ------------------------------------------------------------------------- */<br>
&gt;&gt;  /* Define a macro to allow us to select between statically selected functions<br>
&gt;&gt; diff --git a/mpich2/src/mpi/comm/comm_create.c b/mpich2/src/mpi/comm/comm_create.c<br>
&gt;&gt; index 33bab93..0241f49 100644<br>
&gt;&gt; --- a/mpich2/src/mpi/comm/comm_create.c<br>
&gt;&gt; +++ b/mpich2/src/mpi/comm/comm_create.c<br>
&gt;&gt; @@ -154,7 +154,7 @@ PMPI_LOCAL int MPIR_Comm_create_calculate_mapping(MPID_Group  *group_ptr,<br>
&gt;&gt;              mapping[i] = -1;<br>
&gt;&gt;              for (j=0; j&lt;vcr_size; j++) {<br>
&gt;&gt;                  int comm_lpid;<br>
&gt;&gt; -                MPID_VCR_Get_lpid( vcr[j],&amp;comm_lpid );<br>
&gt;&gt; +                MPID_VCR_Get_lpid( vcr, j,&amp;comm_lpid );<br>
&gt;&gt;                  if (comm_lpid == group_ptr-&gt;lrank_to_lpid[i].lpid) {<br>
&gt;&gt;                      mapping[i] = j;<br>
&gt;&gt;                      break;<br>
&gt;&gt; @@ -207,7 +207,7 @@ PMPI_LOCAL int MPIR_Comm_create_create_and_map_vcrt(int         n,<br>
&gt;&gt;          MPIU_DBG_MSG_FMT(COMM,VERBOSE,<br>
&gt;&gt;                           (MPIU_DBG_FDEST, &quot;dupping from mapping_vcr=%p rank=%d into new_rank=%d/%d in new_vcr=%p&quot;,<br>
&gt;&gt;                            mapping_vcr, mapping[i], i, n, vcr));<br>
&gt;&gt; -        mpi_errno = MPID_VCR_Dup(mapping_vcr[mapping[i]],&amp;vcr[i]);<br>
&gt;&gt; +        mpi_errno = MPID_VCR_Dup(mapping_vcr, mapping[i], vcr, i);<br>
&gt;&gt;          if (mpi_errno) MPIU_ERR_POP(mpi_errno);<br>
&gt;&gt;      }<br>
&gt;&gt;<br>
&gt;&gt; diff --git a/mpich2/src/mpi/comm/comm_group.c b/mpich2/src/mpi/comm/comm_group.c<br>
&gt;&gt; index 7835307..d0700ae 100644<br>
&gt;&gt; --- a/mpich2/src/mpi/comm/comm_group.c<br>
&gt;&gt; +++ b/mpich2/src/mpi/comm/comm_group.c<br>
&gt;&gt; @@ -49,7 +49,7 @@ int MPIR_Comm_group_impl(MPID_Comm *comm_ptr, MPID_Group **group_ptr)<br>
&gt;&gt;          local_vcr = comm_ptr-&gt;vcr;<br>
&gt;&gt;<br>
&gt;&gt;      for (i=0; i&lt;n; i++) {<br>
&gt;&gt; -        (void) MPID_VCR_Get_lpid( local_vcr[i],&amp;lpid );<br>
&gt;&gt; +        (void) MPID_VCR_Get_lpid( local_vcr, i,&amp;lpid );<br>
&gt;&gt;          (*group_ptr)-&gt;lrank_to_lpid[i].lrank = i;<br>
&gt;&gt;          (*group_ptr)-&gt;lrank_to_lpid[i].lpid  = lpid;<br>
&gt;&gt;      }<br>
&gt;&gt; diff --git a/mpich2/src/mpi/comm/comm_remote_group.c b/mpich2/src/mpi/comm/comm_remote_group.c<br>
&gt;&gt; index a331bd0..5792df7 100644<br>
&gt;&gt; --- a/mpich2/src/mpi/comm/comm_remote_group.c<br>
&gt;&gt; +++ b/mpich2/src/mpi/comm/comm_remote_group.c<br>
&gt;&gt; @@ -41,7 +41,7 @@ int MPIR_Comm_remote_group_impl(MPID_Comm *comm_ptr, MPID_Group **group_ptr)<br>
&gt;&gt;<br>
&gt;&gt;          for (i=0; i&lt;n; i++) {<br>
&gt;&gt;              (*group_ptr)-&gt;lrank_to_lpid[i].lrank = i;<br>
&gt;&gt; -            (void) MPID_VCR_Get_lpid( comm_ptr-&gt;vcr[i],&amp;lpid );<br>
&gt;&gt; +            (void) MPID_VCR_Get_lpid( comm_ptr-&gt;vcr, i,&amp;lpid );<br>
&gt;&gt;              (*group_ptr)-&gt;lrank_to_lpid[i].lpid  = lpid;<br>
&gt;&gt;          }<br>
&gt;&gt;          (*group_ptr)-&gt;size = n;<br>
&gt;&gt; diff --git a/mpich2/src/mpi/comm/comm_split.c b/mpich2/src/mpi/comm/comm_split.c<br>
&gt;&gt; index 964f241..603ee78 100644<br>
&gt;&gt; --- a/mpich2/src/mpi/comm/comm_split.c<br>
&gt;&gt; +++ b/mpich2/src/mpi/comm/comm_split.c<br>
&gt;&gt; @@ -236,8 +236,8 @@ int MPIR_Comm_split_impl(MPID_Comm *comm_ptr, int color, int key, MPID_Comm **ne<br>
&gt;&gt;          MPID_VCRT_Get_ptr( (*newcomm_ptr)-&gt;local_vcrt,<br>
&gt;&gt;              &amp;(*newcomm_ptr)-&gt;local_vcr );<br>
&gt;&gt;          for (i=0; i&lt;new_size; i++) {<br>
&gt;&gt; -        MPID_VCR_Dup( comm_ptr-&gt;local_vcr[keytable[i].color],<br>
&gt;&gt; -            &amp;(*newcomm_ptr)-&gt;local_vcr[i] );<br>
&gt;&gt; +        MPID_VCR_Dup( comm_ptr-&gt;local_vcr, keytable[i].color,<br>
&gt;&gt; +                  (*newcomm_ptr)-&gt;local_vcr, i );<br>
&gt;&gt;          if (keytable[i].color == comm_ptr-&gt;rank) {<br>
&gt;&gt;              (*newcomm_ptr)-&gt;rank = i;<br>
&gt;&gt;          }<br>
&gt;&gt; @@ -261,8 +261,8 @@ int MPIR_Comm_split_impl(MPID_Comm *comm_ptr, int color, int key, MPID_Comm **ne<br>
&gt;&gt;          MPID_VCRT_Create( new_remote_size,&amp;(*newcomm_ptr)-&gt;vcrt );<br>
&gt;&gt;          MPID_VCRT_Get_ptr( (*newcomm_ptr)-&gt;vcrt,&amp;(*newcomm_ptr)-&gt;vcr );<br>
&gt;&gt;          for (i=0; i&lt;new_remote_size; i++) {<br>
&gt;&gt; -        MPID_VCR_Dup( comm_ptr-&gt;vcr[remotekeytable[i].color],<br>
&gt;&gt; -            &amp;(*newcomm_ptr)-&gt;vcr[i] );<br>
&gt;&gt; +        MPID_VCR_Dup( comm_ptr-&gt;vcr, remotekeytable[i].color,<br>
&gt;&gt; +                  (*newcomm_ptr)-&gt;vcr, i );<br>
&gt;&gt;          }<br>
&gt;&gt;<br>
&gt;&gt;          (*newcomm_ptr)-&gt;context_id     = remote_context_id;<br>
&gt;&gt; @@ -278,8 +278,8 @@ int MPIR_Comm_split_impl(MPID_Comm *comm_ptr, int color, int key, MPID_Comm **ne<br>
&gt;&gt;          MPID_VCRT_Create( new_size,&amp;(*newcomm_ptr)-&gt;vcrt );<br>
&gt;&gt;          MPID_VCRT_Get_ptr( (*newcomm_ptr)-&gt;vcrt,&amp;(*newcomm_ptr)-&gt;vcr );<br>
&gt;&gt;          for (i=0; i&lt;new_size; i++) {<br>
&gt;&gt; -        MPID_VCR_Dup( comm_ptr-&gt;vcr[keytable[i].color],<br>
&gt;&gt; -            &amp;(*newcomm_ptr)-&gt;vcr[i] );<br>
&gt;&gt; +        MPID_VCR_Dup( comm_ptr-&gt;vcr, keytable[i].color,<br>
&gt;&gt; +                  (*newcomm_ptr)-&gt;vcr, i );<br>
&gt;&gt;          if (keytable[i].color == comm_ptr-&gt;rank) {<br>
&gt;&gt;              (*newcomm_ptr)-&gt;rank = i;<br>
&gt;&gt;          }<br>
&gt;&gt; diff --git a/mpich2/src/mpi/comm/commutil.c b/mpich2/src/mpi/comm/commutil.c<br>
&gt;&gt; index 1eeaedc..fb7108d 100644<br>
&gt;&gt; --- a/mpich2/src/mpi/comm/commutil.c<br>
&gt;&gt; +++ b/mpich2/src/mpi/comm/commutil.c<br>
&gt;&gt; @@ -269,8 +269,8 @@ int MPIR_Comm_commit(MPID_Comm *comm)<br>
&gt;&gt;              for (i = 0; i&lt;  num_local; ++i) {<br>
&gt;&gt;                  /* For rank i in the new communicator, find the corresponding<br>
&gt;&gt;                     rank in the input communicator */<br>
&gt;&gt; -                MPID_VCR_Dup( comm-&gt;vcr[local_procs[i]],<br>
&gt;&gt; -&amp;comm-&gt;node_comm-&gt;vcr[i] );<br>
&gt;&gt; +                MPID_VCR_Dup( comm-&gt;vcr, local_procs[i],<br>
&gt;&gt; +                              comm-&gt;node_comm-&gt;vcr, i );<br>
&gt;&gt;              }<br>
&gt;&gt;<br>
&gt;&gt;              MPID_Dev_comm_create_hook( comm-&gt;node_comm );<br>
&gt;&gt; @@ -297,8 +297,8 @@ int MPIR_Comm_commit(MPID_Comm *comm)<br>
&gt;&gt;              for (i = 0; i&lt;  num_external; ++i) {<br>
&gt;&gt;                  /* For rank i in the new communicator, find the corresponding<br>
&gt;&gt;                     rank in the input communicator */<br>
&gt;&gt; -                MPID_VCR_Dup( comm-&gt;vcr[external_procs[i]],<br>
&gt;&gt; -&amp;comm-&gt;node_roots_comm-&gt;vcr[i] );<br>
&gt;&gt; +                MPID_VCR_Dup( comm-&gt;vcr, external_procs[i],<br>
&gt;&gt; +                              comm-&gt;node_roots_comm-&gt;vcr, i );<br>
&gt;&gt;              }<br>
&gt;&gt;<br>
&gt;&gt;              MPID_Dev_comm_create_hook( comm-&gt;node_roots_comm );<br>
&gt;&gt; @@ -1006,7 +1006,7 @@ int MPIR_Comm_copy( MPID_Comm *comm_ptr, int size, MPID_Comm **outcomm_ptr )<br>
&gt;&gt;      for (i=0; i&lt;size; i++) {<br>
&gt;&gt;          /* For rank i in the new communicator, find the corresponding<br>
&gt;&gt;             rank in the input communicator */<br>
&gt;&gt; -        MPID_VCR_Dup( comm_ptr-&gt;vcr[i],&amp;newcomm_ptr-&gt;vcr[i] );<br>
&gt;&gt; +        MPID_VCR_Dup( comm_ptr-&gt;vcr, i, newcomm_ptr-&gt;vcr, i );<br>
&gt;&gt;      }<br>
&gt;&gt;      }<br>
&gt;&gt;<br>
&gt;&gt; diff --git a/mpich2/src/mpi/comm/intercomm_create.c b/mpich2/src/mpi/comm/intercomm_create.c<br>
&gt;&gt; index e713830..0cb5c1e 100644<br>
&gt;&gt; --- a/mpich2/src/mpi/comm/intercomm_create.c<br>
&gt;&gt; +++ b/mpich2/src/mpi/comm/intercomm_create.c<br>
&gt;&gt; @@ -105,7 +105,7 @@ PMPI_LOCAL int MPID_GPID_GetAllInComm( MPID_Comm *comm_ptr, int local_size,<br>
&gt;&gt;<br>
&gt;&gt;      for (i=0; i&lt;comm_ptr-&gt;local_size; i++) {<br>
&gt;&gt;      *gpid++ = 0;<br>
&gt;&gt; -    (void)MPID_VCR_Get_lpid( comm_ptr-&gt;vcr[i], gpid );<br>
&gt;&gt; +    (void)MPID_VCR_Get_lpid( comm_ptr-&gt;vcr, i, gpid );<br>
&gt;&gt;      gpid++;<br>
&gt;&gt;      }<br>
&gt;&gt;      *singlePG = 1;<br>
&gt;&gt; @@ -140,8 +140,8 @@ PMPI_LOCAL int MPID_VCR_CommFromLpids( MPID_Comm *newcomm_ptr,<br>
&gt;&gt;      /* printf( &quot;[%d] Remote rank %d has lpid %d\n&quot;,<br>
&gt;&gt;         MPIR_Process.comm_world-&gt;rank, i, lpids[i] ); */<br>
&gt;&gt;      if (lpids[i]&lt;  commworld_ptr-&gt;remote_size) {<br>
&gt;&gt; -        MPID_VCR_Dup( commworld_ptr-&gt;vcr[lpids[i]],<br>
&gt;&gt; -            &amp;newcomm_ptr-&gt;vcr[i] );<br>
&gt;&gt; +        MPID_VCR_Dup( commworld_ptr-&gt;vcr, lpids[i],<br>
&gt;&gt; +              newcomm_ptr-&gt;vcr, i );<br>
&gt;&gt;      }<br>
&gt;&gt;      else {<br>
&gt;&gt;          /* We must find the corresponding vcr for a given lpid */<br>
&gt;&gt; @@ -163,7 +163,7 @@ PMPI_LOCAL int MPID_LPID_GetAllInComm( MPID_Comm *comm_ptr, int local_size,<br>
&gt;&gt;      /* FIXME: Should be using the local_size argument */<br>
&gt;&gt;      MPIU_Assert( comm_ptr-&gt;local_size == local_size );<br>
&gt;&gt;      for (i=0; i&lt;comm_ptr-&gt;local_size; i++) {<br>
&gt;&gt; -    (void)MPID_VCR_Get_lpid( comm_ptr-&gt;vcr[i],&amp;local_lpids[i] );<br>
&gt;&gt; +    (void)MPID_VCR_Get_lpid( comm_ptr-&gt;vcr, i,&amp;local_lpids[i] );<br>
&gt;&gt;      }<br>
&gt;&gt;      return 0;<br>
&gt;&gt;  }<br>
&gt;&gt; @@ -539,7 +539,7 @@ int MPI_Intercomm_create(MPI_Comm local_comm, int local_leader,<br>
&gt;&gt;      MPID_VCRT_Create( comm_ptr-&gt;local_size,&amp;newcomm_ptr-&gt;local_vcrt );<br>
&gt;&gt;      MPID_VCRT_Get_ptr( newcomm_ptr-&gt;local_vcrt,&amp;newcomm_ptr-&gt;local_vcr );<br>
&gt;&gt;      for (i=0; i&lt;comm_ptr-&gt;local_size; i++) {<br>
&gt;&gt; -    MPID_VCR_Dup( comm_ptr-&gt;vcr[i],&amp;newcomm_ptr-&gt;local_vcr[i] );<br>
&gt;&gt; +    MPID_VCR_Dup( comm_ptr-&gt;vcr, i, newcomm_ptr-&gt;local_vcr, i );<br>
&gt;&gt;      }<br>
&gt;&gt;<br>
&gt;&gt;      /* Inherit the error handler (if any) */<br>
&gt;&gt; diff --git a/mpich2/src/mpi/comm/intercomm_merge.c b/mpich2/src/mpi/comm/intercomm_merge.c<br>
&gt;&gt; index 8fae687..b672767 100644<br>
&gt;&gt; --- a/mpich2/src/mpi/comm/intercomm_merge.c<br>
&gt;&gt; +++ b/mpich2/src/mpi/comm/intercomm_merge.c<br>
&gt;&gt; @@ -227,11 +227,11 @@ int MPI_Intercomm_merge(MPI_Comm intercomm, int high, MPI_Comm *newintracomm)<br>
&gt;&gt;      /* remote group first */<br>
&gt;&gt;      j = 0;<br>
&gt;&gt;      for (i=0; i&lt;comm_ptr-&gt;remote_size; i++) {<br>
&gt;&gt; -        MPID_VCR_Dup( comm_ptr-&gt;vcr[i],&amp;newcomm_ptr-&gt;vcr[j++] );<br>
&gt;&gt; +        MPID_VCR_Dup( comm_ptr-&gt;vcr, i, newcomm_ptr-&gt;vcr, j++ );<br>
&gt;&gt;      }<br>
&gt;&gt;      for (i=0; i&lt;comm_ptr-&gt;local_size; i++) {<br>
&gt;&gt;          if (i == comm_ptr-&gt;rank) newcomm_ptr-&gt;rank = j;<br>
&gt;&gt; -        MPID_VCR_Dup( comm_ptr-&gt;local_vcr[i],&amp;newcomm_ptr-&gt;vcr[j++] );<br>
&gt;&gt; +        MPID_VCR_Dup( comm_ptr-&gt;local_vcr, i, newcomm_ptr-&gt;vcr, j++ );<br>
&gt;&gt;      }<br>
&gt;&gt;      }<br>
&gt;&gt;      else {<br>
&gt;&gt; @@ -239,10 +239,10 @@ int MPI_Intercomm_merge(MPI_Comm intercomm, int high, MPI_Comm *newintracomm)<br>
&gt;&gt;      j = 0;<br>
&gt;&gt;      for (i=0; i&lt;comm_ptr-&gt;local_size; i++) {<br>
&gt;&gt;          if (i == comm_ptr-&gt;rank) newcomm_ptr-&gt;rank = j;<br>
&gt;&gt; -        MPID_VCR_Dup( comm_ptr-&gt;local_vcr[i],&amp;newcomm_ptr-&gt;vcr[j++] );<br>
&gt;&gt; +        MPID_VCR_Dup( comm_ptr-&gt;local_vcr, i, newcomm_ptr-&gt;vcr, j++ );<br>
&gt;&gt;      }<br>
&gt;&gt;      for (i=0; i&lt;comm_ptr-&gt;remote_size; i++) {<br>
&gt;&gt; -        MPID_VCR_Dup( comm_ptr-&gt;vcr[i],&amp;newcomm_ptr-&gt;vcr[j++] );<br>
&gt;&gt; +        MPID_VCR_Dup( comm_ptr-&gt;vcr, i, newcomm_ptr-&gt;vcr, j++ );<br>
&gt;&gt;      }<br>
&gt;&gt;      }<br>
&gt;&gt;<br>
&gt;&gt; diff --git a/mpich2/src/mpi/group/grouputil.c b/mpich2/src/mpi/group/grouputil.c<br>
&gt;&gt; index dda81b3..963bad4 100644<br>
&gt;&gt; --- a/mpich2/src/mpi/group/grouputil.c<br>
&gt;&gt; +++ b/mpich2/src/mpi/group/grouputil.c<br>
&gt;&gt; @@ -383,7 +383,7 @@ int MPIR_GroupCheckVCRSubset( MPID_Group *group_ptr, int vsize, MPID_VCR *vcr,<br>
&gt;&gt;              vsize*sizeof(MPID_Group_pmap_t),mpi_errno, &quot;&quot; );<br>
&gt;&gt;      /* Initialize the vmap */<br>
&gt;&gt;      for (i=0; i&lt;vsize; i++) {<br>
&gt;&gt; -    MPID_VCR_Get_lpid( vcr[i],&amp;vmap[i].lpid );<br>
&gt;&gt; +    MPID_VCR_Get_lpid( vcr, i,&amp;vmap[i].lpid );<br>
&gt;&gt;      vmap[i].lrank     = i;<br>
&gt;&gt;      vmap[i].next_lpid = 0;<br>
&gt;&gt;      vmap[i].flag      = 0;<br>
&gt;&gt; diff --git a/mpich2/src/mpid/dcmfd/include/mpidi_hooks.h b/mpich2/src/mpid/dcmfd/include/mpidi_hooks.h<br>
&gt;&gt; index d7db400..9081a4a 100644<br>
&gt;&gt; --- a/mpich2/src/mpid/dcmfd/include/mpidi_hooks.h<br>
&gt;&gt; +++ b/mpich2/src/mpid/dcmfd/include/mpidi_hooks.h<br>
&gt;&gt; @@ -13,7 +13,8 @@<br>
&gt;&gt;  #define __include_mpidi_hooks_h__<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; -typedef dcmf_task_t         MPID_VCR;<br>
&gt;&gt; +typedef void                MPID_VCR;<br>
&gt;&gt; +typedef dcmf_task_t         MPIDI_VCR;<br>
&gt;&gt;  typedef struct MPIDI_VCRT * MPID_VCRT;<br>
&gt;&gt;<br>
&gt;&gt;  typedef size_t              MPIDI_msg_sz_t;<br>
&gt;&gt; diff --git a/mpich2/src/mpid/dcmfd/include/mpidi_macros.h b/mpich2/src/mpid/dcmfd/include/mpidi_macros.h<br>
&gt;&gt; index 3acd105..73f1be9 100644<br>
&gt;&gt; --- a/mpich2/src/mpid/dcmfd/include/mpidi_macros.h<br>
&gt;&gt; +++ b/mpich2/src/mpid/dcmfd/include/mpidi_macros.h<br>
&gt;&gt; @@ -232,7 +232,7 @@ MPIDI_Context_local(MPID_Request * req)<br>
&gt;&gt;<br>
&gt;&gt;  #define MPID_VCR_GET_LPID(vcr, index)           \<br>
&gt;&gt;  ({                                              \<br>
&gt;&gt; -  vcr[index];                                   \<br>
&gt;&gt; +  ((MPIDI_VCR*)vcr)[index];                     \<br>
&gt;&gt;  })<br>
&gt;&gt;  #define MPID_GPID_Get(comm_ptr, rank, gpid)             \<br>
&gt;&gt;  {                                                       \<br>
&gt;&gt; diff --git a/mpich2/src/mpid/dcmfd/src/mpid_init.c b/mpich2/src/mpid/dcmfd/src/mpid_init.c<br>
&gt;&gt; index 1a31681..4acdb13 100644<br>
&gt;&gt; --- a/mpich2/src/mpid/dcmfd/src/mpid_init.c<br>
&gt;&gt; +++ b/mpich2/src/mpid/dcmfd/src/mpid_init.c<br>
&gt;&gt; @@ -277,7 +277,7 @@ int MPID_Init(int * argc,<br>
&gt;&gt;    rc = MPID_VCRT_Get_ptr(comm-&gt;vcrt,&amp;comm-&gt;vcr);<br>
&gt;&gt;    MPID_assert(rc == MPI_SUCCESS);<br>
&gt;&gt;    for (i=0; i&lt;size; i++)<br>
&gt;&gt; -    comm-&gt;vcr[i] = i;<br>
&gt;&gt; +    ((MPIDI_VCR*)comm-&gt;vcr)[i] = i;<br>
&gt;&gt;<br>
&gt;&gt;     /* basically a noop for now */<br>
&gt;&gt;    MPIDI_Comm_create(comm);<br>
&gt;&gt; @@ -295,7 +295,7 @@ int MPID_Init(int * argc,<br>
&gt;&gt;    MPID_assert(rc == MPI_SUCCESS);<br>
&gt;&gt;    rc = MPID_VCRT_Get_ptr(comm-&gt;vcrt,&amp;comm-&gt;vcr);<br>
&gt;&gt;    MPID_assert(rc == MPI_SUCCESS);<br>
&gt;&gt; -  comm-&gt;vcr[0] = rank;<br>
&gt;&gt; +  ((MPIDI_VCR*)comm-&gt;vcr)[0] = rank;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;    /* ------------------------------- */<br>
&gt;&gt; diff --git a/mpich2/src/mpid/dcmfd/src/mpid_vc.c b/mpich2/src/mpid/dcmfd/src/mpid_vc.c<br>
&gt;&gt; index a106fc0..2fb4769 100644<br>
&gt;&gt; --- a/mpich2/src/mpid/dcmfd/src/mpid_vc.c<br>
&gt;&gt; +++ b/mpich2/src/mpid/dcmfd/src/mpid_vc.c<br>
&gt;&gt; @@ -17,20 +17,20 @@ struct MPIDI_VCRT<br>
&gt;&gt;  {<br>
&gt;&gt;    MPIU_OBJECT_HEADER;<br>
&gt;&gt;    unsigned size;          /**&lt;  Number of entries in the table */<br>
&gt;&gt; -  MPID_VCR vcr_table[0];  /**&lt;  Array of virtual connection references */<br>
&gt;&gt; +  MPIDI_VCR vcr_table[0]; /**&lt;  Array of virtual connection references */<br>
&gt;&gt;  };<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; -int MPID_VCR_Dup(MPID_VCR orig_vcr, MPID_VCR * new_vcr)<br>
&gt;&gt; +int MPID_VCR_Dup(const MPID_VCR *orig_vcr, unsigned origin_index, MPID_VCR *new_vcr, unsigned new_index)<br>
&gt;&gt;  {<br>
&gt;&gt; -    *new_vcr = orig_vcr;<br>
&gt;&gt; -    return MPI_SUCCESS;<br>
&gt;&gt; +  ((MPIDI_VCR*)new_vcr)[new_index] = MPID_VCR_GET_LPID(orig_vcr, origin_index);<br>
&gt;&gt; +  return MPI_SUCCESS;<br>
&gt;&gt;  }<br>
&gt;&gt;<br>
&gt;&gt; -int MPID_VCR_Get_lpid(MPID_VCR vcr, int * lpid_ptr)<br>
&gt;&gt; +int MPID_VCR_Get_lpid(MPID_VCR *vcr, unsigned index, int * lpid_ptr)<br>
&gt;&gt;  {<br>
&gt;&gt; -    *lpid_ptr = (int)vcr;<br>
&gt;&gt; -    return MPI_SUCCESS;<br>
&gt;&gt; +  *lpid_ptr = MPID_VCR_GET_LPID(vcr, index);<br>
&gt;&gt; +  return MPI_SUCCESS;<br>
&gt;&gt;  }<br>
&gt;&gt;<br>
&gt;&gt;  int MPID_VCRT_Create(int size, MPID_VCRT *vcrt_ptr)<br>
&gt;&gt; @@ -38,7 +38,7 @@ int MPID_VCRT_Create(int size, MPID_VCRT *vcrt_ptr)<br>
&gt;&gt;      struct MPIDI_VCRT * vcrt;<br>
&gt;&gt;      int result;<br>
&gt;&gt;<br>
&gt;&gt; -    vcrt = MPIU_Malloc(sizeof(struct MPIDI_VCRT) + size*sizeof(MPID_VCR));<br>
&gt;&gt; +    vcrt = MPIU_Malloc(sizeof(struct MPIDI_VCRT) + size*sizeof(MPIDI_VCR));<br>
&gt;&gt;      if (vcrt != NULL)<br>
&gt;&gt;      {<br>
&gt;&gt;          MPIU_Object_set_ref(vcrt, 1);<br>
&gt;<br>
&gt; --<br>
&gt; Pavan Balaji<br>
&gt; <a href="http://www.mcs.anl.gov/~balaji" target="_blank">http://www.mcs.anl.gov/~balaji</a><br>
</div></div></blockquote></div><br></div></div></div>