Re: [OMPI users] OMPI users] MPI_Type_Create_Struct + MPI_TYPE_CREATE_RESIZED

2015-01-04 Thread Diego Avesani
Dear Gilles, Dear all,

in the attachment you can find the program.

What do you meam "remove mpi_get_address(dummy) from all displacements".

Thanks for all your help

Diego



Diego


On 3 January 2015 at 00:45, Gilles Gouaillardet <
gilles.gouaillar...@gmail.com> wrote:

> Diego,
>
> George gave you the solution,
>
> The snippet you posted has two mistakes
> You did not remove mpi_get_address(dummy) from all displacements
> (See my previous reply)
> You pass incorrect values to mpi_type_create_resized
>
> Can you post a trimmed version of your program instead of a snippet ?
>
> Gus is right about using double precision vs real and -r8
>
> Cheers,
>
> Gilles
>
> Diego Avesani さんのメール:
> Dear Gilles Dear all,
>
> I have done all that to avoid to pedding an integer, as suggested by
> George.
> I define tParticle as a common object.
> I am using Intel fortran compiler.
>
> George suggests:
>
> *"" The displacements are relative to the benign of your particle type.
> Thus the first one is not 0 but the displacement of “integer :: ip” due to
> the fact that the compiler is allowed to introduce gaps in order to better
> align.*
>
> *  DISPLACEMENTS(1)=MPI_GET_ADDRESS(dummy%ip)*
> *  DISPLACEMENTS(2)=**MPI_GET_ADDRESS(dummy%RP[1])*
>
> *  DISPLACEMENTS(3)=**MPI_GET_ADDRESS(dummy%QQ[1])*
>
> *and then remove the MPI_GET_ADDRESS(dummy) from all of them.*
>
> *3. After creating the structure type you need to resize it in order to
> correctly determine the span of the entire structure, and how an array of
> such structures lays in memory. Something like:*
> *MPI_TYPE_CREATE_RESIZED(old type, DISPLACEMENT(1),*
> *   MPI_GET_ADDRESS(dummy[2]) - MPI_GET_ADDRESS(dummy[1]), newt) ""*
>
> What do you think?
> George, Did i miss something?
>
> Thanks a lot
>
>
>
> Diego
>
>
> On 2 January 2015 at 12:51, Gilles Gouaillardet <
> gilles.gouaillar...@gmail.com> wrote:
>
>> Diego,
>>
>> First, i recommend you redefine tParticle and add a padding integer so
>> everything is aligned.
>>
>>
>> Before invoking MPI_Type_create_struct, you need to
>> call MPI_Get_address(dummy, base, MPI%err)
>> displacements = displacements - base
>>
>> MPI_Type_create_resized might be unnecessary if tParticle is aligned
>> And the lower bound should be zero.
>>
>> BTW, which compiler are you using ?
>> Is tParticle object a common ?
>> iirc, intel compiler aligns types automatically, but not commons, and
>> that means MPI_Type_create_struct is not aligned as it should most of the
>> time.
>>
>> Cheers,
>>
>> Gilles
>>
>> Diego Avesani さんのメール:
>>
>> dear all,
>>
>> I have a problem with MPI_Type_Create_Struct and MPI_TYPE_CREATE_RESIZED.
>>
>> I have this variable type:
>>
>> *  TYPE tParticle*
>> * INTEGER  :: ip*
>> * REAL :: RP(2)*
>> * REAL :: QQ(2)*
>> *  ENDTYPE tParticle*
>>
>> Then I define:
>>
>> Nstruct=3
>> *ALLOCATE(TYPES(Nstruct))*
>> *ALLOCATE(LENGTHS(Nstruct))*
>> *ALLOCATE(DISPLACEMENTS(Nstruct))*
>> *!set the types*
>> *TYPES(1) = MPI_INTEGER*
>> *TYPES(2) = MPI_DOUBLE_PRECISION*
>> *TYPES(3) = MPI_DOUBLE_PRECISION*
>> *!set the lengths*
>> *LENGTHS(1) = 1*
>> *LENGTHS(2) = 2*
>> *LENGTHS(3) = 2*
>>
>> As gently suggested by Nick Papior Andersen and George Bosilca some
>> months ago, I checked the variable adress to resize my struct variable to
>> avoid empty space and
>> to have a more general definition.
>>
>> * !*
>> * CALL MPI_GET_ADDRESS(dummy%ip,DISPLACEMENTS(1), MPI%iErr)*
>> * CALL MPI_GET_ADDRESS(dummy%RP(1), DISPLACEMENTS(2), MPI%iErr)*
>> * CALL MPI_GET_ADDRESS(dummy%QQ(1), DISPLACEMENTS(3), MPI%iErr)*
>> * !*
>> * CALL
>> MPI_Type_Create_Struct(Nstruct,LENGTHS,DISPLACEMENTS,TYPES,MPI_PARTICLE_TYPE_OLD,MPI%iErr)*
>> * CALL MPI_Type_Commit(MPI_PARTICLE_TYPE_OLD,MPI%iErr)*
>> * !*
>> * CALL MPI_TYPE_CREATE_RESIZED(MPI_PARTICLE_TYPE_OLD,
>> DISPLACEMENTS(1),DISPLACEMENTS(2) - DISPLACEMENTS(1), MPI_PARTICLE_TYPE)*
>>
>>
>> This does not work. When my program run, I get an error:
>>
>> *forrtl: severe (174): SIGSEGV, segmentation fault occurred.*
>>
>> I have read the manual but probably I am not able to understand
>> *MPI_TYPE_CREATE_RESIZED. *
>>
>> Someone could help me?
>>
>>
>> Thanks a lot
>> Diego
>>
>>
>> Diego
>>
>>
>> ___
>> users mailing list
>> us...@open-mpi.org
>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
>> Link to this post:
>> http://www.open-mpi.org/community/lists/users/2015/01/26092.php
>>
>
>
> ___
> users mailing list
> us...@open-mpi.org
> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
> Link to this post:
> http://www.open-mpi.org/community/lists/users/2015/01/26097.php
>
MODULE MOD_PRECISION
integer, parameter :: dp = selected_real_kind(p=16)
ENDMODULE

