#include <stdio.h>
#include <stdlib.h>
#include <time.h> // For srand() and rand()
#include <mpi.h>
#define N 100 // Maximum size of the matrix
#define MAX_RANDOM 100 // Maximum random number
void fill_with_random(double A[N][N], double b[N], int n, int my_rank, int p, MPI_Comm comm) {
int i, j;
// Seed the random number generator with the current time
// Fill A with random numbers
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
A
[i
][j
] = rand() % MAX_RANDOM
+ 1; // Random number between 1 and MAX_RANDOM }
}
// Fill b with random numbers
for (i = 0; i < n; i++) {
b
[i
] = rand() % MAX_RANDOM
+ 1; // Random number between 1 and MAX_RANDOM }
}
void forward_elimination(double A[N][N], double b[N], int n, int k, int my_rank, int p, MPI_Comm comm) {
int i, j, l, pivot_row;
double pivot, tmp;
for (int col = 0; col < n; col++) {
// Find the pivot row for column col among the rows assigned to this processor
pivot = 0.0;
for (i = col % k; i < n; i += k) {
if (A[i][col] > pivot) {
pivot = A[i][col];
pivot_row = i;
}
}
// Broadcast the pivot row to all processors
MPI_Bcast(&pivot_row, 1, MPI_INT, col % k, comm);
// Swap rows
if (my_rank == col % k) {
if (pivot_row != col) {
for (j = 0; j < n; j++) {
tmp = A[col][j];
A[col][j] = A[pivot_row][j];
A[pivot_row][j] = tmp;
}
tmp = b[col];
b[col] = b[pivot_row];
b[pivot_row] = tmp;
}
}
// Eliminate elements below the pivot
for (i = (col % k == my_rank) ? (col + 1) : ((col + 1) % k); i < n; i += k) {
tmp = A[i][col] / A[col][col];
for (j = col; j < n; j++) {
A[i][j] -= tmp * A[col][j];
}
b[i] -= tmp * b[col];
}
}
}
void backward_substitution(double A[N][N], double b[N], double x[N], int n, int k, int my_rank, int p, MPI_Comm comm) {
int i, j;
double sum;
for (int col = n - 1; col >= 0; col--) {
sum = 0.0;
for (i = (col % k == my_rank) ? col : ((col + 1) % k); i < n; i += k) {
sum += A[col][i] * x[i];
}
MPI_Bcast(&sum, 1, MPI_DOUBLE, col % k, comm);
if (col % k == my_rank) {
x[col] = (b[col] - sum) / A[col][col];
}
}
}
int main(int argc, char **argv) {
int my_rank, p, n, k;
double A[N][N], b[N], x[N];
MPI_Comm comm;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
if (my_rank == 0) {
printf("Enter the size of the matrix (n): "); printf("Enter the value of k: ");
// Fill A and b with random numbers
fill_with_random(A, b, n, my_rank, p, MPI_COMM_WORLD);
}
// Broadcast n and k to all processors
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Bcast(&k, 1, MPI_INT, 0, MPI_COMM_WORLD);
// Scatter A and b among processors
MPI_Bcast(A, N * N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Bcast(b, N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// Perform forward elimination
forward_elimination(A, b, n, k, my_rank, p, MPI_COMM_WORLD);
// Perform backward substitution
backward_substitution(A, b, x, n, k, my_rank, p, MPI_COMM_WORLD);
// Gather the solution x to the root processor
MPI_Gather(x, n, MPI_DOUBLE, x, n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// Print the solution
if (my_rank == 0) {
for (int i = 0; i < n; i++) {
}
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4gLy8gRm9yIHNyYW5kKCkgYW5kIHJhbmQoKQojaW5jbHVkZSA8bXBpLmg+CgojZGVmaW5lIE4gMTAwIC8vIE1heGltdW0gc2l6ZSBvZiB0aGUgbWF0cml4CiNkZWZpbmUgTUFYX1JBTkRPTSAxMDAgLy8gTWF4aW11bSByYW5kb20gbnVtYmVyCgp2b2lkIGZpbGxfd2l0aF9yYW5kb20oZG91YmxlIEFbTl1bTl0sIGRvdWJsZSBiW05dLCBpbnQgbiwgaW50IG15X3JhbmssIGludCBwLCBNUElfQ29tbSBjb21tKSB7CiAgICBpbnQgaSwgajsKCiAgICAvLyBTZWVkIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB3aXRoIHRoZSBjdXJyZW50IHRpbWUKICAgIHNyYW5kKHRpbWUoTlVMTCkpOwoKICAgIC8vIEZpbGwgQSB3aXRoIHJhbmRvbSBudW1iZXJzCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICBBW2ldW2pdID0gcmFuZCgpICUgTUFYX1JBTkRPTSArIDE7IC8vIFJhbmRvbSBudW1iZXIgYmV0d2VlbiAxIGFuZCBNQVhfUkFORE9NCiAgICAgICAgfQogICAgfQoKICAgIC8vIEZpbGwgYiB3aXRoIHJhbmRvbSBudW1iZXJzCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgYltpXSA9IHJhbmQoKSAlIE1BWF9SQU5ET00gKyAxOyAvLyBSYW5kb20gbnVtYmVyIGJldHdlZW4gMSBhbmQgTUFYX1JBTkRPTQogICAgfQp9Cgp2b2lkIGZvcndhcmRfZWxpbWluYXRpb24oZG91YmxlIEFbTl1bTl0sIGRvdWJsZSBiW05dLCBpbnQgbiwgaW50IGssIGludCBteV9yYW5rLCBpbnQgcCwgTVBJX0NvbW0gY29tbSkgewogICAgaW50IGksIGosIGwsIHBpdm90X3JvdzsKICAgIGRvdWJsZSBwaXZvdCwgdG1wOwoKICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG47IGNvbCsrKSB7CiAgICAgICAgLy8gRmluZCB0aGUgcGl2b3Qgcm93IGZvciBjb2x1bW4gY29sIGFtb25nIHRoZSByb3dzIGFzc2lnbmVkIHRvIHRoaXMgcHJvY2Vzc29yCiAgICAgICAgcGl2b3QgPSAwLjA7CiAgICAgICAgZm9yIChpID0gY29sICUgazsgaSA8IG47IGkgKz0gaykgewogICAgICAgICAgICBpZiAoQVtpXVtjb2xdID4gcGl2b3QpIHsKICAgICAgICAgICAgICAgIHBpdm90ID0gQVtpXVtjb2xdOwogICAgICAgICAgICAgICAgcGl2b3Rfcm93ID0gaTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBCcm9hZGNhc3QgdGhlIHBpdm90IHJvdyB0byBhbGwgcHJvY2Vzc29ycwogICAgICAgIE1QSV9CY2FzdCgmcGl2b3Rfcm93LCAxLCBNUElfSU5ULCBjb2wgJSBrLCBjb21tKTsKICAgICAgICAvLyBTd2FwIHJvd3MKICAgICAgICBpZiAobXlfcmFuayA9PSBjb2wgJSBrKSB7CiAgICAgICAgICAgIGlmIChwaXZvdF9yb3cgIT0gY29sKSB7CiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgdG1wID0gQVtjb2xdW2pdOwogICAgICAgICAgICAgICAgICAgIEFbY29sXVtqXSA9IEFbcGl2b3Rfcm93XVtqXTsKICAgICAgICAgICAgICAgICAgICBBW3Bpdm90X3Jvd11bal0gPSB0bXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0bXAgPSBiW2NvbF07CiAgICAgICAgICAgICAgICBiW2NvbF0gPSBiW3Bpdm90X3Jvd107CiAgICAgICAgICAgICAgICBiW3Bpdm90X3Jvd10gPSB0bXA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gRWxpbWluYXRlIGVsZW1lbnRzIGJlbG93IHRoZSBwaXZvdAogICAgICAgIGZvciAoaSA9IChjb2wgJSBrID09IG15X3JhbmspID8gKGNvbCArIDEpIDogKChjb2wgKyAxKSAlIGspOyBpIDwgbjsgaSArPSBrKSB7CiAgICAgICAgICAgIHRtcCA9IEFbaV1bY29sXSAvIEFbY29sXVtjb2xdOwogICAgICAgICAgICBmb3IgKGogPSBjb2w7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgICAgIEFbaV1bal0gLT0gdG1wICogQVtjb2xdW2pdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJbaV0gLT0gdG1wICogYltjb2xdOwogICAgICAgIH0KICAgIH0KfQoKdm9pZCBiYWNrd2FyZF9zdWJzdGl0dXRpb24oZG91YmxlIEFbTl1bTl0sIGRvdWJsZSBiW05dLCBkb3VibGUgeFtOXSwgaW50IG4sIGludCBrLCBpbnQgbXlfcmFuaywgaW50IHAsIE1QSV9Db21tIGNvbW0pIHsKICAgIGludCBpLCBqOwogICAgZG91YmxlIHN1bTsKCiAgICBmb3IgKGludCBjb2wgPSBuIC0gMTsgY29sID49IDA7IGNvbC0tKSB7CiAgICAgICAgc3VtID0gMC4wOwogICAgICAgIGZvciAoaSA9IChjb2wgJSBrID09IG15X3JhbmspID8gY29sIDogKChjb2wgKyAxKSAlIGspOyBpIDwgbjsgaSArPSBrKSB7CiAgICAgICAgICAgIHN1bSArPSBBW2NvbF1baV0gKiB4W2ldOwogICAgICAgIH0KICAgICAgICBNUElfQmNhc3QoJnN1bSwgMSwgTVBJX0RPVUJMRSwgY29sICUgaywgY29tbSk7CiAgICAgICAgaWYgKGNvbCAlIGsgPT0gbXlfcmFuaykgewogICAgICAgICAgICB4W2NvbF0gPSAoYltjb2xdIC0gc3VtKSAvIEFbY29sXVtjb2xdOwogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICBpbnQgbXlfcmFuaywgcCwgbiwgazsKICAgIGRvdWJsZSBBW05dW05dLCBiW05dLCB4W05dOwogICAgTVBJX0NvbW0gY29tbTsKCiAgICBNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwogICAgTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJm15X3JhbmspOwogICAgTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnApOwoKICAgIGlmIChteV9yYW5rID09IDApIHsKICAgICAgICBwcmludGYoIkVudGVyIHRoZSBzaXplIG9mIHRoZSBtYXRyaXggKG4pOiAiKTsKICAgICAgICBzY2FuZigiJWQiLCAmbik7CiAgICAgICAgcHJpbnRmKCJFbnRlciB0aGUgdmFsdWUgb2YgazogIik7CiAgICAgICAgc2NhbmYoIiVkIiwgJmspOwoKICAgICAgICAvLyBGaWxsIEEgYW5kIGIgd2l0aCByYW5kb20gbnVtYmVycwogICAgICAgIGZpbGxfd2l0aF9yYW5kb20oQSwgYiwgbiwgbXlfcmFuaywgcCwgTVBJX0NPTU1fV09STEQpOwogICAgfQoKICAgIC8vIEJyb2FkY2FzdCBuIGFuZCBrIHRvIGFsbCBwcm9jZXNzb3JzCiAgICBNUElfQmNhc3QoJm4sIDEsIE1QSV9JTlQsIDAsIE1QSV9DT01NX1dPUkxEKTsKICAgIE1QSV9CY2FzdCgmaywgMSwgTVBJX0lOVCwgMCwgTVBJX0NPTU1fV09STEQpOwoKICAgIC8vIFNjYXR0ZXIgQSBhbmQgYiBhbW9uZyBwcm9jZXNzb3JzCiAgICBNUElfQmNhc3QoQSwgTiAqIE4sIE1QSV9ET1VCTEUsIDAsIE1QSV9DT01NX1dPUkxEKTsKICAgIE1QSV9CY2FzdChiLCBOLCBNUElfRE9VQkxFLCAwLCBNUElfQ09NTV9XT1JMRCk7CgogICAgLy8gUGVyZm9ybSBmb3J3YXJkIGVsaW1pbmF0aW9uCiAgICBmb3J3YXJkX2VsaW1pbmF0aW9uKEEsIGIsIG4sIGssIG15X3JhbmssIHAsIE1QSV9DT01NX1dPUkxEKTsKCiAgICAvLyBQZXJmb3JtIGJhY2t3YXJkIHN1YnN0aXR1dGlvbgogICAgYmFja3dhcmRfc3Vic3RpdHV0aW9uKEEsIGIsIHgsIG4sIGssIG15X3JhbmssIHAsIE1QSV9DT01NX1dPUkxEKTsKCiAgICAvLyBHYXRoZXIgdGhlIHNvbHV0aW9uIHggdG8gdGhlIHJvb3QgcHJvY2Vzc29yCiAgICBNUElfR2F0aGVyKHgsIG4sIE1QSV9ET1VCTEUsIHgsIG4sIE1QSV9ET1VCTEUsIDAsIE1QSV9DT01NX1dPUkxEKTsKCiAgICAvLyBQcmludCB0aGUgc29sdXRpb24KICAgIGlmIChteV9yYW5rID09IDApIHsKICAgICAgICBwcmludGYoIlNvbHV0aW9uOlxuIik7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlbGYgIiwgeFtpXSk7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiXG4iKTsKICAgIH0KCiAgICBNUElfRmluYWxpemUoKTsKICAgIHJldHVybiAwOwp9Cg==