2016-11-14 17 views
1

私はいくつかのFortranコードの性能を測定しようとしていますが、現在はETIMEを使用しています(基本的にはドキュメントの例と同じです)。ただし、TIMEの値はリアルタイムで計測されないようです(UNIXユーティリティtimeの「実際の」出力と一致しません)。ETIMEとCPU_TIMEの関係は何ですか?

CPU_TIMEは、プログラムの実際の実行時間のより良い尺度ですか?私はTIMEからETIMEまではユーザーとシステム時間の合計を与えると考えていたので、リアルタイムで同じか近い(またはCPU_TIME)でしょうか?

コードは子プロセスをフォークしません。

マニュアルの例に基づいて、以下に相当するコードです。 time ./programで実行してください)。

実際のコードはディスクに書き込まれ、いくつかの個々のプロセスが同時に実行されている場合はリアルタイム(timeによって報告される)が上がります。ただし、ETIMEでもCPU_TIMEでも変化は検出されません。

timeから実際に報告された時間は、ETIMEまたはCPU_TIMEによって報告された時間の2倍までである可能性があります。

program test_etime 
    integer(8) :: i, j 
    real, dimension(2) :: tarray 
    real :: result 
    real :: start, finish 

    ! 
    ! Comment out relevant part 
    ! 

    print *, "TESTING ETIME" 
    call ETIME(tarray, result) 
    print *, result 
    print *, tarray(1) 
    print *, tarray(2) 
    do i=1,100000000 ! Just a delay 
     j = i * i - i 
    end do 
    call ETIME(tarray, result) 
    print *, result 
    print *, tarray(1) 
    print *, tarray(2) 


    !print *, "TESTING CPU_TIME" 

    !call cpu_time(start) 
    !do i=1,100000000 ! Just a delay 
    ! j = i * i - i 
    !end do 
    !call cpu_time(finish) 
    !print '("Time = ",f6.3," seconds.")',finish-start 

    end program test_etime 

(最後の1にこっそり;?なぜCALL ETIME (...)構文が推奨されます)

+0

例を挙げることができますか。有効な最小限のプログラム、UNIXの 'time'から取得したタイミング、' ETIME'コールからの出力これは、あなたのタイミングが2つの方法の間でどのように異なるかを人々に知ってもらうでしょう。 –

+0

ディスクを使っていくつかのプロセスを同時に実行し、報告された 'real'時間と実際には一致しないものを実際に生成するため、小さな問題を書くのは難しいです。私が望むのは 'SYSTEM_CLOCK'だと思っていますが、私は何とか' ETIME'の 'TIME'から得たものと期待していました。 – gauteh

+0

あなたの例を実行すると、ETIMEが '0.7029s 'という報告をしていますが、時間は' real:0.713s;ユーザ:0.702秒; sys:0.002s'となります。したがって、 'user'と' sys'を合計すると、ETIMEが報告するものにちょっとしたものが得られます。リアルタイムはユーザーとsysの合計と等しくないことに注意してください。これは、プロセスのCPU使用率が100%未満であることを示します。これは、プロセスがI/Oを待っている場合におそらく発生する可能性があります。 –

答えて

0

これはちょうどETIMEにストレスなく、ここ数回の治療Beanを持っています。

標準FortranはETIMEを認識しません。それはあなたのコンパイラによって提供される拡張であり、コンパイラのマニュアルを読み、それが何であるかを調べる必要があります。コンパイラによって異なる可能性があります。

マニュアルでは、ETIMEがgfortranに対して何をしているかを明確に述べています。問題があると思われる場合は、最初に結果を示す必要があります。

CPU_TIMEは、すべてのスレッドに費やされたCPU時間の合計であるCPU時間を測定します。これは、並列プログラムのためにプログラムを実行するのに費やされたリアルタイムよりも数倍多くなることがあります。

ウォールクロック時間の測定には、標準SYSTEM_CLOCK()を使用してください。 OpenMPとMPIを使用している場合は、代わりにomp_get_wtime()MPI_Wtime()を好む人もいます。結果は、測定の不確かさまで同一でなければならない。

OSとは少し差があるかもしれませんが、real時間は当然です!それが測定するのは、プログラム内の2つのポイント間に費やされる壁時計の時間です。コードが実行される前とコードの実行が開始されるまでに時間がかかることを忘れないでください。実行されたプログラム実行の初期化と終了があります。


コールETIMEはなぜ推奨されますか?誰が確かに知っているが、不純な機能はうまくいきません。関数は理想的には同じ入力に対して同じ答えを返さなければなりません。そして、これは明らかにそうではありません。

擬似乱数発生器には非常に類似した問題があります。実際には関数ではなくサブルーチンでなければなりません。

+0

関数がコンパイラ固有であるという理由だけでは、fortranとは無関係ではありません。コンパイラはfortranプログラムを作成する上で不可欠な要素です。 'ETIME'の' TIME'の出力は 'time' UNIXユーティリティから報告された' real'フィールドと一致しません。 – gauteh

+0

私はそれがFortranに無関係ではないと言いました。私は結果を示すべきだと言いました。彼らはどこにいる? –

+0

あなたの段落のいくつかは、Fortranの標準が何をしているのかを述べていますが、これは無関係です。複数のプロセスを同時に実行してディスクに書き込む前に問題が発生しないため、結果を表示することは容易ではありません。同様の理由から、簡単なサンプルプログラムを作ることは容易ではありません。ご承知のとおり、おそらくSYSTEM_CLOCKが必要です。 – gauteh

関連する問題