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