#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) {
// Функция, которую мы интегрируем
}
double rectangle_integration(double a, double b, int n) {
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 = 1000000;
int rank, size=10;
long double min_start = 1000000, 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 = rectangle_integration(local_a, local_b, local_n);
//local_result = simpson(local_a, local_b, local_n, h);
local_result = trapezoidal(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+0YDRg9GOINC80Ysg0LjQvdGC0LXQs9GA0LjRgNGD0LXQvAogICAgcmV0dXJuIGNvcyg2KngpKnNpbig1KngpICsgNDsKfQoKZG91YmxlIHJlY3RhbmdsZV9pbnRlZ3JhdGlvbihkb3VibGUgYSwgZG91YmxlIGIsIGludCBuKSB7CiAgCmRvdWJsZSBzaW1wc29uKGRvdWJsZSBhLCBkb3VibGUgYiwgaW50IG4sIGRvdWJsZSBoKSB7CiAgICBkb3VibGUgc3VtID0gZihhKSArIGYoYik7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpICs9IDIpIHsKICAgICAgICBkb3VibGUgeCA9IGEgKyBpICogaDsKICAgICAgICBzdW0gKz0gNCAqIGYoeCk7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDI7IGkgPCBuIC0gMTsgaSArPSAyKSB7CiAgICAgICAgZG91YmxlIHggPSBhICsgaSAqIGg7CiAgICAgICAgc3VtICs9IDIgKiBmKHgpOwogICAgfQoKICAgIHJldHVybiBzdW0gKiBoIC8gMy4wOwp9CgoKICAKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CgogICAgY29uc3QgZG91YmxlIGEgPSAwLjA7CiAgICBjb25zdCBkb3VibGUgYiA9IDE7CiAgICBjb25zdCBpbnQgbiA9IDEwMDAwMDA7IAoKICAgIGludCByYW5rLCBzaXplPTEwOwogICAgbG9uZyBkb3VibGUgbWluX3N0YXJ0ID0gMTAwMDAwMCwgbWF4X2VuZCA9IDAsIHN0YXJ0LCBlbmQsIGxvY2FsX3Jlc3VsdCwgdG90YWxfcmVzdWx0OwoKICAgIE1QSV9Jbml0KCZhcmdjLCAmYXJndik7CiAgICBNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmcmFuayk7CiAgICBNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCAmc2l6ZSk7CiAgICBNUElfQmFycmllcihNUElfQ09NTV9XT1JMRCk7CiAgICAKICAgIHN0YXJ0ID0gTVBJX1d0aW1lKCk7CgogICAgY291dCA8PCAiUHJvY2VzcyAiIDw8IHJhbmsgPDwgIiBvZiAiIDw8IHNpemUgPDwgIiBpcyBydW5uaW5nLiIgPDwgZW5kbDsKCgogICAgLy8g0JLRi9GH0LjRgdC70Y/QtdC8INC70L7QutCw0LvRjNC90YvQuSDRgNC10LfRg9C70YzRgtCw0YIg0LTQu9GPINC60LDQttC00L7Qs9C+INC/0YDQvtGG0LXRgdGB0LAKICAgIGludCBsb2NhbF9uID0gbiAvIHNpemU7CiAgICBkb3VibGUgbG9jYWxfYSA9IGEgKyByYW5rICogKGIgLSBhKSAvIHNpemU7CiAgICBkb3VibGUgbG9jYWxfYiA9IGxvY2FsX2EgKyAoYiAtIGEpIC8gc2l6ZTsKICAgIGRvdWJsZSBoID0gKGIgLSBhKSAvIG47CiAgICAvL2xvY2FsX3Jlc3VsdCA9IHJlY3RhbmdsZV9pbnRlZ3JhdGlvbihsb2NhbF9hLCBsb2NhbF9iLCBsb2NhbF9uKTsKICAgIC8vbG9jYWxfcmVzdWx0ID0gc2ltcHNvbihsb2NhbF9hLCBsb2NhbF9iLCBsb2NhbF9uLCBoKTsKICAgIGxvY2FsX3Jlc3VsdCA9IHRyYXBlem9pZGFsKGxvY2FsX2EsIGxvY2FsX2IsIGxvY2FsX24sIGgpOwoKICAgIE1QSV9SZWR1Y2UoJmxvY2FsX3Jlc3VsdCwgJnRvdGFsX3Jlc3VsdCwgMSwgTVBJX0RPVUJMRSwgTVBJX1NVTSwgMCwgTVBJX0NPTU1fV09STEQpOwogICAgTVBJX0JhcnJpZXIoTVBJX0NPTU1fV09STEQpOwogICAgZW5kID0gTVBJX1d0aW1lKCk7CgoKICAgIGlmIChyYW5rID09IDApIHsKICAgICAgICBjb3V0IDw8ICJUb3RhbCByZXN1bHQ6ICIgPDwgdG90YWxfcmVzdWx0IDw8IGVuZGw7CiAgICB9CgogICAgaW50IG51bXByb2M7CgogICAgbnVtcHJvYyA9IHNpemU7CgoKCiAgICAvLyBGaW5kIG1heCB0aW1lCiAgICBpZiAobWluX3N0YXJ0ID4gc3RhcnQpIHsKICAgICAgICBtaW5fc3RhcnQgPSBzdGFydDsKICAgIH0KCiAgICBpZiAobWF4X2VuZCA8IGVuZCkgewogICAgICAgIG1heF9lbmQgPSBlbmQ7CiAgICB9CgogICAgaWYgKHJhbmsgPT0gMCkgewogICAgICAgIHByaW50ZigiVGltZSB0YWtlbiB0byBwcm9jZXNzOiAlZiIsIChtYXhfZW5kIC0gbWluX3N0YXJ0KSk7CiAgICB9CiAgICBpZiAocmFuayA9PSAwKSB7CiAgICAgICAgd3JpdGVEYXRhVG9GaWxlKCJkYXRhLnR4dCIsIG51bXByb2MsIChtYXhfZW5kIC0gbWluX3N0YXJ0KSk7CiAgICB9CiAgICBNUElfRmluYWxpemUoKTsKCiAgICAKCgogICAgcmV0dXJuIDA7Cn0K