收藏 分享(赏)

MPI教程.pdf

上传人:HR专家 文档编号:6298222 上传时间:2019-04-05 格式:PDF 页数:4 大小:168.56KB
下载 相关 举报
MPI教程.pdf_第1页
第1页 / 共4页
MPI教程.pdf_第2页
第2页 / 共4页
MPI教程.pdf_第3页
第3页 / 共4页
MPI教程.pdf_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、1并行计算第三讲MPI 编程基础2主要内容uMPI 进程/ 进程组uMPI 通信器uMPI 消息uMPI 程序基本结构qMPI 编程基础qMPI 程序编译与运行qMPI 数据类型qMPI 几个常用接口3MPI介绍qMessage Passing Interfacel消息传递编程标准,目前最为通用的并行编程方式l提供一个高效、可扩展、统一的并行编程环境lMPI 是一个库,不是一门语言,MPI 提供库函数供C 语言调用4MPI编程基本概念qMPI 进程lMPI 程序中一个独立参与通信的个体qMPI 进程组lMPI 程序中由部分或全部进程构成的有序集合l每个进程都被赋予一个所在进程组中唯一的序号(r

2、ank),用于在该组中标识该进程,称为进程号,取值从0开始进程个数由用户在递交并行任务时指定5MPI进程与通信器qMPI 通信器 (Communicator)lMPI 程序中进程间的通信必须通过通信器进行l通信器分为域内通信器(同一进程组内的通信)和域间通信器(不同进程组的进程间的通信)lMPI 程序启动时自动建立两个通信器:MPI_COMM_WORLD :包含程序中所有MPI 进程MPI_COMM_SELF:有单个进程独自构成,仅包含自己u进程号是在进程组或通信器被创建时赋予的u空进程:MPI_PROC_NULLu与空进程通信时不做任何操作6MPI消息q消息(message)l一个消息指进程

3、间进行的一次数据交换l一个消息由通信器、源地址、目的地址、消息标签、和数据构成发送方 接受方7第一个MPI C 程序/ hello_world.c#include “mpi.h“#include int main(argc, argv)int argc;char *argv;int myid, np;int namelen;char proc_nameMPI_MAX_PROCESSOR_NAME;MPI_Init(MPI_Comm_rank(MPI_COMM_WORLD, MPI_Comm_size(MPI_COMM_WORLD, MPI_Get_processor_name(proc_nam

4、e, fprintf(stderr,“Hello,I am proc. %d of %d on %sn“,myid, np, proc_name);MPI_Finalize();mpi.h是MPI 相对于C语言的头文件8MPI 程序分析所有包含MPI 调用的程序必须包含MPI 头文件MPI_MAX_PROCESSOR_NAME是MPI 预定义的宏,即MPI 所允许的机器名字的最大长度MPI 程序的开始和结束必须是MPI_Init和MPI_Finalize,分别完成MPI 的初始化和结束工作MPI_Comm_rank得到本进程的进程号MPI_Comm_size得到所有参加运算的进程的个数MPI_

5、Get_processor_name得到运行本进程所在的结点的主机名进程号取值范围为0, , np-19MPI 程序分析u在单个结点(c0101)上,开4 个进程的运行结果Hello, I am Proc. 1 of 4 on c0101Hello, I am Proc. 0 of 4 on c0101Hello, I am Proc. 2 of 4 on c0101Hello, I am Proc. 3 of 4 on c0101u在四个结点上,开4 个进程的运行结果Hello, I am Proc. 1 of 4 on c0101Hello, I am Proc. 3 of 4 on c0

6、102Hello, I am Proc. 2 of 4 on c0104Hello, I am Proc. 0 of 4 on c010310MPI 程序执行过程启动编译生成的可执行文件 hello_world进程0MPI_InitMPI_Comm_rankmyid=0MPI_Get_processor_nameproc_name=c0101namelen=5Writehello, I am proc. 0 of 4 on c0101MPI_Finalize进程3MPI_InitMPI_Comm_rankmyid=3MPI_Get_processor_nameproc_name=c0102na

7、melen=5Writehello, I am proc. 3 of 4 on c0102MPI_Finalize程序运行结束进程1 进程211MPI编程的一些惯例lMPI 的所有常量、变量与函数/过程均以MPI_开头lMPI 的C 语言接口为函数l在C 程序中:所有常数的定义除下划线外一律由大写字母组成;在函数和数据类型定义中, 接MPI_之后的第一个字母大写,其余全部为小写字母,即MPI_Xxxx_xxx形式l除MPI_Wtime和MPI_Wtick外,所有C 函数调用之后都将返回一个错误信息码12MPI编程的一些惯例l由于C 语言的函数调用机制是值传递,所以MPI 的所有C 函数中的输出

