diff --git a/opal/datatype/opal_convertor_raw.c b/opal/datatype/opal_convertor_raw.c index 0901938812..777fbc74ee 100644 --- a/opal/datatype/opal_convertor_raw.c +++ b/opal/datatype/opal_convertor_raw.c @@ -5,8 +5,8 @@ * reserved. * Copyright (c) 2009 Oak Ridge National Labs. All rights reserved. * Copyright (c) 2013 Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2017 Research Organization for Information Science - * and Technology (RIST). All rights reserved. + * Copyright (c) 2017-2019 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -170,9 +170,18 @@ opal_convertor_raw( opal_convertor_t* pConvertor, ddt_endloop_desc_t* end_loop = (ddt_endloop_desc_t*)(pElem + pElem->loop.items); if( pElem->loop.common.flags & OPAL_DATATYPE_FLAG_CONTIGUOUS ) { - uint32_t i; - source_base += end_loop->first_elem_disp; - for( i = count_desc; (i > 0) && (index < *iov_count); i--, index++ ) { + ptrdiff_t offset = end_loop->first_elem_disp; + source_base += offset; + for(uint32_t i = count_desc; i > 0; i--, index++ ) { + if (index >= *iov_count) { + dt_elem_desc_t* nElem = pElem + 1; + while (nElem->elem.common.type == OPAL_DATATYPE_LOOP) { + nElem++; + } + assert(OPAL_DATATYPE_END_LOOP != nElem->elem.common.type); + offset = nElem->elem.disp; + break; + } OPAL_DATATYPE_SAFEGUARD_POINTER( source_base, end_loop->size, pConvertor->pBaseBuf, pConvertor->pDesc, pConvertor->count ); iov[index].iov_base = (IOVBASE_TYPE *) source_base; @@ -181,7 +190,7 @@ opal_convertor_raw( opal_convertor_t* pConvertor, raw_data += end_loop->size; count_desc--; } - source_base -= end_loop->first_elem_disp; + source_base -= offset; if( 0 == count_desc ) { /* completed */ pos_desc += pElem->loop.items + 1; goto update_loop_description; diff --git a/test/datatype/Makefile.am b/test/datatype/Makefile.am index cd867134a4..8efd0344ec 100644 --- a/test/datatype/Makefile.am +++ b/test/datatype/Makefile.am @@ -4,8 +4,8 @@ # reserved. # Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved. # Copyright (c) 2009 Oak Ridge National Labs. All rights reserved. -# Copyright (c) 2014-2015 Research Organization for Information Science -# and Technology (RIST). All rights reserved. +# Copyright (c) 2014-2019 Research Organization for Information Science +# and Technology (RIST). All rights reserved. # Copyright (c) 2016 IBM Corporation. All rights reserved. # $COPYRIGHT$ # @@ -15,7 +15,7 @@ # if PROJECT_OMPI - MPI_TESTS = checksum position position_noncontig ddt_test ddt_raw unpack_ooo ddt_pack external32 + MPI_TESTS = checksum position position_noncontig ddt_test ddt_raw ddt_raw2 unpack_ooo ddt_pack external32 MPI_CHECKS = to_self endif TESTS = opal_datatype_test unpack_hetero $(MPI_TESTS) @@ -40,6 +40,12 @@ ddt_raw_LDADD = \ $(top_builddir)/ompi/lib@OMPI_LIBMPI_NAME@.la \ $(top_builddir)/opal/lib@OPAL_LIB_PREFIX@open-pal.la +ddt_raw2_SOURCES = ddt_raw2.c ddt_lib.c ddt_lib.h +ddt_raw2_LDFLAGS = $(OMPI_PKG_CONFIG_LDFLAGS) +ddt_raw2_LDADD = \ + $(top_builddir)/ompi/lib@OMPI_LIBMPI_NAME@.la \ + $(top_builddir)/opal/lib@OPAL_LIB_PREFIX@open-pal.la + ddt_pack_SOURCES = ddt_pack.c ddt_pack_LDFLAGS = $(OMPI_PKG_CONFIG_LDFLAGS) ddt_pack_LDADD = \ diff --git a/test/datatype/ddt_raw2.c b/test/datatype/ddt_raw2.c new file mode 100644 index 0000000000..1c132b4d55 --- /dev/null +++ b/test/datatype/ddt_raw2.c @@ -0,0 +1,329 @@ +#include "ompi_config.h" +#include "ddt_lib.h" +#include "opal/datatype/opal_convertor.h" +#include "opal/datatype/opal_datatype_internal.h" +#include "opal/runtime/opal.h" + +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include + + +int mca_common_ompio_decode_datatype ( ompi_datatype_t *datatype, + int count, + struct iovec **iov, + uint32_t *iovec_count, + int increment) +{ + + + + opal_convertor_t *convertor; + size_t remaining_length = 0; + uint32_t i; + uint32_t temp_count; + struct iovec *temp_iov=NULL; + size_t temp_data; + + + convertor = opal_convertor_create( opal_local_arch, 0 ); + + if (OMPI_SUCCESS != opal_convertor_prepare_for_send (convertor, + &(datatype->super), + count, + NULL)) { + opal_output (1, "Cannot attach the datatype to a convertor\n"); + return OMPI_ERROR; + } + + if ( 0 == datatype->super.size ) { + *iovec_count = 0; + *iov = NULL; + return OMPI_SUCCESS; + } + + remaining_length = count * datatype->super.size; + + temp_count = increment; + temp_iov = (struct iovec*)malloc(temp_count * sizeof(struct iovec)); + if (NULL == temp_iov) { + opal_output (1, "OUT OF MEMORY\n"); + return OMPI_ERR_OUT_OF_RESOURCE; + } + + while (0 == opal_convertor_raw(convertor, + temp_iov, + &temp_count, + &temp_data)) { + *iovec_count = *iovec_count + temp_count; + *iov = (struct iovec *) realloc (*iov, *iovec_count * sizeof(struct iovec)); + if (NULL == *iov) { + opal_output(1, "OUT OF MEMORY\n"); + free(temp_iov); + return OMPI_ERR_OUT_OF_RESOURCE; + } + for (i=0 ; i 0 ) { + *iov = (struct iovec *) realloc (*iov, *iovec_count * sizeof(struct iovec)); + if (NULL == *iov) { + opal_output(1, "OUT OF MEMORY\n"); + free(temp_iov); + return OMPI_ERR_OUT_OF_RESOURCE; + } + } + for (i=0 ; isuper.flags = 3332; + datatype->super.id = 0; + datatype->super.bdt_used = 512; + datatype->super.size = 31684; + datatype->super.true_lb = 4; + datatype->super.true_ub = 218288; + datatype->super.lb = 0; + datatype->super.ub = 218344; + datatype->super.nbElems = 31684; + datatype->super.align = 1; + datatype->super.loops = 1146; + datatype->super.desc.length = 3351; + datatype->super.desc.used = 184; + datatype->super.desc.desc = descs; + datatype->super.opt_desc.length = 3351; + datatype->super.opt_desc.used = 184; + datatype->super.opt_desc.desc = descs; + + uint32_t iovec_count = 0; + struct iovec * iov = NULL; + mca_common_ompio_decode_datatype ( datatype, 1, &iov, &iovec_count, 300); + uint32_t iovec_count2 = 0; + struct iovec * iov2 = NULL; + mca_common_ompio_decode_datatype ( datatype, 1, &iov2, &iovec_count2, 100); + + assert(iovec_count == iovec_count2); + // assert(iov[100].iov_base == iov2[100].iov_base); + // assert(iov[100].iov_len == iov2[100].iov_len); + for (int i=0; i