【发布时间】:2013-02-17 02:45:22
【问题描述】:
我正在将 OpenMP 并行化的程序移动到集群。该集群使用 Lava 1.0 作为调度程序,每个节点有 8 个核心。我在作业脚本中使用了 MPI 包装器来进行多主机并行。
这是作业脚本:
#BSUB -q queue_name
#BSUB -x
#BSUB -R "span[ptile=1]"
#BSUB -n 1
#BSUB -J n1p1o8
##BSUB -o outfile.email
#BSUB -e err
export OMP_NUM_THREADS=8
date
/home/apps/bin/lava.openmpi.wrapper -bynode -x OMP_NUM_THREADS \
~/my_program ~/input.dat ~/output.out
date
我专门在 ONE 主机上做了一些实验。但是,我不知道如何解释一些结果。
1。
-nOMP_NUM_THREADS时间
1 4 21:12
2 4 20:12
这是否意味着 MPI 在这里不做任何并行操作?我认为在第二种情况下,每个 MPI 进程都会有 4 个 OMP 线程,因此它应该使用 800% 的 CPU 使用率,这应该比第一种更快。
另一个证明它的结果是
-nOMP_NUM_THREADStime
2 2 31:42
4 2 30:47
它们的运行时间也很接近。
2.
在这种情况下,如果我想通过简单的方式在这个集群中以合理的优化速度并行这个程序,在每个主机中放置1个MPI进程(告诉LFG我使用一个核心)是否合理,设置OMP_NUM_THREADS = 8,然后专门运行它?因此 MPI 仅适用于跨节点作业,而 OpenMP 适用于内部节点作业。 (-n = 主机数;ptile = 1;OMP_NUM_THREADS = 每个主机的最大内核数)
更新: 程序由 gfortran -fopenmp 编译,不带 mpicc。 MPI 仅用于分发可执行文件。
3 月 3 日更新: 程序内存使用监视器
本地环境:Mac 10.8 / 2.9 Ghz i7 /8GB 内存
没有 OpenMP
- 实际内存大小:8.4 MB
- 虚拟内存大小:2.37 GB
- 共享内存大小:212 KB
- 私有内存大小:7.8 Mb
- 虚拟专用内存:63.2 MB
使用 OpenMP(4 线程)
- 实际内存大小:31.5 MB
- 虚拟内存大小:2.52 GB
- 共享内存大小:212 KB
- 私有内存大小:27.1 Mb
- 虚拟专用内存:210.2 MB
集群硬件简介
每台主机包含双四核芯片,每个节点有 8 个内核和 8GB 内存。此集群中的主机通过 infiniband 连接。
【问题讨论】:
-
这里的大多数人都不是通灵者。您可以从描述您的计算算法、其内存要求和计算强度(最好以 FLOPS/字节为单位)开始。然后告诉我们每个集群节点在 CPU 类型、套接字数量、内存带宽等方面都有哪些硬件。
-
@HristoIliev 谢谢你的回复!我的程序使用 OpenMP 来并行化 fortran 中的循环。循环中还有一些分配/释放内存。你能告诉我如何获得内存需求和计算强度吗?我正在向集群管理器询问硬件信息。再次感谢。
-
如何编辑您的答案并提供一些示例内核循环?无需粘贴整个程序 - 只需粘贴多少代码即可了解正在处理的信息量。我的观点是,如果您的应用程序受内存限制,那么可用内存带宽就是限制加速的因素。
-
@HristoIliev 代码实际上非常复杂且冗长。在这里选择“重要”部分进行解析非常困难,因为我不确定哪些部分可能是“重要的”。相反,我在本地环境中做了一个内存监视器并更新了集群中的内存信息。如果您需要更多信息,请告诉我。非常感谢!
-
所以你只是多次运行同一个可执行文件。那么,当他们不合作和分享他们的工作时,你如何期望它在更多的进程下运行得更快? MPI 是一个通信库,您必须明确将 MPI 调用放入应用程序中,并让不同的进程处理问题的不同部分,以缩短处理时间。简单地多次启动你的可执行文件不会神奇地让它运行得更快。
标签: parallel-processing mpi openmp