******************************************************************** * Timer Test of PVMFSEND AND PVMFRECEIVE Function Subroutine Calls * ******************************************************************** CODE: TIMEOFDAY Mixes C code gettimeofday function; name in caps in C code! cont'd: since cray fortran automatically capitalizes all names * Program RecvTime Parameter(Nprint=1) ! diagnostic print only for Nprint.gt.0. Parameter(NTime=20) ! timer counter array dimension Real D(5),Dmax(1) Real DMmax(0:3),Result ! Master copies of local max changes. Real DGmax ! global max change Integer TIMEOFDAY,get_time(0:NTime) Integer MsgTag,MyTID,MasTID,MyPE,MsgPE,Master Integer Info,BufID,SendTID Integer NPEs external TIMEOFDAY Intrinsic maxval * Include '/usr/include/mpp/fpvm3.h' ! include pvm header definitions * Code: Start Microsecond Wall Timer and Timer "Kounter" kt. get_time(0)=TIMEOFDAY() kt=0 Code: Copies of This code are run by all processors. Code: Enroll into PVM Code: Obtain initial PVM data. Call pvmfmytid(MyTID) ! get This PE's Task ID (TID) Call pvmfgetpe(MyTID,MyPE) ! get PE's PE ID Call pvmfgsize(PVMALL,NPEs) ! get group size of all * * Write(6,*) 'MyPE,MyTID,NPEs=',MyPE,MyTID,NPEs * Code: Job Script preSpawns Master and Nproc-1 slaves * Master = 0 Call pvmfgettid(PVMALL,Master,MasTID) ! get TID of Master Write(6,*) 'MyPE,MyTID,Master,MasTID=',MyPE,MyTID,Master,MasTID kt=kt+1 get_time(kt)=TIMEOFDAY() write(6,69) 'MyPE,Wall Time for PVM SetUp=' & ,MyPE,get_time(kt)-get_time(kt-1),' microseconds' Caution: These Timer Write Statement Should NOT be in Production Code, Cont'd: but collected for printing at END of code. kts=kt * Do i=1,5 D(i)=(NPEs-MyPE)*i*0.1 Enddo Write(6,66) MyPE,(D(i),i=1,5) * Dmax(1)=maxval(D) Write(6,67) MyPE,Dmax(1) * DMmax(0)=Dmax(1) MsgTag=2 If(MyPE.gt.0) Then kt=kt+1 get_time(kt)=TIMEOFDAY() CAREFUL of Sending Shared/Global Data, But Sending MyPE is OK Here: Call pvmfinitsend(PVMDEFAULT,BufID) CAUTION: T3D uses 8 Byte Integers! Call pvmfpack(Integer8,MyPE,1,1,Info) Call pvmfpack(Real8,Dmax(1),1,1,Info) Call pvmfsend(MasTID,MsgTag,Info) kt=kt+1 get_time(kt)=TIMEOFDAY() write(6,69) 'MyPE,Wall Time for Send=' & ,MyPE,get_time(kt)-get_time(kt-1),' microseconds' Else Do ip = 1, NPEs-1 kt=kt+1 get_time(kt)=TIMEOFDAY() Call pvmfrecv(-1,MsgTag,BufID) Call pvmfbufinfo(BufID,NBytes,MsgTag,SendTID,Info) ! Get SenderID Call pvmfunpack(Integer8,MsgPE,1,1,Info) Call pvmfunpack(Real8,Result,1,1,Info) kt=kt+1 get_time(kt)=TIMEOFDAY() write(6,69) 'MyPE,Wall Time for Receive=' & ,MyPE,get_time(kt)-get_time(kt-1),' microseconds' Print65,'Slave:',SendTID,'; returned:',Result,'@NBytes:', & NBytes,' for All Messages' Write(6,67) MsgPE,Result ! print received results DMmax(ip)=Result Enddo EndIf If(MyPE.eq.Master) Then DGmax=maxval(DMmax) ! Get Global Max of Local Maxs Write(6,68) MyPE,DGmax EndIf * kt=kt+1 get_time(kt)=TIMEOFDAY() write(6,69) 'MyPE,Wall Time for Max Code=' & ,MyPE,get_time(kt)-get_time(kts),' microseconds' * CAUTION: Must Use Barrier So Master Can Finish Global Max, Before Slaves Code: Leave with their Message Buffers! call pvmfbarrier(PVMALL,-1,Info) Code: Exit PVM Call pvmfexit(Info) * kt=kt+1 get_time(kt)=TIMEOFDAY() get_time(kt)=get_time(kt)-get_time(0) time_secs=get_time(kt)/1.e6 write(6,691) 'MyPE,Wall Time for Code & PVM=' & ,MyPE,get_time(kt),' microseconds,',time_secs,' seconds' If(get_time(kt).lt.0) then get_time(kt)=get_time(kt)+10000 time_secs=get_time(kt)/1.e6 write(6,691) 'Timer Overflow, Corrected Code Time =' & ,MyPE,get_time(kt),' microseconds,',time_secs,' seconds' EndIf * 65 Format(1x,a,i13,a,f10.4,a,i13,a) 66 Format(1x,'MyPE,D(1:5)= ',i13,5F10.4) 67 Format(1x,'MyPE,LocalMax(D)= ',i13,F10.4) 68 Format(1x,'MyPE,GlobalMax(D)= ',i13,F10.4) 69 Format(1x,a,i5,i12,a) 691 Format(1x,a,i5,i12,a,f10.4,a) * STOP END