2016-04-06 16 views
0

私はMPIの並列行列 - 行列乗算器で作業しています。私は計算部分が働いているが、私はまた、CPU時間を計算したい。いくつかのプロセスが0の開始時刻と終了時刻を報告しているように見えて、2番目(小さな行列)になるはずのタスクについては、1000 + 2番目のCPU時間が報告されているように見えます。観察から1秒未満で)。私が現在行っていることは次のとおりです。MPI使用時のCPU時間の計算

#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)else 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 
+0

まず、私は 'clock()'を全く使わないでしょう。 C++ 11で 'chrono'を使うことも、pre C++ 11でBoostの実装を使うこともできます。 –

答えて

0

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

セットアップ時間を考慮したくない場合は、実際に違いが必要です。だから、単純な頑丈なMPI_Wtime関数を使って、過去一定の瞬間から正確な秒数を取得します。

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

+0

'MPI_Wtime'はCPU時間ではなく壁の時間を与えるので、クラスタ上で他のジョブも実行している場合、報告される時間は増えます。 私の目標は、シリアル実行から並列実行へのスピードアップを計算できるようにすることです。 – RagingRoosevelt

+2

@RagingRooseveltシリアル実行からのスピードアップは、Nマシンのウォールタイムと比較して、1マシンのウォールタイムとして計算する必要があります。 CPU時間はその計算を考慮していません – NoseKnowsAll

+0

@NoseKnowsAllが言っていることに加えて、CPU時間を測定することは無用です。ほとんどのMPI実装では、ネットワーク要求を処理するために追加のスレッドが生成され、データのポーリングを実行すると、 'clock() 'によって報告されたCPU時間全体が空になります。さらに、 'clock()'は非常に移植性がありません。 Windows上でリアルタイムを返します。 –