#include #include #include #include #include #include #include #define MPI_USE_REQUESTS #define MPI_USE_FLUSH_LOCAL /* */ #define USE_SYNC #define NDIM 500 #define LOOP 2000 #ifdef MPI_USE_FLUSH_LOCAL #define MPI_USE_REQUESTS #endif int main(int argc, char *argv[]) { int nvals = NDIM * NDIM; MPI_Win win; MPI_Aint displ; MPI_Datatype dtype; void *buf; double *a, *b, *c; int tsize, lo[2], hi[2], rlo[2], rhi[2], ldims[2], dims[2], starts[2]; int i, j, k, me, nproc, rproc, loop; MPI_Request request; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Comm_size(MPI_COMM_WORLD, &nproc); /* Allocate window */ tsize = sizeof(double)*nvals; #if 1 MPI_Win_allocate(tsize,1,MPI_INFO_NULL,MPI_COMM_WORLD,&buf,&win); #else MPI_Alloc_mem(tsize,MPI_INFO_NULL,&buf); MPI_Win_create(buf,tsize,1,MPI_INFO_NULL,MPI_COMM_WORLD,&win); #endif c = (double*)buf; #ifdef MPI_USE_REQUESTS MPI_Win_lock_all(0,win); #endif /* Create local buffers*/ a = (double*)malloc(nvals*sizeof(double)); b = (double*)malloc(nvals*sizeof(double)); /* set up blocks for local and remote requests */ lo[0] = 0; lo[1] = 0; hi[0] = NDIM/2-1; hi[1] = NDIM/2-1; rlo[0] = NDIM/2; rlo[1] = NDIM/2; rhi[0] = NDIM-1; rhi[1] = NDIM-1; /* Evaluate displacement on remote processor */ displ = rlo[0] + rlo[1]*NDIM; displ = displ*sizeof(double); /* loop over tests */ for (loop=0; loop