PROGRAM PROVA_STRUCT
USE MOD_PRECISION
IMPLICIT NONE
INCLUDE 'mpif.h'
!
TYPE tMPI
INTEGER  :: myrank, nCPU, iErr, status
END TYPE tMPI
!
type particle
 sequence
 integer  :: ip
 real(dp)

Re: [OMPI users] OMPI users] MPI_Type_Create_Struct + MPI_TYPE_CREATE_RESIZED

2015-01-04 Thread Gilles Gouaillardet
Diego,

here is an updated revision i will double check tomorrow
/* i dit not test it yet, so forgive me it it does not compile/work */

Cheers,

Gilles

On Sun, Jan 4, 2015 at 6:48 PM, Diego Avesani 
wrote:

> Dear Gilles, Dear all,
>
> in the attachment you can find the program.
>
> What do you meam "remove mpi_get_address(dummy) from all displacements".
>
> Thanks for all your help
>
> Diego
>
>
>
> Diego
>
>
> On 3 January 2015 at 00:45, Gilles Gouaillardet <
> gilles.gouaillar...@gmail.com> wrote:
>
>> Diego,
>>
>> George gave you the solution,
>>
>> The snippet you posted has two mistakes
>> You did not remove mpi_get_address(dummy) from all displacements
>> (See my previous reply)
>> You pass incorrect values to mpi_type_create_resized
>>
>> Can you post a trimmed version of your program instead of a snippet ?
>>
>> Gus is right about using double precision vs real and -r8
>>
>> Cheers,
>>
>> Gilles
>>
>> Diego Avesani さんのメール:
>> Dear Gilles Dear all,
>>
>> I have done all that to avoid to pedding an integer, as suggested by
>> George.
>> I define tParticle as a common object.
>> I am using Intel fortran compiler.
>>
>> George suggests:
>>
>> *"" The displacements are relative to the benign of your particle type.
>> Thus the first one is not 0 but the displacement of “integer :: ip” due to
>> the fact that the compiler is allowed to introduce gaps in order to better
>> align.*
>>
>> *  DISPLACEMENTS(1)=MPI_GET_ADDRESS(dummy%ip)*
>> *  DISPLACEMENTS(2)=**MPI_GET_ADDRESS(dummy%RP[1])*
>>
>> *  DISPLACEMENTS(3)=**MPI_GET_ADDRESS(dummy%QQ[1])*
>>
>> *and then remove the MPI_GET_ADDRESS(dummy) from all of them.*
>>
>> *3. After creating the structure type you need to resize it in order to
>> correctly determine the span of the entire structure, and how an array of
>> such structures lays in memory. Something like:*
>> *MPI_TYPE_CREATE_RESIZED(old type, DISPLACEMENT(1),*
>> *   MPI_GET_ADDRESS(dummy[2]) - MPI_GET_ADDRESS(dummy[1]), newt) ""*
>>
>> What do you think?
>> George, Did i miss something?
>>
>> Thanks a lot
>>
>>
>>
>> Diego
>>
>>
>> On 2 January 2015 at 12:51, Gilles Gouaillardet <
>> gilles.gouaillar...@gmail.com> wrote:
>>
>>> Diego,
>>>
>>> First, i recommend you redefine tParticle and add a padding integer so
>>> everything is aligned.
>>>
>>>
>>> Before invoking MPI_Type_create_struct, you need to
>>> call MPI_Get_address(dummy, base, MPI%err)
>>> displacements = displacements - base
>>>
>>> MPI_Type_create_resized might be unnecessary if tParticle is aligned
>>> And the lower bound should be zero.
>>>
>>> BTW, which compiler are you using ?
>>> Is tParticle object a common ?
>>> iirc, intel compiler aligns types automatically, but not commons, and
>>> that means MPI_Type_create_struct is not aligned as it should most of the
>>> time.
>>>
>>> Cheers,
>>>
>>> Gilles
>>>
>>> Diego Avesani さんのメール:
>>>
>>> dear all,
>>>
>>> I have a problem with MPI_Type_Create_Struct and MPI_TYPE_CREATE_RESIZED.
>>>
>>> I have this variable type:
>>>
>>> *  TYPE tParticle*
>>> * INTEGER  :: ip*
>>> * REAL :: RP(2)*
>>> * REAL :: QQ(2)*
>>> *  ENDTYPE tParticle*
>>>
>>> Then I define:
>>>
>>> Nstruct=3
>>> *ALLOCATE(TYPES(Nstruct))*
>>> *ALLOCATE(LENGTHS(Nstruct))*
>>> *ALLOCATE(DISPLACEMENTS(Nstruct))*
>>> *!set the types*
>>> *TYPES(1) = MPI_INTEGER*
>>> *TYPES(2) = MPI_DOUBLE_PRECISION*
>>> *TYPES(3) = MPI_DOUBLE_PRECISION*
>>> *!set the lengths*
>>> *LENGTHS(1) = 1*
>>> *LENGTHS(2) = 2*
>>> *LENGTHS(3) = 2*
>>>
>>> As gently suggested by Nick Papior Andersen and George Bosilca some
>>> months ago, I checked the variable adress to resize my struct variable to
>>> avoid empty space and
>>> to have a more general definition.
>>>
>>> * !*
>>> * CALL MPI_GET_ADDRESS(dummy%ip,DISPLACEMENTS(1), MPI%iErr)*
>>> * CALL MPI_GET_ADDRESS(dummy%RP(1), DISPLACEMENTS(2), MPI%iErr)*
>>> * CALL MPI_GET_ADDRESS(dummy%QQ(1), DISPLACEMENTS(3), MPI%iErr)*
>>> * !*
>>> * CALL
>>> MPI_Type_Create_Struct(Nstruct,LENGTHS,DISPLACEMENTS,TYPES,MPI_PARTICLE_TYPE_OLD,MPI%iErr)*
>>> * CALL MPI_Type_Commit(MPI_PARTICLE_TYPE_OLD,MPI%iErr)*
>>> * !*
>>> * CALL MPI_TYPE_CREATE_RESIZED(MPI_PARTICLE_TYPE_OLD,
>>> DISPLACEMENTS(1),DISPLACEMENTS(2) - DISPLACEMENTS(1), MPI_PARTICLE_TYPE)*
>>>
>>>
>>> This does not work. When my program run, I get an error:
>>>
>>> *forrtl: severe (174): SIGSEGV, segmentation fault occurred.*
>>>
>>> I have read the manual but probably I am not able to understand
>>> *MPI_TYPE_CREATE_RESIZED. *
>>>
>>> Someone could help me?
>>>
>>>
>>> Thanks a lot
>>> Diego
>>>
>>>
>>> Diego
>>>
>>>
>>> ___
>>> users mailing list
>>> us...@open-mpi.org
>>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
>>> Link to this post:
>>> http://www.open-mpi.org/community/lists/users/2015/01/26092.php
>>>
>>
>>
>> ___
>> users mailing list
>> us...@open-mpi.org
>> Subscription: http://www.open-mpi.org/mailman/l

