#include #include #define NUM_ELEMS 60 #define NUM_PROCS 4 #define NUM_ELEM_PER_PROC 15 #define TAG_X 1 #define TAG_Y 2 int sendBuff[NUM_ELEMS]; int recvBuff[NUM_ELEM_PER_PROC]; int sum_node(int buf[NUM_ELEM_PER_PROC]){ int partial_sum = 0; for (int k = 0; k < NUM_ELEM_PER_PROC; k++) { partial_sum += buf[k]; } return partial_sum; } int main(int argc, char **argv) { int myRank; MPI_Status status; int sum = 0; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myRank); if (myRank == 0) { //master double startTime = MPI_Wtime(); int i; for (i = 0; i < NUM_ELEMS; i++) sendBuff[i] = i+1; int j; for (j = 1; j < NUM_PROCS; j++) { int startIndex = j * NUM_ELEM_PER_PROC; int endIndex = startIndex + NUM_ELEM_PER_PROC; MPI_Send(&sendBuff[startIndex], NUM_ELEM_PER_PROC, MPI_INT, j, TAG_X, MPI_COMM_WORLD); } int partial_sum = 0; for (j = 1; j < NUM_PROCS; j++) { MPI_Recv(&partial_sum, 1, MPI_INT, j, TAG_Y, MPI_COMM_WORLD, &status); sum += partial_sum; } sum += sum_node(sendBuff); double endTime = MPI_Wtime(); //endTime - startTime printf("Grand sum = %d, and it took %f\n", sum, (endTime - startTime)); } else { MPI_Recv(&recvBuff, NUM_ELEM_PER_PROC, MPI_INT, 0, TAG_X, MPI_COMM_WORLD, &status); int k; int partial_sum = sum_node(recvBuff); MPI_Send(&partial_sum, 1, MPI_INT, 0, TAG_Y, MPI_COMM_WORLD); } MPI_Finalize(); return 0; }