/*This has been created by Mohammad Hammoud. *CMUQ- Nov. 8, 2012. * */ #include #include #define array_size 20 #define num_elem_pp 10 #define sendTag 1 #define recvTag 2 int array_send[array_size]; int array_recv[num_elem_pp]; int main(int argc, char **argv){ int myPID; int num_procs; int sum = 0; int partial_sum = 0; double startTime = 0.0; double endTime; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myPID); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); if(myPID == 0 ) { startTime = MPI_Wtime(); int i; for(i= 0; i < array_size; i++) array_send[i] = i; int j; for(j = 1; j < num_procs; j++){ int start_elem = j * num_elem_pp; MPI_Send(&array_send[start_elem], num_elem_pp, MPI_INT, j, sendTag, MPI_COMM_WORLD); } int k; for(k=0; k < num_elem_pp; k++) sum += array_send[k]; int l; for(l = 1; l < num_procs; l++){ MPI_Recv(&partial_sum, 1, MPI_INT, MPI_ANY_SOURCE, recvTag, MPI_COMM_WORLD, &status); printf("Partial sum received from process %d = %d\n", l, status.MPI_SOURCE); sum += partial_sum; } endTime = MPI_Wtime(); printf("Grand Sum = %d and time taken = %f\n", sum, (endTime-startTime)); }else{ MPI_Recv(&array_recv, num_elem_pp, MPI_INT, 0, sendTag, MPI_COMM_WORLD, &status); int i; for(i = 0; i < num_elem_pp; i++) partial_sum += array_recv[i]; MPI_Send(&partial_sum, 1, MPI_INT, 0, recvTag, MPI_COMM_WORLD); } MPI_Finalize(); }