diff --git a/.gitmodules b/.gitmodules index 5fd73e70238..3353b602b74 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,3 +14,6 @@ [submodule "modules/yaksa"] path = modules/yaksa url = https://github.com/pmodels/yaksa +[submodule "modules/mydef_boot"] + path = modules/mydef_boot + url = https://github.com/pmodels/mydef_boot diff --git a/autogen.sh b/autogen.sh index 80494232ce4..5178d70ec1e 100755 --- a/autogen.sh +++ b/autogen.sh @@ -65,6 +65,7 @@ do_hydra=yes do_romio=yes do_pmi=yes do_doc=no +do_mydef=yes yaksa_depth= @@ -536,6 +537,14 @@ fn_json_gen() { echo "done" } +fn_mydef() { + MYDEF_BOOT=$PWD/modules/mydef_boot + export PATH=$MYDEF_BOOT/bin:$PATH + export PERL5LIB=$MYDEF_BOOT/lib/perl5 + export MYDEFLIB=$MYDEF_BOOT/lib/MyDef + (cd test/mpi/bench && ./autogen.sh) +} + # internal _patch_libtool() { _file=$1 @@ -731,9 +740,9 @@ EOF echo ">= $ver" else echo "bad autoconf installation" - echo "--- autoreconf diagnositcs ---" + echo "--- autoreconf diagnostics ---" $(cat autoreconf.err) - echo "--- autoreconf diagnositcs ---" + echo "--- autoreconf diagnostics ---" cat < last_dur + num_best++ + last_dur = $(dur) + +subcode: header_latency + printf("%12s %10s(us) %6s(us) %12s(MB/s)\n", "msgsize", "latency", "sigma", "bandwidth") + +subcode: report_latency(MSGSIZE, MULTIPLICITY) + $my tf_latency, tf_sigma, tf_bw + tf_latency = sum1 / ($(MULTIPLICITY)) * 1e6 + tf_sigma = sum2 / ($(MULTIPLICITY)) * 1e6 + tf_bw = $(MSGSIZE) / tf_latency + printf("%12d %10.3f %6.3f %12.3f\n", $(MSGSIZE), tf_latency, tf_sigma, tf_bw) + diff --git a/test/mpi/bench/macros/bench_p2p.def b/test/mpi/bench/macros/bench_p2p.def new file mode 100644 index 00000000000..742a73acfc3 --- /dev/null +++ b/test/mpi/bench/macros/bench_p2p.def @@ -0,0 +1,79 @@ +/* + * Defines following functions: + * bench_p2p + * bench_send, bench_warmup + * bench_recv + * + * For each measurement - + * First sender tells receiver the `iter` parameter. `iter = 0` means to quit. + * For each iteration runs `send_side` and `recv_side` assuming the measurement on sender side represents a latency measurement. + * + * Caller page defines - + * subcode: sender_side, recv_side + * macro: + * MULTIPLICITY: divisor for each measurement + */ + +macros: + MIN_PROCS: 2 + MAX_BUFSIZE: 5000000 # 5 MB + +subcode: _autoload + $register_name(src) int + $register_name(dst) int + $register_name(buf) void * + $register_name(size) int + $define TAG 0 + $define SYNC_TAG 100 + $define MAX_BUFSIZE 5000000 + $define NUM_REPEAT 20 + +subcode: report_header + $call header_latency + +fncode: bench_p2p(comm, src, dst, buf, size) + int rank; + MPI_Comm_rank(comm, &rank) + + $(if:!MULTIPLICITY) + $(set:MULTIPLICITY=1) + + $if rank == src + iter = bench_warmup(comm, dst, buf, size) + &call run_stat, NUM_REPEAT, tf_latency + tf_latency = bench_send(iter, comm, dst, buf, size) + tf_latency /= iter + $call report_latency, size, $(MULTIPLICITY) + $call send_stop + $elif rank == dst + bench_recv(comm, src, buf, size) + + subcode: send_stop + iter = 0; + MPI_Send(&iter, 1, MPI_INT, dst, SYNC_TAG, comm) + +#---------------------------------------- +fncode: bench_send(int iter, comm, dst, buf, size) + # synchronize with receiver + MPI_Send(&iter, 1, MPI_INT, dst, SYNC_TAG, comm); + + &call measure, iter + $call @send_side + + return tf_dur + +fncode: bench_recv(comm, src, buf, size) + $while 1 + int iter; + # synchronize with sender */ + MPI_Recv(&iter, 1, MPI_INT, src, SYNC_TAG, comm, MPI_STATUS_IGNORE); + $if iter == 0 + # time to quit + break + $for i=0:iter + $call @recv_side + +fncode: bench_warmup(comm, dst, buf, size): int + &call warm_up, iter, tf_dur + tf_dur = bench_send(iter, comm, dst, buf, size) + return iter diff --git a/test/mpi/bench/macros/mtest.def b/test/mpi/bench/macros/mtest.def new file mode 100644 index 00000000000..185a35bf77e --- /dev/null +++ b/test/mpi/bench/macros/mtest.def @@ -0,0 +1,14 @@ +macros: + HAS_MTEST: 1 + +subcode: mtest_malloc(size) + MTestArgList *head = MTestArgListCreate(argc, argv) + int send_rank = 0, recv_rank = 1; + $(for:a in send,recv) + $if grank == $(a)_rank + $my mtest_mem_type_e $(a)_memtype, int $(a)_device + $(a)_memtype = MTestArgListGetMemType(head, "$(a)mem") + $(a)_device = MTestArgListGetInt_with_default(head, "$(a)dev", 0) + MTestMalloc($(size), $(a)_memtype, NULL, &buf, $(a)_device) + MTestPrintfMsg(1, "Allocating buffer: memtype=%s, device=%d, size=%d\n", MTest_memtype_name($(a)_memtype), $(a)_device, $(size)) + MTestArgListDestroy(head) diff --git a/test/mpi/bench/p2p_bw.def b/test/mpi/bench/p2p_bw.def new file mode 100644 index 00000000000..ebd5e94ab55 --- /dev/null +++ b/test/mpi/bench/p2p_bw.def @@ -0,0 +1,27 @@ +include: macros/bench_frame.def +include: macros/bench_p2p.def +include: macros/mtest.def + +subcode: _autoload + $define WINDOW_SIZE 64 + +page: p2p_bw, bench_frame + MULTIPLICITY: WINDOW_SIZE + data: buf, size, MPI_CHAR + + $for int size = 1; size < MAX_BUFSIZE; size *= 2 + bench_p2p(comm, 0, 1, buf, size) + + subcode: send_side + $my MPI_Request reqs[WINDOW_SIZE] + $for j=0:WINDOW_SIZE + MPI_Isend($(data), dst, TAG, comm, &reqs[j]) + MPI_Waitall(WINDOW_SIZE, reqs, MPI_STATUSES_IGNORE) + MPI_Recv(NULL, 0, MPI_DATATYPE_NULL, dst, TAG, comm, MPI_STATUS_IGNORE) + + subcode: recv_side + $my MPI_Request reqs[WINDOW_SIZE] + $for j=0:WINDOW_SIZE + MPI_Irecv($(data), src, TAG, comm, &reqs[j]) + MPI_Waitall(WINDOW_SIZE, reqs, MPI_STATUSES_IGNORE) + MPI_Send(NULL, 0, MPI_DATATYPE_NULL, src, TAG, comm) diff --git a/test/mpi/bench/p2p_latency.def b/test/mpi/bench/p2p_latency.def new file mode 100644 index 00000000000..4d18cce0efd --- /dev/null +++ b/test/mpi/bench/p2p_latency.def @@ -0,0 +1,19 @@ +include: macros/bench_frame.def +include: macros/bench_p2p.def +include: macros/mtest.def + +page: p2p_latency, bench_frame + MULTIPLICITY: 2 + data: buf, size, MPI_CHAR + + bench_p2p(comm, 0, 1, buf, 0) + $for int size = 1; size < MAX_BUFSIZE; size *= 2 + bench_p2p(comm, 0, 1, buf, size) + + subcode: send_side + MPI_Send($(data), dst, TAG, comm); + MPI_Recv($(data), dst, TAG, comm, MPI_STATUS_IGNORE); + + subcode: recv_side + MPI_Recv($(data), src, TAG, comm, MPI_STATUS_IGNORE); + MPI_Send($(data), src, TAG, comm); diff --git a/test/mpi/bench/testlist b/test/mpi/bench/testlist new file mode 100644 index 00000000000..af73dca792a --- /dev/null +++ b/test/mpi/bench/testlist @@ -0,0 +1,2 @@ +p2p_latency 2 resultTest=TestBench +p2p_bw 2 resultTest=TestBench diff --git a/test/mpi/configure.ac b/test/mpi/configure.ac index 8bf7b30937f..9a7ed7b50dc 100644 --- a/test/mpi/configure.ac +++ b/test/mpi/configure.ac @@ -1904,5 +1904,6 @@ AC_OUTPUT(maint/testmerge \ impls/mpich/ulfm/Makefile \ impls/mpich/info/Makefile \ impls/mpich/info/testlist \ + bench/Makefile \ ) diff --git a/test/mpi/runtests b/test/mpi/runtests index 237ba5e22f4..c7a98295fe3 100755 --- a/test/mpi/runtests +++ b/test/mpi/runtests @@ -934,6 +934,8 @@ sub get_resultTest { return \&TestStatusNoErrors; } elsif ($resultTest eq "TestErrFatal") { return \&TestErrFatal; + } elsif ($resultTest eq "TestBench") { + return \&TestBench; } else { die "resultTest $resultTest not defined!\n"; } @@ -1112,6 +1114,22 @@ sub TestErrFatal { return ($found_error, $inline); } +# Only check exit code: 0 means success, non-zero means failure +sub TestBench { + my ($MPIOUT, $programname) = @_; + my ($found_error, $inline); + + while (<$MPIOUT>) { + print STDOUT $_; + } + my $rc = close($MPIOUT); + if (!$rc) { + expect_status_zero($programname, $?); + $found_error = 1; + } + return ($found_error, $inline); +} + # ---------------------------------------------------------------------------- # Output routines: # OpenOutputs - Open report files and print initial lines