MPI笔记_计算机软件及应用_IT计算机_专业资料.docx

上传人:文*** 文档编号:68225749 上传时间:2022-12-27 格式:DOCX 页数:18 大小:142.99KB
返回 下载 相关 举报
MPI笔记_计算机软件及应用_IT计算机_专业资料.docx_第1页
第1页 / 共18页
MPI笔记_计算机软件及应用_IT计算机_专业资料.docx_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《MPI笔记_计算机软件及应用_IT计算机_专业资料.docx》由会员分享,可在线阅读,更多相关《MPI笔记_计算机软件及应用_IT计算机_专业资料.docx(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1,数据类型MPI_Status 状态类型MPLAint地址偏移类型MPI.Datatype 数据类型 MPI_Comm通信域类型 MPI_Group 组类型 MPLOp归约操作类型 MPI_Request MPI_Errhandler MPI_Copy_function MPI_Delete_function MPI_User_function2. MPI预定义的与C 一致的数据类型MPI预定义数据类型相应的cMPI CHARsigned charMPLSHORTsigned short intMPI INTsigned intMPLLONGsigned long intMPI UNSIGN

2、ED CHARunsigned charMPI UNSIGNED_SHORTunsigned short intMPLUNSIGNEDunsigned intMPI UNSIGNED-LONGunsigned long intMPLFLOATfloatMPLDOUBLEdoubleMPLLONG-DOUBLElong doubleKPLBYTE无对应类型MPI PACKED无对应类型附加的数据类型:MPLLONG.LONGNTlong long int其他:复数型(MPLCOMPLEX)、逻辑型(MPLLOGICAL)、浮点型(MPLREAL MPI_DOUBLE_PRECISION)3. M

3、PI.MAXLOC和MPI.MINLOC在C中用到的类型MP1数据类型对应的c类型MPI FLOAT INTstruct float, int |MPI LONG INTstruct long, int MPI DOUBLE INTstruct double, int MPI SHORT INTstruct short, int )MPI 2INTstruct ! inu int !MPI_LONG_DOUBLE_INTstmct long double, int;可选MPI_LONG_LONG_INTstruct long long, int:可选MPI数据类型用途MPI PACKEDFor

4、 MPI Pack and MPI UnpackMPI UBFor MPI Type struct; an upper-bound indicatorMP1_LBFor MPI Type struct; a lower-bound indicator5.通信域,在C中其类型为MPI.Comm可用的預定义通信域含义MPI_COMM_WORLD包含所有进程MP1_COMM_SELF只包含调用进程本身6 .进程组,进程组在C中是MPI_Group类型预定义进程组含义MPI_GROUP_EMPTY不包含任何成员的进程组7 .进程组比较结果比较返回的结果含义MPIJDENT完全相同MPI_CONGRUE

5、NT进程组完全相同MPI_SIM1LAR成员相同但顺序不同MPIJJNEQUAL不同8 .组调用,些组调用要进行运算操作(MPI_REDUCE , MP1.ALLREDUCE , MPI_REDUCE_SCATTER, MPI_SCAN),该操作的类型在 C 中是 MPI_Op 类型发定义也调用操作及含义MPLMAX大他MPI MIN小被MPI.SUM求和MPI-PROD求61MPLLAND逻班MPI.BAND技位与MPI_LOR選拗或MPLBOR技位或MPI_LXOR逻釈片或MPIBXOR技位异或MPLMINLOC返回最小值和位置MPLMAXLOC返回最大位和位置9 .关键字值关键字含义MP

6、I_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用于无定义或不知道

7、的整数值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笛卡儿拓扑13 . MPI状态,MPLStatus数据类型的结构,它包括三个成员状态成员含义MPI_SOURCE发送消息的进程MP1_TAG该消息的标识MPI_ERROR返回的错误代码14 .其它类型

8、与函数MPI-Aintc中的地址类型MPl_Handler functionC中处理错误的函数M PI_U ser_functionC中的用户定义函数M Pl_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

9、_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

10、_PENDING孤立挂起对象MPI_ERR_REQUEST不合法的对象句柄MPI_ERR_LASTCODE最后个错误代码16. MPI的类型匹配规则MPI_BYTE和MPI.PACKED可以和任何以字节为单位的存储相匹配,包含这些字节的类型 是任意的,MPI_TYPE用于不加修改地传送内存中的二进制值,MPLPACK用于数据的打 包和解包(MPLUNPACK)。类型匹配规则可以概括为:有类型数据的通信,发送方和接收方均使用相同的数据类型。无类型数据的通信,发送方和接收方均以MPLBYTE作为数据类型。打包数据的通信,发送方和接收方均使用MPLPACKED.发送MPLPACKED格式的数据可以用