8、参数用的都是指针lMPI 是按进程组(Process Group) 方式工作:所有MPI 程序在开始时均被认为是在通信器MPI_COMM_WORLD所拥有的进程组中工作,之后用户可以根据自己的需要,建立其它的进程组l所有MPI 的通信一定要在通信器中进行l C 语言的数组的下标是从0开始的13MPI程序的编译mpicc ohello_world hello_world.cqMPI 程序的编译qMPI 程序的运行lmpirun (old,使用rsh启动MPI进程)lmpiexec (new,使用ssh启动MPI进程,更安全)由于系里的机群使用的是联想开发的系统管理和任务调度软件,提交任务需使用专

9、门的命令,将在后面详细讲解。lo用于指定编译生成的可执行文件的文件名具体使用方法见课程主页14MPI基本数据类型uMPI 定义了一些基本数据类型主要用于消息传递nMPI 数据类型命名规则以MPI_ 开头,后面跟C 语言原始数据类型名注:全部为大写!15MPI原始数据类型MPI数据类型与C语言数据类型MPI_PACKEDMPI_BYTElong doubleMPI_LONG_DOUBLEdoubleMPI_DOUBLEfloatMPI_FLOATunsigned long intMPI_UNSIGNED_LONGunsigned intMPI_UNSIGNED_INTunsigned short

10、 intMPI_UNSIGNED_SHORTunsigned charMPI_UNSIGNED_CHARsigned long intMPI_LONGsigned intMPI_INTsigned short intMPI_SHORTsigned charMPI_CHARC datatypeMPI datatype16MPI常用的接口u MPI_Initu MPI_Finalizeu MPI_Comm_ranku MPI_Comm_sizeu MPI_Get_processor_nameu MPI_Sendu MPI_Recvu MPI_Sendrecvu MPI_Sendrecv_repla

11、ce17MPI_InituMPI_Init:MPI 初始化intMPI_Init(int *argc, char *argv)C无参数l该函数初始化MPI 并行程序的执行环境,它必须在调用所有其它MPI 函数(除MPI_Initilized)之前被调用,并且在一个MPI 程序中,只能被调用一次18MPI_FinalizeuMPI_Finalize:结束MPI 系统intMPI_Finalize(void)C无参数l该函数清除MPI 环境的所有状态。即一但它被调用,所有MPI 函数都不能再调用,其中包括MPI_Init19MPI_Comm_rankuMPI_Comm_rank(comm, ran

12、k)intMPI_Comm_rank(MPI_Comm comm, int *rank)CIN comm 通信器OUT rank 本进程在通信器comm中的进程号参数l该函数返回本进程在指定通信器中的进程号20MPI_Comm_sizeuMPI_Comm_size(comm, size)intMPI_Comm_size(MPI_Comm comm, int*size)CIN comm 通信器OUT size 该通信器comm中的进程数参数l该函数返回指定通信器所包含的进程数21MPI_Get_processor_nameuMPI_Get_processor_name(name, namelen

13、)l该函数返回进程所在结点的主机名intMPI_Get_processor_name(char *name,int *namelen)COUT name 结点主机名OUT namelen 主机名的长度参数22MPI点对点通信nMPI 通信分类l点对点通信是MPI 通信机制的基础l点对点通信分:阻塞型和非阻塞型nMPI 点对点通信l点对点通信:两个进程之间的数据传递l聚合通信:多个进程之间的通信23阻塞型通信n阻塞型(blocking)通信l阻塞型通信函数需要等待指定的操作实际完成,或所涉及的数据被MPI 系统安全备份后才返回l非阻塞型通信(略)阻塞型通信是非局部操作,它的完成可能涉及其它进程典

