Advertisement
Guest User

Untitled

a guest
Feb 4th, 2023
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. #include <iostream>
  2. #include "mpi.h"
  3. #include <random>
  4. using namespace std;
  5.  
  6. #define VECTOR_SIZE 21
  7.  
  8. inline int generateRandomInRange(int a, int b) {
  9.     random_device rd;
  10.     uniform_int_distribution gen(a, b);
  11.     return gen(rd);
  12. }
  13.  
  14. void fill_vector_values(int *vec){
  15.     for(size_t i = 0; i < VECTOR_SIZE; i++){
  16.         vec[i] = generateRandomInRange(1, 100);
  17.     }
  18. }
  19.  
  20.  
  21. void print_vec(int *vec){
  22.     for(size_t i = 0; i < VECTOR_SIZE; i++){
  23.         std::cout << vec[i] << endl;
  24.     }
  25.     std::cout << "---------" << std::endl;
  26. }
  27.  
  28.  
  29. int main(int argc, char **argv){
  30.     int rank, size;
  31.     int VEC_SIZE = VECTOR_SIZE;
  32.     auto *vec1 = new int[VECTOR_SIZE];
  33.     auto *vec2 = new int[VECTOR_SIZE];
  34.     auto *res = new int[VECTOR_SIZE];
  35.     fill_vector_values(vec1);
  36.     fill_vector_values(vec2);
  37.  
  38.  
  39.     MPI_Init(&argc, &argv);
  40.     MPI_Comm_size(MPI_COMM_WORLD, &size);
  41.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  42.     if(rank == 0){
  43.         for(size_t i = 0; i < VEC_SIZE; i++){
  44.             size_t num_process = (i % (size - 1)) + 1;
  45.             MPI_Send(&i, 1, MPI_INT, static_cast<int>(num_process), 0, MPI_COMM_WORLD);
  46.             int dot_result;
  47.             MPI_Status status;
  48.             MPI_Recv(&dot_result, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
  49.             std::cout << " <- " << dot_result << endl;
  50.             res[i] = dot_result;
  51.         }
  52.         print_vec(vec1);
  53.         print_vec(vec2);
  54.         print_vec(res);
  55.     }else{
  56.         int index;
  57.         MPI_Status status;
  58.         MPI_Recv(&index, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
  59.         int dot = vec1[index]*vec2[index];
  60.         MPI_Send(&dot, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
  61.         std::cout << rank << " -> " << index << endl;
  62.     };
  63.  
  64.  
  65.  
  66.     MPI_Finalize();
  67.     delete []vec1;
  68.     delete []vec2;
  69.     delete []res;
  70.     return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement