From c9ad5d1f24cab2c2d22e0f4ba744d750fce27a00 Mon Sep 17 00:00:00 2001 From: Brian Barrett Date: Fri, 13 Jul 2007 21:26:12 +0000 Subject: [PATCH] ooops, need to handle case where extents are not same as type sizes This commit was SVN r15423. --- ompi/mca/osc/base/osc_base_obj_convert.c | 34 ++++++++++++++++-------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/ompi/mca/osc/base/osc_base_obj_convert.c b/ompi/mca/osc/base/osc_base_obj_convert.c index 06c03ced2d..5ff5e29853 100644 --- a/ompi/mca/osc/base/osc_base_obj_convert.c +++ b/ompi/mca/osc/base/osc_base_obj_convert.c @@ -39,18 +39,30 @@ struct ompi_osc_base_convertor_t { typedef struct ompi_osc_base_convertor_t ompi_osc_base_convertor_t; static OBJ_CLASS_INSTANCE(ompi_osc_base_convertor_t, ompi_convertor_t, NULL, NULL); -#define COPY_TYPE( TYPENAME, TYPE, COUNT ) \ -static int copy_##TYPENAME( ompi_convertor_t *pConvertor, uint32_t count, \ +#define COPY_TYPE( TYPENAME, TYPE, COUNT ) \ +static int copy_##TYPENAME( ompi_convertor_t *pConvertor, uint32_t count, \ char* from, size_t from_len, ptrdiff_t from_extent, \ - char* to, size_t to_len, ptrdiff_t to_extent, \ - ptrdiff_t *advance) \ -{ \ - ompi_osc_base_convertor_t *osc_convertor = \ - (ompi_osc_base_convertor_t*) pConvertor; \ - \ - ompi_op_reduce(osc_convertor->op, from, to, count, osc_convertor->datatype); \ - *advance = count * from_extent; \ - return count; \ + char* to, size_t to_len, ptrdiff_t to_extent, \ + ptrdiff_t *advance) \ +{ \ + size_t remote_TYPE_size = sizeof(TYPE) * (COUNT); /* TODO */ \ + size_t local_TYPE_size = (COUNT) * sizeof(TYPE); \ + ompi_osc_base_convertor_t *osc_convertor = \ + (ompi_osc_base_convertor_t*) pConvertor; \ + \ + if( (from_extent == (ptrdiff_t)local_TYPE_size) && \ + (to_extent == (ptrdiff_t)remote_TYPE_size) ) { \ + ompi_op_reduce(osc_convertor->op, from, to, count, osc_convertor->datatype); \ + } else { \ + uint32_t i; \ + for( i = 0; i < count; i++ ) { \ + ompi_op_reduce(osc_convertor->op, from, to, 1, osc_convertor->datatype); \ + to += to_extent; \ + from += from_extent; \ + } \ + } \ + *advance = count * from_extent; \ + return count; \ } /* set up copy functions for the basic C MPI data types */