C !!====================== mpi_scatter_reduce01.f ====================== C !! C !! Master distributes (scatters) an array across proccesses. C !! Processes add their elements, then combine sum in master C !! through a reduction operation C !!==================================================================== PROGRAM parsum INCLUDE "mpif.h" C MyPE: My logical process number C NumPE: Number of processes C i: loop index variable C A(16): Global array C MyA(4): My portion of A C MySum: My partial sum C Sum: Total sum INTEGER MyPE, NumPE, i, error_code DOUBLE PRECISION A(16), MyA(4), MySum, Sum CALL MPI_INIT(error_code) CALL MPI_COMM_RANK(MPI_COMM_WORLD, MyPE, error_code) CALL MPI_COMM_SIZE(MPI_COMM_WORLD, NumPE, error_code) C Master fill array (analogous to a read operation) IF(MyPE == 0) THEN DO i=0, 16 A(i) = i END DO END IF C Scatter array among all processes - each process gets C 4 contiguous entries of A CALL MPI_SCATTER(A, 4, MPI_DOUBLE_PRECISION, MyA, 4, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, error_code) WRITE(6,*) "PE ", MyPE, ": MyA is - ", (MyA(i),i=1,4) C Calculate sums, then reduce to master process MySum = 0.0 DO i=1,4 MySum = MySum+MyA(i) END DO CALL MPI_REDUCE(MySum, Sum, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_WORLD, error_code) IF(MyPE == 0) THEN WRITE(6,*) "Total Sum is: ",Sum ENDIF CALL MPI_FINALIZE(error_code) END Program parsum