Advertisement
alexdmin

parallel_lab1

Sep 22nd, 2022
821
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. #include <mpi.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char** argv)
  8. {
  9.   int rank, value, n, ownvalue;
  10.   int start, end;
  11.   MPI_Status status;
  12.   MPI_Init( &argc, &argv );
  13.   MPI_Comm_rank( MPI_COMM_WORLD, &rank );
  14.   MPI_Comm_size( MPI_COMM_WORLD, &n );
  15.  
  16.   start = 3;    end = 0;    value = 0;    ownvalue = 0;//переменная для хранения различных собственных значений, а не буфер для передачи значений другим потокам :)
  17.   int c = 0;
  18.  
  19.   for(int i = 1; i <= n - 1; i++)
  20.   {
  21.  
  22.     if(start + i <= n - 1){
  23.       end = start + i;
  24.     }else{
  25.       end = c;
  26.       c++;
  27.     }
  28.  
  29.     if(start >= 0 && end > start && end < n){// Не надо перескакивать через ноль
  30.       if (rank == start){
  31.         value = 1;  
  32.         MPI_Send(&value,1,MPI_INT,rank+1,0,MPI_COMM_WORLD );
  33.       }
  34.       else if(rank > start && rank <= end) //5 6 7
  35.       {
  36.         MPI_Recv(&value,1,MPI_INT,rank-1,0,MPI_COMM_WORLD,&status);
  37.         if(rank == end){
  38.           ownvalue = value;
  39.         }  
  40.         value++;    
  41.         if (rank <= end - 1){ //6
  42.           //value++;
  43.           MPI_Send(&value,1,MPI_INT,rank+1,0,MPI_COMM_WORLD );
  44.         }
  45.       }
  46.       if(rank == end)
  47.       {
  48.       cout<< "Process "<< rank <<" got ~"<< ownvalue << endl;
  49.       }
  50.     }
  51.     else if(start >= 0 && end < n && start < n && end >= 0)//Когда надо перепрыгнуть через ноль
  52.     {
  53.       if(rank == start && start != n - 1){//Если start == n - 1 ?
  54.         value = 1;
  55.         MPI_Send(&value,1,MPI_INT,rank + 1,0,MPI_COMM_WORLD );
  56.       }else if(rank == start && start == n -1){
  57.         value = 1;
  58.         MPI_Send(&value,1,MPI_INT,0,0,MPI_COMM_WORLD );
  59.       }else
  60.       {
  61.         if(rank == 0){
  62.           MPI_Recv(&value,1,MPI_INT,n - 1,0,MPI_COMM_WORLD,&status);
  63.           if(end == 0){
  64.             ownvalue = value;
  65.           }
  66.           else{
  67.           value++;
  68.           MPI_Send(&value,1,MPI_INT,rank + 1,0,MPI_COMM_WORLD );
  69.           }
  70.         }
  71.         else if(rank == n - 1){
  72.           MPI_Recv(&value,1,MPI_INT,rank - 1,0,MPI_COMM_WORLD,&status);
  73.           value++;
  74.           MPI_Send(&value,1,MPI_INT,0,0,MPI_COMM_WORLD );      
  75.         }
  76.         else if(rank == end){// Под это условие попадает ранг старта и ранг перед ним
  77.           MPI_Recv(&value,1,MPI_INT,rank - 1,0,MPI_COMM_WORLD,&status);
  78.           ownvalue = value;
  79.         }
  80.         else if( !(rank < start && rank > end) ){// Ранги межу старт и конец не начто не ссылаются и не принимают ничего
  81.           MPI_Recv(&value,1,MPI_INT,rank - 1,0,MPI_COMM_WORLD,&status);
  82.           value++;
  83.           MPI_Send(&value,1,MPI_INT,rank + 1,0,MPI_COMM_WORLD );
  84.         }
  85.       }
  86.       if(rank == end){
  87.         cout<< "Process "<< rank<<" got "<< ownvalue << endl;
  88.       }
  89.     }
  90.     //MPI_Finalize( );    // Без  MPI_Finalize( );  Иногда не корректно заканчивается вывод в терминале
  91.   }
  92.   MPI_Finalize( );    // Без  MPI_Finalize( );  Иногда не корректно заканчивается вывод в терминале
  93. }
Tags: MPI
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement