#include <iostream>
#include <cstdlib>
#include <array>
#include <mpi.h>
using namespace std;
const int arrSize = 100;
void SumMatrices()
{
}
int main(int argc, char* argv[])
{
int MB[arrSize][arrSize], MC[arrSize][arrSize], MA[arrSize][arrSize];
int buffer;
for (int i = 0; i < arrSize; ++i)
{
for (int j = 0; j < arrSize; ++j)
{
MB
[i
][j
] = rand() % 100 + 10; MC
[i
][j
] = rand() % 100 + 10; }
}
int procCount, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &procCount);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Status status;
int H = arrSize / procCount;
int beginInd = rank * H;
int endInd = beginInd + H - 1;
int min = INT32_MAX;
cout << "Process with rank " << rank << " has started matrix addition\n";
while(beginInd <= endInd)
{
for(int i = 0; i < arrSize; ++i)
{
int sum = MB[beginInd][i] + MC[beginInd][i];
MA[beginInd][i] = sum;
if (min > sum) min = sum;
}
++beginInd;
}
if(rank == 0)
{
cout << "Proc 0 min value is " << min << "\n";
for(int i = 1; i < procCount; ++i)
{
MPI_Recv(&buffer, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
if (min > buffer) min = buffer;
}
cout << "Min value is " << min;
}
else
{
buffer = min;
cout << "Process " << rank << " passing message '" << min <<"' to process 0\n";
MPI_Send(&buffer, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8bXBpLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBhcnJTaXplID0gMTAwOwoKdm9pZCBTdW1NYXRyaWNlcygpCnsKCQp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQp7CgkKCWludCBNQlthcnJTaXplXVthcnJTaXplXSwgTUNbYXJyU2l6ZV1bYXJyU2l6ZV0sIE1BW2FyclNpemVdW2FyclNpemVdOwoJaW50IGJ1ZmZlcjsKCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyU2l6ZTsgKytpKQoJewoJCWZvciAoaW50IGogPSAwOyBqIDwgYXJyU2l6ZTsgKytqKQoJCXsKCQkJTUJbaV1bal0gPSByYW5kKCkgJSAxMDAgKyAxMDsKCQkJTUNbaV1bal0gPSByYW5kKCkgJSAxMDAgKyAxMDsKCQl9Cgl9CgoJaW50IHByb2NDb3VudCwgcmFuazsKCglNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwoJTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnByb2NDb3VudCk7CglNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmcmFuayk7CglNUElfU3RhdHVzIHN0YXR1czsKCWludCBIID0gYXJyU2l6ZSAvIHByb2NDb3VudDsKCWludCBiZWdpbkluZCA9IHJhbmsgKiBIOwoJaW50IGVuZEluZCA9IGJlZ2luSW5kICsgSCAtIDE7CglpbnQgbWluID0gSU5UMzJfTUFYOwoKCWNvdXQgPDwgIlByb2Nlc3Mgd2l0aCByYW5rICIgPDwgcmFuayA8PCAiIGhhcyBzdGFydGVkIG1hdHJpeCBhZGRpdGlvblxuIjsKCgl3aGlsZShiZWdpbkluZCA8PSBlbmRJbmQpCgl7CgkJZm9yKGludCBpID0gMDsgaSA8IGFyclNpemU7ICsraSkKCQl7CgkJCWludCBzdW0gPSBNQltiZWdpbkluZF1baV0gKyBNQ1tiZWdpbkluZF1baV07CgkJCU1BW2JlZ2luSW5kXVtpXSA9IHN1bTsKCQkJaWYgKG1pbiA+IHN1bSkgbWluID0gc3VtOwoJCX0KCgkJKytiZWdpbkluZDsKCX0KCglpZihyYW5rID09IDApCgl7CgkJY291dCA8PCAiUHJvYyAwIG1pbiB2YWx1ZSBpcyAiIDw8IG1pbiA8PCAiXG4iOwoJCWZvcihpbnQgaSA9IDE7IGkgPCBwcm9jQ291bnQ7ICsraSkKCQl7CgkJCU1QSV9SZWN2KCZidWZmZXIsIDEsIE1QSV9JTlQsIE1QSV9BTllfU09VUkNFLCBNUElfQU5ZX1RBRywgTVBJX0NPTU1fV09STEQsICZzdGF0dXMpOwoJCQlpZiAobWluID4gYnVmZmVyKSBtaW4gPSBidWZmZXI7CgkJfQoKCQljb3V0IDw8ICJNaW4gdmFsdWUgaXMgIiA8PCBtaW47Cgl9CgllbHNlCgl7CgkJYnVmZmVyID0gbWluOwoJCWNvdXQgPDwgIlByb2Nlc3MgIiA8PCByYW5rIDw8ICIgcGFzc2luZyBtZXNzYWdlICciIDw8IG1pbiA8PCInIHRvIHByb2Nlc3MgMFxuIjsKCQlNUElfU2VuZCgmYnVmZmVyLCAxLCBNUElfSU5ULCAwLCAwLCBNUElfQ09NTV9XT1JMRCk7Cgl9CgoJTVBJX0ZpbmFsaXplKCk7CglyZXR1cm4gMDsKfQo=