並列化計算では、CPUコアは各カーネルにどのように分散されますか?

Aug 16 2020

質問する前に、私が正しく理解していることを確認したいだけです。Mathematicaの一部の関数は自動的にマルチコアを使用すると言う人がいます(並列化する関数ではなくNIntegrate、のような関数を参照しています)。したがって、コアが2つあると、シングルよりも高速になると思います。芯。だから私の質問は私が次のようなコードを持っているかどうかです:ParallelTable[NIntegrate[x, {x, 1, 3}], {loop, 1, 3}]

3つのカーネルが発売されると思います。4つのコアがある場合、これらの4つのコアは各カーネルにどのように分散されますか?(各カーネルは関数統合の特性に基づいてマルチコアを使用できると思うので)

回答

4 AndreasLauschke Aug 16 2020 at 23:03

ようこそnoo-b、m.seはMについて無限に学ぶための素晴らしいコミュニティです!

私はあなたがいくつかの誤った仮定を持っていると思います:

まず、シングルスレッド操作でも複数のコアにスレッド化できます。優れたオペレーティングシステムはそれを回避しようとしますが、毎秒、別のコアに切り替わったり、負荷を複数のコアに分割したりする場合があります。ただし、後者は通常、長時間ではありません。

次に、NIntegrateがすべての入力に対して常に並列化されると想定することはできません。特に、NIntegrateが計算時間全体にわたって並列化されると想定することはできません。初期化のみ、終了時、またはその間の選択されたタスクで並列化できます。例えば、

Do[Do[NIntegrate[x,{x,1,3}],{3}],{100000}]

コア使用率を見ると(単純なタスクマネージャーのようにプロセス使用率ではありません)-Linuxを使用している場合は、トップを実行して1を押すことができます-これは99%の時間を費やしていることがわかります1つのコア。しばらくするとコアが切り替わる場合がありますが、そのコアの99%が表示さます。そのため、少なくとも常にではなく(おそらく数分の1秒の間)、複数のコアにNIntegrateがスレッド化されていることはまったくわかりません。これは、NIntegrate入力ごとに異なる場合がありますが、この単純な例は、NIntegrateが常に並列化されるとは限らず、計算の全期間にわたってではないことを示しています。

M並列処理フレームワークでは、これは変更されません。実際にはオペレーティングシステムの問題です。ParallelTable(および同業者)を使用すると、より多くのプロセスから処理タスクを提供するだけであり、o / sがそれをコアにスケジュールする方法は完全にo / s次第です。したがって、並列プロセスの理解からコアへの割り当てを実際に「取り消す」ことはできません。

やや接線:

Scala、Java、C#(または他の多くの言語)では、スレッドレベルでタスクをスケジュールできます。しかし、それでも、コアへのトレッドをスケジュールするのはo / s次第です。Javaのvmstatを使用すると、スレッドのすばらしい視覚化が得られます(時間の経過とともに成長する水平バー、スレッドごとに1つ)。本当に興味があるのは、スレッドがコアに割り当てられる方法ではなく、スレッド内でどのように機能するかです。 。とはいえ、スレッドはハードウェアの概念ではなくソフトウェアの概念であり、コアはスレッドが何であるかを知りません。しかし、スレッド分析は、コアへの割り当てとしての並行性、コアスイッチング、およびすべてのコアのワークロードの割合を完全にo / sまで理解することをより理解するのに役立つと思います。

4 Szabolcs Aug 16 2020 at 23:51

複数のコアを自動的に使用する機能がいくつかあります。使用するコアの数は、のいくつかの設定によって決まりますSystemOptions["ParallelOptions"]

サブカーネルでこのような関数を使用する場合、それらは単一のコアのみを使用します。これは、を見て確認できParallelEvaluate@SystemOptions["ParallelOptions"]ます。サブカーネルでは、すべてのスレッド数が1に設定されていることに注意してください。

一般に、明示的な並列化(などParallelTable)は、一部の関数の組み込み並列化ほど効率的ではありません。したがって、ボトルネックがすでに並列で実行されている関数である場合、ParallelTableまたは関連する関数を使用して追加の並列化を実装すると、処理が遅くなります(または、少なくとも、私がチェックしたすべての場合に遅くなりました)。