#include <iostream>
#include <cmath>
#include <mpi.h>
#include <fstream>
#include <vector>
#include <cstdlib> // for system function
using namespace std;
void writeDataToFile(const string& filename, int x, long double y) {
ofstream file(filename, ios::app);
if (file.is_open()) {
printf("size and time: %f",y
); file << x << " " << y<<" \n" << endl;
file.close();
}
else {
cerr << "Unable to open file for writing." <<endl;
}
}
double f(double x) {
// Функция, которую мы интегрируем
return cos(2*x
+3)*sin(3*x
) + 3; }
double simpson(double a, double b, int n, double h) {
double sum = f(a) + f(b);
for (int i = 1; i < n; i += 2) {
double x = a + i * h;
sum += 4 * f(x);
}
for (int i = 2; i < n - 1; i += 2) {
double x = a + i * h;
sum += 2 * f(x);
}
return sum * h / 3.0;
}
int main(int argc, char** argv) {
const double a = 0.0;
const double b = 1;
const int n = 240000;
int rank, size=4;
long double min_start = 4800000, max_end = 0, start, end, local_result, total_result;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Barrier(MPI_COMM_WORLD);
start = MPI_Wtime();
cout << "Process " << rank << " of " << size << " is running." << endl;
// Вычисляем локальный результат для каждого процесса
int local_n = n / size;
double local_a = a + rank * (b - a) / size;
double local_b = local_a + (b - a) / size;
double h = (b - a) / n;
local_result = simpson(local_a, local_b, local_n, h);
MPI_Reduce(&local_result, &total_result, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
end = MPI_Wtime();
if (rank == 0) {
cout << "Total result: " << total_result << endl;
}
int numproc;
numproc = size;
// Find max time
if (min_start > start) {
min_start = start;
}
if (max_end < end) {
max_end = end;
}
if (rank == 0) {
printf("Time taken to process: %f", (max_end
- min_start
)); }
if (rank == 0) {
writeDataToFile("data.txt", numproc, (max_end - min_start));
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxtcGkuaD4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxjc3RkbGliPiAvLyBmb3Igc3lzdGVtIGZ1bmN0aW9uCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCB3cml0ZURhdGFUb0ZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgaW50IHgsIGxvbmcgZG91YmxlIHkpIHsKICAgIG9mc3RyZWFtIGZpbGUoZmlsZW5hbWUsIGlvczo6YXBwKTsKICAgIGlmIChmaWxlLmlzX29wZW4oKSkgewogICAgICAgIHByaW50Zigic2l6ZSBhbmQgdGltZTogJWYiLHkpOwogICAgICAgIGZpbGUgPDwgeCA8PCAiICIgPDwgeTw8IiBcbiIgPDwgZW5kbDsKICAgICAgICBmaWxlLmNsb3NlKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjZXJyIDw8ICJVbmFibGUgdG8gb3BlbiBmaWxlIGZvciB3cml0aW5nLiIgPDxlbmRsOwogICAgfQp9Cgpkb3VibGUgZihkb3VibGUgeCkgewogICAgLy8g0KTRg9C90LrRhtC40Y8sINC60L7RgtC+0YDRg9GOINC80Ysg0LjQvdGC0LXQs9GA0LjRgNGD0LXQvAogICAgcmV0dXJuIGNvcygyKngrMykqc2luKDMqeCkgKyAzOwp9Cgpkb3VibGUgc2ltcHNvbihkb3VibGUgYSwgZG91YmxlIGIsIGludCBuLCBkb3VibGUgaCkgewogICAgZG91YmxlIHN1bSA9IGYoYSkgKyBmKGIpOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSArPSAyKSB7CiAgICAgICAgZG91YmxlIHggPSBhICsgaSAqIGg7CiAgICAgICAgc3VtICs9IDQgKiBmKHgpOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAyOyBpIDwgbiAtIDE7IGkgKz0gMikgewogICAgICAgIGRvdWJsZSB4ID0gYSArIGkgKiBoOwogICAgICAgIHN1bSArPSAyICogZih4KTsKICAgIH0KCiAgICByZXR1cm4gc3VtICogaCAvIDMuMDsKfQoKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewoKICAgIGNvbnN0IGRvdWJsZSBhID0gMC4wOwogICAgY29uc3QgZG91YmxlIGIgPSAxOwogICAgY29uc3QgaW50IG4gPSAyNDAwMDA7IAoKICAgIGludCByYW5rLCBzaXplPTQ7CiAgICBsb25nIGRvdWJsZSBtaW5fc3RhcnQgPSA0ODAwMDAwLCBtYXhfZW5kID0gMCwgc3RhcnQsIGVuZCwgbG9jYWxfcmVzdWx0LCB0b3RhbF9yZXN1bHQ7CgogICAgTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsKICAgIE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZyYW5rKTsKICAgIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZzaXplKTsKICAgIE1QSV9CYXJyaWVyKE1QSV9DT01NX1dPUkxEKTsKICAgIAogICAgc3RhcnQgPSBNUElfV3RpbWUoKTsKCiAgICBjb3V0IDw8ICJQcm9jZXNzICIgPDwgcmFuayA8PCAiIG9mICIgPDwgc2l6ZSA8PCAiIGlzIHJ1bm5pbmcuIiA8PCBlbmRsOwoKCiAgICAvLyDQktGL0YfQuNGB0LvRj9C10Lwg0LvQvtC60LDQu9GM0L3Ri9C5INGA0LXQt9GD0LvRjNGC0LDRgiDQtNC70Y8g0LrQsNC20LTQvtCz0L4g0L/RgNC+0YbQtdGB0YHQsAogICAgaW50IGxvY2FsX24gPSBuIC8gc2l6ZTsKICAgIGRvdWJsZSBsb2NhbF9hID0gYSArIHJhbmsgKiAoYiAtIGEpIC8gc2l6ZTsKICAgIGRvdWJsZSBsb2NhbF9iID0gbG9jYWxfYSArIChiIC0gYSkgLyBzaXplOwogICAgZG91YmxlIGggPSAoYiAtIGEpIC8gbjsKICAgIAogICAgbG9jYWxfcmVzdWx0ID0gc2ltcHNvbihsb2NhbF9hLCBsb2NhbF9iLCBsb2NhbF9uLCBoKTsKICAgIAoKICAgIE1QSV9SZWR1Y2UoJmxvY2FsX3Jlc3VsdCwgJnRvdGFsX3Jlc3VsdCwgMSwgTVBJX0RPVUJMRSwgTVBJX1NVTSwgMCwgTVBJX0NPTU1fV09STEQpOwogICAgTVBJX0JhcnJpZXIoTVBJX0NPTU1fV09STEQpOwogICAgZW5kID0gTVBJX1d0aW1lKCk7CgoKICAgIGlmIChyYW5rID09IDApIHsKICAgICAgICBjb3V0IDw8ICJUb3RhbCByZXN1bHQ6ICIgPDwgdG90YWxfcmVzdWx0IDw8IGVuZGw7CiAgICB9CgogICAgaW50IG51bXByb2M7CgogICAgbnVtcHJvYyA9IHNpemU7CgoKCiAgICAvLyBGaW5kIG1heCB0aW1lCiAgICBpZiAobWluX3N0YXJ0ID4gc3RhcnQpIHsKICAgICAgICBtaW5fc3RhcnQgPSBzdGFydDsKICAgIH0KCiAgICBpZiAobWF4X2VuZCA8IGVuZCkgewogICAgICAgIG1heF9lbmQgPSBlbmQ7CiAgICB9CgogICAgaWYgKHJhbmsgPT0gMCkgewogICAgICAgIHByaW50ZigiVGltZSB0YWtlbiB0byBwcm9jZXNzOiAlZiIsIChtYXhfZW5kIC0gbWluX3N0YXJ0KSk7CiAgICB9CiAgICBpZiAocmFuayA9PSAwKSB7CiAgICAgICAgd3JpdGVEYXRhVG9GaWxlKCJkYXRhLnR4dCIsIG51bXByb2MsIChtYXhfZW5kIC0gbWluX3N0YXJ0KSk7CiAgICB9CiAgICBNUElfRmluYWxpemUoKTsKCiAgICAKCgogICAgcmV0dXJuIDA7Cn0KCg==