MPI是什么?它用来干什么?
MPI是信息传递接口(Message Passing Interface),简单来说就是一个用来实现进程通讯的库.它很多时候用于并行算法的设计.
下面我们先使用windows环境下python语言来了解mpi的使用.
mpi在python的环境还是很好配置的.首先你得安装好python和pip.然后直接用pip安装mpi在python的库,mpi4py.
然后我们需要安装mpi,去mpi的官网找.网址http://www.mpich.org/downloads/
下载得到的文件:
安装后在安装目录的bin文件夹里会有很重要的一个程序mpiexec.exe:
为了方便运行程序,安装的时候,这个路径会自动添加到环境变量里.如果你打开命令行cmd,输入mpiexec回车发现cmd没有找到这个程序,你最好手动添加这个环境变量.
环境变量的添加:我的电脑右键->属性->高级系统设置->高级->环境变量->系统变量里的path双击->新建,填入你的对应的路径(win10以下的界面和这个不一样,具体百度)
环境变量设置好后,在cmd运行mpiexec会输出一些帮助信息.
PS:好像现在windows版本的MPI要跳转到MS的官网,而且下载到的是MSMPI而不是MPICH2.,详情我也不太清楚.不过对于py上的开发,只要安装目录里有mpiexec.exe这个程序就行了.
安装完mpi和mpi4py之后,我们就可以编写代码了.代码样例是最简单的每个进程输出它的rank(什么是rank?下面解释).
代码很简单,运行命令和结果为下图:
我们先看命令,注意到运行命令不是简单的python xxx.py,因此使用未配置好的IDE运行这个py文件可能导致运行失败.
在命令中,-n表示进程数.mpiexec在执行的时候会创建一组完全相同的进程,而这个进程组有多少个进程就是由这个参数-n决定,图中例子为4个.
4后面的参数实际上是要运行的一个exe,由于py不是c/c++那样先编译出一个exe后运行它,而是动态解释.因此我们要运行的就是python.exe这个解释器,而这个python又带有参数test.py,表示要运行的是test.py这个py文件.
看完命令再看代码.第2行是一个import语法,把MPI这个名字import进来.
第4行的comm是一个很重要的对象,之后的操作都围绕它来展开.
第5行通过comm对象的Get_rank()方法获取当前进程的rank.什么是rank,你当成是进程ID去理解吧.这里的rank是从0开始,不断加1.第6行则是用Get_size方法获取这组进程的进程数.
可能你已经发现了,在代码里我只print了一行,但在实际运行却输出了4行,并且输出的东西还是不同的,并且是乱序的.
这其实就是mpiexec做的工作,它让这个test.py文件并行地运行了4次,而不需要像python的thread库那样在代码里先声明多少个线程.