<div dir="ltr"><div><div><div>Thank you both Pavan and rr,<br><br></div>I thought working with a pointer to the window would be safer since my code should _never_ work with the window itself. Not initializing a pointer is bad practice, and nullifying the pointer trips hard-coded errors in the MPI source (I'm not sure why). I modified the design to feed a reference to MPI_Win_allocate_shared() and the window itself to MPI_Win_shared_query(). Do either of you know why MPI_Win_shared_query() requires the MPI_Win variable to exist prior to allocating the space (or can point me to an appropriate resource)? The MPI 3.0 specification seems to indicate the possibility that the function allocates the window and passes a pointer back to the user.<br>
</div><div><br></div>My barriers did indeed need repositioning - thanks rr.<br><br></div>I'm not sure how I overlooked passing my array pointer by reference. That seemed to be the most egregious issue. The complaints from MPI_Finalize() were because I did not free the window and communicator as I should have. Thanks Pavan.<br>
<div><div><div><div><div><div><div><br></div><div>I'll include the modified test example which works as intended.<br></div><div><br>The point of allocating shared memory was to remove all instances of synchronization except initialization. I'm never doing MPI RMA via MPI calls - I'm opting to use direct access. This is particularly important for my application, since it is a hybrid between memory bound functions and CPU bound functions.<br>
<br></div><div>Thanks,<br></div><div>Jonathan<br><br><br><br></div><div>[begin file test.cpp]<br>#include <stdlib.h><br>#include <stdio.h><br>#include <mpi.h><br><br>using namespace std;<br><br>int main(int argc, char *argv[]){<br>
<br>  int rank;<br>  int color = 1;<br>  int ierr;<br>  int *arr = NULL;<br>  int disp_unit;<br><br>  MPI_Aint size = 2048;<br>  MPI_Aint reportedSize = 0;<br>  MPI_Comm comm;<br>  MPI_Win win;<br><br>  ierr = MPI_Init( &argc, &argv );<br>
  ierr = MPI_Comm_rank( MPI_COMM_WORLD, &rank );<br>  ierr = MPI_Comm_split( MPI_COMM_WORLD, color, rank, &comm );<br><br>  if (rank == 0){<br>    ierr = MPI_Win_allocate_shared( \<br>      size, \<br>      (int) sizeof(int), \<br>
      MPI_INFO_NULL, \<br>      comm, \<br>      (void *) &arr, \<br>      &win );<br><br>    printf( "Rank: %i ierr from MPI_Win_allocate_shared = %i\n", rank, ierr);<br><br>    for (int i=0; i < size; i++){<br>
      arr[i] = i;<br>    }<br><br>    printf( "Rank: %i arr[0] = %i, arr[1] = %i\n", rank, arr[0], arr[1] );<br><br>    ierr = MPI_Barrier( comm );<br><br>    ierr = MPI_Barrier( comm );<br>  }<br>  else{<br>    ierr = MPI_Win_allocate_shared( \<br>
      (MPI_Aint) 0, \<br>      (int) sizeof(int), \<br>      MPI_INFO_NULL, \<br>      comm, \<br>      (void *) &arr, \<br>      &win );<br><br>    printf( "Rank: %i ierr from MPI_Win_allocate_shared = %i\n", rank, ierr);<br>
<br>    ierr = MPI_Win_shared_query( \<br>      win, \<br>      (int) 0, \<br>      &reportedSize, \<br>      &disp_unit, \<br>      (void *) &arr );<br><br>    printf( "Rank: %i ierr from MPI_Win_shared_query = %i\n", rank, ierr);<br>
    printf( "Rank: %i reportedSize = %i\n", rank, (int) reportedSize);<br>    printf( "Rank: %i disp_unit = %i\n", rank, disp_unit);<br><br>    ierr = MPI_Barrier( comm );<br><br>    printf( "Rank: %i arr[0] = %i, arr[1] = %i\n", rank, arr[0], arr[1] );<br>
<br>    ierr = MPI_Barrier( comm );<br>  }<br><br>  MPI_Win_free( &win );<br>  MPI_Comm_free( &comm );<br>  ierr = MPI_Finalize();<br>  return 0;<br>}<br></div><div>[end file test.cpp]<br></div></div></div></div></div>
</div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Jul 26, 2014 at 9:46 AM, Balaji, Pavan <span dir="ltr"><<a href="mailto:balaji@anl.gov" target="_blank">balaji@anl.gov</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Jonathan,<br>
<br>
There are several errors in the code.<br>
<br>
Why is the window malloc(0)’ed?  The window is created by Win_allocate_shared.<br>
<br>
You need to do a barrier after all accesses to the window.  Otherwise, another process might free the shared memory while you are accessing it.<br>
<br>
You need to have a bunch of Win_sync’s after each process has done its writes and before processes do their reads.<br>
<br>
You need to free the Window using MPI_Win_free.<br>
<br>
You should free your communicator, otherwise it’s a resource leak.<br>
<br>
The argument to be passed for your array should be &arr, not arr, since arr is an OUT parameter.<br>
<br>
I’d recommend taking one of the code examples in test/mpi/rma and modifying it to what you need.  That way the code would be standard compliant.<br>
<br>
Regards,<br>
<br>
  — Pavan<br>
