Skip to content

Commit bcf1d5b

Browse files
committed
Added a partcomm fix for mismatched types
Signed-off-by: Matthew G. F. Dosanjh <[email protected]>
1 parent 8acb59d commit bcf1d5b

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

ompi/mca/part/persist/part_persist.h

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

ompi/mca/part/persist/part_persist_request.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ struct ompi_mca_persist_setup_t {
4040
int start_tag;
4141
int setup_tag;
4242
size_t num_parts;
43+
size_t dt_size;
4344
size_t count;
4445
};
4546

@@ -71,6 +72,7 @@ struct mca_part_persist_request_t {
7172

7273
size_t real_parts; /**< internal number of partitions */
7374
size_t real_count;
75+
size_t real_dt_size; /**< receiver needs to know how large the sender's datatype is. */
7476
size_t part_size;
7577

7678
ompi_request_t** persist_reqs; /**< requests for persistent sends/recvs */

0 commit comments

Comments
 (0)