MPI并行程序设计自学教程

上传人:痛*** 文档编号:185591612 上传时间:2023-02-04 格式:PPT 页数:52 大小:571.52KB
收藏 版权申诉 举报 下载
MPI并行程序设计自学教程_第1页
第1页 / 共52页
MPI并行程序设计自学教程_第2页
第2页 / 共52页
MPI并行程序设计自学教程_第3页
第3页 / 共52页
资源描述:

《MPI并行程序设计自学教程》由会员分享,可在线阅读,更多相关《MPI并行程序设计自学教程(52页珍藏版)》请在装配图网上搜索。

1、2023年2月1/55并行程序设计简介并行程序设计简介曙光信息产业(北京)有限公司2023年2月2/55讲座内容提示讲座内容提示基本概念基本的MPI点到点通信(Point to point)MPI中API的主要内容,为MPI最基本,最重要的内容MPI程序的编译和运行实例2023年2月3/55参考文献参考文献MPI-the complete reference.Marc Snir,MIT Press,1998.ISBN 0262692155,0262692163.Using MPI:portable parallel programming with the message-passing in

2、terface,William Gropp,MIT Press,1999.2nd edition.ISBN 0262571323.Using MPI-2:advanced features of the message-passing interface.William Gropp,MIT Press,1999.ISBN 0262571331.高性能计算并行编程技术-MPI并行程序设计,都志,都志辉,清华大学出版社,辉,清华大学出版社,2001年年8月。月。2023年2月4/55多线程库标准 Win32 API.POSIX threads.编译制导标准 OpenMP 可移植共享存储并行编可移植

3、共享存储并行编程标准程标准.消息传递库标准 MPI PVM并行编程标准本讨论的重点本讨论的重点2023年2月5/55消息传递并行程序设计消息传递并行程序设计指用户必须通过显式地发送和接收消息来实现处理机间的数据交指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。换。在这种并行编程中,每个并行进程均有自己独立的地址空间,相在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。互之间访问不能直接进行,必须通过显式的消息传递来实现。这种编程方式是大规模并行处理机(这种编程方式是大规模并行处理机(MPP)和机群()和机群(Cluster

4、)采)采用的主要编程方式。用的主要编程方式。并行计算粒度大,特别适合于大规模可扩展并行算法由于消息传递程序设计要求用户很好地分解问题由于消息传递程序设计要求用户很好地分解问题,组织不同进程间组织不同进程间的数据交换的数据交换,并行计算粒度大并行计算粒度大,特别适合于大规模可扩展并行算法特别适合于大规模可扩展并行算法.消息传递是当前并行计算领域的一个非常重要的并行程序设计方式2023年2月6/55什么是MPI?Massage Passing Interface:是消息传递是消息传递函数库的标准规范,由函数库的标准规范,由MPI论坛开发,支持论坛开发,支持Fortran和和C一种新的库描述,不是一

5、种语言。共有上百个一种新的库描述,不是一种语言。共有上百个函数调用接口,在函数调用接口,在Fortran和和C语言中可以直接语言中可以直接对这些函数进行调用对这些函数进行调用MPI是一种标准或规范的代表,而不是特指某是一种标准或规范的代表,而不是特指某一个对它的具体实现一个对它的具体实现MPI是一种消息传递编程模型,并成为这种编是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准程模型的代表和事实上的标准2023年2月7/55MPI的发展过程发展的两个阶段发展的两个阶段MPI 1.1:1995MPICH:是是MPI最流行的非专利实现最流行的非专利实现,由由Argonne国国家实验室和

6、密西西比州立大学联合开发家实验室和密西西比州立大学联合开发,具有更好的具有更好的可移植性可移植性.MPI 1.22.0:动态进程动态进程,并行并行 I/O,远程存储访远程存储访问、支持问、支持F90和和C+(1997).2023年2月8/55为什么要用为什么要用MPI?高可移植性MPI已在已在IBM PC机上、机上、MS Windows上、所有主要的上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的作消息传递的C或或Fortran并行程序可不加改变地运并行程序可不加改变地运行在行在IBM PC、MS Windows、Un

