############ Tamim Jabban ############# ############ Recitation 9 ############# #include #include #define NUM_ELEMS 100 #define NUM_PROCS 4 #define NUM_ELEMS_PER_PROC (NUM_ELEMS / NUM_PROCS) #define TAG_SPREAD 5 #define TAG_JOIN 10 #define ROOT 0 int main(int argc, char** argv) { int my_pid, num_proc; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &num_proc); MPI_Comm_rank(MPI_COMM_WORLD, &my_pid); MPI_Status status; int sendBuffer[NUM_ELEMS]; int recvBuffer[NUM_ELEMS_PER_PROC]; if (my_pid == ROOT) { // Master double start_time = MPI_Wtime(); int i; for (i = 0; i < NUM_ELEMS; i++) sendBuffer[i] = i+1; int j; for (j = 1; j < NUM_PROCS; j++) MPI_Send(&sendBuffer[j*NUM_ELEMS_PER_PROC], NUM_ELEMS_PER_PROC, MPI_INT, j, TAG_SPREAD, MPI_COMM_WORLD); int total_sum = 0; int k; for (k = 0; k < NUM_ELEMS_PER_PROC; k++) total_sum += sendBuffer[k]; int partial_sum; int m; for (m = 1; m < NUM_PROCS; m++) { MPI_Recv(&partial_sum, 1, MPI_INT, m, TAG_JOIN, MPI_COMM_WORLD, &status); total_sum += partial_sum; } double end_time = MPI_Wtime(); printf("Total sum: %d, and it took %f\n", total_sum, (end_time - start_time)); } else { // Slave MPI_Recv(&recvBuffer, NUM_ELEMS_PER_PROC, MPI_INT, ROOT, TAG_SPREAD, MPI_COMM_WORLD, &status); int partial_sum = 0; int n; for (n = 0; n < NUM_ELEMS_PER_PROC; n++) partial_sum += recvBuffer[n]; MPI_Send(&partial_sum, 1, MPI_INT, ROOT, TAG_JOIN, MPI_COMM_WORLD); } MPI_Finalize(); }