消息传递编程接口MPI

上传人:宝路 文档编号:48076166 上传时间:2018-07-09 格式:PPT 页数:41 大小:330.83KB
返回 下载 相关 举报
消息传递编程接口MPI_第1页
第1页 / 共41页
消息传递编程接口MPI_第2页
第2页 / 共41页
消息传递编程接口MPI_第3页
第3页 / 共41页
消息传递编程接口MPI_第4页
第4页 / 共41页
消息传递编程接口MPI_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《消息传递编程接口MPI》由会员分享,可在线阅读,更多相关《消息传递编程接口MPI(41页珍藏版)》请在金锄头文库上搜索。

1、第四讲消息传递编程接口 MPI一、 MPI 编程基础1主要内容q MPI 安装、程序编译与运行 u MPI 进程 / 进程组 u MPI 通信器 u MPI 消息 u MPI 程序基本结构q MPI 编程基础q MPI 程序编译与运行q MPI 数据类型q MPI 几个常用接口 2MPI 介绍q Message Passing Interfacel 消息传递编程标准,目前最为通用的并行编程方式l 提供一个高效、可扩展、统一的并行编程环境l MPI 是一个库,不是一门语言,MPI 提供库函数/过程供 C/FORTRAN 调用l MPI 是一种标准或规范的代表,并不是一个具体实现l 所有的并行计算

2、机制造商都提供对 MPI 的支持l MPI 是一种消息传递编程模型,最终目的是服务于进程间 通信这一目标3MPI 介绍l MPI 1.0:MPICH 1.2.7p1 l MPI 2.0:MPICH2 1.1.1p1q MPI 的实现 免费版本 l 1994 年公布 MPI 1.0 标准,1998 年公布 2.0 标准 q MPI 的目标l 较高的通信性能; l 较好的程序可移植性; l 强大的功能q MPI 商业版本l 一些厂商也提供商业版的 MPI 系统,许多是在 MPICH 的基础上优化产生的4MPI 下载与安装q MPICH 下载http:/www-unix.mcs.anl.gov/mp

3、i/q MPICH 的安装l 参考 MPICH Install Guideq MPICH 的使用l 参考 MPICH User Guide5进程与通信器q MPI 进程 l MPI 程序中一个独立参与通信的个体q MPI 进程组 l MPI 程序中由部分或全部进程构成的有序集合 l 每个进程都被赋予一个所在进程组中唯一的序号(rank), 用于在该组中标识该进程,称为进程号,取值从 0 开始进程的具体个数由用户在递交并行任务时指定q MPI 通信器/通信子(Communicator) l MPI 程序中进程间的通信必须通过通信器进行 l 通信器分为域内通信器(同一进程组内的通信)和域间通 信器

4、(不同进程组的进程间的通信)6进程与通信器u MPI 程序中,一个 MPI 进程由一个进程组和在该组中的进程号唯一确定;或由一个通信器和在该通信器中的进程号唯一确定u 进程号是相对进程组或通信器而言的,同一进程在不同的进程组或通信器中可以有不同的进程号l MPI 程序启动时自动建立两个通信器:MPI_COMM_WORLD :包含程序中所有 MPI 进程 MPI_COMM_SELF :单个进程独自构成,仅包含自己u 进程号是在进程组或通信器被创建时赋予的 u 空进程:MPI_PROC_NULLu 与空进程通信时不做任何操作 7MPI 消息q 消息(message)l 一个消息指进程间进行的一次数

5、据交换l 一个消息由通信器、源地址、目的地址、消息标签、和数据构成发送方接受方8第一个 MPI C 程序#include “mpi.h“ #include int main(int argc, char *argv) int myid, np, 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_name,fprintf(stderr,“Hello, I am proc

6、. %d of %d on %sn“,myid, np, proc_name);MPI_Finalize(); MPI 的初始化和结束mpi.h 是 MPI 相对于C语言的头文件调用MPI 函数时必须包含 MPI 头文件获取运行本进程所在的结点的主机名获取本进程的进程号进程号取值范围为 0, , np-1获取所有参加运算的进程的个数MPI 预定义的宏:所允许的机器名字的最大长度9MPI 程序执行过程启动 4 个进程运行可执行文件 hello进程 0MPI_InitMPI_Comm_rank myid=0MPI_Get_processor_name proc_name=c0101 namelen

7、=5Write hello, I am proc. 0 of 4 on c0101MPI_Finalize进程 3MPI_InitMPI_Comm_rank myid=3MPI_Get_processor_name proc_name=c0102 namelen=5Write hello, I am proc. 3 of 4 on c0102MPI_Finalize 程序运行结束 进程 1进程 210MPI 程序分析u 在单个结点(c0101)上,开 4 个进程的运行结果Hello, I am Proc. 1 of 4 on c0101 Hello, I am Proc. 0 of 4 on

8、c0101 Hello, I am Proc. 2 of 4 on c0101 Hello, I am Proc. 3 of 4 on c0101u 在四个结点上,开 4 个进程的运行结果Hello, I am Proc. 1 of 4 on c0101 Hello, I am Proc. 3 of 4 on c0102 Hello, I am Proc. 2 of 4 on c0104 Hello, I am Proc. 0 of 4 on c010311MPI 程序执行过程12MPI 编程惯例l MPI 的所有常量、变量与函数均以 MPI_ 开头l MPI 的 C 语言接口为函数l 在 C