7、ix工作站、以及各种工作站、以及各种并行机上。并行机上。2023年2月9/55:从简单入手从简单入手Init和Finalize下面我们首先分别以下面我们首先分别以C语言和语言和Fortran语言语言的形式给出一个最简单的的形式给出一个最简单的MPI并行程序并行程序Hello(下页下页).该程序在终端打印出该程序在终端打印出Hello World!字样字样.“Hello World”:一声来自新生儿的问候一声来自新生儿的问候.2023年2月10/55Hello world(C)#include#include mpi.h“main(int argc,char*argv)MPI_Init(&arg

8、c,&argv);printf(Hello,world!n);MPI_Finalize();2023年2月11/55Hello world(Fortran)program maininclude mpif.hinteger ierrcall MPI_INIT(ierr)print*,Hello,world!call MPI_FINALIZE(ierr)end2023年2月12/55C和Fortran中MPI函数约定C必须包含必须包含mpi.h.MPI 函数返回出错代码或函数返回出错代码或 MPI_SUCCESS成功标志.MPI-前缀,且只有前缀,且只有MPI以及以及MPI_标志后的第一个字母大

9、写,其标志后的第一个字母大写,其余小写余小写.Fortran必须包含必须包含mpif.h.通过子函数形式调用通过子函数形式调用MPI,函数最后一个参数为返回值,函数最后一个参数为返回值.MPI-前缀,且函数名全部为大写前缀,且函数名全部为大写.MPI函数函数的参数被标志为以下三种类型:的参数被标志为以下三种类型:IN:参数在例程的调用中不会被修正:参数在例程的调用中不会被修正.OUT:参数在例程的调用中可能会被修正:参数在例程的调用中可能会被修正.INOUT:参数有初始值,且在例程的调用中可能会被修正:参数有初始值,且在例程的调用中可能会被修正2023年2月13/55MPI初始化初始化-MPI

10、_INITint MPI_Init(int*argc,char*argv)MPI_INIT(IERROR)MPI_INIT是是MPI程序的第一个调用,它完成程序的第一个调用,它完成MPI程序的所有初始化工作。所有的程序的所有初始化工作。所有的MPI程序程序的第一条可执行语句都是这条语句。的第一条可执行语句都是这条语句。启动启动MPI环境环境,标志并行代码的开始标志并行代码的开始.并行代码之前并行代码之前,第一个第一个mpi函数函数(除除MPI_Initialized()外外).要求要求main必须带参数运行必须带参数运行,否则出错否则出错.2023年2月14/55MPI结束结束-MPI_FIN

11、ALIZEint MPI_Finalize(void)MPI_FINALIZE(IERROR)MPI_FINALIZE是是MPI程序的最后一个调用,程序的最后一个调用,它结束它结束MPI程序的运行,它是程序的运行,它是MPI程序的最后程序的最后一条可执行语句,否则程序的运行结果是不可一条可执行语句,否则程序的运行结果是不可预知的。预知的。标志并行代码的结束标志并行代码的结束,结束除主进程外其它进程结束除主进程外其它进程.之后串行代码仍可在主进程之后串行代码仍可在主进程(rank=0)上运行上运行(如果必须如果必须).2023年2月15/55MPI程序的的编译与运行程序的的编译与运行mpif77

12、 hello.f 或或 mpicc hello.c 默认生成默认生成a.out的可执行代码的可执行代码.mpif77 o hello hello.f 或或mpicc o hello hello.c生成生成hello的可执行代码的可执行代码.mpirun np 4 a.outmpirun np 4 hello4 指定指定np的实参的实参,表示进程数表示进程数,由用户指定由用户指定.a.out/hello 要运行的要运行的MPI并行程序并行程序.%小写o%np:The number of process.2023年2月16/55:运行我们的运行我们的MPI程序程序!dairnode01$mpicc

