1

いくつかのFortran対Cコードのパフォーマンスを比較するために、いくつかのタイミングを実行する必要があります。CIでは、ユーザー時間とシステム時間の両方を個別に取得できます。

gFortranを使用する場合、cpu_time()それは何を表しますか?

IBMのFortranコンパイラーでは、環境変数を設定することで何を出力するかを選択できます( CPU_TIME()を参照) 。gFortranのドキュメントに類似したものへの参照は見つかりませんでした。

それで、gFortranのcpu_time()がユーザー時間、システム時間、または両方の合計を返すかどうかを誰かが知っていますか?

4

4 に答える 4

2

Gfortran CPU_TIME は、ユーザー時間とシステム時間の合計を返します。

MINGW では GetProcessTimes() を使用し、他のプラットフォームでは getrusage() を使用するか、getrusage() が使用できない場合は times() を使用します。

見る

http://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgfortran/intrinsics/cpu_time.c;h=619f8d25246409e0f32c96299db724213aa62b45;hb=refs/heads/master

http://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgfortran/intrinsics/time_1.h;h=12d79ebc12fecf52baa0895c7ab8accc41dab500;hb=refs/heads/master

実のところ、CPU 時間ではなくウォールクロック時間を測定したい場合は、CPU_TIME の代わりに SYSTEM_CLOCK 組み込み関数を使用してください。

于 2011-03-15T20:24:19.040 に答える
1

ウォールクロック時間が必要な場合はdate_and_time、 http: //gcc.gnu.org/onlinedocs/gcc-4.0.2/gfortran/DATE_005fAND_005fTIME.htmlを使用できます。

それがどれほど標準的かはわかりませんが、私の経験では、エキゾチックな Cray デザインを含め、少なくとも 4 つの異なるプラットフォームで動作します。

ここでの落とし穴の 1 つは、次のように真夜中を処理することです。

character*8  :: date            
character*10 :: time
character*5  :: zone
integer :: tvalues(8)
real*8 :: time_prev, time_curr, time_elapsed, time_limit

integer :: hr_curr, hr_prev

! set the clock
call date_and_time(date, time, zone, tvalues)

time_curr = tvalues(5)*3600.d0 + tvalues(6)*60.d0 + tvalues(7)  ! seconds 
hr_curr = tvalues(5)
time_prev=0.d0; time_elapsed = 0.d0; hr_prev = 0

!... do something...

time_prev = time_curr; hr_prev = hr_curr
call date_and_time(date, time, zone, tvalues)
time_curr = tvalues(5)*3600.d0 + tvalues(6)*60.d0 + tvalues(7)  ! seconds 
hr_curr = tvalues(5)
dt = time_curr - time_prev
if( hr_curr < hr_prev )dt = dt + 24*3600.d0   ! across the midnight

time_elapsed = time_elapsed + dt
于 2011-03-15T18:40:24.253 に答える
1

私の推測: ユーザー時間とシステム時間の合計、それ以外の場合は言及されますか? とにかくOSに依存する可能性があり、すべてが区別されるわけではありません。私の知る限り、CPU時間は、プロセスに代わって実行されるユーザーモードまたはカーネルモードで、OSがプロセスに割り当てる時間です。

その区別をすることはあなたにとって重要ですか?

パフォーマンスを比較するために、私はおそらく壁の時間に行き、壁の時間からそれを差し引いて、CPU 時間を使用してどれだけの I/O を行っているかを推測します。

于 2011-03-15T16:09:27.890 に答える
0

@Emanual Ey - @steabert の投稿へのコメントの続きです (Intel の場合は次のとおりです。他のコンパイラで何かが異なるかどうかはわかりません)。ユーザーの CPU 時間 + システムの CPU 時間は、CPU 時間と等しくなければなりません。経過時間、実際の時間、または「ウォール クロック」時間は、充電された CPU 時間の合計より大きくなければなりません。壁時計の時間を測定するには、難しい部分の前後に時間コマンドを配置するのが最善です。うーん、これを必要以上に複雑にするつもりです。Intel のマニュアル ページのアプリケーションのタイミングに関する部分をお読みいただけますか (インデックスで「アプリケーションのタイミング」を見つける必要があります)。いくつかのことをクリアする必要があります。

前に言ったように、それはインテルにも当てはまります。gfortran のコンパイラにアクセスできません。

于 2011-03-15T18:38:56.433 に答える