Author: dinan Date: 2012-11-27 17:39:57 -0600 (Tue, 27 Nov 2012) New Revision: 10675 Added: mpich2/trunk/test/mpi/rma/pscw_ordering.c Modified: mpich2/trunk/test/mpi/rma/Makefile.am mpich2/trunk/test/mpi/rma/testlist Log: RMA State Tracking: PSCW ordering test This test case verified that an odd (but correct) usage pattern of generalized active target synchronization works correctly: start-before-post. Reviewer: goodell Modified: mpich2/trunk/test/mpi/rma/Makefile.am =================================================================== --- mpich2/trunk/test/mpi/rma/Makefile.am 2012-11-27 23:39:55 UTC (rev 10674) +++ mpich2/trunk/test/mpi/rma/Makefile.am 2012-11-27 23:39:57 UTC (rev 10675) @@ -105,7 +105,8 @@ flush \ reqops \ req_example \ - win_info + win_info \ + pscw_ordering strided_acc_indexed_LDADD = $(LDADD) -lm strided_acc_onelock_LDADD = $(LDADD) -lm Added: mpich2/trunk/test/mpi/rma/pscw_ordering.c =================================================================== --- mpich2/trunk/test/mpi/rma/pscw_ordering.c (rev 0) +++ mpich2/trunk/test/mpi/rma/pscw_ordering.c 2012-11-27 23:39:57 UTC (rev 10675) @@ -0,0 +1,139 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * (C) 2001 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ + +/* This test checks an oddball case for generalized active target + * synchronization where the start occurs before the post. Since start can + * block until the corresponding post, the group passed to start must be + * disjoint from the group passed to post and processes must avoid a circular + * wait. Here, odd/even groups are used to accomplish this and the even group + * reverses its start/post calls. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <mpi.h> +#include "mpitest.h" +#include "squelch.h" + +int main(int argc, char **argv) { + int i, rank, nproc, errors = 0; + + int *win_buf; + MPI_Win win; + + int odd_nproc, even_nproc; + int *odd_ranks, *even_ranks; + MPI_Group odd_group, even_group, world_group; + + MTest_Init(&argc, &argv); + + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &nproc); + + if (nproc < 2) { + if (rank == 0) + printf("Error: this test requires two or more processes\n"); + MPI_Abort(MPI_COMM_WORLD, 100); + } + + /* Set up odd/even groups and buffers */ + + odd_nproc = nproc / 2; + even_nproc = nproc / 2 + ( (nproc % 2 == 0) ? 0 : 1 ); + + odd_ranks = malloc(sizeof(int) * odd_nproc); + even_ranks = malloc(sizeof(int) * even_nproc); + + for (i = 0; i < even_nproc; i++) + even_ranks[i] = i*2; + + for (i = 0; i < odd_nproc; i++) + odd_ranks[i] = i*2+1; + + MPI_Comm_group(MPI_COMM_WORLD, &world_group); + MPI_Group_incl(world_group, odd_nproc, odd_ranks, &odd_group); + MPI_Group_incl(world_group, even_nproc, even_ranks, &even_group); + + /* Create the window */ + + MPI_Alloc_mem(nproc*sizeof(int), MPI_INFO_NULL, &win_buf); + + for (i = 0; i < nproc; i++) + win_buf[i] = -1; + + MPI_Win_create(win_buf, nproc*sizeof(int), sizeof(int), MPI_INFO_NULL, + MPI_COMM_WORLD, &win); + + /* Perform PSCW communication: Odd/even matchup */ + + if (rank % 2 == 0) { + MPI_Win_start(odd_group, 0, win); /* Even-numbered procs target odd procs */ + MPI_Win_post(odd_group, 0, win); /* Even procs are targeted by odd procs */ + + /* Write to my slot at each target */ + for (i = 0; i < odd_nproc; i++) + MPI_Put(&rank, 1, MPI_INT, odd_ranks[i], rank, 1, MPI_INT, win); + } + else { + MPI_Win_post(even_group, 0, win); /* Odd procs are targeted by even procs */ + MPI_Win_start(even_group, 0, win); /* Odd-numbered procs target even procs */ + + /* Write to my slot at each target */ + for (i = 0; i < even_nproc; i++) + MPI_Put(&rank, 1, MPI_INT, even_ranks[i], rank, 1, MPI_INT, win); + } + + + MPI_Win_complete(win); + MPI_Win_wait(win); + + /* Perform PSCW communication: Odd/odd and even/even matchup */ + + if (rank % 2 == 0) { + MPI_Win_post(even_group, 0, win); /* Even procs are targeted by even procs */ + MPI_Win_start(even_group, 0, win); /* Even-numbered procs target even procs */ + + /* Write to my slot at each target */ + for (i = 0; i < even_nproc; i++) + MPI_Put(&rank, 1, MPI_INT, even_ranks[i], rank, 1, MPI_INT, win); + } + else { + MPI_Win_post(odd_group, 0, win); /* Odd procs are targeted by odd procs */ + MPI_Win_start(odd_group, 0, win); /* Odd-numbered procs target odd procs */ + + /* Write to my slot at each target */ + for (i = 0; i < odd_nproc; i++) + MPI_Put(&rank, 1, MPI_INT, odd_ranks[i], rank, 1, MPI_INT, win); + } + + + MPI_Win_complete(win); + MPI_Win_wait(win); + + for (i = 0; i < nproc; i++) { + if (win_buf[i] != i) { + errors++; + + SQUELCH( printf("%d: Error -- win_buf[%d] = %d, expected %d\n", + rank, i, win_buf[i], i); + ); + } + } + + MPI_Win_free(&win); + MPI_Free_mem(win_buf); + + MPI_Group_free(&world_group); + MPI_Group_free(&odd_group); + MPI_Group_free(&even_group); + + free(odd_ranks); + free(even_ranks); + + MTest_Finalize( errors ); + MPI_Finalize(); + return MTestReturnValue( errors ); +} Modified: mpich2/trunk/test/mpi/rma/testlist =================================================================== --- mpich2/trunk/test/mpi/rma/testlist 2012-11-27 23:39:55 UTC (rev 10674) +++ mpich2/trunk/test/mpi/rma/testlist 2012-11-27 23:39:57 UTC (rev 10675) @@ -91,3 +91,4 @@ req_example 4 mpiversion=3.0 win_info 4 mpiversion=3.0 linked_list_lockall 4 mpiversion=3.0 +pscw_ordering 4 mpiversion=3.0
participants (1)
-
dinan@mcs.anl.gov