Python3.7でマルチプロセッシングを使用しています
いくつかの記事は、プールで使用するプロセスの数のためのかなりの数は、CPUコアの数であると言います。
私のAMDRyzen CPUは8コアで、16スレッドを実行できます。
では、プロセスの数は8または16にする必要がありますか?
import multiprocessing as mp
pool = mp.Pool( processes = 16 ) # since 16 threads are supported?
Q:「では、プロセスの数は8または16にする必要がありますか?」
したがって、サブプロセスの分散ワークロードの群れがキャッシュの再利用を集中的に行う場合(メモリI / Oではない)、SpaceDOMAIN
キャッシュ可能なデータのサイズが8または16のどちらであるかを決定する際に重要な役割を果たすため、-constraintsルール。
どうして ?
メモリI / Oのコストは、キャッシュ内のデータの場合と比較して、メモリI / OごとTimeDOMAIN
に約1000倍高価であるため、3xx - 4xx [ns]
0.1 ~ 0.4 [ns]
決定を下す方法は?
実稼働規模の構成を決定する前に、小規模なテストを行います。
したがって、分散されるワークロードの群れがネットワークI / O、またはその他の注目に値する(ローカルで非特異的な)レイテンシーのソースであるTimeDOMAIN
場合、16、160、または単にレイテンシーマスキングトリックを実行することでメリットが得られる可能性があります。 1600スレッド(この場合はプロセスではありません)。
どうして ?
ネットワーク上I / Oを実行するコストは非常に多くの待機時間を提供するため([ms]
ネットワークI / O RTT遅延のいくつかは、1E7 ~ 10.000.000
CPUコアuop-sごとに実行するのに十分な時間です。これはかなりの時間です。したがって、プロセス全体のスマートインターリーブも、ここでもレイテンシマスクされたスレッドベースの同時処理を使用するのが適している可能性があります(ネットワーク経由のI / Oからのリモート「応答」を待機しているスレッドとして)予想されるI / Oバイトが返されるまで計算するものがないため、GILロックを求めて戦うべきではありませんか?)
決定を下す方法は?
コードを確認して、ネットワーク経由のI / Oフェッチの数と、ゲーム内のキャッシュフットプリントサイズの読み取りの数を確認します(2020 / Q2 +では、L1キャッシュは約数[MB]
秒に増加しました)。これらの操作が何度も繰り返される場合は、「遅い」ネットワークごとに1つのスレッドをスピンアップすることを躊躇しないでください-I / Oターゲットは、偶然に作成された「長い」待機のマスキングによって処理が恩恵を受けるためです。ただ安い(「速い」)そして(「多くの」そして「長い」待ち時間のために)かなりまばらなスレッドスイッチングまたは完全なサブプロセスをマッピングするO / S駆動のプロセススケジューラのコストで時間無料のCPUコア。
したがって、分散されるワークロードの群れが上記のケースのいくつかの組み合わせである場合、実際のハードウェアローカル/非ローカルリソースで実験する以外に方法はありません。
どうして ?
ワークロード処理の実際のCPUコアリソースへのマッピングを微調整するための経験則がないためです。
それでも、(ただ取得したい)SpeedUpの代わりに、SlowDownを達成するという既知の罠を
取り戻すことで、これまで以上にお金を払ったことが簡単にわかるかもしれません。
すべての場合において、オーバーヘッド-厳格な、リソースを意識し、ワークロードのアトミック性を尊重改訂アムダールの法則は、識別ポイント・オブ・収穫逓減任意の多くの労働者(CPUコア-s)は改善されませんその後、取得を希望しスピードアップを。S << 1を取得することの多くの驚きは、Stack Overflowの投稿で表現されているため、やらないこと(アンチパターンによる学習)を好きなだけ読むことができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加