2017-12-02 7 views
0

ソケットを使用してCで書かれた簡単なクライアントサーバープログラムがあります。サーバーは、要求ごとに新しいpthreadを開きます。新しい開かれたスレッドごとに、私はCPU集約的なタスク(行列の乗算)を行います。MPI:1つのMPIプロセスでプロセッサーが100%にならない

私は2つの物理コアと4つの論理プロセッサを持つCPUを持っています。

4つのクライアントを実行すると、サーバーは4つのスレッドを開き、各スレッドは論理プロセッサーに割り当てられ、CPUは100%(使用率)になります。

5秒遅れでクライアントを1つずつ実行すると、CPUが25%(クライアント1台)から50%(クライアント2台)、75%(クライアント3台)最終的に100%(4クライアント)になります。これはかなり正常な動作です。

サーバーコード全体をMPIプロセス(1つのMPIプロセス)に埋め込むと、開始するクライアントの数にかかわらずCPUは50%以上を上げません。

どうしてですか?

フリスト・イリエフがmpirunのに--bind-になしを渡して、私の質問にコメントで言ったように:

この質問/問題への公式の回答は以下の通りです丁重

+0

おそらくMPIランチャーは、実行されたバイナリのCPUセットを制限します。あなたのMPIマニュアルである 'sched_getaffinity'で確認してください。 MPIインプリメンテーション、バージョン、MPIバイナリとOSを起動する方法についての詳細は、ヘルプを参照してください。 – Zulan

+3

MPI実装がOpen MPIの場合、 '--bind-to none'を' mpiexec'/'mpirun'に渡してみてください。 。 –

+0

タスクが固定されているかどうか不明な場合は、単純に 'mpirun ... grep Cpus_allowed_list/proc/self/status' –

答えて

0

をありがとうコマンドは問題を解決します。

このオプションは、実際にはMPIプロセスを特定のオブジェクトにバインドします(詳細はthe manualを参照)。

デフォルトでは、各MPIプロセスは物理的なコアにバインドされています。私はマシンに2つのコアを持っているので、私が得ることができるCPUの最大使用率は約50%になります。

バインディングをnoneに設定すると、その制約が削除され、各MPIプロセスが論理コアにバインドされ、CPUが100%になるようになります。

関連する問題