Skip to content

Instantly share code, notes, and snippets.

@wence-
Last active August 29, 2015 14:15
Show Gist options
  • Select an option

  • Save wence-/491aac331325896cd070 to your computer and use it in GitHub Desktop.

Select an option

Save wence-/491aac331325896cd070 to your computer and use it in GitHub Desktop.
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int ierr;
MPI_Datatype unit, mine[2], remote[2];
int rcount[2];
int roffset[2];
int rmine[8];
int rremote[8];
int ranks[2];
int size;
int rank;
int i;
MPI_Aint bytes;
MPI_Aint lb;
int nroots = -1;
int nleaves = 8;
int bs = 2;
int nranks = 2;
MPI_Comm comm;
MPI_Win win;
double *rootdata;
double *leafdata;
ierr = MPI_Init(&argc, &argv);
comm = MPI_COMM_WORLD;
ierr = MPI_Comm_rank(comm, &rank);
ierr = MPI_Comm_size(comm, &size);
ierr = MPI_Type_contiguous(bs, MPI_DOUBLE, &unit);
ierr = MPI_Type_commit(&unit);
ranks[0] = 0;
ranks[1] = 1;
if ( rank == 0 ) {
nroots = 3;
roffset[0] = 0;
roffset[1] = 3;
rcount[0] = 3;
rcount[1] = 5;
rmine[0] = 0;
rmine[1] = 1;
rmine[2] = 2;
rmine[3] = 3;
rmine[4] = 7;
rmine[5] = 5;
rmine[6] = 4;
rmine[7] = 6;
rremote[0] = 0;
rremote[1] = 1;
rremote[2] = 2;
rremote[3] = 1;
rremote[4] = 5;
rremote[5] = 3;
rremote[6] = 2;
rremote[7] = 4;
} else if ( rank == 1 ) {
nroots = 6;
roffset[0] = 0;
roffset[1] = 2;
rcount[0] = 2;
rcount[1] = 6;
rmine[0] = 6;
rmine[1] = 7;
rmine[2] = 1;
rmine[3] = 5;
rmine[4] = 0;
rmine[5] = 3;
rmine[6] = 2;
rmine[7] = 4;
rremote[0] = 1;
rremote[1] = 2;
rremote[2] = 1;
rremote[3] = 5;
rremote[4] = 0;
rremote[5] = 3;
rremote[6] = 2;
rremote[7] = 4;
} else {
MPI_Abort(comm, 1);
}
rootdata = calloc(bs*nroots, sizeof(double));
leafdata = calloc(bs*nleaves, sizeof(double));
for ( i = 0; i < nroots*bs; i++ ) {
leafdata[i] = 10 + 2 * rank;
}
for ( i = nroots*bs; i < nleaves*bs; i++ ) {
leafdata[i] = 3 + 2 * rank;
}
for ( i = 0; i < 2; i++ ) {
ierr = MPI_Type_create_indexed_block(rcount[i], 1, rmine + roffset[i],
unit, &mine[i]);
ierr = MPI_Type_create_indexed_block(rcount[i], 1, rremote + roffset[i],
unit, &remote[i]);
ierr = MPI_Type_commit(&mine[i]);
ierr = MPI_Type_commit(&remote[i]);
}
ierr = MPI_Type_get_extent(unit, &lb, &bytes);
ierr = MPI_Win_create((void *)rootdata, (MPI_Aint)bytes*nroots,
bytes, MPI_INFO_NULL, comm, &win);
ierr = MPI_Win_fence(MPI_MODE_NOPRECEDE, win);
for (i = 0; i < nranks; i++ ) {
ierr = MPI_Accumulate((void*)leafdata,1,mine[i],ranks[i],0,1,remote[i],MPI_SUM,win);
}
ierr = MPI_Win_fence(MPI_MODE_NOSUCCEED,win);
ierr = MPI_Win_free(&win);
for ( i = 0; i < 2; i++ ) {
ierr = MPI_Type_free(&mine[i]);
ierr = MPI_Type_free(&remote[i]);
}
ierr = MPI_Type_free(&unit);
if ( rank == 1 ) {
MPI_Barrier(comm);
}
printf("[%d] ", rank);
for ( i = 0; i < nroots*bs; i++ ) {
printf("%g ", rootdata[i]);
}
printf("\n");
fflush(stdout);
if ( rank == 0 ) {
MPI_Barrier(comm);
}
free(rootdata);
free(leafdata);
MPI_Finalize();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment