openmp与openmpi区别.docx
《openmp与openmpi区别.docx》由会员分享,可在线阅读,更多相关《openmp与openmpi区别.docx(24页珍藏版)》请在冰点文库上搜索。
openmp与openmpi区别
LammpsMac的并行之路
openmp与openmpi区别
openmp比较简单,修改现有的大段代码也容易。
基本上openmp只要在已有程序基础上根据需要加并行语句即可。
而mpi有时甚至需要从基本设计思路上重写整个程序,调试也困难得多,涉及到局域网通信这一不确定的因素。
不过,openmp虽然简单却只能用于单机多CPU/多核并行,mpi才是用于多主机超级计算机集群的强悍工具,当然复杂。
(1)MPI=messagepassinginterface:
在分布式内存(distributed-memory)之间实现信息通讯的一种规范/标准/协议(standard)。
它是一个库,不是一门语言。
可以被fortran,c,c++等调用。
MPI允许静态任务调度,显示并行提供了良好的性能和移植性,用MPI编写的程序可直接在多核集群上运行。
在集群系统中,集群的各节点之间可以采用MPI编程模型进行程序设计,每个节点都有自己的内存,可以对本地的指令和数据直接进行访问,各节点之间通过互联网络进行消息传递,这样设计具有很好的可移植性,完备的异步通信功能,较强的可扩展性等优点。
MPI模型存在一些不足,包括:
程序的分解、开发和调试相对困难,而且通常要求对代码做大量的改动;通信会造成很大的开销,为了最小化延迟,通常需要大的代码粒度;细粒度的并行会引发大量的通信;动态负载平衡困难;并行化改进需要大量地修改原有的串行代码,调试难度比较大。
(2)MPICH和OpenMPI:
它们都是采用MPI标准,在并行计算中,实现节点间通信的开源软件。
各自有各自的函数,指令和库。
Reference:
TheyaretwoimplementationsoftheMPIstandard.Inthelate90sandearly2000s,thereweremanydifferentMPIimplementations,andtheimplementorsstartedtorealizetheywereallre-inventingthewheel;therewassomethingofaconsolidation.TheLAM/MPIteamjoinedwiththeLA/MPI,FT-MPI,andeventuallyPACX-MPIteamstodevelopOpenMPI.LAMMPIstoppedbeingdevelopedin2007.ThecodebaseforOpenMPIwascompletelynew,butitbroughtinideasandtechniquesfromallthedifferentteams.
Currently,thetwomajoropen-sourceMPIimplementationcode-basesareOpenMPIandMPICH2.
而MPICH2是MPICH的一个版本。
有的计算机厂商,也会针对旗下机型特点,自主开发基于MPICH的MPI软件,从而使机器的并行计算效率得以提高。
(3)OpenMP:
在节点内(多核SMP)执行的基于共享内存的编程模型。
OpenMP是针对单主机上多核/多CPU并行计算而设计的工具,换句话说,OpenMP更适合单台计算机共享内存结构上的并行计算。
由于使用线程间共享内存的方式协调并行计算,它在多核/多CPU结构上的效率很高、内存开销小、编程语句简洁直观,因此编程容易、编译器实现也容易(现在最新版的C、C++、Fortran编译器基本上都内置OpenMP支持)。
不过OpenMP最大的缺点是只能在单台主机上工作,不能用于多台主机间的并行计算。
安装参考帖子1:
硬件:
SMP服务器,4个CPU(XeonE7450),内存64G,ATI显卡
软件:
RedHatEnterprise4,gcc3.4.6
前言:
由于服务器比较老,而且我没有root权限,安装起来很不方便,各种软件和库都没有,都是下载后手工编译安装的,用了3天时间,除了GPU和CUDA因为是ATI显卡的原因无法安装外,成功安装了各个包
参考网上教程和manul安装还比较顺利,但是有几个包特别麻烦...写出来分享下,希望能帮到需要的人
USER-ATC:
先将MPI的头文件,用-I包含,但由于gcc版本太低,所以总是报错,手动安装gcc4.8.1后libatc.a顺利编译,但lammps编译时报错dsygvd,dgesvd两个函数找不到,google下发现是BLAS和LAPACK里的函数,由此怀疑是lammps自带的linalg库有问题,自己下载GotoBLAS或者LAPACk都可以,解决
USER-AWPMD:
这个也比较坑爹,主要是makefile只有Makefile.openmpi,但是我编译lammps用的mpich,文档又说库和lammps编译时用的mpi要一致,解决办法是手动修改Makefile.openmpi中CC编译器为mpich的mpicxx,这样有一些警告,但是能顺利编译库,和lammps
USER-REAXC:
要将连接库的名字与ifort库中的完全一致,-lifcore-lsvml-liompstubs5-limf,特别是-liompstubs5跟以前的版本不一样了
KIM:
这个很好解决,下载openkim-ati库,google下即可,下载编译后将头文件的目录-I连接上
VORONOI:
也需要自己下载voro++源码,手动编译出来即可
libjpeg:
下载libjpeg源码,手工编译即可
附上我lammps的makefile,仅供参考
[cpp] viewplain copy
1.# my = RedHat Linux box, g++ (v3), MPICH, FFTW3
2.
3.SHELL = /bin/sh
4.
5.# ---------------------------------------------------------------------
6.# compiler/linker settings
7.# specify flags and libraries needed for your compiler
8.
9.CC = g++481 //自己link的gcc4.8.1
10.CCFLAGS = -g -O
11.SHFLAGS = -fPIC
12.DEPFLAGS = -M
13.
14.LINK = g++481 //同上
15.LINKFLAGS = -g -O
16.LIB =
17.SIZE = size
18.
19.ARCHIVE = ar
20.ARFLAGS = -rc
21.SHLIBFLAGS = -shared
[html] viewplain copy
1.# ---------------------------------------------------------------------
2.# LAMMPS-specific settings
3.# specify settings for LAMMPS features you will use
4.# if you change any -D setting, do full re-compile after "make clean"
5.
6.# LAMMPS ifdef settings, OPTIONAL
7.# see possible settings in doc/Section_start.html#2_2 (step 4)
8.
9.LMP_INC = -DLAMMPS_GZIP -DLAMMPS_JPEG //jpeg包
10.
11.# MPI library, REQUIRED
12.# see discussion in doc/Section_start.html#2_2 (step 5)
13.# can point to dummy MPI library in src/STUBS as in Makefile.serial
14.# INC = path for mpi.h, MPI compiler settings
15.# PATH = path for MPI library
16.# LIB = name of MPI library
17.
18.MPI_INC = -I/home/xhshi/mpich/include/ -DMPICH_SKIP_MPICXX //mpich头文件
19.MPI_PATH =-L/home/xhshi/mpich/lib //mpich库
20.MPI_LIB = -lmpich -lpthread -lmpl //库名称,要一致
21.
22.# FFT library, OPTIONAL
23.# see discussion in doc/Section_start.html#2_2 (step 6)
24.# can be left blank to use provided KISS FFT library
25.# INC = -DFFT setting, e.g. -DFFT_FFTW, FFT compiler settings
26.# PATH = path for FFT library
27.# LIB = name of FFT library
28.
29.FFT_INC = -I/home/xhshi/fftw3/include -DFFT_FFTW3 //fftw3.3.2版本
30.FFT_PATH = -L/home/xhshi/fftw3/lib
31.FFT_LIB = -lfftw3
32.
33.# JPEG library, OPTIONAL
34.# see discussion in doc/Section_start.html#2_2 (step 7)
35.# only needed if -DLAMMPS_JPEG listed with LMP_INC
36.# INC = path for jpeglib.h
37.# PATH = path for JPEG library
38.# LIB = name of JPEG library
[html] viewplain copy
1.JPG_INC = -I/home/xhshi/jpeg6b/include
2.JPG_PATH = -L/home/xhshi/jpeg6b/lib
3.JPG_LIB = -ljpeg
参考文献2:
(非常有用的帖子)
Lammps是做分子模拟的开源软件,其模拟过程和简介可参考这里。
整个安装大致流程是,首先需要安装一些必备的支持软件,然后才是下载并解压lammps源文件得到例如lammps-21Sep12这个文件夹,以下不经特殊说明的路径均是指这个文件夹下的相对路径。
Lammps中包含多个部件包(package),各个部件包具有不同的功能,因此用户可以依据自己模拟体系的需要进行选装。
我喜欢大。
。
。
也喜欢全。
。
。
就是喜欢大而全,所以在后面会尽可能的把所有的包都装上。
部件包分为标准包和用户包,标准包由官方开发,它们包括asphere、kspace、meam等;用户包则出自一些比较牛x的用户,例如user-misc、user-colvars、usr-cuda等。
你可以在src目录下执行make命令查看所有包的名称、增添包的方法、clean和src/MAKE目录下各种预置的编译配置文件Makefile.foo的介绍。
这些Makefile文件是官方根据不同主流机器硬件、编译环境预先给用户写好的,虽然绝大多数情况下直接使用还是无法成功,但作为模板文件只需要对其中的一小部分进行相应修改就可以用了。
例如Makefile.g++就适用于g++编译器环境的系统,而Makefile.openmpi就适用于安装openmpi软件的系统,注意Makefile文件的后缀(例如前两个文件的后缀就是g++和openmpi)被官方手册统称为foo,编译lammps时只需要使用命令makefoo即可。
foo的意思是,如果你选择MAKE/Makefile.g++作为编译配置文件,那么你编译lammps的命令就是makeg++;如果你选择的是MAKE/Makefile.openmpi作为编译配置文件,那么编译lammps的命令就是makeopenmpi。
在选装好各包之后,还需要把包的名称与lib目录下的各文件夹名称对照一下。
例如如果选装了meam包,那么可以看到lib目录中也有这个文件夹,这就表明在编译lammps的时候编译器还需要额外的meam库文件,所以还需要先到lib/meam里面编译一下静态库文件。
这在后面会详细说明。
上述准备工作完成之后,只要在src目录下编译执行makefoo命令,编译成功后就可以得到可执行的lmp_foo文件了,至此大功告成。
下文采用Lammps-21Sep12(版本号8817)为源文件,在Ubuntu12.04LTS上安装。
在安装时,有几个地方可以详细查看安装方法和可能错误的解决方法。
首先是官网安装说明,然后是源文件lammps/src/MAKE/下的Makefile.foo文件,在lammps/lib下各库包内的README、Makefile.foo和Makefile.lammps里均包含了其安装方法和注意要点。
1.必备软件安装
1.1apt-get安装部分
需要用sudoapt-getinstallXXXX的命令安装以下几个包:
build-essential,gfortran,csh或tcsh,libjpeg62,libjpeg62-dbg,libjpeg62-dev。
例如可使用以下命令即可同时安装
清单1:
安装必备软件
$sudoapt-getinstallbuild-essentialgfortrancshlib62lib62-dbglib62-dev
其中gfortran是fortran编译器包,而build-essential是GNUc/c++命令行编译器包,安装后可用下面命令测试一下,反正结果不能为"g++:
"
清单2:
查询g++是否安装
$whereisg++
g++:
/usr/bin/g++ /usr/bin/X11/g++ /usr/share/man/man1/g++.1.gz
csh或tcsh二选一即可,据某经验用户说是“通讯用的”,可能是mpich调用多核并行计算时,各核进行信息和数据共享所用的。
libjpeg的三个包是用来支持lammps输出图片的。
接下来的fftw和mpich均使用原始码安装,嫌麻烦的可以参考这里使用apt-get或ubuntu里的软件中心安装,效果一样的。
1.2FFTW
用于所谓的快速傅立叶计算,如果lammps中不打算安装KSPACE就不用安装fftw了,相应的Makefile.foo文件中fftwlibrary部分的设定可以置空。
下载fftw-2.1.5的源文件,到默认的地方(~/Downloads)。
原始码安装的补习资料可参考这里。
原始码的安装简单而言可依次用./configure、make和makeinstall三条命令完成,这样原始码会采用默认的目录进行安装,即头文件(*.h)在/usr/include,执行文件在/usr/bin,库文件(*.a和*.so)在/usr/lib,当然还包括bin文件、man文件等。
这样做的好处是系统在执行每条命令时会依序在$PATH中找,而上述几个目录已经被系统预添加进$PATH变量中了。
但是弊端在于,虽然根据GNU标准的要求每个源文件都应该提供makeuninstall命令进行卸载,但软件作者均表示无法保证卸载干净。
所以我采用自定义安装目录的方法将fftw安装到/usr/local/fftw2内,这样如果要卸载软件,直接删除该目录即可。
为了方便运行,可以按照后面的方法把/usr/local/fftw2/bin添加到$PATH即可。
清单3:
安装fftw2
$cd/usr/local/src
$sudotarxzvf~/Downloads/fftw-2.1.5.tar.gz
$cdfftw-2.1.5
$sudo./configure--prefix=/usr/local/fftw2--enable-float
$sudomake
$sudomakeinstall
1.3MPI
MPI是用来做并行计算用的,听起来好像只有多台服务器主机同时计算这样的规模才配称为并行,但现在的多核CPU已经非常普遍,2核、4核和8核这样的CPU已经稀松平常了,所以只要你的电脑是多核CPU就可以用到MPI,它可以让CPU里的多个核心一起计算。
当然,如果你死心眼非要只用CPU里的一个核心跑运算也可以,MPI不需要安装,但是你需要编译src/STUB,而且在编译lammps的时候使用Makefile.serial这个文件,但这个不在本文的范围之内。
MPI软件可以有两个选择:
openmpi-1.6.2和mpich2-1.4.1p1,它们的安装可在解压后查看其文件夹中的INSTALL和README这两个文件。
这里以mpich2为例说明其安装,其全套命令如下
清单4:
安装mpich2
$cd/usr/local/src
$sudotarxzvf~/Downloads/mpich2-1.4.1p1.tar.gz
$cdmpich2-1.4.1p1
$sudo./configure--prefix=/usr/local/mpich2
$sudomake
$sudomakeinstall
此前的许多帖子里都说还需要一个~/.mpd.conf文件,可以依次使用touch~/.mpd.conf和chmod600~/.mpd.conf命令即可搞定,而且每次用lmp做并行运算前需要执行一下mpd&命令才行。
但我的单机版lmp好像并不需要这个。
2.lammps的下载和安装
Ericsaid,RTFMandSTFW。
从这里开始就是错误的重灾区了,建议出了问题首先通读官方的手册中对安装部分的介绍:
GettingStarted。
2.1下载
Lammps的下载可采用两种方式,一种是直接去官网下载,然后解压得到lammps-21Sep12(当前版本8817)文件夹;另一种是使用svn更新的方式,这样做的好处是可以随时更新lammps的最新发布,svn可以用Ubuntu软件中心中搜索安装,然后在~下建立一个存放下载lammps的目录,全套命令为
清单5:
svn更新lammps
$mkdir~/lammps
$svncosvn:
//svn.icms.temple.edu/lammps-ro/trunk ~/lammps #同步下载lammps
$cd~/lammps
$svnupdate #更新lammps
$svn–qustatus #查询当前lammps的最新版本
版本的8817状态
2.2编译库文件
lammps中lib目录下含有atc,awpmd,colvars,cuda,gpu,linalg,meam,poems和reax文件夹(红色字体的包因为无法排错而没有安装,因此也就不用编译这几个库文件),为了尽可能安装lammps所有的包,每个都需要进去编译。
我的电脑比较原始,没有显卡运算功能,所以在这里就没有编译和安装cuda和gpu,而atc和awpmd安装失败问题在下面会提到。
以linalg为例,进去后可以发现其中的Makefile只有Makefile.gfortran和Makefile.mingw_cross这两种,文件名的后缀就是这个Makefile适用的编译器。
由于此前已经安装了gfortran编译器,因此需要使用命令make-fMakefile.gfortran进行编译。
这里插一句,lib下的各包,除了awpmd只有Makefile.openmpi、cuda和gpu外,其它所有包中要么有Makefile.g++,要么有Makefile.gfortran,因此在这里使用g++和gfortran这两个编译器就足够了。
下表中为各库文件家中各编译器版的Makefile,第一个即为我所用的Makefile。
LIB
Makefile的后缀
atc
g++,icc,serial,lammps
awpmd
openmpi,lammps
colvars
g++,femi,mingw32-cross,lammps
cuda
无后缀,common,cudalib,defaults,lammps
gpu
femi,lens,lincoln,linux,linux_opencl,longhorn,mac,mac_opencl,serial,serial_opencl,lammps
linalg
gfortran,mingw_cross
meam
gfortran,g95,ifort,pgf90,tbird,lammps,lammps.gfortran,lammps.glory,lammps.ifort
poems
g++,icc,storm,lammps
reax
gfortran,g77,g95,ifort,pgf90,redsky,tbird,lammps,lammps.gfortran,lammps.ifort
各包中均包含README文件,里面指出如果编译成功了,会生成静态库文件lib*.a和配置文件Makefile.lammps,它俩为接下来的lammps编译所用。
atc是需要BLAS(BasicLinearAlgebraSubroutines)和LAPACK(LinearAlgebraRoutines)的,如果系统没有安装这两个东西,有两种解决办法:
要么编译lib中的linalg并利用它做伪BLAS和LAPACK,然后再供atc编译时调用。
但在对atc使用make-fMakefile.g++编译时提示错误:
mpi.h没有那个文件或目录。
要么apt-get安装了li