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-mai...@open-mpi.org 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-f...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/svn-full


-- 
Jeff Squyres
jsquy...@cisco.com
For corporate legal information go to: 
http://www.cisco.com/web/about/doing_business/legal/cri/


Reply via email to