diff --git a/swiftmpiproxies.c b/swiftmpiproxies.c index f9470c08e61a17397f914dc1828aef3b980e404f..80568dd3988118dd4e541aa2c1270d8bd4b82da2 100644 --- a/swiftmpiproxies.c +++ b/swiftmpiproxies.c @@ -61,11 +61,14 @@ int nr_recv_pcells = 0; */ static void pick_logs(void) { size_t nlogs = mpiuse_nr_logs(); + if (verbose) message("Restored %zd logs", nlogs); - /* Duplicate of logs. */ - send_pcells = (struct mpiuse_log_entry **)calloc(nlogs, sizeof(struct mpiuse_log_entry *)); + /* Separated logs. */ + send_pcells = (struct mpiuse_log_entry **)calloc( + nlogs, sizeof(struct mpiuse_log_entry *)); nr_send_pcells = 0; - recv_pcells = (struct mpiuse_log_entry **)calloc(nlogs, sizeof(struct mpiuse_log_entry *)); + recv_pcells = (struct mpiuse_log_entry **)calloc( + nlogs, sizeof(struct mpiuse_log_entry *)); nr_recv_pcells = 0; for (int k = 0; k < nlogs; k++) { @@ -73,10 +76,12 @@ static void pick_logs(void) { if (log->rank == myrank && log->activation) { log->data = NULL; if (log->type == task_type_send) { + if (log->subtype == task_subtype_pcells) { send_pcells[nr_send_pcells] = log; nr_send_pcells++; - } else if (log->subtype != task_subtype_count) { + } else if (log->subtype != task_subtype_pcells && + log->subtype != task_subtype_count) { error("task subtype '%d' is not a known value", log->subtype); } @@ -85,7 +90,8 @@ static void pick_logs(void) { if (log->subtype == task_subtype_pcells) { recv_pcells[nr_recv_pcells] = log; nr_recv_pcells++; - } else if (log->subtype != task_subtype_count) { + } else if (log->subtype != task_subtype_pcells && + log->subtype != task_subtype_count) { error("task subtype '%d' is not a known value", log->subtype); } @@ -94,14 +100,16 @@ static void pick_logs(void) { } } } + if (verbose) + message("Read %d send and %d recv pcells logs", nr_send_pcells, + nr_recv_pcells); } /** * @brief usage help. */ static void usage(char *argv[]) { - fprintf(stderr, "Usage: %s [-vf] SWIFT_mpiuse-log-file.dat\n", - argv[0]); + fprintf(stderr, "Usage: %s [-vf] SWIFT_mpiuse-log-file.dat\n", argv[0]); fprintf(stderr, " options: -v verbose\n"); fflush(stderr); } @@ -175,33 +183,31 @@ int main(int argc, char *argv[]) { struct mpiuse_log_entry *log = send_pcells[k]; /* Need to regenerate the tags for each other communication type. */ - int basetag = log->rank * proxy_tag_shift; + int basetag = myrank * proxy_tag_shift; /* Start Isend counts of pcells. Really just the size of the buffer we're * about to send, SWIFT sends the count. */ int size = log->size; - res = MPI_Isend(&size, 1, MPI_INT, log->otherrank, - basetag + proxy_tag_count, - MPI_COMM_WORLD, &req_send_counts[k]); - if (res != MPI_SUCCESS) - error("Counts MPI_Isend failed."); + res = + MPI_Isend(&size, 1, MPI_INT, log->otherrank, basetag + proxy_tag_count, + MPI_COMM_WORLD, &req_send_counts[k]); + if (res != MPI_SUCCESS) error("Counts MPI_Isend failed."); /* Start Isend of pcells. */ log->data = calloc(log->size, 1); res = MPI_Isend(log->data, log->size, MPI_BYTE, log->otherrank, basetag + proxy_tag_cells, MPI_COMM_WORLD, &req_pcells_out[k]); - if (res != MPI_SUCCESS) - error("Pcell MPI_Isend failed."); + if (res != MPI_SUCCESS) error("Pcell MPI_Isend failed."); /* Start Irecv counts of pcells from other rank. */ - basetag = log->rank * proxy_tag_shift; + basetag = log->otherrank * proxy_tag_shift; res = MPI_Irecv(&pcells_size[k], 1, MPI_INT, log->otherrank, basetag + proxy_tag_count, MPI_COMM_WORLD, &req_recv_counts[k]); - if (res != MPI_SUCCESS) - error("Counts MPI_Irecv failed."); + if (res != MPI_SUCCESS) error("Counts MPI_Irecv failed."); } + message("All counts requests and pcell sends are launched"); /* Now wait for any of the counts irecvs to complete and then create the * irecv for the pcells. */ @@ -213,23 +219,23 @@ int main(int argc, char *argv[]) { res = MPI_Waitany(nr_send_pcells, req_recv_counts, &pid, &status); if (res != MPI_SUCCESS || pid == MPI_UNDEFINED) error("MPI_Waitany failed."); + if (verbose) message("Counts received for proxy %d", pid); struct mpiuse_log_entry *log = send_pcells[pid]; - int basetag = log->rank * proxy_tag_shift; + int basetag = log->otherrank * proxy_tag_shift; pcells_in[pid] = calloc(pcells_size[pid], 1); - res = MPI_Irecv(pcells_in[pid], pcells_size[pid], MPI_BYTE, - log->otherrank, basetag + proxy_tag_cells, - MPI_COMM_WORLD, &req_pcells_in[pid]); + res = MPI_Irecv(pcells_in[pid], pcells_size[pid], MPI_BYTE, log->otherrank, + basetag + proxy_tag_cells, MPI_COMM_WORLD, + &req_pcells_in[pid]); - if (res != MPI_SUCCESS) - error("Pcell MPI_Irecv failed."); + if (res != MPI_SUCCESS) error("Pcell MPI_Irecv failed."); } - + message("All proxy cell counts have arrived"); + /* Waitall for all Isend counts to complete. */ res = MPI_Waitall(nr_send_pcells, req_send_counts, MPI_STATUSES_IGNORE); - if (res != MPI_SUCCESS) - error("Waitall for counts Isend failed."); + if (res != MPI_SUCCESS) error("Waitall for counts Isend failed."); /* Now wait for the pcell irecvs to complete, so we receive the pcells, * which would be unpacked in SWIFT. */ @@ -242,11 +248,11 @@ int main(int argc, char *argv[]) { /* XXX check the data received is correct? */ } + message("All proxy cells have arrived"); /* Waitall for Isend of pcells to complete. */ res = MPI_Waitall(nr_send_pcells, req_pcells_out, MPI_STATUSES_IGNORE); - if (res != MPI_SUCCESS) - error("Waitall for pcells Isend failed."); + if (res != MPI_SUCCESS) error("Waitall for pcells Isend failed."); /* Shutdown MPI. */ res = MPI_Finalize();