Dear George, Dear all,
I have been studying. It's clear for 2D case QQ(:,:).
For example if
real :: QQ(npt,9) , with 9 the characteristic of each particles.
I can simple:
call MPI_TYPE_VECTOR(QQ(1:50), 9, 9, MPI_REAL, my_2D_type, ierr)
I send 50 element of QQ. I am in fortran so a two dimensional array is
organized in a 1D array and a new row start after the 9 elements of a colum
The problem is a 3D array. I belive that I have to create a sort of *vector
of vectors.*
More or less like:
call MPI_TYPE_VECTOR(xxx, xxx, xxx, MPI_REAL, my_row, ierr)
and then
call MPI_TYPE_VECTOR(xxx, xxx, xxx, *my_row*, my_type, ierr).
You can note that in the second case I have *my_row *instead of mpi_real.
I found somethind about it in a tutorial but I am not able to find it again
in google. I think that is not convinient the use of struct in this case, I
have only real. Moreover, mpi_struct is think to emulate Fortran90 and C
structures, as Gus' suggestion.
Let's me look to that tutorial
What do you think?
Thanks again
Diego
On 16 January 2015 at 16:02, George Bosilca <[email protected]> wrote:
> The operation you describe is a pack operation, agglomerating together in
> a contiguous buffer originally discontinuous elements. As a result there is
> no need to use the MPI_TYPE_VECTOR, but instead you can just use the type
> you created so far (MPI_my_STRUCT) with a count.
>
> George.
>
>
> On Fri, Jan 16, 2015 at 5:32 AM, Diego Avesani <[email protected]>
> wrote:
>
>> Dear All,
>> I'm sorry to insist, but I am not able to understand. Moreover, I have
>> realized that I have to explain myself better.
>>
>> I try to explain in may program. Each CPU has *npt* particles. My
>> program understand how many particles each CPU has to send, according to
>> their positions. Then I can do:
>>
>> *icount=1*
>> * DO i=1,npt*
>> * IF(i is a particle to send)THEN*
>>
>> * DATASEND(icount)%ip = PART(ip)%ip*
>> * DATASEND(icount)%mc = PART(ip)%mc*
>>
>> * DATASEND(icount)%RP = PART(ip)%RP*
>> * DATASEND(icount)%QQ = PART(ip)%QQ*
>>
>> * icount=icount+1*
>> * ENDIF*
>> * ENDDO*
>>
>> After that, I can send *DATASEND*
>>
>> I *DATASEND* is a *MPI_my_STRUCT.* I can allocate it according to
>> the number of particles that I have to send:
>>
>> TYPE(tParticle) ,ALLOCATABLE,DIMENSION(:) :: DATASEND,DATARECV
>>
>> This means that the number of particles which I have to send can change
>> every time.
>>
>> After that, I compute for each particles, somethins called QQmls(:,:,:).
>> QQmls has all real elements. Now I would like to to the same that I did
>> with PART, but in this case:
>>
>> *icount=1*
>> *DO i=1,npt*
>> * IF(i is a particle to send)THEN*
>>
>> *DATASEND_REAL(:,icount,:)=QQmls(:,i,:)*
>> * icount=icount+1*
>>
>> * ENDIF*
>> *ENDDO*
>>
>> I would like to have a sort *MPI_my_TYPE to do that (like *
>> *MPI_my_STRUCT**) *and not to create every time *MPI_TYPE_VECTOR *because
>> *DATASEND_REAL *changes size every time.
>>
>> I hope to make myself clear.
>>
>> So is it correct to use *MPI_TYPE_VECTOR?, *Can I do what I want?
>>
>> In the meantime, I will study some examples.
>>
>> Thanks again
>>
>>
>>
>>
>>
>> Diego
>>
>>
>> On 16 January 2015 at 07:39, George Bosilca <[email protected]> wrote:
>>
>>> The subarray creation is an multi-dimension extension of the vector
>>> type. You can see it as a vector of vector of vector and so on, one vector
>>> per dimension. The stride array is used to declare on each dimension what
>>> is the relative displacement (in number of elements) from the beginning of
>>> the dimension array.
>>>
>>> It is important to use regular type creation when you can take advantage
>>> of such regularity instead of resorting to use of struct or h*. This insure
>>> better packing/unpacking performance, as well as possible future support
>>> for one-sided communications.
>>>
>>> George.
>>>
>>>
>>>
>>> > On Jan 15, 2015, at 19:31, Gus Correa <[email protected]> wrote:
>>> >
>>> > I never used MPI_Type_create_subarray, only MPI_Type_Vector.
>>> > What I like about MPI_Type_Vector is that you can define a stride,
>>> > hence you can address any regular pattern in memory.
>>> > However, it envisages the array layout in memory as a big 1-D array,
>>> > with a linear index progressing in either Fortran or C order.
>>> >
>>> > Somebody correct me please if I am wrong, but at first sight
>>> MPI_Type_Vector sounds more flexible to me than MPI_Type_create_subarray,
>>> exactly because the latter doesn't have strides.
>>> >
>>> > The downside is that you need to do some index arithmetic to figure
>>> > the right strides, etc, to match the corresponding
>>> > Fortran90 array sections.
>>> >
>>> > There are good examples in the "MPI - The complete reference" books I
>>> suggested to you before (actually in vol 1).
>>> >
>>> > Online I could find the two man pages (good information, but no
>>> example):
>>> >
>>> > http://www.open-mpi.org/doc/v1.8/man3/MPI_Type_vector.3.php
>>> > http://www.open-mpi.org/doc/v1.8/man3/MPI_Type_create_subarray.3.php
>>> >
>>> > There is a very simple 2D example of MPI_Type_vector using strides
>>> here:
>>> >
>>> > https://computing.llnl.gov/tutorials/mpi/#Derived_Data_Types
>>> >
>>> > and a similar one here:
>>> >
>>> > http://static.msi.umn.edu/tutorial/scicomp/general/MPI/content6.html
>>> >
>>> > Gus Correa
>>> >
>>> >> On 01/15/2015 06:53 PM, Diego Avesani wrote:
>>> >> dear George, dear Gus, dear all,
>>> >> Could you please tell me where I can find a good example?
>>> >> I am sorry but I can not understand the 3D array.
>>> >>
>>> >>
>>> >> Really Thanks
>>> >>
>>> >> Diego
>>> >>
>>> >>
>>> >> On 15 January 2015 at 20:13, George Bosilca <[email protected]
>>> >> <mailto:[email protected]>> wrote:
>>> >>
>>> >>
>>> >>> On Jan 15, 2015, at 06:02 , Diego Avesani <
>>> [email protected]
>>> >>> <mailto:[email protected]>> wrote:
>>> >>>
>>> >>> Dear Gus, Dear all,
>>> >>> Thanks a lot.
>>> >>> MPI_Type_Struct works well for the first part of my problem, so I
>>> >>> am very happy to be able to use it.
>>> >>>
>>> >>> Regarding MPI_TYPE_VECTOR.
>>> >>>
>>> >>> I have studied it and for simple case it is clear to me what id
>>> >>> does (at least I believe). Foe example if I have a matrix define
>>> as:
>>> >>> REAL, ALLOCATABLE (AA(:,:))
>>> >>> ALLOCATE AA(100,5)
>>> >>>
>>> >>> I could send part of it defining
>>> >>>
>>> >>> CALL MPI_TYPE_VECTOR(5,1,5,MPI_DOUBLE_PRECISION,/MY_NEW_TYPE/)
>>> >>>
>>> >>> after that I can send part of it with
>>> >>>
>>> >>> CALL MPI_SEND( AA(1:/10/,:), /10/, /MY_NEW_TYPE/, 1, 0,
>>> >>> MPI_COMM_WORLD );
>>> >>>
>>> >>> Have I understood correctly?
>>> >>>
>>> >>> What I can do in case of three dimensional array? for example
>>> >>> AA(:,:,:), I am looking to MPI_TYPE_CREATE_SUBARRAY.
>>> >>> Is that the correct way?
>>> >>>
>>> >>> Thanks again
>>> >>
>>> >> Indeed, using the subarray is the right approach independent on the
>>> >> number of dimensions of the data (you can use it instead of
>>> >> MPI_TYPE_VECTOR as well).
>>> >>
>>> >> George.
>>> >>
>>> >>
>>> >>>
>>> >>>
>>> >>>
>>> >>>
>>> >>> Diego
>>> >>>
>>> >>>
>>> >>> On 13 January 2015 at 19:04, Gus Correa <[email protected]
>>> >>> <mailto:[email protected]>> wrote:
>>> >>>
>>> >>> Hi Diego
>>> >>> I guess MPI_Type_Vector is the natural way to send and receive
>>> >>> Fortran90 array sections (e.g. your QQMLS(:,50:100,:)).
>>> >>> I used that before and it works just fine.
>>> >>> I think that is pretty standard MPI programming style.
>>> >>> I guess MPI_Type_Struct tries to emulate Fortran90 and C
>>> >>> structures
>>> >>> (as you did in your previous code, with all the surprises
>>> >>> regarding alignment, etc), not array sections.
>>> >>> Also, MPI type vector should be more easy going (and probably
>>> >>> more efficient) than MPI type struct, with less memory
>>> >>> alignment problems.
>>> >>> I hope this helps,
>>> >>> Gus Correa
>>> >>>
>>> >>> PS - These books have a quite complete description and several
>>> >>> examples
>>> >>> of all MPI objects and functions, including MPI types (native
>>> >>> and user defined):
>>> >>> http://mitpress.mit.edu/books/__mpi-complete-reference-0
>>> >>> <http://mitpress.mit.edu/books/mpi-complete-reference-0>
>>> >>> http://mitpress.mit.edu/books/__mpi-complete-reference-1
>>> >>> <http://mitpress.mit.edu/books/mpi-complete-reference-1>
>>> >>>
>>> >>> [They cover MPI 1 and 2. I guess there is a new/upcoming book
>>> >>> with MPI 3, but for what you're doing 1 and 2 are more than
>>> >>> enough.]
>>> >>>
>>> >>>
>>> >>> On 01/13/2015 09:22 AM, Diego Avesani wrote:
>>> >>>
>>> >>> Dear all,
>>> >>>
>>> >>> I had some wonderful talking about MPI_type_create_struct
>>> adn
>>> >>> isend\irecv with
>>> >>> Gilles, Gustavo, George, Gus, Tom and Jeff. Now all is
>>> >>> more clear and my
>>> >>> program works.
>>> >>>
>>> >>> Now I have another question. In may program I have matrix:
>>> >>>
>>> >>> /QQMLS(:,:,:) /that is allocate as
>>> >>>
>>> >>> /ALLOCATE(QQMLS(9,npt,18)/), where npt is the number of
>>> >>> particles
>>> >>>
>>> >>> QQMLS is double precision.
>>> >>>
>>> >>> I would like to sent form a CPU to another part of it, for
>>> >>> example,
>>> >>> sending QQMLS(:,50:100,:). I mean sending the QQMLS of the
>>> >>> particles
>>> >>> between 50 to 100.
>>> >>> I suppose that i could use MPI_Type_vector but I am not
>>> >>> sure. The
>>> >>> particle that I want to sent could be from 25 to 50 ecc..
>>> >>> ecc..so
>>> >>> blocklength changes everytime.
>>> >>>
>>> >>> Do I have to use MPI_type_create_struct?
>>> >>> Do I have correctly understood MPI_Type_vector?
>>> >>>
>>> >>> Thanks a lot
>>> >>>
>>> >>>
>>> >>> Diego
>>> >>>
>>> >>>
>>> >>>
>>> >>> _________________________________________________
>>> >>> users mailing list
>>> >>> [email protected] <mailto:[email protected]>
>>> >>> Subscription:
>>> >>> http://www.open-mpi.org/__mailman/listinfo.cgi/users
>>> >>> <http://www.open-mpi.org/mailman/listinfo.cgi/users>
>>> >>> Link to this post:
>>> >>>
>>> http://www.open-mpi.org/__community/lists/users/2015/01/__26171.php
>>> >>> <
>>> http://www.open-mpi.org/community/lists/users/2015/01/26171.php>
>>> >>>
>>> >>>
>>> >>> _________________________________________________
>>> >>> users mailing list
>>> >>> [email protected] <mailto:[email protected]>
>>> >>> Subscription:
>>> >>> http://www.open-mpi.org/__mailman/listinfo.cgi/users
>>> >>> <http://www.open-mpi.org/mailman/listinfo.cgi/users>
>>> >>> Link to this post:
>>> >>>
>>> http://www.open-mpi.org/__community/lists/users/2015/01/__26172.php
>>> >>> <
>>> http://www.open-mpi.org/community/lists/users/2015/01/26172.php>
>>> >>>
>>> >>>
>>> >>> _______________________________________________
>>> >>> users mailing list
>>> >>> [email protected] <mailto:[email protected]>
>>> >>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
>>> >>> Link to this post:
>>> >>> http://www.open-mpi.org/community/lists/users/2015/01/26184.php
>>> >>
>>> >>
>>> >> _______________________________________________
>>> >> users mailing list
>>> >> [email protected] <mailto:[email protected]>
>>> >> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
>>> >> Link to this post:
>>> >> http://www.open-mpi.org/community/lists/users/2015/01/26192.php
>>> >>
>>> >>
>>> >>
>>> >>
>>> >> _______________________________________________
>>> >> users mailing list
>>> >> [email protected]
>>> >> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
>>> >> Link to this post:
>>> http://www.open-mpi.org/community/lists/users/2015/01/26193.php
>>> >
>>> > _______________________________________________
>>> > users mailing list
>>> > [email protected]
>>> > Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
>>> > Link to this post:
>>> http://www.open-mpi.org/community/lists/users/2015/01/26194.php
>>> _______________________________________________
>>> users mailing list
>>> [email protected]
>>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
>>> Link to this post:
>>> http://www.open-mpi.org/community/lists/users/2015/01/26195.php
>>>
>>
>>
>> _______________________________________________
>> users mailing list
>> [email protected]
>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
>> Link to this post:
>> http://www.open-mpi.org/community/lists/users/2015/01/26197.php
>>
>
>
> _______________________________________________
> users mailing list
> [email protected]
> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
> Link to this post:
> http://www.open-mpi.org/community/lists/users/2015/01/26199.php
>