MPI笔记-计算机软件及应用-IT计算机-专业资料_第1页
MPI笔记-计算机软件及应用-IT计算机-专业资料_第2页
MPI笔记-计算机软件及应用-IT计算机-专业资料_第3页
MPI笔记-计算机软件及应用-IT计算机-专业资料_第4页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,数据类型MPI_Status状态类型MPLAint 地址偏移类型MPI.Datatype数据类型MPI_Comm通信域类型MPI_Group组类型MPLOp归约操作类型MPI_RequestMPI_ErrhandlerMPI_Copy_functionMPI_Delete_functionMPI_User_function2.MPI预定义的与C一致的数据类型MPI预定义数据类型相应的cMPICHARsignedcharMPLSHORTsignedshortintMPIINTsignedintMPLLONGsignedlongintMPIUNSIGNEDCHARunsignedcharMPIUNSIGNED_SHORTunsignedshortintMPLUNSIGNEDunsignedintMPIUNSIGNED-LONGunsignedlongintMPLFLOATfloatMPLDOUBLEdoubleMPLLONG-DOUBLElongdoubleKPLBYTE无对应类型MPIPACKED无对应类型附加的数据类型:MPLLONG.LONG」NT longlongint其他:复数型(MPLCOMPLEX)、逻辑型(MPLLOGICAL)、浮点型(MPLREALヽMPI_DOUBLE_PRECISION)3.MPI.MAXLOC和MPI.MINLOC在C中用到的类型MP1数据类型对应的c类型MPIFLOATINTstruct[float,int|MPILONGINTstruct{long,int}MPIDOUBLEINTstruct{double,int}MPISHORTINTstruct{short,int)MPI2INTstruct!inuint!MPI_LONG_DOUBLE_INTstmct{longdouble,int};可选MPI_LONG_LONG_INTstruct{longlong,int}:可选MPI数据类型用途MPIPACKEDForMPIPackandMPIUnpackMPIUBForMPITypestruct;anupper-boundindicatorMP1_LBForMPITypestruct;alower-boundindicator5.通信域,在C中其类型为MPI.Comm可用的預定义通信域含义MPI_COMM_WORLD包含所有进程MP1_COMM_SELF只包含调用进程本身.进程组,进程组在C中是MPI_Group类型预定义进程组含义MPI_GROUP_EMPTY不包含任何成员的进程组.进程组比较结果比较返回的结果含义MPIJDENT完全相同MPI_CONGRUENT进程组完全相同MPI_SIM1LAR成员相同但顺序不同MPIJJNEQUAL不同.组调用,ー些组调用要进行运算操作(MPI_REDUCE,MP1.ALLREDUCE,MPI_REDUCE_SCATTER,MPI_SCAN),该操作的类型在C中是MPI_Op类型发定义也调用操作及ヤ含义MPLMAX•大他MPIMIN・小被MPI.SUM求和MPI-PROD求61MPLLAND逻班ワMPI.BAND技位与MPI_LOR選拗或MPLBOR技位或MPI_LXOR逻釈片或MPI^BXOR技位异或MPLMINLOC返回最小值和位置MPLMAXLOC返回最大位和位置.关键字值关键字含义MPI_TAG_UB最大的!ag标识数值MPIJ4OSテ主进程标识MPIJOI/O进程标识MPI_WTIME_IS_GLOBAL若MPI_WTIME全局同步则返回1

无效对象标识含义MP1_COMM_NULL无效通信域MP1_OP_NULL无效操作MP1_GROUP_NULL无效进程组MPLDATATYPE_NULL无效数据类型MP1_REQUEST_NULL无效对象MPI_ERRHANDLER_NULL无效错误句柄11.预定义常量常量:名含义MPI_MAX_PROCESSOR_NAME机器名最大长度MP1_MAX_ERROR_STR1NG错误字符串最大长度MPI-UNDEFINED用于无定义或不知道的整数值MPI_UNDEF【NED_RANK不知道的进程标识MP1_KEYVAL_INVAUD未初始化的无效关键字值mpi_bsend_6verhead缓存发送时增加的空间MP1_PROC_NULL空的进程标识MPI_ANY_SOURCE从任何源接收MPI_ANY_TAG匹配任何lag标识MP1_BOTTOM地址空冋的绝対起始地址12.拓扑类型拓扑类别台乂MP1_GRAPH通用图拓扑MPLCART笛卡儿拓扑.MPI状态,MPLStatus数据类型的结构,它包括三个成员状态成员含义MPI_SOURCE发送消息的进程MP1_TAG该消息的标识MPI_ERROR返回的错误代码.其它类型与函数MPI-Aintc中的地址类型MPl_HandlerfunctionC中处理错误的函数MPI_User_functionC中的用户定义函数MPl_Copy_function属性拷贝函数MP1_NULL_COPY_FN预定义拷贝函数MPl_Delete_function删除属性函数MP1_NULL_DELETE_FN删除函数MPI_DUP_FN豆制函数mpi_errors_are_fatal强制退出的错误句柄MPI_ERRORS_RETURN返回错误代码的句柄

错误代码含义MPI_SUCCESS成功MPI_ERR_BUFFER无效缓冲区指针MP1_ERR_COUNT无效记数参数MPI_ERR_TYPE无效数据类型MPI_ERR_TAG无效tag标识MPI_ERR_COMM无效通信域MP1_ERR_RANK无效进程标识MPI_ERR_ROOT无效ROO!根进程MP1_ERR_GROUP传递给函数的组为空MPI_ERR_OP无效操作MP1_ERR_TOPOLOGY无效拓扑MPI_ERR_DIMS不合法的维MPI_ERR_ARG无效参数MP1_ERR_UNKNOWN未知的错误MPI_ERR_TRUNCATE接收时'消息被核断MPI_ERR_OTHER用错误字符串表示的其它错误MP1_ERR_INTERN内部错误代码MPI_ERRJN_STATUS错误在status中MPI_ERR_PENDING孤立挂起对象MPI_ERR_REQUEST不合法的对象句柄MPI_ERR_LASTCODE最后ー个错误代码MPI的类型匹配规则MPI_BYTE和MPI.PACKED可以和任何以字节为单位的存储相匹配,包含这些字节的类型是任意的,MPI_TYPE用于不加修改地传送内存中的二进制值,MPLPACK用于数据的打包和解包(MPLUNPACK)。类型匹配规则可以概括为:有类型数据的通信,发送方和接收方均使用相同的数据类型。无类型数据的通信,发送方和接收方均以MPLBYTE作为数据类型。打包数据的通信,发送方和接收方均使用MPLPACKED.发送MPLPACKED格式的数据可以用任意数据类型来接收,只要它和实际接收到的消息的数据类型相匹配;以任何类型发送的消息(包括MPLPACKED类型)都可以用MPLPACKED类型接收。MPI通信域MPI通信域包括两部分:进程组和通信上下文。进程组即所有参加通信的进程的集合。通信上下文提供ー个相对独立的通信区域,不同的消息在不同的上下文中进行传递,不同上下文的消息互不干涉,通信上下文可以将不同的通信区别开来。18,安全的通信调用次序当两个进程需要相互交换数据时,ー个进程的发送操作在前,接收操作在后;而另一个进程的接收操作在前,发送操作在后,前后两个发送和接收操作要相互匹配。

MP!并行程序的两种基本模式对等模式:MPI程序的各个进程的功能、地位相同或相近,MPI程序的代码也应该是相近的,所不同的只是处理的对象和操作的数据。主从模式:MPI程序的各个进程所起的作用和地位并不相同,一个或者ー些进程完成一类任务,而另外的进程完成其它的任务,这些功能或者地位不同的进程所对应的代码也有较大的差别。虚拟进程虚拟进程(MPLPROC一NULL)是不存在的假想进程,在MPI中的主要作用是充当真实进程通信的目或源。一个真实进程向虚拟进MPI_PRC_NULL发送消息时会立即成功返回,一个真实进程从虚拟进程MPLPROC一NULL的接收消息时也会立即成功返回,并且对接收缓冲区没有任何改变。MPI的四种通信模式表格6MPI的通信模式通信模式发送接收标准通信模式MP1_SENDMP1_RECV緩存通信模式MPLBSEND同步通信模式MPI_SSEND就绪通信模式MPI_RSEND标准通信模式:是否对发送的数据进行缓存是由MPI自身决定的,而不是山并行程序员来控制。对于非阻塞通信,发送操作虽然没有完成,但是发送调用可以正确返冋。进程1进程1接收消息不依赖 依赖接收埠程す接喔进程发送完成緩存消息发送完成全部接收开始接收发送完成緩存消息发送完成全部接收开始接收图32标准通信模式缓存通信模式:由用户直接对通信缓冲区进行申请、使用和释放。缓存通信模式不管接收操作是否启动,发送操作都可以执行,当缓存发送返回后,只有当缓冲区中的消息发送出去后,ォ可以释放该缓冲区。对丁・非阻塞发送,正确退出并不意味者缓冲区可以被其它的操作任意使用。发送进程发送进程图33缓存通信模式MPLBUFFER.ATTACH将大小为size的缓冲区递交给MPLMPLBUFFER-DETACH将提交的大小为size的缓冲区buffer收回,该调用是阻塞调用,它一直等到使用该缓存的消息发送完成后才返回。#include"mpi.h"#include<stdio.h>intmain(intargc,char*argv[])(intid,size;MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&id);if(id==O)intse=100;int*buffer,*dbuffer,bsize,dsize;MPI_Pack_size(1,MPI_INT,MPI_COMM_WORLD,&bsize);buffer=(int*)malloc(bsize+MPI_BSEND_OVERHEAD);if(!buffer){fprintf(stderr,uCan'tallocatebsendbufferofsize%d\nM,bsize);MPI_Abort(MPI_COMM_WORLD,1);)MPI_Buffer_attach(buffer,bsize+MPI_BSEND_OVERHEAD);MPI_Bsend(&se,1,MPI_INT,1,99,MPI_COMM_WORLD);MPI_Buffer_detach(&dbuffer,&dsize);}else(intre;MPI_Recv(&re,1,MPI」NT,0,99,MPI_COMM_WORLD,&status);printf(Hid=%dreceived%d\n”,id,re);}MPI_Finalize();)同步通信模式:同步发送却必须等到相应的接收进程开始后オ可以正确返回。同步发送返回后,意味着发送缓冲区中的数据已经全部被系统缓冲区缓存,因此发送缓冲区可以被释放或重新使用。图34同步通信模式就绪通信模式:只有当接收进程的接收操作已经启动时,发送进程才可以肩动发送操作,发送的正确返回则发送缓冲区可以重复使用。要求接收操作先于发送操作而被启动。对于非阻塞发送操作的正确返回,并不意味着发送已完成。22.非阻塞通信阻塞通信:发送进程接收进程图35就绪通信模式明塞与萋阻塞调用的対比阻・通信 非阻・通信在通信完成之前不能做其它的事情22.非阻塞通信阻塞通信:发送进程接收进程图35就绪通信模式明塞与萋阻塞调用的対比阻・通信 非阻・通信在通信完成之前不能做其它的事情在通信执行过程中可以执行其セ操作图45阻塞消息发送和接收非阻塞通信:主要用于计算和通信的重叠,在该通信硬件完成该通信操作的同时,处理机可以同时进行计算操作。由于当非阻塞通信调用返回时一般该通信操作还没有完成,因此对于非阻塞的发送操作,发送缓冲区必须等到发送完成后才能释放。同理对于非阻塞的接收操作,该调用返回后并不意味着接收消息已全部到达,必须等到消息到达后オ可以引用接收到的消息数据。

表格7非阻塞MPI通信模式通信模式发送接收标准通信模式MP1JSENDMPI_IRECV缓存通信模式MPIJBSEND同步通信模式MPLISSEND就绪通信模式MP1JRSEND重复非阻塞通信标准通信模式MPI_SENDJNITMP1_RECVJNIT缓存通信模式MPLBSENDJNIT同步通信模式MP1_SSEND_INIT就绪通信模式MPIRSENDJN1T表格8非阻塞通信的完成与检测非阻塞通信的数量检测完成ー个非阻塞通信MP1_TESTMP1_WAIT任意ー个非阻塞通信MP1_TESTANYMPI_WAITANY一到多个非阻塞通信MP1_TESTSOMEMPI_WAITSOME所有非阻塞通信MPI_TESTALLMPI_WAITALL阻塞发送非阻塞发送标准通信模式缓存通信模式同步通信模式就绪通信模式标准通信模式缓存通信模式同步通信模式就绪通信模式阻塞发送非阻塞发送图48不同类型的发送与接收的匹配非阻塞标准通信:MPIJSEND:调用返回立即返回,并不意味着消息已经成功发送它只表示该消息可被发送。MPIJRECV:调用的返回并不意味着已经接收到了相应的消息,它只表示符合要求的消息可以被接收。非阻塞同步通信:MPIJSSEND,返回只是意味着相应的接收操作已经启动,并不表示消息发送的完成。非阻塞缓存通信:需要程序员主动为该发送操作提供发送缓冲区。非阻塞就绪通信:MPIJRSEND,当调用启动之前相应的接收操作必须已经启动。.非阻塞通信的MPI_WAIT与MPI.TEST单个非阻塞通信:MPLWAIT:等到非阻塞通信完成后オ返回,同时释放该阻塞通信对象。MPLTEST:若该非阻塞通信已经结束,则它和MPLWAIT的效果完全相同,完成标志flag=true!若非阻塞通信还没有完成,不必等待该非阻塞通信的完成而是可以直接返回,但是完成标志flag=false,同时也不释放相应的非阻塞通信对象。多个非阻塞通信:MPLWAITANY:等待非阻塞通信对象表中任何一个非阻塞通信对象i的完成,释放已完成的非阻塞通信对象然后返回,index=i,即完成的是非阻塞通信对象表中的第i个对象对应的非阻塞通信。MPLWAITALL:必须等到非阻塞通信对象表中所有的非阻塞通信对象相应的非阻塞操作都完成后オ返回。MPLWAITSOME:只要有一个或多个非阻塞通信完成,则该调用就返回。MPLTESTANY:测试非阻塞通信对象表中是否有任何ー个对象已经完成,如真则令flag=ture,否则为false«MPLTESTALL:当所有的非阻塞通信对象都完成时,オ使得。ag=true返回,并且释放所有的查询对象:只要有任何ー个没有完成,则为false返回。MPI_TESTSOME:测试有几个非阻塞通信对象已完成。.非阻塞通信对象MPI_Request*非阻塞通信对象是MPI内部的对象,通过ー个句柄存取,可以识别各种通信操作和判断相应的非阻塞操作是否完成。所有的非阻塞发送或接收通信都会返回・个’‘非阻塞通信对象“。非阻塞通信的取消MPLCancel:若取消操作调用时相应的非阻塞通信已经开始,则它会正常完成,不受取消操作的影响:若取消操作调用时相应的非阻塞通信还没有开始,则可以释放通信占用的资源,取消该非阻塞通信。对于非阻塞通信,即使调用了取消操作,也必须调用非阻塞通信的完成操作或查询对象的释放操作来释放查询对象。如果ー个非阻塞通信已经被执行了取消操作,则该通信的MPLWAIT或MPLTEST将释放取消通信的非阻塞通信对象,并且在返回结果status中指明该通信已经被取消。判断是否取消MPI_TEST_CANCELLED:若返回结果flag=true,则表明该通信」经被成功取消,否则说明该通信还没有被取消。#include"mpi.h"#include<stdio.h>intmain(intargc,char*argv[])(intid,size,flag;MPI_Requestrequest;MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&id);if(id==O)(intsbuf=100;MPI_Send(&sbuf,1,MPIJNT,1,99,MPI_COMM_WORLD);)else(intrbuf;MPI_Irecv(&rbuf,1,MPIJNT,0,99,MPI_COMM_WORLD,&request);MPI_Cancel(&request);MPI_Wait(&request,&status);//必须调用此函数,以确保真的取消了MPI_Test_cancelled(&status,&flag);if(flag)(printf("%d\n”,request);〃若取消成功后,两者ー样printf("%d\n”,MPI_REQUEST_NULL);〃若取消成功后,两者ー样})MPI_Finalize();非阻塞通信对象的释放MPI_Request_free:直接将该对象所占用的资源释放,原来的非阻塞通信对象request变为MPI_REQUEST_NULL»如果与该非阻塞通信对象相联系的通信还没有完成,则该对象的资源并不会立即移放,它将等到该非阻塞通信结束后再释放。.检査消息是否到达非阻塞检查MPI」probe:如果存在ー个消息可被接收且该消息的信封和MPIJPROBE的消息信封相匹配,则该调用返冋flag=true和相应的status:否则,立即返回结果flag=false并且不对status定义。参数可以是MPLANY-SOURCE、MPI_ANY.TAG。阻塞检查MPLPROBE:是ー个阻塞调用,只有找到ー个匹配的消息到达之后它オ会返回。非阻塞通信有序接收的语义约束:根据程序的书写顺序,先发送的消息一定被先匹配的接收调用接收。若在实际运行过程中后发送的消息先到达,它也只能等待。.重复非阻塞通信如果一个通信会被重复执行如循环结构内的通信调用,MP!对这样的通信进行优化。重复非阻塞通信需要如下步骤:1通信的初始化,比如MPI_SEND_INIT2启动通信,MPI_START < 重复3完成通信,MP1_WAIT ►14杼放査询对象,MP1_REQUEST_FREE消息真正开始通信是由MPLSTART触发的;消息的完成操作并不释放相应的非阻塞通信对象只是将其状态置为非活动状态。初始化重复非阻塞通信MPI_Send_init:MPI_Bsend_init:MPI_Ssend_init:MPI_Rsend_init:MPI_Recv_init:启动非阻塞通信MPI_Start:MPI_Startall:ー个用MPLSTART初始化的发送操作可以被任何接收操作匹配,类似地,ー个用MPLSTART初始化的接收操作可以接收任何发送操作产生的消息。.组通信(通信、同步、计算)k广播MPLBcast2、收集MPI_Gather>MPI_Gatherv3、散发MPI_Scatter、MPI_Scatterv4、组收集MPI_Allgather>MPI_Allgatherv5、全交换MPLAlltoall、MPI_Aalltoallv#includeumpi.h"#include<stdlib.h>#include<stdio.h>intmain(intargc,char*argv[])(intrank,size;intchunk=2;//每个进程的数据的个数inti,j;int*sb;int*rb;intstatus,gstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&size);sb=(int*)malloc(size*chunk*sizeof(int));rb=(int*)malloc(size*chunk*sizeof(int));for(i=0;i<size;i++)(for(j=0;j<chunk;j++){sb[i*chunk+j]=i*chunk+j;printf(nmyid=%d,sendtoid=%d,data[%d]=%d\n",rank,i,j,sb[i*chunk+j]);rb[i*chunk+j]=0;})MPI_Antoall(sb,chunk,MPI」NT,rb,chunk,MPIJNT,MPI_COMM_WORLD);for(i=0;i<size;i++)(for(j=0;j<chunk;j++){printf(umyid=%d,recvfromid=%d,data[%d]=%d\nn,rank,i,j,rb[i*chunk+j]);))free(sb);free(rb);MPI_Finalize();6、同步MPLBaEerフ、归约MPI_Reduce8、组归约MPLAllreduce9、归约并散发MPI_Reduce_scatter10、扫描MPI_Scan11、MINLOC和MAXLOC的值对12、用户自定义归约操作:MPI_Op_create、MPI_Op_free、MPI_Type_contiguous、MPI_Type_commit、MPI_Op>MPI_Datatype.进程组MPI_Group_sizeMPI_Group_rankMPI_Group_translate_ranksMPI_Group_compareMPI_Comm_groupMPI_Group_unionMPI__Group_intersectionMPI_Group_differnceMPI_Group_inclMPI_Group_exclMPI_Group_range_inclMPI_Group_range_exclMPI_Group_free.通信域MPI_Comm_sizeMPI_Comm_rankMPI_Comm_compareMPI_Comm_dupMPI_Comm_createMPI_Comm_splitMPI_Comm_free.组间通信域MPI_Comm_test_interMPI_Comm_remote_sizeMPI_Comm_remote_groupMPI_Intercomm_create.属性信息.发送不连续的数据:定义新的数据类型、数据的打包和解包派生数据类型:1、连续复制类型的生成MPI_Type_contiguous2、向量数据类型的生成MPI_Type_vector,,MPI_TYPE_CONTIGUOUS(count,oldtypc,newtype)调用等价于MPI_TYPE_VECTOR(count,1,1,oldtype,newtype)或调用MPI_TYPE_VECTOR(1,count,n,oldtype,newtype),n为升序3、索引数据类型的生成MPI_Type_indexed。ー个MPI_TYPE_VECTOR(count,blocklength,stride,oldtype,newtype)等价于调用MPI_TYPE_INDEXED(couni,B,D,oldtype,newtype)4、结构数据类型的生成MPI_Type_structuMPI_TYPE_HINDEXED(count,B,D,oldtype,newtype)等价于调用MPI_TYPE_STRUCT(count,B,D,T,newtype),其中T的每一项都等于oldtype新类型递交:MPI_Type_commit类型释放:MPI_Type_free33.地址函数MPI_ADdress#include<stdio.h>#include"mpi.h"intmain(intargc,char**argv)(intrank;struct{inta;doubleb}value;/・定义ー个包含整型和双精度型的结构*/MPI_Datatypemystruct;intblocklens⑵;MPLAintindices[2];MPI_Datatypeold_types[2];MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);blocklens[0]=1;/・新数据类型中包含ー个整型・/blocklensll]=l;/・新数据类型中包含一个双精度型*/old_types[0]=MPI.INT;/・新类型的第一个组成部分是整型・/oldjypes[l]=MPI,DOUBLE;/・新类型的第二个组成部分是双精度型・//・ 得到整型和双精度型的相对位置*/MPI_Address(&value.a,&indices[O]);MPI_Address(&value.b,&indices[l]);/・ 设置在新类型中的相对偏移・/indicesfl]=indices!1]-indices[0];indices⑼=0;MPI_Type_struct(2,blocklens,indices,old_types,&mystruct);/*生成新的MPI数据类型*/MPI_Type_commit(&mystruct);/・递交・/do{if(rank==0)scanf(nInput:%d%lf;&value.a,&value.b);/・只有进程〇读需要广播的整型和双精度型数据・/MPI_Bcast(&value,1,mystruct,0,MPI_COMM_WORLD);/・对新数据类型表示的数据进行广播・/printf("Process%dgot%dand%lAn",rank,value.a,value.b);}while(value.a>=0);MPI_Type_free(&mystruct);/・新类型释放*/MPI_Finalize();MPI_Type_extent:以字节为单位返回一个数据类型的跨度extentMPI_Type_size:返回给定数据类型有用部分所占空间的大小,即跨度减去类型中的空隙后的空间大小MPI_Get_elements:返回的则是以基本的类型为单位的数据的个数MPI_Get_count:返回的是以指定的数据类型为单位,接收操作接收到的数据的个数下界标记类型:MPI_Type_lb上界标记类型:MPI_Type_ub34.打包与解包打包(Pack)和解包(Unpack)操作是为了发送不连续的数据,在发送前显式地把数据包装到,,个连续的缓冲区;在接收之后从连续缓冲区中解包。入口参数position的值是输出缓冲区中用于打包的起始地址,打包后它的值根据打包消息的大小来增加;出口参数position的值是被打包的消息占用的输出缓冲区后面的第一个地址。相同类型数据的打包#include<stdio.h>#include"mpi.h"intmain(intargc,char**argv)(intid;intposition,i=100j=101,a[2];charbuffi1000];MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&id);if(id==0){position=0;/*打包的起始位置*/MPI_Pack(&i,l,MPI」NT,bufT,1〇00,&position,MPI_COMM_WORLD);printf(nposition:%d\nH,position);/*将整数i打包・/MPI_Pack(&j,1,MPI_INT,buff,100〇,々position,MPI_COMM_WORLD);printf("position:%d\n”,position);/・将整数j打包・/MPI_Send(buff,position,MPI.PACKED,1,0,MPI_COMM_WORLD);}elseif(id==l){MPI_Recv(a,2,MPI」NT,0,0,MPI_COMM_WORLD,&status);/・以整型从进程0接收消息・/printf("processor%d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论