SHARE
TWEET

ppr3

a guest Nov 15th, 2019 83 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. #include <iostream>
  3. #include <algorithm>
  4. #include<stdlib.h>
  5. #include <time.h>
  6. #include <mpi.h>
  7. #include <cmath>
  8.  
  9. #define MASTER 0
  10. using namespace std;
  11. void bubblesort(int *v, int n);
  12. int* merge(int* v1, int n1, int* v2, int n2);
  13.  
  14. int main(int argc, char **argv) {
  15.    
  16.     MPI_Init(&argc, &argv);
  17.     int n=100;
  18.     int *a = new int[n];
  19.     int rank,size,length;
  20.     int kawalki;
  21.     int *data = NULL;
  22.     int buforN;
  23.     int *bufor = NULL;
  24.     int *kawalki_wys = NULL;
  25.     char hostname[MPI_MAX_PROCESSOR_NAME];
  26.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  27.     MPI_Comm_size(MPI_COMM_WORLD, &size);
  28.     MPI_Get_processor_name(hostname, &length);
  29.  
  30.  
  31.    
  32.     if(rank == MASTER){
  33.         srand(time(NULL));
  34.        
  35.         //if (n%size == 0){
  36.     //      kawalki = n/size; //n=8 size=3 8/3=2
  37.     //  }else{
  38.     //      kawalki = ceil((double)n/size);
  39.     //  }
  40.         kawalki = n/size;
  41.         if(n%size!=0){
  42.             kawalki++;
  43.         }
  44.         cout<<"Kawalki: "<< kawalki <<endl;
  45.        
  46.         data = new int[size*kawalki];
  47.         cout << "Tablica wyjsciowa " << endl;
  48.         //  for (int i = 0; i<size*kawalki; i++) {
  49.                 //a[i] = rand() % 1000;
  50.                 //if(i < n){
  51.                 //  data[i] = rand() %1000;
  52.             //  } else{
  53.             //      data[i] = 0;
  54.             //  }
  55.                
  56.                
  57.         //  }
  58.             for(int i=0; i<n; i++){
  59.                 data[i] = rand() %1000;
  60.                 cout << data[i] << endl;
  61.             }
  62.             for(int i=n; i<size*kawalki; i++){
  63.                 data[i] = 0;
  64.                //cout << data[i] << endl;
  65.             }
  66.            
  67.            
  68.     }
  69.     MPI_Barrier(MPI_COMM_WORLD);
  70.     double timestart = MPI_Wtime();
  71.    
  72.     MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
  73.  
  74.     //if (n%size == 0){
  75.     //      kawalki = n/size; //n=8 size=3 8/3=2
  76.     //  }else{
  77.     //      kawalki = ceil((double)n/size);
  78.     //  }
  79.     kawalki = n/size;
  80.         if(n%size!=0){
  81.             kawalki++;
  82.         }
  83.     bufor = new int[kawalki];
  84.  
  85.     MPI_Scatter(data, kawalki, MPI_INT, bufor, kawalki, MPI_INT, 0, MPI_COMM_WORLD);
  86.     /*
  87.     cout<<"Bufor dla procesu: "<< rank <<endl;
  88.     for(int i=0; i<kawalki; i++){
  89.         cout<<bufor[i]<<endl;
  90.     }
  91.     */
  92.     delete[] data;
  93.     data = NULL;
  94.    
  95.      if(size-1!=rank){
  96.         buforN = kawalki;
  97.      }else{
  98.         buforN = n - kawalki*rank;
  99.      }
  100.      
  101.      //if(n>=kawalki*(rank+1))
  102.      
  103.     bubblesort(bufor, buforN);
  104.     /*
  105.     cout<<"==============="<<endl;
  106.     cout<<"Posortowany Bufor dla procesu: "<< rank <<endl;
  107.     for(int i=0; i<buforN; i++){
  108.         cout<<bufor[i]<<endl;
  109.     }
  110.     cout<<"==============="<<endl;
  111.     */
  112.     int krok;
  113.     int s_wys;
  114.     for(krok=1; krok<size; krok=krok*2){ //tu wejdzie 1 3 5
  115.         if((rank % (2*krok))!=0){
  116.             MPI_Send(bufor, buforN, MPI_INT, rank-krok,0,MPI_COMM_WORLD);
  117.             break;
  118.         }
  119.         if(rank + krok < size){
  120.             if(n >= kawalki * ( rank+2*krok )){ //czy to dziala i dlczego czy id+krok
  121.                 s_wys = kawalki * krok;
  122.             }else{
  123.                 s_wys = n-(kawalki*(rank+krok));
  124.             }
  125.             kawalki_wys = new int[s_wys];
  126.             MPI_Status status;
  127.             MPI_Recv(kawalki_wys, s_wys, MPI_INT, rank+krok, 0, MPI_COMM_WORLD, &status);
  128.             data = merge(bufor, buforN, kawalki_wys, s_wys);
  129.             delete[] bufor;
  130.             delete[] kawalki_wys;
  131.             bufor = data;
  132.             buforN = buforN+s_wys;
  133.             //bubblesort(bufor, buforN);
  134.  
  135.     }
  136. }
  137.    
  138.    
  139.     if(rank == MASTER){
  140.         cout<<"\nTablica posortowana o wielkosci "<<buforN<<endl;
  141.         for(int i=0; i<buforN; i++ ){
  142.             cout<< bufor[i]<<endl;
  143.         }
  144.         cout<<"\nLiczba procesow: "<<size<<endl;
  145.         cout<<"Czas: "<<MPI_Wtime()-timestart<<endl;
  146.     }
  147.    
  148.     //cout << "Tablica a posortowana " << endl;
  149.     //for (int i = 0; i<n; i++) cout << a[i] << endl;
  150.    
  151.     MPI_Finalize();
  152.     return 0;
  153. }
  154.  
  155. void bubblesort(int *v, int n){
  156.     for (int i = n - 2; i >= 0; i--)
  157.         for (int j = 0; j <= i; j++)
  158.             if (v[j] > v[j + 1]){
  159.                 swap(v[j], v[j + 1]);
  160.             }
  161. }
  162.  
  163. int* merge(int* v1, int n1, int* v2, int n2){
  164.     int *merged = new int[n1+n2];
  165.    
  166.     int i=0;
  167.     int j=0;
  168.     int k;
  169.    
  170.     for(k=0; k<n1+n2; k++){
  171.         if(i>= n1){
  172.             merged[k]=v2[j];
  173.             j++;
  174.         }
  175.         else if(j >= n2){
  176.             merged[k]=v2[i];
  177.             i++;
  178.         }
  179.         else if(v1[i]<v2[j]){
  180.             merged[k]=v1[i];
  181.             i++;
  182.         }
  183.         else{ //v2[j] <= v1[i]
  184.             merged[k] = v2[j];
  185.             j++;
  186.         }
  187.     }
  188.    
  189.     return merged;
  190. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top