Re: [OMPI users] OMPI users] MPI_Type_Create_Struct + MPI_TYPE_CREATE_RESIZED

2015-01-04 Thread Diego Avesani
Dear Gilles, Dear all,

It works. The only thing that is missed is:

*CALL MPI_Finalize(MPI%iErr)*

at the end of the program.

Now, I have to test it sending some data from a processor to another.
I would like to ask you if you could explain me what you have done.
I wrote in the program:

*   IF(MPI%myrank==1)THEN*
*  WRITE(*,*) DISPLACEMENTS*
*   ENDIF*

and the results is:

   *139835891001320  -139835852218120  -139835852213832*
*  -139835852195016   8030673735967299609*

I am not able to understand it.

Thanks a lot.

In the attachment you can find the program








Diego


On 4 January 2015 at 12:10, Gilles Gouaillardet <
gilles.gouaillar...@gmail.com> wrote:

> Diego,
>
> here is an updated revision i will double check tomorrow
> /* i dit not test it yet, so forgive me it it does not compile/work */
>
> Cheers,
>
> Gilles
>
> On Sun, Jan 4, 2015 at 6:48 PM, Diego Avesani 
> wrote:
>
>> Dear Gilles, Dear all,
>>
>> in the attachment you can find the program.
>>
>> What do you meam "remove mpi_get_address(dummy) from all displacements".
>>
>> Thanks for all your help
>>
>> Diego
>>
>>
>>
>> Diego
>>
>>
>> On 3 January 2015 at 00:45, Gilles Gouaillardet <
>> gilles.gouaillar...@gmail.com> wrote:
>>
>>> Diego,
>>>
>>> George gave you the solution,
>>>
>>> The snippet you posted has two mistakes
>>> You did not remove mpi_get_address(dummy) from all displacements
>>> (See my previous reply)
>>> You pass incorrect values to mpi_type_create_resized
>>>
>>> Can you post a trimmed version of your program instead of a snippet ?
>>>
>>> Gus is right about using double precision vs real and -r8
>>>
>>> Cheers,
>>>
>>> Gilles
>>>
>>> Diego Avesani さんのメール:
>>> Dear Gilles Dear all,
>>>
>>> I have done all that to avoid to pedding an integer, as suggested by
>>> George.
>>> I define tParticle as a common object.
>>> I am using Intel fortran compiler.
>>>
>>> George suggests:
>>>
>>> *"" The displacements are relative to the benign of your particle type.
>>> Thus the first one is not 0 but the displacement of “integer :: ip” due to
>>> the fact that the compiler is allowed to introduce gaps in order to better
>>> align.*
>>>
>>> *  DISPLACEMENTS(1)=MPI_GET_ADDRESS(dummy%ip)*
>>> *  DISPLACEMENTS(2)=**MPI_GET_ADDRESS(dummy%RP[1])*
>>>
>>> *  DISPLACEMENTS(3)=**MPI_GET_ADDRESS(dummy%QQ[1])*
>>>
>>> *and then remove the MPI_GET_ADDRESS(dummy) from all of them.*
>>>
>>> *3. After creating the structure type you need to resize it in order to
>>> correctly determine the span of the entire structure, and how an array of
>>> such structures lays in memory. Something like:*
>>> *MPI_TYPE_CREATE_RESIZED(old type, DISPLACEMENT(1),*
>>> *   MPI_GET_ADDRESS(dummy[2]) - MPI_GET_ADDRESS(dummy[1]), newt) ""*
>>>
>>> What do you think?
>>> George, Did i miss something?
>>>
>>> Thanks a lot
>>>
>>>
>>>
>>> Diego
>>>
>>>
>>> On 2 January 2015 at 12:51, Gilles Gouaillardet <
>>> gilles.gouaillar...@gmail.com> wrote:
>>>
 Diego,

 First, i recommend you redefine tParticle and add a padding integer so
 everything is aligned.


 Before invoking MPI_Type_create_struct, you need to
 call MPI_Get_address(dummy, base, MPI%err)
 displacements = displacements - base

 MPI_Type_create_resized might be unnecessary if tParticle is aligned
 And the lower bound should be zero.

 BTW, which compiler are you using ?
 Is tParticle object a common ?
 iirc, intel compiler aligns types automatically, but not commons, and
 that means MPI_Type_create_struct is not aligned as it should most of the
 time.

 Cheers,

 Gilles

 Diego Avesani さんのメール:

 dear all,

 I have a problem with MPI_Type_Create_Struct and
 MPI_TYPE_CREATE_RESIZED.

 I have this variable type:

 *  TYPE tParticle*
 * INTEGER  :: ip*
 * REAL :: RP(2)*
 * REAL :: QQ(2)*
 *  ENDTYPE tParticle*

 Then I define:

 Nstruct=3
 *ALLOCATE(TYPES(Nstruct))*
 *ALLOCATE(LENGTHS(Nstruct))*
 *ALLOCATE(DISPLACEMENTS(Nstruct))*
 *!set the types*
 *TYPES(1) = MPI_INTEGER*
 *TYPES(2) = MPI_DOUBLE_PRECISION*
 *TYPES(3) = MPI_DOUBLE_PRECISION*
 *!set the lengths*
 *LENGTHS(1) = 1*
 *LENGTHS(2) = 2*
 *LENGTHS(3) = 2*

 As gently suggested by Nick Papior Andersen and George Bosilca some
 months ago, I checked the variable adress to resize my struct variable to
 avoid empty space and
 to have a more general definition.

 * !*
 * CALL MPI_GET_ADDRESS(dummy%ip,DISPLACEMENTS(1), MPI%iErr)*
 * CALL MPI_GET_ADDRESS(dummy%RP(1), DISPLACEMENTS(2), MPI%iErr)*
 * CALL MPI_GET_ADDRESS(dummy%QQ(1), DISPLACEMENTS(3), MPI%iErr)*
 * !*
 * CALL
 MPI_Type_Create_Struct(Nstruct,LENGTHS,DISPLACEMENTS,TYPES,MPI_PARTICLE_TYPE_OLD,MPI%iErr)*
 * CALL MPI_Type_Commit(MPI_PARTICLE_TYPE_OLD,MPI%iErr)*
 * !*
 * CALL MPI_TYPE_

