web-dev-qa-db-ja.com

GNU並列はより多くの並列プロセスを実行できますか?

たとえば、次のように実行できますか?

parallel -j 200 < list0

「リスト」の場所:

Nice -n -20 parallel -j 100 < list2
Nice -n -20 parallel -j 100 < list1

これは実行可能/可能でしょうか?

6
Dominique

それが可能であるだけでなく、状況によってはお勧めします。

GNU Parallelがジョブを実行するのに約10ミリ秒かかります。したがって、8つのコアがあり、実行するジョブにかかる時間が70ミリ秒未満の場合、GNU並列で1つのコアを100%使用しますが、他のコアではアイドル時間が発生します。 。したがって、すべてのコアを100%使用するわけではありません。

推奨されるもう1つの状況は、-j0よりも多くのジョブを実行する場合です。現在、-j0は、いくつかのシステム制限を調整しない限り、約250のジョブを並行して実行します。ジョブがCPUとディスクI/Oによって制限されていない場合は、250を超えるジョブを実行することは完全に理にかなっています。これは、たとえば、ネットワーク遅延が制限要因である場合に当てはまります。

ただし、2つのリストを使用することは、ジョブを分割するための推奨される方法ではありません。推奨される方法は、GNU Parallel to call GNU Parallel:

cat list0 | parallel -j20 --pipe parallel -j100

これにより、2000個のジョブが並行して実行されます。さらに実行するには、-jを調整します。外側(20)は少なくともコアの数であることが推奨されます。これにより、各コアに少なくとも1つのGNU並列プロセスが存在するようになります。

この手法を使用すると、20000ジョブを並行して開始しても問題はありません。 32000を超えるプロセスを取得すると、物事が機能し始めます。

8
Ole Tange

なぜそれが不可能なのかわかりません。システムは確かに200の並列タスクを処理できます。

ただし、正確な数のタスクを並行して実行する必要がある特定の理由がない限り、ほぼ確実に望ましくありません。これはありそうにありません。私が見ることができた唯一の理由は、情報を交換したり、混沌とした不確定な方法で他の何かと情報を交換したりする必要があるため、それらすべてが同時に存在する必要があるためです(サーバープログラムのテストなど)。

それ以外の場合に望ましくない理由は、効率の点で理想的な状態は、システムが使用可能なプロセッサコアの数と同じ数のプロセスを実行するためです。プロセスにはある程度CPUの外部のボトルネックが含まれることが多いため、たとえば、ディスクI/O-コアの数+ 1からコアの数* 2までの意見として、この一般化された理想的な数の範囲。

これが理想的な状態効率である理由は、タスク自体が100万ユニットのプロセッサ時間を消費する場合、同じタスクを10回連続して実行すると、1,000万ユニットが消費され、同じタスクを並行して実行すると、1,000万ユニットが消費されるためです。ただし、後者の場合、CPUの数が10未満の場合、システムは常に1つのタスクから別のタスクに切り替えなければならないため、追加のコストがありますです。

これが、一般的に 2 x 2Ghzコアのシステムが4x 1Ghzコアのシステムよりも高速である理由でもあります。マルチコアシステムの進化の主な理由は、ますます高速になるCPUを製造することがますます難しくなり、特定の比較的低いポイントを超えると不可能になるためです。したがって、解決策は、より多くのプロセッサコアを備えたシステムを製造することです。

つまり、20のことをできるだけ早く実行する必要があり、4つのコアがある場合、これを実行する最も速い方法は、5セットの4または5セットの4で実行して、待機のアイドル時間を可能にすることです。 I/O。 parallelを使用すると、無制限の長さのリストをフィードしながら、同時に実行するジョブの数を制限できます(この数のデフォルトはコアの数です)。

これにはある種の例外がありますが、通常は特定の種類の単一のマルチスレッドプログラム(つまり、一連の個別のプログラムではなく、複数のコアを占有する1つのプログラム)に関連しています。これは、プログラムが、たまに調整するだけでよい比較的独立したブランチで何かを実行できる場合(「たまに」は、1秒間に10〜20回の頻度である場合もあります)、はるかに簡単で、多くの場合、より柔軟であるためです。 、任意の(非同期の)方法でタスクを循環させるように設計するのではなく、独立したスレッドでこれを行うようにプログラムを設計します。ビデオゲームやCADシステムなどのグラフィックを多用するプログラムやインタラクティブなプログラムは、このカテゴリに分類されます。

2
goldilocks