OpenMP和MPI是并行编程的两个手段,对比如下:
1. OpenMP:线程级(并行粒度);共享存储;隐式(数据分配方式);可扩展性差;
2. MPI:进程级;分布式存储;显式;可扩展性好。
3. OpenMP采用共享存储,意味着它只适应于SMP、DSM机器,不适合于集群。MPI虽适合于各种机器,但它的编程模型复杂:需要分析及划分应用程序问题,并将问题映射到分布式进程集合;需要解决通信延迟大和负载不平衡两个主要问题;
4. 调试MPI程序麻烦; MPI程序可靠性差,一个进程出问题,整个程序将错误;
5. 常采用mpi而不用openmp的原因是:openmp扩展性差,对机器要求高,要想运算的快点,机器就要很贵。
6. 一般双核,用openmp。因为mpi用于分布式机器之间数据传输,单机内用mpi的时间开销大于OpenMP。
7. 在一台机器中有很多CPU共享其中的内存条,叫共享内存并行机(如今天的双核CPU台式机),它适合OpenMP,而把这样的机器用专用高速网连接就形成了分布式内存并行机,它适合于MPI。此时,可以混合OpenMP,能提高一定的运行速度。
8. openmp基本上只要在已有程序基础上根据需要加并行语句,而mpi有时甚至需要从基本设计思路上重写整个程序,而且mpi调试也困难得多,涉及到局域网通信这一不确定的因素。
9. 当然openmp虽然简单却只能用于单机多CPU/多核并行,而mpi才是用于多主机超级计算机集群的强悍工具,当然复杂。
10.OpenMP+MPI的组合方式在集群方面有很成熟的案例。
比较 |
并行粒度 |
存储方式 |
可扩展性 |
适合机器 |
OpenMP |
线程级 |
共享存储 |
差 |
SMP、DSM机器, 用于单机多CPU/多核 |
MPI |
进程级 |
分布式.. |
好 |
多主机超级计算机集群 |
|
|
|
|
|
比较 |
编程难易 |
数据分配方式 |
可靠性 |
主要应用 |
OpenMP |
易,直接添加并行语句 |
隐式 |
好 |
科学计算上占统治地位,多线程应用 |
MPI |
难,需要重新设计程序 |
显式 |
差,一个进程出问题,程序崩溃 |
集群应用 |
嵌套并行执行模型
OpenMP 采用 fork-join (分叉- 合并)并行执行模式。线程遇到并行构造时,就会创建由其自身及其他一些额外(可能为零个)线程组成的线程组。遇到并行构造的线程成为新组中的主线程。组中的其他线程称为组的从属线程。所有组成员都执行并行构造内的代码。如果某个线程完成了其在并行构造内的工作,它就会在并行构造末尾的隐式屏障处等待。当所有组成员都到达该屏障时,这些线程就可以离开该屏障了。主线程继续执行并行构造之后的用户代码,而从属线程则等待被召集加入到其他组。
OpenMP 并行区域之间可以互相嵌套。如果禁用嵌套并行操作,则由遇到并行区域内并行构造的线程所创建的新组仅包含遇到并行构造的线程。如果启用嵌套并行操作,则新组可以包含多个线程。
OpenMP 运行时库维护一个线程池,该线程池可用作并行区域中的从属线程。当线程遇到并行构造并需要创建包含多个线程的线程组时,该线程将检查该池,从池中获取空闲线程,将其作为组的从属线程。如果池中没有足够的空闲线程,则主线程获取的从属线程可
能会比所需的要少。组完成执行并行区域时,从属线程就会返回到池中。