-Fortran- 処理時間を計測する cpu_time

処理時刻を知る組み込み関数として,組み込み関数"cpu_time"を用いることができます.
"cpu_time"は,Fortran90では一部の処理系のみで使用可能で,Fortran95では標準として組み込まれています.
この"cpu_time"を用いて処理作業を挟む2箇所で時間カウンタ(引数)を取り,両カウンタの差から処理時間を秒単位で評価することができます."cpu_time"を用いるには,

 call cpu_time(time)

で呼び出します.ここに,"time"は実数型の引数で,"intent(out)"の属性を持ちます.
意味のある時間を返せない場合は,負値が帰ってきます.プログラム例を以下に,示します.

 
program cpu_time
  implicit none
  real(8):: t1, t2, t_req
  call cpu_time(t1)
!
! arithmetic processing
!
  call cpu_time(t2)
    t_req = t2 - t1 !time required
    write(*,*) 'Time required in sec = ', t_req
end program cpu_time
 
このプログラムを"cpu_time.f90"という名前でコンパイル,実行すると以下のようになります.
$ gfortran cpu_time.f90
$ ./a.out
 Time required in sec =    2.9999999999995308E-006
このプログラムでは,演算処理部分が空なので,"cpu_time(t1)"と"cpu_time(t2)"の間の時間は"2.9999999999995308E-006 (s)"となっています.
演算処理部分に以下のように記述したプログラムを"cpu_time2.f90"という名前で保存します.
 
program cpu_time2
  implicit none
  real(8):: t1, t2, t_req
  integer i, a, b, c
  a = 2
  b = 1
 
  call cpu_time(t1)
 
    write(*,*) 'n = ', b, b
    write(*,*) 'n = ', a, a
 
    do i =3, 100000
      c = a + b
      write(*,*) 'n = ', i, c
      b = a
      a = c
    end do
 
  call cpu_time(t2)
 
    t_req = t2 - t1 !time required
    write(*,*) 'Time required in sec = ', t_req
end program cpu_time2
 
コンパイル実行すると以下のようになります.
$ gfortran cpu_time2.f90
$ ./a.out
 n =            1           1
 
 n =            2           2
………………………………………………………………………………………………………………………
abridgement
………………………………………………………………………………………………………………………
 n =        99999   873876091
 n =       100000   679394397
 Time required in sec =   0.31460899999999997     
 
この実行例を見ると,"cpu_time(t1)"と"cpu_time(t2)"の間の時間は"0.31460899999999997(s)"となっており,先の結果に比べて時間がかかっていることがわかります.