Advertisement
AlexCioata

FSD - Laborator 3

Oct 21st, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.33 KB | None | 0 0
  1. /*
  2.  ============================================================================
  3.  Name        : lab3.c
  4.  Author      :
  5.  Version     :
  6.  Copyright   : Your copyright notice
  7.  Description : Hello MPI World in C
  8.  ============================================================================
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <math.h>
  14. #include "mpi.h"
  15.  
  16. #define PROBE 1
  17. #define REPLY 2
  18. #define LEADER 3
  19.  
  20. #define SIZE_MSG 4
  21.  
  22. int main(int argc, char* argv[]) {
  23.     int my_rank; /* rank of process */
  24.     int p; /* number of processes */
  25.     int source; /* rank of sender */
  26.     int dest; /* rank of receiver */
  27.     int tag = 0; /* tag for messages */
  28.     MPI_Status status; /* return status for receive */
  29.  
  30.     /* start up MPI */
  31.     MPI_Init(&argc, &argv);
  32.     /* find out process rank */
  33.     MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
  34.     /* find out number of processes */
  35.     MPI_Comm_size(MPI_COMM_WORLD, &p);
  36.  
  37.     int sendbuf[SIZE_MSG];
  38.     int recvbuf[SIZE_MSG];
  39.     int phase = 0;
  40.     int leader = 0;
  41.  
  42.     int nodes[7] = {73, 28 ,74, 49, 66, 69, 71};
  43.     int left = 0;
  44.     int right = 0;
  45.  
  46.     if((my_rank - 1) < 0) {
  47.         left = p - 1;
  48.     } else {
  49.         left = my_rank - 1;
  50.     }
  51.     right = (my_rank + 1) % p;
  52.  
  53.     sendbuf[0] = PROBE;
  54.     sendbuf[1] = nodes[my_rank];
  55.     sendbuf[2] = phase;
  56.     sendbuf[3] = 1;
  57.     MPI_Send(sendbuf, SIZE_MSG, MPI_INT, left, tag, MPI_COMM_WORLD);
  58.     MPI_Send(sendbuf, SIZE_MSG, MPI_INT, right, tag, MPI_COMM_WORLD);
  59.     int flag = 1;
  60.     while (flag) {
  61.         MPI_Recv(recvbuf, SIZE_MSG, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
  62.         source = status.MPI_SOURCE;
  63.         if(source == left) {
  64.             switch (recvbuf[0]) {
  65.             case PROBE:
  66.                 if(recvbuf[1] == nodes[my_rank]) {
  67.                     sendbuf[0] = LEADER;
  68.                     sendbuf[1] = nodes[my_rank];
  69.                     MPI_Send(sendbuf, SIZE_MSG, MPI_INT, left, tag, MPI_COMM_WORLD);
  70.                 }
  71.  
  72.                 if(recvbuf[1] > nodes[my_rank] && recvbuf[3] < pow(2, recvbuf[3])) {
  73.                     sendbuf[0] = PROBE;
  74.                     sendbuf[1] = recvbuf[1];
  75.                     sendbuf[2] = phase;
  76.                     sendbuf[3] = recvbuf[3] + 1;
  77.                     MPI_Send(sendbuf, SIZE_MSG, MPI_INT, right, tag, MPI_COMM_WORLD);
  78.                 }
  79.  
  80.                 if(recvbuf[1] > nodes[my_rank] && recvbuf[3] >= pow(2, recvbuf[3])) {
  81.                     sendbuf[0] = REPLY;
  82.                     sendbuf[1] = recvbuf[1];
  83.                     sendbuf[2] = phase;
  84.                     sendbuf[3] = recvbuf[3] + 1;
  85.                     MPI_Send(sendbuf, SIZE_MSG, MPI_INT, right, tag, MPI_COMM_WORLD);
  86.                 }
  87.                 break;
  88.             case REPLY:
  89.                 if(recvbuf[1] != nodes[my_rank]) {
  90.                     MPI_Send(recvbuf, SIZE_MSG, MPI_INT, right, tag, MPI_COMM_WORLD);
  91.                 } else {
  92.                     sendbuf[0] = PROBE;
  93.                     sendbuf[1] = nodes[my_rank];
  94.                     sendbuf[2] = phase + 1;
  95.                     sendbuf[4] = 1;
  96.                     MPI_Send(recvbuf, SIZE_MSG, MPI_INT, left, tag, MPI_COMM_WORLD);
  97.                     MPI_Send(recvbuf, SIZE_MSG, MPI_INT, right, tag, MPI_COMM_WORLD);
  98.                 }
  99.                 break;
  100.             }
  101.         } else {
  102.             switch (recvbuf[0]) {
  103.             case PROBE:
  104.                 if(recvbuf[1] == nodes[my_rank]) {
  105.                     sendbuf[0] = LEADER;
  106.                     sendbuf[1] = nodes[my_rank];
  107.                     MPI_Send(sendbuf, SIZE_MSG, MPI_INT, left, tag, MPI_COMM_WORLD);
  108.                 }
  109.  
  110.                 if(recvbuf[1] > nodes[my_rank] && recvbuf[3] < pow(2, recvbuf[3])) {
  111.                     sendbuf[0] = PROBE;
  112.                     sendbuf[1] = recvbuf[1];
  113.                     sendbuf[2] = phase;
  114.                     sendbuf[3] = recvbuf[3] + 1;
  115.                     MPI_Send(sendbuf, SIZE_MSG, MPI_INT, left, tag, MPI_COMM_WORLD);
  116.                 }
  117.  
  118.                 if(recvbuf[1] > nodes[my_rank] && recvbuf[3] >= pow(2, recvbuf[3])) {
  119.                     sendbuf[0] = REPLY;
  120.                     sendbuf[1] = recvbuf[1];
  121.                     sendbuf[2] = phase;
  122.                     sendbuf[3] = recvbuf[3] + 1;
  123.                     MPI_Send(sendbuf, SIZE_MSG, MPI_INT, left, tag, MPI_COMM_WORLD);
  124.                 }
  125.                 break;
  126.             case REPLY:
  127.                 if(recvbuf[1] != nodes[my_rank]) {
  128.                     MPI_Send(recvbuf, SIZE_MSG, MPI_INT, right, tag, MPI_COMM_WORLD);
  129.                 } else {
  130.                     sendbuf[0] = PROBE;
  131.                     sendbuf[1] = nodes[my_rank];
  132.                     sendbuf[2] = phase + 1;
  133.                     sendbuf[4] = 1;
  134.                     MPI_Send(recvbuf, SIZE_MSG, MPI_INT, left, tag, MPI_COMM_WORLD);
  135.                     MPI_Send(recvbuf, SIZE_MSG, MPI_INT, right, tag, MPI_COMM_WORLD);
  136.                 }
  137.                 break;
  138.             case LEADER:
  139.                 leader = nodes[my_rank];
  140.                 if(recvbuf[1] != nodes[my_rank]) {
  141.                     sendbuf[0] = LEADER;
  142.                     sendbuf[1] = leader;
  143.                     MPI_Send(sendbuf, SIZE_MSG, MPI_INT, left, tag, MPI_COMM_WORLD);
  144.                     printf("I am leader %d with value %d\n", my_rank, leader);
  145.                     flag = 0;
  146.                 }
  147.                 break;
  148.             }
  149.         }
  150.     }
  151.     /* shut down MPI */
  152.     MPI_Finalize();
  153.  
  154.     return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement