0

フォームのデスクトップ/ラップトップで OpenMP の単純な for ループを実行できます (実際に持っているものを少し単純化したものです...)

 #include <stdlib.h>
 #include <stdio.h>
 #include <omp.h>
 %%%% #include other libraries...

 int main(void){
 .
 .
 .
 %%% declare and initialize variables.
 .
 .
 .

 #pragma omp parallel for collapse(3) shared(tf, p, Fx, Fy, Fz) private(v, i,j,k,t0) 
 for (i = 0; i < Nx; i++){
 for (j = 0; j < Ny; j++){
 for (k = 0; k < Nz; k++){

 v[0] = Fx[i][j][k]; 
 v[1] = Fy[i][j][k];
 v[2] = Fz[i][j][k];
 ///My_fn changes v and then I put it back into Fx, Fy, Fz
 My_fn(v, t0, tf, p);   
 Fx[i][j][k] = v[0]; 
 Fy[i][j][k] = v[1];
 Fz[i][j][k] = v[2];
 }
 }
 }
 }

必要に応じて、トップに追加することで、ラップトップで n_threads = 1、2、3、または 4 コアを使用するように指定することもでき、必要omp_set_num_threads(n_threads);なパフォーマンスに気付きます。ただし、クラスターを使用する場合は、その行をコメントアウトします。

クラスターにアクセスできますが、クラスターには最大 48 コアのノードがあり、ラップトップは 4 つしかないため、単一ノードでコードを実行したいと考えています。クラスターを使用するときは、コンパイル後にターミナルに入力します。

 $export OMP_NUM_THREADS=10
 $bsub -n 10 ./a.out

しかし、プログラムは正しく実行されません。ファイルに出力すると、実行に 0 秒かかったことがわかります。Fx、Fy、および Fz の値は、開始時の値であるため、ループは実行されていないようです。まったく。

編集: この問題は、クラスターを管理した人々によって対処されたものであり、そのクラスターに非常に固有のものである可能性が高いため、この問題を特定のケースに関連付けるように人々に警告します。

4

4 に答える 4

2

この質問はプログラミングとは関係がなく、クラスターでのバッチ システム (別名分散リソース マネージャー) の使用に関係しているように見えます。通常の方法は、代わりにスクリプトを記述し、スクリプト内にOMP_NUM_THREADS付与されたスロット数を設定することです。あなたのバッチ システムは LSF のように見えます ( の存在に基づく大げさな推測ですbsub)。その場合、ほとんどの場合、スクリプトに同様のものを入れたいと考えています (これを と呼びましょうjob.sh):

#BSUB -n 10

export OMP_NUM_THREADS=$LSB_DJOB_NUMPROC
./a.out

次に、スクリプトを送信しますbsub < job.sh。LSF は、ジョブに付与されたスロット数をLSB_DJOB_NUMPROC環境変数でエクスポートします。割り当てを行うことで、次のような異なるパラメーターを使用して同じジョブ ファイルを送信できますbsub -n 20 < job.sh。すべてのスロットを同じノードに配置したいというヒントをスケジューラーに与える必要があるかもしれません。を指定することで、通常はそれを行うことができます-R "span[ptile=n]"。それを行うには他の手段があるかもしれません。たとえば、esub指定する必要がある実行可能ファイルがあります。

#BSUB -a openmp

スタック オーバーフローは、管理者がクラスタ ドキュメントを保存する場所ではないことに注意してください。私たちではなく、彼らに聞いたほうがいいです。

于 2012-11-06T17:26:58.197 に答える
1

私はあなたが何をしようとしているのかを正しく理解しているかどうか確信が持てませんが、あなたの考えは、OpenMP がクラスター上で分散された方法でアプリケーションを自動的に実行するというものではないかと心配しています。

OpenMP はそのようなタスク用に作成されていません。共有メモリ設定でコードを実行することを前提としています。分散設定 (ネットワーク リンクを介してのみ接続されたプロセッサ) には、MPI という他のツールがあります。#pragmaしかし、このような設定は、 openMP を使用するときに慣れ親しんでいるアノテーションよりも設定が少し複雑です。

于 2012-11-06T15:33:18.847 に答える
1

Hristoは正しいですが、追加する必要があると思います

#BSUB -R "span[hosts=1]"            # run on a single node

あなたの.shファイルで。ptile オプションは、ノードごとのタスク数を指定するためだけのものです。ie を参照してください。

https://doc.zih.tu-dresden.de/hpc-wiki/bin/view/Compendium/PlatformLSF

それ以外の場合は、クラスターのキュー設定に応じて、取得できる可能性があります

bqueues -l

タスクは、利用可能なすべてのノードで実行されます。

于 2012-11-10T13:29:19.703 に答える