#include #include #define NUM_OF_ELEM 1000 #define NUM_OF_PROCS 4 #define ELEM_PER_PROC (NUM_OF_ELEM/NUM_OF_PROCS) #define ROOT 0 int sum_node(int buf[ELEM_PER_PROC]){ int partial_sum = 0; for (int k = 0; k < ELEM_PER_PROC; k++) { partial_sum += buf[k]; } return partial_sum; } int main(int argc, char **argv) { int num_procs; int my_pid; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); MPI_Comm_rank(MPI_COMM_WORLD, &my_pid); int sendBuffer[NUM_OF_ELEM]; int recvBuffer[ELEM_PER_PROC]; double start_time; if (my_pid == ROOT) { start_time = MPI_Wtime(); int i; for (i = 0; i < NUM_OF_ELEM; i++) sendBuffer[i] = i+1; } MPI_Scatter(sendBuffer, ELEM_PER_PROC, MPI_INT, recvBuffer, ELEM_PER_PROC, MPI_INT, ROOT, MPI_COMM_WORLD); int partial_sum = sum_node(recvBuffer); int total_sum; MPI_Reduce(&partial_sum, &total_sum, 1, MPI_INT, MPI_SUM, ROOT, MPI_COMM_WORLD); if (my_pid == ROOT) { double end_time = MPI_Wtime(); printf("Total summation of 1 to %d is %d and it took %f\n", NUM_OF_ELEM, total_sum, end_time-start_time); } MPI_Finalize(); }