Hi again.
I adapted my testing program by overwriting the window buffer
complete with 1. This allows me to see at which places OpenMPI
writes.
The result is:
*** -DO1=1 -DV1=1 *** (displ 3,2,1,0 , MPI_Type_create_indexed_block)
mem[0] = { 0.0000, 0.0000, 0.0000}
mem[1] = { 0.0000, 0.0000, 0.0000}
mem[2] = { 0.0000, 0.0000, 0.0000}
mem[3] = { nan, nan, nan}
mem[4] = { nan, nan, nan}
mem[5] = { nan, nan, nan}
mem[6] = { nan, nan, nan}
mem[7] = { nan, nan, nan}
mem[8] = { nan, nan, nan}
mem[9] = { nan, nan, nan}
*** -DO1=1 -DV2=1 *** MPI_Type_contiguous(4, mpi_double3, &mpit)
mem[0] = { 0.0000, 1.0000, 2.0000}
mem[1] = { 3.0000, 4.0000, 5.0000}
mem[2] = { 6.0000, 7.0000, 8.0000}
mem[3] = { 9.0000, 10.0000, 11.0000}
mem[4] = { nan, nan, nan}
mem[5] = { nan, nan, nan}
mem[6] = { nan, nan, nan}
mem[7] = { nan, nan, nan}
mem[8] = { nan, nan, nan}
mem[9] = { nan, nan, nan}
*** -DO2=1 -DV1=1 *** (displ 0,1,2,3 , MPI_Type_create_indexed_block)
mem[0] = { 0.0000, 0.0000, 0.0000}
mem[1] = { 0.0000, 0.0000, 0.0000}
mem[2] = { 0.0000, 0.0000, 0.0000}
mem[3] = { 0.0000, 0.0000, 0.0000}
mem[4] = { nan, nan, nan}
mem[5] = { nan, nan, nan}
mem[6] = { nan, nan, nan}
mem[7] = { nan, nan, nan}
mem[8] = { nan, nan, nan}
mem[9] = { nan, nan, nan}
*** -DO2=1 -DV2=1 *** MPI_Type_contiguous(4, mpi_double3, &mpit)
mem[0] = { 0.0000, 1.0000, 2.0000}
mem[1] = { 3.0000, 4.0000, 5.0000}
mem[2] = { 6.0000, 7.0000, 8.0000}
mem[3] = { 9.0000, 10.0000, 11.0000}
mem[4] = { nan, nan, nan}
mem[5] = { nan, nan, nan}
mem[6] = { nan, nan, nan}
mem[7] = { nan, nan, nan}
mem[8] = { nan, nan, nan}
mem[9] = { nan, nan, nan}
Note that for the reversed ordering (3,2,1,0) only 3 lines are
written. If I use displacements 3,2,1,8
I get
*** -DO1=1 -DV1=1 ***
mem[0] = { 0.0000, 0.0000, 0.0000}
mem[1] = { 0.0000, 0.0000, 0.0000}
mem[2] = { 0.0000, 0.0000, 0.0000}
mem[3] = { nan, nan, nan}
mem[4] = { nan, nan, nan}
mem[5] = { nan, nan, nan}
mem[6] = { nan, nan, nan}
mem[7] = { nan, nan, nan}
mem[8] = { 0.0000, 0.0000, 0.0000}
mem[9] = { nan, nan, nan}
but 3,2,8,1 yields
*** -DO1=1 -DV1=1 ***
mem[0] = { 0.0000, 0.0000, 0.0000}
mem[1] = { 0.0000, 0.0000, 0.0000}
mem[2] = { 0.0000, 0.0000, 0.0000}
mem[3] = { nan, nan, nan}
mem[4] = { nan, nan, nan}
mem[5] = { nan, nan, nan}
mem[6] = { nan, nan, nan}
mem[7] = { nan, nan, nan}
mem[8] = { nan, nan, nan}
mem[9] = { nan, nan, nan}
Dorian
-----Ursprüngliche Nachricht-----
Von: "Dorian Krause" <doriankra...@web.de>
Gesendet: 12.12.08 13:49:25
An: Open MPI Users <us...@open-mpi.org>
Betreff: Re: [OMPI users] Onesided + derived datatypes
Thanks George (and Brian :)).
The MPI_Put error is gone. Did you take a look at the problem
that with the block_indexed type the PUT doesn't work? I'm
still getting the following output (V1 corresponds to the datatype
created with MPI_Type_create_indexed_block while the V2 type
is created with MPI_Type_contiguous, the ordering doesn't care
anymore after
your fix) which confuses me
because I remember that (on one machine) MPI_Put with
MPI_Type_create_indexed
worked until the invalid datatype error showed up (after a couple
of timesteps).
*** -DO1=1 -DV1=1 ***
mem[0] = { 0.0000, 0.0000, 0.0000}
mem[1] = { 0.0000, 0.0000, 0.0000}
mem[2] = { 0.0000, 0.0000, 0.0000}
mem[3] = { 0.0000, 0.0000, 0.0000}
mem[4] = { 0.0000, 0.0000, 0.0000}
mem[5] = { 0.0000, 0.0000, 0.0000}
mem[6] = { 0.0000, 0.0000, 0.0000}
mem[7] = { 0.0000, 0.0000, 0.0000}
mem[8] = { 0.0000, 0.0000, 0.0000}
mem[9] = { 0.0000, 0.0000, 0.0000}
*** -DO1=1 -DV2=1 ***
mem[0] = { 5.0000, 0.0000, 0.0000}
mem[1] = { 0.0000, 0.0000, -1.0000}
mem[2] = { 0.0000, 0.0000, 0.0000}
mem[3] = { 0.0000, 0.0000, 0.0000}
mem[4] = { 0.0000, 0.0000, 0.0000}
mem[5] = { 0.0000, 0.0000, 0.0000}
mem[6] = { 0.0000, 0.0000, 0.0000}
mem[7] = { 0.0000, 0.0000, 0.0000}
mem[8] = { 0.0000, 0.0000, 0.0000}
mem[9] = { 0.0000, 0.0000, 0.0000}
*** -DO2=1 -DV1=1 ***
mem[0] = { 0.0000, 0.0000, 0.0000}
mem[1] = { 0.0000, 0.0000, 0.0000}
mem[2] = { 0.0000, 0.0000, 0.0000}
mem[3] = { 0.0000, 0.0000, 0.0000}
mem[4] = { 0.0000, 0.0000, 0.0000}
mem[5] = { 0.0000, 0.0000, 0.0000}
mem[6] = { 0.0000, 0.0000, 0.0000}
mem[7] = { 0.0000, 0.0000, 0.0000}
mem[8] = { 0.0000, 0.0000, 0.0000}
mem[9] = { 0.0000, 0.0000, 0.0000}
*** -DO2=1 -DV2=1 ***
mem[0] = { 5.0000, 0.0000, 0.0000}
mem[1] = { 0.0000, 0.0000, -1.0000}
mem[2] = { 0.0000, 0.0000, 0.0000}
mem[3] = { 0.0000, 0.0000, 0.0000}
mem[4] = { 0.0000, 0.0000, 0.0000}
mem[5] = { 0.0000, 0.0000, 0.0000}
mem[6] = { 0.0000, 0.0000, 0.0000}
mem[7] = { 0.0000, 0.0000, 0.0000}
mem[8] = { 0.0000, 0.0000, 0.0000}
mem[9] = { 0.0000, 0.0000, 0.0000}
Thanks for your help.
Dorian
-----Ursprüngliche Nachricht-----
Von: "George Bosilca" <bosi...@eecs.utk.edu>
Gesendet: 12.12.08 01:35:57
An: Open MPI Users <us...@open-mpi.org>
Betreff: Re: [OMPI users] Onesided + derived datatypes
Dorian,
You are right, the datatype generated using the block_index
function
is a legal data-type. We wrongly determined some overlapping
regions
in the description [which is illegal based on the MPI standard].
The
detection of such overlapping regions being a very expensive
process
if we don't want any false positives (such as your datatype), I
prefer
to remove it completely.
To keep it short I just committed a patch (r20120) in the trunk,
and
I'll take care to move it in the 1.3 and the 1.2.9.
Thanks for your help,
george.
On Dec 10, 2008, at 18:07 , doriankrause wrote:
Hi List,
I have a MPI program which uses one sided communication with
derived
datatypes (MPI_Type_create_indexed_block). I developed the code
with
MPICH2 and unfortunately didn't thought about trying it out with
OpenMPI. Now that I'm "porting" the Application to OpenMPI I'm
facing
some problems. On the most machines I get an SIGSEGV in
MPI_Win_fence,
sometimes an invalid datatype shows up. I ran the program in
Valgrind
and didn't get anything valuable. Since I can't see a reason for
this
problem (at least if I understand the standard correctly), I
wrote the
attached testprogram.
Here are my experiences:
* If I compile without ONESIDED defined, everything works and V1
and
V2
give the same results
* If I compile with ONESIDED and V2 defined
(MPI_Type_contiguous) it
works.
* ONESIDED + V1 + O2: No errors but obviously nothing is send?
(Am I
in
assuming that V1+O2 and V2 should be equivalent?)
* ONESIDED + V1 + O1:
[m02:03115] *** An error occurred in MPI_Put
[m02:03115] *** on win
[m02:03115] *** MPI_ERR_TYPE: invalid datatype
[m02:03115] *** MPI_ERRORS_ARE_FATAL (goodbye)
I didn't get a segfault as in the "real life example" but if
ompitest.cc
is correct it means that OpenMPI is buggy when it comes to
onesided
communication and (some) derived datatypes, so that it is
probably not
of problem in my code.
I'm using OpenMPI-1.2.8 with the newest gcc 4.3.2 but the same
behaviour
can be be seen with gcc-3.3.1 and intel 10.1.
Please correct me if ompitest.cc contains errors. Otherwise I
would be
glad to hear how I should report these problems to the
develepors (if
they don't read this).
Thanks + best regards
Dorian
<ompitest.tar.gz>_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users
_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users
____________________________________________________________________
Psssst! Schon vom neuen WEB.DE MultiMessenger gehört?
Der kann`s mit allen: http://www.produkte.web.de/messenger/?did=3123
_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users
____________________________________________________________________
Psssst! Schon vom neuen WEB.DE MultiMessenger gehört?
Der kann`s mit allen: http://www.produkte.web.de/messenger/?did=3123
_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users