前言
模式開發者(尤爲是並行計算開發者)對模式各部分執行花費的時間很感興趣,須要瞭解哪裏耗時比較長,進而對其進行優化。普通用戶通常不須要這個功能。計時系統的通常思路:在須要計時部分的起點和終點設置計時器(調用計時子程序),兩個點時間差即爲計時部分所耗時間。數組
GRAPES計時系統
目前發現GRAPES中有3套計時系統,分別在 module_integrate
、 sovle_grapes
及 ritche_puw_jin
中,對各自調用的子程序進行計時。計時子程序使用MPI牆鍾函數。爲了使版本統一,使用條件預編譯方法控制開啓實現計時功能(MPI同步計時會使模式總體運行時間過長,不適用於業務)。app
solve_grapes計時系統
如下以solve_grapes中計時系統進行說明函數
- 計時開始部分(別忘了引入mpi模塊,
use MPI
)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#ifdef DETAIL_TIMING integer :: ierr, comm real*8 :: start_time, end_time real*8 ,save:: wtimer(80,2)=0. !保存計時數據的二維數組,第一維指不一樣計時部分,第二維指不一樣步和同步兩種狀況 #endif #ifdef DETAIL_TIMING comm=mpi_comm_world call mpi_barrier(comm, ierr) !各進程同步,使各進程計時起點一致 start_time=mpi_wtime() !記錄起點牆鍾時間 call get_communicator(comm) #endif |
- 第一個計時部分終點處
1 2 3 4 5 6 7 8 |
#ifdef DETAIL_TIMING end_time=mpi_wtime() !本進程計時終點牆鍾時間 wtimer(1,1)=end_time-start_time ! 未同步狀況本進程該計時部分所用時間 call mpi_barrier(comm, ierr) ! 同步 end_time=mpi_wtime() !全部進程都執行完該部分時牆鍾時間 wtimer(1,2)=end_time-start_time !同步狀況下執行時間 start_time=end_time ! 下一計時部分的起點牆鍾時間 #endif |
-
之後每一計時部分計時思路與上述相同優化
-
在
solve_grapes
最後輸出每步積分步各調用部分執行時間spa
1 2 3 4 5 6 7 |
#ifdef DETAIL_TIMING write(73,*) 'step',step,':' write(73,*) "no_barrier for timing *************" write(73,'(10F8.4)') (wtimer(i,1),i=1,80) write(73,*) "barrier for timing *************" write(73,'(10F8.4)') (wtimer(i,2),i=1,80) #endif |
文件號爲73的文件是在 module_integrate
中定義的。code
1 2 |
write(filename,'(A7, I5.5)') 'Timing.',myprcid !各進程計時輸出文件名, open (73,file=filename,form='formatted') !有多少進程,就有多少文件 |
其它
module_integrate
中計時系統與 solve_grapes
中同樣,只不過計時都爲非同步狀況下的時間,保留在 wtimer_integrate
一維數組中。預編譯條件與 solve_grapes
相同,都爲 DETAIL_TIMING
。orm
注:每一積分步 solve_grapes
執行時間保留在 wtimer_integrate(5)
中.進程
還有一套是在 module_semi_lag
中 ritche_puw_jin
中定義的,預編譯條件爲 SL_TIMING
。ci
若是須要開啓計時系統,需在 configure.grpaes
中預處理器選項 ARCHFLAGS
中加上相似 -D predefineName
,如 -DSL_TIMING
。開發