#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 master_stream cout;
static char endl;
private:
static int m_rank;
static int m_size;
};
int mpi::m_rank = 0;
int mpi::m_size = 1;
mpi::master_stream mpi::cout;
char mpi::endl = '\n';
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+CiAgICAgICAgbWFzdGVyX3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBUICZ4KSB7CiAgICAgICAgICAgIGlmIChtX3JhbmsgPT0gMCkKICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCB4OwogICAgICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgICAgfQogICAgfTsKCiAgICBzdGF0aWMgbWFzdGVyX3N0cmVhbSBjb3V0OwogICAgc3RhdGljIGNoYXIgZW5kbDsKCnByaXZhdGU6CiAgICBzdGF0aWMgaW50IG1fcmFuazsKICAgIHN0YXRpYyBpbnQgbV9zaXplOwp9OwoKaW50IG1waTo6bV9yYW5rID0gMDsKaW50IG1waTo6bV9zaXplID0gMTsKbXBpOjptYXN0ZXJfc3RyZWFtIG1waTo6Y291dDsKY2hhciBtcGk6OmVuZGwgPSAnXG4nOwoKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogICAgbXBpOjppbml0KGFyZ2MsIGFyZ3YpOwoKICAgIGRvdWJsZSBrZWsgPSBjb3MobXBpOjpyYW5rKCkgKyAxMC4wKTsKCiAgICBtcGk6OmNvdXQgPDwgIkhlbGxvLCBJJ20gbWFzdGVyIHByb2Nlc3MiIDw8IG1waTo6ZW5kbDsKICAgIG1waTo6Y291dCA8PCAiTWluIGtla3MgaXMgIiA8PCBtcGk6Om1pbihrZWspIDw8IG1waTo6ZW5kbDsKCiAgICBtcGk6OmZpbmFsaXplKCk7CiAgICByZXR1cm4gMDsKfQ==