Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <math.h>
- #include <mpi.h>
- #include <stdio.h>
- #define N 3003
- void* allocate_memory(int rank)
- {
- MPI_Win win;
- MPI_Aint size;
- void* baseptr;
- if (!rank)
- {
- size = N * N * sizeof(double);
- MPI_Win_allocate_shared(size, sizeof(int), MPI_INFO_NULL,
- MPI_COMM_WORLD, &baseptr, &win);
- }
- else
- {
- int disp_unit;
- MPI_Win_allocate_shared(0, sizeof(int), MPI_INFO_NULL,
- MPI_COMM_WORLD, &baseptr, &win);
- MPI_Win_shared_query(win, 0, &size, &disp_unit, &baseptr);
- }
- return baseptr;
- }
- void read_input(int* n, double* arr)
- {
- scanf("%d", n);
- int i;
- for (i = 0; i < *n; i++)
- {
- int j;
- for (j = 0; j <= *n; j++)
- {
- scanf("%lf", &arr[i * (*n + 1) + j]);
- }
- }
- }
- void swap(int n, double* arr, int a, int b)
- {
- int i;
- for (i = 0; i <= n; i++)
- {
- double temp = arr[a * (n + 1) + i];
- arr[a * (n + 1) + i] = arr[b * (n + 1) + i];
- arr[b * (n + 1) + i] = temp;
- }
- }
- void usual(int n, double* arr, int rank, int ncount, double* answer)
- {
- int i;
- for (i = 0; i < n; i++)
- {
- int best = -1;
- int max_val = 0;
- int j;
- for (j = i; j < n; j++)
- {
- if (fabsl(arr[j * (n + 1) + i]) > max_val)
- {
- max_val = fabsl(arr[j * (n + 1) + i]);
- best = j;
- }
- }
- swap(n, arr, i, best);
- for (j = i + 1; j < n; j++)
- {
- double coef = arr[j * (n + 1) + i] / arr[i * (n + 1) + i];
- int k;
- for (k = i; k <= n; k++)
- {
- arr[j * (n + 1) + k] -= arr[i * (n + 1) + k] * coef;
- }
- }
- }
- for (i = n - 1; i >= 0; i--)
- {
- answer[i] = arr[i * (n + 1) + n];
- int j;
- for (j = i + 1; j < n; j++)
- {
- answer[i] -= answer[j] * arr[i * (n + 1) + j];
- }
- answer[i] /= arr[i * (n + 1) + i];
- }
- }
- void paral(int n, double* arr, int rank, int ncount, double* answer)
- {
- int i;
- for (i = 0; i < n; i++)
- {
- if (!rank)
- {
- int best = -1;
- int max_val = 0;
- int j;
- for (j = i; j < n; j++)
- {
- if (fabsl(arr[j * (n + 1) + i]) > max_val)
- {
- max_val = fabsl(arr[j * (n + 1) + i]);
- best = j;
- }
- }
- swap(n, arr, i, best);
- }
- MPI_Barrier(MPI_COMM_WORLD);
- int j;
- for (j = i + 1; j < n; j++)
- {
- if (rank == j % ncount)
- {
- double coef = arr[j * (n + 1) + i] / arr[i * (n + 1) + i];
- int k;
- for (k = i; k <= n; k++)
- {
- arr[j * (n + 1) + k] -= arr[i * (n + 1) + k] * coef;
- }
- }
- }
- MPI_Barrier(MPI_COMM_WORLD);
- }
- if (!rank)
- {
- for (i = n - 1; i >= 0; i--)
- {
- answer[i] = arr[i * (n + 1) + n];
- int j;
- for (j = i + 1; j < n; j++)
- {
- answer[i] -= answer[j] * arr[i * (n + 1) + j];
- }
- answer[i] /= arr[i * (n + 1) + i];
- }
- }
- }
- int main()
- {
- MPI_Init(NULL, NULL);
- int rank, ncount;
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Comm_size(MPI_COMM_WORLD, &ncount);
- double* arr = allocate_memory(rank);
- int n;
- if (!rank)
- {
- read_input(&n, arr);
- int i;
- for (i = 1; i < ncount; i++)
- {
- MPI_Send(&n, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
- }
- }
- else
- {
- MPI_Status st;
- MPI_Recv(&n, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &st);
- }
- double answer[N];
- paral(n, arr, rank, ncount, answer);
- if (!rank)
- {
- int i;
- for (i = 0; i < n; i++)
- {
- printf("x%d = %.2lf\n", i, answer[i]);
- }
- }
- MPI_Finalize();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement