#include <mpi.h>
#include <stdio.h>
int
main(
int argc,
char * argv[])
{
int np;
int my_rank;
int neighbor_rank;
MPI_Win win;
double my_data;
double neighbor_data;
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &np);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
neighbor_rank = (my_rank + 1) % np;
if (np < 2)
{
if ( my_rank == 0)
{
printf("\nERROR: fence_get_simple must be at least (2) "
"processes\n\n");
}
MPI_Finalize();
return 1;
}
MPI_Win_create(&my_data, sizeof(double), sizeof(double), MPI_INFO_NULL,
MPI_COMM_WORLD, &win);
my_data = 42.0 * my_rank;
MPI_Win_fence(MPI_MODE_NOPUT | MPI_MODE_NOPRECEDE, win);
{
MPI_Get(&neighbor_data, 1, MPI_DOUBLE,
neighbor_rank, 0, 1, MPI_DOUBLE, win);
}
MPI_Win_fence(MPI_MODE_NOSTORE | MPI_MODE_NOSUCCEED, win);
if (neighbor_data == 42.0 * neighbor_rank)
{
printf("%d: data[%d]=%f\n", my_rank, neighbor_rank, neighbor_data);
}
else
{
printf("%d: ERROR - data[%d]=%f NOT %f\n",
my_rank, neighbor_rank, neighbor_data, neighbor_rank * 42.0);
}
MPI_Win_free(&win);
MPI_Finalize();
return 0;
}