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