GRAPES源碼分析之計時系統

前言

模式開發者(尤爲是並行計算開發者)對模式各部分執行花費的時間很感興趣,須要瞭解哪裏耗時比較長,進而對其進行優化。普通用戶通常不須要這個功能。計時系統的通常思路:在須要計時部分的起點和終點設置計時器(調用計時子程序),兩個點時間差即爲計時部分所耗時間。數組

GRAPES計時系統

目前發現GRAPES中有3套計時系統,分別在 module_integratesovle_grapesritche_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_TIMINGorm

注:每一積分步 solve_grapes 執行時間保留在 wtimer_integrate(5) 中.進程

還有一套是在 module_semi_lagritche_puw_jin 中定義的,預編譯條件爲 SL_TIMINGci

若是須要開啓計時系統,需在 configure.grpaes 中預處理器選項 ARCHFLAGS 中加上相似 -D predefineName ,如 -DSL_TIMING開發

相關文章
相關標籤/搜索