#include <mpi.h> // must have a system with an MPI library
#include <stdio.h> //printf
#include <stdlib.h> //malloc
#define MASTER 0 //One process will take care of initialization
#define ARRAY_SIZE 8 //Size of arrays that will be added together.
/*
* In MPI programs, the main function for the program is run on every
* process that gets initialized when you start up this code using mpirun.
*/
int main (int argc, char *argv[])
{
// elements of arrays a and b will be added
// and placed in array c
int * a;
int * b;
int * c;
int total_proc; // total nuber of processes
int rank; // rank of each process
int n_per_proc; // elements per process
int n = ARRAY_SIZE; // number of array elements
int i; // loop index
MPI_Status status; // not used in this arguably poor example
// that is devoid of error checking.
// 1. Initialization of MPI environment
MPI_Init (&argc, &argv);
MPI_Comm_size (MPI_COMM_WORLD, &total_proc);
// 2. Now you know the total number of processes running in parallel
MPI_Comm_rank (MPI_COMM_WORLD,&rank);
// 3. Now you know the rank of the current process
// Smaller arrays that will be held on each separate process
int * ap;
int * bp;
int * cp;
// 4. We choose process rank 0 to be the root, or master,
// which will be used to initialize the full arrays.
if (rank == MASTER) {
a
= (int *) malloc(sizeof(int)*n
); b
= (int *) malloc(sizeof(int)*n
); c
= (int *) malloc(sizeof(int)*n
);
// initialize arrays a and b with consecutive integer values
// as a simple example
for(i=0;i<n;i++)
{ a[i] = i;
printf ("a[%d]=%d\t ",i
, a
[i
]);} for(i=0;i<n;i++)
{ b[i] = i;
printf ("b[%d]=%d\t ",i
, b
[i
]);} }
n_per_proc = n/total_proc;
ap
= (int *) malloc(sizeof(int)*n_per_proc
); bp
= (int *) malloc(sizeof(int)*n_per_proc
); cp
= (int *) malloc(sizeof(int)*n_per_proc
); // 6.
//scattering array a from MASTER node out to the other nodes
MPI_Scatter(a, n_per_proc, MPI_INT, ap, n_per_proc, MPI_INT, MASTER, MPI_COMM_WORLD);
//scattering array b from MASTER node out to the other node
MPI_Scatter(b, n_per_proc, MPI_INT, bp, n_per_proc, MPI_INT, MASTER, MPI_COMM_WORLD);
// 7. Compute the addition of elements in my subsection of the array
for(i=0;i<n_per_proc;i++)
cp[i] = ap[i]+bp[i];
// 8. MASTER node gathering array c from the workers
MPI_Gather(cp, n_per_proc, MPI_INT, c, n_per_proc, MPI_INT, MASTER, MPI_COMM_WORLD);
/////////////////////// all concurrent processes are finished once they all communicate
/////////////////////// data back to the master via the gather function.
// Master process gets to here only when it has been able to gather from all processes
if (rank == MASTER) {
// sanity check the result (a test we would eventually leave out)
int good = 1;
for(i=0;i<n;i++) {
printf ("c[%d]=%d\t ",i
, c
[i
]); if (c[i] != a[i] + b[i]) {
printf("problem at index %lld\n", i
); good = 0;
break;
}
}
if (good) {
}
}
// clean up memory
if (rank == MASTER) {
}
// 9. Terminate MPI Environment and Processes
MPI_Finalize();
return 0;
}# your code goes here
I2luY2x1ZGUgPG1waS5oPiAgICAgIC8vIG11c3QgaGF2ZSBhIHN5c3RlbSB3aXRoIGFuIE1QSSBsaWJyYXJ5CiNpbmNsdWRlIDxzdGRpby5oPiAgICAvL3ByaW50ZgojaW5jbHVkZSA8c3RkbGliLmg+ICAgLy9tYWxsb2MKI2RlZmluZSBNQVNURVIgMCAgICAgICAgIC8vT25lIHByb2Nlc3Mgd2lsbCB0YWtlIGNhcmUgb2YgaW5pdGlhbGl6YXRpb24KI2RlZmluZSBBUlJBWV9TSVpFIDggICAgIC8vU2l6ZSBvZiBhcnJheXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvZ2V0aGVyLgovKgogKiAgSW4gTVBJIHByb2dyYW1zLCB0aGUgbWFpbiBmdW5jdGlvbiBmb3IgdGhlIHByb2dyYW0gaXMgcnVuIG9uIGV2ZXJ5CiAqICBwcm9jZXNzIHRoYXQgZ2V0cyBpbml0aWFsaXplZCB3aGVuIHlvdSBzdGFydCB1cCB0aGlzIGNvZGUgdXNpbmcgbXBpcnVuLgogKi8KaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgICAgICAvLyBlbGVtZW50cyBvZiBhcnJheXMgYSBhbmQgYiB3aWxsIGJlIGFkZGVkCiAgICAgICAgLy8gYW5kIHBsYWNlZCBpbiBhcnJheSBjCiAgICAgICAgaW50ICogYTsKICAgICAgICBpbnQgKiBiOwogICAgICAgIGludCAqIGM7CiAgICAgICAgaW50IHRvdGFsX3Byb2M7ICAvLyB0b3RhbCBudWJlciBvZiBwcm9jZXNzZXMKICAgICAgICBpbnQgcmFuazsgICAgICAgIC8vIHJhbmsgb2YgZWFjaCBwcm9jZXNzCiAgICAgICAgaW50IG5fcGVyX3Byb2M7IC8vIGVsZW1lbnRzIHBlciBwcm9jZXNzCiAgICAgICAgaW50IG4gPSBBUlJBWV9TSVpFOyAgIC8vIG51bWJlciBvZiBhcnJheSBlbGVtZW50cwogICAgICAgIGludCBpOyAgICAgICAvLyBsb29wIGluZGV4CiAgICAgICAgTVBJX1N0YXR1cyBzdGF0dXM7ICAgLy8gbm90IHVzZWQgaW4gdGhpcyBhcmd1YWJseSBwb29yIGV4YW1wbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGlzIGRldm9pZCBvZiBlcnJvciBjaGVja2luZy4KICAgICAgICAvLyAxLiBJbml0aWFsaXphdGlvbiBvZiBNUEkgZW52aXJvbm1lbnQKICAgICAgICBNUElfSW5pdCAoJmFyZ2MsICZhcmd2KTsKICAgICAgICBNUElfQ29tbV9zaXplIChNUElfQ09NTV9XT1JMRCwgJnRvdGFsX3Byb2MpOwogICAgICAgIC8vIDIuIE5vdyB5b3Uga25vdyB0aGUgdG90YWwgbnVtYmVyIG9mIHByb2Nlc3NlcyBydW5uaW5nIGluIHBhcmFsbGVsCiAgICAgICAgTVBJX0NvbW1fcmFuayAoTVBJX0NPTU1fV09STEQsJnJhbmspOwogICAgICAgIC8vIDMuIE5vdyB5b3Uga25vdyB0aGUgcmFuayBvZiB0aGUgY3VycmVudCBwcm9jZXNzCiAgICAgICAgLy8gU21hbGxlciBhcnJheXMgdGhhdCB3aWxsIGJlIGhlbGQgb24gZWFjaCBzZXBhcmF0ZSBwcm9jZXNzCiAgICAgICAgaW50ICogYXA7CiAgICAgICAgaW50ICogYnA7CiAgICAgICAgaW50ICogY3A7CiAgICAgICAgLy8gNC4gV2UgY2hvb3NlIHByb2Nlc3MgcmFuayAwIHRvIGJlIHRoZSByb290LCBvciBtYXN0ZXIsCiAgICAgICAgLy8gd2hpY2ggd2lsbCBiZSB1c2VkIHRvICBpbml0aWFsaXplIHRoZSBmdWxsIGFycmF5cy4KICAgICAgICBpZiAocmFuayA9PSBNQVNURVIpICB7CiAgICAgICAgICAgICAgICBhID0gKGludCAqKSBtYWxsb2Moc2l6ZW9mKGludCkqbik7CiAgICAgICAgICAgICAgICBiID0gKGludCAqKSBtYWxsb2Moc2l6ZW9mKGludCkqbik7CiAgICAgICAgICAgICAgICBjID0gKGludCAqKSBtYWxsb2Moc2l6ZW9mKGludCkqbik7CgogICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBhcnJheXMgYSBhbmQgYiB3aXRoIGNvbnNlY3V0aXZlIGludGVnZXIgdmFsdWVzCiAgICAgICAgICAgICAgICAvLyBhcyBhIHNpbXBsZSBleGFtcGxlCiAgICAgICAgICAgICAgICBmb3IoaT0wO2k8bjtpKyspCiAgICAgICAgICAgICAgICB7ICAgICAgIGFbaV0gPSBpOwogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYgKCJhWyVkXT0lZFx0ICIsaSwgYVtpXSk7fQogICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgICAgICAgICAgZm9yKGk9MDtpPG47aSsrKQogICAgICAgICAgICAgICAgeyAgICAgICBiW2ldID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiYlslZF09JWRcdCAiLGksIGJbaV0pO30KICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICAgIAogICAgICAgIG5fcGVyX3Byb2MgPSBuL3RvdGFsX3Byb2M7CiAgIAogICAgICAgIGFwID0gKGludCAqKSBtYWxsb2Moc2l6ZW9mKGludCkqbl9wZXJfcHJvYyk7CiAgICAgICAgYnAgPSAoaW50ICopIG1hbGxvYyhzaXplb2YoaW50KSpuX3Blcl9wcm9jKTsKICAgICAgICBjcCA9IChpbnQgKikgbWFsbG9jKHNpemVvZihpbnQpKm5fcGVyX3Byb2MpOwogICAgICAgIC8vIDYuCiAgICAgICAgLy9zY2F0dGVyaW5nIGFycmF5IGEgZnJvbSBNQVNURVIgbm9kZSBvdXQgdG8gdGhlIG90aGVyIG5vZGVzCiAgICAgICAgTVBJX1NjYXR0ZXIoYSwgbl9wZXJfcHJvYywgTVBJX0lOVCwgYXAsIG5fcGVyX3Byb2MsIE1QSV9JTlQsIE1BU1RFUiwgTVBJX0NPTU1fV09STEQpOwogICAgICAgIC8vc2NhdHRlcmluZyBhcnJheSBiIGZyb20gTUFTVEVSIG5vZGUgb3V0IHRvIHRoZSBvdGhlciBub2RlCiAgICAgICAgTVBJX1NjYXR0ZXIoYiwgbl9wZXJfcHJvYywgTVBJX0lOVCwgYnAsIG5fcGVyX3Byb2MsIE1QSV9JTlQsIE1BU1RFUiwgTVBJX0NPTU1fV09STEQpOwogICAgICAgIC8vIDcuIENvbXB1dGUgdGhlIGFkZGl0aW9uIG9mIGVsZW1lbnRzIGluIG15IHN1YnNlY3Rpb24gb2YgdGhlIGFycmF5CiAgICAgICAgZm9yKGk9MDtpPG5fcGVyX3Byb2M7aSsrKQogICAgICAgICAgICAgICAgY3BbaV0gPSBhcFtpXSticFtpXTsKICAgICAgICAvLyA4LiBNQVNURVIgbm9kZSBnYXRoZXJpbmcgYXJyYXkgYyBmcm9tIHRoZSB3b3JrZXJzCiAgICAgICAgTVBJX0dhdGhlcihjcCwgbl9wZXJfcHJvYywgTVBJX0lOVCwgYywgbl9wZXJfcHJvYywgTVBJX0lOVCwgTUFTVEVSLCBNUElfQ09NTV9XT1JMRCk7Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGFsbCBjb25jdXJyZW50IHByb2Nlc3NlcyBhcmUgZmluaXNoZWQgb25jZSB0aGV5IGFsbCBjb21tdW5pY2F0ZQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBkYXRhIGJhY2sgdG8gdGhlIG1hc3RlciB2aWEgdGhlIGdhdGhlciBmdW5jdGlvbi4KICAgICAgICAvLyBNYXN0ZXIgcHJvY2VzcyBnZXRzIHRvIGhlcmUgb25seSB3aGVuIGl0IGhhcyBiZWVuIGFibGUgdG8gZ2F0aGVyIGZyb20gYWxsIHByb2Nlc3NlcwogICAgICAgIGlmIChyYW5rID09IE1BU1RFUikgIHsKICAgICAgICAgICAgICAgIC8vIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0ICAoYSB0ZXN0IHdlIHdvdWxkIGV2ZW50dWFsbHkgbGVhdmUgb3V0KQogICAgICAgICAgICAgICAgaW50IGdvb2QgPSAxOwogICAgICAgICAgICAgICAgZm9yKGk9MDtpPG47aSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoImNbJWRdPSVkXHQgIixpLCBjW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNbaV0gIT0gYVtpXSArIGJbaV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInByb2JsZW0gYXQgaW5kZXggJWxsZFxuIiwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChnb29kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIlZhbHVlcyBjb3JyZWN0IVxuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIGNsZWFuIHVwIG1lbW9yeQogICAgICAgIGlmIChyYW5rID09IE1BU1RFUikgIHsKICAgICAgICAgICAgICAgIGZyZWUoYSk7ICBmcmVlKGIpOyBmcmVlKGMpOwogICAgICAgIH0KICAgICAgICBmcmVlKGFwKTsgIGZyZWUoYnApOyBmcmVlKGNwKTsKCiAgICAgICAgLy8gOS4gVGVybWluYXRlIE1QSSBFbnZpcm9ubWVudCBhbmQgUHJvY2Vzc2VzCiAgICAgICAgTVBJX0ZpbmFsaXplKCk7CgogICAgICAgIHJldHVybiAwOwp9IyB5b3VyIGNvZGUgZ29lcyBoZXJl