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

Add upper gaussian size distribution

parent 6edf9246
No related branches found
No related tags found
1 merge request!6Version with faked data
...@@ -3,10 +3,10 @@ CFLAGS = -g -O0 -Wall ...@@ -3,10 +3,10 @@ CFLAGS = -g -O0 -Wall
all: swiftmpistepsim swiftmpifakestepsim all: swiftmpistepsim swiftmpifakestepsim
swiftmpistepsim: swiftmpistepsim.c mpiuse.c mpiuse.h atomic.h cycle.h clocks.h clocks.c 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 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: clean:
rm -f swiftmpistepsim rm -f swiftmpistepsim
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
*/ */
/* Standard includes. */ /* Standard includes. */
#include <math.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
...@@ -258,18 +259,39 @@ struct mpiuse_log_entry *mpiuse_get_log(int ind) { ...@@ -258,18 +259,39 @@ struct mpiuse_log_entry *mpiuse_get_log(int ind) {
return NULL; 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. * @brief generate a list of fake exchanges as mpiuse logs.
* *
* @param nr_nodes the number of ranks that will be used. * @param nr_nodes the number of ranks that will be used.
* @param nr_logs the number of logs to generate per rank. * @param nr_logs the number of logs to generate per rank.
* @param size bytes per message, unless random when this is the maximum * @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 random whether to use random sizes.
* @param seed the random seed, use same for fixed sequences. * @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, 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 /* Each rank exchanges messages with all the others and each "log" has the
* same size. */ * same size. */
...@@ -277,8 +299,18 @@ void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random, ...@@ -277,8 +299,18 @@ void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random,
int tag = 1; int tag = 1;
for (int k = 0; k < nr_logs; k++) { for (int k = 0; k < nr_logs; k++) {
/* Set size for this messages. */
int logsize = size; 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 i = 0; i < nr_nodes; i++) {
for (int j = 0; j < nr_nodes; j++) { for (int j = 0; j < nr_nodes; j++) {
if (i != j) { if (i != j) {
......
...@@ -102,6 +102,6 @@ int mpiuse_nr_ranks(void); ...@@ -102,6 +102,6 @@ int mpiuse_nr_ranks(void);
void mpiuse_dump_logs(int nranks, const char *logfile); void mpiuse_dump_logs(int nranks, const char *logfile);
void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random, 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 */ #endif /* SWIFT_MPIUSE_H */
...@@ -341,8 +341,9 @@ static void pick_logs(void) { ...@@ -341,8 +341,9 @@ static void pick_logs(void) {
static void usage(char *argv[]) { static void usage(char *argv[]) {
fprintf(stderr, "Usage: %s [-vf] nr_messages logfile.dat\n", fprintf(stderr, "Usage: %s [-vf] nr_messages logfile.dat\n",
argv[0]); argv[0]);
fprintf(stderr, " options: -v verbose, -d data check, -s size (bytes), -r" fprintf(stderr, " options: -v verbose, -d data check, -s size (bytes), "
" random from 0 to size\n"); "-r uniform random from 1 to size, "
"-r -g half gaussian random from 1 with 2.5 sigma size.\n");
fflush(stderr); fflush(stderr);
} }
...@@ -370,8 +371,9 @@ int main(int argc, char *argv[]) { ...@@ -370,8 +371,9 @@ int main(int argc, char *argv[]) {
* whether to use a random selection (with a fixed seed). */ * whether to use a random selection (with a fixed seed). */
int size = 1024; int size = 1024;
int random = 0; int random = 0;
int uniform = 1;
int opt; int opt;
while ((opt = getopt(argc, argv, "vds:r")) != -1) { while ((opt = getopt(argc, argv, "vds:rg")) != -1) {
switch (opt) { switch (opt) {
case 'd': case 'd':
datacheck = 1; datacheck = 1;
...@@ -382,6 +384,9 @@ int main(int argc, char *argv[]) { ...@@ -382,6 +384,9 @@ int main(int argc, char *argv[]) {
case 'r': case 'r':
random = 1; random = 1;
break; break;
case 'g':
uniform = 0;
break;
case 'v': case 'v':
verbose = 1; verbose = 1;
break; break;
...@@ -403,14 +408,19 @@ int main(int argc, char *argv[]) { ...@@ -403,14 +408,19 @@ int main(int argc, char *argv[]) {
/* Generate the fake logs for the exchanges. */ /* Generate the fake logs for the exchanges. */
if (myrank == 0) { if (myrank == 0) {
if (random) { if (random) {
message("Generating %d fake logs for %d ranks with random distribution" if (uniform) {
" up to size %d", nr_logs, nr_nodes, size); 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 { } else {
message("Generating %d fake logs for %d ranks of size %d", message("Generating %d fake logs for %d ranks of size %d",
nr_logs, nr_nodes, size); 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(); int nranks = mpiuse_nr_ranks();
/* Each rank requires its own queue, so extract them. */ /* Each rank requires its own queue, so extract them. */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment