diff --git a/Makefile b/Makefile index 8c350487dae05d2302c0f7cf27974c533f08e8b1..146c8c656c4aacc50debdbe7a16936ef810cc1cd 100644 --- a/Makefile +++ b/Makefile @@ -3,10 +3,10 @@ CFLAGS = -g -O0 -Wall all: swiftmpistepsim swiftmpifakestepsim swiftmpistepsim: swiftmpistepsim.c mpiuse.c mpiuse.h atomic.h cycle.h clocks.h clocks.c - mpicc $(CFLAGS) -o swiftmpistepsim swiftmpistepsim.c mpiuse.c clocks.c -lpthread + mpicc $(CFLAGS) -o swiftmpistepsim swiftmpistepsim.c mpiuse.c clocks.c -lpthread -lm swiftmpifakestepsim: swiftmpifakestepsim.c mpiuse.c mpiuse.h atomic.h cycle.h clocks.h clocks.c - mpicc $(CFLAGS) -o swiftmpifakestepsim swiftmpifakestepsim.c mpiuse.c clocks.c -lpthread + mpicc $(CFLAGS) -o swiftmpifakestepsim swiftmpifakestepsim.c mpiuse.c clocks.c -lpthread -lm clean: rm -f swiftmpistepsim diff --git a/mpiuse.c b/mpiuse.c index b8f6ddfa4ca02fba008372b4a945fdb14d595359..c194495b98c0f4f8c2fb06d52c3da45268c2f3d1 100644 --- a/mpiuse.c +++ b/mpiuse.c @@ -22,6 +22,7 @@ */ /* Standard includes. */ +#include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -258,18 +259,39 @@ struct mpiuse_log_entry *mpiuse_get_log(int ind) { return NULL; } +/** + * @brief return random number from a upper part of gaussian distribution. + * + * @result the random. + */ +static double gauss_rand_upper(void) { + + double V1, V2, S; + do { + double U1 = drand48(); + double U2 = drand48(); + + V1 = U1 - 1.0; + V2 = U2 - 1.0; + S = V1 * V1 + V2 * V2; + } while(S >= 1.0 || S == 0.0); + + return fabs(V1 * sqrt(-2.0 * log(S) / S)); +} + /** * @brief generate a list of fake exchanges as mpiuse logs. * * @param nr_nodes the number of ranks that will be used. * @param nr_logs the number of logs to generate per rank. * @param size bytes per message, unless random when this is the maximum - * and the minimum is 1. + * and the minimum is 1 for uniform and 2.5 sigma for gaussian. * @param random whether to use random sizes. * @param seed the random seed, use same for fixed sequences. + * @param uniform whether to use a uniform distribution. */ void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random, - long int seed) { + long int seed, int uniform) { /* Each rank exchanges messages with all the others and each "log" has the * same size. */ @@ -277,8 +299,18 @@ void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random, int tag = 1; for (int k = 0; k < nr_logs; k++) { + + /* Set size for this messages. */ int logsize = size; - if (random) logsize = (drand48() * (double)size) + 1; + if (random) { + if (uniform) { + logsize = (drand48() * (double)size) + 1; + } else { + // Gaussian so no maximum, assume size is 2.5 sigma. + logsize = (gauss_rand_upper() * (double)size * 0.25) + 1; + } + } + for (int i = 0; i < nr_nodes; i++) { for (int j = 0; j < nr_nodes; j++) { if (i != j) { diff --git a/mpiuse.h b/mpiuse.h index 46aaad5974ad2115b60e62edaa06b75326c9e070..feae1e6f7999a30fb79c9aa4b1ed9844a59a1fce 100644 --- a/mpiuse.h +++ b/mpiuse.h @@ -102,6 +102,6 @@ int mpiuse_nr_ranks(void); void mpiuse_dump_logs(int nranks, const char *logfile); void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random, - long int seed); + long int seed, int uniform); #endif /* SWIFT_MPIUSE_H */ diff --git a/swiftmpifakestepsim.c b/swiftmpifakestepsim.c index 50887c8c611f6df9a6aab7a611ba147f6e9d90bc..7d991b752bbc1fb292414f65bf5e3bfd116d1d24 100644 --- a/swiftmpifakestepsim.c +++ b/swiftmpifakestepsim.c @@ -341,8 +341,9 @@ static void pick_logs(void) { static void usage(char *argv[]) { fprintf(stderr, "Usage: %s [-vf] nr_messages logfile.dat\n", argv[0]); - fprintf(stderr, " options: -v verbose, -d data check, -s size (bytes), -r" - " random from 0 to size\n"); + fprintf(stderr, " options: -v verbose, -d data check, -s size (bytes), " + "-r uniform random from 1 to size, " + "-r -g half gaussian random from 1 with 2.5 sigma size.\n"); fflush(stderr); } @@ -370,8 +371,9 @@ int main(int argc, char *argv[]) { * whether to use a random selection (with a fixed seed). */ int size = 1024; int random = 0; + int uniform = 1; int opt; - while ((opt = getopt(argc, argv, "vds:r")) != -1) { + while ((opt = getopt(argc, argv, "vds:rg")) != -1) { switch (opt) { case 'd': datacheck = 1; @@ -382,6 +384,9 @@ int main(int argc, char *argv[]) { case 'r': random = 1; break; + case 'g': + uniform = 0; + break; case 'v': verbose = 1; break; @@ -403,14 +408,19 @@ int main(int argc, char *argv[]) { /* Generate the fake logs for the exchanges. */ if (myrank == 0) { if (random) { - message("Generating %d fake logs for %d ranks with random distribution" - " up to size %d", nr_logs, nr_nodes, size); + if (uniform) { + message("Generating %d fake logs for %d ranks with random distribution" + " using size %d", nr_logs, nr_nodes, size); + } else { + message("Generating %d fake logs for %d ranks with gaussian random " + "distribution using size %d as 2.5 sigma", nr_logs, nr_nodes, size); + } } else { message("Generating %d fake logs for %d ranks of size %d", nr_logs, nr_nodes, size); } } - mpiuse_log_generate(nr_nodes, nr_logs, size, random, seed); + mpiuse_log_generate(nr_nodes, nr_logs, size, random, seed, uniform); int nranks = mpiuse_nr_ranks(); /* Each rank requires its own queue, so extract them. */