9、 程序中,所有常数的定义除下划线外一律由大写字母组成,在函数和数据类型定义中, 接 MPI_ 之后的第一个字母大写,其余全部为小写字母,即 MPI_Xxxx_xxx 形式l MPI 程序的开始和结束必须是 MPI_Init 和MPI_Finalize,分别完成 MPI 的初始化和结束工作l 除 MPI_Wtime 和 MPI_Wtick 外,所有 C 函数调用之后都将返回一个错误信息码l 由于 C 语言的函数调用机制是值传递,所以 MPI 的所有C 函数中的输出参数用的都是指针13MPI 编程惯例l MPI 是按进程组(Process Group) 方式工作:所有 MPI 程序在开始时均被认为

10、是在通信器 MPI_COMM_WORLD 所拥有的进程组中工作,之后用户可以根据自己的需要,建立其它的进程组l 所有 MPI 的通信一定要在通信器中进行14编译与运行l C 编写的 MPI 程序mpicc o hello hello.cq MPI 程序的编译q MPI 程序的运行l mpirun (old,使用 rsh 启动 MPI 进程) l mpiexec (new,使用 ssh 启动 MPI 进程,更安全)MPICH2 中的 mpirun 和 mpiexec 是同一个命令15MPI 编程初步数据类型与基本接口16MPI 数据类型MPI 数据类型分: 原始数据类型和自定义数据类型u MPI

11、 定义了一些基本数据类型主要用于消息传递 n MPI 数据类型命名规则 以 MPI_ 开头,后面跟 C 语言原始数据类型名全部为大写!17MPI 原始数据类型 MPI datatypeC datatype MPI_CHARsigned char MPI_SHORTsigned short int MPI_INTsigned int MPI_LONGsigned long int MPI_UNSIGNED_CHARunsigned char MPI_UNSIGNED_SHORTunsigned short int MPI_UNSIGNED_INTunsigned int MPI_UNSIGNED

12、_LONGunsigned long int MPI_FLOATfloat MPI_DOUBLEdouble MPI_LONG_DOUBLElong double MPI_BYTE MPI_PACKED自定义数据类型以后再介绍 18MPI 常量n MPI 定义一组常量 l MPI 常量命名规则:全部大写 MPI_MAX_PROCESSOR_NAME MPI_PROC_NULL MPI_COMM_WORLD MPI_COMM_SELF MPI_COMM_NULL MPI_ANY_SOURCE MPI_ANY_TAG MPI_TAG_UB MPI_LB MPI_UB MPI_BOTTOM 19MP

13、I 常用接口l MPI_INIT l MPI_FINALIZE l MPI_COMM_RANK l MPI_COMM_SIZE l MPI_SEND l MPI_RECVl MPI_SENDRECV l MPI_SENDRECV_REPLACE l MPI_GET_COUNT l MPI_ABORT l MPI_WTIME l MPI_GET_PROCESSOR_NAME l MPI_MPI_GET_VERSION20MPI_INITMPI_INIT:MPI 初始化参数无Cint MPI_Init(int *argc, char *argv)l 该函数初始化 MPI 并行程序的执行环境l 它必

14、须在调用所有其它 MPI 函数之前被调用(除 MPI_INITIALIZED)l 在一个 MPI 程序中,只能被调用一次21MPI_FINALIZEMPI_FINALIZE:结束 MPI 系统参数无Cint MPI_Finalize(void)l 该函数清除 MPI 环境的所有状态l 它被调用后,所有MPI 函数都不能再调用,包括 MPI_INIT22MPI_COMM_RANKMPI_COMM_RANK(comm, rank)参数IN comm 通信器 OUT rank 本进程在通信器 comm 中的进程 号Cint MPI_Comm_rank(MPI_Comm comm, int *rank

15、)l 该函数返回本进程在指定通信器中的进程号23MPI_COMM_SIZEMPI_COMM_SIZE(comm, size)参数IN comm 通信器 OUT size 该通信器 comm 中的进程数Cint MPI_Comm_size(MPI_Comm comm, int *size)l 该函数返回指定通信器所包含的所有进程个数24MPI_SENDMPI_SEND(buf,count,datatype,dest,tag,comm)参数IN buf 所发送消息的首地址 IN count 将发送的数据的个数 IN datatype 发送数据的数据类型 IN dest 接收消息的进程的标识号 IN

16、 tag 消息标签 IN comm 通信器Cint MPI_Send(void *buf, int count,MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)l 阻塞型消息发送接口l 最基本的点对点通信函数之一25MPI_SENDl MPI_SEND 将缓冲区中 count 个 datatype 类型的数据发 给进程号为 dest 的目的进程 l 这里 count 是元素个数,即指定数据类型的个数,不是字 节数,数据的起始地址为 buf l datatype 是 MPI 数据类型 l 本次发送的消息标签是 tag,使用标签的目的是把本次发 送的消息和本进程向同一目的进程发送的其它消息区别开来 l dest 的取值范围为0np-1 ( np 表示通信器 comm 中的进 程数) 或 MPI_PROC_NULL,tag 的取值为 0 MPI_TAG

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号