有些時候可能會需要讓程式暫停幾秒,可能是要等設備回應,也有可能,只是要讓CPU休息一下...在Fortran中如何做到這件事呢?

直覺上要讓程式暫停幾秒鐘可以利用讀時間 + do loop,下面阿賢利用SYSTEM_CLOCK這個Fortran90標準副程式以上述的概念實做出一個能讓程式暫停指定秒數的subroutine: sleep_secs

  FORTRAN90
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
program SleepTest
implicit none
  call sleep_secs( 3.456 )
end program SleepTest

subroutine sleep_secs( secs )
implicit none
  real, intent(IN) :: secs
  real :: dt
  integer :: C0, C1, CR, CM
  dt = 0
  call SYSTEM_CLOCK( COUNT_RATE = CR, COUNT_MAX = CM )
  call SYSTEM_CLOCK( COUNT = C0 )
  do while( dt < secs )
    call SYSTEM_CLOCK( COUNT = C1 )
    if( C1 < C0 ) C0 = C0 - CM - 1
    dt = REAL( C1 - C0 ) / CR
  end do
end subroutine sleep_secs

從主程式呼叫sleep_secs讓程式暫停3.456秒。表面上程式雖然看起來暫停不動,但是實際上CPU還是一直在"讀時間"+"DO LOOP",利用LINUX的time指令看執行時間資訊即可看出來。
real    0m3.459s
user    0m3.454s
sys     0m0.002s

如果暫停的時候要讓CPU能真的休息,試試看非標準函數sleep、sleepqq:
sleep(n):程式休息n秒鐘(secs):gfortran、CVF、intel fortran支援
sleepqq(n):程式休息n毫秒(ms):CVF、intel fortran支援

  FORTRAN90
01
02
03
04
05
06
07
08
program test
implicit none
  print *, 'Sleep 2 sec.'
  call sleep(2)

  print *, 'Sleep 2000 msec.'
  call sleepqq(2000)
end program

執行結果:
real    0m4.005s
user    0m0.000s
sys     0m0.002s

由執行結果可以看到程式跑了4.005秒,但是沒有花到任合CPU效能,符合我們的預期目標。sleep雖然不是標準函數,但是大多數新的fortran compiler都有支援。下次有需要時不妨試試利用sleep讓程式休息一下。(茶)


外部連結:

SYSTEM_CLOCK(COUNT, COUNT_RATE, COUNT_MAX)
SLEEP(Seconds)
http://en.wikipedia.org/wiki/Orders_of_magnitude_(time)


創作者介紹
創作者 latinboy 的頭像
latinboy

阿賢的部落格

latinboy 發表在 痞客邦 留言(1) 人氣()


留言列表 (1)

發表留言
  • Yu-Chin Tzeng
  • 感謝