Re: [OMPI users] OMPI users] MPI_Type_Create_Struct + MPI_TYPE_CREATE_RESIZED

2015-01-04 Thread Gilles Gouaillardet
Diego,

MPI_Get_address was invoked with parameters in the wrong order

here is attached a fixed version

Cheers,

Gilles

On 2015/01/05 2:32, Diego Avesani wrote:
> Dear Gilles, Dear all,
>
> It works. The only thing that is missed is:
>
> *CALL MPI_Finalize(MPI%iErr)*
>
> at the end of the program.
>
> Now, I have to test it sending some data from a processor to another.
> I would like to ask you if you could explain me what you have done.
> I wrote in the program:
>
> *   IF(MPI%myrank==1)THEN*
> *  WRITE(*,*) DISPLACEMENTS*
> *   ENDIF*
>
> and the results is:
>
>*139835891001320  -139835852218120  -139835852213832*
> *  -139835852195016   8030673735967299609*
>
> I am not able to understand it.
>
> Thanks a lot.
>
> In the attachment you can find the program
>
>
>
>
>
>
>
>
> Diego
>
>
> On 4 January 2015 at 12:10, Gilles Gouaillardet <
> gilles.gouaillar...@gmail.com> wrote:
>
>> Diego,
>>
>> here is an updated revision i will double check tomorrow
>> /* i dit not test it yet, so forgive me it it does not compile/work */
>>
>> Cheers,
>>
>> Gilles
>>
>> On Sun, Jan 4, 2015 at 6:48 PM, Diego Avesani 
>> wrote:
>>
>>> Dear Gilles, Dear all,
>>>
>>> in the attachment you can find the program.
>>>
>>> What do you meam "remove mpi_get_address(dummy) from all displacements".
>>>
>>> Thanks for all your help
>>>
>>> Diego
>>>
>>>
>>>
>>> Diego
>>>
>>>
>>> On 3 January 2015 at 00:45, Gilles Gouaillardet <
>>> gilles.gouaillar...@gmail.com> wrote:
>>>
 Diego,

 George gave you the solution,

 The snippet you posted has two mistakes
 You did not remove mpi_get_address(dummy) from all displacements
 (See my previous reply)
 You pass incorrect values to mpi_type_create_resized

 Can you post a trimmed version of your program instead of a snippet ?

 Gus is right about using double precision vs real and -r8

 Cheers,

 Gilles

 Diego Avesani ??:
 Dear Gilles Dear all,

 I have done all that to avoid to pedding an integer, as suggested by
 George.
 I define tParticle as a common object.
 I am using Intel fortran compiler.

 George suggests:

 *"" The displacements are relative to the benign of your particle type.
 Thus the first one is not 0 but the displacement of "integer :: ip" due to
 the fact that the compiler is allowed to introduce gaps in order to better
 align.*

 *  DISPLACEMENTS(1)=MPI_GET_ADDRESS(dummy%ip)*
 *  DISPLACEMENTS(2)=**MPI_GET_ADDRESS(dummy%RP[1])*

 *  DISPLACEMENTS(3)=**MPI_GET_ADDRESS(dummy%QQ[1])*

 *and then remove the MPI_GET_ADDRESS(dummy) from all of them.*

 *3. After creating the structure type you need to resize it in order to
 correctly determine the span of the entire structure, and how an array of
 such structures lays in memory. Something like:*
 *MPI_TYPE_CREATE_RESIZED(old type, DISPLACEMENT(1),*
 *   MPI_GET_ADDRESS(dummy[2]) - MPI_GET_ADDRESS(dummy[1]), newt) ""*

 What do you think?
 George, Did i miss something?

 Thanks a lot



 Diego


 On 2 January 2015 at 12:51, Gilles Gouaillardet <
 gilles.gouaillar...@gmail.com> wrote:

