Blame doc/notes/rma/fence_acc_simple.c

Packit Service c5cf8c
#include <mpi.h>
Packit Service c5cf8c
#include <stdio.h>
Packit Service c5cf8c
Packit Service c5cf8c
	
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					my_rank;
Packit Service c5cf8c
    MPI_Win				win;
Packit Service c5cf8c
    double				my_data;
Packit Service c5cf8c
    double				win_data;
Packit Service c5cf8c
    int					assert;
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, &my_rank);
Packit Service c5cf8c
    
Packit Service c5cf8c
    if (np < 2)
Packit Service c5cf8c
    {
Packit Service c5cf8c
	if ( my_rank == 0)
Packit Service c5cf8c
	{
Packit Service c5cf8c
	    printf("\nERROR: fence_acc_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
    if (my_rank == 0)
Packit Service c5cf8c
    {
Packit Service c5cf8c
	MPI_Win_create(&my_data, sizeof(double), sizeof(double), MPI_INFO_NULL,
Packit Service c5cf8c
		       MPI_COMM_WORLD, &win);
Packit Service c5cf8c
Packit Service c5cf8c
	assert = MPI_MODE_NOPRECEDE;
Packit Service c5cf8c
	win_data = 0.0;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    else
Packit Service c5cf8c
    {
Packit Service c5cf8c
	MPI_Win_create(0, 0, 0, MPI_INFO_NULL, MPI_COMM_WORLD, &win);
Packit Service c5cf8c
Packit Service c5cf8c
        assert = MPI_MODE_NOSTORE | MPI_MODE_NOPUT | MPI_MODE_NOPRECEDE;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Win_fence(assert, win);
Packit Service c5cf8c
    {
Packit Service c5cf8c
	my_data = 42.0;
Packit Service c5cf8c
	MPI_Accumulate(&my_data, 1, MPI_DOUBLE,
Packit Service c5cf8c
		       0, 0, 1, MPI_DOUBLE, MPI_SUM, win);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    MPI_Win_fence(MPI_MODE_NOSTORE | MPI_MODE_NOSUCCEED, win);
Packit Service c5cf8c
	
Packit Service c5cf8c
    if (win_data == 42.0 * np)
Packit Service c5cf8c
    {
Packit Service c5cf8c
	printf("%d: data=%f\n", my_rank, win_data);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    else
Packit Service c5cf8c
    {
Packit Service c5cf8c
	printf("%d: ERROR - data=%f NOT %f\n",
Packit Service c5cf8c
	       my_rank, win_data, np * 42.0);
Packit Service c5cf8c
    }
Packit Service c5cf8c
	
Packit Service c5cf8c
    MPI_Win_free(&win);
Packit Service c5cf8c
	
Packit Service c5cf8c
    MPI_Finalize();
Packit Service c5cf8c
    
Packit Service c5cf8c
    return 0;
Packit Service c5cf8c
}