Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include "mpi.h"
- #include <random>
- using namespace std;
- #define VECTOR_SIZE 21
- inline int generateRandomInRange(int a, int b) {
- random_device rd;
- uniform_int_distribution gen(a, b);
- return gen(rd);
- }
- void fill_vector_values(int *vec){
- for(size_t i = 0; i < VECTOR_SIZE; i++){
- vec[i] = generateRandomInRange(1, 100);
- }
- }
- void print_vec(int *vec){
- for(size_t i = 0; i < VECTOR_SIZE; i++){
- std::cout << vec[i] << endl;
- }
- std::cout << "---------" << std::endl;
- }
- int main(int argc, char **argv){
- int rank, size;
- int VEC_SIZE = VECTOR_SIZE;
- auto *vec1 = new int[VECTOR_SIZE];
- auto *vec2 = new int[VECTOR_SIZE];
- auto *res = new int[VECTOR_SIZE];
- fill_vector_values(vec1);
- fill_vector_values(vec2);
- MPI_Init(&argc, &argv);
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- if(rank == 0){
- for(size_t i = 0; i < VEC_SIZE; i++){
- size_t num_process = (i % (size - 1)) + 1;
- MPI_Send(&i, 1, MPI_INT, static_cast<int>(num_process), 0, MPI_COMM_WORLD);
- int dot_result;
- MPI_Status status;
- MPI_Recv(&dot_result, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
- std::cout << " <- " << dot_result << endl;
- res[i] = dot_result;
- }
- print_vec(vec1);
- print_vec(vec2);
- print_vec(res);
- }else{
- int index;
- MPI_Status status;
- MPI_Recv(&index, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
- int dot = vec1[index]*vec2[index];
- MPI_Send(&dot, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
- std::cout << rank << " -> " << index << endl;
- };
- MPI_Finalize();
- delete []vec1;
- delete []vec2;
- delete []res;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement