0

我可以在我的桌面/笔记本电脑上的 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的值是我启动它们时的值,所以看起来循环甚至没有运行一点也不。

编辑:这个问题是由管理集群的人解决的,并且可能非常特定于该集群,因此我提醒人们将这个问题与他们的具体案例联系起来。

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.shLSB_DJOB_NUMPROCLSF 在环境变量中导出授予作业的槽数。通过完成作业,您可以提交具有不同参数的相同作业文件,例如:bsub -n 20 < job.sh. 您可能需要向调度程序提示您希望所有插槽都位于同一节点上。通常可以通过指定-R "span[ptile=n]". 可能还有其他方法可以做到这一点,例如esub您可能需要指定的可执行文件:

#BSUB -a openmp

请注意,Stack Overflow 不是您的管理员存储集群文档的地方。你最好问他们,而不是我们。

于 2012-11-06T17:26:58.197 回答
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 回答
1

我不确定我是否正确理解您在做什么,但我担心您的想法是 OpenMP 会自动在集群上以分布式方式运行您的应用程序。

OpenMP 不是为这样的任务而设计的,它假设您在共享内存设置中运行代码。对于分布式设置(处理器仅通过网络链接连接),还有其他工具,即 MPI。但是这样的设置比#pragma你在使用 openMP 时习惯的注释要复杂一些。

于 2012-11-06T15:33:18.847 回答
0

如果节点有 24 个核心

#PBS -l nodes=1:ppn=24

在我的系统中。可能在您使用的集群中它会像

#BSUB -l nodes=1:ppn=24
于 2017-05-06T00:49:01.397 回答