《MPI并行编程【技术专攻】》由会员分享,可在线阅读,更多相关《MPI并行编程【技术专攻】(35页珍藏版)》请在金锄头文库上搜索。
1、MPI并行编程1专业课大纲MPI并行编程简介Linux下MPI并行编程环境的搭建MPI并行程序设计实例分析:矩阵乘法2专业课1.1 什么是并行计算进程进程 1 发送信息发送信息进程进程 2 接收信息接收信息传统的串行计算串行计算,分为“指令”和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。 并行计算并行计算将进程相对独立的分配于不同的节点上,由各自独立的操作系统调度,享有独立的CPU和内存资源(内存可以共享);进程间相互信息交换通过消息传递; 进程进程 1 进程进程 2 3专业课1.2 并行计算在电力行业的研究和应用中国电科院发明专利“电力系统潮流
2、潮流分网并行计算方法”获得中国专利金奖(发明人:周孝信、吴中习、郭剑、李亚楼、田芳)2010.11 大规模电网并行潮流潮流算法2008电力系统状态估计状态估计的分布式并行处理2003电力系统最优潮流潮流的分布式并行算法2003电网在线安全分析安全分析的并行处理方法 1996基于GPU的电力系统并行潮流潮流计算的实现 2010基于MPI和PQ分解法的电力系统潮流潮流并行算法的研究2005 基于并行计算的电力系统风险评估风险评估2009基于并行协调算法的电力系统状态估计状态估计2007基于改进并行遗传算法的电网状态估计状态估计2006应用网格平台的潮流潮流计算并行算法2009基于MPI电力系统潮流
3、潮流PQ分解法的并行算法20082008电网控制中心新技术综述20094专业课1.3 并行编程标准多线程库标准多线程库标准 Win32 API. POSIX threads.编译制导标准编译制导标准 OpenMP 可移植共享存储并行编程标准.消息传递库标准消息传递库标准 MPI PVM5专业课1.4 1.4 M Massage assage P Passing assing I Interface(MPI)nterface(MPI)MPI 是由MPI 委员会(MPI Forum)在1992年到1994年举行的一系列会议上逐渐产生的一个消息传递标准( http:/www.mpi-forum.or
4、g/ )。发展MPI 1.1: 1995MPICH:是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性.MPI 1.2 (1997).MPI 2.2 (2009-09)6专业课MPI是一个库,而不是一门语言是一个库,而不是一门语言 这个标准支持 C 语言和 FORTRAN 语言MPI库可以被FORTRAN77/C/Fortran90/C+调用它遵守所有对库函数/过程的调用规则,和一般的函数/过程没有什么区别7专业课MPI是一种标准或规范,而不是具体实现是一种标准或规范,而不是具体实现实现:Mpich、OpenMPI、Chimp、Lam例如:MP
5、I_Init(int *argc, char *argv )的实现MPICH的实现int MPI_Init( int *argc, char *argv ) static const char FCNAME = MPI_Init; int mpi_errno = MPI_SUCCESS; int rc; 。OpenMPI的实现int MPI_Init( int *argc, char *argv ) int err; int provided; char *env; int required = MPI_THREAD_SINGLE; 。8专业课MPI是一种消息传递编程模型是一种消息传递编程模型
6、节点间基于节点间基于消息消息进行通讯进行通讯9专业课2.1 MPICH的实验环境实验环境:RedHat 9.0 + Vmware 6.0 + MPICH 2-1.0Fedora 14+ Dell Blade*1(主节点)+Dell PC*2(从节点) +MPICH 2-1.2.1p110专业课2.2 MPICH的搭建步骤搭建步骤1-挂载NFSNFS文件系统实现分节点内容与主节点内容的同步更新和自动目录对应2-配置SSHSSH公钥认证实现MPI节点间用户的无密码访问各节点间进行消息传递3-安装安装安装安装MPICHMPICH至NFS目录4-修改各种配置配置配置配置文件5-试运行example文件
7、夹中的例子11专业课3.1 基于MPI的Hello World(C)#include #include mpi.h“main( int argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();12专业课3.2 MPI程序的的编译与运行mpif77 hello.f 或 mpicc hello.c 默认生成a.out的可执行代码.(mpicc hello.c)mpif77 o hello hello.f 或mpicc o hello hello.c生成hello的可执行代码.mpir
8、un np 4 a.outmpirun np 4 hello4 指定np的实参,表示进程数,由用户指定.a.out / hello 要运行的MPI并行程序.%小写o%np:The Number of Process.13专业课3.3 运行MPI程序dairnode01 $ mpicc -o hello hello.cdairnode01 $ ./hello () ) 0 Aborting program ! Could not create p4 procgroup. Possible missing fileor program started without mpirun.dairnode
9、01 $ mpirun -np 4 hello () ) Hello World! Hello World! Hello World! Hello World!dairnode01 $ 计算机打印字符我们输入的命令14专业课3.4 Hello World是如何被执行的?SPMD: Single Program Multiple Data(SPMD) :#include mpi.h#include main( int argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();#inc
10、lude 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( &arg
11、c, &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();15专业课MPI程序的执行过程16专业课3.5 进一步的MPI并行程序在写MPI程序时,我们常需要知道以下两个问题的答案:任务由任务由多少多少个进程来进行并行计
12、算?个进程来进行并行计算?(多少个节(多少个节目)目)我是我是哪一个哪一个进程进程? (节目名程) 好比是晚会导演安排节目次序,每个节目拿到的是相同的节目单。对号入座 17专业课3.5.1 MPI相关接口MPI 提供了下列函数来回答这些问题:用用MPI_Comm_size 获得进程个数 p int MPI_Comm_size(MPI_Comm comm, int *size);用用MPI_Comm_rank 获得进程的一个叫rank的值,该 rank值为0到p-1间的整数,相当于进程的IDint MPI_Comm_rank(MPI_Comm comm, int *rank);18专业课3.5.
13、2 更新的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_Finalize();19专业课运行结果dairnode01 $ mpicc o hello1 hello
14、1.cdairnode01 $ mpirun -np 4 hello1I am 0 of 4I am 1 of 4I am 2 of 4I am 3 of 4dairnode01 $计算机打印字符我们输入的命令20专业课3.6.1 MPI消息 消息:指在进程间进行的一次数据交换。一个消息由源地址、数据个数、数据类型、目标地址、消息标识和通信体构成。消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容。MPI_Send(buf,count,datatype,dest,tag,comm)消息数据消息信封21专业课3.6.2 消息传递过程22专业课3.6
15、.3 MPI点对点通信函数 MPI_Send ( void * buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm )被发送消息的地址被发送消息的地址被发送数据项的个数被发送数据项的个数消息数据的类型消息数据的类型目标进程的序号目标进程的序号消息标志消息标志通信体通信体23专业课3.6.3 MPI点对点通信函数 MPI_Recv ( void * buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_
16、Status *status )被接收消息的地址被接收消息的地址被接收数据项的个数被接收数据项的个数消息数据的类型消息数据的类型源进程的序号源进程的序号消息标志消息标志通信体通信体返回的通信状态返回的通信状态24专业课3.6.4 加入消息传递的HelloWorld(c)#include #include mpi.h“main(int argc, char* argv) int numprocs; /*进程数,该变量为各处理器中的同名变量, 存储是分布的*/int myid;/*我的进程ID,存储也是分布的*/ MPI_Status status; /*消息接收状态变量,存储也是分布的*/ ch
17、ar message100;/*消息buffer,存储也是分布的*/ /*初始化MPI*/MPI_Init(&argc, &argv); /*该函数被各进程各调用一次,得到自己的进程rank值*/MPI_Comm_rank(MPI_COMM_WORLD, &myid);/*该函数被各进程各调用一次,得到进程数*/MPI_Comm_size(MPI_COMM_WORLD, &numprocs);25专业课3.6.4 加入消息传递的HelloWorld(c) (续)if (myid != 0) /*建立消息*/ sprintf(message, “HelloWorld from process %
18、d!,myid); /* 发送长度取strlen(message)+1,使0也一同发送出去*/ 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,标志并行代码段的结束*/ MPI_F
19、inalize(); /* End main */26专业课问题:进程1、2、3谁先向进程0发送消息?27专业课运行结果dairnode01 $ mpicc o hello2 hello2.cdairnode01 $ mpirun -np 4 hello2 HelloWorld from process 1! HelloWorld from process 2! HelloWorld from process 3!dairnode01 $计算机打印字符我们输入的命令28专业课3.7 最基本的MPIMPI调用借口的总数虽然庞大(几百个),但根据实际编写MPI的经验,常用的MPI调用的个数确实有限
20、。下面是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();只能有串行代码;29专业课3.8 MPI程序的总体结构 C语言MPI程序的典型结构: #include “mpi.h” int main(int argc, char *argv) int myid, numprocs; int namelen; char processor_nameMPI_MAX_PROCESSOR
21、_NAME; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Get_processor_name(processor_name,&namelen); MPI_Finalize(); 头文件头文件主程序主程序相关变量声明相关变量声明MPI程序开始程序开始MPI程序执行部分程序执行部分MPI程序结束程序结束30专业课3.9 MPI程序流程图 MPI_Init()MPI_Comm_rank ()MPI_Comm_size ()建立新的通信
22、器、定义新的数据类型和进程拓扑结构应用程序实体:计算控制程序体;进程间通信;MPI_Finalize ()退出MPI系统程序参数说明End31专业课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_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long MPI_UNSIGNED_SHORT unsigned short32专业课4.1 实例分析:矩阵向量相乘p0p1p233专业课4.2 串行代码vs.并行代码34专业课谢谢!35专业课