<div><div class="h5"><br>
On Jul 25, 2014, at 11:07 PM, Jonathan Blair <<a href="mailto:qbit@utexas.edu">qbit@utexas.edu</a>> wrote:<br>
<br>
> Hi MPICH users,<br>
><br>
> I've been having issues with MPI_Win_allocate_shared(). I believe my use case is compliant with the standard, but I am not ruling out ignorance on my part as the fault.<br>
><br>
> In my project, one task allocates the memory to be shared, and the other tasks attach to the shared memory. The allocation function returns MPI_SUCCESS, as do all calls of MPI_Win_shared_query(). The size and displacement unit match expected values. However, the picture of the memory is nonuniform.<br>

><br>
> I'm running this on a shared memory system (the communicator is intra-node, currently being tested on a desktop), with MPICH 3.1.2 installed, passing all internal tests during installation.<br>
><br>
> I notice that MPI_Free_mem() reports errors and I believe MPI_Finalize() causes a segfault, but I'm not sure if this is specifically related to the issue at hand.<br>
><br>
> I have included a minimal test case below. Does anyone have any insight into my problem?<br>
><br>
> Thanks for you input,<br>
> Jonathan<br>
><br>
><br>
> [begin file test.cpp]<br>
> #include <stdlib.h><br>
> #include <stdio.h><br>
> #include <mpi.h><br>
><br>
> using namespace std;<br>
><br>
> int main(int argc, char *argv[]){<br>
><br>
>  int rank;<br>
>  int color = 1;<br>
>  int ierr;<br>
>  int *arr = (int *) malloc( 0 );<br>
>  int disp_unit;<br>
><br>
>  MPI_Aint size = 2048;<br>
>  MPI_Aint reportedSize = 0;<br>
>  MPI_Comm comm;<br>
><br>
>  ierr = MPI_Init( &argc, &argv );<br>
>  ierr = MPI_Comm_rank( MPI_COMM_WORLD, &rank );<br>
>  ierr = MPI_Comm_split( MPI_COMM_WORLD, color, rank, &comm );<br>
><br>
>  MPI_Win *win = (MPI_Win *) malloc( 0 );<br>
><br>
>  if (rank == 0){<br>
>    ierr = MPI_Win_allocate_shared( \<br>
>      size, \<br>
>      (int) sizeof(int), \<br>
>      MPI_INFO_NULL, \<br>
>      comm, \<br>
>      (void *) arr, \<br>
>      win );<br>
><br>
>    printf( "Rank: %i ierr from MPI_Win_allocate_shared = %i\n", rank, ierr);<br>
><br>
>    ierr = MPI_Barrier( comm );<br>
><br>
>    for (int i=0; i < size; i++){<br>
>      arr[i] = i;<br>
>    }<br>
><br>
>    printf( "Rank: %i arr[0] = %i, arr[1] = %i\n", rank, arr[0], arr[1] );<br>
><br>
>    ierr = MPI_Barrier( comm );<br>
>  }<br>
>  else{<br>
>    ierr = MPI_Win_allocate_shared( \<br>
>      (MPI_Aint) 0, \<br>
>      (int) sizeof(int), \<br>
>      MPI_INFO_NULL, \<br>
>      comm, \<br>
>      (void *) arr, \<br>
>      win );<br>
><br>
>    printf( "Rank: %i ierr from MPI_Win_allocate_shared = %i\n", rank, ierr);<br>
><br>
>    ierr = MPI_Win_shared_query( \<br>
>      *win, \<br>
>      (int) 0, \<br>
>      &reportedSize, \<br>
>      &disp_unit, \<br>
>      (void *) arr );<br>
><br>
>    printf( "Rank: %i ierr from MPI_Win_shared_query = %i\n", rank, ierr);<br>
>    printf( "Rank: %i reportedSize = %i\n", rank, (int) reportedSize);<br>
>    printf( "Rank: %i disp_unit = %i\n", rank, disp_unit);<br>
><br>
>    ierr = MPI_Barrier( comm );<br>
><br>
>    ierr = MPI_Barrier( comm );<br>
>    printf( "Rank: %i arr[0] = %i, arr[1] = %i\n", rank, arr[0], arr[1] );<br>
>  }<br>
><br>
>  MPI_Free_mem((void *) win);<br>
>  ierr = MPI_Finalize();<br>
>  return 0;<br>
> }<br>
> [end file test.cpp]<br>
><br>
><br>
><br>
> [begin shell output]<br>
> $ mpirun -n 2 ./test<br>
> Rank: 0 ierr from MPI_Win_allocate_shared = 0<br>
> Rank: 1 ierr from MPI_Win_allocate_shared = 0<br>
> Rank: 1 ierr from MPI_Win_shared_query = 0<br>
> Rank: 1 reportedSize = 2048<br>
> Rank: 1 disp_unit = 4<br>
> Rank: 0 arr[0] = 0, arr[1] = 1<br>
> Rank: 1 arr[0] = 1996775424, arr[1] = 32592<br>
> [0] Block at address 0x000000000093f190 is corrupted; cannot free;<br>
> may be block not allocated with MPL_trmalloc or MALLOC<br>
> called in /path/to/mpich-3.1.2/src/mpid/ch3/src/ch3u_rma_ops.c at line 493<br>
> [1] Block at address 0x0000000000ec8190 is corrupted; cannot free;<br>
> may be block not allocated with MPL_trmalloc or MALLOC<br>
> called in /path/to/mpich-3.1.2/src/mpid/ch3/src/ch3u_rma_ops.c at line 493<br>
> [1] 56 at [0x0000000000eccb78], ich-3.1.2/src/util/wrappers/mpiu_shm_wrappers.h[188]<br>
> [1] 24 at [0x0000000000eccab8], ich-3.1.2/src/util/wrappers/mpiu_shm_wrappers.h[217]<br>
> [1] 56 at [0x0000000000ecc9d8], ich-3.1.2/src/util/wrappers/mpiu_shm_wrappers.h[188]<br>
> [1] 24 at [0x0000000000ecc918], ich-3.1.2/src/util/wrappers/mpiu_shm_wrappers.h[217]<br>
> [1] 8 at [0x0000000000ecc788], src/mpid/ch3/channels/nemesis/src/ch3_win_fns.c[131]<br>
> [1] 8 at [0x0000000000eca3a8], src/mpid/ch3/channels/nemesis/src/ch3_win_fns.c[127]<br>
> [1] 8 at [0x0000000000ec74e8], src/mpid/ch3/channels/nemesis/src/ch3_win_fns.c[123]<br>
> [1] 16 at [0x0000000000ecc6c8], src/mpid/ch3/channels/nemesis/src/ch3_win_fns.c[120]<br>
> [1] 16 at [0x0000000000ecc608], src/mpid/ch3/channels/nemesis/src/ch3_win_fns.c[117]<br>
> [1] 16 at [0x0000000000ecc548], src/mpid/ch3/channels/nemesis/src/ch3_win_fns.c[113]<br>
> [1] 48 at [0x0000000000ecbe98], h/mpich/mpich-3.1.2/src/mpid/ch3/src/mpid_rma.c[301]<br>
> [1] 32 at [0x0000000000ecc478], ch/mpich/mpich-3.1.2/src/mpid/ch3/src/mpid_vc.c[122]<br>
> [1] 8 at [0x0000000000ecc2f8], mpich/mpich-3.1.2/src/util/procmap/local_proc.c[93]<br>
> [1] 8 at [0x0000000000ecc248], mpich/mpich-3.1.2/src/util/procmap/local_proc.c[92]<br>
> [1] 32 at [0x0000000000ecc3a8], ch/mpich/mpich-3.1.2/src/mpid/ch3/src/mpid_vc.c[122]<br>
> [1] 8 at [0x0000000000ecc198], mpich/mpich-3.1.2/src/util/procmap/local_proc.c[93]<br>
> [1] 8 at [0x0000000000ecc0e8], mpich/mpich-3.1.2/src/util/procmap/local_proc.c[92]<br>
> [1] 32 at [0x0000000000ecc018], ch/mpich/mpich-3.1.2/src/mpid/ch3/src/mpid_vc.c[122]<br>
> [1] 504 at [0x0000000000ecafc8], earch/mpich/mpich-3.1.2/src/mpi/comm/commutil.c[281]<br>
> [1] 504 at [0x0000000000ecaa88], earch/mpich/mpich-3.1.2/src/mpi/comm/commutil.c[281]<br>
><br>
> ===================================================================================<br>
> =   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES<br>
> =   PID 8822 RUNNING AT Machine<br>
> =   EXIT CODE: 139<br>
> =   CLEANING UP REMAINING PROCESSES<br>
> =   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES<br>
> ===================================================================================<br>
> YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)<br>
> This typically refers to a problem with your application.<br>
> Please see the FAQ page for debugging suggestions<br>
> [end shell output]<br>
</div></div><div class="">> _______________________________________________<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" target="_blank">https://lists.mpich.org/mailman/listinfo/discuss</a><br>
<br>
</div>--<br>
Pavan Balaji  ✉️<br>
<a href="http://www.mcs.anl.gov/~balaji" target="_blank">http://www.mcs.anl.gov/~balaji</a><br>
<div class="HOEnZb"><div class="h5"><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" target="_blank">https://lists.mpich.org/mailman/listinfo/discuss</a></div></div></blockquote></div><br><br clear="all"><br>-- <br><div dir="ltr">
      Jonathan Blair<br>
      College of Natural Sciences | Physics - Computation | Mathematics<br>
      The University of Texas at Austin<br>
      512-230-0543 | <a href="mailto:qbit@utexas.edu" target="_blank">qbit@utexas.edu</a></div>
</div>