Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

#include #include #include int main(int argc, char** argv) { // Initialize the M

ID: 3914864 • Letter: #

Question

#include #include #include int main(int argc, char** argv) { // Initialize the MPI environment MPI_Init(NULL); // Find out rank int rank; MPI_Comm_rank (MPI_COMM WORLD, &rank;); void ring(int* token, int numtasks, int rank, double time1) if (rank !- 0) MPI Recv(&token;, 1, MPI INT, rank-1, 0. MP? COMM WORLD, MPI STATUS IGNORE); double time_end- MPI _Wtime(); double elapsed-time end-time start from printf("Process %d received token %d process %d ", rank, rank-1,elapsed); j else { for(int 1-0; i 250000000; i++) token[i]-1; MPI_Send(token, 1, MPI_INT, (rank 1)%numtasks, 0, MPI _COMMWORLD); if (rank-0) { MPI Recv(token, 1, MPI INT, numtasks-1, 0, MPI COMM WORLD, MPI STATUS IGNORE) double time2-MPI-Wtime(); double elapsed-time end-time start printf("Process 0 received token from process %d in %f seconds. End!", nuntasks-1, elapsed); MPI-Finalize();

Explanation / Answer

#include<mpi.h>

#include<stlib.h>

#include<stdio.h>

#define MAX_RQNUM 1000

#define MAX_ALIGN 65536

#define MAX_MSG_SIZE(1<<22)

#define MYBUFFSIZE(MAX_MSG_SIZE +MAX_ALIGN)

#define LOOP_LARGE 20

#define WINDOW_SIZE_LARGE 64

#define SKIP_LARGE 2

#define LARGE_MSG_SIZE 8192

MPI_Request request[MAX_RQNUM];

MPI_Status reqstat[MAX_RQNUM];

char s_buf_original[MYBUFSIZE];

char r_buf_size_original[MYBUFSIZE];

#define HEADER "#" BENCHMARK " "

#define FIELD_WIDTH 20

#define FLOAT_PRECISION 2

int main( int argc, char *argv[])

{

/* Initilize the variables */

int id,numpc,i,j;

int size,al_size;

char *s_buf, *r_buf;

double a_start= 0.0, a_end=0.0, a=0.0;

int loop=100;

int win_size=64;

int skip=10;

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &numpc);

MPI_Comm_rank(MPI_COMM_WORLD, &id);

if(numpc!=2)

{

if(id==0)

{

fprintf(stderr,"This test needs exactly two processes ");

}

MPI_Finalize();

return EXIT_FAILURE;

}

al__size=getpagesize();

assert(al_size<=MAX_ALIGN);

s_buf=(char *) (((unsigned long) s_buf_original+(al_size-1))/al_size*al_size);

r_buf=(char *) (((unsigned long) r_buf_original+(al_size-1))/al_size*al_size);

if(id==0)

{

fprintf(stdout, HEADER);

fprintf(stdout, "%-*s%*s ", 10, "#Size", FIELD_WIDTH, "Bandwidth (MB/s)");

fflush(STDOUT);

}

/* Bandwidth Test */

for(size=1;size<= MAX_MSG_SIZE;size*=2)

{

/* take the data */

for(i=0;i<size;i++)

{

s_buf[i]='a';

r_buf[i]='b';

}

if(size>LARGE_MSG_SIZE)

{

loop= LOOP_LARGE;

skip=SKIP_LARGE;

win_size=WINDOW_SIZE_LARGE;

}

if(id==0)

{

for(i=0;i<loop+skip;i++)

{

if(i==skip)

{

a_start= MPI_Wtime();

}

for(j=0;j<win_size;j++)

{

MPI_Isen(s_buf,size,MPI_CHAR,1,100,MPI_COMM_WORLD, request+j);

}

MPI_Waitall(win_size,request,reqstat);

MPI_Send(s_buf,4,MPI_CHAR,0,101,MPI_COMM_WORLD);

}

}

if(id==0)

{

double tmp=seze/1e6*loop*win_size;

fprintf(stdout,"%-*d%*.*f ", 10, size,FIELD_WIDTH,FLOAT_PRECISION,tmp/t);

fflush(stdout);

}

}

MPI_Finalize();

return EXIT_SUCCESS;

}