Blame doc/notes/rma/passive_acc.c

Packit Service c5cf8c
#include <mpi.h>
Packit Service c5cf8c
#include <stdio.h>
Packit Service c5cf8c
Packit Service c5cf8c
int
Packit Service c5cf8c
main(
Packit Service c5cf8c
    int					argc,
Packit Service c5cf8c
    char *				argv[])
Packit Service c5cf8c
{
Packit Service c5cf8c
    int					np;
Packit Service c5cf8c
    int					rank;
Packit Service c5cf8c
    MPI_Win				win;
Packit Service c5cf8c
    int					data[2];
Packit Service c5cf8c
    
Packit Service c5cf8c
    MPI_Init(NULL, NULL);
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Comm_size(MPI_COMM_WORLD, &np);
Packit Service c5cf8c
    MPI_Comm_rank(MPI_COMM_WORLD, &rank;;
Packit Service c5cf8c
    neighbor_rank = (my_rank + 1) % np;
Packit Service c5cf8c
    
Packit Service c5cf8c
    if (np < 2)
Packit Service c5cf8c
    {
Packit Service c5cf8c
	if (rank == 0)
Packit Service c5cf8c
	{
Packit Service c5cf8c
	    printf("\nERROR: fence_get_simple must be at least (2) "
Packit Service c5cf8c
		   "processes\n\n");
Packit Service c5cf8c
	}
Packit Service c5cf8c
	
Packit Service c5cf8c
	MPI_Finalize();
Packit Service c5cf8c
	return 1;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    data[0] = 0;
Packit Service c5cf8c
    data[1] = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    if (rank == 0)
Packit Service c5cf8c
    {
Packit Service c5cf8c
	int				count;
Packit Service c5cf8c
	
Packit Service c5cf8c
	MPI_Win_create(&data, sizeof(int), sizeof(int), MPI_INFO_NULL,
Packit Service c5cf8c
		       MPI_COMM_WORLD, &win);
Packit Service c5cf8c
Packit Service c5cf8c
	do
Packit Service c5cf8c
	{
Packit Service c5cf8c
	    MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
Packit Service c5cf8c
	    {
Packit Service c5cf8c
		count = data[0];
Packit Service c5cf8c
	    }
Packit Service c5cf8c
	    MPI_Win_unlock(0, win);
Packit Service c5cf8c
	}
Packit Service c5cf8c
	while (count < np - 1);
Packit Service c5cf8c
Packit Service c5cf8c
	printf("\nPassively accumulated a value of %d from %d processes\n\n",
Packit Service c5cf8c
	       data[1], data[0]);
Packit Service c5cf8c
	
Packit Service c5cf8c
	MPI_Win_free(&win);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    else
Packit Service c5cf8c
    {
Packit Service c5cf8c
	MPI_Win_create(NULL, 0, 0, MPI_INFO_NULL, MPI_COMM_WORLD, &win);
Packit Service c5cf8c
Packit Service c5cf8c
	data[0] = 1;
Packit Service c5cf8c
	data[1] = rank;
Packit Service c5cf8c
	
Packit Service c5cf8c
	MPI_Win_lock(MPI_LOCK_SHARED, 0, 0, win);
Packit Service c5cf8c
	{
Packit Service c5cf8c
	    MPI_Accumulate(data, 2, MPI_INT,
Packit Service c5cf8c
		0, 0, 2, MPI_INT, MPI_SUM, win);
Packit Service c5cf8c
	}
Packit Service c5cf8c
	MPI_Win_unlock(0, win);
Packit Service c5cf8c
    
Packit Service c5cf8c
	MPI_Win_free(&win);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Finalize();
Packit Service c5cf8c
    
Packit Service c5cf8c
    return 0;
Packit Service c5cf8c
}