当前位置:网站首页 > Java教程 > 正文

java mpi教程



本篇是MPI的入门教程,主要是为了简单地了解MPI的设计和基本用法,方便和现在的Hadoop、Spark做对比,并尝试理解它们之间在设计上有什么区别。

身处Hadoop、Spark这些优秀的分布式开发框架蓬勃发展的今天,老的分布式编程模型是否没有必要学习?这个很难回答,但是我更倾向于花一个下午的时候来学习和了解它。

关于并发和并行编程系列的文章请参考

文章结构

安装

建议在Ubuntu上安装,不过笔者尝试一下,报了各种错。正好Win10可以安装一个Linux的bash,就安装了一下,用起来和原生Linux没什么区别,挺方便。

一句搞定。

helloworld

MPI的c语言版helloworld。这是一个最简单的版本,相当于是每个进程都打印一下helloworld。

该例子中的一些方法以及概念在后面都会解释,而且会有两个比这个功能更全一点的例子来帮助理解。

运行

先编译,如果有for循环的话,记得加上后面的参数。

再运行:

总结

从上面的简单例子可以看出 一个MPI程序的框架结构可以用下图表示 把握了其结构之后,下面的主要任务就是掌握MPI提供的各种通信方法与手段。

安装时遇到的问题

来一个我在Ubuntu16.04下遇到的错误,实在不想解决这些乱七八糟的,就跳过了。

什么是MPI

对MPI的定义是多种多样的,但不外乎下面三个方面,它们限定了MPI的内涵和外延:

名词和概念

程序代码:

这里的程序不是指以文件形式存在的源代码、可执行代码等,而是指为了完成一个计算任务而进行的一次运行过程。

进程(Process)

一个 MPI 并行程序由一组运行在相同或不同计算机 /计算节点上的进程或线程构成。为统一起见,我们将 MPI 程序中一个独立参与通信的个体称为一个进程。

进程组:

一个 MPI程序的全部进程集合的一个有序子集。进程组中每个进程都被赋予一个在改组中唯一的序号(rank),用于在该组中标识该进程。序号范围从 0 到进程数-1。

通信器(communicator):

有时也译成通信子,是完成进程间通信的基本环境,它描述了一组可以互相通信的进程以及它们之间的联接关系等信息。MPI所有通信必须在某个通信器中进行。通信器分域内通信器(intracommunicator)和域间通信器(intercommunicator)两类,前者用于同一进程中进程间的通信,后者则用于分属不同进程的进程间的通信。

MPI 系统在一个 MPI 程序运行时会自动创建两个通信器:一个称为 MPI_COMM_WORLD,它包含 MPI 程序中所有进程,另一个称为MPI_COMM_SELF,它指单个进程自己所构成的通信器。

序号(rank):

即进程的标识,是用来在一个进程组或一个通信器中标识一个进程。MPI 的进程由进程组/序号或通信器/序号唯一确定。

消息(message):

MPI 程序中在进程间传递的数据。它由通信器、源地址、目的地址、消息标签和数据构成。

通信(communication):

通信是指在进程之间进行消息的收发、同步等操作。

用过Hadoop的童鞋应该都记得经典的Map和Reduce接口,我们在写MR程序的时候主要就在写自己实现的Map和Reduce方法。

MPI比Hadoop需要关注的稍微多一点点。

注意: 这几个核心的接口还是要了解一下的。暂时可以看一眼跳过去,后面在看程序的时候回过头多对比一下就能记住了。

我们简单地理解一下这6个接口,其实可以分为3类:

关于传输数据的接口,可以看下图的理解。

1.

初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备。

2.

用来标识各个MPI进程的,给出调用该函数的进程的进程号,返回整型的错误值。两个参数:MPI_Comm类型的通信域,标识参与计算的MPI进程组; &rank返回调用进程中的标识号。

3.

用来标识相应进程组中有多少个进程。

4.

结束MPI执行环境。

5.

含义:向通信域中的dest进程发送数据,数据存放在buf中,类型是datatype,个数是count,这个消息的标志是tag,用以和本进程向同一目的进程发送的其它消息区别开来。

6.

在这里举第二个例子——一个进阶版的HelloWorld。不再像第一个例子那样简单地打印HelloWorld,在这个程序中,我们指派其中一个进程复杂输出,其它的进程向他发送要打印的消息。

程序

在这个程序中,为了方便理解我会注释大部分的代码。

注意注释。

运行

看一下运行结果。

第一条是我们的进程0打印的,其余的4条都是接收其它进程的数据。

问题描述

用梯形积分法来估计函数 的图像中,两条垂直线与x轴之间的区域大小。即下图(1)中阴影部分面积。

解法

如上图中的(b),基本思想就是,将x轴的区间划分为n个等长的子区间,然后估计每个子区间范围内的图形面积。最后相加即可。(当然了,这是估算的面积)

其中,梯形的面积如下:

其中高h是我们等分的一个区间值,。

那么整个图形的面积如下:

串行程序

根据上面的公式,我们可以得到一个串行版的程序:

MPI程序

整个MPI程序设计如下:

如下图

对应到代码如下:

Trap是梯形积分法的串行实现。供每一个processor调用。

结果

趁着端午假期的一个下午,把MPI做了一个小的总结。 程度不深,主要是了解MPI的一些基本特性。

暂时总结到这里,后续的工作和学习中如果再遇到了和MPI相关的知识点,再继续深入。

完整代码请看github地址。

  • 上一篇: MES系统教程java
  • 下一篇: java数据库java教程
  • 版权声明


    相关文章:

  • MES系统教程java2024-12-07 20:26:00
  • java视频教程2182024-12-07 20:26:00
  • 后端java代码教程2024-12-07 20:26:00
  • java大学实用教程第三版pdf2024-12-07 20:26:00
  • 64位java安装教程2024-12-07 20:26:00
  • java数据库java教程2024-12-07 20:26:00
  • java 官网教程2024-12-07 20:26:00
  • 地毯机java版教程2024-12-07 20:26:00
  • java教程在哪里学好2024-12-07 20:26:00
  • java制作矩形教程2024-12-07 20:26:00