中国料学火计算机科学与波术系 niversity of Science and Technology of China D三P去RT三TFC口PTER三巴 NCE AND了N。LDr 2消息传递方式 消息传递的特点: 在消息传递模型中,一个并行应用由一组进程组成,每个进程的代码是本 地的,只能访问私有数据,进程之间通过传递消息实现数据共享和进 程同步 优点:用户可以对并行性的开发、数据分布和通信实现完全控制 缺点: (1)要求程序员显式地处理通信问题,如,消息传递调用的位置,数据移 动,数据复制,数据操作,数据的一致性等等 (2)对大多数科学计算程序来说,消息传递模型的真正困难还在于显式的 域分解,也就是说,将对相应数据的操作限定在指定的处理器上进行, 在每个处理器上只能看见整个分布数据的一部分 (3)无法以渐进的方式、通过逐步将串行代码转换成并行代码而开发出来 大量的散布在程序各处的域分解要求整个程序由串行到并行的转换 次性实现,而共享存储方法允许在现有的串行代码中插入并行说明从 而实现逐步转换.与之相比,这是消息传递的一个明显的缺点 国家高性能计算中心(合肥
国家高性能计算中心(合肥) 消息传递的特点: 在消息传递模型中, 一个并行应用由一组进程组成, 每个进程的代码是本 地的, 只能访问私有数据, 进程之间通过传递消息实现数据共享和进 程同步. 优点: 用户可以对并行性的开发、数据分布和通信实现完全控制. 缺点: (1) 要求程序员显式地处理通信问题, 如, 消息传递调用的位置, 数据移 动, 数据复制, 数据操作, 数据的一致性等等. (2) 对大多数科学计算程序来说, 消息传递模型的真正困难还在于显式的 域分解, 也就是说, 将对相应数据的操作限定在指定的处理器上进行, 在每个处理器上只能看见整个分布数据的一部分. (3) 无法以渐进的方式、通过逐步将串行代码转换成并行代码而开发出来. 大量的散布在程序各处的域分解要求整个程序由串行到并行的转换一 次性实现, 而共享存储方法允许在现有的串行代码中插入并行说明从 而实现逐步转换.与之相比, 这是消息传递的一个明显的缺点. 2 消息传递方式
中国料学火计算机科学与波术系 niversity of Science and Technolo ogy of China DEAT三 NT OF C口 MPUTER SCIENGE AND TECHNOLOr 分布存储系统并行編程 14.1基于消息传递的编程 142MPI并行编程 143PVM并行编程 144基于数据并行的并行编程 145HPF并行编程 国家高性能计算中心(合肥
国家高性能计算中心(合肥) 分布存储系统并行编程 ▪ 14.1 基于消息传递的编程 ▪ 14.2 MPI并行编程 ▪ 14.3 PVM并行编程 ▪ 14.4 基于数据并行的并行编程 ▪ 14.5 HPF并行编程
中国料学火计算机科学与波术系 niversity of Science and Technology of China DEAT三 NT OF C口 MPUTER SCIENGE AND TECHNOLOr MP工并行编程 lMPI中的消息 2MP中的消息信封 3MP中的四种通信模式 4点对点的通信 5群集通信 6MPE扩展 7例子:计算PMP程序 国家高性能计算中心(合肥
国家高性能计算中心(合肥) MPI并行编程 1 MPI中的消息 2 MPI中的消息信封 3 MPI中的四种通信模式 4 点对点的通信 5 群集通信 6 MPI扩展 7 例子:计算Pi的MPI程序
#include"mpi. h 例1.1一个计算∑o()的 MPISPMD消 int foo(i int i: 息传递程序,存放在文件“ myprog. C”中 main(argc, argv) int argc, char* argyll 初始化MP环境 int i, tmp, sumo, group size, my rank, N; MPI Init(&argc, &argv); MPI Comm size(MPI COMM WORLD, &group size) 得到缺省的进程组大小 MPI Comm rank(MPI COMM WORLD, &my rank); if (my rank==0) 得到每个进程在组 printf("Enter N: ) 中的编号 scanf("%od", &N)i for (i-l:i<group size; i++) IPI Send(&N, 1, MPI INT, i, i, MP COMM WORLD); 发送消息 for(i=my rank; i<N; i=i+group size)sum=sum+tmp for (i=l; i<group size; i++)i MPI Recv(&tmp, 1, MPI INT, L,iMPI COMM WORLD, &status ) sumsum+tmp; printf("In The result=%od", sum); 接收消息 else MPI Recv(&N, 1, MPI INT,i,i, MPI COMM WORLD, &status for (i-my rank; i<N; i=itgroup size)sumsum+ foo(i); MPI Send(&sum, 1, MPI INT,O, L, MPI COMM WORLD): K MPI Finalize(; 终止MP环境
国家高性能计算中心(合肥) 1 MPI中的消息 第五讲 #include "mpi.h" int foo(i) int i; {...} main(argc, argv) int argc; char* argv[] { int i, tmp, sum=0, group_size, my_rank, N; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &group_size); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); if (my_rank==0) { printf("Enter N:"); scanf("%d",&N); for (i=1;i<group_size;i++) MPI_Send(&N, 1, MPI_INT, i, i, MPI_COMM_WORLD); for (i=my_rank;i<N;i=i+group_size) sum=sum+tmp; for (i=1;i<group_size;i++) { MPI_Recv(&tmp,1,MPI_INT,i,i,MPI_COMM_WORLD,&status); sum=sum+tmp; } printf("\n The result = %d", sum); } else { MPI_Recv(&N,1,MPI_INT,i,i,MPI_COMM_WORLD,&status); for (i-my_rank;i<N;i=i+group_size) sum=sum+foo(i); MPI_Send(&sum,1,MPI_INT,0,i,MPI_COMM_WORLD); } MPI_Finalize(); } 例1.1 一个计算∑foo(i)的MPI SPMD消 息传递程序, 存放在文件 “myprog.c”中 初始化MPI环境 得到缺省的进程组大小 得到每个进程在组 中的编号 发送消息 接收消息 终止MPI环境
中国料学火计算机科学与波术系 niversity of Science and Technolo ogy of China DEAT三 NT OF C口 MPUTER SCIENGE AND TECHNOLOr lMP中的消息 这个程序用以下并行0编译器mpcc来编译 mpcc myprog.C-o myprog 执行下列命令将可执行程序 myprog加载到n个节点上: MPIRUN myprog -np n MPI进程是重型的单线进程.它们拥有不同的地址空间.因此, 个进程不能直接访问另一个进程地址空间的中的变量.进程间的 通信用消息传递来实现 国家高性能计算中心(合肥
国家高性能计算中心(合肥) 这个程序用以下并行C编译器mpcc来编译: 执行下列命令将可执行程序myprog加载到n个节点上: mpcc myprog.c –o myprog MPIRUN myprog –np n MPI进程是重型的单线进程. 它们拥有不同的地址空间. 因此, 一个进程不能直接访问另一个进程地址空间的中的变量. 进程间的 通信用消息传递来实现. 1 MPI中的消息