#include <iostream>
#include <vector>
#include <mpi.h>
using namespace std;
int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// Check if number of processes is a power of 2 (valid hypercube)
int dim = (int)log2(size);
if (size != (1 << dim)) {
if (rank == 0) {
cerr << "Error: Number of processes must be a power of 2 for a hypercube." << endl;
}
MPI_Finalize();
return 1;
}
// Data to be broadcast (replace with your actual data)
int data = 10;
// Broadcast loop (log2(size) iterations)
for (int i = 0; i < dim; ++i) {
// Partner selection based on binary representation of rank and i'th bit
int partner = rank ^ (1 << i);
// Send data if current rank has a lower value in the i'th bit
if ((rank >> i) & 1) {
MPI_Send(&data, 1, MPI_INT, partner, 0, MPI_COMM_WORLD);
} else if (rank != partner) { // Receive data if not the source
MPI_Recv(&data, 1, MPI_INT, partner, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
}
// Print the received data on all processes
cout << "Process " << rank << " received data: " << data << endl;
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bXBpLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogIE1QSV9Jbml0KCZhcmdjLCAmYXJndik7CgogIGludCByYW5rLCBzaXplOwogIE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZyYW5rKTsKICBNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCAmc2l6ZSk7CgogIC8vIENoZWNrIGlmIG51bWJlciBvZiBwcm9jZXNzZXMgaXMgYSBwb3dlciBvZiAyICh2YWxpZCBoeXBlcmN1YmUpCiAgaW50IGRpbSA9IChpbnQpbG9nMihzaXplKTsKICBpZiAoc2l6ZSAhPSAoMSA8PCBkaW0pKSB7CiAgICBpZiAocmFuayA9PSAwKSB7CiAgICAgIGNlcnIgPDwgIkVycm9yOiBOdW1iZXIgb2YgcHJvY2Vzc2VzIG11c3QgYmUgYSBwb3dlciBvZiAyIGZvciBhIGh5cGVyY3ViZS4iIDw8IGVuZGw7CiAgICB9CiAgICBNUElfRmluYWxpemUoKTsKICAgIHJldHVybiAxOwogIH0KCiAgLy8gRGF0YSB0byBiZSBicm9hZGNhc3QgKHJlcGxhY2Ugd2l0aCB5b3VyIGFjdHVhbCBkYXRhKQogIGludCBkYXRhID0gMTA7CgogIC8vIEJyb2FkY2FzdCBsb29wIChsb2cyKHNpemUpIGl0ZXJhdGlvbnMpCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaW07ICsraSkgewogICAgLy8gUGFydG5lciBzZWxlY3Rpb24gYmFzZWQgb24gYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHJhbmsgYW5kIGkndGggYml0CiAgICBpbnQgcGFydG5lciA9IHJhbmsgXiAoMSA8PCBpKTsKCiAgICAvLyBTZW5kIGRhdGEgaWYgY3VycmVudCByYW5rIGhhcyBhIGxvd2VyIHZhbHVlIGluIHRoZSBpJ3RoIGJpdAogICAgaWYgKChyYW5rID4+IGkpICYgMSkgewogICAgICBNUElfU2VuZCgmZGF0YSwgMSwgTVBJX0lOVCwgcGFydG5lciwgMCwgTVBJX0NPTU1fV09STEQpOwogICAgfSBlbHNlIGlmIChyYW5rICE9IHBhcnRuZXIpIHsgLy8gUmVjZWl2ZSBkYXRhIGlmIG5vdCB0aGUgc291cmNlCiAgICAgIE1QSV9SZWN2KCZkYXRhLCAxLCBNUElfSU5ULCBwYXJ0bmVyLCAwLCBNUElfQ09NTV9XT1JMRCwgTVBJX1NUQVRVU19JR05PUkUpOwogICAgfQogIH0KCiAgLy8gUHJpbnQgdGhlIHJlY2VpdmVkIGRhdGEgb24gYWxsIHByb2Nlc3NlcwogIGNvdXQgPDwgIlByb2Nlc3MgIiA8PCByYW5rIDw8ICIgcmVjZWl2ZWQgZGF0YTogIiA8PCBkYXRhIDw8IGVuZGw7CgogIE1QSV9GaW5hbGl6ZSgpOwogIHJldHVybiAwOwp9