2012-11-06 50 views
0

我能for循环做简单的OpenMP中的表单中的我的台式机/笔记本电脑(什么,我确实有一个温和的简化...)群集的单个节点上运行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]; 
} 
} 
} 
} 

如果需要,我甚至可以在我的笔记本电脑上指定n_threasds = 1,2,3或4个内核,在顶部添加omp_set_num_threads(n_threads);,我注意到我想要的性能。但是,在使用群集时,我会对此发表评论。

我有机会到群集,并希望到集群,因为单个节点上运行的代码具有节点多达48个内核和我的笔记本电脑只有4。当我使用群集,编译后,I型到终端

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

但程序运行不正常:I输出到一个文件,看看它花了0秒到运行,和FX,Fy和Fz的的值是它们是什么,当我开始他们,所以看起来循环甚至没有运行。

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

+0

当你写* cluster *我想* distributed-memory *。您要采取哪些步骤来确保OpenMP作业仅在群集的一个节点上运行? –

+0

是的,OpenMP只能在一台计算机上运行,​​但在有权访问的集群上,有许多节点的20 - 46处理器比我的4核心笔记本电脑更好... – db1234

+1

然后,您发送给我们完全错误的方向与你给我们的信息。因此,您的问题与群集无关。我建议关闭这个问题(标题和所有内容都是完全误导性的),并且正确地重新表达它,然后回来一个新的问题。 –

回答

1

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

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

+0

是的,OpenMP只能在单台计算机上运行,​​但在有权访问的集群上,有许多节点20 - 46处理器,比我的4核心笔记本电脑更好... – db1234

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 

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

1

斯托伊奇是正确的,但我认为你应该在你的sh文件添加

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

。 ptile选项仅用于指定每个节点的任务数 ,请参见i。Ë

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

否则,根据集群的队列设置,你也许会

bqueues -l 

任务获得将每一个节点,这是提供给你拼命地跑。

0

如果节点有24个核心

#PBS -l nodes=1:ppn=24 
在我的系统

。可能在你使用的集群中会像

#BSUB -l nodes=1:ppn=24 
相关问题