#include #include "mpi.h" #include "trap.h" typedef struct { float a; float b; int n; } INDATA_TYPE; void Build_derived_type(INDATA_TYPE* indata, MPI_Datatype* message_type_ptr){ int block_lengths[3]; MPI_Aint displacements[3]; MPI_Aint addresses[4]; MPI_Datatype typelist[3]; typelist[0] = MPI_FLOAT; typelist[1] = MPI_FLOAT; typelist[2] = MPI_INT; block_lengths[0] = block_lengths[1] = block_lengths[2] = 1; MPI_Address(indata, &addresses[0]); MPI_Address(&(indata->a), &addresses[1]); MPI_Address(&(indata->b), &addresses[2]); MPI_Address(&(indata->n), &addresses[3]); displacements[0] = addresses[1] - addresses[0]; displacements[1] = addresses[2] - addresses[0]; displacements[2] = addresses[3] - addresses[0]; MPI_Type_struct(3, block_lengths, displacements, typelist,message_type_ptr); MPI_Type_commit(message_type_ptr); } void Get_data3(int me, INDATA_TYPE* indata){ MPI_Datatype message_type; int root = 0, count = 1; if (me == 0){ printf("Enter a, b, and n\n"); scanf("%f %f %d", &(indata->a), &(indata->b), &(indata->n)); } Build_derived_type(indata, &message_type); MPI_Bcast(indata, count, message_type, root, MPI_COMM_WORLD); } int main(int argc, char** argv) { int me, nproc, local_n; float h, local_a, local_b, integral, total; INDATA_TYPE indata; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Comm_size(MPI_COMM_WORLD, &nproc); Get_data3(me, &indata); h = (indata.b-indata.a)/indata.n; local_n = indata.n/nproc; local_a = indata.a + me*local_n*h; local_b = local_a + local_n*h; integral = Trap(local_a, local_b, local_n, h); MPI_Reduce(&integral, &total, 1, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD); if(me == 0) { printf("With n = %d trapezoids, our estimate\n", indata.n); printf("of the integral from %f to %f = %f\n", indata.a, indata.b, total); } MPI_Finalize(); return 0; }