Advertisement
Guest User

Untitled

a guest
Jan 18th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.98 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <mpi.h>
  5. #include <fstream>
  6. #include <iostream>
  7.  
  8.  
  9.  using namespace std;
  10. int main (int argc, char * argv[])
  11. {
  12.     srand(time(NULL));
  13.     int rank;
  14.     int numProcessors;
  15.     int myNum;
  16.     int B;
  17.     int A;
  18.     int localNum;
  19.      
  20.     MPI_Init(&argc, &argv);
  21.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  22.     MPI_Comm_size(MPI_COMM_WORLD, &numProcessors);
  23.      
  24.     int *tab = new int[numProcessors];
  25.      
  26.     if(rank > 0)
  27.     {
  28.         MPI_Recv(&myNum, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  29.     }
  30.      
  31.     if(rank == 0)
  32.     {
  33.         cout << "Nieposortowana tablica..." << endl;
  34.         myNum = rand();
  35.         cout << "[0]" << myNum << endl;
  36.          
  37.         for (int i = 1; i < numProcessors; i++) // for all the numbers in the file
  38.         {
  39.             localNum = rand();
  40.             cout << "["<<i<<"] "<< localNum << endl;
  41.             MPI_Send(&localNum, 1, MPI_INT, i, 0, MPI_COMM_WORLD); // broadcast the number to its assigned processor i
  42.         }
  43.          
  44.         localNum = NULL;    
  45.     }
  46.      
  47.     if (rank %2 == 0)
  48.     {
  49.         A = rank + 1;
  50.         B = rank - 1;
  51.     }
  52.     else
  53.     {
  54.         A = rank - 1;
  55.         B = rank + 1;
  56.     }
  57.      
  58.     if ((A == -1) || (A==numProcessors))
  59.         A = rank;
  60.     if ((B == -1) || (B == numProcessors))
  61.         B = rank;    
  62.          
  63.     // begin the main sorting loop          
  64.     for (int i = 0; i<numProcessors; i++)
  65.     {
  66.         if (i %2 == 0)
  67.         {
  68.             MPI_Sendrecv(&myNum, 1, MPI_INT, B, 8, &localNum, 1, MPI_INT , B, 8, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  69.         }
  70.         else
  71.         {
  72.             MPI_Sendrecv(&myNum, 1, MPI_INT, A, 9, &localNum, 1, MPI_INT, A, 9, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  73.         }
  74.          
  75.         if (i %2 == 0)
  76.         {
  77.             if (rank %2 == 0 && localNum > myNum)
  78.                 myNum = localNum;
  79.             if (rank %2 == 1 && localNum < myNum)
  80.                 myNum=localNum;
  81.                  
  82.             MPI_Barrier(MPI_Comm MPI_COMM_WORLD);
  83.         }
  84.          
  85.         else
  86.         {
  87.             if (rank %2 == 0 && localNum < myNum)
  88.                 myNum = localNum;
  89.             if (rank %2 == 1 && localNum > myNum)
  90.                 myNum=localNum;
  91.                  
  92.             MPI_Barrier(MPI_Comm MPI_COMM_WORLD);    
  93.         }
  94.          
  95.         MPI_Barrier(MPI_Comm MPI_COMM_WORLD);    
  96.     }
  97.      
  98.     if (rank > 0)
  99.         MPI_Send(&myNum, 1, MPI_INT, 0, 5, MPI_COMM_WORLD);    
  100.     else if(rank == 0)
  101.     {
  102.         tab[0] = myNum;
  103.         for (int i = 1; i < numProcessors; i++)
  104.         {
  105.             MPI_Recv(&tab[i], 1, MPI_INT, i, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  106.         }
  107.  
  108.         std::cout << "Posortowana tablica: \n" << std::endl;
  109.         for (int i = 0; i < numProcessors; i++)
  110.                 std::cout << "["<<i<<"] " << tab[i] << std::endl;
  111.     }  
  112.      
  113.     MPI_Finalize();
  114.    
  115.     free(tab);
  116.  
  117.     return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement