#include#include#includetypedef enum CIRCLE_ENTRANCE {N, W, S, E} Entrance;float PROBABILITY44 = {{0.1,0.2,0.5,0.2},{0.2,0.1,0.3,0.4},{0.5,0.1,0.1,0.3},{0.3,0.4,0.2,0.1}};int offset={0,4,8,12};int Choose_Exit(const Entrance entrance_no); int main(int argc,char *argv){int circle15;int new_circle15;int arrival3;int wait_cnt3;int arrival_cnt3;int queue3;int queue_accum3;int i=0;float u=0;int iteration=0;int myid;int numprocs;MPI_Init(&argc, &argv);MPI_Comm_size(MPI_COMM_WORLD, &numprocs);MPI_Comm_rank(MPI_COMM_WORLD, &myid);for(i=0;i<=3;i++) { arrival_cnti=0; wait_cnti=0; queuei=0; queue_accumi=0; }//printf("rest zeros");for(i=0;i<=15;i++) { circlei=-1; }//printf("circlei set to -1");for(i=0;i<=3;i++) { MPI_Bcast(PROBABILITYi,4, MPI_FLOAT,0, MPI_COMM_WORLD); } int requested_iterations = 1000;int f={3,3,4,2};for(iteration=0;iteration<=requested_iterations;iteration++) { printf("iteration no = %d",iteration); //NEW CARS ARRIVE AT ENTRANCES for(i=0;i<=3;i++) { //printf("new cars arrive at entrance"); u=rand()/(float)RAND_MAX; //printf("the random value is %f",u); if(u<=1.0/(float)fi) { arrivali=1; arrival_cnti=arrival_cnti+1; //printf("inside if of arrival"); } else { arrivali=0; //printf("inside else of arrival"); } } //printf("calculation of arrival done"); //CARS INSIDE CIRCLE ADVANCE SIMULTANEOUSLY for(i=0;i<=15;i++) { const int j=(i+1)%16; //printf("i=%d,j=%d,circlei=%d",i,j,circlei); if(circlei==-1 || circlei==j) { //printf("inside if of new_circle"); new_circlej=-1; } else { //printf("inside else of new_circle"); new_circlej=circlei; } } //printf("calculation of circle done"); for(i=0;i<=15;i++) { circlei=new_circlei; } //CARS ENTER CIRCLE for(i=0;i<=3;i++) { //printf("circleoffseti=%d",circleoffseti); if(circleoffseti==-1) //THERE IS SPACE FOR CAR TO ENTER //printf("inside there is a space for car to enter"); { if(queuei>0) //CAR WAITING IN QUEUE ENTERS CIRCLE { //printf(“car waiting in queue enters circle”); queuei=queuei-1; circleoffseti=Choose_Exit(i); } else if(arrivali>0) //NEWLY ARRIVED CAR ENTERS CIRCLE { //printf(“newly arrived car enters circle”); arrivali=0; circleoffseti=Choose_Exit(i); } } //printf(“arrivali=%d”,arrivali); if(arrivali>0) //NEWLY ARRIVED CAR QUEUE UP { //printf(“newly arrived car queues up”); wait_cnti=wait_cnti+1; queuei=queuei+1; } } for(i=0;i<=3;i++) { queue_accumi=queue_accumi+queuei; } //printf("cars enter circle done"); }int tot_arrival_cnt4;int tot_wait_cnt4;int tot_queue_accum4;//int MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,MPI_Op op, int root, MPI_Comm comm)//collecting total data from arrival, wait and queueMPI_Reduce(arrival_cnt, tot_arrival_cnt, 4, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);MPI_Reduce(wait_cnt, tot_wait_cnt, 4, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);MPI_Reduce(queue_accum, tot_queue_accum, 4, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);if(myid==0) { printf("results of parallel processing are"); for(i=0;i<=3;i++) { printf("total arrival count%d = %d",i,tot_arrival_cnti); printf("total wait count%d = %d",i,tot_wait_cnti); printf("total queue accumulator%d = %d",i,tot_queue_accumi); } } MPI_Finalize();return 0;} int Choose_Exit(const Entrance entrance_no) { printf("inside function choose exit"); float dist_N, dist_W, dist_S; Entrance exit_no; float RANDOM = 0.0; RANDOM = (float)rand()/(float)RAND_MAX; dist_N = PROBABILITYentrance_no0; dist_W = dist_N + PROBABILITYentrance_no1; dist_S = dist_W + PROBABILITYentrance_no2; if(RANDOM < dist_N) { printf("IN EXIT 'N' random = %f",RANDOM); exit_no = N; } else if(dist_N <= RANDOM && RANDOM < dist_W) { printf("IN EXIT 'W' random = %f",RANDOM); exit_no = W; } else if(dist_W <= RANDOM && RANDOM < dist_S) { printf("IN EXIT 'S' random = %f",RANDOM); exit_no = S; } else { printf("IN EXIT 'E' random = %d",RANDOM); exit_no = E; } return offsetexit_no; }