14、型的阻塞型通信函数:MPI_SEND和MPI_RECV24MPI_Send点对点通信uMPI_Send(buf,count,datatype,dest,tag,comm)intMPI_Send(void *buf, int count,MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)CIN buf 所发送消息的首地址IN count 将发送的数据的个数IN datatype 发送数据的数据类型IN dest 接收消息的进程的标识号IN tag 消息标签IN comm 通信器参数25MPI_Send点对点通信MPI_Send (bu

15、f,count,datatype,dest,tag,comm)l阻塞型消息发送接口lMPI_Send将缓冲区中count个datatype类型的数据发给进程号为dest的目的进程。这里count是元素个数,即指定数据类型的个数,不是字节数,数据的起始地址为buf。本次发送的消息标签是tag,使用标签的目的是把本次发送的消息和本进程向同一目的进程发送的其它消息区别开来。其中dest的取值范围为0np-1 ( np表示通信器comm中的进程数) 或MPI_PROC_NULL,tag的取值为0MPI_TAG_UBl该函数可以发送各种类型的数据,如整型、实型、字符等26MPI_Recv点对点通信uMP

16、I_Recv(buf,count,datatype,source,tag,comm,status)intMPI_Recv(void *buf, int count, MPI_Datatype datatype, int source,int tag,MPI_Comm comm,MPI_Status *status)COUT buf 接收消息数据的首地址IN count 接收数据的最大个数IN datatype 接收数据的数据类型IN source 发送消息的进程的标识号IN tag 消息标签IN comm 通信器OUT status 返回状态参数27MPI_Recv点对点通信MPI_Recv(

17、buf,count,datatype,source,tag,comm,status)l阻塞型消息接收接口l从指定的进程source接收不超过count个datatype类型的数据,并把它放到缓冲区中,起始位置为buf,本次消息的标识为tag。这里source的取值范围为0 np-1,或MPI_ANY_SOURCE,或MPI_PROC_NULL,tag的取值为0MPI_TAG_UB或MPI_ANY_TAGl接收消息时返回的状态status,在C 语言中是用结构定义的,其中包括MPI_SOURCE,MPI_TAG和MPI_ERROR。28MPI程序示例例:每个进程给下一个进程发送一个数据,并从前一

18、个进程接收一个数据,即0号进程给1号进程发送一个数据,并从np-1号进程接收一个数据,1号进程从0号进程接收一个数据,并向2号进程发送一个数据,以此类推。l实现方式一:0号进程先发送后接收,其它进程先接收后发送例:ex4sendrecv01.c在使用阻塞型函数传递消息时要避免死锁!例:ex4sendrecv02.cl实现方式二:奇数号进程先发送后接收,偶数号进程先接收后发送作为上机作业29MPI发送接收MPI_Send(buf,count,datatype,dest,tag,comm)MPI_Recv(buf,count,datatype,source,tag,comm,status)消息数据

19、消息数据消息信封消息信封发送数据类型、通信函数中的数据类型、接收的数据类型要一致!C:结构status.MPI_SOURCEstatus.MPI_TAGstatus.MPI_ERROR30MPI_SendrecvuMPI_Sendrecv(sendbuf, sendcount, sendtype,dest, sendtag,recvbuf, recvcount, recvtype,source, recvtag, comm, status)intMPI_Sendrecv(void *sendbuf,int sendcount, MPI_Datatype sendtype, int dest,i

20、nt sendtag,void *recvbuf,int recvcount, MPI_Datatype recvtype, int source,int recvtag,MPI_Comm comm,MPI_Status *status)C略参数l这是发送和接收组合在一起的函数,好处是不用考虑先发送还是先接收消息,从而可以避免消息传递过程中的死锁lsendbuf和recvbuf必须指向不同的缓冲区例:ex4sendrecv03.c31MPI_Sendrecv_replaceintMPI_Sendrecv_replace(void *buf, int count, MPI_Datatype da

21、tatype, int dest,int sendtag,int source,int recvtag,MPI_Comm comm,MPI_Status *status)C略参数例:ex4sendrecv04.cuMPI_Sendrecv_replace(buf, count, datatype,dest, sendtag, source, recvtag,comm, status)l功能与MPI_SENDRECV类似,但收发消息使用的是同一个缓冲区32上机作业l熟悉并行程序的编译和运行(1) 从课程主页上下载hello_world.c到你的主目录中(2) 编译该并行程序:mpicc-O2 -o hello_worldhello_world.c(3) 运行生成的可执行文件hello_worldmpirun-np4 hello_worldl每个进程给下一个进程发送一个数据,并从前一个进程接收一个数据。(要求写入实验报告纸)(1) 奇数号进程先发送后接收,偶数号进程先接收后发送(2) 使用4个进程(3) 使用MPI_Send和MPI_Recv实现(4) 文件取名为myex4sendrecv.c(5) 参考ex4sendrecv01.c

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报