《MPI并行编程学习教案》由会员分享,可在线阅读,更多相关《MPI并行编程学习教案(36页珍藏版)》请在金锄头文库上搜索。
1、会计学1MPI并行并行(bngxng)编程编程第一页,共36页。大纲大纲(dgng)(dgng)n nMPI并行编程简介n nLinux下MPI并行编程环境的搭建(d jin)n nMPI并行程序设计n n实例分析:矩阵乘法第1页/共35页第二页,共36页。1.1 什么(shn me)是并行计算进程进程 1 发送信息发送信息进程进程 2 接收信息接收信息传统的串行计算,分为“指令(zhlng)”和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。 并行计算将进程相对独立的并行计算将进程相对独立的分配于不同分配于不同(b tn)的节点上,由的节点上,由各
2、自独立的操作系统调度,各自独立的操作系统调度,享有独立的享有独立的CPU和内存资源和内存资源(内存可以共享);进程间(内存可以共享);进程间相互信息交换通过消息传递;相互信息交换通过消息传递; 进程进程 1 进程进程 2 第2页/共35页第三页,共36页。1.2 并行计算在电力行业的并行计算在电力行业的研究研究(ynji)和应用和应用n n中中国国电电科科院院发发明明专专利利“电电力力系系统统潮潮流流分分网网并并行行计计算算方方法法”获获得得中中国国专专利利金金奖奖(发发明明人人:周周孝孝信信、吴吴中中习习、郭郭剑剑、李李亚亚楼楼、田田芳芳)2 20 01 10 0. .1 11 1 n n大
3、大规规模模电电网网并并行行潮潮流流算算法法2 20 00 08 8n n电电力力系系统统状状态态估估计计的的分分布布式式并并行行处处理理2 20 00 03 3n n电电力力系系统统最最优优潮潮流流的的分分布布式式并并行行算算法法2 20 00 03 3n n电电网网在在线线安安全全分分析析的的并并行行处处理理方方法法 1 19 99 96 6n n基基于于G GP PU U的的电电力力系系统统并并行行潮潮流流计计算算的的实实现现 2 20 01 10 0n n基基于于M MP PI I和和P PQ Q分分解解法法的的电电力力系系统统潮潮流流并并行行算算法法的的研研究究2 20 00 05 5
4、 n n基基于于并并行行计计算算的的电电力力系系统统风风险险评评估估2 20 00 09 9n n基基于于并并行行协协调调算算法法的的电电力力系系统统状状态态估估计计2 20 00 07 7n n基基于于改改进进并并行行遗遗传传算算法法的的电电网网状状态态估估计计2 20 00 06 6n n应应用用( (y y n ng gy y n ng g) )网网格格平平台台的的潮潮流流计计算算并并行行算算法法2 20 00 09 9n n基基于于M MP PI I电电力力系系统统潮潮流流P P Q Q分分解解法法的的并并行行算算法法2 20 00 08 8n n2 20 00 08 8电电网网控控制
5、制中中心心新新技技术术综综述述2 20 00 09 9第3页/共35页第四页,共36页。1.3 并行并行(bngxng)编程标准编程标准n n多多多多线线线线程程程程库库库库标标标标准准准准n n W W W Wi i i in n n n3 3 3 32 2 2 2 A A A AP P P PI I I I. . . .n n P P P PO O O OS S S SI I I IX X X X t t t th h h hr r r re e e ea a a ad d d ds s s s. . . .n n编编编编译译译译制制制制导导导导标标标标准准准准n n O O O Op p
6、 p pe e e en n n nM M M MP P P P 可可可可移移移移植植植植共共共共享享享享存存存存储储储储( ( ( (c c c c n n n n c c c ch h h h) ) ) )并并并并行行行行编编编编程程程程标标标标准准准准. . . .n n消消消消息息息息传传传传递递递递库库库库标标标标准准准准n n M M M MP P P PI I I In n P P P PV V V VM M M M第4页/共35页第五页,共36页。1.4 1.4 M Massage assage P Passing assing I Interface(MPI)nterface
7、(MPI) MMP PI I 是是由由MMP PI I 委委员员会会(MMP PI I F Fo or ru umm)在在1 19 99 92 2年年到到1 19 99 94 4年年举举行行的的一一系系列列会会议议上上逐逐渐渐产产生生的的一一个个消消息息传传递递标标准准( (b bi i o oz zh h n n) )()。 发发展展 MMP PI I 1 1. .1 1: : 1 19 99 95 5 MMP PI IC CH H: :是是MMP PI I最最流流行行的的非非专专利利实实现现, ,由由A Ar rg go on nn ne e国国家家实实验验室室和和密密西西西西比比州州立立
8、大大学学联联合合开开发发, ,具具有有更更好好的的可可移移植植性性. . MMP PI I 1 1. .2 2 (1 19 99 97 7) . . MMP PI I 2 2. .2 2 (2 20 00 09 9- -0 09 9)第5页/共35页第六页,共36页。MPI是一个是一个(y )库,而库,而不是一门语言不是一门语言 n n这个标准支持 C 语言和 FORTRAN 语言n nMPI库可以被FORTRAN77/C/Fortran90/C+调用n n它遵守所有对库函数/过程的调用规则(guz),和一般的函数/过程没有什么区别第6页/共35页第七页,共36页。MPIMPI是一种标准或规范
9、,而不是是一种标准或规范,而不是是一种标准或规范,而不是是一种标准或规范,而不是(b shi)(b shi)具体实具体实具体实具体实现现现现实现(shxin):Mpich、OpenMPI、Chimp、Lam例如例如(lr)(lr):MPI_Init(int *argc, char *argv )MPI_Init(int *argc, char *argv )的实现的实现MPICH的实现int MPI_Init( int *argc, char *argv ) static const char FCNAME = MPI_Init; int mpi_errno = MPI_SUCCESS; in
10、t rc; 。OpenMPI的实现int MPI_Init( int *argc, char *argv ) int err; int provided; char *env; int required = MPI_THREAD_SINGLE; 。第7页/共35页第八页,共36页。MPI是一种是一种(y zhn)消息传递消息传递编程模型编程模型n n节节点点( (j ji i d di in n) )间间基基于于消消息息进进行行通通讯讯第8页/共35页第九页,共36页。2.1 MPICH的实验的实验(shyn)环境环境实验实验(shyn)(shyn)环境:环境:Fedora 14+ Dell
11、Blade*1Fedora 14+ Dell Blade*1(主节点)(主节点)+Dell PC*2+Dell PC*2(从节(从节点)点)第9页/共35页第十页,共36页。2.2 MPICH的搭建的搭建(d jin)步骤步骤搭建步骤搭建步骤1-1-挂载挂载NFSNFS文件系统文件系统实现分节点实现分节点(ji din)(ji din)内容与主节点内容与主节点(ji din)(ji din)内容的同步更内容的同步更新和自动目录对应新和自动目录对应2-2-配置配置SSHSSH公钥认证实现公钥认证实现MPIMPI节点节点(ji din)(ji din)间用户的无密码访问间用户的无密码访问各节点各节
12、点(ji din)(ji din)间进行消息传递间进行消息传递3-3-安装安装MPICHMPICH至至NFSNFS目录目录4-4-修改各种配置文件修改各种配置文件5-5-试运行试运行exampleexample文件夹中的例子文件夹中的例子第10页/共35页第十一页,共36页。3.1 基于基于(jy)MPI的的Hello World(C)#include #include # #include mpi.h“include mpi.h“main(main( int argc, int argc, char *argv ) char *argv ) MPI_Init( &argc, &argv )M
13、PI_Init( &argc, &argv ); ; printf( Hello, world!n ); printf( Hello, world!n ); MPI_Finalize()MPI_Finalize(); ; 第11页/共35页第十二页,共36页。3.2 MPI程序程序(chngx)的的编译的的编译与运行与运行n nmmp pi if f7 77 7 h he el ll lo o. .f f 或或 mmp pi ic cc c h he el ll lo o. .c c n n默默认认生生成成的的可可执执行行代代码码. .()n nmmp pi if f7 77 7 o o h
14、he el ll lo o h he el ll lo o. .f f 或或n n生生成成h he el ll lo o的的可可执执行行代代码码. .n nmmp pi ir ru un n n np p 4 4 h he el ll lo on n4 4 指指定定n np p的的实实参参, ,表表示示进进程程数数, ,由由用用户户( (y y n ng gh h ) )指指定定. .n na a. .o ou ut t / / h he el ll lo o 要要运运行行的的MMP PI I并并行行程程序序. .七月 24MPI并行程序设计13217%小写o%np:The Number of
15、 Process.第12页/共35页第十三页,共36页。3.3 运行运行(ynxng)MPI程序程序dairnode01 $dairnode01 $dairnode01 $dairnode01 $ ./hello ./hello ( () ) ) ) 0 Aborting program ! Could not create p4 procgroup. Possible 0 Aborting program ! Could not create p4 procgroup. Possible missing fileor program started without mpirun.missin
16、g fileor program started without mpirun.dairnode01 $dairnode01 $ mpirun -np 4 hellompirun -np 4 hello ( () ) ) ) Hello World!Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World!dairnode01 $dairnode01 $ 计算机打印(d yn)字符我们输入(shr)的命令第13页/共35页第十四页,共36页。3.4 Hello World是
17、如何是如何(rh)被被执行的执行的?n nSPMD: Single Program Multiple Data(SPMD) :七月 24MPI并行程序设计(shj)15217#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, w
18、orld!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 ); printf( Hello, world!n ); MPI_Finalize();Hello World!Hello World!Hello World!H
19、ello World!#include mpi.h#include main( int argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();第14页/共35页第十五页,共36页。MPI程序(chngx)的执行过程第15页/共35页第十六页,共36页。3.5 进一步的进一步的MPI并行程序并行程序n n在写MPI程序时,我们常需要知道以下两个问题的答案:n n任务由多少个进程来进行并行计算?(多少个节目)n n我是哪一个进程?(节目名程)n n好比是晚会导演(doyn)安排节目
20、次序,每个节目拿到的是相同的节目单。对号入座第16页/共35页第十七页,共36页。3.5.1 MPI相关相关(xinggun)接口接口n nMMP PI I 提提供供了了下下列列函函数数来来回回答答这这些些问问题题:n n用用MMP PI I_ _C Co ommmm_ _s si iz ze e 获获得得进进程程个个数数 p pn n i in nt t MMP PI I_ _C Co ommmm_ _s si iz ze e( (MMP PI I_ _C Co ommmm c co ommmm, , i in nt t * *s si iz ze e) ); ;n n用用MMP PI I_
21、 _C Co ommmm_ _r ra an nk k 获获得得进进程程的的一一个个( (y y ) )叫叫r ra an nk k的的值值,该该 r ra an nk k值值为为0 0到到p p- -1 1间间的的整整数数, ,相相当当于于进进程程的的I ID Dn ni in nt t MMP PI I_ _C Co ommmm_ _r ra an nk k( (MMP PI I_ _C Co ommmm c co ommmm, , i in nt t * *r ra an nk k) ); ;第17页/共35页第十八页,共36页。3.5.2 更新更新(gngxn)的的Hello Worl
22、d(c)#include #include # #include mpi.hinclude mpi.hmain( int argc, char *argv )main( int argc, char *argv ) int myid,int myid, numprocs;numprocs; MPI_Init( &argc, &argv );MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &myid );MPI_Comm_rank( MPI_COMM_WORLD, &myid ); MPI_Comm_size( MPI_COMM_
23、WORLD, &numprocs );MPI_Comm_size( MPI_COMM_WORLD, &numprocs ); printf(“I am %d of %dn, myid, numprocs ); printf(“I am %d of %dn, myid, numprocs ); MPI_Finalize();MPI_Finalize(); 第18页/共35页第十九页,共36页。运行运行(ynxng)(ynxng)结果结果n ndairnode01 $ dairnode01 $ n ndairnode01 $ dairnode01 $ mpirun -np 4 hello1mpir
24、un -np 4 hello1I am 0 of 4I am 0 of 4I am 1 of 4I am 1 of 4I am 2 of 4I am 2 of 4I am 3 of 4I am 3 of 4n ndairnode01 $dairnode01 $计算机打印(d yn)字符我们输入(shr)的命令第19页/共35页第二十页,共36页。3.6.1 MPI消息消息(xio xi) n n消息:指在进程间进行的一次数据交换。消息:指在进程间进行的一次数据交换。n n一个消息由源地址、数据个数、数据类型、目标地址、一个消息由源地址、数据个数、数据类型、目标地址、消息标识和通信体构成。消息标
25、识和通信体构成。n n消息包括信封和数据两个部分,信封指出了发送或接消息包括信封和数据两个部分,信封指出了发送或接收消息的对象收消息的对象(duxing)(duxing)及相关信息,而数据是本消及相关信息,而数据是本消息将要传递的内容。息将要传递的内容。n nMPI_SendMPI_Send(bufbuf,countcount,datatypedatatype,destdest,tagtag,commcomm)消息数据消息信封第20页/共35页第二十一页,共36页。3.6.2 消息传递过程消息传递过程(guchng)第21页/共35页第二十二页,共36页。3.6.3 MPI点对点通信点对点通信
26、(tng xn)函数函数 MPI_Send ( void * buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm )被发送被发送(f sn)消息的消息的地址地址被发送数据项的个数被发送数据项的个数消息消息(xio xi)数据数据的类型的类型目标进程的序号目标进程的序号消息标志消息标志通信体通信体第22页/共35页第二十三页,共36页。3.6.3 MPI点对点通信点对点通信(tng xn)函数函数 n n MPI_RecvMPI_Recv ( void * buf, ( void * buf, int c
27、ount, int count, MPI_Datatype datatype, MPI_Datatype datatype, int source, int source, int tag, int tag, MPI_Comm comm, MPI_Comm comm, MPI_Status *status ) MPI_Status *status )被接收消息被接收消息(xio xi)的地址的地址被接收数据项的个数被接收数据项的个数消息消息(xio xi)数据数据的类型的类型源进程的序号源进程的序号消息标志消息标志通信体通信体返回的通信状态返回的通信状态第23页/共35页第二十四页,共36页。
28、3.6.4 加入加入(jir)消息传消息传递的递的HelloWorld(c)#include #include mpi.h“main(int argc, char* argv) int numprocs; /*进程数,该变量为各处理器中的同名变量, 存储(cn ch)是分布的*/int myid;/*我的进程ID,存储(cn ch)也是分布的*/ MPI_Status status; /*消息接收状态变量,存储(cn ch)也是分布的*/ char message100; /*消息buffer,存储(cn ch)也是分布的*/ /*初始化MPI*/MPI_Init(&argc, &argv);
29、 /*该函数被各进程各调用一次,得到自己的进程rank值*/MPI_Comm_rank(MPI_COMM_WORLD, &myid);/*该函数被各进程各调用一次,得到进程数*/MPI_Comm_size(MPI_COMM_WORLD, &numprocs);第24页/共35页第二十五页,共36页。3.6.4 3.6.4 加入加入加入加入(jir)(jir)消息传递的消息传递的消息传递的消息传递的HelloWorld(c) (HelloWorld(c) (续续续续) )if (myid != 0) /*建立消息*/ sprintf(message, “HelloWorld from proce
30、ss %d!,myid); /* 发送长度取strlen(message)+1,使0也一同发送出去(ch q)*/ MPI_Send(message,strlen(message)+1, MPI_CHAR, 0,99,MPI_COMM_WORLD);else /* my_rank = 0 */ for (source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD,&status); printf(“%sn, message); /*关闭MPI,标志并行代码段的
31、结束*/ MPI_Finalize(); /* End main */第25页/共35页第二十六页,共36页。问题:进程(jnchng)1、2、3谁先向进程(jnchng)0发送消息?第26页/共35页第二十七页,共36页。运行运行(ynxng)(ynxng)结果结果n ndairnode01 $ dairnode01 $ n ndairnode01 $ dairnode01 $ mpirun -np 4 hello2mpirun -np 4 hello2 HelloWorld from process 1! HelloWorld from process 1! HelloWorld from
32、 process 2! HelloWorld from process 2! HelloWorld from process 3! HelloWorld from process 3!n ndairnode01 $dairnode01 $计算机打印(d yn)字符我们(w men)输入的命令第27页/共35页第二十八页,共36页。3.7 最基本最基本(jbn)的的MPIMMP PI I调调用用借借口口的的总总数数虽虽然然庞庞大大(几几百百个个),但但根根据据实实际际编编写写MMP PI I的的经经验验,常常用用的的MMP PI I调调用用的的个个数数确确实实有有限限( (y y u ux xi
33、 i n n) )。下下面面是是6 6个个最最基基本本的的MMP PI I函函数数。MMP PI I_ _I In ni it t( () ); ;MMP PI I_ _C Co ommmm_ _s si iz ze e( () ); ;MMP PI I_ _C Co ommmm_ _r ra an nk k( () ); ;MMP PI I_ _S Se en nd d( () ); ;MMP PI I_ _R Re ec cv v( () ); ;MMP PI I_ _F Fi in na al li iz ze e( () ); ;MPI_Init();并行代码(di m);MPI_Fa
34、inalize();只能有串行代码(di m);第28页/共35页第二十九页,共36页。3.8 MPI程序程序(chngx)的总体结的总体结构构 n n C C语言语言MPIMPI程序的典型程序的典型(dinxng)(dinxng)结构:结构:n n #include “” #include “”n n n n int main(int argc, char *argv) int main(int argc, char *argv)n n n n int myid, numprocs; int myid, numprocs;n n int namelen; int namelen;n n ch
35、ar processor_nameMPI_MAX_PROCESSOR_NAME; char processor_nameMPI_MAX_PROCESSOR_NAME; n n MPI_Init(&argc,&argv); MPI_Init(&argc,&argv);n n MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Comm_rank(MPI_COMM_WORLD,&myid);n n MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_size(MPI_COMM_WORLD,&numprocs);n n M
36、PI_Get_processor_name(processor_name,&namelen); MPI_Get_processor_name(processor_name,&namelen); n n MPI_Finalize(); MPI_Finalize();n n n n 头文件头文件主程序主程序相关变量相关变量(binling)声明声明MPI程序开始程序开始MPI程序执行部分程序执行部分MPI程序结束程序结束第29页/共35页第三十页,共36页。2024/7/31313.9 MPI程序程序(chngx)流程图流程图 MPI_Init()MPI_Comm_rank ()MPI_Comm_
37、size ()建立新的通信器、定义新的数据类型和进程拓扑结构应用程序实体:计算控制程序体;进程间通信;MPI_Finalize ()退出MPI系统程序参数说明End第30页/共35页第三十一页,共36页。3.10 MPI的数据类型的数据类型MPI ( 与与 C 绑定绑定 )C MPI_CHAR signed char MPI_DOUBLE double MPI_FLOAT float MPI_INT int MPI_LONG long MPI_LONG_DOUBLE long double MPI_SHORT short MPI_UNSIGNED_CHAR unsigned char MPI_
38、UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long MPI_UNSIGNED_SHORT unsigned short第31页/共35页第三十二页,共36页。4.1 实例分析实例分析:矩阵向量矩阵向量(xingling)相乘相乘p0p1p2第32页/共35页第三十三页,共36页。4.2 串行代码串行代码(di m)vs.并行代并行代码码(di m)第33页/共35页第三十四页,共36页。谢谢(xi xie)!第34页/共35页第三十五页,共36页。内容(nirng)总结会计学。实现分节点内容与主节点内容的同步更新和自动目录对应(duyng)。3.1 基于MPI的Hello World(C)。3.4 Hello World是如何被执行的。:。#include mpi.h。3.5.2 更新的Hello World(c)。MPI_Init(&argc, &argv)。MPI_Init(&argc,&argv)。4.2 串行代码vs.并行代码。谢谢。第34页/共35页第三十六页,共36页。