2

20 個のコアとハイパースレッディングが有効になっている Linux クラスターのノードで Matlab R2014a を実行しています。これは以前に議論されたことを知っていますが、明確化を求めています。Matlabのスレッドとコアの問題についての私の理解は次のとおりです。

  • Matlab には固有のマルチスレッド機能があり、マルチコア マシンで追加のコアを利用します。
  • Matlab は、複数の Matlab スレッドを同じコア (つまり、ハイパースレッディング) に置くことが役に立たないような方法でスレッドを実行します。デフォルトでは、Matlab が作成するスレッドの最大数は、システムのコア数です。
  • parpool() を使用する場合、作成するワーカーの数に関係なく、このスレッドで説明されているように、各ワーカーは 1 つの物理コアのみを使用します。

ただし、(非推奨の) 関数 maxNumCompThreads() を使用すると、Matlab またはワーカーの 1 つが生成するスレッドの数を増減できることも読みました。これは、いくつかのシナリオで役立ちます。

  1. Matlab の暗黙的なマルチスレッド機能を利用して、ノード全体を割り当てることなく、クラスター ノードでコードを実行したいと考えています。maxNumCompThreads が削除された場合に、これを行う別の方法があればいいのですが。
  2. パラメータ スイープを実行したいが、マシンのコア数よりもパラメータが少ない。この場合、すべてのコアが利用されるように、ワーカーあたりのスレッド数を増やすことができます。これは、このスレッドで最近提案されました. ただし、私の経験では、個々のワーカーは maxNumCompThreads() を使用してスレッド数を増やすことに非常に満足しているように見えますが、「top」コマンドを使用して実際の CPU 使用率を調べると、効果がないことが示唆されます。コアを 1 つ使用します。parpool によって生成された個々の Matlab プロセスが引数 -singleCompThread で実行されている可能性があります。親の Matlab プロセスが -singleCompThread で実行されている場合、コマンド maxNumCompThreads(n) (n > 1) は、Matlab がシングル スレッド モードで実行されているため、エラーをスローすることを確認しました。その結果、(少なくとも 2014a では) 並列プール ワーカーの計算スレッドの数を増やすことはできないようです。これに関連して、私はできる」コンピューター自体でハイパースレッディングが有効になっているにもかかわらず、親の matlab プロセスがコアよりも多くのスレッドを開始するように見えます。繰り返しになりますが、maxNumCompThreads(n) (n > # 物理コア) は問題なく実行されますが、top が CPU 使用率を 50% と示しているという事実は、そうでないことを示唆しています。それで、何が起こっているのですか、それとも私は何を誤解していますか?

編集:私の質問をより明確にレイアウトするには:

  1. parfor ループ内で、n > 1 が機能しているように見えるのに、maxNumCompThreads(n) を設定しないのはなぜですか? ワーカー プロセスが -singleCompThread で開始されたことが原因である場合、-singleCompThread で開始された親プロセスの場合のように maxNumCompThreads() がエラーを返さないのはなぜですか?
  2. 親プロセスで、maxNumCompThreads(n) (n > # 物理コア) を使用しないのはなぜですか?

注: 以前に Matlab の回答に投稿しましたが、フィードバックを受け取っていません。

Edit2: (1) の問題は、使用していたテスト コードの問題のようです。

4

3 に答える 3

1

まず、理解を確認するためのいくつかの簡単なテストを行います。

> matlab.exe -singleCompThread

>> warning('off', 'MATLAB:maxNumCompThreads:Deprecated')
>> maxNumCompThreads
ans =
     1
>> maxNumCompThreads(2)
Error using feature
MATLAB has computational multithreading disabled.
To enable multithreading please restart MATLAB without singleCompThread option.
Error in maxNumCompThreadsHelper (line 37)

Error in maxNumCompThreads (line 27)
lastn = maxNumCompThreadsHelper(varargin{:}); 

示されているように、オプションを使用して MATLAB を起動すると、-singleCompThreadを使用してオーバーライドすることはできませんmaxNumCompThreads

> matlab.exe

>> parpool(2);    % local pool
>> spmd, n = maxNumCompThreads, end
Lab 1: 
  n =
       1
Lab 2: 
  n =
       1

デフォルトでは、各ワーカーは 1 つの計算スレッドに制限されていることがわかります。実行しようとするスレッドの数が利用可能な物理/論理コアの数を超えたときに発生する、オーバーサブスクリプションと不要なコンテキスト スイッチを回避したいので、これは良いことです。したがって、理論的には、CPU 使用率を最大化する最善の方法は、コアと同じ数のシングルスレッド ワーカーを開始することです。

いいえ、バックグラウンドで実行されているローカル ワーカー プロセスを見ると、それぞれが次のように起動されていることがわかります。

matlab.exe -dmlworker -noFigureWindows [...]

文書化されていない-dmlworkerオプションは と似たようなことをすると思います-singleCompThreadが、おそらく少し異なります。maxNumCompThreads(2)1つには、以前のようにエラーをスローすることなく、それを使用してオーバーライドすることができました..

MATLAB セッションがシングル スレッド計算モードで実行されている場合でも、計算スレッドが 1 つの CPU コアのみに排他的に制限されているわけではありません (スレッドは、OS スケジューラによって割り当てられたコア間をジャンプする可能性があります)。それを制御したい場合は、ワーカー プロセスのアフィニティを設定する必要があります。


そこで、Intel VTune Amplifier を使用してプロファイリングを行いました。基本的に、いくつかの線形代数コードを実行し、MATLAB プロセスにアタッチしてmkl.dllモジュールをフィルター処理することにより、ホットスポット分析を実行しました (これは、MATLAB が最適化された BLAS/LAPACK 実装として使用するインテル® MKL ライブラリーです)。ここに私の結果があります:

- シリアルモード

次のコードを使用しました。eig(rand(500));

  • MATLAB を正常に起動すると、計算によって 4 つのスレッドが生成されます (クアッドコア i7 Intel CPU を使用しているため、これが選択されたデフォルトの自動値です)。
  • MATLAB を正常に起動しますがmaxNumCompThreads(1)、計算の前に呼び出します。予想どおり、計算で使用されるスレッドは 1 つだけです。
  • オプションでMATLAB を起動すると-singleCompThread、ここでも 1 つのスレッドのみが使用されます。

- パラレルモード ( parpool)

次のコードを使用しました: parpool(2); spmd, eig(rand(500)); end. 以下のどちらの場合も、MATLAB は正常に起動します。

  • デフォルト設定のワーカーでコードを実行すると、各ワーカーは 1 つの計算スレッドに制限されます
  • を使用してワーカーの設定をオーバーライドするmaxNumCompThreads(2)と、各ワーカーは 2 つのスレッドを使用します

以下は、VTune が報告する内容のスクリーンショットです。

vtune_hotspot_analysis

それがあなたの質問に答えることを願っています:)

于 2014-10-13T18:32:47.920 に答える
1

maxNumCompThreadsparpool ワーカーに取り組んでいないというのは間違っていました。問題は、私が使用していたコードだったようです:

parfor j = 1:2
  tic
      maxNumCompThreads(2);
      workersCompThreads(j) = maxNumCompThreads;
      i = 1;
      while toc < 200
          a = randn(10^i)*randn(10^i);
          i = i + 1;
      end
end

CPU 使用率をチェックするまでに大量のメモリを使用していたため、ボトルネックは I/O であり、余分なスレッドは既にシャットダウンされていました。私が次のことをしたとき:

parfor j = 1:2
  tic
      maxNumCompThreads(2);
      workersCompThreads(j) = maxNumCompThreads;
      i = 4;
      while toc < 200
          a = randn(10^i)*randn(10^i);
      end
end

余分なスレッドが開始され、実行され続けました。

2 番目の問題については、Mathworks から、親の Matlab プロセスが物理コアの数を超えて明示的に制限を上げても、それ以上のスレッドを開始しないという確認を得ました。したがって、ドキュメントでは、次の文:

「現在、計算スレッドの最大数は、マシンの計算コアの数と同じです。」

言うべきです:

「現在、計算スレッドの最大数は、マシンの物理コアの数と同じです。」

于 2014-10-16T23:58:13.383 に答える