#include <iostream>
#include "mpi.h"
using namespace std;
//compute the trapzoidal area for the function x*x from 0 to 1 with 1024 trapzoid
float f(float x)
{
return x * x;
}
float Trap(float a, float b, int n, float h)
{
float integral, x;
int i;
integral = (f(a) + f(b)) / 2.0;
x = a;
for (i = 1; i <= n - 1; i++)
{
x = x + h;
integral = integral + f(x);
}
return integral * h;
}
int main(int argc, char** argv)
{
int my_rank, p;
float a = 0.0;
float b = 1.0;
int n = 1024;
float h, local_a, local_b;
int local_n;
float integral;
float total = -1;
int source;
int dest = 0;
int tage = 0;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
h = (b - a) / n;
local_n = n / p;
local_a = a + my_rank * local_n * h;
local_b = local_a + local_n * h;
integral = Trap(local_a, local_b, local_n, h);
if (my_rank == 0)
{
total = integral;
for (source = 1; source < p; source++)
{
MPI_Recv(&integral, 1, MPI_FLOAT, source, tage, MPI_COMM_WORLD,
&status);
cout << "PE " << my_rank << " is " << source << " " << integral << "\n";
total = total + integral;
}
}
else
{
cout << "PE " << my_rank << " is " << dest << " " << integral << "\n";
MPI_Send(&integral, 1, MPI_FLOAT, dest, tage, MPI_COMM_WORLD);
}
if (my_rank == 0)
{
cout << "with n == "<<n<<" trapezoids, \n Our estimate";
cout << " of the integral from " << a << " to " << b << "= "<<total<<"\n";
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSAibXBpLmgiCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci8vY29tcHV0ZSB0aGUgdHJhcHpvaWRhbCBhcmVhIGZvciB0aGUgZnVuY3Rpb24geCp4IGZyb20gMCB0byAxIHdpdGggMTAyNCB0cmFwem9pZApmbG9hdCBmKGZsb2F0IHgpCnsKCXJldHVybiB4ICogeDsKfQpmbG9hdCBUcmFwKGZsb2F0IGEsIGZsb2F0IGIsIGludCBuLCBmbG9hdCBoKQp7CglmbG9hdCBpbnRlZ3JhbCwgeDsKCWludCBpOwoJaW50ZWdyYWwgPSAoZihhKSArIGYoYikpIC8gMi4wOwoJeCA9IGE7Cglmb3IgKGkgPSAxOyBpIDw9IG4gLSAxOyBpKyspCgl7CgkJeCA9IHggKyBoOwoJCWludGVncmFsID0gaW50ZWdyYWwgKyBmKHgpOwoJfQoJcmV0dXJuIGludGVncmFsICogaDsKfQppbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCnsKCWludCBteV9yYW5rLCBwOwoJZmxvYXQgYSA9IDAuMDsKCWZsb2F0IGIgPSAxLjA7CglpbnQgbiA9IDEwMjQ7CglmbG9hdCBoLCBsb2NhbF9hLCBsb2NhbF9iOwoJaW50IGxvY2FsX247CglmbG9hdCBpbnRlZ3JhbDsKCWZsb2F0IHRvdGFsID0gLTE7CglpbnQgc291cmNlOwoJaW50IGRlc3QgPSAwOwoJaW50IHRhZ2UgPSAwOwoJTVBJX1N0YXR1cyBzdGF0dXM7CglNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwoJTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJm15X3JhbmspOwoJTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnApOwoJaCA9IChiIC0gYSkgLyBuOwoJbG9jYWxfbiA9IG4gLyBwOwoJbG9jYWxfYSA9IGEgKyBteV9yYW5rICogbG9jYWxfbiAqIGg7Cglsb2NhbF9iID0gbG9jYWxfYSArIGxvY2FsX24gKiBoOwoJaW50ZWdyYWwgPSBUcmFwKGxvY2FsX2EsIGxvY2FsX2IsIGxvY2FsX24sIGgpOwoJaWYgKG15X3JhbmsgPT0gMCkKCXsKCQl0b3RhbCA9IGludGVncmFsOwoJCWZvciAoc291cmNlID0gMTsgc291cmNlIDwgcDsgc291cmNlKyspCgkJewoJCQlNUElfUmVjdigmaW50ZWdyYWwsIDEsIE1QSV9GTE9BVCwgc291cmNlLCB0YWdlLCBNUElfQ09NTV9XT1JMRCwKCQkJCSZzdGF0dXMpOwoJCQljb3V0IDw8ICJQRSAiIDw8IG15X3JhbmsgPDwgIiBpcyAiIDw8IHNvdXJjZSA8PCAiICIgPDwgaW50ZWdyYWwgPDwgIlxuIjsKCQkJdG90YWwgPSB0b3RhbCArIGludGVncmFsOwoJCX0KCX0KCWVsc2UKCXsKCQljb3V0IDw8ICJQRSAiIDw8IG15X3JhbmsgPDwgIiBpcyAiIDw8IGRlc3QgPDwgIiAiIDw8IGludGVncmFsIDw8ICJcbiI7CgkJTVBJX1NlbmQoJmludGVncmFsLCAxLCBNUElfRkxPQVQsIGRlc3QsIHRhZ2UsIE1QSV9DT01NX1dPUkxEKTsKCX0KCWlmIChteV9yYW5rID09IDApCgl7CgkJY291dCA8PCAid2l0aCBuID09ICI8PG48PCIgdHJhcGV6b2lkcywgXG4gT3VyIGVzdGltYXRlIjsKCQljb3V0IDw8ICIgb2YgdGhlIGludGVncmFsIGZyb20gIiA8PCBhIDw8ICIgdG8gIiA8PCBiIDw8ICI9ICI8PHRvdGFsPDwiXG4iOwoJfQoJTVBJX0ZpbmFsaXplKCk7CglyZXR1cm4gMDsKfQ==