GNUパラレルリンクパラメータと代替パラメータ

GNUパラレルリンクパラメータと代替パラメータ

ユーザー提供のパラメータに基づいて実行されるPythonエミュレータを作成しました。このプログラムを使用するために、いくつかのランダムシミュレーション(シード値で制御)を実行しました。 GNU Parallelを使用して、次のようにパラメータを使用してエミュレータを実行しました。

parallel 'run-sim --seed {1} --power {2}' ::: <seed args> ::: <power args>

3番目のパラメータを使用したいのですが、--numそのパラメータをシード値に関連付けたいと思います。したがって、シード値ごとに1つの数値のみが使用されます。ただし、各検定値に同じnumパラメータを使用しないでください。

つまり、この表でより良い理解を得ることができます。

| Power      | Seed        | num          |
|:-----------|------------:|:------------:|
| 10         |      0      |     100      |
| 10         |      1      |     150      |
| 10         |      2      |     200      |
| 10         |      3      |     250      |
|:-----------|------------:|:------------:|
| 20         |      0      |     300      |
| 20         |      1      |     350      |
| 20         |      2      |     400      |
| 20         |      3      |     450      |
....

(テーブル形式はモバイルデバイスには適していない可能性があります)

forループを使用して上記の実装を作成した場合は、次のようにします。

for p in power:
   for s, n in (seed, num[p])
       simulate(p, s, n)

ここで、 power は 1 次元配列、seed は 1 次元配列、num は 2 次元配列、1 行は対応する num 値である二乗 p を表します。

私の解決策:

各電力値に対して複数の並列ステートメントを使用し、以下を使用します。--link範囲Seedパラメータとnumパラメータを並列にバインドします。

parallel --link 'run-sim --seed {1} --num {2} --power 10' ::: 0 1 2 3 ::: 100 150 200 250
parallel --link 'run-sim --seed {1} --num {2} --power 20' ::: 0 1 2 3 ::: 300 350 400 450
...

このソリューションの問題は、電力値の数に応じてステートメントごとのジョブ数を制限する必要があることです。マイコンピュータは心臓発作が発生する前に50の追加プロセスを処理できるため、3の累乗の場合、操作をステートメントごとに12に制限する必要があります。

私が探しているものは何ですか?

複数の並列ステートメントを実行し、ジョブ数を50に固定する必要がないように、単一のライナーです。

ベストアンサー1

あなたがそれをどのように決定するかは明確ではありませんnum。電力およびシードベースのアレイを使用できます。

$ declare -A num=([10,0]=100 [10,1]=150 [10,2]=200 [10,3]=250 [20,0]=300 [20,1]=350 [20,2]=400 [20,3]=450 [30,0]=133 [30,1]=166 [30,2]=200 [30,3]=233)
$ env_parallel -j 50 echo power {1} seed {2} num '${num[{1},{2}]}' ::: 10 20 30 ::: 0 1 2 3

またはシリアル番号ベースの配列:

$ num=(dummy 100 150 200 250 300 350 400 450 133 166 200 233)
$ env_parallel -j 50 echo power {1} seed {2} num '${num[{#}]}' ::: 10 20 30 ::: 0 1 2 3

または:

parallel -j 50 echo power {1} seed '{=1 $_=(seq()-1)%4=}' num {2} ::: 10 10 10 10 20 20 20 20 30 30 30 30 :::+ 100 150 200 250 300 350 400 450 133 166 200 233

おすすめ記事