11、任意数据类型来接收,只要它和实际接收到的消 息的数据类型相匹配;以任何类型发送的消息(包括MPLPACKED类型)都可以用 MPLPACKED类型接收。17. MPI通信域MPI通信域包括两部分:进程组和通信上下文。进程组即所有参加通信的进程的集合。通信 上下文提供个相对独立的通信区域,不同的消息在不同的上下文中进行传递,不同上下文 的消息互不干涉,通信上下文可以将不同的通信区别开来。18,安全的通信调用次序当两个进程需要相互交换数据时,个进程的发送操作在前,接收操作在后;而另一个进程 的接收操作在前,发送操作在后,前后两个发送和接收操作要相互匹配。19. MP!并行程序的两种基本模式对等模式

12、:MPI程序的各个进程的功能、地位相同或相近,MPI程序的代码也应该是相近 的,所不同的只是处理的对象和操作的数据。主从模式:MPI程序的各个进程所起的作用和地位并不相同,一个或者些进程完成一类任 务,而另外的进程完成其它的任务,这些功能或者地位不同的进程所对应的代码也有较大的 差别。20. 虚拟进程虚拟进程(MPLPROC一NULL)是不存在的假想进程,在MPI中的主要作用是充当真实进 程通信的目或源。一个真实进程向虚拟进MPI_PRC_NULL发送消息时会立即成功返回,一 个真实进程从虚拟进程MPLPROC一NULL的接收消息时也会立即成功返回,并且对接收缓 冲区没有任何改变。21. MP

13、I的四种通信模式表格6 MPI的通信模式通信模式发送接收标准通信模式MP1_SENDMP1_RECV緩存通信模式MPLBSEND同步通信模式MPI_SSEND就绪通信模式MPI_RSEND标准通信模式:是否对发送的数据进行缓存是由MPI自身决定的,而不是山并行程序员来 控制。对于非阻塞通信,发送操作虽然没有完成,但是发送调用可以正确返冋。进程1接收消息进程发送消息不依赖依赖接收埠程 接喔进程发送完成緩存消息发送完成全部接收开始接收图32标准通信模式缓存通信模式:由用户直接对通信缓冲区进行申请、使用和释放。缓存通信模式不管接收操 作是否启动,发送操作都可以执行,当缓存发送返回后,只有当缓冲区中的

14、消息发送出去后, 可以释放该缓冲区。对丁非阻塞发送,正确退出并不意味者缓冲区可以被其它的操作任意 使用。发送进程图33缓存通信模式MPLBUFFER.ATTACH将大小为size的缓冲区递交给MPLMPLBUFFER-DETACH将提交的大小为size的缓冲区buffer收回,该调用是阻塞调用,它 一直等到使用该缓存的消息发送完成后才返回。#include mpi.h#include int main (int argc, char *argv)(int id,size;MPI_Status status;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM

15、_WORLD, &id);if(id=O)int se=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,uCant allocate bsend buffer of size %dnM,bsize);MPI_Abort(MPI_COMM_WORLD, 1);)MPI_Buffer_attach(buffer,bsize+MPI

16、_BSEND_OVERHEAD);MPI_Bsend(&se, 1 ,MPI_INT, 1,99,MPI_COMM_WORLD);MPI_Buffer_detach(&dbuffer,&dsize);else(int re;MPI_Recv(&re, 1, MPINT, 0, 99,MPI_COMM_WORLD, &status);printf(Hid=%d received %dn”,id, re);MPI_Finalize();)同步通信模式:同步发送却必须等到相应的接收进程开始后可以正确返回。同步发送返回 后,意味着发送缓冲区中的数据已经全部被系统缓冲区缓存,因此发送缓冲区可以被释放或

17、重新使用。图34同步通信模式就绪通信模式:只有当接收进程的接收操作已经启动时,发送进程才可以肩动发送操作,发 送的正确返回则发送缓冲区可以重复使用。要求接收操作先于发送操作而被启动。对于非 阻塞发送操作的正确返回,并不意味着发送已完成。22.非阻塞通信阻塞通信:发送进程接收进程图35就绪通信模式明塞与萋阻塞调用的対比阻通信非阻通信在通信完成之前不 能做其它的事情在通信执行过程中 可以执行其操作图45阻塞消息发送和接收非阻塞通信:主要用于计算和通信的重叠,在该通信硬件完成该通信操作的同时,处理机可 以同时进行计算操作。由于当非阻塞通信调用返回时一般该通信操作还没有完成,因此对于 非阻塞的发送操作

