Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 KB | None | 0 0
  1. #include <mpi.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. const double eps = 0.001;
  9.  
  10. int main(int argc, char** argv) {
  11.     srand(time(0));
  12.     int size;
  13.     MPI_Init(&argc,  &argv);
  14.     int world_size;
  15.     MPI_Comm_size(MPI_COMM_WORLD, &world_size);
  16.     int world_rank;
  17.     MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
  18.     if(world_rank == 0) {
  19.         cout<< "Size: ";
  20.         cin >> size;
  21.     }
  22.     MPI_Bcast(&size, 1, MPI_INT, 0, MPI_COMM_WORLD);
  23.     double *A = new double[size*size];
  24.     double *F = new double[size];
  25.     double *X = new double[size]{};
  26.     if(world_rank == 0) {
  27.         for (int i = 0; i < size; i++) {
  28.             for (int j = 0; j < size; j++) {
  29.                 A[i*size + j] = rand()%5 + 1;
  30.             }
  31.             for (int j = 1; j < size; j++) {
  32.                 A[i*size + i] += A[i*size + j];
  33.             }
  34.             for (int j = 0; j < size; j++) {
  35.                 cout << A[i*size + j] << " ";
  36.             }
  37.             cout << endl;
  38.             F[i] = rand()%100 + 1;
  39.         }
  40.         cout << endl;
  41.         cout << "F:";
  42.         for(int i = 0; i < size; i++) {
  43.             cout << F[i] << " ";
  44.         }
  45.         cout << endl;
  46.     }
  47.     int localSize = (size * size)/world_size;
  48.     int localRows = localSize/size;
  49.     double *localF = new double[localRows];
  50.     double *localA = new double[localSize];
  51.     double *localX = new double[localRows];
  52.     MPI_Scatter(A, localSize, MPI_DOUBLE, localA, localSize, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  53.     MPI_Scatter(F, localRows, MPI_DOUBLE, localF, localRows, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  54.     MPI_Scatter(X, localRows, MPI_DOUBLE, localX, localRows, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  55.     MPI_Bcast(X, size, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  56.     double *TempX = new double[localRows];
  57.     double norm;
  58.     double *allNorms = new double[world_size];
  59.     int count = 0;
  60.     do {
  61.         count++;
  62.         for (int i = 0; i < localRows; i++) {
  63.             TempX[i] = localF[i];
  64.             for (int j = 0; j < size; j++) {
  65.                 if (world_rank * localRows + i != j) {
  66.                     TempX[i] -= localA[i * size + j] * X[j];
  67.                 }
  68.             }
  69.             TempX[i] /= localA[i * size + world_rank * localRows + i];
  70.         }
  71.         norm = fabs(localX[0] - TempX[0]);
  72.         for (int i = 0; i < localRows; i++) {
  73.             if (fabs(localX[i] - TempX[i]) > norm) {
  74.                 norm = fabs(localX[i] - TempX[i]);
  75.             }
  76.             localX[i] = TempX[i];
  77.         }
  78.         MPI_Gather(localX, localRows, MPI_DOUBLE, X, localRows, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  79.         MPI_Bcast(X, size, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  80.         MPI_Gather(&norm, 1, MPI_DOUBLE, allNorms, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  81.         if(world_rank == 0) {
  82.             for (int i = 0; i < world_size; i++) {
  83.                 if(allNorms[i] > norm) {
  84.                     norm = allNorms[i];
  85.                 }
  86.             }
  87.         }
  88.         MPI_Bcast(&norm, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  89.     } while (norm > eps);
  90.     if(world_rank == 0) {
  91.         cout << "iter: " << count << endl;
  92.         for (int i = 0; i < size; i++) {
  93.             cout << "X[" << i << "] = " << X[i] << endl;
  94.         }
  95.     }
  96.     MPI_Finalize();
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement