Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: Re: [OMPI users] Generic Type
From: Gabriele Fatigati (g.fatigati_at_[hidden])
Date: 2009-03-31 08:00:54


Thanks Massimo,
now it works well.
I've erroneous think that Irecv did this automatically using recvtype fields.

2009/3/31 Massimo Cafaro <massimo.cafaro_at_[hidden]>:
> Hi,
>
> let me see that it is still not clear to me why you want to reimplement the
> MPI_Gather supplied by an MPI implementation with your own version.
> You will never be able to attain the same level of performance using point
> to point communication, since MPI_Gather uses internally a binomial tree or
> even better advanced data structures to improve its overall performances.
>
> From your code snippet, I guess the problem arises because you are not
> considering the extent of the datatype you are trying to receive:
>
> using int MPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint *lb, MPI_Aint
> *extent );
>
>
> MPI_Aint lower_bound, extent;
> int rc;
> rc = MPI_Type_get_extent(recvtype, &lower_bound, &extent);
> if(rc == MPI_SUCCESS)
>        MPI_Irecv(buff + (i-1) * recvcount *  extent, recvcount, recvtype, i,
> 0, comm, &array_request[i-1]);
>
> or if you prefer non pointer notation
>
> MPI_Irecv(buff[(i-1) * recvcount *  extent], recvcount, recvtype, i, 0,
> comm, &array_request[i-1]);
>
>
> In practice, the extent of a datatype should be equal to the size as
> reported by sizeof(datatype).
> Using MPI_Type_get_extent() is the portable way of doing this using MPI.
>
> Regards,
> Massimo
>
>
>
>
> On 31/mar/09, at 12:16, Gabriele Fatigati wrote:
>
>> Mm,
>> OpenMPI functions like MPI_Irecv, does pointer arithmetics over recv
>> buffer using type info in ompi_datatype_t i suppose. I'm trying to
>> write a wrapper to MPI_Gather using Irecv functions:
>>
>> int MPI_FT_Gather(void*sendbuf, int sendcount, MPI_Datatype sendtype,
>> void*recvbuff,
>>                         int recvcount, MPI_Datatype recvtype,
>>                         int root, MPI_Comm comm){
>>
>> ...
>>
>> for( nprocs..){
>>
>> MPI_Irecv(&recvbuff[(i-1)], recvcount, recvtype, i, 0, comm,
>> &array_request[i-1]);
>>
>> }
>>
>>
>> }
>>
>> where every proc sends 1 double. It doesn't work,( received values are
>> wrong) because MPI_Irecv are trying to do pointer arithmetic with void
>> values. In fact, if i write:
>>
>> double*buff  = &recvbuff[0];
>>
>> for( nprocs..){
>>
>> MPI_Irecv(&buff[(i-1)], recvcount, recvtype, i, 0, comm,
>> &array_request[i-1]);
>>
>> }
>>
>> it works well. Do you have an idea to use a portalbe way to do this?(
>> if is it possible)
>>
>>
>>
>> 2009/3/30 Massimo Cafaro <massimo.cafaro_at_[hidden]>:
>>>
>>> Dear Gabriele,
>>>
>>> to the best of my knowledge the MPI standard does not provide such a
>>> function.
>>> The reason is that when calling  MPI_Gather, the standard requires
>>> matching
>>> type signatures (i.e., the sendcount and sendtype argument on each of the
>>> non root processes must match the recvcount and recvtype arguments at the
>>> root process). This still allows having disting type maps (type and
>>> displacement pairs) at a sender process and at the root process, but it
>>> is a
>>> feature seldom used in practice, at least in my experience.
>>>
>>> Therefore, you must know in advance the datatype you are receiving even
>>> in
>>> the case this datatype is a derived datatype.
>>> If not, the likely outcome is that the receive buffer at the root process
>>> gets overwritten, which causes MPI_Gather to return an error.
>>>
>>> Due to the signature of the MPI_Gather function, the only possibility I
>>> see
>>> to achieve what you are trying to do is to use the MPI_BYTE datatype, and
>>> use the communicator argument to distinguish between a collective gather
>>> in
>>> which you receive MPI_INT, MPI_DOUBLE etc. Of course I would not create
>>> nor
>>> recommend to create new communicators for this purpose only.
>>>
>>> Kind regards,
>>> Massimo
>>>
>>> On 30/mar/09, at 17:43, Gabriele Fatigati wrote:
>>>
>>>> Dear OpenMPI developers,
>>>> i'm writing an MPI_Gather wrapper to collect void elements. My
>>>> queation is: is there a portable way to know the type of received
>>>> elements, like MPI_INT or MPI_DOUBLE? I've noted that i can retrieve
>>>> this information by ompi_datatype_t-> name field, but i think isn't
>>>> portable. Is there aMPI function that does this check?
>>>>
>>>> --
>>>> Ing. Gabriele Fatigati
>>>>
>>>> Parallel programmer
>>>>
>>>> CINECA Systems & Tecnologies Department
>>>>
>>>> Supercomputing Group
>>>>
>>>> Via Magnanelli 6/3, Casalecchio di Reno (BO) Italy
>>>>
>>>> www.cineca.it                    Tel:   +39 051 6171722
>>>>
>>>> g.fatigati [AT] cineca.it
>>>> _______________________________________________
>>>> users mailing list
>>>> users_at_[hidden]
>>>> http://www.open-mpi.org/mailman/listinfo.cgi/users
>>>
>>>
>>>
>>> --
>>>
>>>
>>> *******************************************************************************************************
>>>
>>>  Massimo Cafaro, Ph.D.                              Additional
>>> affiliations:
>>>  Assistant Professor                                     National
>>> Nanotechnology Laboratory (NNL/CNR-INFM)
>>>  Dept. of Engineering for Innovation         Euro-Mediterranean Centre
>>> for
>>> Climate Change
>>>  University of Salento, Lecce, Italy            SPACI Consortium
>>>  Via per Monteroni                                        E-mail
>>> massimo.cafaro_at_[hidden]
>>>  73100 Lecce, Italy
>>>            cafaro_at_[hidden]
>>>  Voice  +39 0832 297371
>>>            cafaro_at_[hidden]
>>>  Fax +39 0832 298173
>>>  Web     http://sara.unisalento.it/~cafaro
>>>
>>>
>>> *******************************************************************************************************
>>>
>>>
>>>
>>> _______________________________________________
>>> users mailing list
>>> users_at_[hidden]
>>> http://www.open-mpi.org/mailman/listinfo.cgi/users
>>>
>>>
>>
>>
>>
>> --
>> Ing. Gabriele Fatigati
>>
>> Parallel programmer
>>
>> CINECA Systems & Tecnologies Department
>>
>> Supercomputing Group
>>
>> Via Magnanelli 6/3, Casalecchio di Reno (BO) Italy
>>
>> www.cineca.it                    Tel:   +39 051 6171722
>>
>> g.fatigati [AT] cineca.it
>>
>> _______________________________________________
>> users mailing list
>> users_at_[hidden]
>> http://www.open-mpi.org/mailman/listinfo.cgi/users
>
>
>
> --
>
> *******************************************************************************************************
>
>  Massimo Cafaro, Ph.D.                              Additional affiliations:
>  Assistant Professor                                     National
> Nanotechnology Laboratory (NNL/CNR-INFM)
>  Dept. of Engineering for Innovation         Euro-Mediterranean Centre for
> Climate Change
>  University of Salento, Lecce, Italy            SPACI Consortium
>  Via per Monteroni                                        E-mail
> massimo.cafaro_at_[hidden]
>  73100 Lecce, Italy
>             cafaro_at_[hidden]
>  Voice  +39 0832 297371
>             cafaro_at_[hidden]
>  Fax +39 0832 298173
>  Web     http://sara.unisalento.it/~cafaro
>
> *******************************************************************************************************
>
>
>
> _______________________________________________
> users mailing list
> users_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/users
>
>

-- 
Ing. Gabriele Fatigati
Parallel programmer
CINECA Systems & Tecnologies Department
Supercomputing Group
Via Magnanelli 6/3, Casalecchio di Reno (BO) Italy
www.cineca.it                    Tel:   +39 051 6171722
g.fatigati [AT] cineca.it