私は.cppコードを(i)シーケンシャルスタイルで実行しており、(ii)OpenMPステートメントを使用しています。時差を見ようとしています。時間を計算するために、私はこれを使用します:
#include <time.h>
.....
main()
{
clock_t start, finish;
start = clock();
.
.
.
finish = clock();
processing time = (double(finish-start)/CLOCKS_PER_SEC);
}
時間は、コードの順次実行(上記)でかなり正確です。これを実行するには、約8秒かかります。コードにOpenMPステートメントを挿入し、その後時間を計算すると、時間の短縮が得られますが、コンソールに表示される時間は約8〜9秒ですが、実際には3〜4秒です。
これが私のコードが抽象的に見える方法です:
#include <time.h>
.....
main()
{
clock_t start, finish;
start = clock();
.
.
#pragma omp parallel for
for( ... )
for( ... )
for (...)
{
...;
}
.
.
finish = clock();
processing time = (double(finish-start)/CLOCKS_PER_SEC);
}
上記のコードを実行すると、時間は短縮されますが、表示される時間はリアルタイムでは正確ではありません。 clock()関数が各スレッドの個々の時間を計算し、それらを合計して表示しているように見えます。
誰かがこの理由を教えたり、OpenMPプログラムで時間を測定するために使用する他のタイミング関数を私に提案したりできますか?
ありがとう。
リアルタイムではなく、CPU時間を報告するclock()を見ました。
あなたは使うことができます
struct timeval start, end;
gettimeofday(&start, NULL);
// benchmark code
gettimeofday(&end, NULL);
delta = ((end.tv_sec - start.tv_sec) * 1000000u +
end.tv_usec - start.tv_usec) / 1.e6;
代わりに時間を計る
Clock()関数が各スレッドの個々の時間を計算し、それらを合計して表示しているように見えます。
これはexactlyclock()
が行うこと-プロセスが使用するCPU時間を測定します。これは、少なくともLinuxおよびMac OS Xでは、これまでに実行されたすべてのスレッドの累積CPU時間を意味します開始以来、プロセスに存在していました。
OpenMPアプリケーションのリアルタイム(別名:壁時計)タイミングは、高解像度のOpenMPタイマー呼び出しomp_get_wtime()
を使用して実行する必要があります。これは、任意のポイントからの秒数のdouble
値を返します過去。これは、ポータブル機能です。 Unixのみであるgettimeofday()
とは異なり、UnixとWindowsの両方のOpenMPランタイムに存在します。
そうですね、それがclock()
が行うことになっていることです。プログラムが使用したプロセッサ時間を教えてください。
CPU時間の代わりに経過したリアルタイムを検索する場合は、gettimeofday()
などの実時間を返す関数を使用します。
#include "ctime"
std::time_t start, end;
long delta = 0;
start = std::time(NULL);
// do your code here
end = std::time(NULL);
delta = end - start;
// output delta