#include <mpi.h>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;
int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int m = 100;
srand(time(NULL
) + world_rank
); // Seed the random number generator with the process rank
// Generate m random numbers
vector<int> numbers(m);
for (int i = 0; i < m; i++) {
numbers
[i
] = rand() % 901 + 100; }
// Print the random numbers to the console
cout << "Process " << world_rank << " random numbers: ";
for (int i = 0; i < m; i++) {
cout << numbers[i] << " ";
}
cout << endl;
// Compute the sum of the random numbers
int sum = 0;
for (int i = 0; i < m; i++) {
sum += numbers[i];
}
// Print the sum to the console
cout << "Process " << world_rank << " sum: " << sum << endl;
// Determine the time it takes for the process to complete the job
double start_time = MPI_Wtime();
// Reduce all sums to the root process
int global_sum;
MPI_Reduce(&sum, &global_sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
// Print the time to the console
double end_time = MPI_Wtime();
cout << "Process " << world_rank << " time: " << (end_time - start_time) << " seconds" << endl;
// Print the global sum to the console
if (world_rank == 0) {
cout << "Global sum: " << global_sum << endl;
}
MPI_Finalize();
return 0;
}
CiNpbmNsdWRlIDxtcGkuaD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgIE1QSV9Jbml0KCZhcmdjLCAmYXJndik7CiAgICBpbnQgd29ybGRfcmFuazsKICAgIE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZ3b3JsZF9yYW5rKTsKICAgIGludCB3b3JsZF9zaXplOwogICAgTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJndvcmxkX3NpemUpOwoKICAgIGludCBtID0gMTAwOwogICAgc3JhbmQodGltZShOVUxMKSArIHdvcmxkX3JhbmspOyAvLyBTZWVkIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB3aXRoIHRoZSBwcm9jZXNzIHJhbmsKCiAgICAvLyBHZW5lcmF0ZSBtIHJhbmRvbSBudW1iZXJzCiAgICB2ZWN0b3I8aW50PiBudW1iZXJzKG0pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICBudW1iZXJzW2ldID0gcmFuZCgpICUgOTAxICsgMTAwOwogICAgfQoKICAgIC8vIFByaW50IHRoZSByYW5kb20gbnVtYmVycyB0byB0aGUgY29uc29sZQogICAgY291dCA8PCAiUHJvY2VzcyAiIDw8IHdvcmxkX3JhbmsgPDwgIiByYW5kb20gbnVtYmVyczogIjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgY291dCA8PCBudW1iZXJzW2ldIDw8ICIgIjsKICAgIH0KICAgIGNvdXQgPDwgZW5kbDsKCiAgICAvLyBDb21wdXRlIHRoZSBzdW0gb2YgdGhlIHJhbmRvbSBudW1iZXJzCiAgICBpbnQgc3VtID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgc3VtICs9IG51bWJlcnNbaV07CiAgICB9CgogICAgLy8gUHJpbnQgdGhlIHN1bSB0byB0aGUgY29uc29sZQogICAgY291dCA8PCAiUHJvY2VzcyAiIDw8IHdvcmxkX3JhbmsgPDwgIiBzdW06ICIgPDwgc3VtIDw8IGVuZGw7CgogICAgLy8gRGV0ZXJtaW5lIHRoZSB0aW1lIGl0IHRha2VzIGZvciB0aGUgcHJvY2VzcyB0byBjb21wbGV0ZSB0aGUgam9iCiAgICBkb3VibGUgc3RhcnRfdGltZSA9IE1QSV9XdGltZSgpOwoKICAgIC8vIFJlZHVjZSBhbGwgc3VtcyB0byB0aGUgcm9vdCBwcm9jZXNzCiAgICBpbnQgZ2xvYmFsX3N1bTsKICAgIE1QSV9SZWR1Y2UoJnN1bSwgJmdsb2JhbF9zdW0sIDEsIE1QSV9JTlQsIE1QSV9TVU0sIDAsIE1QSV9DT01NX1dPUkxEKTsKCiAgICAvLyBQcmludCB0aGUgdGltZSB0byB0aGUgY29uc29sZQogICAgZG91YmxlIGVuZF90aW1lID0gTVBJX1d0aW1lKCk7CiAgICBjb3V0IDw8ICJQcm9jZXNzICIgPDwgd29ybGRfcmFuayA8PCAiIHRpbWU6ICIgPDwgKGVuZF90aW1lIC0gc3RhcnRfdGltZSkgPDwgIiBzZWNvbmRzIiA8PCBlbmRsOwoKICAgIC8vIFByaW50IHRoZSBnbG9iYWwgc3VtIHRvIHRoZSBjb25zb2xlCiAgICBpZiAod29ybGRfcmFuayA9PSAwKSB7CiAgICAgICAgY291dCA8PCAiR2xvYmFsIHN1bTogIiA8PCBnbG9iYWxfc3VtIDw8IGVuZGw7CiAgICB9CgogICAgTVBJX0ZpbmFsaXplKCk7CiAgICByZXR1cm4gMDsKfQoK