Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <mpi.h>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. const long long SIZE=100;
  10. int a[SIZE];
  11.  
  12. int main(int argc , char ** argv){
  13.  
  14.     int id, nproc;
  15.     MPI_Status status;
  16.     MPI_Init(&argc,&argv);
  17.     MPI_Comm_size(MPI_COMM_WORLD, &nproc);
  18.     MPI_Comm_rank(MPI_COMM_WORLD, &id) ;
  19.     int i, b[nproc],j=0, order[SIZE], lenght[nproc]={0};;
  20.  
  21.     if(id==0){
  22.        srand(time(NULL));
  23.  
  24.        int meret=nproc, sample, tmp=1;
  25.  
  26.         do{
  27.            meret/=10;
  28.            tmp*=10;
  29.         }while(meret);
  30.             cout<<tmp<<endl;
  31.             sample=nproc*tmp;
  32.             cout<<sample<<endl;
  33.  
  34.         int s[sample];
  35.  
  36.        for(i=0;i<SIZE;i++){
  37.             a[i]=rand()%100;
  38.             cout<<a[i]<<" ";
  39.         }
  40.  
  41.         for(i=0;i<sample;i++){
  42.             s[i]=a[rand()%SIZE];
  43.             cout<<s[i]<<" ";
  44.         }
  45.  
  46.         sort(s, s+sample);
  47.  
  48.         for(i=0;i<nproc;i++){
  49.             b[i]=s[tmp*(i+1)-1];
  50.             cout<<b[i]<<" ";
  51.         }
  52.  
  53.    
  54.         MPI_Bcast(&b, nproc, MPI_INT, 0, MPI_COMM_WORLD);
  55.         MPI_Bcast(&a, SIZE, MPI_INT, 1, MPI_COMM_WORLD);
  56.  
  57.         for(i=0;i<SIZE;i++){
  58.             if(a[i]<b[id]){
  59.              order[i]=a[i]; j++;
  60.             }
  61.         }
  62.  
  63.         lenght[id]=j;  
  64.  
  65.         sort(order, order+j);
  66.         for(i=0;i<j;i++){
  67.             cout<<order[i]<<" ";
  68.         }
  69.     }
  70.  
  71.     if(id!=0){
  72.         MPI_Recv(&b, nproc, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
  73.         MPI_Recv(&a, SIZE, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
  74.  
  75.         if(id==nproc-1){
  76.             for(i=0;i<SIZE;i++){
  77.                  if(a[i]>=b[id]){
  78.                     j++;
  79.                 }
  80.             }
  81.         }else{
  82.             for(i=0;i<SIZE;i++){
  83.                  if(a[i]>b[id-1] && a[i]<=b[id]){
  84.                     j++;
  85.                  }
  86.             }
  87.         }
  88.  
  89.         MPI_Send(&id,1,MPI_INT,0,123,MPI_COMM_WORLD);
  90.         MPI_Send(&j,1,MPI_INT,0,234,MPI_COMM_WORLD);
  91.  
  92.         int slave[j];
  93.         j=0;
  94.  
  95.         if(id==nproc-1){
  96.             for(i=0;i<SIZE;i++){
  97.                 if(a[i]>=b[id]){
  98.                     slave[j]=a[i]; j++;
  99.                 }
  100.             }
  101.  
  102.         }else{
  103.             for(i=0;i<SIZE;i++){
  104.                 if(a[i]>b[id-1] && a[i]<=b[id]){
  105.                     slave[j]=a[i]; j++;
  106.                 }
  107.             }
  108.         }
  109.         sort(slave,slave+j);
  110.  
  111.         MPI_Send(&id,1,MPI_INT,0,123,MPI_COMM_WORLD);
  112.         MPI_Send(&slave,j,MPI_INT,0,345,MPI_COMM_WORLD);
  113.  
  114.     }else{
  115.  
  116.         for(i=1;i<nproc;i++){
  117.             MPI_Recv(&id, 1, MPI_INT, MPI_ANY_SOURCE, 123, MPI_COMM_WORLD, &status);            
  118.             MPI_Recv(&lenght[id], 1, MPI_INT, id, 234, MPI_COMM_WORLD, &status);
  119.         }
  120.  
  121.         for(i=0;i<nproc;i++) {b[i]=0;}
  122.  
  123.         for(i=0;i<nproc;i++){
  124.             for(j=0;j<i;j++){
  125.                 b[i]+=lenght[j];
  126.             }
  127.         }
  128.  
  129.         for(i=1;i<nproc;i++){
  130.             MPI_Recv(&id, 1, MPI_INT, MPI_ANY_SOURCE, 123, MPI_COMM_WORLD, &status);
  131.             MPI_Recv(&order+b[id], lenght[id], MPI_INT, id, 345, MPI_COMM_WORLD, &status);
  132.         }
  133.  
  134.         for(i=0;i<SIZE;i++){
  135.             cout<<order[i]<<" ";
  136.         }
  137.     }
  138.  
  139.     MPI_Finalize();
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement