2011-08-03 7 views
0

私は経過時間(壁の時間)がユーザ+カーネルの時間よりも短い状況について尋ねるスレッドがたくさんあることを知り、マルチスレッドがこのような状況を引き起こす可能性があることを理解しています。経由して、いくつかのMPIコードの実行タイミングただし、:ユーザー+カーネルの時間を大幅に超える経過時間の理由は何ですか?

./a.out

$時間のmpirun -n 4 Iは、約40のユーザー時間を4-5分の範囲の経過時間を見ています秒、カーネル時間は約40秒です。私は、プロセス間のバリア同期が原因になっている可能性があると思っています。あるいは単一のMPIプロセスに関する情報を取得するだけの時間かもしれませんが、読んでいる原因を正確に合理化することはできません。誰もそれを説明できますか?

ありがとうございました。

+0

スリープ時間は、ユーザー時間もカーネル時間も含まれません。スレッドは、ディスク上で待ってスリープすることができます、ネットワーク上で待って、パイプで待って、mutexで待って... – Nemo

答えて

3

多くのプロセスでは、ウォールクロックの時間がCPU時間を大幅に超えることが予想されます。いくつかのプロセスがCPUにバインドされているので、多くの時間を費やすことになります。幸いにも、待ち時間はもうプロセスに課金されません。待機を引き起こすもの:

  • 任意のI/O(ディスク、ネットワーク、プロセスパイプなど)。
  • プロセス間のリソース同期。
  • 他のプロセスに割り当てられたタイムスライス。
  • メモリスワップ(これらの日は一般的ではありません)。
  • 他の種類の割り込みはかなりうまくいきます。

CPU使用率が壁時計の時間よりも少なくなるようなI/Oを行う統計ソフトウェアもあります。

極端な例として、大きなファイルをディスク上のあるパーティションから同じディスク上の別のパーティションにコピーする方法があります。これは、ほとんどのCPU時間でウォールタイムを多く取ることができます。 ioniceを使用する能力があれば、ディスクが他の作業で忙しくても壁時間をさらに長くすることができます。

次のコマンドは、実際の時刻(壁時計)がユーザーとsys時刻を合わせた時刻よりもかなり長く表示される可能性があります。

time bash -c "read ans" 
1

ユーザ/カーネル時間は、プロセッサが使用中の場合にのみ増加します。あなたのコードがディスクやネットワークIOのようなものを待っている場合、実際の経過時間はCPU時間よりもはるかに長くなります。

関連する問題