MPICH2安装及MPI简介2009-02-1619:02:38|分类:HPC|标签:mpich2的安装mpi|字号大中小订阅ZHI2008-12-14MPICH2的安装下载MPICH2包mpich2.tar.gz解压缩#tarxfzmpich2.tar.gz#mkdir/tmp/root/mpich2-1.0.8#cd/tmp/root/mpich2-1.0.8#/root/Desktop/mpich2-1.0.8/configure--prefix=/usr/local2&1|teeconfigure.log//其中root/Desktop/mpich2-1.0.8/为解压后MPICH2路径#make2&1|teemake.log#makeinstallPACKAGE=mpich-1.0.82&1|teeinstall.log#makeinstallcheckPACKAGE=mpich-1.0.82&1|teeinstallcheck.log测试安装是否成功#whichmpiexec#whichmpd//默认程序管理命令defaultprocessmanager#whichmpicc#whichmpirun注:如果不是安装在/usr/local目录下,则还需设置环境变量。通过编辑.bashrc文件修改环境变量#vi.bashrc修改后的.bashrc文件如下:#.bashrc#UserspecificaliasesandfunctionsPATH=$PATH:/usr/MPICH-install/bin//新增加的#Source.bashrcmpd配置文件中设置密码#cd$HOME#touch.mpd.conf#chmod600.mpd.conf//权限设置为只有自己有读写权限在超级用户下:#cd/etc#vimpd.conf写入secretword=jsi并保存#chmod600/etc/mpd.conf单机测试#mpdmpdtrace//显示本机名为成功#mpiexec–n1/bin/hostname#mpdallexitSSH配置修改所有机器上的/etc/hosts文件为如下内容127.0.0.1localhost.localdomainlocalhost10.10.1.190node0110.10.2.190node02……创建SSH密钥(root目录)#ssh-keygen–trsa//其中-trsa指密钥类型。这样就生成了~/.ssh#cd.ssh#cpid_rsp.pubauthorized_keys//生成authorized_keys文件#cd..#sshnode01//建立本身的信任连接设置其他机器#ssh-keygen–trsa//生成.ssh文件夹#scp10.10.1.190:/root/.ssh/*/root/.ssh#scp10.10.1.190:/etc/hosts对每个节点执行#sshnode01#sshnode02……//提示输入密码-登陆,为成功NFS配置1服务器端#/etc/rc.d/init.d/nfsstart//启动nfs服务#vi/etc/export//编写exports文件,写入需共享目录eg./public/mpinode01(rw)node02(rw)…2客户端#showmount–enfshost//查看NFS服务器上共享资源#mountnfshost:目录本机挂载目录eg.#mkdir/public/mpi#mountnode01:/public/mpi/public/mpi#unmount/public/mpi//卸载(如果需要的话)创建主机名称集合文件/root/mpd.hosts#vimpd.hosts文件内容如下:node01node02…通过mpd.hosts运行集群系统#mpdboot-nnum-fmpd.hosts//num为要起动的机器个数#mpdtrace#mpdallexitMPI并行程序的编译与执行#mpdboot-nnum-fmpd.hosts#mpicccpi.c–ocpi#mpiexec–nnumcpi#mpdallexitMPI简介数据类型MPI预定义数据类型相应的C数据类型MPI_CHARMPI_SHORTMPI_INTMPI_LONGMPI_UNSIGNED_CHARMPI_UNSIGNED_SHORTMPI_UNSIGNEDMPI_UNSIGNED_LONGMPI_FLOATsignedcharsignedshortintsignedintsignedlongintunsignedcharunsignedshortintunsignedintunsignedlongintfloatMPI_DOUBLEMPI_LONG_DOUBLEMPI_BYTEMPI_PACKEDdoublelongdouble无对应类型无对应类型常用接口1.MPI_INIT()MPI初始化2.MPI_FINALIZE()MPI结束3.MPI_COMM_RANK(comm,rank)当前进程标识4.MPI_COMM_SIZE(comm,size)通信域包含的进程5.MPI_SEND(buf,count,datatype,dest,tag,comm)INbuf发送缓存的起始地址(选择型)INcount发送缓存的元素的个数(非负整数)INdatatype每个发送缓存元素的数据类型(句柄)INdest目的地进程号(整型)INtag消息标志(整型)INcomm通信域(句柄)消息发送6.MPI_RECV(buf,count,datatype,source,tag,comm,status)OUTbuf接收缓存的起始地址(选择型)INcount接收缓存中元素的个数(整型)INdatatype每个接收缓存元素的数据类型(句柄)INsource发送操作的进程号(整型)INtag消息的标识(整型)INcomm通信组(句柄)OUTstatus状态对象(状态)消息接收7.MPI_SENDRECV(sendbuf,sendcount,sendtype,dest,sendtag,recvbuf,recvcount,recvtype,source,recvtag,comm,status)捆绑发送8.MPI_BCAST(buffer,count,datatype,root,comm)广播9.MPI_REDUCE(sendbuf,recvbuf,count,datatype,op,root,comm)归约进程P1opp2op…rootMPI四种通信模式通信模式发送接收说明标准通信模式MPI_SENDMPI_RECV缓存通信模式MPI_BSENDMPI缓存正出发的消息,以便允许发送调用完成。如果没有充足的缓存空间,一个错误将发生同步通信模式MPI_SSEND需要程序员主动为该操作提供发送缓冲区就绪通信模式MPI_RSEND接收方先就绪,然后开始发送,否则出错MPI非阻塞通信非阻塞通信主要实现计算域通信重叠。由于通信经常需要较长的时间,在阻塞通信还没有结束的时候,处理机只能等待,这要就浪费了处理机的计算资源。非阻塞通信就是设法实现就算与通信的重叠。通信模式发送接收说明标准通信模式MPI_ISENDMPI_IRECV缓存通信模式MPI_IBSEND接口返回意味着相应的接收操作已经启动同步通信模式MPI_ISSEND同样需要程序员主动为该操作提供发送缓冲区就绪通信模式MPI_IRSEND接收方先就绪,然后开始发送,否则出错例:MPI_ISEND(buf,count,datatype,dest,tag,comm,request)INbuf发送缓存的起始地址(选择类型)INcount发送缓存中元素的个数(整型)INdatatype每个发送缓存元素的数据类型(句柄)INdest目的进程号(整型)INtag消息标志(整型)INcomm通信子(句柄)OUTrequest通信请求(句柄)request非阻塞通信对象:它是MPI内部的对象,通过句柄存取。使用它可以识别非阻塞通信操作的各种特性,如发送模式、与它联结的通信缓冲区、通信上下文、用于发送的标识和目的参数或用于接收的标识和源参数。MPI组通信组通信需要一个特定组内的所有进程同时参加通信,它在各个不同进程的调用完全相同,而不像点到地点通信那样在形式上就有发送和接收的区别。广播相同的数据MPI_BCAST(buffer,count,datatype,root,comm)IN/OUTbuffer通信消息缓冲区的起始地址(可变)INcount通信消息缓冲区中的数据个数(整型)INdatatype通信消息缓冲区中的数据类型(句柄)INroot发送广播的根的序列号(整型)INcomm通信子(句柄)收集MPI_GATHER(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm)INsendbuf发送消息缓冲区的起始地址(可变)INsendcount发送消息缓冲区中的数据个数(整型)INsendtype发送消息缓冲区中的数据类型(句柄)OUTrecvbuf接收消息缓冲区的起始地址(可变,仅对于根进程)INrecvcount待接收的元素个数(整型,仅对于根进程)INrecvtype接收元素的数据类型(句柄,仅对于根进程)INroot接收进程的序列号(整型)INcomm通信子(句柄)散发不同的数据,收集的逆操作MPI_SCATTER(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm)组收集MPI_GATHER是将数据收集到ROOT进程,而MPI_ALLGATHER相当于对每个进程都作为ROOT执行了一次MPI_GATHER调用。MPI_ALLGATHER(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm)全互换每个进程一次将它的发送缓冲区的第i块数据发送给第i个进程;同时每个进程都依次从第j个进程接收数据放到各自接收缓冲区的第j块数据区的位置。MPI_ALLGATHER(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm)示例程序Helloword程序:#include“mpi.h”#includestdio.h#includemath.hvoidmain(argc,argv)intargc;char*argv[];{intmyid,numprocs;intnamelen;charprocessor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Get_processor_name(processor_name,&namelen);printf(stderr,”HelloWorld!Process%dof%don%s\n”,myid,numprocs,processor_name);MPI_Finalize();}PI值计算:/*-*-Mode:C;c-basic-offset:4;-*-*//**(C)2001byArgonneNationalLaboratory.*SeeCOPYRIGHTintop-leveldirectory.*//*Thisisaninteractiveversionofcpi*/#includempi.h#includestdio.h#includemath.hdoublef(double);doublef(doublea){return(4.0/(1.0+a*a))