library(Rmpi)
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <limits.h>
#define ARRAY_SIZE 8000000
#define RANGE 1000000000
int main(int argc, char *argv[]) {
int rank, size, i;
int *array = NULL;
int local_min = INT_MAX;
int overall_min;
int segment_size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (size != 8) {
if (rank == 0) {
fprintf(stderr
, "This program is designed to run with 8 processes.\n"); }
MPI_Finalize();
return 1;
}
segment_size = ARRAY_SIZE / size;
if (rank == 0) {
array
= (int *)malloc(sizeof(int) * ARRAY_SIZE
); for (i = 0; i < ARRAY_SIZE; i++) {
array
[i
] = rand() % (RANGE
+ 1); }
}
int *sub_array
= (int *)malloc(sizeof(int) * segment_size
);
MPI_Bcast(array, ARRAY_SIZE, MPI_INT, 0, MPI_COMM_WORLD);
// Calculate the local minimum
for (i = 0; i < segment_size; i++) {
int idx = rank * segment_size + i;
if (array[idx] < local_min) {
local_min = array[idx];
}
}
// Gather all local minima at root
MPI_Gather(&local_min, 1, MPI_INT, sub_array, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (rank == 0) {
overall_min = INT_MAX;
for (i = 0; i < size; i++) {
if (sub_array[i] < overall_min) {
overall_min = sub_array[i];
}
}
// Validate the result by finding the minimum sequentially
int true_min = INT_MAX;
for (i = 0; i < ARRAY_SIZE; i++) {
if (array[i] < true_min) {
true_min = array[i];
}
}
printf("Overall minimum found by MPI: %d\n", overall_min
); printf("True minimum found by sequential search: %d\n", true_min
); }
if (array != NULL) {
}
MPI_Finalize();
return 0;
}
bGlicmFyeShSbXBpKQojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bXBpLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KCiNkZWZpbmUgQVJSQVlfU0laRSA4MDAwMDAwCiNkZWZpbmUgUkFOR0UgMTAwMDAwMDAwMAoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgaW50IHJhbmssIHNpemUsIGk7CiAgICBpbnQgKmFycmF5ID0gTlVMTDsKICAgIGludCBsb2NhbF9taW4gPSBJTlRfTUFYOwogICAgaW50IG92ZXJhbGxfbWluOwogICAgaW50IHNlZ21lbnRfc2l6ZTsKCiAgICBNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwogICAgTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJnJhbmspOwogICAgTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnNpemUpOwoKICAgIGlmIChzaXplICE9IDgpIHsKICAgICAgICBpZiAocmFuayA9PSAwKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhpcyBwcm9ncmFtIGlzIGRlc2lnbmVkIHRvIHJ1biB3aXRoIDggcHJvY2Vzc2VzLlxuIik7CiAgICAgICAgfQogICAgICAgIE1QSV9GaW5hbGl6ZSgpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHNlZ21lbnRfc2l6ZSA9IEFSUkFZX1NJWkUgLyBzaXplOwogICAgCiAgICBpZiAocmFuayA9PSAwKSB7CiAgICAgICAgYXJyYXkgPSAoaW50ICopbWFsbG9jKHNpemVvZihpbnQpICogQVJSQVlfU0laRSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkU7IGkrKykgewogICAgICAgICAgICBhcnJheVtpXSA9IHJhbmQoKSAlIChSQU5HRSArIDEpOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgKnN1Yl9hcnJheSA9IChpbnQgKiltYWxsb2Moc2l6ZW9mKGludCkgKiBzZWdtZW50X3NpemUpOwoKICAgIE1QSV9CY2FzdChhcnJheSwgQVJSQVlfU0laRSwgTVBJX0lOVCwgMCwgTVBJX0NPTU1fV09STEQpOwoKICAgIC8vIENhbGN1bGF0ZSB0aGUgbG9jYWwgbWluaW11bQogICAgZm9yIChpID0gMDsgaSA8IHNlZ21lbnRfc2l6ZTsgaSsrKSB7CiAgICAgICAgaW50IGlkeCA9IHJhbmsgKiBzZWdtZW50X3NpemUgKyBpOwogICAgICAgIGlmIChhcnJheVtpZHhdIDwgbG9jYWxfbWluKSB7CiAgICAgICAgICAgIGxvY2FsX21pbiA9IGFycmF5W2lkeF07CiAgICAgICAgfQogICAgfQoKICAgIC8vIEdhdGhlciBhbGwgbG9jYWwgbWluaW1hIGF0IHJvb3QKICAgIE1QSV9HYXRoZXIoJmxvY2FsX21pbiwgMSwgTVBJX0lOVCwgc3ViX2FycmF5LCAxLCBNUElfSU5ULCAwLCBNUElfQ09NTV9XT1JMRCk7CgogICAgaWYgKHJhbmsgPT0gMCkgewogICAgICAgIG92ZXJhbGxfbWluID0gSU5UX01BWDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChzdWJfYXJyYXlbaV0gPCBvdmVyYWxsX21pbikgewogICAgICAgICAgICAgICAgb3ZlcmFsbF9taW4gPSBzdWJfYXJyYXlbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXN1bHQgYnkgZmluZGluZyB0aGUgbWluaW11bSBzZXF1ZW50aWFsbHkKICAgICAgICBpbnQgdHJ1ZV9taW4gPSBJTlRfTUFYOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFOyBpKyspIHsKICAgICAgICAgICAgaWYgKGFycmF5W2ldIDwgdHJ1ZV9taW4pIHsKICAgICAgICAgICAgICAgIHRydWVfbWluID0gYXJyYXlbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByaW50ZigiT3ZlcmFsbCBtaW5pbXVtIGZvdW5kIGJ5IE1QSTogJWRcbiIsIG92ZXJhbGxfbWluKTsKICAgICAgICBwcmludGYoIlRydWUgbWluaW11bSBmb3VuZCBieSBzZXF1ZW50aWFsIHNlYXJjaDogJWRcbiIsIHRydWVfbWluKTsKICAgIH0KCiAgICBpZiAoYXJyYXkgIT0gTlVMTCkgewogICAgICAgIGZyZWUoYXJyYXkpOwogICAgfQogICAgZnJlZShzdWJfYXJyYXkpOwoKICAgIE1QSV9GaW5hbGl6ZSgpOwogICAgcmV0dXJuIDA7Cn0K