Is there a reason to convert your code from send/receive to put/get? The performance may not be that significantly different, and as you have noted, the MPI-2 put/get semantics are a total nightmare to understand (I personally advise people not to use them -- MPI-3 is cleaning up the put/get semantics a LOT).
On Dec 15, 2010, at 3:15 PM, Grismer, Matthew J Civ USAF AFMC AFRL/RBAT wrote: > I am trying to modify the communication routines in our code to use > MPI_Put's instead of sends and receives. This worked fine for several > variable Put's, but now I have one that is causing seg faults. Reading > through the MPI documentation it is not clear to me if what I am doing > is permissible or not. Basically, the question is this - if I have > defined all of an array as a window on each processor, can I PUT data > from that array to remote processes at the same time as the remote > processes are PUTing into the local copy, assuming no overlaps of any of > the PUTs? > > Here are the details if that doesn't make sense. I have a (Fortran) > array QF(6,2,N) on each processor, where N could be a very large number > (100,000). I create a window QFWIN on the entire array on all the > processors. I define MPI_Type_indexed "sending" datatypes (QFSND) with > block lengths of 6 that send from QF(1,1,*), and MPI_Type_indexed > "receiving" datatypes (QFREC) with block lengths of 6 the receive into > QF(1,2,*). Here * is non-repeating set of integers up to N. I create > groups of processors that communicate, where these groups will all > exchange QF data, PUTing local QF(1,1,*) to remote QF(1,2,*). So, > processor 1 is PUTing QF data to processors 2,3,4 at the same time 2,3,4 > are putting their QF data to 1, and so on. Processors 2,3,4 are PUTing > into non-overlapping regions of QF(1,2,*) on 1, and 1 is PUTing from > QF(1,1,*) to 2,3,4, and so on. So, my calls look like this on each > processor: > > assertion = 0 > call MPI_Win_post(group, assertion, QFWIN, ierr) > call MPI_Win_start(group, assertion, QFWIN, ierr) > > do I=1,neighbors > call MPI_Put(QF, 1, QFSND(I), NEIGHBOR(I), 0, 1, QFREC(I), QFWIN, > ierr) > end do > > call MPI_Win_complete(QFWIN,ierr) > call MPI_Win_wait(QFWIN,ierr) > > Note I did define QFREC locally on each processor to properly represent > where the data was going on the remote processors. The error value > ierr=0 after MPI_Win_post, MPI_Win_start, MPI_Put, and MPI_Win_complete, > and the code seg faults in MPI_Win_wait. > > I'm using Open MPI 1.4.3 on Mac OS X 10.6.5, built with Intel XE (12.0) > compilers, and running on just 2 (internal) processors of my Mac Pro. > The code ran normally with this configuration up until the point I put > the above in. Several other communications with MPI_Put similar to the > above work fine, though the windows are only on a subset of the > communicated array, and the origin data is being PUT from part of the > array that is not within the window. > _____________________________________________________ > Matt > > > > _______________________________________________ > users mailing list > us...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/users -- Jeff Squyres jsquy...@cisco.com For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/