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 |
}
|