From 472baa1284a9cd6cce48caecab505ad4d9c95ebf Mon Sep 17 00:00:00 2001 From: Elena Date: Tue, 27 Jan 2015 10:55:24 +0200 Subject: [PATCH] added unit test for pmix functionality --- orte/test/mpi/pmix.c | 94 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 orte/test/mpi/pmix.c diff --git a/orte/test/mpi/pmix.c b/orte/test/mpi/pmix.c new file mode 100644 index 0000000000..13fcc71c3d --- /dev/null +++ b/orte/test/mpi/pmix.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2015 Mellanox Technologies, Inc. + * All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ +/* + * To compile test: + * mpicc -I$src_dir -I$src_dir/opal/include -I$src_dir/orte/include -I$src_dir/ompi/include -DOMPI_BUILDING=1 pmix.c -o pmix + * To run test: + * mpirun -np 2 ./pmix + * Test should print "Passed" in case of success and print pmix time intervals at process with rank 0. + * */ +#include +#include +#include +#include + +#include "opal/mca/pmix/pmix.h" +#include "ompi/proc/proc.h" + +#define DO_FINALIZE(rc,flag,format,args...) \ + do { \ + if (flag) { \ + fprintf(stderr, format, args); \ + } \ + if (opal_pmix.initialized) { \ + opal_pmix.finalize(); \ + } \ + MPI_Finalize(); \ + return rc; \ + } while(0); + +inline double get_timestamp(void) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return ((tv.tv_sec) + (tv.tv_usec) * 1.0e-6); +} + +int main(int argc, char* argv[]) +{ + int rc, my_rank; + int recv_data; + size_t i, numprocs; + ompi_proc_t **procs, *thisproc; + double t0, t1, t2, t3, t4, t5; + int *ptr; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + if (NULL != opal_pmix.init) { + rc = opal_pmix.init(); + if (OPAL_SUCCESS != rc) { + DO_FINALIZE(rc, 1, "[%d] pmix_init failed.\n", my_rank); + } + } + + int data = my_rank; + t0 = get_timestamp(); + OPAL_MODEX_SEND_VALUE(rc, PMIX_SYNC_REQD, PMIX_GLOBAL, + "MY_RANK", &data, OPAL_INT); + t1 = get_timestamp(); + if (OPAL_SUCCESS != rc) { + DO_FINALIZE(rc, 1, "[%d] OPAL_MODEX_SEND_STRING failed.\n", my_rank); + } + t2 = get_timestamp(); + OPAL_FENCE(NULL, 0, NULL, NULL); + t3 = get_timestamp(); + procs = ompi_proc_world ( &numprocs ); + ptr = &recv_data; + t4 = get_timestamp(); + for ( i = 0; i < numprocs; i++ ) { + thisproc = procs[i]; + OPAL_MODEX_RECV_VALUE(rc, "MY_RANK", &thisproc->super, (void**)&ptr, OPAL_INT); + /* check return status and received data */ + if (OPAL_SUCCESS != rc || i != recv_data) { + rc = OPAL_ERROR; + DO_FINALIZE(rc, 1, "[%d] OPAL_MODEX_RECV_VALUE failed from rank %d.\n", my_rank, i); + } + } + t5 = get_timestamp(); + free(procs); + + /* using fence as a barrier */ + opal_pmix.fence(NULL, 0); + if (0 == my_rank) { + fprintf(stderr, "[%d] Test passed. MODEX_SEND - %f, FENCE - %f, MODEX_RECV - %f, total - %f\n", my_rank, t1-t0, t3-t2, t5-t4, t5-t0); + } + DO_FINALIZE(0, 0, 0, 0); +}