2

プログラムの先頭と最後で、clock()を使用して、プログラムが終了するまでにかかる時間を計算します。残念ながら、報告の半分の時間がかかるようです。「time」コマンドでこれを再確認しました。

私のプログラムレポート:45.86秒で完了

時間コマンドレポート:実数0m22.837sユーザー0m45.735s sys 0m0.152s

私の携帯電話を使って時間を計ると、23秒で完了しました(別名:「リアルタイム」時間)。「ユーザー」時間はすべてのスレッドの合計であり、OpenMPを使用しているので意味があります。(ここでそれについて読むことができます:time(1)の出力で「real」、「user」、および「sys」は何を意味しますか?

では、なぜclock()は「実際の」時間ではなく「ユーザー」の時間でレポートするのでしょうか。プログラムの実行時間を計算するために使用する必要のある別の関数はありますか?

ちなみに、Windowsのclock()は期待どおりに機能し、「リアルタイム」でレポートします。

4

3 に答える 3

6

ユーザー0m45.735s

clock()7.27.2.1に従って、プロセスが使用したCPU時間を(可能な限り適切に)測定します。

clock関数は、プログラムの呼び出しにのみ関連する実装定義の時代の始まり以来、プログラムによって使用されるプロセッサ時間に対する実装の最良の近似値を返します。

実時間ではありません。したがってclock()、報告する時間に近いuser時間をtime報告することは正常であり、標準に準拠しています。

経過時間を測定するために、POSIXを想定できる場合は、使用clock_gettimeがおそらく最良のオプションであり、標準関数time()もそのために使用できますが、あまりきめ細かくはありません。

于 2012-11-12T20:56:26.153 に答える
2

clock_gettime時計に使うことをお勧めしCLOCK_MONOTONICます。

特定のシステムによっては、マイクロ秒近く以上の解像度が得られるはずです。たとえば、プログラムの実行中に誰かがシステム時間を設定した場合でも、おかしなことはできません。

于 2012-11-12T21:00:18.090 に答える
0

OpenMPアプリケーション内のベンチマークには、ポータブルOpenMPタイミング関数を使用することをお勧めします。この関数は、過去の不特定の時点からの秒数で値omp_get_wtime()を返します。doubleこれを2回呼び出し、戻り値を減算して経過時間を取得します。を呼び出すと、時間測定がどれほど正確であるかを知ることができますomp_get_wtick()doubleタイマー分解能の値を返し0.0ます。より正確なタイマーを示すために近い値です。

于 2012-11-13T13:05:45.120 に答える