Guest User

Untitled

a guest
May 26th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.43 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "mpi.h"
  3. #include <stdio.h>
  4. #include <tchar.h>
  5. #include <vector>
  6. #include "conio.h"
  7. #include <iostream>
  8. #include "time.h"
  9.  
  10. #define ROOT 0
  11. #define R2A 10
  12. #define A2B 20
  13. #define B2A 30
  14. #define A2R 40
  15.  
  16. int gSET = 0;
  17.  
  18. bool isA(int &id, int& total) {
  19.     if(id<(total/2) && id!=0) return true;
  20.     return false;
  21. }
  22.  
  23. bool isB(int &id, int&total) {
  24.     return (!isA(id,total) && id!=0);
  25. }
  26.  
  27. void showtab(int *tab, int size) {
  28.     std::cout << "\ntab=\n";
  29.     for(int i=0; i<size;++i) {
  30.         std::cout << tab[i] << "\n";
  31.     }
  32.     std::cout << "\n";
  33. }
  34.  
  35. void swap(int &a, int &b) {
  36.     int tmp = a;
  37.     a = b;
  38.     b = a;
  39. }
  40.  
  41. int main(int argc, char** argv)
  42. {
  43.     int mynode, totalnodes;
  44.     int *tab = NULL;
  45.     int temp = 0;
  46.     int buffA = 0; //wieksza
  47.     int buffB = 0; // mniejsaz
  48.     MPI_Status status;
  49.  
  50.     MPI_Init(&argc, &argv);
  51.     MPI_Comm_size(MPI_COMM_WORLD, &totalnodes);
  52.     MPI_Comm_rank(MPI_COMM_WORLD, &mynode);
  53.     srand((unsigned int)time(NULL) * mynode);
  54.    
  55.     int N = (totalnodes/2) -1;       // bo A=N+1, B=N+1, dla N
  56.     int koniec = 2*N;
  57.     int licznik = 0;
  58.     gSET = (totalnodes)/2;
  59.  
  60.     if(mynode == ROOT) {
  61.  
  62.         tab = new int[N];
  63.         //for(int i=0; i<N; ++i) tab[i] = rand()%100;
  64.         for(int i=0; i<N; ++i) tab[i] = i;
  65.         showtab(tab,N);
  66.         for(int i=0; i<N; ++i) {
  67.             temp = tab[i];
  68.             MPI_Send(&temp,1,MPI_INT,(i+1),R2A,MPI_COMM_WORLD);
  69.         }
  70.     }
  71.     else if(isA(mynode,totalnodes)) {
  72.         MPI_Recv(&buffA,1,MPI_INT,ROOT,R2A,MPI_COMM_WORLD,&status);
  73.         buffB = buffA;
  74.     }
  75.  
  76.     if(isA(mynode,totalnodes)) {
  77.         MPI_Send(&buffA,1,MPI_INT,(mynode+gSET),A2B,MPI_COMM_WORLD); // duza
  78.         MPI_Send(&buffB,1,MPI_INT,(mynode-1+gSET),A2B,MPI_COMM_WORLD); // mala  
  79.     } else if(isB(mynode,totalnodes)) {
  80.         if(mynode != 6 && mynode != 11) {
  81.             MPI_Recv(&buffA,1,MPI_INT,(mynode-gSET),A2B,MPI_COMM_WORLD,&status);
  82.             MPI_Recv(&buffB,1,MPI_INT,(mynode-gSET+1),A2B,MPI_COMM_WORLD,&status);
  83.             if(buffA < buffB) swap(buffA,buffB);       
  84.         }
  85.     }
  86.  
  87.  
  88.     if(mynode != 0) {
  89.         //while(licznik < koniec) {
  90.             if(isA(mynode,totalnodes)) {
  91.                 if(mynode != 5) {
  92.                 MPI_Recv(&buffA,1,MPI_INT,(mynode+gSET),B2A,MPI_COMM_WORLD,&status);
  93.                 MPI_Recv(&buffB,1,MPI_INT,(mynode-1+gSET),B2A,MPI_COMM_WORLD,&status);
  94.                 if(buffA < buffB) swap(buffA,buffB);
  95.  
  96.                 MPI_Send(&buffA,1,MPI_INT,(mynode+gSET),A2B,MPI_COMM_WORLD); // duza
  97.                 MPI_Send(&buffB,1,MPI_INT,(mynode-1+gSET),A2B,MPI_COMM_WORLD); // mala  
  98.                 }
  99.             }
  100.             else if(isB(mynode,totalnodes)) {
  101.                 if(mynode != 6 && mynode != 11) {
  102.                     MPI_Send(&buffB,1,MPI_INT,(mynode-gSET),B2A,MPI_COMM_WORLD);
  103.                     MPI_Send(&buffA,1,MPI_INT,(mynode-gSET+1),B2A,MPI_COMM_WORLD);
  104.  
  105.                     MPI_Recv(&buffA,1,MPI_INT,(mynode-gSET),A2B,MPI_COMM_WORLD,&status);
  106.                     MPI_Recv(&buffB,1,MPI_INT,(mynode-gSET+1),A2B,MPI_COMM_WORLD,&status);
  107.                     if(buffA < buffB) swap(buffA,buffB);   
  108.                 }
  109.                 else if(mynode == 6) {
  110.                     MPI_Send(&buffB,1,MPI_INT,1,B2A,MPI_COMM_WORLD);
  111.                     MPI_Recv(&buffB,1,MPI_INT,1,A2B,MPI_COMM_WORLD,&status);
  112.                 }
  113.             }
  114.             ++licznik;
  115.             //if(licznik > 5) break;
  116.             std::cout << "PID|licznik|koniec| " << mynode <<"|"<<licznik<<"|"<<koniec<<"|\n";
  117.         //}
  118.     }
  119.  
  120.     //if(isA(mynode,totalnodes)) {
  121.     //  MPI_Send(&buffA,1,MPI_INT,ROOT,A2R,MPI_COMM_WORLD);
  122.     //} else if(mynode == ROOT) {
  123.     //  for(int i=0; i<N; ++i) {
  124.     //      MPI_Recv(&buffA,1,MPI_INT,(i+1),A2R,MPI_COMM_WORLD,&status);
  125.     //      tab[i] = buffA;
  126.     //  }
  127.     //  showtab(tab,N);
  128.     //}
  129.  
  130.     std::cout << "koniec";
  131.     delete [] tab;
  132.     MPI_Finalize();
  133.     return 0;
  134. }
Add Comment
Please, Sign In to add comment