Advertisement
alexdmin

lab2.2

Sep 30th, 2022 (edited)
723
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. // Необходимо реализовать эту программу через функции Send и Recv
  2.  
  3. #include <mpi.h>
  4. #include <stdio.h>
  5. #include <iostream>
  6.  
  7. using namespace std;
  8.  
  9. int main(int argc, char** argv)
  10. {
  11.     int myid, n = 3, *A = 0, *B = 0, buf = 0;
  12.     int size;
  13.     MPI_Status status;
  14.     MPI_Comm comm = MPI_COMM_WORLD;
  15.     MPI_Init(&argc, &argv);
  16.     MPI_Comm_size(comm, &size);
  17.     MPI_Comm_rank(comm, &myid);
  18.  
  19.     B = new int [size * n];
  20.     A = new int [size * n];
  21.  
  22.     for(int i = 0; i < size * n; i++)
  23.     {
  24.         B[i] = myid;
  25.     }
  26.    
  27.  
  28.     for(int i = 0; i < size ; i++)// Отправлю з-е другим потокам и присваиваю з-е своиму потоку своего
  29.         {
  30.           if(myid != i){
  31.             buf = B[i];
  32.             MPI_Send(&buf, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
  33.           }else
  34.           {
  35.             int k = myid * n;
  36.             for (int j = 0 ; j < n ; j++)
  37.             {
  38.                 A[k + j] = B[i];
  39.             }
  40.         }
  41.     }
  42.  
  43.     cout << "Process " << myid << " | ";
  44.    
  45.     for(int i = 0; i < size * n; i++)
  46.         cout << "  " << B[i];
  47.  
  48.     int c = 0, BUF = 0;
  49.    
  50.     for(int j = 0; j < size ; j++)
  51.     {
  52.         if(myid != j){// Поток не должен слушать себя
  53.             MPI_Recv(&BUF,1,MPI_INT,j,0,MPI_COMM_WORLD,&status);            // можно было не писать цикл ниже , а сразу определить нужное мето для вставки значения и вставить его именно туда
  54.             for(int i = 0 ; i < size * n ; i+=n)// Не работает для нулевого потока
  55.             {
  56.                 if(c == j)
  57.                 {
  58.                     for(int k = 0 ; k < n ; k++)
  59.                     {
  60.                         A[i + k] = BUF;
  61.                     }
  62.  
  63.                 }
  64.                 // if(c > myid)
  65.                 // {
  66.                 //     break;
  67.                 // }
  68.                 c++;
  69.             }
  70.             c = 0;
  71.             BUF = 0;
  72.         }
  73.     }
  74.  
  75.     cout << "       " << "Process " << myid << " | ";
  76.     for(int i = 0; i < size * n; i++)
  77.         cout << "  " << A[i];
  78.     cout << endl;
  79.  
  80.     MPI_Finalize();
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement