现在的位置: 首页 > 综合 > 正文

MPI 和 OMP模型

2016年11月17日 ⁄ 综合 ⁄ 共 1961字 ⁄ 字号 评论关闭

以前完全没有接触到这两个概念,完全不知道是什么意思,查了之后才发生貌似是非常高级的东西,涉及到并行计算,暂且将它们简单的介绍记录如下,希望后面能够深入理解,有机会接触更加高级的东西!!一定要接触更高级层次的东西,小宇宙从来没有像现在这样爆发过!、

1、MPI(MPI是一个标准,有不同的具体实现,比如MPICH等)是多主机联网协作进行并行计算的工具,当然也可以用于单主机上多核/多CPU的并行计算,不过效率低。它能协调多台主机间的并行计算,因此并行规模上的可伸缩性很强,能在从个人电脑到世界TOP10的超级计算机上使用。缺点是使用进程间通信的方式协调并行计算,这导致并行效率较低、内存开销大、不直观、编程麻烦。

OpenMP是针对单主机上多核/多CPU并行计算而设计的工具,换句话说,OpenMP更适合单台计算机共享内存结构上的并行计算。由于使用线程间共享内存的方式协调并行计算,它在多核/多CPU结构上的效率很高、内存开销小、编程语句简洁直观,因此编程容易、编译器实现也容易(现在最新版的C、C++、Fortran编译器基本上都内置OpenMP支持)。不过OpenMP最大的缺点是只能在单台主机上工作,不能用于多台主机间的并行计算!

如果要多主机联网使用OpenMP(比如在超级计算机上),那必须有额外的工具帮助,比如 MPI + OpenMP 混合编程。或者是将多主机虚拟成一个共享内存环境(Intel有这样的平台),但这么做效率还不如混合编程,唯一的好处是编程人员可以不必额外学习MPI编程

2、三者之间的逻辑关系是怎样的?

MPI 负责节点之间的通信
OpenMP负责节点中多核cpu的计算
CUDA负责节点中gpu上的计算
追问
你说的这点我是完全知道的,问题是他们之间是怎么通信的呢?MPI分出进程,控制OPENMP的线程,openmp再分出n个线程去控制n个gpu?然后GPU内部又是一个二级并行——block和thread???求解
回答
MPI+OpenMP+CUDA混合程序中有负责通信的MPI部分,负责CPU计算的OpenMP部分(函数),负责GPU计算的CUDA部分(函数)。
计算时,先是通过MPI起n个进程,MPI初始化后,分配任务给每个进程。然后根据需要执行OpenMP部分或者CUDA部分的代码,如令rank为奇数的MPI进程执行某个OpenMP函数,rank为偶数的MPI进程执行CUDA函数。这部分执行完成后,通常会有个同步,各个MPI进程交换信息,汇总等,再进行下一步计算。
MPI、OpenMP和CUDA是可以同时存在于一个程序中的。因此简单的理解,可以将OpenMP和CUDA的代码看作一个个函数,需要时再进行调用。然后在这些函数里面OpenMP和CUDA各自进行自己的计算。OpenMP会创建多个线程来并行计算;CUDA是在GPU上创建多个流来执行kernel函数。通常来说,OpenMP和CUDA在这种计算模型里面是属于同一层的。而MPI则是负责节点之间的通信,将OpenMP和CUDA的计算结果汇总等。

3、

目前并行计算基本上有:MPI、OPENMP、OPENCL、OPENGL、CUDA

你只是想体验的话用OPENMP最省事了,一句话就可以达到并行的效果

代码我可以给你,但你要配好环境。先给你裸敲一个hello world的MPI程序吧

#include<stdio.h>
#include<mpi.h>
int main (int argc,char *argv[])
{
    int mypid ,numprocs;
    MPI_Init(&argc,&argv); // 并行开始
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs); //获取进程数
    MPI_Comm_rank(MPI_COMM_WORLD,&mypid); //获取本进程ID号
    printf("hello world! i am %d process of %d processes",mypid,numporcs);
    MPI_Finalize(); //并行结束
}

这就是MPI版的hello world 程序,你需要在编译的时候确定同时打开几个进程,比如说4个,程序可能运行结果为:

hello world! i am 2 process of 4 processes

hello world! i am 1 process of 4 processes

hello world! i am 0 process of 4 processes

hello world! i am 3 process of 4 processes

为什么说可能呢,因为四个进程同时在执行上面的那段代码,哪个进程先结束哪个就先输出就这个道理。

想学并行编程的话,建议你在linux下学习。

抱歉!评论已关闭.