フォームのデスクトップ/ラップトップで 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 の値は、開始時の値であるため、ループは実行されていないようです。まったく。
編集: この問題は、クラスターを管理した人々によって対処されたものであり、そのクラスターに非常に固有のものである可能性が高いため、この問題を特定のケースに関連付けるように人々に警告します。