13、-o hello hello.cdairnode01$./hello ()0 Aborting program!Could not create p4 procgroup.Possible missing fileor program started without mpirun.dairnode01$mpirun-np 4 hello ()Hello World!Hello World!Hello World!Hello World!dairnode01$计算机打印字符我们输入的命令2023年2月17/55:Hello是如何被执行的是如何被执行的?SPMD:Single Program Mu

14、ltiple Data(SIMD):#include mpi.h#include main(int argc,char*argv)MPI_Init(&argc,&argv);printf(Hello,world!n);MPI_Finalize();#include mpi.h#include main(int argc,char*argv)MPI_Init(&argc,&argv);printf(Hello,world!n);MPI_Finalize();#include mpi.h#include main(int argc,char*argv)MPI_Init(&argc,&argv);p

15、rintf(Hello,world!n);MPI_Finalize();#include mpi.h#include main(int argc,char*argv)MPI_Init(&argc,&argv);printf(Hello,world!n);MPI_Finalize();Hello World!Hello World!Hello World!Hello World!#include mpi.h#include main(int argc,char*argv)MPI_Init(&argc,&argv);printf(Hello,world!n);MPI_Finalize();rshs

16、sh2023年2月18/55:开始写开始写MPI并行程序并行程序 Comm_size和Comm_rank在写在写MPI程序时,我们常需要知道以下两个程序时,我们常需要知道以下两个问题的答案:问题的答案:任务由多少个进程来进行并行计算?我是哪一个进程?2023年2月19/55MPI 提供了下列函数来回答这些问题:提供了下列函数来回答这些问题:用MPI_Comm_size 获得进程个数获得进程个数 p int MPI_Comm_size(MPI_Comm comm,int*size);用MPI_Comm_rank 获得进程的一个叫获得进程的一个叫rank的的值,该值,该 rank值为值为0到到p-

17、1间的整数间的整数,相当于进程相当于进程的的IDint MPI_Comm_rank(MPI_Comm comm,int*rank);2023年2月20/55更新的更新的Hello World(c)#include#include mpi.hmain(int argc,char*argv)int myid,numprocs;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);printf(“I am%d of%dn,myid,numprocs);MPI_

18、Finalize();2023年2月21/55更新的更新的Hello World(F77)program maininclude mpif.hinteger ierr,myid,numprocscall MPI_INIT(ierr)call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)print*,I am,myid,of,numprocscall MPI_FINALIZE(ierr)end2023年2月22/55:运行结果运行结果dairnode01$mpicc

19、o hello1 hello1.cdairnode01$mpirun-np 4 hello1I am 0 of 4I am 1 of 4I am 2 of 4I am 3 of 4dairnode01$计算机打印字符我们输入的命令2023年2月23/55:写写MPI并行通信程序并行通信程序-Send和Recv进程 0进程 0rank=0rank=0.Send()Send().进程 1进程 1rank=1rank=1进程 2进程 2rank=2rank=2进程 3进程 3rank=3rank=3.Send()Send().Send()Send().Recv()Recv().2023年2月24/5

20、5有消息传递有消息传递greetings(c)#include#include mpi.hmain(int argc,char*argv)int numprocs,myid,source;MPI_Status status;char message100;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);2023年2月25/55有消息传递有消息传递greetings(c)if(myid!=0)strcpy(message,Hello World!);

21、MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);else/*myid=0*/for(source=1;source numprocs;source+)MPI_Recv(message,100,MPI_CHAR,source,99,MPI_COMM_WORLD,&status);printf(%sn,message);MPI_Finalize();/*end main*/2023年2月26/55解剖解剖greetings程序程序头文件头文件:mpi.h/mpif.h.int MPI_Init(int int MPI

22、_Init(int*argc,char argc,char*argv)argv)启动启动MPI环境环境,标志并行代码的开始标志并行代码的开始.并行代码之前并行代码之前,第一个第一个mpi函数函数(除除MPI_Initialize()外外).要求要求main必须带参数运行必须带参数运行,否则出错否则出错.通信域通信域(通信空间通信空间):MPI_COMM_WORLD:一个通信空间是一个进程组和一个上下文的组合一个通信空间是一个进程组和一个上下文的组合.上下文可看作为上下文可看作为组的超级标签组的超级标签,用于区分不同的通信域用于区分不同的通信域.在执行函数在执行函数MPI_Init之后之后,一个

