C ----------------------------------------------------------------------------- C FILE: poe_bandwidth.f C DESCRIPTION: C This code conducts timing tests on messages sent between two processes. C It sends/receives N roundtrips of incrementally sized messages C from start size J to finish size K by increment I. C AUTHOR: 10/09/98 Blaise Barney C LAST REVISED: C ----------------------------------------------------------------------------- program bandwidth include 'mpif.h' integer MAXSIZE, task0, task1, tag0, tag1, tag2 parameter(MAXSIZE = 1000000) parameter(task0 = 0) parameter(task1 = 1) parameter(tag0 = 0) parameter(tag1 = 1) integer numtasks,rank,n,i,rndtrps,mbytes,startsize,finishsize, & incr, Stat(MPI_STATUS_SIZE), ierr real*8 time1, time2, rtc, ttime, tbytes character c(MAXSIZE) common /shared/ rndtrps,startsize,finishsize,incr,c call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, numtasks, ierr) C**************************** task 0 *********************************** if (rank .eq. 0) then do i=1,MAXSIZE c(i) = "x" end do startsize = 100000 finishsize = MAXSIZE incr = 100000 rndtrps = 3 write(*,*)' ' write(*,*)'****** MPI/POE Bandwidth Test ****** ' write(*,*)'Message start size= ',startsize write(*,*)'Message finish size= ',finishsize write(*,*)'Roundtrips/iteration= ',rndtrps write(*,*)'Incremented by ',incr,' bytes per iteration' write(*,*)' ' write(*,*)'Message Size Bandwidth (bytes/sec)' call MPI_SEND(startsize, 1, MPI_INTEGER, task1, tag0, & MPI_COMM_WORLD, ierr) call MPI_SEND(finishsize, 1, MPI_INTEGER, task1, tag0, & MPI_COMM_WORLD, ierr) call MPI_SEND(incr, 1, MPI_INTEGER, task1, tag0, & MPI_COMM_WORLD, ierr) call MPI_SEND(rndtrps, 1, MPI_INTEGER, task1, tag0, & MPI_COMM_WORLD, ierr) do n=startsize, finishsize, incr ttime = 0.0 mbytes = n do i=1, rndtrps time1 = rtc() call MPI_SEND(c, n, MPI_CHARACTER, task1, tag0, & MPI_COMM_WORLD, ierr) call MPI_RECV(c, n, MPI_CHARACTER, task1, tag1, & MPI_COMM_WORLD, Stat, ierr) time2 = rtc() ttime = ttime + (time2-time1) end do tbytes = (mbytes*2.0) * rndtrps write(*,111) mbytes,int(tbytes/ttime) 111 format(i9,i16) end do endif C *************************** task 1 ************************************* if (rank .eq. 1) then call MPI_RECV(startsize, 1, MPI_INTEGER, task0, tag0, & MPI_COMM_WORLD, Stat, ierr) call MPI_RECV(finishsize, 1, MPI_INTEGER, task0, tag0, & MPI_COMM_WORLD, Stat, ierr) call MPI_RECV(incr, 1, MPI_INTEGER, task0, tag0, & MPI_COMM_WORLD, Stat, ierr) call MPI_RECV(rndtrps, 1, MPI_INTEGER, task0, tag0, & MPI_COMM_WORLD, Stat, ierr) do n=startsize, finishsize, incr do i=1, rndtrps call MPI_RECV(c, n, MPI_CHARACTER, task0, tag0, & MPI_COMM_WORLD, Stat, ierr) call MPI_SEND(c, n, MPI_CHARACTER, task0, tag1, & MPI_COMM_WORLD, ierr) end do end do endif call MPI_FINALIZE(ierr) end