#include <stdio.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
const int tag = 42; /* Message tag */
int id, ntasks, source_id, dest_id, err, i;
MPI_Status status;
int msg[2]; /* Message array */
err = MPI_Init(&argc, &argv); /* Initialize MPI */
if (err != MPI_SUCCESS)
{
printf("MPI initialization failed!\n"); }
err = MPI_Comm_size(MPI_COMM_WORLD, &ntasks); /* Get nr of tasks */
err = MPI_Comm_rank(MPI_COMM_WORLD, &id); /* Get id of this process */
if (ntasks < 2)
{
printf("You have to use at least 2 processors to run this program\n"); MPI_Finalize(); /* Quit if there is only one processor */
}
if (id == 0)
{ /* Process 0 (the receiver) does this */
for (i = 1; i < ntasks; i++)
{
err = MPI_Recv(msg, 2, MPI_INT, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD,
&status); /* Receive a message */
source_id = status.MPI_SOURCE; /* Get id of sender */
printf("Received message %d %d from process %d\n", msg
[0], msg
[1], source_id);
}
}
else
{ /* Processes 1 to N-1 (the senders) do this */
msg[0] = id; /* Put own identifier in the message */
msg[1] = ntasks; /* and total number of processes */
dest_id = 0; /* Destination address */
err = MPI_Send(msg, 2, MPI_INT, dest_id, tag, MPI_COMM_WORLD);
}
err = MPI_Finalize(); /* Terminate MPI */
if (id == 0)
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtcGkuaD4KaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgY29uc3QgaW50IHRhZyA9IDQyOyAvKiBNZXNzYWdlIHRhZyAqLwogICAgaW50IGlkLCBudGFza3MsIHNvdXJjZV9pZCwgZGVzdF9pZCwgZXJyLCBpOwogICAgTVBJX1N0YXR1cyBzdGF0dXM7CiAgICBpbnQgbXNnWzJdOyAvKiBNZXNzYWdlIGFycmF5ICovCgogICAgZXJyID0gTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsgLyogSW5pdGlhbGl6ZSBNUEkgKi8KICAgIGlmIChlcnIgIT0gTVBJX1NVQ0NFU1MpCiAgICB7CiAgICAgICAgcHJpbnRmKCJNUEkgaW5pdGlhbGl6YXRpb24gZmFpbGVkIVxuIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGVyciA9IE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZudGFza3MpOyAvKiBHZXQgbnIgb2YgdGFza3MgKi8KICAgIGVyciA9IE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZpZCk7ICAgICAvKiBHZXQgaWQgb2YgdGhpcyBwcm9jZXNzICovCiAgICBpZiAobnRhc2tzIDwgMikKICAgIHsKICAgICAgICBwcmludGYoIllvdSBoYXZlIHRvIHVzZSBhdCBsZWFzdCAyIHByb2Nlc3NvcnMgdG8gcnVuIHRoaXMgcHJvZ3JhbVxuIik7CiAgICAgICAgTVBJX0ZpbmFsaXplKCk7IC8qIFF1aXQgaWYgdGhlcmUgaXMgb25seSBvbmUgcHJvY2Vzc29yICovCiAgICAgICAgZXhpdCgwKTsKICAgIH0KICAgIGlmIChpZCA9PSAwKQogICAgeyAvKiBQcm9jZXNzIDAgKHRoZSByZWNlaXZlcikgZG9lcyB0aGlzICovCiAgICAgICAgZm9yIChpID0gMTsgaSA8IG50YXNrczsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgZXJyID0gTVBJX1JlY3YobXNnLCAyLCBNUElfSU5ULCBNUElfQU5ZX1NPVVJDRSwgdGFnLCBNUElfQ09NTV9XT1JMRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7ICAgICAgIC8qIFJlY2VpdmUgYSBtZXNzYWdlICovCiAgICAgICAgICAgIHNvdXJjZV9pZCA9IHN0YXR1cy5NUElfU09VUkNFOyAvKiBHZXQgaWQgb2Ygc2VuZGVyICovCiAgICAgICAgICAgIHByaW50ZigiUmVjZWl2ZWQgbWVzc2FnZSAlZCAlZCBmcm9tIHByb2Nlc3MgJWRcbiIsIG1zZ1swXSwgbXNnWzFdLAogICAgICAgICAgICAgICAgICAgc291cmNlX2lkKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7ICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzZXMgMSB0byBOLTEgKHRoZSBzZW5kZXJzKSBkbyB0aGlzICovCiAgICAgICAgbXNnWzBdID0gaWQ7ICAgICAvKiBQdXQgb3duIGlkZW50aWZpZXIgaW4gdGhlIG1lc3NhZ2UgKi8KICAgICAgICBtc2dbMV0gPSBudGFza3M7IC8qIGFuZCB0b3RhbCBudW1iZXIgb2YgcHJvY2Vzc2VzICovCiAgICAgICAgZGVzdF9pZCA9IDA7ICAgICAvKiBEZXN0aW5hdGlvbiBhZGRyZXNzICovCiAgICAgICAgZXJyID0gTVBJX1NlbmQobXNnLCAyLCBNUElfSU5ULCBkZXN0X2lkLCB0YWcsIE1QSV9DT01NX1dPUkxEKTsKICAgIH0KCiAgICBlcnIgPSBNUElfRmluYWxpemUoKTsgLyogVGVybWluYXRlIE1QSSAqLwogICAgaWYgKGlkID09IDApCiAgICAgICAgcHJpbnRmKCJSZWFkeVxuIik7CiAgICBleGl0KDApOwogICAgcmV0dXJuIDA7Cn0=