23、一个MPI程序的所有进程形成一个缺省程序的所有进程形成一个缺省的组的组,这个组的通信域即被写作这个组的通信域即被写作MPI_COMM_WORLD.该参数是该参数是MPI通信操作函数中必不可少的参数通信操作函数中必不可少的参数,用于限定参加通信用于限定参加通信的进程的范围的进程的范围.2023年2月27/55解剖解剖greetings程序程序int MPI_Comm_size(MPI_Comm comm,int int MPI_Comm_size(MPI_Comm comm,int*size)size)获得通信空间获得通信空间comm中规定的组包含的进程的数量中规定的组包含的进程的数量.指定一个

24、指定一个communicator,也指定了一组共享该空间的进程也指定了一组共享该空间的进程,这些这些进程组成该进程组成该communicator的的group.int MPI_Comm_rank(MPI_Comm comm,int int MPI_Comm_rank(MPI_Comm comm,int*rank)rank)得到本进程在通信空间中的得到本进程在通信空间中的rank值值,即在组中的逻辑编号即在组中的逻辑编号(从从0开始开始).int MPI_Finalize()int MPI_Finalize()标志并行代码的结束标志并行代码的结束,结束除主进程外其它进程结束除主进程外其它进程.之

25、后串行代码仍可在主进程之后串行代码仍可在主进程(rank=0)上运行上运行(如果必须如果必须).2023年2月28/55讲座内容提示讲座内容提示基本的基本的MPI基本概念基本概念点到点通信点到点通信(Point to point)MPI中中API的主要内容,为的主要内容,为MPI最基本,最重要的内容最基本,最重要的内容MPI程序的编译和运行程序的编译和运行深入深入MPI用户自定义用户自定义(/派生派生)数据类型数据类型(User-defined(Derived)data type)事实上事实上MPI的所有数据类型均为的所有数据类型均为MPI自定义类型自定义类型支持异构系统支持异构系统允许消息来

26、自不连续的或类型不一致的存储区允许消息来自不连续的或类型不一致的存储区(结构结构,数组散元数组散元)集合通信集合通信(Collective)数据移动,数据聚集,同步数据移动,数据聚集,同步基于基于point to point 构建构建MPI环境管理函数环境管理函数组组,上下文和通信空间上下文和通信空间/通信域的管理通信域的管理实例实例2023年2月29/55Point to Point通信通信单个进程对单个进程的通信单个进程对单个进程的通信,重要且复杂重要且复杂术语术语Blocking(阻塞阻塞):一个例程须等待操作完成才返回一个例程须等待操作完成才返回,返回返回后用户可以重新使用调用中所占用

27、的资源后用户可以重新使用调用中所占用的资源.Non-blocking(非阻塞非阻塞):一个例程不必等待操作完成便一个例程不必等待操作完成便可返回可返回,但这并不意味着所占用的资源可被重用但这并不意味着所占用的资源可被重用.Local(本地本地):过程的完成仅依赖于本地正在执行的进程。过程的完成仅依赖于本地正在执行的进程。Non-local(非本地非本地):如果过程的完成要求其他进程的如果过程的完成要求其他进程的 MPI 过程完成。过程完成。2023年2月30/55Blocking Sendint MPI_Send(void*buf,int count,MPI_Datatype datatype

28、,int dest,int tag,MPI_Comm comm);IN buf 发送缓冲区的起始地址 IN count 要发送信息的元素个数 IN datatype 发送信息的数据类型 IN dest 目标进程的rank值 IN tag 消息标签 IN comm 通信域2023年2月31/55Blocking Receiveint MPI_Recv(void*buf,int count,MPI_Datatype datatype,int source,int tag,MPI_Comm comm,MPI_Status*status);OUT buf 发送缓冲区的起始地址 IN count 要发送