18、,发送缓冲区必须等到发送完成后才能释放。同理对于非阻塞的接收操作, 该调用返回后并不意味着接收消息已全部到达,必须等到消息到达后可以引用接收到的消 息数据。表格7非阻塞MPI通信模式通信模式发送接收标准通信模式MP1JSENDMPI_IRECV缓存通信模式MPIJBSEND同步通信模式MPLISSEND就绪通信模式MP1JRSEND重复非阻塞通信标准通信模式MPI_SENDJNITMP1_RECVJNIT缓存通信模式MPLBSENDJNIT同步通信模式MP1_SSEND_INIT就绪通信模式MPI RSENDJN1T表格8非阻塞通信的完成与检测非阻塞通信的数量检测完成个非阻塞通信MP1_TES

19、TMP1_WAIT任意个非阻塞通信MP1_TESTANYMPI_WAITANY一到多个非阻塞通信MP1_TESTSOMEMPI_WAITSOME所有非阻塞通信MPI_TESTALLMPI_WAITALL阻塞发送非阻塞发送标准通信模式 缓存通信模式 同步通信模式 就绪通信模式 标准通信模式 缓存通信模式 同步通信模式 就绪通信模式图48不同类型的发送与接收的匹配非阻塞标准通信:MPIJSEND:调用返回立即返回,并不意味着消息已经成功发送它只表示该消息可被发送。 MPIJRECV:调用的返回并不意味着已经接收到了相应的消息,它只表示符合要求的消息 可以被接收。非阻塞同步通信:MPIJSSEND,

20、返回只是意味着相应的接收操作已经启动,并不表示消息 发送的完成。非阻塞缓存通信:需要程序员主动为该发送操作提供发送缓冲区。非阻塞就绪通信:MPIJRSEND,当调用启动之前相应的接收操作必须已经启动。23 .非阻塞通信的MPI_ WAIT与MPI.TEST单个非阻塞通信:MPLWAIT:等到非阻塞通信完成后返回,同时释放该阻塞通信对象。MPLTEST:若该非阻塞通信已经结束,则它和MPLWAIT的效果完全相同,完成标志 flag=true!若非阻塞通信还没有完成,不必等待该非阻塞通信的完成而是可以直接返回,但 是完成标志flag=false,同时也不释放相应的非阻塞通信对象。 多个非阻塞通信:

21、MPLWAITANY:等待非阻塞通信对象表中任何一个非阻塞通信对象i的完成,释放已完成 的非阻塞通信对象然后返回,index=i,即完成的是非阻塞通信对象表中的第i个对象对应的 非阻塞通信。MPLWAITALL:必须等到非阻塞通信对象表中所有的非阻塞通信对象相应的非阻塞操作都 完成后返回。MPLWAITSOME:只要有一个或多个非阻塞通信完成,则该调用就返回。MPLTESTANY:测试非阻塞通信对象表中是否有任何个对象已经完成,如真则令 flag=ture,否则为 falseMPLTESTALL:当所有的非阻塞通信对象都完成时,使得。ag=true返回,并且释放所有 的查询对象:只要有任何个没

22、有完成,则为false返回。MPI_TESTSOME:测试有几个非阻塞通信对象已完成。24 .非阻塞通信对象MPI_Request *非阻塞通信对象是MPI内部的对象,通过个句柄存取,可以识别各种通信操作和判断相 应的非阻塞操作是否完成。所有的非阻塞发送或接收通信都会返回个非阻塞通信对象“。 非阻塞通信的取消MPLCancel:若取消操作调用时相应的非阻塞通信已经开始,则它会正 常完成,不受取消操作的影响:若取消操作调用时相应的非阻塞通信还没有开始,则可以释 放通信占用的资源,取消该非阻塞通信。对于非阻塞通信,即使调用了取消操作,也必须调 用非阻塞通信的完成操作或查询对象的释放操作来释放查询对

23、象。如果个非阻塞通信已经被执行了取消操作,则该通信的MPLWAIT或MPLTEST将释放 取消通信的非阻塞通信对象,并且在返回结果status中指明该通信已经被取消。判断是否取消MPI_TEST_CANCELLED:若返回结果flag=true,则表明该通信经被成功 取消,否则说明该通信还没有被取消。#include mpi.h#include int main (int argc, char *argv)(int id,size,flag;MPI_Request request;MPI_Status status;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI

