プログラム内で同じ機能を実行する必要があるさまざまな入力パラメーターを持つプログラムがあります。入力パラメータの各セットをグリッド内の異なるプロセッサで動作させるにはどうすればよいですか? 少しでも心当たりがありましたらご協力お願いします。本当に大いに役立ちます!プログラムはC++です
2 に答える
使用するクラスター リソース マネージャーによって異なります。ほとんどの場合、同じジョブの多くのインスタンスが実行され、パラメーター (通常は現在のジョブの単純な整数インデックス) が環境を介して渡される、いわゆる配列ジョブがサポートされます。それが私たちが貧乏人の並列コンピューティングプラットフォームと呼んでいるものです:)
私はSun Grid Engine (現在はOracle Grid Engineであり、 Open Grid SchedulerおよびSon of Grid Engineという名前のオープンソース フォークも存在します) とPlatform LSF (現在は IBM LSF、非常によく似た open-ソースopenlavaジョブ スケジューラ)、私はそれらについて (および Torque についてある程度) しか書くことができません。
SGE では、配列ジョブは次のようになります。
#!/usr/bin/env zsh
#$ -cwd
#$ -N jobname
#$ -t 1-100
## Other resource requirements
#$ -l h_rt=0:30:00
#$ -l h_mem=1200M
#$ -pe openmp 12
export OMP_NUM_THREADS=12
density=$((SGE_TASK_ID * 0.06)) # zsh specific
/path/to/executable -d density < input_${SGE_TASK_ID} > output_${SGE_TASK_ID}
ここで、-t 1-100
パラメーター toは、 からまでqsub
の番号が付けられた 100 個のタスクの配列ジョブを作成します。SGE は、現在のタスク番号を環境変数に渡します。これを使用して適切な入力ファイルを選択したり、他の入力パラメーターを計算したりできます。SGE は、ジョブの出力ファイルとエラー ファイルの両方にタスク ID を自動的に付けます。での浮動小数点リテラルの使用は、固有のように見えることに注意してください。1
100
SGE_TASK_ID
$(())
zsh
Torque の配列ジョブは、パラメーターを介して SGE とまったく同じ方法で作成され-t
ます。2.3 より前のバージョンの Torque では-t
、1 つの引数 (タスクの数) を受け入れ、この数から 1 を引いた数までのタスクに番号を0
付けます。Torque 2.3 からは、SGE のように範囲を指定できます。
#!/usr/bin/env zsh
#PBS -N jobname
#PBS -l nodes=1,walltime=00:30:00
#PBS -t 1-100
cd ${PBS_O_WORKDIR}
export OMP_NUM_THREADS=12
density=$((PBS_ARRAYID * 0.06)) # zsh specific
/path/to/executable -d density < input_${PBS_ARRAYID} > output_${PBS_ARRAYID}
SGE との主な違いは、タスク ID 環境変数の名前がPBS_ARRAYID
. Torque マニュアルのJob Submissionの部分を参照してください。
LSF では、配列ジョブは次のようになります。
#!/usr/bin/env zsh
#BSUB -J jobname[1-100]
# Have separate error file for each job
#BSUB -e error_%I
# Other resource requirements, e.g.
#BSUB -W 0:30
#BSUB -M 1200
#BSUB -n 1
#BSUB -x
export OMP_NUM_THREADS=12
density=$((LSF_JOBINDEX * 0.06)) # zsh specific
/path/to/executable -d density < input_${LSF_JOBINDEX} > output_${LSF_JOBINDEX}
ここで、ジョブ名の後に範囲指定を追加すると[1-100]
、配列ジョブが作成されます。LSF_JOBINDEX
LSF は、環境変数を介してタスク ID を渡します。SGE の場合とまったく同じように使用できます。
使用する並列パラダイムを指定する必要があります。MPI、OpenMP、その他。
通常、適用されるアプローチは、いくつかの通信チャネルを使用し、「メイン」プロセスから他のすべてのプロセスにパラメーターのベクトルを送信することです。
パラメータが同じ場合にブロードキャストするのが最も一般的ですが、メイン タスクはそれらのセットを繰り返し処理し、1 対 1 コミュニケータを介してそれぞれを他のタスクに送信できます。
パラメータが 1 つまたは一連のファイルで準備され、各タスクが独自の設定パラメータを読み取る場合があります。
すべては、アプリケーションがデプロイされるサイトとジョブの規模によって異なります。つまり、スーパー コンピューターでのジョブに 100 万のタスクがある場合、ファイル アプローチは適切ではない可能性があります。