私は10,000のコアを持つコンピュータを使用していますが、一度に1,000のコアにしかアクセスできません。
いくつかの場所でGNU並列処理の利点を利用するスクリプトがあります。レベルAを並列化し、このスクリプト内で30倍以上の作業を行います。
--link
並列性と構文を使用するためにスクリプト全体を書き換えるには、多くの作業が必要です::: A B C ::: $(seq 30)
。
parallel
2つの独立した呼び出しが2つの間のジョブの総数を1000に制限するのに十分な通信を可能にする方法はありますか?
答え1
私が正しく理解したら、あなたはGNU Parallelを2つ(またはそれ以上)インスタンスを実行し、総実行ジョブ数が1000未満であることを望んでいます。
したがって、ある時点では、そのうちの1つは300のジョブを実行し、もう1つは700のジョブに制限する必要があります。
--limit
この特別なケースのために設計されています。選択したスクリプトを実行し、終了値に基づいてジョブ数を制限します。
これで、実行中のジョブの総数を決定する方法が必要です。
たぶん何ですか[ $(ps aux | grep myprogram | wc -l) -gt 1000 ]
?
(どのモンスターが10,000個のコアを持っていますか?)
答え2
もう一つの解決策は--sqlmaster/--sqlworker
。
1000秒を作成し--sqlworker
、実行するジョブをデータベースに配置します--sqlmaster
。
master1$ seq 10000 | parallel --sqlmaster +pg://user:pass@server/db/table sleep 1.1{}
# The + is needed to append to existing table
master2$ seq 4000 | parallel --sqlmaster +pg://user:pass@server/db/table sleep 1.2{}
worker1..1000$ parallel --sqlworker +pg://user:pass@server/db/table
私はこれがバージョンに敏感ではないと思います--limit
。これは、特に単一システムではなくクラスタで実行されているためです。