This source file includes following definitions.
- ompi_datatype_sndrcv
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 #include "ompi_config.h"
  24 
  25 #include "opal/datatype/opal_datatype.h"
  26 #include "opal/datatype/opal_datatype_internal.h"
  27 #include "opal/datatype/opal_convertor.h"
  28 #include "ompi/datatype/ompi_datatype.h"
  29 #include "ompi/datatype/ompi_datatype_internal.h"
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 
  38 
  39 
  40 
  41 
  42 
  43 
  44 
  45 int32_t ompi_datatype_sndrcv( const void *sbuf, int32_t scount, const ompi_datatype_t* sdtype,
  46                               void *rbuf, int32_t rcount, const ompi_datatype_t* rdtype)
  47 {
  48     opal_convertor_t send_convertor, recv_convertor;
  49     struct iovec iov;
  50     int length, completed;
  51     uint32_t iov_count;
  52     size_t max_data;
  53 
  54     
  55     if (0 == rcount || 0 == rdtype->super.size) {
  56         return ((0 == scount || 0 == sdtype->super.size) ? MPI_SUCCESS : MPI_ERR_TRUNCATE);
  57     }
  58 
  59     
  60     if (sdtype == rdtype) {
  61         int32_t count = ( scount < rcount ? scount : rcount );
  62         opal_datatype_copy_content_same_ddt(&(rdtype->super), count, (char*)rbuf, (char*)sbuf);
  63         return ((scount > rcount) ? MPI_ERR_TRUNCATE : MPI_SUCCESS);
  64     }
  65 
  66     
  67     if (rdtype->id == OMPI_DATATYPE_MPI_PACKED) {
  68         OBJ_CONSTRUCT( &send_convertor, opal_convertor_t );
  69         opal_convertor_copy_and_prepare_for_send( ompi_mpi_local_convertor,
  70                                                   &(sdtype->super), scount, sbuf, 0,
  71                                                   &send_convertor );
  72 
  73         iov_count = 1;
  74         iov.iov_base = (IOVBASE_TYPE*)rbuf;
  75         iov.iov_len = scount * sdtype->super.size;
  76         if( (int32_t)iov.iov_len > rcount ) iov.iov_len = rcount;
  77 
  78         opal_convertor_pack( &send_convertor, &iov, &iov_count, &max_data );
  79         OBJ_DESTRUCT( &send_convertor );
  80         return ((max_data < (size_t)rcount) ? MPI_ERR_TRUNCATE : MPI_SUCCESS);
  81     }
  82 
  83     
  84     if (sdtype->id == OMPI_DATATYPE_MPI_PACKED) {
  85         OBJ_CONSTRUCT( &recv_convertor, opal_convertor_t );
  86         opal_convertor_copy_and_prepare_for_recv( ompi_mpi_local_convertor,
  87                                                   &(rdtype->super), rcount, rbuf, 0,
  88                                                   &recv_convertor );
  89 
  90         iov_count = 1;
  91         iov.iov_base = (IOVBASE_TYPE*)sbuf;
  92         iov.iov_len = rcount * rdtype->super.size;
  93         if( (int32_t)iov.iov_len > scount ) iov.iov_len = scount;
  94 
  95         opal_convertor_unpack( &recv_convertor, &iov, &iov_count, &max_data );
  96         OBJ_DESTRUCT( &recv_convertor );
  97         return (((size_t)scount > max_data) ? MPI_ERR_TRUNCATE : MPI_SUCCESS);
  98     }
  99 
 100     iov.iov_len = length = 64 * 1024;
 101     iov.iov_base = (IOVBASE_TYPE*)malloc( length * sizeof(char) );
 102 
 103     OBJ_CONSTRUCT( &send_convertor, opal_convertor_t );
 104     opal_convertor_copy_and_prepare_for_send( ompi_mpi_local_convertor,
 105                                               &(sdtype->super), scount, sbuf, 0,
 106                                               &send_convertor );
 107     OBJ_CONSTRUCT( &recv_convertor, opal_convertor_t );
 108     opal_convertor_copy_and_prepare_for_recv( ompi_mpi_local_convertor,
 109                                               &(rdtype->super), rcount, rbuf, 0,
 110                                               &recv_convertor );
 111 
 112     completed = 0;
 113     while( !completed ) {
 114         iov.iov_len = length;
 115         iov_count = 1;
 116         max_data = length;
 117         completed |= opal_convertor_pack( &send_convertor, &iov, &iov_count, &max_data );
 118         completed |= opal_convertor_unpack( &recv_convertor, &iov, &iov_count, &max_data );
 119     }
 120     free( iov.iov_base );
 121     OBJ_DESTRUCT( &send_convertor );
 122     OBJ_DESTRUCT( &recv_convertor );
 123 
 124     return ( (scount * sdtype->super.size) <= (rcount * rdtype->super.size) ? MPI_SUCCESS : MPI_ERR_TRUNCATE );
 125 }