@@ -258,19 +258,32 @@ mca_part_persist_progress(void)
258
258
req -> my_recv_tag = req -> setup_info [1 ].setup_tag ;
259
259
req -> real_parts = req -> setup_info [1 ].num_parts ;
260
260
req -> real_count = req -> setup_info [1 ].count ;
261
+ req -> real_dt_size = req -> setup_info [1 ].dt_size ;
262
+
261
263
262
264
err = opal_datatype_type_size (& (req -> req_datatype -> super ), & dt_size_ );
263
265
if (OMPI_SUCCESS != err ) return OMPI_ERROR ;
264
266
dt_size = (dt_size_ > (size_t ) INT_MAX ) ? MPI_UNDEFINED : (int ) dt_size_ ;
265
267
int32_t bytes = req -> real_count * dt_size ;
266
268
267
- /* Set up persistent sends */
269
+
270
+
271
+ /* Set up persistent sends */
268
272
req -> persist_reqs = (ompi_request_t * * ) malloc (sizeof (ompi_request_t * )* (req -> real_parts ));
269
273
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
+ }
274
287
err = req -> persist_reqs [0 ]-> req_start (req -> real_parts , (& (req -> persist_reqs [0 ])));
275
288
276
289
/* Send back a message */
@@ -372,7 +385,6 @@ mca_part_persist_precv_init(void *buf,
372
385
dt_size = (dt_size_ > (size_t ) INT_MAX ) ? MPI_UNDEFINED : (int ) dt_size_ ;
373
386
req -> req_bytes = parts * count * dt_size ;
374
387
375
-
376
388
/* Set ompi request initial values */
377
389
req -> req_ompi .req_persistent = true;
378
390
req -> req_part_complete = true;
@@ -433,8 +445,6 @@ mca_part_persist_psend_init(const void* buf,
433
445
dt_size = (dt_size_ > (size_t ) INT_MAX ) ? MPI_UNDEFINED : (int ) dt_size_ ;
434
446
req -> req_bytes = parts * count * dt_size ;
435
447
436
-
437
-
438
448
/* non-blocking send set-up data */
439
449
req -> setup_info [0 ].world_rank = ompi_comm_rank (& ompi_mpi_comm_world .comm );
440
450
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,
445
455
req -> real_parts = parts ;
446
456
req -> setup_info [0 ].count = count ;
447
457
req -> real_count = count ;
448
-
458
+ req -> setup_info [ 0 ]. dt_size = dt_size ;
449
459
450
460
req -> flags = (int * ) calloc (req -> real_parts , sizeof (int ));
451
461
0 commit comments