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 <diego.aves...@gmail.com>
>> 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 <diego.aves...@gmail.com>??????:
>>>> 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 <diego.aves...@gmail.com>??????:
>>>>>
>>>>> 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
>>>>
>>>
>>> _______________________________________________
>>> 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/26099.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/26100.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/26101.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)         :: rp(2)
 real(dp)         :: QQ(4)
end type particle
!
TYPE(tMPI)         :: MPI
INTEGER            :: COMM_CART
INTEGER            :: MPI_PARTICLE_TYPE_OLD
INTEGER            :: MPI_PARTICLE_TYPE

INTEGER              :: nstruct

INTEGER,ALLOCATABLE  :: TYPES(:)
INTEGER,ALLOCATABLE  :: LENGTHS(:)
INTEGER(MPI_ADDRESS_KIND),ALLOCATABLE,DIMENSION(:)   ::DISPLACEMENTS

type(particle) :: dummy(2)  ! Used for calculation of displacement



   CALL MPI_INIT(MPI%iErr)
   CALL MPI_COMM_RANK(MPI_COMM_WORLD, MPI%myrank, MPI%iErr)
   CALL MPI_COMM_SIZE(MPI_COMM_WORLD, MPI%nCPU,   MPI%iErr)
   !
   !
   nstruct=3
   ALLOCATE(TYPES(nstruct))
   ALLOCATE(LENGTHS(nstruct))
   ALLOCATE(DISPLACEMENTS(0:nstruct+1))
   !
   TYPES(1)=MPI_INTEGER
   TYPES(2)=MPI_DOUBLE_PRECISION
   TYPES(3)=MPI_DOUBLE_PRECISION
   !
   LENGTHS(1)=1
   LENGTHS(2)=2
   LENGTHS(3)=4
   ! 
   !
   CALL MPI_GET_ADDRESS(dummy(1),DISPLACEMENTS(0),MPI%iErr)
   CALL MPI_GET_ADDRESS(dummy(1)%ip,DISPLACEMENTS(1),MPI%iErr)
   CALL MPI_GET_ADDRESS(dummy(1)%RP(1),DISPLACEMENTS(2),MPI%iErr)
   CALL MPI_GET_ADDRESS(dummy(1)%QQ(1),DISPLACEMENTS(3),MPI%iErr)
   CALL MPI_GET_ADDRESS(dummy(2),DISPLACEMENTS(4),MPI%iErr)
   !
   DISPLACEMENTS(1:nstruct+1)= DISPLACEMENTS(1:nstruct+1)-DISPLACEMENTS(0)
   !
   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(4), MPI_PARTICLE_TYPE, MPI%iErr)
   CALL MPI_TYPE_COMMIT(MPI_PARTICLE_TYPE,MPI%iErr)
   !
   IF(MPI%myrank==0)THEN
      WRITE(*,*) DISPLACEMENTS
   ENDIF
   !
   CALL MPI_Finalize(MPI%iErr)
   !

ENDPROGRAM

Reply via email to