当前位置:文档之家› MPI并行编程实验报告

MPI并行编程实验报告

MPI并行编程实验报告起讫日期:xx-05-20 ~全文结束》》-06-15组名:第四组院系:计算机学院专业:计算机科学与技术指导老师:XXX 教授xx 年6月15日实验一Linux下基于MPI的hello程序设计Author:姓名一、MPICH并行计算库安装在Linux环境下安装MPICH执行环境,配置MPD、CONF, 完成实验室中临近机器间的并行配置。

概要:以寝室四台计算机为例,设置IP(192、168、1、1~192、168、1、4),更改主机名为node01,node02,node03,node04。

(一)创建SSH信任连接1、更改/etc/hosts文件#vi /etc/hosts 打开hosts文件,更改如下:127、0、0、1 localhost、localdomain localhost192、168、1、1 node01192、168、1、2 node02192、168、1、3 node03192、168、1、4 node042、在node01生成SSH秘钥对、#ssh-keygena 查看是否有、ssh文件夹3、进入、ssh目录#cd 、ssh4、生成authorized_keys文件#cp id_rsa、pub authorized_keys5、退出到root目录#cd 、、6、建立本身的信任连接#ssh node01 按提示输入yes(三个字母要打全)7、设置node02(node02的root目录下)#ssh-keygenzxvf mpich2-1、0、1、tar、gz2、创建安装目录#mkdir /usr/MPICH-instsll3、进入mpich2解压目录#cd mpich2-1、0、14、设置安装目录#、/configureprefix=/usr/MPICH-install5、编译#make6、安装#make install7、退出到root目录#cd 、、8、通过编辑、bashrc文件修改环境变量#vi 、bashrc修改后的、bashrc文件如下:# 、bashrc# User specific aliases and functions aliasrm='rmi'alias mv='mvinstall/bin" 新增加的#Source global definitionsif[nstall目录输出给其他三个结点,相应的配置步骤如下。

1、以 root 身分登录到 node1 上,确保 node1 上安装了NFS 程序 (nfs-utils 包)。

首先运行一遍下述命令来开启 NFS 服务: /sbin/chkconfig nfs on /sbin/chkconfig nfslock on /etc/init、d/nfslock restart /etc/init、d/nfs restart然后编辑文件 /etc/exports,在其中加入下面二行 (如果该文件不存在则创建一个新文件): /home10、0、0、0/255、255、255、248(rw,async,no_root_squash)/usr/MPICH-install10、0、0、0/255、255、255、248(rw,async,no_root_squash)做好上述修改后执行下面的命令: /sbin/exportfst nfsinstall 目录。

