program pardotproduct include "mpif.h" INTEGER SIZE PARAMETER(SIZE=1000000) REAL,ALLOCATABLE:: A(:),B(:) INTEGER NPROCS, RANK, REMAINDER, I, J,IERR INTEGER stat(MPI_STATUS_SIZE) INTEGER,ALLOCATABLE:: LSIZE(:) REAL LDOT,DOT ! INITIALIZE THE MPI ENVIRONMENT CALL MPI_INIT(IERR) CALL MPI_COMM_RANK(MPI_COMM_WORLD, RANK,IERR) CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,IERR) ! DEVIDE THE SIZE FOR PROCESSORS AND STORE IN AN ARRAY LSIZE OF SIZE ! NPROCS-1 REMAINDER= MOD(SIZE,NPROCS) ALLOCATE(LSIZE(0:NPROCS-1)) DO I=0,NPROCS-1 IF(I.LT.REMAINDER)THEN LSIZE(I)=1+(SIZE-REMAINDER)/NPROCS ELSE LSIZE(I)=(SIZE-REMAINDE)/NPROCS ENDIF ENDDO ! ALLOCATE THE ARRAYS WITH REDUCED SIZE ALLOCATE (A(LSIZE(RANK)),B(LSIZE(RANK))) ! ! COMPUTE THE STARTING POINT FOR LOCAL WORK ! LESS=0 IF(RANK.GT.0)THEN DO I=0,RANK-1 LESS=LESS+LSIZE(I) ENDDO ENDIF ! ! INITIALIZE THE LOCAL ARRAY AFTER ADJUSTMENT ! DO I=1,LSIZE(RANK) A(I)=SIN((I+LESS)*1.) B(I)=COS((I+LESS)*1.) ENDDO ! ! COMPUTE LOCAT DOT PRODUCT ! LDOT=0.0 DO I=1,LSIZE(RANK) LDOT=LDOT+A(I)*B(I) ENDDO ! ! COMPUTE THE DOT PRODUCT AS IN SERIAL CODE ! CALL MPI_ALLREDUCE(LDOT,DOT,1,MPI_REAL,MPI_SUM, & MPI_COMM_WORLD,ierr) print*,'DOT PRODUCT OF A and B IS',DOT ! TERMINATE THE MPI ENVIRONMENT CALL MPI_FINALIZE(IERR) END