#include <cmath>
#include <mpi.h>
class mpi {
public:
static void init(int argc, char** argv) {
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &m_rank);
MPI_Comm_size(MPI_COMM_WORLD, &m_size);
}
static void finalize() {
MPI_Finalize();
}
static int rank() noexcept { return m_rank; }
static int size() noexcept { return m_size; }
static double min(double value) {
double global_min = 0.0;
MPI_Allreduce(&value, &global_min, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
return global_min;
}
class master_stream {
public:
template<class T>
master_stream &operator<<(const T &x) {
if (m_rank == 0)
std::cout << x;
return *this;
}
};
static inline master_stream cout{};
static inline char endl = '\n';
private:
mpi() = default;
static inline int m_rank = 0;
static inline int m_size = 1;
};
int main(int argc, char** argv) {
mpi::init(argc, argv);
double kek = cos(mpi::rank() + 10.0);
mpi::cout << "Hello, I'm master process" << mpi::endl;
mpi::cout << "Min keks is " << mpi::min(kek) << mpi::endl;
mpi::finalize();
return 0;
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8bXBpLmg+CgpjbGFzcyBtcGkgewpwdWJsaWM6CiAgICBzdGF0aWMgdm9pZCBpbml0KGludCBhcmdjLCBjaGFyKiogYXJndikgewogICAgICAgIE1QSV9Jbml0KCZhcmdjLCAmYXJndik7CgogICAgICAgIE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZtX3JhbmspOwogICAgICAgIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZtX3NpemUpOwogICAgfQoKICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplKCkgewogICAgICAgIE1QSV9GaW5hbGl6ZSgpOwogICAgfQoKICAgIHN0YXRpYyBpbnQgcmFuaygpIG5vZXhjZXB0IHsgcmV0dXJuIG1fcmFuazsgfQogICAgc3RhdGljIGludCBzaXplKCkgbm9leGNlcHQgeyByZXR1cm4gbV9zaXplOyB9CgogICAgc3RhdGljIGRvdWJsZSBtaW4oZG91YmxlIHZhbHVlKSB7CiAgICAgICAgZG91YmxlIGdsb2JhbF9taW4gPSAwLjA7CiAgICAgICAgTVBJX0FsbHJlZHVjZSgmdmFsdWUsICZnbG9iYWxfbWluLCAxLCBNUElfRE9VQkxFLCBNUElfTUlOLCBNUElfQ09NTV9XT1JMRCk7CiAgICAgICAgcmV0dXJuIGdsb2JhbF9taW47CiAgICB9CgogICAgY2xhc3MgbWFzdGVyX3N0cmVhbSAgewogICAgcHVibGljOgogICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgICAgbWFzdGVyX3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBUICZ4KSB7CiAgICAgICAgICAgIGlmIChtX3JhbmsgPT0gMCkKICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCB4OwogICAgICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgICAgfQogICAgfTsKCiAgICBzdGF0aWMgaW5saW5lIG1hc3Rlcl9zdHJlYW0gY291dHt9OwogICAgc3RhdGljIGlubGluZSBjaGFyIGVuZGwgPSAnXG4nOwoKcHJpdmF0ZToKICAgIG1waSgpID0gZGVmYXVsdDsKICAgIHN0YXRpYyBpbmxpbmUgaW50IG1fcmFuayA9IDA7CiAgICBzdGF0aWMgaW5saW5lIGludCBtX3NpemUgPSAxOwp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICBtcGk6OmluaXQoYXJnYywgYXJndik7CgogICAgZG91YmxlIGtlayA9IGNvcyhtcGk6OnJhbmsoKSArIDEwLjApOwoKICAgIG1waTo6Y291dCA8PCAiSGVsbG8sIEknbSBtYXN0ZXIgcHJvY2VzcyIgPDwgbXBpOjplbmRsOwogICAgbXBpOjpjb3V0IDw8ICJNaW4ga2VrcyBpcyAiIDw8IG1waTo6bWluKGtlaykgPDwgbXBpOjplbmRsOwoKICAgIG1waTo6ZmluYWxpemUoKTsKICAgIHJldHVybiAwOwp9