Skip to content
Snippets Groups Projects
Commit d22af55a authored by Peter W. Draper's avatar Peter W. Draper
Browse files

Add dumping of updated fields to new log

parent 8ee066b9
No related branches found
No related tags found
No related merge requests found
CFLAGS = -g -O0 -Wall
all: swiftmpistepsim
swiftmpistepsim: swiftmpistepsim.c mpiuse.c mpiuse.h atomic.h cycle.h clocks.h clocks.c
$(CC) -g -O0 -Wall -o swiftmpistepsim swiftmpistepsim.c mpiuse.c clocks.c -I/usr/include/mpi -lmpi -lpthread
$(CC) $(CFLAGS) -o swiftmpistepsim swiftmpistepsim.c mpiuse.c clocks.c -I/usr/include/mpi -lmpi -lpthread
clean:
rm swiftmpistepsim
......@@ -31,10 +31,12 @@
/* Local includes. */
#include "atomic.h"
#include "clocks.h"
#include "cycle.h"
#include "error.h"
/* XXX threading support not needed, should remove. */
/* Our rank. */
extern int myrank;
/* The initial size and increment of the log entries buffer. */
#define MPIUSE_INITLOG 1000000
......@@ -134,7 +136,7 @@ void mpiuse_log_allocation(int rank, int step, size_t tic, int type,
/**
* @brief restore the log from a dump.
*
* @param filename name of file with the previus dump in.
* @param filename name of file with the previous dump in.
*/
void mpiuse_log_restore(const char *filename) {
......@@ -166,6 +168,64 @@ void mpiuse_log_restore(const char *filename) {
fclose(fd);
}
/**
* @brief dump the logs for all ranks to a file.
*
* @param nranks the number of ranks.
* @param dumpfile the file to write
*/
void mpiuse_dump_logs(int nranks, const char *dumpfile) {
/* Make sure output file is empty, only on one rank. */
FILE *fd;
if (myrank == 0) {
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");
fclose(fd);
}
MPI_Barrier(MPI_COMM_WORLD);
/* Loop over all ranks, one by one, getting each rank to append their
* logs. */
for (int k = 0; k < nranks; k++) {
/* Rank 0 decides the index of the writing node, this happens
* one-by-one. */
int kk = k;
MPI_Bcast(&kk, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (k == myrank) {
/* Open file and position at end. */
fd = fopen(dumpfile, "a");
/* And append our logs. Note log->tic is not necessarily from this
machine, so the conversion to ms may be suspect. */
size_t nlogs = mpiuse_log_count;
for (size_t k = 0; k < nlogs; k++) {
struct mpiuse_log_entry *log = &mpiuse_log[k];
if (log->rank == myrank && log->endtic > 0) {
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),
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);
}
}
}
/**
* @brief return the number of log entries.
*
......
......@@ -41,7 +41,7 @@ struct mpiuse_log_entry {
* same as delivered, need to match across ranks to see that. */
int activation;
/* Ticks at time of this action. */
/* Ticks at time of this action (original log). */
ticks tic;
/* Rank of otherside of communication. */
......@@ -53,11 +53,35 @@ struct mpiuse_log_entry {
/* Memory of the request. */
size_t size;
/* Extra information generated by the simulator. */
/* --------------------------------------------- */
/* Interaction is complete. */
int done;
/* Pointer to the data. */
void *data;
/* The request associated with the call. */
MPI_Request req;
/* The time that the injection started. */
ticks injtic;
/* The time that the exchange complete. */
ticks endtic;
/* The number of times that the exchange was tested. */
int nr_tests;
/* Sum of ticks that we tested. */
double tsum;
/* Maximum time in a test. */
ticks tmax;
/* Minimum time in a test. */
ticks tmin;
};
/* API. */
......@@ -68,5 +92,6 @@ 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);
#endif /* SWIFT_MPIUSE_H */
......@@ -20,6 +20,7 @@
#include <mpi.h>
#include <pthread.h>
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
......@@ -114,7 +115,16 @@ static void *inject_thread(void *arg) {
}
}
// Differences to SWIFT: MPI_BYTE might overflow, should use MPI_Type(?).
/* Initialise new log elements. */
log->done = 0;
log->nr_tests = 0;
log->tsum = 0.0;
log->tmax = 0;
log->tmin = INT_MAX;
log->endtic = 0;
log->injtic = getticks();
/* Differences to SWIFT: MPI_BYTE not the MPI_Type. */
int err = 0;
if (log->type == task_type_send) {
err = MPI_Isend(log->data, log->size, MPI_BYTE, log->otherrank, log->tag,
......@@ -180,10 +190,10 @@ static void queue_runner(struct mpiuse_log_entry **logs, int volatile *nr_logs,
int volatile *todos, double *sum, int *ncalls,
ticks *mint, ticks *maxt) {
/* MPI_Test statistics. */
/* Global MPI_Test statistics. */
int lncalls = 0;
double lsum = 0.0;
ticks lmint = log_clocks_cpufreq;
ticks lmint = INT_MAX;
ticks lmaxt = 0;
/* We loop while new requests are being injected and we still have requests
......@@ -192,7 +202,7 @@ static void queue_runner(struct mpiuse_log_entry **logs, int volatile *nr_logs,
int nlogs = *nr_logs;
for (int k = 0; k < nlogs; k++) {
struct mpiuse_log_entry *log = logs[k];
if (log != NULL) {
if (log != NULL && !log->done) {
ticks tics = getticks();
int res;
MPI_Status stat;
......@@ -200,16 +210,25 @@ static void queue_runner(struct mpiuse_log_entry **logs, int volatile *nr_logs,
if (err != MPI_SUCCESS) {
error("MPI_Test call failed");
}
/* Increment etc. of statistics about time in MPI_Test. */
ticks dt = getticks() - tics;
log->tsum += (double)dt;
lsum += (double)dt;
log->nr_tests++;
lncalls++;
if (dt < log->tmin) log->tmin = dt;
if (dt > log->tmax) log->tmax = dt;
if (dt < lmint) lmint = dt;
if (dt > lmaxt) lmaxt = dt;
if (res) {
if (res) {
/* Done, clean up. */
log->done = 1;
log->endtic = getticks();
free(log->data);
logs[k] = NULL;
atomic_dec(todos);
}
}
......@@ -334,7 +353,7 @@ static void pick_logs(void) {
* @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 logfile.dat\n", argv[0]);
fprintf(stderr, " options: -v verbose, -f fast injections\n");
fflush(stderr);
}
......@@ -370,11 +389,12 @@ int main(int argc, char *argv[]) {
return 1;
}
}
if (optind >= argc) {
if (optind >= argc - 1) {
if (myrank == 0) usage(argv);
return 1;
}
char *infile = argv[optind];
char *logfile = argv[optind+1];
/* Now we read the SWIFT MPI logger output that defines the communcations
* we will undertake and the time differences between injections into the
......@@ -420,10 +440,17 @@ int main(int argc, char *argv[]) {
pthread_join(sendthread, NULL);
pthread_join(recvthread, NULL);
/* Dump the updated MPI logs. */
MPI_Barrier(MPI_COMM_WORLD);
fflush(stdout);
if (myrank == 0) message("Dumping updated log");
mpiuse_dump_logs(nranks, logfile);
/* Shutdown MPI. */
res = MPI_Finalize();
if (res != MPI_SUCCESS)
error("call to MPI_Finalize failed with error %i.", res);
if (myrank == 0) message("Bye");
return 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment