#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char **argv){
MPI_Init(NULL, NULL);
int num_procs;
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0){
int n;
printf("Enter number of elements : "); int arr[n];
for (int i = 0; i < n; i++){
arr
[i
] = rand() % 10000 + 1; }
for (int i = 0; i < n; i++){
}
int elem_to_send = n / 2;
if (n % 2)
elem_to_send++;
// send the size
MPI_Send(&elem_to_send, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
// send the array
MPI_Send(&arr[n / 2], elem_to_send, MPI_INT, 1, 1, MPI_COMM_WORLD);
int local = 0;
for (int i = 0; i < n / 2; i++)
local = local + arr[i];
int s_rec = 0;
printf("Time taken by process %d : %f\n", rank
, (t2
- t1
) / CLOCKS_PER_SEC
); MPI_Recv(&s_rec, 1, MPI_INT, 1, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
local = local + s_rec;
printf("Total sum of array is %d\n", local
); }else{
int size;
MPI_Recv(&size, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
int arr[size];
MPI_Recv(arr, size, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("Total time for recieving : %f", (t2
- t1
) / CLOCKS_PER_SEC
); int local = 0;
for (int i = 0; i < size; i++)
local = local + arr[i];
printf("\nProcess %d sending sum %d back to main...\n", rank
, local
); printf("Time taken by process for addition %d : %f\n", rank
, (t2
- t1
)/CLOCKS_PER_SEC
); MPI_Send(&local, 1, MPI_INT, 0, 2, MPI_COMM_WORLD);
}
MPI_Finalize();
}
I2luY2x1ZGUgPG1waS5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dGltZS5oPgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpewogIE1QSV9Jbml0KE5VTEwsIE5VTEwpOwogIGludCBudW1fcHJvY3M7CiAgTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJm51bV9wcm9jcyk7CiAgaW50IHJhbms7CiAgTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJnJhbmspOwogIGlmIChyYW5rID09IDApewogICAgaW50IG47CiAgICBwcmludGYoIkVudGVyIG51bWJlciBvZiBlbGVtZW50cyA6ICIpOwogICAgc2NhbmYoIiVkIiwgJm4pOwogICAgaW50IGFycltuXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgIGFycltpXSA9IHJhbmQoKSAlIDEwMDAwICsgMTsKICB9CnByaW50ZigiQXJyYXkgaXMgLVxuIFsgIik7CmZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKcHJpbnRmKCIlZCAiLCBhcnJbaV0pOwp9CnByaW50ZigiXVxuIik7CmludCBlbGVtX3RvX3NlbmQgPSBuIC8gMjsKaWYgKG4gJSAyKQplbGVtX3RvX3NlbmQrKzsKLy8gc2VuZCB0aGUgc2l6ZQpNUElfU2VuZCgmZWxlbV90b19zZW5kLCAxLCBNUElfSU5ULCAxLCAwLCBNUElfQ09NTV9XT1JMRCk7Ci8vIHNlbmQgdGhlIGFycmF5Ck1QSV9TZW5kKCZhcnJbbiAvIDJdLCBlbGVtX3RvX3NlbmQsIE1QSV9JTlQsIDEsIDEsIE1QSV9DT01NX1dPUkxEKTsKZmxvYXQgdDEgPSBjbG9jaygpOwppbnQgbG9jYWwgPSAwOwpmb3IgKGludCBpID0gMDsgaSA8IG4gLyAyOyBpKyspCmxvY2FsID0gbG9jYWwgKyBhcnJbaV07CmludCBzX3JlYyA9IDA7CmZsb2F0IHQyID0gY2xvY2soKTsKcHJpbnRmKCJUaW1lIHRha2VuIGJ5IHByb2Nlc3MgJWQgOiAlZlxuIiwgcmFuaywgKHQyIC0gdDEpIC8gQ0xPQ0tTX1BFUl9TRUMpOwpNUElfUmVjdigmc19yZWMsIDEsIE1QSV9JTlQsIDEsIDIsIE1QSV9DT01NX1dPUkxELCBNUElfU1RBVFVTX0lHTk9SRSk7CmxvY2FsID0gbG9jYWwgKyBzX3JlYzsKcHJpbnRmKCJUb3RhbCBzdW0gb2YgYXJyYXkgaXMgJWRcbiIsIGxvY2FsKTsKfWVsc2V7CmZsb2F0IHQxID0gY2xvY2soKTsKaW50IHNpemU7Ck1QSV9SZWN2KCZzaXplLCAxLCBNUElfSU5ULCAwLCAwLCBNUElfQ09NTV9XT1JMRCwgTVBJX1NUQVRVU19JR05PUkUpOwppbnQgYXJyW3NpemVdOwpNUElfUmVjdihhcnIsIHNpemUsIE1QSV9JTlQsIDAsIDEsIE1QSV9DT01NX1dPUkxELCBNUElfU1RBVFVTX0lHTk9SRSk7CmZsb2F0IHQyID0gY2xvY2soKTsKcHJpbnRmKCJUb3RhbCB0aW1lIGZvciByZWNpZXZpbmcgOiAlZiIsICh0MiAtIHQxKSAvIENMT0NLU19QRVJfU0VDKTsKdDEgPSBjbG9jaygpOwppbnQgbG9jYWwgPSAwOwpmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKbG9jYWwgPSBsb2NhbCArIGFycltpXTsKcHJpbnRmKCJcblByb2Nlc3MgJWQgc2VuZGluZyBzdW0gJWQgYmFjayB0byBtYWluLi4uXG4iLCByYW5rLCBsb2NhbCk7CnQyID0gY2xvY2soKTsKcHJpbnRmKCJUaW1lIHRha2VuIGJ5IHByb2Nlc3MgZm9yIGFkZGl0aW9uICVkIDogJWZcbiIsIHJhbmssICh0MiAtIHQxKS9DTE9DS1NfUEVSX1NFQyk7Ck1QSV9TZW5kKCZsb2NhbCwgMSwgTVBJX0lOVCwgMCwgMiwgTVBJX0NPTU1fV09STEQpOwp9Ck1QSV9GaW5hbGl6ZSgpOwp9