Re: [OMPI users] OMPI users] MPI_Type_Create_Struct + MPI_TYPE_CREATE_RESIZED
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
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
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
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