> Diego,
>
> First, i recommend you redefine tParticle and add a padding integer so
> everything is aligned.
>
>
> Before invoking MPI_Type_create_struct, you need to
> call MPI_Get_address(dummy, base, MPI%err)
> displacements = displacements - base
>
> MPI_Type_create_resized might be unnecessary if tParticle is aligned
> And the lower bound should be zero.
>
> BTW, which compiler are you using ?
> Is tParticle object a common ?
> iirc, intel compiler aligns types automatically, but not commons, and
> that means MPI_Type_create_struct is not aligned as it should most of the
> time.
>
> Cheers,
>
> Gilles
>
> Diego Avesani ??:
>
> dear all,
>
> I have a problem with MPI_Type_Create_Struct and
> MPI_TYPE_CREATE_RESIZED.
>
> I have this variable type:
>
> *  TYPE tParticle*
> * INTEGER  :: ip*
> * REAL :: RP(2)*
> * REAL :: QQ(2)*
> *  ENDTYPE tParticle*
>
> Then I define:
>
> Nstruct=3
> *ALLOCATE(TYPES(Nstruct))*
> *ALLOCATE(LENGTHS(Nstruct))*
> *ALLOCATE(DISPLACEMENTS(Nstruct))*
> *!set the types*
> *TYPES(1) = MPI_INTEGER*
> *TYPES(2) = MPI_DOUBLE_PRECISION*
> *TYPES(3) = MPI_DOUBLE_PRECISION*
> *!set the lengths*
> *LENGTHS(1) = 1*
> *LENGTHS(2) = 2*
> *LENGTHS(3) = 2*
>
> As gently suggested by Nick Papior Andersen and George Bosilca some
> months ago, I checked the variable adress to resize my struct variable to
> avoid empty space and
> to have a more general definition.
>
> * !*
> * CALL MPI_GET_ADDRESS(dummy%ip,DISPLACEM