diff --git a/mpiuse.c b/mpiuse.c index e25981defe39914f325f895eb382fd2d7c1e3827..f49baa86fcd5f1f745c8c5425b8f6f4d50746285 100644 --- a/mpiuse.c +++ b/mpiuse.c @@ -174,9 +174,11 @@ void mpiuse_log_restore(const char *filename) { * @brief dump the logs for all ranks to a file. * * @param nranks the number of ranks. + * @param standard only write a standard log, this can be used as input to + * other runs. * @param dumpfile the file to write */ -void mpiuse_dump_logs(int nranks, const char *dumpfile) { +void mpiuse_dump_logs(int nranks, int standard, const char *dumpfile) { /* Make sure output file is empty, only on one rank. */ FILE *fd; @@ -184,13 +186,21 @@ void mpiuse_dump_logs(int nranks, const char *dumpfile) { fd = fopen(dumpfile, "w"); /* Header. */ - fprintf(fd, - "# logticin logtic injtic endtic dtic step rank otherrank itype " - " isubtype tag size nr_tests tsum tmin tmax\n"); + if (standard) { + fprintf(fd, + "# stic etic dtic step rank otherrank type itype " + " subtype isubtype activation tag size sum\n"); + } else { + fprintf(fd, + "# logticin logtic injtic endtic dtic step rank otherrank itype " + " isubtype tag size nr_tests tsum tmin tmax\n"); + } fclose(fd); } MPI_Barrier(MPI_COMM_WORLD); + const char *types[] = {"send", "recv"}; + /* Loop over all ranks, one by one, getting each rank to append their * logs. */ for (int k = 0; k < nranks; k++) { @@ -210,20 +220,31 @@ void mpiuse_dump_logs(int nranks, const char *dumpfile) { * version to match the expected injection times for this new run. */ size_t nlogs = mpiuse_log_count; ticks basetics = 0; + long long sum = 0; for (size_t k = 0; k < nlogs; k++) { struct mpiuse_log_entry *log = &mpiuse_log[k]; if (log->rank == myrank && log->endtic > 0) { if (basetics == 0) basetics = log->tic; - fprintf(fd, - "%lld %.4f %.4f %.4f %.6f %d %d %d %d %d %d %zd %d %.4f %.6f " - "%.6f\n", - log->tic, clocks_from_ticks(log->tic - basetics), - clocks_from_ticks(log->injtic - clocks_start_ticks), - clocks_from_ticks(log->endtic - clocks_start_ticks), - clocks_from_ticks(log->endtic - log->injtic), log->step, - log->rank, log->otherrank, log->type, log->subtype, log->tag, - log->size, log->nr_tests, clocks_from_ticks(log->tsum), - clocks_from_ticks(log->tmin), clocks_from_ticks(log->tmax)); + if (standard) { + fprintf(fd, "%lld %lld %lld %d %d %d %s %d %s %d %d %d %zd %lld\n", + log->injtic, log->injtic, log->endtic - log->injtic, + log->step, log->rank, log->otherrank, + types[log->type - SEND_TYPE], log->type, "none", + log->subtype, log->activation, log->tag, log->size, sum); + sum += log->size; + } else { + fprintf( + fd, + "%lld %.4f %.4f %.4f %.6f %d %d %d %d %d %d %zd %d %.4f %.6f " + "%.6f\n", + log->tic, clocks_from_ticks(log->tic - basetics), + clocks_from_ticks(log->injtic - clocks_start_ticks), + clocks_from_ticks(log->endtic - clocks_start_ticks), + clocks_from_ticks(log->endtic - log->injtic), log->step, + log->rank, log->otherrank, log->type, log->subtype, log->tag, + log->size, log->nr_tests, clocks_from_ticks(log->tsum), + clocks_from_ticks(log->tmin), clocks_from_ticks(log->tmax)); + } } } fclose(fd); diff --git a/mpiuse.h b/mpiuse.h index 71d8982f0cbb020dd6a563d2f8cb756ccacf3dd5..7ae96d6a16fdc436f783f33513b32e99f71dbb75 100644 --- a/mpiuse.h +++ b/mpiuse.h @@ -88,7 +88,7 @@ struct mpiuse_log_entry { #ifndef SEND_TYPE #define SEND_TYPE 25 #define RECV_TYPE 26 -#define NO_SUBTYPE 0 +#define NO_SUBTYPE 1 #endif /* API. */ @@ -99,7 +99,7 @@ struct mpiuse_log_entry *mpiuse_get_log(int ind); void mpiuse_log_restore(const char *filename); int mpiuse_nr_logs(void); int mpiuse_nr_ranks(void); -void mpiuse_dump_logs(int nranks, const char *logfile); +void mpiuse_dump_logs(int nranks, int standard, const char *logfile); void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random, long int seed, int uniform, const char *cdf, diff --git a/swiftmpifakestepsim.c b/swiftmpifakestepsim.c index 2ded9e0f8b6960f29b53ac1d15e183fbd99f914d..e73ab832dd73c87342c7d99b260d7b204a4417ce 100644 --- a/swiftmpifakestepsim.c +++ b/swiftmpifakestepsim.c @@ -388,7 +388,7 @@ static void pick_logs(int random) { * @brief usage help. */ static void usage(char *argv[]) { - fprintf(stderr, "Usage: %s [options] nr_messages logfile.dat\n", argv[0]); + fprintf(stderr, "Usage: %s [vds:rgx:c:o:f:z] nr_messages logfile.dat\n", argv[0]); fprintf(stderr, " options: -v verbose, -d data check, -s size (bytes/scale), \n" "\t -f <1|2> randomize injection order, 1 == just sends, " @@ -398,7 +398,8 @@ static void usage(char *argv[]) { "\t-r -c <file> use cdf from file, size is a scale factor., |\n" "\t-r -o <file> use occurence sample of values in a file, size is a " "scale factor.,] \n" - "\t-x random seed\n"); + "\t-x random seed\n" + "\t-z outout log in standard format, i.e. can be used as input"); fflush(stderr); } @@ -424,15 +425,16 @@ int main(int argc, char *argv[]) { /* Handle the command-line, we expect the number of messages to exchange per * rank an output log and some options, the interesting ones are a size and * whether to use a random selections of various kinds. */ - int size = 1024; - int random = 0; - int randomorder = 0; - int uniform = 1; char *cdf = NULL; char *odata = NULL; int opt; + int random = 0; + int randomorder = 0; + int size = 1024; + int standard = 0; + int uniform = 1; 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:z")) != -1) { switch (opt) { case 'd': datacheck = 1; @@ -458,6 +460,9 @@ int main(int argc, char *argv[]) { case 'v': verbose = 1; break; + case 'z': + standard = 1; + break; case 'x': seed = atol(optarg); break; @@ -557,7 +562,7 @@ int main(int argc, char *argv[]) { MPI_Barrier(MPI_COMM_WORLD); fflush(stdout); if (myrank == 0) message("Dumping updated log"); - mpiuse_dump_logs(nranks, logfile); + mpiuse_dump_logs(nranks, standard, logfile); /* Shutdown MPI. */ res = MPI_Finalize();