29、信息的元素个数 IN datatype 发送信息的数据类型 IN dest 目标进程的rank值 IN tag 消息标签 IN comm 通信域OUT statusstatus对象,包含实际接收到的消息的有关信息2023年2月32/55MPI消息消息MPI消息包括信封和数据两个部分,信封指消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容而数据是本消息将要传递的内容数据:数据:信封:信封:2023年2月33/552023年2月34/55消息数据消息数据由由count个类型为个类型为datatype的连续数据空间

30、的连续数据空间组成组成,起始地址为起始地址为buf不是以字节数不是以字节数,而是以元素的个数指定消息而是以元素的个数指定消息的长度的长度count可以是零可以是零,这种情况下消息的数据部这种情况下消息的数据部分是空的分是空的MPI基本数据类型相应于宿主语言的基本数基本数据类型相应于宿主语言的基本数据类型据类型 2023年2月35/55MPI基本数据类型2023年2月36/55MPI标识一条消息的信息包含四个域:Source:发送进程隐式确定发送进程隐式确定,由进程的由进程的rank值唯一标识值唯一标识Destination:Send函数参数确定函数参数确定Tag:Send函数参数确定函数参数确

31、定,用于识别不同的消息用于识别不同的消息(0,UB),UB:MPI_TAG_UB=32767.Communicator:缺省缺省MPI_COMM_WORLDGroup:有限有限/N,有序,有序/Rank 0,1,2,N-1Contex:Super_tag,用于标识该通讯空间用于标识该通讯空间.消息信封消息信封2023年2月37/55status参数参数当使用MPI_ANY_SOURCE或/和MPI_ANY_TAG接收消息时如何确定消息的来源source 和 tag值呢?在在C C中,结构,中,结构,status.MPI_SOURCE,status.MPI_TAG.status.MPI_SOUR

32、CE,status.MPI_TAG.在在FortranFortran中,数组,中,数组,source=status(MPI_SOURCE),source=status(MPI_SOURCE),tag=status(MPI_TAG).tag=status(MPI_TAG).Status还可用于返回实际接收到消息的长度int MPI_Get_count(MPI_Status status,int MPI_Get_count(MPI_Status status,MPI_Datatype datatype,intMPI_Datatype datatype,int*count)count)IN stat

33、us IN status 接收操作的返回值接收操作的返回值.IN datatype IN datatype 接收缓冲区中元素的数据类型接收缓冲区中元素的数据类型.OUT count OUT count 接收消息中的元素个数接收消息中的元素个数.2023年2月38/55消息匹配消息匹配接收接收buffer必须至少可以容纳必须至少可以容纳count个由个由datatype参数指参数指明类型的数据明类型的数据.如果接收如果接收buf太小太小,将导致溢出、出错将导致溢出、出错.消息匹配消息匹配参数匹配参数匹配 dest,tag,comm/source,tag,commSource=MPI_ANY_SO

34、URCE:接收任意处理器来的数据:接收任意处理器来的数据(任任意消息来源意消息来源).Tag=MPI_ANY_TAG:匹配任意:匹配任意tag值的消息值的消息(任意任意tag消息消息).Source=destination 是允许的是允许的,但是不安全的但是不安全的,可能导可能导致死锁。致死锁。消息传送被限制在同一个消息传送被限制在同一个communicator.在在send函数中必须指定唯一的接收者函数中必须指定唯一的接收者(Push/pull通讯机通讯机制制).2023年2月39/55分析分析greetings#include#include mpi.h“main(int argc,cha

