20 個のコアとハイパースレッディングが有効になっている Linux クラスターのノードで Matlab R2014a を実行しています。これは以前に議論されたことを知っていますが、明確化を求めています。Matlabのスレッドとコアの問題についての私の理解は次のとおりです。
- Matlab には固有のマルチスレッド機能があり、マルチコア マシンで追加のコアを利用します。
- Matlab は、複数の Matlab スレッドを同じコア (つまり、ハイパースレッディング) に置くことが役に立たないような方法でスレッドを実行します。デフォルトでは、Matlab が作成するスレッドの最大数は、システムのコア数です。
- parpool() を使用する場合、作成するワーカーの数に関係なく、このスレッドで説明されているように、各ワーカーは 1 つの物理コアのみを使用します。
ただし、(非推奨の) 関数 maxNumCompThreads() を使用すると、Matlab またはワーカーの 1 つが生成するスレッドの数を増減できることも読みました。これは、いくつかのシナリオで役立ちます。
- Matlab の暗黙的なマルチスレッド機能を利用して、ノード全体を割り当てることなく、クラスター ノードでコードを実行したいと考えています。maxNumCompThreads が削除された場合に、これを行う別の方法があればいいのですが。
- パラメータ スイープを実行したいが、マシンのコア数よりもパラメータが少ない。この場合、すべてのコアが利用されるように、ワーカーあたりのスレッド数を増やすことができます。これは、このスレッドで最近提案されました. ただし、私の経験では、個々のワーカーは maxNumCompThreads() を使用してスレッド数を増やすことに非常に満足しているように見えますが、「top」コマンドを使用して実際の CPU 使用率を調べると、効果がないことが示唆されます。コアを 1 つ使用します。parpool によって生成された個々の Matlab プロセスが引数 -singleCompThread で実行されている可能性があります。親の Matlab プロセスが -singleCompThread で実行されている場合、コマンド maxNumCompThreads(n) (n > 1) は、Matlab がシングル スレッド モードで実行されているため、エラーをスローすることを確認しました。その結果、(少なくとも 2014a では) 並列プール ワーカーの計算スレッドの数を増やすことはできないようです。これに関連して、私はできる」コンピューター自体でハイパースレッディングが有効になっているにもかかわらず、親の matlab プロセスがコアよりも多くのスレッドを開始するように見えます。繰り返しになりますが、maxNumCompThreads(n) (n > # 物理コア) は問題なく実行されますが、top が CPU 使用率を 50% と示しているという事実は、そうでないことを示唆しています。それで、何が起こっているのですか、それとも私は何を誤解していますか?
編集:私の質問をより明確にレイアウトするには:
- parfor ループ内で、n > 1 が機能しているように見えるのに、maxNumCompThreads(n) を設定しないのはなぜですか? ワーカー プロセスが -singleCompThread で開始されたことが原因である場合、-singleCompThread で開始された親プロセスの場合のように maxNumCompThreads() がエラーを返さないのはなぜですか?
- 親プロセスで、maxNumCompThreads(n) (n > # 物理コア) を使用しないのはなぜですか?
注: 以前に Matlab の回答に投稿しましたが、フィードバックを受け取っていません。
Edit2: (1) の問題は、使用していたテスト コードの問題のようです。