24、_COMM_WORLD, &id);if(id=O)(int sbuf=100;MPI_Send(&sbuf, 1, MPIJNT, 1,99, MPI_COMM_WORLD );)else(int rbuf;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(%dn”,request);若取

25、消成功后,两者样printf(%dn”,MPI_REQUEST_NULL);若取消成功后,两者样)MPI_Finalize();非阻塞通信对象的释放MPI_Request_free:直接将该对象所占用的资源释放,原来的非阻塞 通信对象request变为MPI_REQUEST_NULL如果与该非阻塞通信对象相联系的通信还没 有完成,则该对象的资源并不会立即移放,它将等到该非阻塞通信结束后再释放。25 .检査消息是否到达非阻塞检查MPIprobe:如果存在个消息可被接收且该消息的信封和MPIJPROBE的消 息信封相匹配,则该调用返冋flag=true和相应的status:否则,立即返回结果fla

26、g=false并 且不对 status 定义。参数可以是 MPLANY-SOURCE、MPI_ANY.TAG。阻塞检查MPLPROBE:是个阻塞调用,只有找到个匹配的消息到达之后它会返回。 非阻塞通信有序接收的语义约束:根据程序的书写顺序,先发送的消息一定被先匹配的接收 调用接收。若在实际运行过程中后发送的消息先到达,它也只能等待。26 .重复非阻塞通信如果一个通信会被重复执行如循环结构内的通信调用,MP!对这样的通信进行优化。重复非阻塞通信需要如下步骤:1通信的初始化,比如MPI_SEND_INIT2 启动通信,MPI_START MPI_Gatherv3、散发 MPI_Scatter、MP

27、I_Scatterv4、组收集 MPI_Allgather MPI_Allgatherv5、全交换 MPLAlltoall、MPI_Aalltoallv#include umpi.h#include #include int main(int argc, char *argv)(int rank,size;int chunk = 2;/每个进程的数据的个数int i,j;int *sb;int *rb;int status,gstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_CO

