0

MPI で並列行列 - 行列乗算器に取り組んでいます。計算部分は動作していますが、CPU 時間も計算したいと考えています。一部のプロセスが開始時刻と終了時刻を 0 と報告しているように見え、1 秒未満のタスク (小さな行列) の場合、プログラムは 1000 秒以上の CPU 時間を報告しているため (実行されていることはわかっていますが)、スタックしています。観測から 1 秒以内)。これが私が現在行っていることです:

#include <time.h>
#include "mpi.h"
// other includes
int main()
{
    int start, end, min_start, min_end;
    if (rank == 0)
    {
        // setup stuff

        start = clock();
        MPI_Reduce(&min_start, &start, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);

        // master computation stuff

        end = clock();
        MPI_Reduce(&max_end, &end, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);

        cout << "CPU time was " 
             << (double)(max_end - min_start) / CLOCKS_PER_SEC 
             << " seconds" << endl;
    }   
    else if (rank != 0)
    {
        // setup stuff

        start = clock();
        MPI_Reduce(&min_start, &start, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);

        // slave computation stuff

        end = clock();
        MPI_Reduce(&max_end, &end, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
    }
}

エラーの原因がわかりません。このデバッグ出力を追加したとき ( if (rank == 0)andelse if (rank != 0)ステートメントの後)

MPI_Barrier(MPI_COMM_WORLD);
for (int i=0; i<size; i++)
{
    if (rank == i)
        cout << "(" << i << ") CPU time = " 
             << end << " - " << start 
             << " = " << end - start << endl;
    MPI_Barrier(MPI_COMM_WORLD);
}

次の出力が得られます

CPU time was 1627.91 seconds
(1) CPU time = 0 - 0 = 0
(2) CPU time = 0 - 0 = 0
(0) CPU time = 1627938704 - 32637 = 1627906067
(3) CPU time = 10000 - 0 = 10000
4

1 に答える 1

1

まず、man 3 clock「clock() 関数は、プログラムが使用するプロセッサ時間の概算を返す」と述べています。したがって、時間を決定するために差を計算する必要はありません。この誤解がエラーの原因です。集中的な計算の後に呼び出す必要があり、 によって消費される時間を無視しsetup stuffます。

セットアップ時間を考慮したくない場合は、その違いが本当に必要です。したがって、過去の一定の瞬間から正確な秒数を取得するシンプルで堅牢なMPI_Wtime関数を使用するだけです。

最大終了時間から最小開始時間を引いて得られる値は、一般に受け入れられている用語 (つまり、timeユーティリティの観点) での全体的な CPU 時間ではありません。その時がreal時間です。実際に CPU 時間を取得するには、すべての処理時間を合計する必要があります。つまりMPI_Reduce、時間差のある呼び出しとMPI_SUM操作です。

于 2016-04-06T10:55:18.507 に答える