#include <mpi.h>
#include <iostream>
int main(int argc, char** argv) {
MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int message;
MPI_Status status;
if (rank == 0) {
// Initialize message to be sent
message = rank;
// Send message to the next process in a ring
MPI_Send(&message, 1, MPI_INT, (rank + 1) % size, 0, MPI_COMM_WORLD);
// Receive message from the last process in a ring
MPI_Recv(&message, 1, MPI_INT, size - 1, 0, MPI_COMM_WORLD, &status);
// Output the received message
std::cout << "Process " << rank << " received message: " << message << std::endl;
} else {
// Receive message from the previous process in a ring
MPI_Recv(&message, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD, &status);
// Increment message
message = (message + 1) % size;
// Send message to the next process in a ring
MPI_Send(&message, 1, MPI_INT, (rank + 1) % size, 0, MPI_COMM_WORLD);
// Output the received message
std::cout << "Process " << rank << " received message: " << message << std::endl;
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPG1waS5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CgppbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKICAgIE1QSV9Jbml0KCZhcmdjLCAmYXJndik7CgogICAgaW50IHJhbmssIHNpemU7CiAgICBNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmcmFuayk7CiAgICBNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCAmc2l6ZSk7CgogICAgaW50IG1lc3NhZ2U7CiAgICBNUElfU3RhdHVzIHN0YXR1czsKCiAgICBpZiAocmFuayA9PSAwKSB7CiAgICAgICAgLy8gSW5pdGlhbGl6ZSBtZXNzYWdlIHRvIGJlIHNlbnQKICAgICAgICBtZXNzYWdlID0gcmFuazsKCiAgICAgICAgLy8gU2VuZCBtZXNzYWdlIHRvIHRoZSBuZXh0IHByb2Nlc3MgaW4gYSByaW5nCiAgICAgICAgTVBJX1NlbmQoJm1lc3NhZ2UsIDEsIE1QSV9JTlQsIChyYW5rICsgMSkgJSBzaXplLCAwLCBNUElfQ09NTV9XT1JMRCk7CgogICAgICAgIC8vIFJlY2VpdmUgbWVzc2FnZSBmcm9tIHRoZSBsYXN0IHByb2Nlc3MgaW4gYSByaW5nCiAgICAgICAgTVBJX1JlY3YoJm1lc3NhZ2UsIDEsIE1QSV9JTlQsIHNpemUgLSAxLCAwLCBNUElfQ09NTV9XT1JMRCwgJnN0YXR1cyk7CgogICAgICAgIC8vIE91dHB1dCB0aGUgcmVjZWl2ZWQgbWVzc2FnZQogICAgICAgIHN0ZDo6Y291dCA8PCAiUHJvY2VzcyAiIDw8IHJhbmsgPDwgIiByZWNlaXZlZCBtZXNzYWdlOiAiIDw8IG1lc3NhZ2UgPDwgc3RkOjplbmRsOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBSZWNlaXZlIG1lc3NhZ2UgZnJvbSB0aGUgcHJldmlvdXMgcHJvY2VzcyBpbiBhIHJpbmcKICAgICAgICBNUElfUmVjdigmbWVzc2FnZSwgMSwgTVBJX0lOVCwgcmFuayAtIDEsIDAsIE1QSV9DT01NX1dPUkxELCAmc3RhdHVzKTsKCiAgICAgICAgLy8gSW5jcmVtZW50IG1lc3NhZ2UKICAgICAgICBtZXNzYWdlID0gKG1lc3NhZ2UgKyAxKSAlIHNpemU7CgogICAgICAgIC8vIFNlbmQgbWVzc2FnZSB0byB0aGUgbmV4dCBwcm9jZXNzIGluIGEgcmluZwogICAgICAgIE1QSV9TZW5kKCZtZXNzYWdlLCAxLCBNUElfSU5ULCAocmFuayArIDEpICUgc2l6ZSwgMCwgTVBJX0NPTU1fV09STEQpOwoKICAgICAgICAvLyBPdXRwdXQgdGhlIHJlY2VpdmVkIG1lc3NhZ2UKICAgICAgICBzdGQ6OmNvdXQgPDwgIlByb2Nlc3MgIiA8PCByYW5rIDw8ICIgcmVjZWl2ZWQgbWVzc2FnZTogIiA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKICAgIH0KCiAgICBNUElfRmluYWxpemUoKTsKICAgIHJldHVybiAwOwp9Cg==