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

Add random selection option

parent 3b3c007a
No related branches found
No related tags found
1 merge request!6Version with faked data
......@@ -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
mpicc $(CFLAGS) -o swiftmpistepsim swiftmpistepsim.c mpiuse.c clocks.c -lpthread
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
mpicc $(CFLAGS) -o swiftmpifakestepsim swiftmpifakestepsim.c mpiuse.c clocks.c -lpthread
clean:
rm -f swiftmpistepsim
......
......@@ -263,18 +263,27 @@ struct mpiuse_log_entry *mpiuse_get_log(int ind) {
*
* @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
* @param size bytes per message, unless random when this is the maximum
* and the minimum is 1.
* @param random whether to use random sizes.
* @param seed the random seed, use same for fixed sequences.
*/
void mpiuse_log_generate(int nr_nodes, int nr_logs, int size) {
void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random,
long int seed) {
/* Each rank exchanges messages with all the others and each "log" has the
* same size. */
if (random) srand48(seed);
/* Each rank exchange messages with all the others with a fixed size. */
int tag = 1;
for (int k = 0; k < nr_logs; k++) {
int logsize = size;
if (random) logsize = (drand48() * (double)size) + 1;
for (int i = 0; i < nr_nodes; i++) {
for (int j = 0; j < nr_nodes; j++) {
if (i != j) {
mpiuse_log_allocation(i, 1, k, SEND_TYPE, NO_SUBTYPE, 1, size, j, tag);
mpiuse_log_allocation(j, 1, k, RECV_TYPE, NO_SUBTYPE, 1, size, i, tag);
mpiuse_log_allocation(i, 1, k, SEND_TYPE, NO_SUBTYPE, 1, logsize, j, tag);
mpiuse_log_allocation(j, 1, k, RECV_TYPE, NO_SUBTYPE, 1, logsize, i, tag);
}
}
}
......
......@@ -101,6 +101,7 @@ int mpiuse_nr_logs(void);
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);
void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random,
long int seed);
#endif /* SWIFT_MPIUSE_H */
......@@ -38,6 +38,9 @@ static int verbose = 0;
/* Set a data pattern and check we get this back, slow... */
static int datacheck = 0;
/* Fixed seed for pseudorandoms. */
static long int seed = 1987654321;
/* The local queues. */
static struct mpiuse_log_entry **volatile reqs_queue;
static int volatile ind_req = 0;
......@@ -338,7 +341,8 @@ 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)\n");
fprintf(stderr, " options: -v verbose, -d data check, -s size (bytes), -r"
" random from 0 to size\n");
fflush(stderr);
}
......@@ -362,10 +366,12 @@ int main(int argc, char *argv[]) {
error("Call to MPI_Comm_rank failed with error %i.", res);
/* Handle the command-line, we expect the number of messages to exchange per
* rank an output log and some options. */
* rank an output log and some options, the interesting ones are a size and
* whether to use a random selection (with a fixed seed). */
int size = 1024;
int random = 0;
int opt;
while ((opt = getopt(argc, argv, "vds:")) != -1) {
while ((opt = getopt(argc, argv, "vds:r")) != -1) {
switch (opt) {
case 'd':
datacheck = 1;
......@@ -373,6 +379,9 @@ int main(int argc, char *argv[]) {
case 's':
size = atoi(optarg);
break;
case 'r':
random = 1;
break;
case 'v':
verbose = 1;
break;
......@@ -392,9 +401,16 @@ int main(int argc, char *argv[]) {
char *logfile = argv[optind + 1];
/* Generate the fake logs for the exchanges. */
if (myrank == 0) message("Generating %d fake logs for %d ranks of size %d",
nr_logs, nr_nodes, size);
mpiuse_log_generate(nr_nodes, nr_logs, size);
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);
} 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);
int nranks = mpiuse_nr_ranks();
/* 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