Shared Buffer Communication
The Cornell Virtual Workshop
/*
int MPI_Put( void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win);
int MPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win);
*/
#include <stdio.h>
#include <mpi.h>
#include <string.h>
#define NUM_ELEMENT 1
struct student {
char name[30];
char year[10]; /*Fresh. Soph.,Jr. Sr.*/
int exam_grade;
};
int main(int argc, char* argv[])
{
struct student astudent;
int i, rank, num_procs, len;
char name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
MPI_Datatype MPI_STUDENT;
MPI_Datatype type[3] = { MPI_CHAR, MPI_CHAR, MPI_INT}; /* The "MPI types" of student */
int blocklen[3] = { 30, 10, 1}; /* The array lengths */
MPI_Aint disp[3]={0,30*sizeof(char),30*sizeof(char)+10*sizeof(char)}; /* Address displacements */
MPI_Type_create_struct(3, blocklen, disp, type, &MPI_STUDENT);
MPI_Type_commit(&MPI_STUDENT);
/* MPI_STUDENT is now an available MPI datatype */
struct student localbuffer[NUM_ELEMENT], sharedbuffer[NUM_ELEMENT];
if (rank == 0) {
strncpy(localbuffer[0].name, "Joe Jones", 30);
strncpy(localbuffer[0].year, "Sr.", 10);;
localbuffer[0].exam_grade=95;
} else {
strncpy(localbuffer[0].name, "No Name", 30);
strncpy(localbuffer[0].year, "No Year", 10);;
localbuffer[0].exam_grade=0;
}
MPI_Win win;
MPI_Win_create(sharedbuffer, NUM_ELEMENT, sizeof(MPI_STUDENT), MPI_INFO_NULL, MPI_COMM_WORLD, &win);
MPI_Win_fence(0, win);
if (rank ==0) {
for (i=0;i<num_procs;i++)
MPI_Put(&localbuffer[0], NUM_ELEMENT, MPI_STUDENT, i, 0, NUM_ELEMENT, MPI_STUDENT, win);
};
printf("Inside the first fence rank %i has data in the local buffer name= %s\n", rank,localbuffer[0].name);
MPI_Win_fence(0, win);
MPI_Win_fence(0, win);
for (i=1;i<num_procs;i++) {
MPI_Get(&localbuffer[0], NUM_ELEMENT, MPI_STUDENT, i, 0, NUM_ELEMENT, MPI_STUDENT, win);
}
MPI_Win_fence(0, win);
if (rank>0) {
printf("Inside the second fence, rank %i has new data in the local buffer name= %s\n", rank,localbuffer[0].name);
}
MPI_Win_free(&win);
MPI_Finalize();
return 0;
}