35、r*argv)int numprocs;/*进程数,该变量为各处理器中的同名变量,存储是分布的*/int myid;/*我的进程ID,存储也是分布的*/MPI_Status status;/*消息接收状态变量,存储也是分布的*/char message100;/*消息buffer,存储也是分布的*/*初始化MPI*/MPI_Init(&argc,&argv);MPI_Init(&argc,&argv);/*该函数被各进程各调用一次,得到自己的进程rank值*/MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_rank(MPI_COMM_WORLD,&my

36、id);/*该函数被各进程各调用一次,得到进程数*/MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);2023年2月40/55分析分析greetingsif(myid!=0)if(myid!=0)/*建立消息*/sprintf(message,Greetings from process%d!,myid);sprintf(message,Greetings from process%d!,myid);/*发送长度取strlen(message)+1strlen(message)+1,使

37、00也一同发送出去*/MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);elseelse /*my_rank=0 my_rank=0*/for(source=1;source numprocs;source+)for(source=1;source numprocs;source+)MPI_Recv(message,100,MPI_CHAR,source,99,MPI_COMM_WORL

38、D,&status);MPI_Recv(message,100,MPI_CHAR,source,99,MPI_COMM_WORLD,&status);printf(“%sn,message);printf(“%sn,message);/*关闭MPIMPI,标志并行代码段的结束*/MPI_Finalize();MPI_Finalize();/*End main End main*/2023年2月41/55Greetings执行过程执行过程 假设进程数为3 (进程进程0)(进程进程1)(进程进程2)(rank=0)(rank=1)(rank=2)(rank=0)(rank=1)(rank=2).R

39、ecv();.Recv();.Send();.Send().问题:进程1和2谁先开始发送消息?谁先完成发送??%2023年2月42/55运行运行greetingsdairnode01$mpicc o greeting greeting.cdairnode01$mpirun-np 4 greeting Greetings from process 1!Greetings from process 2!Greetings from process 3!dairnode01$计算机打印字符我们输入的命令2023年2月43/55最基本的最基本的MPIMPI调用借口的总数虽然庞大,但根据实际编写调用借口

40、的总数虽然庞大,但根据实际编写MPI的经验,的经验,常用的常用的MPI调用的个数非常有限。上面介绍的是调用的个数非常有限。上面介绍的是6个最基本个最基本的的MPI函数。函数。1.MPI_Init();2.MPI_Comm_size();3.MPI_Comm_rank();4.MPI_Send();5.MPI_Recv();6.MPI_Finalize();MPI_Init();并行代码并行代码;MPI_Fainalize();只能有串行代码只能有串行代码;2023年2月44/55现在您已经能现在您已经能够用够用MPI进行并进行并行编程了行编程了!2023年2月45/55实例分析实例分析:求求P

41、I2023年2月46/55串行代码串行代码h=1.0/(double)n;sum=0.0;for(i=1;i=n;i+)x=h*(double)i 0.5);sum+=f(x);pi=h*sum;double f(double a)return(4.0/(1.0+a*a);2023年2月47/55并行代码并行代码h=1.0/(double)n;sum=0.0;for(i=myid+1;i=n;i+=numprocs)x=h*(double)i 0.5);sum+=f(x);mypi=h*sum;MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_CO

42、MM_WORLD);double f(double a)return(4.0/(1.0+a*a);2023年2月48/55cpi.c#include mpi.h#include#include double f(double);double f(double a);return(4.0/(1.0+a*a);2023年2月49/55cpi.cint main(int argc,char*argv)int done=0,n,myid,numprocs,i;double PI25DT=3.141592653589793238462643;double mypi,pi,h,sum,x;double s

43、tartwtime=0.0,endwtime;int namelen;char processor_nameMPI_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);fprintf(stderr,Process%d on%sn,myid,processor_name);2023年2月50/55cpi.c n=0;whi

44、le(!done)if(myid=0)if(n=0)n=100;else n=0;startwtime=MPI_Wtime();MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);2023年2月51/55cpi.c if(n=0)done=1;else h =1.0/(double)n;sum=0.0;for(i=myid+1;i=n;i+=numprocs)x=h*(double)i-0.5);sum+=f(x);mypi=h*sum;2023年2月52/55cpi.c MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);if(myid=0)printf(pi is approximately%.16f,Error is%.16fn,pi,fabs(pi-PI25DT);endwtime=MPI_Wtime();printf(wall clock time=%fn,endwtime-startwtime);MPI_Finalize();return 0;

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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