Open MPI logo

Open MPI Development Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Development mailing list

Subject: Re: [OMPI devel] [OMPI svn-full] svn:open-mpi r28319 - trunk/opal/datatype
From: George Bosilca (bosilca_at_[hidden])
Date: 2013-04-10 09:53:17


2 * yes.

  George.

On Apr 10, 2013, at 15:04 , "Jeff Squyres (jsquyres)" <jsquyres_at_[hidden]> wrote:

> George --
>
> I'm guessing this should be CMR'ed to v1.7, right?
>
> Does it need to go to v1.6, too?
>
>
> On Apr 9, 2013, at 7:01 PM, svn-commit-mailer_at_[hidden] wrote:
>
>> Author: bosilca (George Bosilca)
>> Date: 2013-04-09 19:01:54 EDT (Tue, 09 Apr 2013)
>> New Revision: 28319
>> URL: https://svn.open-mpi.org/trac/ompi/changeset/28319
>>
>> Log:
>> Fix an issue identified by Thomas Jahns and his colleague when the data
>> representation is not correctly optimized (it is off by the extend).
>>
>> During the data representation process, if the opportunity to merge several
>> items appear, we replace them with the new merged element. However, if one
>> of the components of this merged element was comming from a "loop representation"
>> then the new first element of this loop must have a displacement moved by the
>> extent of the loop.
>>
>> Text files modified:
>> trunk/opal/datatype/opal_datatype_optimize.c | 56 +++++++++++++++++++++++----------------
>> 1 files changed, 33 insertions(+), 23 deletions(-)
>>
>> Modified: trunk/opal/datatype/opal_datatype_optimize.c
>> ==============================================================================
>> --- trunk/opal/datatype/opal_datatype_optimize.c Tue Apr 9 18:08:03 2013 (r28318)
>> +++ trunk/opal/datatype/opal_datatype_optimize.c 2013-04-09 19:01:54 EDT (Tue, 09 Apr 2013) (r28319)
>> @@ -73,15 +73,12 @@
>> {
>> dt_elem_desc_t* pElemDesc;
>> ddt_elem_desc_t opt_elem;
>> - OPAL_PTRDIFF_TYPE last_disp = 0;
>> dt_stack_t* pStack; /* pointer to the position on the stack */
>> int32_t pos_desc = 0; /* actual position in the description of the derived datatype */
>> - int32_t stack_pos = 0, last_type = OPAL_DATATYPE_UINT1;
>> - int32_t type = OPAL_DATATYPE_LOOP, nbElems = 0, changes = 0;
>> - int32_t optimized = 0, continuity;
>> + int32_t stack_pos = 0, last_type = OPAL_DATATYPE_UINT1, last_length = 0;
>> + int32_t type = OPAL_DATATYPE_LOOP, nbElems = 0, continuity;
>> + OPAL_PTRDIFF_TYPE total_disp = 0, last_extent = 1, last_disp = 0;
>> uint16_t last_flags = 0xFFFF; /* keep all for the first datatype */
>> - OPAL_PTRDIFF_TYPE total_disp = 0, last_extent = 1;
>> - int32_t last_length = 0;
>> uint32_t i;
>>
>> pStack = (dt_stack_t*)alloca( sizeof(dt_stack_t) * (pData->btypes[OPAL_DATATYPE_LOOP]+2) );
>> @@ -134,7 +131,8 @@
>> /* the whole loop is contiguous */
>> if( !continuity ) {
>> if( 0 != last_length ) {
>> - CREATE_ELEM( pElemDesc, last_type, OPAL_DATATYPE_FLAG_BASIC, last_length, last_disp, last_extent );
>> + CREATE_ELEM( pElemDesc, last_type, OPAL_DATATYPE_FLAG_BASIC,
>> + last_length, last_disp, last_extent );
>> pElemDesc++; nbElems++;
>> last_length = 0;
>> }
>> @@ -144,9 +142,9 @@
>> + loop->loops * end_loop->size);
>> last_type = OPAL_DATATYPE_UINT1;
>> last_extent = 1;
>> - optimized++;
>> } else {
>> int counter = loop->loops;
>> + OPAL_PTRDIFF_TYPE merged_disp = 0;
>> /* if the previous data is contiguous with this piece and it has a length not ZERO */
>> if( last_length != 0 ) {
>> if( continuity ) {
>> @@ -155,27 +153,42 @@
>> last_type = OPAL_DATATYPE_UINT1;
>> last_extent = 1;
>> counter--;
>> + merged_disp = loop->extent; /* merged loop, update the disp of the remaining elems */
>> }
>> - CREATE_ELEM( pElemDesc, last_type, OPAL_DATATYPE_FLAG_BASIC, last_length, last_disp, last_extent );
>> + CREATE_ELEM( pElemDesc, last_type, OPAL_DATATYPE_FLAG_BASIC,
>> + last_length, last_disp, last_extent );
>> pElemDesc++; nbElems++;
>> last_disp += last_length;
>> last_length = 0;
>> last_type = OPAL_DATATYPE_LOOP;
>> }
>> - /* we have a gap in the begining or the end of the loop but the whole
>> - * loop can be merged in just one memcpy.
>> + /**
>> + * The content of the loop is contiguous (maybe with a gap before or after).
>> + *
>> + * If any of the loops have been merged with the previous element, then the
>> + * displacement of the first element (or the displacement of all elements if the
>> + * loop will be removed) must be updated accordingly.
>> */
>> - CREATE_LOOP_START( pElemDesc, counter, 2, loop->extent, loop->common.flags );
>> - pElemDesc++; nbElems++;
>> - CREATE_ELEM( pElemDesc, OPAL_DATATYPE_UINT1, OPAL_DATATYPE_FLAG_BASIC, end_loop->size, loop_disp, 1);
>> - pElemDesc++; nbElems++;
>> - CREATE_LOOP_END( pElemDesc, 2, end_loop->first_elem_disp, end_loop->size,
>> - end_loop->common.flags );
>> - pElemDesc++; nbElems++;
>> - if( loop->items > 2 ) optimized++;
>> + if( counter <= 2 ) {
>> + merged_disp += end_loop->first_elem_disp;
>> + while( counter > 0 ) {
>> + CREATE_ELEM( pElemDesc, OPAL_DATATYPE_UINT1, OPAL_DATATYPE_FLAG_BASIC,
>> + end_loop->size, merged_disp, 1);
>> + pElemDesc++; nbElems++; counter--;
>> + merged_disp += loop->extent;
>> + }
>> + } else {
>> + CREATE_LOOP_START( pElemDesc, counter, 2, loop->extent, loop->common.flags );
>> + pElemDesc++; nbElems++;
>> + CREATE_ELEM( pElemDesc, OPAL_DATATYPE_UINT1, OPAL_DATATYPE_FLAG_BASIC,
>> + end_loop->size, loop_disp, 1);
>> + pElemDesc++; nbElems++;
>> + CREATE_LOOP_END( pElemDesc, 2, end_loop->first_elem_disp + merged_disp,
>> + end_loop->size, end_loop->common.flags );
>> + pElemDesc++; nbElems++;
>> + }
>> }
>> pos_desc += loop->items + 1;
>> - changes++;
>> } else {
>> ddt_elem_desc_t* elem = (ddt_elem_desc_t*)&(pData->desc.desc[pos_desc+1]);
>> if( last_length != 0 ) {
>> @@ -192,7 +205,6 @@
>> loop->loops, elem->disp, loop->extent );
>> pElemDesc++; nbElems++;
>> pos_desc += loop->items + 1;
>> - changes++; optimized++;
>> goto complete_loop;
>> } else if( loop->loops < 3 ) {
>> OPAL_PTRDIFF_TYPE elem_displ = elem->disp;
>> @@ -203,7 +215,6 @@
>> pElemDesc++; nbElems++;
>> }
>> pos_desc += loop->items + 1;
>> - changes += loop->loops; optimized += loop->loops;
>> goto complete_loop;
>> }
>> }
>> @@ -238,7 +249,6 @@
>> pData->desc.desc[pos_desc].elem.count * opal_datatype_basicDatatypes[type]->size;
>> last_type = OPAL_DATATYPE_UINT1;
>> last_extent = 1;
>> - optimized++;
>> }
>> }
>> last_flags &= pData->desc.desc[pos_desc].elem.common.flags;
>> _______________________________________________
>> svn-full mailing list
>> svn-full_at_[hidden]
>> http://www.open-mpi.org/mailman/listinfo.cgi/svn-full
>
>
> --
> Jeff Squyres
> jsquyres_at_[hidden]
> For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/
>
>
> _______________________________________________
> devel mailing list
> devel_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/devel