Openmp并行计算学习

Openmp和MPI

区别

1.OpenMP

OpenMP是一种用于共享内存并行系统的多线程程序设计的库(Compiler Directive),特别适合于多核CPU上的并行程序开发设计。它支持的语言包括:C语言、C++、Fortran;不过,用以上这些语言进行程序开发时,并非需要特别关注的地方,因为现如今的大多数编译器已经支持了OpenMP,例如:Sun Compiler,GNU Compiler、Intel Compiler、Visual Studio等等。程序员在编程时,只需要在特定的源代码片段的前面加入OpenMP专用的#pargma omp预编译指令,就可以“通知”编译器将该段程序自动进行并行化处理,并且在必要的时候加入线程同步及通信机制。当编译器选择忽略#pargma omp预处理指令时,或者编译器不支持OpenMP时,程序又退化为一般的通用串行程序,此时,代码依然可以正常运作,只是不能利用多线程和多核CPU来加速程序的执行而已。

​ OpenMP使得程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,它是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,然而,在OpenMP中,OpenMP库从程序员手中接管了部分这两方面的工作,从而使得程序员可以更加专注于具体的算法本身,而非如何编程使得代码在CPU负载平衡和线程粒度方面做出平衡。但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。

​ 标准并行模式执行代码的基本思想是,程序开始时只有一个主线程,程序中的串行部分都由主线程执行,并行的部分是通过派生其他线程来执行,但是如果并行部分没有结束时是不会执行串行部分的。这就是标准的并行模式fork/join式并行模式,共享存储式并行程序就是使用fork/join式并行的,OpenMP亦是如此。

2.MPI

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

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

Openmp

OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C、C++和Fortran。OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的并行程序设计。编译器根据程序中添加的pragma指令,自动将程序并行处理,使用OpenMP降低了并行编程的难度和复杂度。当编译器不支持OpenMP时,程序会退化成普通(串行)程序。程序中已有的OpenMP指令不会影响程序的正常编译运行。

OpenMP的配置及简单使用

简单使用:测试本机是几核的

#include

#include

int main()

{

    std::cout << "parallel begin:\n";

#pragma omp parallel

    {

        std::cout << omp_get_thread_num();

    }

    std::cout << "\n parallel end.\n";

    std::cin.get();

    return 0;

}

输出结果如下,按照那篇文章的说法,那么本计算机是16核,或者说是16线程的:

parallel begin:
2120786415391110131415
parallel end.

而我买的code01电脑官方提供的配置信息是八核十六线程,难道设备商好心多给了四核?事实是设备商采用了超线程技术。

超线程技术是英特尔在奔腾四年代在奔腾处理器上广泛采用的一个技术,让一个处理器通过技术手段模拟成两个处理器,从而提高多任务的协调处理性能。也由于这个原因,所以单核心支持超线程技术的处理器在Windows操作系统下均会被识别成两个处理器。

MPI

MPI(Message Passing Interface),由其字面意思也可些许看出,是一个信息传递接口。可以理解为是一种独立于语言的信息传递标准。而OpenMPI和MPICH等是对这种标准的具体实现。也就是说,OpenMPI和MPICH这类库是具体用代码实现浏MPI标准。因此我们需要安装OpenMPI或者MPICH去实现我们所学的MPI的信息传递标准。

作者:Venney
链接:https://zhuanlan.zhihu.com/p/356705583
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

资料

两小时入门MPI与并行计算系列 - Venney的文章 - 知乎 https://zhuanlan.zhihu.com/p/355652501

OpenMP的配置及简单使用

大数据处理 | 五分钟上手MPI多机并行计算实验 - Ricolove的文章 - 知乎 https://zhuanlan.zhihu.com/p/84642385

高性能计算–mpi - yeah的文章 - 知乎 https://zhuanlan.zhihu.com/p/69497154

linux下安装mpich

Linux源码安装mpich

Ubuntu 20.04下安装和配置MPI - 胡黑的文章 - 知乎 https://zhuanlan.zhihu.com/p/355850573


   转载规则


《Openmp并行计算学习》 Henry-Avery 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录