如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
计算流体力学讲义第六讲MPI并行程序设计(2)李新亮lixl@imech.ac.cn;力学所主楼219;82543801服务器/前端机计算节点基本的MPI函数(6个)MPI初始化MPI_Init(ierr);MPI结束MPI_Finalize(ierr)得到当前进程标识MPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)得到通信域包含的进程数MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)消息发送MPI_Send(buf,count,datatype,dest,tag,comm,ierr)消息接收MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr)MPI的消息发送机制——两步进行MPI_Send(A,…)发送MPI_Recv(B,…)接收MPI_Send()返回后缓冲区可释放sum=……callMPI_Send(sum,……)sum=……变量可重复利用MPI_Recv()返回后缓冲区数据可使用CallMPI_Recv(sum1,……)Sum=sum0+sum1……非阻塞消息发送MPI_ISend(buf,count,datatype,dest,tag,comm,request,ierr)Inbuf,count,datatype,dest,tag,commOutrequest,ierrRequest(返回的非阻塞通信对象,整数)非阻塞消息接收MPI_IRecv(buf,count,datatype,source,tag,comm,request,ierr)Inbuf,count,datatype,source,tag,commOutrequest,ierr非阻塞通信的完成MPI_Wait(request,status,ierr)等待消息收发完成MPI_Test(request,flag,stutus,ierr)MPI_Waitall(const,request_array,status,ierr)等待多个消息完成InrequestOutstatus,flag(logical型)非阻塞通信调用后立即返回,缓冲区不能立即使用Sum=……计算某变量MPI_Isend(sum….)发送该变量sum=……不能给变量重新赋值(发送可能尚未完成)MPI_Irecv(sum1,……)sum=sum0+sum1数据不能立即使用(接收可能未完成)MPI_Isend(sum,…,request,…)……CallMPI_Wait(request,status,ierr)Sum=……√并行程序——以两个进程并行为例realA(N,N/2),B(N,N/2),A1(N),h…………If(myid.eq.0)thencallMPI_send(A(1,N/2),N,MPI_real,1,99,MPI_Comm_world,ierr)callMPI_recv(A1,N,MPI_real,1,99,MPI_Comm_World,status,ierr)ElsecallMPI_recv(A1,N,MPI_real,0,99,MPI_Comm_World,status,ierr)callMPI_send(A(1,1),N,MPI_real,0,99,MPI_Comm_world,ierr)endifIf(myid.eq.0)thenDoi=1,NB(i,1)=(A(i,2)-A(i,1))/hB(i,N)=(A1(i)-A(i,N-1))/(2.*h)EnddoElseDoi=1,NB(i,1)=(A(i,2)-A1(i))/(2.*h)B(i,N)=(A(i,N)-A(i,N-1))/hEnddoendifDoj=2,N-1Doi=1,NB(i,j)=(A(i,j+1)-A(i,j-1))/(2.*h)EnddoEnddo通信与计算重叠realA(N,N/2),B(N,N/2),A1(N),hintegermyid,ierr,req1,req2,status(…)……If(myid.eq.0)thencallMPI_ISend(A(1,N/2),N,MPI_real,1,99,MPI_Comm_world,req1,ierr)callMPI_Irecv(A1,N,MPI_real,1,99,MPI_Comm_World,req2,ierr)ElsecallMPI_Irecv(A1,N,MPI_real,0,99,MPI_Com