Advertisement
Guest User

Untitled

a guest
Apr 24th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.23 KB | None | 0 0
  1. #include <math.h>
  2. #include <mpi.h>
  3. #include <stdio.h>
  4.  
  5. #define N 3003
  6.  
  7.  
  8. void* allocate_memory(int rank)
  9. {
  10.     MPI_Win win;
  11.     MPI_Aint size;
  12.     void* baseptr;
  13.  
  14.     if (!rank)
  15.     {
  16.         size = N * N * sizeof(double);
  17.         MPI_Win_allocate_shared(size, sizeof(int), MPI_INFO_NULL,
  18.                                 MPI_COMM_WORLD, &baseptr, &win);
  19.     }
  20.     else
  21.     {
  22.         int disp_unit;
  23.         MPI_Win_allocate_shared(0, sizeof(int), MPI_INFO_NULL,
  24.                                 MPI_COMM_WORLD, &baseptr, &win);
  25.         MPI_Win_shared_query(win, 0, &size, &disp_unit, &baseptr);
  26.     }
  27.  
  28.     return baseptr;
  29. }
  30.  
  31. void read_input(int* n, double* arr)
  32. {
  33.     scanf("%d", n);
  34.     int i;
  35.     for (i = 0; i < *n; i++)
  36.     {
  37.         int j;
  38.         for (j = 0; j <= *n; j++)
  39.         {
  40.             scanf("%lf", &arr[i * (*n + 1) + j]);
  41.         }
  42.     }
  43. }
  44.  
  45.  
  46. void swap(int n, double* arr, int a, int b)
  47. {
  48.     int i;
  49.     for (i = 0; i <= n; i++)
  50.     {
  51.         double temp = arr[a * (n + 1) + i];
  52.         arr[a * (n + 1) + i] = arr[b * (n + 1) + i];
  53.         arr[b * (n + 1) + i] = temp;
  54.     }
  55. }
  56.  
  57.  
  58. void usual(int n, double* arr, int rank, int ncount, double* answer)
  59. {
  60.     int i;
  61.     for (i = 0; i < n; i++)
  62.     {
  63.         int best = -1;
  64.         int max_val = 0;
  65.         int j;
  66.         for (j = i; j < n; j++)
  67.         {
  68.             if (fabsl(arr[j * (n + 1) + i]) > max_val)
  69.             {
  70.                 max_val = fabsl(arr[j * (n + 1) + i]);
  71.                 best = j;
  72.             }
  73.         }
  74.  
  75.         swap(n, arr, i, best);
  76.  
  77.         for (j = i + 1; j < n; j++)
  78.         {
  79.             double coef = arr[j * (n + 1) + i] / arr[i * (n + 1) + i];
  80.             int k;
  81.             for (k = i; k <= n; k++)
  82.             {
  83.                 arr[j * (n + 1) + k] -= arr[i * (n + 1) + k] * coef;
  84.             }
  85.         }
  86.     }
  87.  
  88.     for (i = n - 1; i >= 0; i--)
  89.     {
  90.         answer[i] = arr[i * (n + 1) + n];
  91.         int j;
  92.         for (j = i + 1; j < n; j++)
  93.         {
  94.             answer[i] -= answer[j] * arr[i * (n + 1) + j];
  95.         }
  96.         answer[i] /= arr[i * (n + 1) + i];
  97.     }
  98. }
  99.  
  100.  
  101. void paral(int n, double* arr, int rank, int ncount, double* answer)
  102. {
  103.     int i;
  104.     for (i = 0; i < n; i++)
  105.     {
  106.         if (!rank)
  107.         {
  108.             int best = -1;
  109.             int max_val = 0;
  110.             int j;
  111.             for (j = i; j < n; j++)
  112.             {
  113.                 if (fabsl(arr[j * (n + 1) + i]) > max_val)
  114.                 {
  115.                     max_val = fabsl(arr[j * (n + 1) + i]);
  116.                     best = j;
  117.                 }
  118.             }
  119.  
  120.             swap(n, arr, i, best);
  121.         }
  122.         MPI_Barrier(MPI_COMM_WORLD);
  123.        
  124.         int j;
  125.         for (j = i + 1; j < n; j++)
  126.         {
  127.             if (rank == j % ncount)
  128.             {
  129.                 double coef = arr[j * (n + 1) + i] / arr[i * (n + 1) + i];
  130.                 int k;
  131.                 for (k = i; k <= n; k++)
  132.                 {
  133.                     arr[j * (n + 1) + k] -= arr[i * (n + 1) + k] * coef;
  134.                 }
  135.             }
  136.         }
  137.        
  138.         MPI_Barrier(MPI_COMM_WORLD);
  139.     }
  140.  
  141.     if (!rank)
  142.     {
  143.         for (i = n - 1; i >= 0; i--)
  144.         {
  145.             answer[i] = arr[i * (n + 1) + n];
  146.             int j;
  147.             for (j = i + 1; j < n; j++)
  148.             {
  149.                 answer[i] -= answer[j] * arr[i * (n + 1) + j];
  150.             }
  151.             answer[i] /= arr[i * (n + 1) + i];
  152.         }
  153.     }
  154. }
  155.  
  156.  
  157. int main()
  158. {
  159.     MPI_Init(NULL, NULL);
  160.  
  161.     int rank, ncount;
  162.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  163.     MPI_Comm_size(MPI_COMM_WORLD, &ncount);
  164.  
  165.     double* arr = allocate_memory(rank);
  166.  
  167.     int n;
  168.     if (!rank)
  169.     {
  170.         read_input(&n, arr);
  171.  
  172.         int i;
  173.         for (i = 1; i < ncount; i++)
  174.         {
  175.             MPI_Send(&n, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
  176.         }
  177.     }
  178.     else
  179.     {
  180.         MPI_Status st;
  181.         MPI_Recv(&n, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &st);
  182.     }
  183.    
  184.     double answer[N];
  185.     paral(n, arr, rank, ncount, answer);
  186.  
  187.     if (!rank)
  188.     {
  189.         int i;
  190.         for (i = 0; i < n; i++)
  191.         {
  192.             printf("x%d = %.2lf\n", i, answer[i]);
  193.         }
  194.     }
  195.  
  196.     MPI_Finalize();
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement