@@ -258,19 +258,32 @@ mca_part_persist_progress(void)
258258 req -> my_recv_tag = req -> setup_info [1 ].setup_tag ;
259259 req -> real_parts = req -> setup_info [1 ].num_parts ;
260260 req -> real_count = req -> setup_info [1 ].count ;
261+ req -> real_dt_size = req -> setup_info [1 ].dt_size ;
262+
261263
262264 err = opal_datatype_type_size (& (req -> req_datatype -> super ), & dt_size_ );
263265 if (OMPI_SUCCESS != err ) return OMPI_ERROR ;
264266 dt_size = (dt_size_ > (size_t ) INT_MAX ) ? MPI_UNDEFINED : (int ) dt_size_ ;
265267 int32_t bytes = req -> real_count * dt_size ;
266268
267- /* Set up persistent sends */
269+
270+
271+ /* Set up persistent sends */
268272 req -> persist_reqs = (ompi_request_t * * ) malloc (sizeof (ompi_request_t * )* (req -> real_parts ));
269273 req -> flags = (int * ) calloc (req -> real_parts ,sizeof (int ));
270- for (i = 0 ; i < req -> real_parts ; i ++ ) {
271- void * buf = ((void * ) (((char * )req -> req_addr ) + (bytes * i )));
272- err = MCA_PML_CALL (irecv_init (buf , req -> real_count , req -> req_datatype , req -> world_peer , req -> my_send_tag + i , ompi_part_persist .part_comm , & (req -> persist_reqs [i ])));
273- }
274+
275+ if (req -> real_dt_size == dt_size ) {
276+
277+ for (i = 0 ; i < req -> real_parts ; i ++ ) {
278+ void * buf = ((void * ) (((char * )req -> req_addr ) + (bytes * i )));
279+ err = MCA_PML_CALL (irecv_init (buf , req -> real_count , req -> req_datatype , req -> world_peer , req -> my_send_tag + i , ompi_part_persist .part_comm , & (req -> persist_reqs [i ])));
280+ }
281+ } else {
282+ for (i = 0 ; i < req -> real_parts ; i ++ ) {
283+ void * buf = ((void * ) (((char * )req -> req_addr ) + (req -> real_count * req -> real_dt_size * i )));
284+ err = MCA_PML_CALL (irecv_init (buf , req -> real_count * req -> real_dt_size , MPI_BYTE , req -> world_peer , req -> my_send_tag + i , ompi_part_persist .part_comm , & (req -> persist_reqs [i ])));
285+ }
286+ }
274287 err = req -> persist_reqs [0 ]-> req_start (req -> real_parts , (& (req -> persist_reqs [0 ])));
275288
276289 /* Send back a message */
@@ -372,7 +385,6 @@ mca_part_persist_precv_init(void *buf,
372385 dt_size = (dt_size_ > (size_t ) INT_MAX ) ? MPI_UNDEFINED : (int ) dt_size_ ;
373386 req -> req_bytes = parts * count * dt_size ;
374387
375-
376388 /* Set ompi request initial values */
377389 req -> req_ompi .req_persistent = true;
378390 req -> req_part_complete = true;
@@ -433,8 +445,6 @@ mca_part_persist_psend_init(const void* buf,
433445 dt_size = (dt_size_ > (size_t ) INT_MAX ) ? MPI_UNDEFINED : (int ) dt_size_ ;
434446 req -> req_bytes = parts * count * dt_size ;
435447
436-
437-
438448 /* non-blocking send set-up data */
439449 req -> setup_info [0 ].world_rank = ompi_comm_rank (& ompi_mpi_comm_world .comm );
440450 req -> setup_info [0 ].start_tag = ompi_part_persist .next_send_tag ; ompi_part_persist .next_send_tag += parts ;
@@ -445,7 +455,7 @@ mca_part_persist_psend_init(const void* buf,
445455 req -> real_parts = parts ;
446456 req -> setup_info [0 ].count = count ;
447457 req -> real_count = count ;
448-
458+ req -> setup_info [ 0 ]. dt_size = dt_size ;
449459
450460 req -> flags = (int * ) calloc (req -> real_parts , sizeof (int ));
451461
0 commit comments