我可以在我的桌面/笔记本电脑上的 OpenMP 中执行简单的循环(对我实际拥有的内容进行了轻微的简化......)
#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];
}
}
}
}
omp_set_num_threads(n_threads);
如果我愿意,我什至可以通过添加到顶部来指定在我的笔记本电脑上使用 n_threasds = 1、2、3 或 4 核,我注意到我想要的性能。但是,在使用集群时,我会将该行注释掉。
我可以访问集群并希望在单个节点上运行代码,因为集群有多达 48 个内核的节点,而我的笔记本电脑只有 4 个。当我使用集群时,编译后,我在终端中输入
$export OMP_NUM_THREADS=10
$bsub -n 10 ./a.out
但是程序运行不正常:我输出到一个文件中,看到它运行了0秒,而Fx,Fy和Fz的值是我启动它们时的值,所以看起来循环甚至没有运行一点也不。
编辑:这个问题是由管理集群的人解决的,并且可能非常特定于该集群,因此我提醒人们将这个问题与他们的具体案例联系起来。