#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 */
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtcGkuaD4KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIGNvbnN0IGludCB0YWcgPSA0MjsgLyogTWVzc2FnZSB0YWcgKi8KICAgIGludCBpZCwgbnRhc2tzLCBzb3VyY2VfaWQsIGRlc3RfaWQsIGVyciwgaTsKICAgIE1QSV9TdGF0dXMgc3RhdHVzOwogICAgaW50IG1zZ1syXTsgLyogTWVzc2FnZSBhcnJheSAqLwoKICAgIGVyciA9IE1QSV9Jbml0KCZhcmdjLCAmYXJndik7IC8qIEluaXRpYWxpemUgTVBJICovCiAgICBpZiAoZXJyICE9IE1QSV9TVUNDRVNTKSB7CiAgICAgICAgcHJpbnRmKCJNUEkgaW5pdGlhbGl6YXRpb24gZmFpbGVkIVxuIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGVyciA9IE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZudGFza3MpOyAvKiBHZXQgbnIgb2YgdGFza3MgKi8KICAgIGVyciA9IE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZpZCk7IC8qIEdldCBpZCBvZiB0aGlzIHByb2Nlc3MgKi8KICAgIGlmIChudGFza3MgPCAyKSB7CiAgICAgICAgcHJpbnRmKCJZb3UgaGF2ZSB0byB1c2UgYXQgbGVhc3QgMiBwcm9jZXNzb3JzIHRvIHJ1biB0aGlzIHByb2dyYW1cbiIpOwogICAgICAgIE1QSV9GaW5hbGl6ZSgpOyAvKiBRdWl0IGlmIHRoZXJlIGlzIG9ubHkgb25lIHByb2Nlc3NvciAqLwogICAgICAgIGV4aXQoMCk7CiAgICB9CiAgICBpZiAoaWQgPT0gMCkgeyAvKiBQcm9jZXNzIDAgKHRoZSByZWNlaXZlcikgZG9lcyB0aGlzICovCiAgICAgICAgZm9yIChpPTE7IGk8bnRhc2tzOyBpKyspIHsKICAgICAgICAgICAgZXJyID0gTVBJX1JlY3YobXNnLCAyLCBNUElfSU5ULCBNUElfQU5ZX1NPVVJDRSwgdGFnLCBNUElfQ09NTV9XT1JMRCwgXAogICAgICAgICAgICAgICAgJnN0YXR1cyk7IC8qIFJlY2VpdmUgYSBtZXNzYWdlICovCiAgICAgICAgICAgIHNvdXJjZV9pZCA9IHN0YXR1cy5NUElfU09VUkNFOyAvKiBHZXQgaWQgb2Ygc2VuZGVyICovCiAgICAgICAgICAgIHByaW50ZigiUmVjZWl2ZWQgbWVzc2FnZSAlZCAlZCBmcm9tIHByb2Nlc3MgJWRcbiIsIG1zZ1swXSwgbXNnWzFdLCBcCiAgICAgICAgICAgICAgICBzb3VyY2VfaWQpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgeyAvKiBQcm9jZXNzZXMgMSB0byBOLTEgKHRoZSBzZW5kZXJzKSBkbyB0aGlzICovCiAgICAgICAgbXNnWzBdID0gaWQ7IC8qIFB1dCBvd24gaWRlbnRpZmllciBpbiB0aGUgbWVzc2FnZSAqLwogICAgICAgIG1zZ1sxXSA9IG50YXNrczsgLyogYW5kIHRvdGFsIG51bWJlciBvZiBwcm9jZXNzZXMgKi8KICAgICAgICBkZXN0X2lkID0gMDsgLyogRGVzdGluYXRpb24gYWRkcmVzcyAqLwogICAgICAgIGVyciA9IE1QSV9TZW5kKG1zZywgMiwgTVBJX0lOVCwgZGVzdF9pZCwgdGFnLCBNUElfQ09NTV9XT1JMRCk7CiAgICB9CgogICAgZXJyID0gTVBJX0ZpbmFsaXplKCk7IC8qIFRlcm1pbmF0ZSBNUEkgKi8KICAgIGlmIChpZD09MCkgcHJpbnRmKCJSZWFkeVxuIik7CiAgICBleGl0KDApOwogICAgcmV0dXJuIDA7Cn0K