diff --git a/swiftmpifakestepsim.c b/swiftmpifakestepsim.c index 2aa75cd9b89f5cf69852d2d95132238123b3b6ab..f5e0190855043fa7e1e929be18ae3ec5ac99a9ea 100644 --- a/swiftmpifakestepsim.c +++ b/swiftmpifakestepsim.c @@ -304,8 +304,9 @@ static int cmp_logs(const void *p1, const void *p2) { * The final list is sorted into increasing time of activation if required, * otherwise the order is randomized. * - * @param random randomize injection order, otherwise use order of the - * original logs. + * @param random randomize injection order of sends or sends and recvs, + * otherwise use order of the original logs. Just sends + * are randomized when 1, 2 randomizes both, 0 neither. */ static void pick_logs(int random) { size_t nlogs = mpiuse_nr_logs(); @@ -321,30 +322,65 @@ static void pick_logs(int random) { nlogs, sizeof(struct mpiuse_log_entry *)); nr_recvs = 0; - for (int k = 0; k < nlogs; k++) { - struct mpiuse_log_entry *log = mpiuse_get_log(k); - if (log->rank == myrank && log->activation) { - log->data = NULL; - reqs_queue[nr_reqs] = log; - nr_reqs++; + if (random == 0 || random == 2) { + for (int k = 0; k < nlogs; k++) { + struct mpiuse_log_entry *log = mpiuse_get_log(k); + if (log->rank == myrank && log->activation) { + log->data = NULL; + reqs_queue[nr_reqs] = log; + nr_reqs++; + } + } + + if (random == 0) { + /* Sort into increasing time. */ + qsort(reqs_queue, nr_reqs, sizeof(struct mpiuse_log_entry *), cmp_logs); + } else { + /* Randomize the order, so ranks do not all work in sequence. */ + mpiuse_shuffle_logs(reqs_queue, nr_reqs); } - } - if (!random) { - /* Sort into increasing time. */ - qsort(reqs_queue, nr_reqs, sizeof(struct mpiuse_log_entry *), cmp_logs); + /* Check. */ + if (random == 0) { + for (int k = 0; k < nr_reqs - 1; k++) { + if (reqs_queue[k]->tic > reqs_queue[k + 1]->tic) + message("reqs_queue: %lld > %lld", reqs_queue[k]->tic, + reqs_queue[k + 1]->tic); + } + } } else { - /* Randomize the order, so ranks do not all work in sequence. */ - mpiuse_shuffle_logs(reqs_queue, nr_reqs); - } - /* Check. */ - if (!random) { - for (int k = 0; k < nr_reqs - 1; k++) { - if (reqs_queue[k]->tic > reqs_queue[k + 1]->tic) - message("reqs_queue: %lld > %lld", reqs_queue[k]->tic, - reqs_queue[k + 1]->tic); + /* Randomizing the sends, but injecting the recvs first. */ + + /* Get recvs. */ + int nrecv = 0; + for (int k = 0; k < nlogs; k++) { + struct mpiuse_log_entry *log = mpiuse_get_log(k); + if (log->rank == myrank && log->activation && log->type == RECV_TYPE) { + log->data = NULL; + reqs_queue[nr_reqs] = log; + nr_reqs++; + nrecv++; + } } + + /* These are sorted into log time order. */ + qsort(reqs_queue, nrecv, sizeof(struct mpiuse_log_entry *), cmp_logs); + + /* Now the sends. */ + int nsend = 0; + for (int k = 0; k < nlogs; k++) { + struct mpiuse_log_entry *log = mpiuse_get_log(k); + if (log->rank == myrank && log->activation && log->type == SEND_TYPE) { + log->data = NULL; + reqs_queue[nr_reqs] = log; + nr_reqs++; + nsend++; + } + } + + /* These are randomized. */ + mpiuse_shuffle_logs(&reqs_queue[nrecv], nsend); } } @@ -395,7 +431,7 @@ int main(int argc, char *argv[]) { char *odata = NULL; int opt; unsigned int seed = default_seed; - while ((opt = getopt(argc, argv, "vds:rgx:c:o:f")) != -1) { + while ((opt = getopt(argc, argv, "vds:rgx:c:o:f:")) != -1) { switch (opt) { case 'd': datacheck = 1; @@ -404,7 +440,7 @@ int main(int argc, char *argv[]) { cdf = optarg; break; case 'f': - randomorder = 1; + randomorder = atoi(optarg); break; case 'g': uniform = 0; @@ -481,6 +517,12 @@ int main(int argc, char *argv[]) { } /* Each rank requires its own queue, so extract them. */ + if (verbose && myrank == 0) { + if (randomorder == 0) message("Message order same as generated"); + if (randomorder == 1) message("Message send order randomized"); + if (randomorder == 2) message("Message send and recv order randomized"); + } + pick_logs(randomorder); /* Time to start time. Try to make it synchronous across the ranks. */