#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 trapezoidal(double a, double b, int n, double h) {
double sum = 0.5 * (f(a) + f(b));
for (int i = 1; i < n; ++i) {
double x = a + i * h;
sum += f(x);
}
return sum * h;
}
int main(int argc, char** argv) {
const double a = 0.0;
const double b = 1;
const int n = 120000;
int rank, size;
long double min_start = 120000, 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+0YDRg9GOINC80Ysg0LjQvdGC0LXQs9GA0LjRgNGD0LXQvAogICAgcmV0dXJuIGNvcyg2KngpKnNpbig1KngpICsgNDsKfQoKCgpkb3VibGUgdHJhcGV6b2lkYWwoZG91YmxlIGEsIGRvdWJsZSBiLCBpbnQgbiwgZG91YmxlIGgpIHsKICAgIGRvdWJsZSBzdW0gPSAwLjUgKiAoZihhKSArIGYoYikpOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgKytpKSB7CiAgICAgICAgZG91YmxlIHggPSBhICsgaSAqIGg7CiAgICAgICAgc3VtICs9IGYoeCk7CiAgICB9CgogICAgcmV0dXJuIHN1bSAqIGg7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewoKICAgIGNvbnN0IGRvdWJsZSBhID0gMC4wOwogICAgY29uc3QgZG91YmxlIGIgPSAxOwogICAgY29uc3QgaW50IG4gPSAxMjAwMDA7IAoKICAgIGludCByYW5rLCBzaXplOwogICAgbG9uZyBkb3VibGUgbWluX3N0YXJ0ID0gMTIwMDAwLCBtYXhfZW5kID0gMCwgc3RhcnQsIGVuZCwgbG9jYWxfcmVzdWx0LCB0b3RhbF9yZXN1bHQ7CgogICAgTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsKICAgIE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZyYW5rKTsKICAgIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZzaXplKTsKICAgIE1QSV9CYXJyaWVyKE1QSV9DT01NX1dPUkxEKTsKICAgIAogICAgc3RhcnQgPSBNUElfV3RpbWUoKTsKCiAgICBjb3V0IDw8ICJQcm9jZXNzICIgPDwgcmFuayA8PCAiIG9mICIgPDwgc2l6ZSA8PCAiIGlzIHJ1bm5pbmcuIiA8PCBlbmRsOwoKCiAgICAvLyDQktGL0YfQuNGB0LvRj9C10Lwg0LvQvtC60LDQu9GM0L3Ri9C5INGA0LXQt9GD0LvRjNGC0LDRgiDQtNC70Y8g0LrQsNC20LTQvtCz0L4g0L/RgNC+0YbQtdGB0YHQsAogICAgaW50IGxvY2FsX24gPSBuIC8gc2l6ZTsKICAgIGRvdWJsZSBsb2NhbF9hID0gYSArIHJhbmsgKiAoYiAtIGEpIC8gc2l6ZTsKICAgIGRvdWJsZSBsb2NhbF9iID0gbG9jYWxfYSArIChiIC0gYSkgLyBzaXplOwogICAgZG91YmxlIGggPSAoYiAtIGEpIC8gbjsKICAgIC8vbG9jYWxfcmVzdWx0ID0gcmVjdGFuZ2xlX2ludGVncmF0aW9uKGxvY2FsX2EsIGxvY2FsX2IsIGxvY2FsX24pOwogICAgLy9sb2NhbF9yZXN1bHQgPSBzaW1wc29uKGxvY2FsX2EsIGxvY2FsX2IsIGxvY2FsX24sIGgpOwogICAgbG9jYWxfcmVzdWx0ID0gdHJhcGV6b2lkYWwobG9jYWxfYSwgbG9jYWxfYiwgbG9jYWxfbiwgaCk7CgogICAgTVBJX1JlZHVjZSgmbG9jYWxfcmVzdWx0LCAmdG90YWxfcmVzdWx0LCAxLCBNUElfRE9VQkxFLCBNUElfU1VNLCAwLCBNUElfQ09NTV9XT1JMRCk7CiAgICBNUElfQmFycmllcihNUElfQ09NTV9XT1JMRCk7CiAgICBlbmQgPSBNUElfV3RpbWUoKTsKCgogICAgaWYgKHJhbmsgPT0gMCkgewogICAgICAgIGNvdXQgPDwgIlRvdGFsIHJlc3VsdDogIiA8PCB0b3RhbF9yZXN1bHQgPDwgZW5kbDsKICAgIH0KCiAgICBpbnQgbnVtcHJvYzsKCiAgICBudW1wcm9jID0gc2l6ZTsKCgoKICAgIC8vIEZpbmQgbWF4IHRpbWUKICAgIGlmIChtaW5fc3RhcnQgPiBzdGFydCkgewogICAgICAgIG1pbl9zdGFydCA9IHN0YXJ0OwogICAgfQoKICAgIGlmIChtYXhfZW5kIDwgZW5kKSB7CiAgICAgICAgbWF4X2VuZCA9IGVuZDsKICAgIH0KCiAgICBpZiAocmFuayA9PSAwKSB7CiAgICAgICAgcHJpbnRmKCJUaW1lIHRha2VuIHRvIHByb2Nlc3M6ICVmIiwgKG1heF9lbmQgLSBtaW5fc3RhcnQpKTsKICAgIH0KICAgIGlmIChyYW5rID09IDApIHsKICAgICAgICB3cml0ZURhdGFUb0ZpbGUoImRhdGEudHh0IiwgbnVtcHJvYywgKG1heF9lbmQgLSBtaW5fc3RhcnQpKTsKICAgIH0KICAgIE1QSV9GaW5hbGl6ZSgpOwoKICAgIAoKCiAgICByZXR1cm4gMDsKfQ==