Advertisement
Guest User

Untitled

a guest
May 28th, 2015
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. #include <mpi.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. int multiplyRowByVector(int *row, int *vector, int size, int rank) {
  8.   int sum = 0;
  9.   cout << "Rank: " << rank << " row: " << row[0] << row[1] << row[2] << endl;
  10.   cout << "Rank: " << rank << " vec: " << vector[0] << vector[1] << vector[2] << endl;
  11.   for (int i = 0; i < size; i++) {
  12.     sum = sum + row[i] * vector[i];
  13.   }
  14.   return sum;
  15. }
  16.  
  17. int receiveAndMultiply(int rank, int size) {
  18.   int *row = new int[size];
  19.   int *vector = new int[size];
  20.   int result = 0;
  21.  
  22.   MPI_Recv(row, size, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  23.   MPI_Recv(vector, size, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  24.   result = multiplyRowByVector(row, vector, size, rank);
  25.   MPI_Send(&result, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
  26. }
  27.  
  28. int** createMatrix(int size) {
  29.   int** matrix = new int*[size];
  30.   for (int i = 0; i < size; ++i) {
  31.     matrix[i] = new int[size];
  32.     for (int j = 0; j < size; j++) {
  33.       matrix[i][j] = rand() % 9 + 1;
  34.     }
  35.   }
  36.   return matrix;
  37. }
  38.  
  39. int* createVector(int size) {
  40.   int* vector = new int[size];
  41.   for (int i = 0; i < size; i++) {
  42.     vector[i] = rand() % 9 + 1;
  43.   }
  44.   return vector;
  45. }
  46.  
  47. void drawMatrix(int** matrix, int size) {
  48.   for (int i = 0; i < size; i++) {
  49.     for (int j = 0; j < size; j++) {
  50.       cout << matrix[i][j];
  51.     }
  52.   cout << endl;
  53.   }
  54. }
  55.  
  56. int main(int argc, char** argv) {
  57.   int rank = 0;
  58.   int size = 0;
  59.   int result_from_proc = 0;
  60.   int* results = new int[size];
  61.   MPI_Init(NULL, NULL);
  62.   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  63.   MPI_Comm_size(MPI_COMM_WORLD, &size);
  64.  
  65.   if (rank == 0) {
  66.     int** matrix = createMatrix(size);
  67.     int* vector = createVector(size);
  68.     drawMatrix(matrix, size);
  69.     results[0] =  multiplyRowByVector(matrix[0], vector, size, rank);
  70.     for (int i = 1; i < size; i++) {
  71.       MPI_Send(matrix[i], size, MPI_INT, i, 0, MPI_COMM_WORLD);
  72.       MPI_Send(vector, size, MPI_INT, i, 0, MPI_COMM_WORLD);
  73.       MPI_Recv(&result_from_proc, 1, MPI_INT, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  74.       results[i] = result_from_proc;
  75.     }
  76.   } else {
  77.     receiveAndMultiply(rank, size);
  78.   }
  79.  
  80.   if (rank == 0) {
  81.   cout << "Results: " << endl;
  82.     for (int i = 0; i < size; i++) {
  83.        cout << "Rank: " << i << " " << results[i] << endl;
  84.     }
  85.   }
  86.  
  87.   MPI_Finalize();
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement