#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char *argv[]) {
int n; // розмірність вектора та матриці
int p; // кількість процесів
int rank; // номер поточного процесу
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &p);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0) {
// Ініціалізація матриці та вектора на процесі 0
n = 4; // Змініть на власне значення
int matrix[n][n];
int vector[n];
int result[n * p];
// Заповнення матриці та вектора даними (для прикладу використовуються випадкові значення)
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix
[i
][j
] = rand() % 10; }
}
// Розсилка матриці та вектора на інші процеси
for (int dest = 1; dest < p; dest++) {
MPI_Send(&n, 1, MPI_INT, dest, 0, MPI_COMM_WORLD);
MPI_Send(matrix, n * n, MPI_INT, dest, 0, MPI_COMM_WORLD);
MPI_Send(vector, n, MPI_INT, dest, 0, MPI_COMM_WORLD);
}
// Обчислення частини результату на процесі 0
for (int i = 0; i < n; i++) {
result[i] = 0;
for (int j = 0; j < n; j++) {
result[i] += matrix[i][j] * vector[j];
}
}
// Збір результатів з інших процесів
for (int source = 1; source < p; source++) {
MPI_Recv(result + source * n, n, MPI_INT, source, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
// Виведення результату
for (int i = 0; i < n * p; i++) {
}
} else {
// Отримання розмірності вектора та матриці
MPI_Recv(&n, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
// Ініціалізація та отримання матриці та вектора на інших процесах
int matrix[n][n];
int vector[n];
MPI_Recv(matrix, n * n, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(vector, n, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
// Обчислення частини результату на інших процесах
int result[n];
for (int i = 0; i < n; i++) {
result[i] = 0;
for (int j = 0; j < n; j++) {
result[i] += matrix[i][j] * vector[j];
}
}
// Відправка результату на процес 0
MPI_Send(result, n, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
MPI_Finalize
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1waS5oPgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgaW50IG47IC8vINGA0L7Qt9C80ZbRgNC90ZbRgdGC0Ywg0LLQtdC60YLQvtGA0LAg0YLQsCDQvNCw0YLRgNC40YbRlgogICAgaW50IHA7IC8vINC60ZbQu9GM0LrRltGB0YLRjCDQv9GA0L7RhtC10YHRltCyCiAgICBpbnQgcmFuazsgLy8g0L3QvtC80LXRgCDQv9C+0YLQvtGH0L3QvtCz0L4g0L/RgNC+0YbQtdGB0YMKCiAgICBNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwogICAgTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnApOwogICAgTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJnJhbmspOwoKICAgIGlmIChyYW5rID09IDApIHsKICAgICAgICAvLyDQhtC90ZbRhtGW0LDQu9GW0LfQsNGG0ZbRjyDQvNCw0YLRgNC40YbRliDRgtCwINCy0LXQutGC0L7RgNCwINC90LAg0L/RgNC+0YbQtdGB0ZYgMAogICAgICAgIG4gPSA0OyAvLyDQl9C80ZbQvdGW0YLRjCDQvdCwINCy0LvQsNGB0L3QtSDQt9C90LDRh9C10L3QvdGPCiAgICAgICAgaW50IG1hdHJpeFtuXVtuXTsKICAgICAgICBpbnQgdmVjdG9yW25dOwogICAgICAgIGludCByZXN1bHRbbiAqIHBdOwoKICAgICAgICAvLyDQl9Cw0L/QvtCy0L3QtdC90L3RjyDQvNCw0YLRgNC40YbRliDRgtCwINCy0LXQutGC0L7RgNCwINC00LDQvdC40LzQuCAo0LTQu9GPINC/0YDQuNC60LvQsNC00YMg0LLQuNC60L7RgNC40YHRgtC+0LLRg9GO0YLRjNGB0Y8g0LLQuNC/0LDQtNC60L7QstGWINC30L3QsNGH0LXQvdC90Y8pCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IHJhbmQoKSAlIDEwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZlY3RvcltpXSA9IHJhbmQoKSAlIDEwOwogICAgICAgIH0KCiAgICAgICAgLy8g0KDQvtC30YHQuNC70LrQsCDQvNCw0YLRgNC40YbRliDRgtCwINCy0LXQutGC0L7RgNCwINC90LAg0ZbQvdGI0ZYg0L/RgNC+0YbQtdGB0LgKICAgICAgICBmb3IgKGludCBkZXN0ID0gMTsgZGVzdCA8IHA7IGRlc3QrKykgewogICAgICAgICAgICBNUElfU2VuZCgmbiwgMSwgTVBJX0lOVCwgZGVzdCwgMCwgTVBJX0NPTU1fV09STEQpOwogICAgICAgICAgICBNUElfU2VuZChtYXRyaXgsIG4gKiBuLCBNUElfSU5ULCBkZXN0LCAwLCBNUElfQ09NTV9XT1JMRCk7CiAgICAgICAgICAgIE1QSV9TZW5kKHZlY3RvciwgbiwgTVBJX0lOVCwgZGVzdCwgMCwgTVBJX0NPTU1fV09STEQpOwogICAgICAgIH0KCiAgICAgICAgLy8g0J7QsdGH0LjRgdC70LXQvdC90Y8g0YfQsNGB0YLQuNC90Lgg0YDQtdC30YPQu9GM0YLQsNGC0YMg0L3QsCDQv9GA0L7RhtC10YHRliAwCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgcmVzdWx0W2ldID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgICAgIHJlc3VsdFtpXSArPSBtYXRyaXhbaV1bal0gKiB2ZWN0b3Jbal07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vINCX0LHRltGAINGA0LXQt9GD0LvRjNGC0LDRgtGW0LIg0Lcg0ZbQvdGI0LjRhSDQv9GA0L7RhtC10YHRltCyCiAgICAgICAgZm9yIChpbnQgc291cmNlID0gMTsgc291cmNlIDwgcDsgc291cmNlKyspIHsKICAgICAgICAgICAgTVBJX1JlY3YocmVzdWx0ICsgc291cmNlICogbiwgbiwgTVBJX0lOVCwgc291cmNlLCAwLCBNUElfQ09NTV9XT1JMRCwgTVBJX1NUQVRVU19JR05PUkUpOwogICAgICAgIH0KCiAgICAgICAgLy8g0JLQuNCy0LXQtNC10L3QvdGPINGA0LXQt9GD0LvRjNGC0LDRgtGDCiAgICAgICAgcHJpbnRmKCJSZXN1bHQ6XG4iKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG4gKiBwOyBpKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCByZXN1bHRbaV0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9IGVsc2UgewogICAgICAgIC8vINCe0YLRgNC40LzQsNC90L3RjyDRgNC+0LfQvNGW0YDQvdC+0YHRgtGWINCy0LXQutGC0L7RgNCwINGC0LAg0LzQsNGC0YDQuNGG0ZYKICAgICAgICBNUElfUmVjdigmbiwgMSwgTVBJX0lOVCwgMCwgMCwgTVBJX0NPTU1fV09STEQsIE1QSV9TVEFUVVNfSUdOT1JFKTsKCiAgICAgICAgLy8g0IbQvdGW0YbRltCw0LvRltC30LDRhtGW0Y8g0YLQsCDQvtGC0YDQuNC80LDQvdC90Y8g0LzQsNGC0YDQuNGG0ZYg0YLQsCDQstC10LrRgtC+0YDQsCDQvdCwINGW0L3RiNC40YUg0L/RgNC+0YbQtdGB0LDRhQogICAgICAgIGludCBtYXRyaXhbbl1bbl07CiAgICAgICAgaW50IHZlY3RvcltuXTsKICAgICAgICBNUElfUmVjdihtYXRyaXgsIG4gKiBuLCBNUElfSU5ULCAwLCAwLCBNUElfQ09NTV9XT1JMRCwgTVBJX1NUQVRVU19JR05PUkUpOwogICAgICAgIE1QSV9SZWN2KHZlY3RvciwgbiwgTVBJX0lOVCwgMCwgMCwgTVBJX0NPTU1fV09STEQsIE1QSV9TVEFUVVNfSUdOT1JFKTsKCiAgICAgICAgLy8g0J7QsdGH0LjRgdC70LXQvdC90Y8g0YfQsNGB0YLQuNC90Lgg0YDQtdC30YPQu9GM0YLQsNGC0YMg0L3QsCDRltC90YjQuNGFINC/0YDQvtGG0LXRgdCw0YUKICAgICAgICBpbnQgcmVzdWx0W25dOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIHJlc3VsdFtpXSA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgICAgICByZXN1bHRbaV0gKz0gbWF0cml4W2ldW2pdICogdmVjdG9yW2pdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyDQktGW0LTQv9GA0LDQstC60LAg0YDQtdC30YPQu9GM0YLQsNGC0YMg0L3QsCDQv9GA0L7RhtC10YEgMAogICAgICAgIE1QSV9TZW5kKHJlc3VsdCwgbiwgTVBJX0lOVCwgMCwgMCwgTVBJX0NPTU1fV09STEQpOwogICAgfQoKICAgIE1QSV9GaW5hbGl6ZQo=