私は .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 プログラムで時間を測定するために使用できる他のタイミング関数を提案していただけますか?
ありがとう。
ベストアンサー1
私の考えでは、clock() 関数は各スレッドの個々の時間を計算し、それらを合計して表示しているようです。
これはその通りこれclock()
は、プロセスによって使用された CPU 時間を測定します。少なくとも Linux と Mac OS X では、プロセスが開始されてからプロセス内に存在したすべてのスレッドの累積 CPU 時間を意味します。
OpenMP アプリケーションの実クロック (別名ウォールクロック) タイミングは、過去の任意の時点からの秒数omp_get_wtime()
を返す高解像度の OpenMP タイマー呼び出しを使用して行う必要があります。これは移植可能な関数で、たとえば、Unix のみのdouble
とは異なり、Unix と Windows の両方の OpenMP ランタイムに存在します。gettimeofday()