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 <bosi...@icl.utk.edu> 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 <diego.aves...@gmail.com>
> 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 <bosi...@icl.utk.edu> 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 <g...@ldeo.columbia.edu> 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 <bosi...@icl.utk.edu
>>> >> <mailto:bosi...@icl.utk.edu>> wrote:
>>> >>
>>> >>
>>> >>>    On Jan 15, 2015, at 06:02 , Diego Avesani <
>>> diego.aves...@gmail.com
>>> >>>    <mailto:diego.aves...@gmail.com>> 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 <g...@ldeo.columbia.edu
>>> >>>    <mailto:g...@ldeo.columbia.edu>> 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
>>> >>>            us...@open-mpi.org <mailto:us...@open-mpi.org>
>>> >>>            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
>>> >>>        us...@open-mpi.org <mailto:us...@open-mpi.org>
>>> >>>        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
>>> >>>    us...@open-mpi.org <mailto: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/26184.php
>>> >>
>>> >>
>>> >>    _______________________________________________
>>> >>    users mailing list
>>> >>    us...@open-mpi.org <mailto: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/26192.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/26193.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/26194.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/26195.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/26197.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/26199.php
>

Reply via email to