28、MM_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+ )sbi*chunk+j = i*chunk+j;printf(nmyid=%d,send to id=%d, data%d=%dn,rank,i,j,sbi*chunk+j);rbi*chunk+j = 0;)MPI_Antoall(sb,chunk,MPINT,rb,chunk,MPIJNT,MP

29、I_COMM_WORLD);for (i=0 ; i size ; i+ )(for (j=0 ; j MPI_Datatype28 .进程组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_free29 .通信域

30、MPI_Comm_sizeMPI_Comm_rankMPI_Comm_compareMPI_Comm_dupMPI_Comm_createMPI_Comm_splitMPI_Comm_free30 .组间通信域MPI_Comm_test_interM P I_Comm_remote_sizeMPI_Comm_remote_groupMPI_Intercomm_create31 .属性信息32 .发送不连续的数据:定义新的数据类型、数据的打包和解包派生数据类型:1、连续复制类型的生成MPI_Type_contiguous2、向量数据类型的生成 MPI_Type_vector,MPI_TYPE_C

31、ONTIGUOUS(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_s

32、tructu MPI_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 #include mpi.hint main(int argc, char *argv)(int rank;struct int a; double b value; /定义个包含整型和双精度型的结构*/MPI_Dataty

33、pe mystruct;int blocklens;MPLAint indices2;MPI_Datatype old_types2;MPI_Init( &argc, &argv );MPI_Comm_rank( MPI_COMM_WORLD, &rank);blocklens0 = 1;/新数据类型中包含个整型/ blocklensll = l;/新数据类型中包含一个双精度型*/old_types0 = MPI.INT;/新类型的第一个组成部分是整型/oldjypesl = MPI,DOUBLE;/新类型的第二个组成部分是双精度型/得到整型和双精度型的相对位置*/MPI_Address( &

34、value.a,&indicesO);MPI_Address( &value.b,&indicesl);/设置在新类型中的相对偏移/indicesfl = indices! 1 - indices0;indices =0;MPI_Type_struct( 2, blocklens, indices, old_types, &mystruct );/*生成新的 MPI 数据类型*/MPI_Type_commit( &mystruct );/递交/ doif (rank = 0) scanf( nInput: %d %lf;&value.a, &value.b );/只有进程读需要广播的整型和双精

35、度型数据/MPI_Bcast( &value, 1, mystruct, 0, MPI_COMM_WORLD );/对新数据类型表示的 数据进行广播/printf( Process %d got %d and %lAn, rank, value.a, value .b ); while (value.a = 0);MPI_Type_free(&mystruct);/ 新类型释放*/MPI_Finalize();MPI_Type_extent:以字节为单位返回一个数据类型的跨度extentMPI_Type_size:返回给定数据类型有用部分所占空间的大小,即跨度减去类型中的空隙后 的空间大小MP

36、I_Get_elements:返回的则是以基本的类型为单位的数据的个数MPI_Get_count:返回的是以指定的数据类型为单位,接收操作接收到的数据的个数下界标记类型:MPI_Type_lb上界标记类型:MPI_Type_ub34.打包与解包打包(Pack)和解包(Unpack)操作是为了发送不连续的数据,在发送前显式地把数据包装到,, 个连续的缓冲区;在接收之后从连续缓冲区中解包。入口参数position的值是输出缓冲区中用于打包的起始地址,打包后它的值根据打包消息的 大小来增加;出口参数position的值是被打包的消息占用的输出缓冲区后面的第一个地址。相同类型数据的打包#include

37、 #include mpi.hint main(int argc, char *argv)(int id;int position, i=100j=101,a2;char buffi 1000;MPI_Status status;MPI_Init( &argc, &argv );MPI_Comm_rank( MPI_COMM_WORLD, &id);if (id=0) position =0;/*打包的起始位置*/MPI_Pack(&i,l,MPINT,bufT, 1 00,&position, MPI_COMM_WORLD);printf(nposition:%dnH,position);/

38、*将整数i打包/MPI_Pack(&j, 1 ,MPI_INT,buff, 100,position, MPI_COMM_WORLD);printf(position:%dn”,position);/将整数j打包/MPI_Send(buff,position, MPI.PACKED, 1,0,MPI_COMM_WORLD); else if(id=l) MPI_Recv(a,2, MPINT,0,0,MPI_COMM_WORLD,&status);/ 以整型从进程 0 接收 消息/printf(processor %d received %dn,id,al);)MPI_Finalize();不

39、同类型数据的打包与解包35.笛卡儿拓扑MPI_Cart_create:维处理器阵列3X3的虚拟进程拓扑新编号LOj 2 : 3 5 7 1| 8 i构造虚拟进程拓扑01之切Q构造虚拟进程拓扑同初兩 lyhi 向团画构造虚拟进程拓扑MPI_Cart_shift: MPI_Dims_create: MPI_Cart_get: MPI_Cart_rank: MPI_Cartdim_get: MPI_Cart_coords :下面的例子通过定义虚拟拓扑,实现数据的接传送#include #include mpi.hint main(int argc, char *argv)(int rank,valu

40、e, size, false=O,id;int right_nbr, left_nbr;MPI_Comm ring_comm;MPI_Status status;MPI_Init( &argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &id);MPI_Comm_size(MPI_COMM_WORLD, &size );MPI_Cart_create( MPI_COMM_WORLD, 1, &size, &false, 0, &ring_comm );/创建一维网格false意味着没有周期性(两端外的进程标识为MPI_PROC_NULL)1表示可以重 排序得到

41、的拓扑坐标相邻关系为MPI_PROC_NULL, 0, 1, . , size-1 , MPI_PROC_NULL*/MPI_Cart_shift( ring_comm, 0, 1, &left_nbr, &right_nbr );/通过在定义的网格上的平移得 到左右侧进程的标识if(id=0)printf(nleft_nbr:%d,right_nbr:%dnH,left_nbr,right_nbr);MPI_Comm_rank( ring_comm, &rank);MPI_Comm_size(ring_comm, &size);doif (rank = 0) (/进程负责读入数据并向下个进程

42、传递数据/scanf( d,&value);MPI_Send( & value, 1, MPIJNT, right_nbr, 0, ring_comm );/* 将数据传送到右面的进程/else MPl_Recv( & value, 1, MPI_INT, left_nbr, 0, ring_comm,&status );/ 后面的进程从左边的 进程接收数据/MPI_Send( &value, 1, MPINT, right_nbr, 0, ring_comm );/*将接收到的数据在传递给右 面的进程*/)printf( Trocess %d got %dnH, rank, value );while (value = 0);/若读入的数据非负则继续读入并传递/MPI_Finalize();36.图拓扑37.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