マルチスレッド ルーチンを呼び出す Fortran 90 プログラムがあります。呼び出しルーチンからこのプログラムの時間を測定したいと思います。を使用するcpu_time()と、プログラムの実行に実際にかかる時間ではなく、すべてのスレッド (私の場合は 8 つ) を合計した cpu_time が得られます。etime()ルーチンも同じようです。このプログラムの時間を計る方法について (ストップウォッチを使用せずに) アイデアはありますか?
2 に答える
試してみてくださいomp_get_wtime(); 署名については、 http: //gcc.gnu.org/onlinedocs/libgomp/omp_005fget_005fwtime.htmlを参照してください。
これが 1 回限りのことである場合、私は larsmans に同意します。gprof やその他のプロファイリングを使用することがおそらく最善の方法です。しかし、計算のさまざまなフェーズのタイミングを計るために、コードに粗いタイマーを含めると非常に便利であることにも同意します。あなたが持っている最良のタイミング情報は、実際に使用するものであり、コードを実行するたびに出力されるものに勝るものはありません。
Jeremia Wilcock の指摘omp_get_wtime()は非常に役に立ちます。標準に準拠しているため、任意の OpenMP コンパイラで動作するはずですが、実行している内容によっては、2 番目の解像度しかありません。 編集; 上記は完全に間違っていました。
Fortran90 はsystem_clock()、標準準拠のコンパイラでも使用できるものを定義します。標準は時間分解能を指定していませんが、gfortran はミリ秒のようで、ifort はマイクロ秒のようです。私は通常、次のようなもので使用します。
subroutine tick(t)
integer, intent(OUT) :: t
call system_clock(t)
end subroutine tick
! returns time in seconds from now to time described by t
real function tock(t)
integer, intent(in) :: t
integer :: now, clock_rate
call system_clock(now,clock_rate)
tock = real(now - t)/real(clock_rate)
end function tock
そしてそれらを使用して:
call tick(calc)
! do big calculation
calctime = tock(calc)
print *,'Timing summary'
print *,'Calc: ', calctime