#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define ARRAY_SIZE 100
#define MASTER_RANK 0
void compute_task(int *array, int size) {
// Example computation: doubling each element of the array
for (int i = 0; i < size; i++) {
array[i] *= 2;
}
}
int main(int argc, char *argv[]) {
int num_procs, rank;
int array[ARRAY_SIZE];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// If master process
if (rank == MASTER_RANK) {
// Initialize array with some values
for (int i = 0; i < ARRAY_SIZE; i++) {
array[i] = i;
}
// Distribute the array to other processes
MPI_Bcast(array, ARRAY_SIZE, MPI_INT, MASTER_RANK, MPI_COMM_WORLD);
} else {
// Receive the array from master process
MPI_Bcast(array, ARRAY_SIZE, MPI_INT, MASTER_RANK, MPI_COMM_WORLD);
}
// Divide the computation among processes
int chunk_size = ARRAY_SIZE / num_procs;
int start_index = rank * chunk_size;
int end_index = start_index + chunk_size;
// Perform computation on local portion of the array
compute_task(array + start_index, chunk_size);
// Gather results back to master process
MPI_Gather(array + start_index, chunk_size, MPI_INT, array, chunk_size, MPI_INT, MASTER_RANK, MPI_COMM_WORLD);
// Print results from master process
if (rank == MASTER_RANK) {
for (int i = 0; i < ARRAY_SIZE; i++) {
}
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1waS5oPgoKI2RlZmluZSBBUlJBWV9TSVpFIDEwMAojZGVmaW5lIE1BU1RFUl9SQU5LIDAKCnZvaWQgY29tcHV0ZV90YXNrKGludCAqYXJyYXksIGludCBzaXplKSB7CiAgICAvLyBFeGFtcGxlIGNvbXB1dGF0aW9uOiBkb3VibGluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgIGFycmF5W2ldICo9IDI7CiAgICB9Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgIGludCBudW1fcHJvY3MsIHJhbms7CiAgICBpbnQgYXJyYXlbQVJSQVlfU0laRV07CgogICAgTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsKICAgIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZudW1fcHJvY3MpOwogICAgTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJnJhbmspOwoKICAgIC8vIElmIG1hc3RlciBwcm9jZXNzCiAgICBpZiAocmFuayA9PSBNQVNURVJfUkFOSykgewogICAgICAgIC8vIEluaXRpYWxpemUgYXJyYXkgd2l0aCBzb21lIHZhbHVlcwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVJSQVlfU0laRTsgaSsrKSB7CiAgICAgICAgICAgIGFycmF5W2ldID0gaTsKICAgICAgICB9CgogICAgICAgIC8vIERpc3RyaWJ1dGUgdGhlIGFycmF5IHRvIG90aGVyIHByb2Nlc3NlcwogICAgICAgIE1QSV9CY2FzdChhcnJheSwgQVJSQVlfU0laRSwgTVBJX0lOVCwgTUFTVEVSX1JBTkssIE1QSV9DT01NX1dPUkxEKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gUmVjZWl2ZSB0aGUgYXJyYXkgZnJvbSBtYXN0ZXIgcHJvY2VzcwogICAgICAgIE1QSV9CY2FzdChhcnJheSwgQVJSQVlfU0laRSwgTVBJX0lOVCwgTUFTVEVSX1JBTkssIE1QSV9DT01NX1dPUkxEKTsKICAgIH0KCiAgICAvLyBEaXZpZGUgdGhlIGNvbXB1dGF0aW9uIGFtb25nIHByb2Nlc3NlcwogICAgaW50IGNodW5rX3NpemUgPSBBUlJBWV9TSVpFIC8gbnVtX3Byb2NzOwogICAgaW50IHN0YXJ0X2luZGV4ID0gcmFuayAqIGNodW5rX3NpemU7CiAgICBpbnQgZW5kX2luZGV4ID0gc3RhcnRfaW5kZXggKyBjaHVua19zaXplOwoKICAgIC8vIFBlcmZvcm0gY29tcHV0YXRpb24gb24gbG9jYWwgcG9ydGlvbiBvZiB0aGUgYXJyYXkKICAgIGNvbXB1dGVfdGFzayhhcnJheSArIHN0YXJ0X2luZGV4LCBjaHVua19zaXplKTsKCiAgICAvLyBHYXRoZXIgcmVzdWx0cyBiYWNrIHRvIG1hc3RlciBwcm9jZXNzCiAgICBNUElfR2F0aGVyKGFycmF5ICsgc3RhcnRfaW5kZXgsIGNodW5rX3NpemUsIE1QSV9JTlQsIGFycmF5LCBjaHVua19zaXplLCBNUElfSU5ULCBNQVNURVJfUkFOSywgTVBJX0NPTU1fV09STEQpOwoKICAgIC8vIFByaW50IHJlc3VsdHMgZnJvbSBtYXN0ZXIgcHJvY2VzcwogICAgaWYgKHJhbmsgPT0gTUFTVEVSX1JBTkspIHsKICAgICAgICBwcmludGYoIkNvbXB1dGVkIGFycmF5OlxuIik7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBUlJBWV9TSVpFOyBpKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCBhcnJheVtpXSk7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiXG4iKTsKICAgIH0KCiAgICBNUElfRmluYWxpemUoKTsKCiAgICByZXR1cm4gMDsKfQo=