可以在任何一个结点上用 df 命令来验证,例如: # df返回类似下面所示的结果:、、、、、、node1:/home2486326442240284841197428095% /homenode1:/usr/MPICH-install246966888全文结束》》885603353307686% /usr/local(四)环境测试1、本地测试#mpd & 启动 #mpdtrace 观看启动机器#mpdallexit 退出2、通过mpd、hosts运行集群系统#mpdbootf mpd、hosts number为要起动的机器个数#mpdtrace #mpdallexit3、测试运行MPICH的例子程序#mpdbootf mpd、hosts 启动4台机器#mpiexecinstall/exles/cpi number为使用的进程数#mpdallexit二、HELLO WORLD并行程序设计(一)程序源码:/*hello、c*/#include <stdio、h>#include "mpi、h"int main( int argc, char*argv[] ){ int rank; int size; MPI_Init( 0, 0 );MPI_m_rank(MPI_M_WORLD, &rank); MPI_m_size(MPI_M_WORLD, &size); printf( "Hello world from process %d of %d\n", rank, size ); MPI_Finalize(); return 0;}(二)程序编译$mpicc –o hello hello、c(三)运行结果$mpdboot –n <hosts>1,10,*MPI_M_WORLD,ierr)end if C 向右侧的邻居发送数据if (myid 、lt、3)thencallMPI_SEND(a(1,mysize+1),totalsize,MPI_REAL,myid+1,10,* MPI_M_WORLD,ierr)end ifC 从左侧的邻居接收数据if (myid 、gt、 0)thencall MPI_RECV(a(1,1),totalsize,MPI_REAL,myid-1,10,* MPI_M_WORLD,status,ierr)end ifbegin_col=2end_col=mysize+1if (myid 、eq、 0)thenbegin_col=3endifif (myid 、eq、3)thenend_col=mysizeendifdo j=begin_col,end_coldo i=2,totalsize-1b(i,j)=(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j))*0、25end doend dodo j=begin_col,end_coldo i=2,totalsize-1a(i,j)=b(i,j)end doend doend dodo i=2,totalsize-1print *, myid,(a(i,j),j=begin_col,end_col)end docall MPI_Finalize(rc)end捆绑发送接收MPI_SENDRECV(sendbuf,sendcount,sendtype,dest,sendtag,recv buf,recvcount,recvtype, source,recvtag,m,status) IN sendbuf IN sendcount IN sendtype IN dest IN sendtag OUT recvbuf IN recvcount IN recvtype IN source IN recvtag INm OUT status 发送缓冲区起始地址(可选数据类型)发送数据的个数(整型)发送数据的数据类型(句柄)目标进程标识(整型)发送消息标识(整型)接收缓冲区初始地址(可选数据类型)最大接收数据个数(整型)接收数据的数据类型(句柄)源进程标识(整型)接收消息标识(整型)通信域(句柄)返回的状态(status)int MPI_Sendrecv(void *sendbuf, intsendcount,MPI_Datatype sendtype, int dest,int sendtag, void *recvbuf, int recvcount,MPI_Datatype recvtype, int source,int recvtag, MPI_m m, MPI_Status*status)MPI_SENDRECV(SENDBUF, SENDCOUNT, SENDTYPE, DEST, SENDTAG,RECVBUF, RECVCOUNT, RECVTYPE, SOURCE, RECVTAG, M,STATUS, IERROR)<type> SENDBUF(*), RECVBUF(*)INTEGER SENDCOUNT, SENDTYPE, DEST, SENDTAG, RECVCOUNT, RECVTYPE,SOURCE, RECVTAG, M,STATUS(MPI_STATUS_SIZE), IERROR虚拟进程program main implicit none include 'mpif、h' integer totalsize,mysize,steps parameter (totalsize=16) parameter (mysize=totalsize/4,steps=10) integer n, myid, numprocs, i, j,rc reala(totalsize,mysize+2),b(totalsize,mysize+2) integer begin_col,end_col,ierr integer left,right,tag1,tag2 integer status(MPI_STATUS_SIZE) call MPI_INIT( ierr ) call MPI_M_RANK( MPI_M_WORLD, myid, ierr ) callMPI_M_SIZE( MPI_M_WORLD, numprocs, ierr ) print *, "Process ", myid, " of ", numprocs, " is alive"C 数组初始化do j=1,mysize+2do i=1,totalsizea(i,j)=0、0end doend doif (myid 、eq、 0)thendo i=1,totalsizea(i,2)=8、0end doend ifif (myid 、eq、3)thendo i=1,totalsizea(i,mysize+1)=8、0end doend ifdo i=1,mysize+2a(1,i)=8、0a(totalsize,i)=8、0end dotag1=3tag2=4C 设置当前进程左右两侧的进程标识if (myid 、gt、 0)thenleft=myid-1elseleft=MPI_PROC_NULLend ifif (myid 、lt、3)thenright=myid+1elseright=MPI_PROC_NULLend ifC Jacobi 迭代do n=1,stepsC 从左向右平移数据callMPI_SENDRECV(a(1,mysize+1),totalsize,MPI_REAL,right,tag1, *a(1,1),totalsize,MPI_REAL,left,tag1,*MPI_M_WORLD,status,ierr)C 从右向左平移数据callMPI_SENDRECV(a(1,2),totalsize,MPI_REAL,left,tag2,* a(1,mysize+2),totalsize,MPI_REAL,right,tag2,*MPI_M_WORLD,status,ierr)begin_col=2end_col=mysize+1if (myid 、eq、 0)thenbegin_col=3endifif (myid 、eq、3)thenend_col=mysizeendifdo j=begin_col,end_coldo i=2,totalsize-1b(i,j)=(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j))*0、25 end doend dodo j=begin_col,end_coldo i=2,totalsize-1a(i,j)=b(i,j)end doend doend dodo i=2,totalsize-1print *, myid,(a(i,j),j=begin_col,end_col)end docall MPI_Finalize(rc)end实验三基于MPI计算π值Author:姓名一、实验题目用 MPI 技术计算π的值。

相关主题