#include #include void clearMyB(int[]); void clearMyB(int MyB[]) { int i; for (i = 0; i < 5; i ++) { MyB[i] = 0; } } main( int argc, char** argv) { int MyPE, //My logical process number NumPE, //Number of processes i; //loop index variable int MyA[5], //My portion of A MyB[5], //My portion of B Recvcount1[4] = {1, 1, 1, 0}, Recvcount2[4] = {1, 1, 1, 1}, Recvcount3[4] = {1, 0, 3, 1}, Recvcount4[4] = {1, 2, 0, 2}; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &MyPE); MPI_Comm_size(MPI_COMM_WORLD, &NumPE); //Each proc fill their only array for (i = 0; i < 5; i ++) { MyA[i] = (MyPE + 1) * (i + 10); MyB[i] = 0; } printf("PE %d: MyA is - ", MyPE); for (i = 0; i < 5; i ++) { printf("%d ", MyA[i]); } printf("\n"); /////////////////////////////////////////////////////////// MPI_Reduce_scatter(MyA, MyB, Recvcount1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); if (MyPE == 0) printf("Recvcount = {1, 1, 1, 0}\n"); printf("PE %d: MyB is - ", MyPE); for (i = 0; i < 5; i ++) { printf("%d ", MyB[i]); } printf("\n"); /////////////////////////////////////////////////////////// MPI_Reduce_scatter(MyA, MyB, Recvcount2, MPI_INT, MPI_SUM, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); if (MyPE == 0) printf("Recvcount = {1, 1, 1, 1}\n"); printf("PE %d: MyB is - ", MyPE); for (i = 0; i < 5; i ++) { printf("%d ", MyB[i]); } printf("\n"); clearMyB(MyB); /////////////////////////////////////////////////////////// MPI_Reduce_scatter(MyA, MyB, Recvcount3, MPI_INT, MPI_SUM, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); if (MyPE == 0) printf("Recvcount = {1, 0, 3, 1}\n"); printf("PE %d: MyB is - ", MyPE); for (i = 0; i < 5; i ++) { printf("%d ", MyB[i]); } printf("\n"); clearMyB(MyB); /////////////////////////////////////////////////////////// MPI_Reduce_scatter(MyA, MyB, Recvcount4, MPI_INT, MPI_SUM, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); if (MyPE == 0) printf("Recvcount = {1, 2, 0, 2}\n"); printf("PE %d: MyB is - ", MyPE); for (i = 0; i < 5; i ++) { printf("%d ", MyB[i]); } printf("\n"); clearMyB(MyB); MPI_Finalize(); return 0; }