预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共42页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

MPI并行程序设计什么是MPI?消息传递模型MPI并行程序设计MPI的历史MPI的实现下载地址机房环境机房集群环境六个接口构成的MPI子集1、MPI初始化:MPI_Init函数 用法:MPI_Init(&argc,&argv) 每一个MPI进程调用的第一个MPI函数都是MPI_Init。该函数指示系统完成所有的初始化工作,以备对后续MPI库的调用进行处理。 2、MPI结束:MPI_Finalize函数 用法:MPI_Finalize() 在一个进程执行完其全部MPI库函数调用后,将调用函数MPI_Finalize,从而让系统释放分配给MPI的资源。它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。3、确定进程的标识符 用法:MPI_Comm_rank(MPI_COMM_WORLD,&id) 当MPI初始化后,每一个活动进程变成了一个叫做MPI_COMM_WORLD的通信域中的成员。通信域是一个不透明的对象,提供了在进程之间传递消息的环境。 在一个通信域内的进程是有序的。在一个有p个进程的通信域中,每一个进程有一个唯一的序号(ID号),取值为0~p-1。 进程可以通过调用函数MPI_Comm_rank来确定它在通信域中的序号。 4、确定进程数量 用法:MPI_Comm_size(MPI_COMM_WORLD,&p) 进程通过调用函数MPI_Comm_size来确定一个通信域中 的进程总数。 5、消息发送函数 MPI_SEND(buf,count,datatype,dest,tag,comm) 参数说明: INbuf:发送缓冲区的起始地址 INcount:将要发送的数据的个数 INdatatype:发送数据的数据类型 INdest:目的进程标识号 INtag:消息标志 INcomm:通信域 MPI_SEND将发送缓冲区中的count个datatype数据类型的数据发送到目的进程,目的进程在通信域中的标识号是dest,本次发送的消息标志是tag,使用这一标志,就可以把本次发送的消息和本进程向同一目的进程发送的其他消息区别开。 6、消息接收函数 MPI_RECV(buf,count,datatype,source,tag,comm,status) 参数说明: OUTbuf:发送缓冲区的起始地址 INcount:将发送的数据的个数 INdatatype:发送数据的数据类型 INdest:目的进程标识号 INtag:消息标志 INcomm:通信域 OUTstatus:返回类型(是由三个域组成的结构类型,这三个域分别是:MPI_SOURCE、MPI_TAG和MPI_ERROR) MPI_RECV从指定的进程source接收消息,并且该消息的数据类型和消息标识和本接收进程的datatype和tag相一致,接收到的消息所包含的数据元素的个数最多不能超过count。 MPI预定义数据类型一般的MPI程序设计流程图一个简单的发送和接收的例子#include"mpi.h" #include<iostream.h> #include<string.h> voidmain(intargc,char**argv) { charmessage[20]; inti,myid,numprocs; intnamelen; MPI_Statusstatus; 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); cout<<"HelloWorld!"<<"process"<<myid<<"of"<<numprocs<<"on"<<processor_name<<endl; if(myid==0) {strcpy(message,“Hello,World!"); for(i=1;i<numprocs;i++) {MPI_Send(message,strlen(message),MPI_CHAR,i,99,MPI_COMM_WORLD); cout<<"process0send"<<message<<"to"<<"process"<<myid<<endl; } } else {MPI_Recv(message,20,MPI_CHAR,MPI_ANY_SOURCE,0,MPI_COMM_WORLD,&status); cout<<"process"<<myid<<"recvived"<<message<<"from"<