Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.80 KB | None | 0 0
  1. /*  Project: merge-splitting sort, project for PRL course at FIT BUT
  2.     Author: Martin Krajnak
  3. */
  4.  
  5. #include <math.h>
  6. #include <mpi.h>
  7. #include <fstream>
  8. #include <cstdlib>
  9. #include <algorithm>
  10. #include <vector>
  11. #include <iostream>
  12. #include <string>
  13. #include <climits>
  14.  
  15. using namespace std;
  16. #define TAG 0
  17.  
  18. /**
  19. * Determine vertex to which given edge leads
  20. */
  21. int get_vertex(int edge){
  22.   if ((edge%4) == 1) {        // left son vertex
  23.     return (int)ceil((edge/2.)+1);
  24.   } else if ((edge%4) == 2) { // parent from left vertex
  25.     return (int)((edge/4.)+1);
  26.   } else if ((edge%4) == 3) { // right son vertex
  27.     return (int)ceil((edge/2.)+1);
  28.   } else if ((edge%4) == 0) { // parent from right vertex
  29.     return (int)(edge/4.);
  30.   }
  31. }
  32.  
  33. /**
  34. * Compute the Euler tour
  35. */
  36. int get_next(int edge, int length){
  37.   int v = get_vertex(edge);
  38.   if (2*v <= length){
  39.     if (edge==4 || (length == 2 && edge==2)) //  I am gR00t
  40.       return edge;
  41.     else if (edge%4 == 0)   // going up
  42.       return ((edge-2)/2-1);
  43.     else if (edge%2 == 0 && (2*v+1) <= length) // no right neighbor, go up
  44.       return edge+1;
  45.     else if (edge%2 == 0)   // the end
  46.       return ((edge/2)-1);
  47.     else
  48.       return ((v-1)*4+1);   // go down
  49.   } else {
  50.     return edge+1;          // go right
  51.   }
  52. }
  53.  
  54.  
  55. int main(int argc, char **argv) {
  56.   int numprocs;               // number of cpus obtained from mpi
  57.   int myid;                   // cpu identifier
  58.   MPI_Status stat;
  59.  
  60.   MPI_Init(&argc,&argv);                          // MPI init
  61.   MPI_Comm_size(MPI_COMM_WORLD, &numprocs);       // obtain numprocs
  62.   MPI_Comm_rank(MPI_COMM_WORLD, &myid);           // obtain of of each proc
  63.  
  64.   //printf("%s\n",argv[1]);
  65.   size_t n = strlen(argv[1]);
  66.   size_t edges_num = 2*n-2;
  67.  
  68.   int edges[edges_num];
  69.   int euler_tour[edges_num];
  70.  
  71.   if (myid == 0) {
  72.     // printf("%2d: %2d iterations on %2d\n",myid, (int)ceil(log2((double)edges_num)), edges_num);
  73.     for (size_t i = 1; i <= edges_num; i++) { // init edges with numbers
  74.       edges[i] = i;
  75.       printf("%3d",edges[i]);
  76.     }
  77.     printf("\n");
  78.     for (size_t i = 1; i <= edges_num; i++) { // init edges with numbers
  79.       printf("%3d",get_next(edges[i],n) );
  80.     }
  81.     printf("\n");
  82.   }
  83.   // obtain the subarray (sub_nums) for every proc
  84.   int edge;
  85.   int rank;
  86.   MPI_Scatter(edges, 1, MPI_INT, &edge, 1, MPI_INT, 0, MPI_COMM_WORLD);
  87.  
  88.   euler_tour[myid] = get_next(edge+1,n);
  89.  
  90.   int pred = -1, succ = 0;
  91.   if (edge == edges_num-1) {
  92.     // printf("LAST CPU: %d\n",myid );
  93.     rank = 0;
  94.     succ = edge;
  95.   } else {
  96.     // printf("CPU: %2d SUCC: %2d\n",myid, myid+1 );
  97.     rank = 1;
  98.     succ = myid+1;
  99.   }
  100.   if (edge != edges_num-1 ) {
  101.     printf("CPU:%d SENDING:%2d to:%2d\n",myid, myid, succ);
  102.     MPI_Send(&myid, 1, MPI_INT, succ, TAG, MPI_COMM_WORLD);
  103.   }
  104.   if (myid != 0) {
  105.     MPI_Recv(&pred, 1, MPI_INT, MPI_ANY_SOURCE, TAG, MPI_COMM_WORLD, &stat);
  106.     printf("CPU:%d RECEIVED:%2d\n",myid, pred);
  107.   }
  108.   if (pred != myid-1) {
  109.     printf("ERR.Myid:%2d,Next:%2d,Pred%2d\n",myid, succ, pred);
  110.   }
  111.   // printf("edges_num%2d\n",edges_num );
  112.   int tmp;
  113.   for (size_t i = 1; i <= 1; i++) {
  114.     if (edge == edges_num-1) {
  115.       // printf("2.CPU:%d i:%d SENDING to: %2d\n",myid, i, pred);
  116.       MPI_Send(&rank, 1, MPI_INT, pred, TAG, MPI_COMM_WORLD);
  117.       MPI_Send(&succ, 1, MPI_INT, pred, TAG, MPI_COMM_WORLD);
  118.       // printf("2.1.CPU:%d i:%d SENT to: %2d\n",myid, i, pred);
  119.     } else if (myid==0) {
  120.       // printf("1.CPU:%d i:%d WAITING for %2d\n", myid, i, succ);
  121.       MPI_Recv(&tmp, 1, MPI_INT, succ, TAG, MPI_COMM_WORLD, &stat);
  122.       MPI_Recv(&succ, 1, MPI_INT, succ, TAG, MPI_COMM_WORLD, &stat);
  123.       // printf("1.1.CPU:%d i:%d RECEIVED    %2d\n",myid, i, succ);
  124.       // printf("1.2.CPU:%d i:%d RECEIVED    %2d\n",myid, i, tmp);
  125.       rank += tmp;
  126.     } else {
  127.       // printf("3.CPU:%d i:%d SENDING to: %2d\n",myid, i, pred);
  128.       MPI_Send(&rank, 1, MPI_INT, pred, TAG, MPI_COMM_WORLD);
  129.       MPI_Send(&succ, 1, MPI_INT, pred, TAG, MPI_COMM_WORLD);
  130.       // printf("3.1.CPU:%d i:%d SENT to: %2d\n",myid, i, pred);
  131.       // printf("4.CPU:%d i:%d WAITING for %2d\n",myid, i, succ);
  132.       MPI_Recv(&tmp, 1, MPI_INT, succ, TAG, MPI_COMM_WORLD, &stat);
  133.       MPI_Recv(&succ, 1, MPI_INT, succ, TAG, MPI_COMM_WORLD, &stat);
  134.       // printf("5.CPU:%d i:%d RECEIVED    %2d\n",myid, i, succ);
  135.       // printf("6.CPU:%d i:%d RECEIVED    %2d\n",myid, i, tmp);
  136.       rank += tmp;
  137.     }
  138.   }
  139.   printf("1.Myid:%2d,Next:%2d,Pred%2d,Rank%2d\n",myid+1, succ+1, pred, rank);
  140.   // MPI_Gather(&edge, 1, MPI_INT, rank, 1, MPI_INT, 0, MPI_COMM_WORLD);
  141.   //
  142.   // if (myid == 0) {
  143.   //   for (size_t i = 0; i < edges_num; i++) { // init edges with numbers
  144.   //     printf("%2d",edges_num-rank[i]);
  145.   //   }
  146.   //   printf("\n");
  147.   // }
  148.  
  149.   MPI_Finalize();
  150.   return 0;
  151.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement