Presentation is loading. Please wait.

Presentation is loading. Please wait.

周纯葆 中国科学院计算机网络信息中心 超级计算中心

Similar presentations


Presentation on theme: "周纯葆 中国科学院计算机网络信息中心 超级计算中心"— Presentation transcript:

1 周纯葆 中国科学院计算机网络信息中心 超级计算中心 zhoucb@sccas.cn
MPI并行编程 周纯葆 中国科学院计算机网络信息中心 超级计算中心

2 目录 并行计算与MPI MPI环境管理函数 MPI点对点通讯函数 MPI集合通讯函数 MPI自定义数据类型 MPI进程组与通讯器

3 并行计算与MPI 串行计算 并行计算 传统程序都是进行串行计算的。一个问题被分为一系列离散的指令;指令之间都是顺序执行的;只能运行在一个处理器上;在同一时刻,只能有一条指令在执行。 并行计算是利用多个处理器资源来进行计算的。问题被分为多个独立的,可以同时进行计算的部分;每个计算部分进一步被分为一系列指令;不同计算部分的执行可以在不同的处理器上同时进行执行;

4 并行计算与MPI 为什么要用到并行计算呢,主要是两方面的考虑,第一是减少计算时间,第二是增加计算规模。
并行计算三个基本条件:并行机器,并行算法,并行编程。

5 并行计算与MPI 共享存储 均匀访存(UMA:Uniform Memory Access) 内存与结点分离,存储为所有结点共享
所有结点任意访问存储单元,且时间相同 访存竞争时,仲裁策略平等对待每个处理器 各处理器带有局部高速缓存cache 单一的操作系统映象 对称多处理共享存储并行机 SMP

6 并行计算与MPI 共享存储 非均匀访存(NUMA: Non-uniform Memory Access)
内存模块局部在各个结点内,所有局部内存构成全局内存 所有结点任意访问各存储单元,但速度和时间不等 访存竞争时,仲裁策略对待每个处理器可能不等价 各处理器带有局部高速缓存cache,以及保持缓存一致性的协议,此又称cache一致性的非均匀存储——ccNUMA 单一操作系统映象 分布共享存储并行机 DSM

7 并行计算与MPI 分布式存储 内存模块物理分布同前,每个结点拥有局部内存模块 各结点存储模块只能被局部CPU访问
访问其他结点内存,可通过消息传递实现 各结点拥有不同的操作系统映象 结点内和结点间的互连通常都有特殊的技术来提高通讯速度,其操作系统不是开放的,而是制造者专有 大规模并行机MPP

8 并行计算与MPI 混和存储 结点内部是共享存储模型 结点间是分布式存储模型 各结点拥有不同的操作系统映象 深腾7000

9 并行计算与MPI OPENMP MPI 共享存储环境:通过读写操作系统提供的共享数据缓存。
分布存储网络环境中:通过socket网络通讯来完成。 MPI

10 使用进程的地址空间,有私有栈,各线程栈不相交
并行计算与MPI 进程与线程 线程 操作系统调度执行的最小单位 继承 执行特征 比喻为苦力 属于某个进程 使用进程的地址空间,有私有栈,各线程栈不相交 进程 操作系统资源分配的最小单位 资源特征 + 执行特征 比喻为管家 至少包含一个线程 拥有自己的地址空间 资源特征:程序执行所需要的计算资源。 执行特征:进程执行过程中动态改变的特征。 如果要生成子进程就要复制资源特征和执行特征,而线程是共享资源特征的,只复制执行特征即可。

11 并行计算与MPI MPI (Message Passing Interface) 是函数库规范,而不是并行语言;操作如同库函数调用
是一种标准和规范,而非某个对它的具体实现(MPICH等),与编程语言无关 是一种消息传递编程模型,并成为这类编程模型的代表 What is the message? DATA+ENVELOPE

12 并行计算与MPI Inscribe a circle in a square
Randomly generate points in the square Determine the number of points in the square that are also in the circle Let r be the number of points in the circle divided by the number of points in the square PI ~ 4 r Note that the more points generated, the better the approximation

13 并行计算与MPI

14 并行计算与MPI

15 并行计算与MPI

16 并行计算与MPI 头文件: MPI函数调用: C include file Fortran include file
#include "mpi.h" include 'mpif.h' C Binding Format: rc = MPI_Xxxxx(parameter, ... ) Example: rc = MPI_Bsend(&buf,count,type,dest,tag,comm) Error code: Returned as "rc". MPI_SUCCESS if successful Fortran Binding Format: CALL MPI_XXXXX(parameter,..., ierr) call mpi_xxxxx(parameter,..., ierr) Example: CALL MPI_BSEND(buf,count,type,dest,tag,comm,ierr) Error code: Returned as "ierr" parameter. MPI_SUCCESS if successful

17 并行计算与MPI MPI进程组和通讯器: MPI利用进程组和通讯器来定义相互通讯的进程集合。 大多数MPI函数都需要指定一个通讯器作为参数。
MPI预定义的通讯器MPI_COMM_WORLD包含所有的MPI进程。

18 MPI环境管理函数 MPI_Init 初始化 MPI执行环境。该函数为每个MPI程序都需要调用的MPI函数,且为第一个调用的MPI函数(除 MPI_Initialized 外)。该函数只能调用一次。

19 MPI环境管理函数 MPI_Comm_size
获取指定通信器中MPI进程总数,例如MPI_COMM_WORLD 。如果通讯器为MPI_COMM_WORLD,该函数获取程序可用的MPI进程总数。

20 MPI环境管理函数 MPI_Comm_rank
获取指定通信器中调用该函数的MPI进程对应的标号。最初通讯器MPI_COMM_WORLD中的每个进程都被指定了一个唯一的整数标号,范围为0到进程总数减一。这个标号通常作为进程号。如果一个进程关联了其他通讯器,每个通讯器中都有该进程对应的唯一标号。

21 MPI环境管理函数 MPI_Abort 终止通讯器中所有MPI进程。在出现了致命错误而希望异常终止MPI程序时执行。MPI系统会设法终止指定通信器中所有进程,进程错误码返回给系统。 comm=MPI_COMM_WORLD,全部进程退出。 comm≠MPI_COMM_WORLD,comm包含的进程退出,其他进程是否退出取决于具体MPI实现。

22 MPI环境管理函数 MPI_Get_processor_name
获取处理器名称和名称长度。Name长度一般可以设置为MPI_MAX_PROCESSOR_NAME。

23 MPI环境管理函数 MPI_Get_version 获取MPI版本信息。

24 MPI环境管理函数 MPI_Initialized
查询MPI是否已经初始化。唯一可在 MPI_Init 之前调用的MPI函数,如果已经调用了MPI_Init函数,返回flag=true,否则flag=false。

25 MPI环境管理函数 MPI_Wtime 获取调用该函数进程所经历的墙上时钟时间(秒,双精度)。

26 MPI环境管理函数 MPI_Wtick 获取MPI_Wtime的最小时间刻度(秒,双精度)。

27 MPI环境管理函数 MPI_Finalize 终止MPI执行环境。该函数是MPI程序中最后调用的MPI函数。

28 MPI环境管理函数 C:

29 MPI环境管理函数 Fortran:

30 MPI环境管理函数 MPI程序编译与运行 程序编译 C: mpicc -o mpiprog mpisrc.c
Fortran 77: mpif77 -o mpiprog mpisrc.f 程序运行 mpirun -np 4 mpiprog

31 MPI环境管理函数 单处理器 (tp5) 运行4个进程 4个处理器 (tp1, tp2, tp3, tp4) 分别运行4个进程

32 MPI环境管理函数

33 MPI点对点通讯函数 两个进程之间的通信 源进程发送消息到目标进程 目标进程接收消息 通信发生在同一个通信器内
进程通过其在通信器内的标号表示 1 2 3 4 5 destination source communicator

34 MPI点对点通讯函数 MPI点对点通讯函数的类型:
消息发送和接收函数包含很多不同的类型: Synchronous send Blocking send / blocking receive Non-blocking send / non-blocking receive Buffered send Combined send/receive "Ready" send 任何类型消息发送函数都能与任何类型的消息接收函数进行配对使用。 MPI同时提供了几个与发送和接收操作相关的函数,包括用于等待消息到达的函数,检测消息是否到达的函数。

35 MPI点对点通讯函数 消息(message) 数据:<起始地址,数据个数,数据类型> 信封:<源/目,标识,通讯域>
MPI_Send (buffer, count, type, dest, tag, comm) 数据 信封 MPI_Recv (buffer, count, type, source, tag, comm, status) 数据 信封

36 MPI点对点通讯函数 MPI消息传递函数的参数: 1. Buffer
程序中指向待发送或接收数据的地址空间。大多数情况下就是待发送或接收的变量名字。对于C语言程序,这个参数是变量的引用,并且一定要在变量名字前面要有&号。 2. Data Count 指示待传递的特定数据类型数据的个数。

37 MPI点对点通讯函数 3. Data Type MPI预定义的基本数据类型。 C Data Types Fortran Data Types
MPI_CHAR signed char MPI_CHARACTER character MPI_SHORT signed short int MPI_INT signed int MPI_INTEGER integer MPI_LONG signed long int MPI_UNSIGNED_CHAR unsigned char MPI_UNSIGNED_SHORT unsigned short int MPI_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long int MPI_FLOAT float MPI_REAL real MPI_DOUBLE double MPI_DOUBLE_PRECISION double precision MPI_LONG_DOUBLE long double MPI_BYTE 8 binary digits MPI_PACKED MPI_Pack()

38 MPI点对点通讯函数 4. Destination MPI中消息发送函数中用于指示消息传递目的地的参数。实质是消息接收进程的进程号。
5. Source MPI中消息接收函数中用于指示消息传递来源的参数。实质是消息发送进程的进程号。可以是MPI_ANY_SOURCE,表示接收任意来源的消息。 6. Tag 人为指定的任意非负整数,用于区分不同的消息。消息发送和接收函数要对匹配的消息进行操作。对于消息接收函数,可以是MPI_ANY_TAG,表示接收任意的消息。MPI标准中 可以被用作标记,具体的实现可以超过这个范围。

39 MPI点对点通讯函数 7. Communicator
用于指示通讯上下文或消息来源和目的所在进程的集合。除非人为建立新的通讯器,否则预定义的通讯上下文是MPI_COMM_WORLD 。 8. Status 对于消息接收函数,用于指示消息来源和消息标记的参数。 9. Request 用于非阻塞消息发送和接收函数。由于非阻塞MPI函数可能在获得系统缓存之前返回,所以系统给每一个非阻塞MPI函数一个唯一的标记。这个标记用于后面对于非阻塞消息传递的完成状态 。C语言中,这个参数是指向预定义结构体MPI_Request的指针。Fortran语言中,这个参数是一个整数。

40 MPI点对点通讯函数 在C 语言中, 状态是MPI_Status 类型的一种结构, 它包含MPI_SOURCE、MPI_TAG和MPI_ERROR 3个字段;这种结构还可以包含不同的字段。 status.MPI_SOURCE 发送数据的进程标识 status.MPI_TAG 发送数据的消息标识 status.MPI_ERROR 接收操作返回的错误代码 在Fortran语言中,状态是长度为MPI_STATUS_SIZE的一个整型数组。MPI_SOURCE、MPI_TAG和MPI_ERROR 3个常数是存储源、标志和错误字段项的系数。 status(MPI_SOURCE) 发送数据的进程标识 status(MPI_TAG ) 发送数据的消息标识 status(MPI_ERROR) 接收操作返回的错误代码

41 MPI点对点通讯函数 阻塞式与非阻塞通讯 通信类型 函数返回 对数据区操作 特性 阻塞式通信 1.阻塞型函数需要等待指定操作完成返回
函数返回后,对数据区操作是安全的 1.程序设计相对简单 2.使用不当容易造成死锁 非阻塞式通信 1.调用后立刻返回,实际操作在MPI后台执行 2.需调用函数等待或查询操作的完成情况 函数返回后,即操作数据区不安全。可能与后台正进行的操作冲突 1.可以实现计算与通信的重叠 2.程序设计相对复杂

42 MPI点对点通讯函数 系统缓存:

43 MPI点对点通讯函数 标准阻塞式通讯 是否对发送数据进行缓存,由MPI系统决定,而非程序员
阻塞:发送成功,意味(1)消息成功发送;(2)或者消息被缓存 接收成功,意味消息已被成功接收

44 MPI点对点通讯函数 R S 阻塞(标准)发送函数,MPI_Send。 阻塞(标准)接收函数,MPI_Recv。
非阻塞(标准)发送函数,MPI_Isend。 非阻塞(标准)接收函数,MPI_Irecv。 R S 1

45 MPI点对点通讯函数 R S 阻塞缓存发送函数,MPI_Bsend。 非阻塞缓存发送函数,MPI_Ibsend。 1 2 缓存
消息发送函数可以被局部地提交和完成,与相匹配的消息接收函数是否存在没有任何关系。 2 缓存

46 MPI点对点通讯函数 R S 阻塞同步发送函数,MPI_Ssend。 非阻塞同步发送函数,MPI_Issend 。 1 2 3
类似于电话协议,直到消息接收函数被提交,两个通讯进程取得联系之后,消息才开始发送,且直到消息开始接收消息发送函数才能返回。

47 MPI点对点通讯函数 R S 阻塞就绪发送函数,MPI_Rsend。 非阻塞就绪发送函数,MPI_Irsend。 1 2
提交消息发送函数之前,先提交与之匹配的消息接收函数,且直到消息被写入消息接收缓存后,消息发送函数才返回。 如果消息发送函数提交后,与之匹配的消息接收函数没有提交,则消息发送可能不正确,因此必须由用户来组织并行程序保证,MPI不提供任何帮助。

48 MPI点对点通讯函数 标准模式: MPI_Send 消息发送函数,执行一个标准模式的阻塞式消息发送通讯操作。
MPI_Send (buf, count, datatype, dest, tag, comm) IN buf 发送缓存的起始地址 IN count 发送缓存中数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标志 IN comm 通讯器

49 MPI点对点通讯函数

50 MPI点对点通讯函数 标准模式: MPI_Recv 消息接收函数,执行一个标准模式的阻塞式消息接收通讯操作。
MPI_Recv (buf, count, datatype, dest, tag, comm, status) OUT buf 接收缓存的起始地址 IN count 接收缓存允许最大数据单元个数 IN datatype 数据单元类型 IN source 发送进程号 IN tag 消息标志 IN comm 通讯器 OUT status 接收返回状态信息

51 MPI点对点通讯函数

52 MPI点对点通讯函数 Send返还时,第一,发送的消息被拷贝给MPI缓存,一旦MPI成功缓存了该消息,函数返回,消息传递由MPI来完成。第二,MPI不提供对消息的缓存,只有当接收该消息的基恩成执行相匹配的的消息接收操作,该消息由MPI吸入消息接收缓存中,直到消息全部写入,函数返回。 Recv返回时,如果接收的消息在MPI缓存中,则立即接收该消息,并将其写入消息接收缓存后,函数返回。如果接收的消息寒没有提交给MPI,则必须阻塞等待消息发送,知道接收到该消息后,函数返回。 接收缓存可大。

53 MPI点对点通讯函数 MPI_Sendrecv 消息发收函数,同时执行一个阻塞式消息发送和接收通讯操作。
MPI_Sendrecv (sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, recvcount, recvtype, source, recvtag, comm, status) IN sendbuf 发送缓存的起始地址 IN sendcount 发送的数据单元个数 IN sendtype 发送的数据单元类型 IN dest 接收进程号 IN sendtag 发送消息标志 OUT recvbuf 接收缓存的起始地址 IN recvcount 接收的数据单元个数 IN recvtype 接收的数据单元类型 IN source 发送进程号 IN recvtag 接收消息标志 IN comm 通讯器 OUT status 接收返回状态信息 同时执行两个MPI函数,阻塞消息发送和阻塞消息接收,两个函数执行完毕,函数返回。 消息发送和消息接收缓存必须互不相交。

54 MPI点对点通讯函数

55 MPI点对点通讯函数 MPI_Sendrecv_replace
消息发收替换函数,同时执行一个阻塞式消息发送和接收通讯操作,并用接收的消息覆盖缓存中的内容。 MPI_Sendrecv_replace (buf, count, datatype, dest, sendtag, source, recvtag, comm, status) IN buf 消息(发送/接收)缓存的起始地址 IN count 消息(发送/接收)缓存数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN sendtag 发送消息标志 IN source 发送进程号 IN recvtag 接收消息标志 IN comm 通讯器 OUT status 接收返回状态信息

56 MPI点对点通讯函数

57 MPI点对点通讯函数 MPI_Get_count 消息长度查询函数,返回消息包含的数据单元个数。
MPI_Get_count (status, datatype, count) IN status 消息接收函数返回的状态信息 IN datatype 消息中数据单元类型 OUT count 消息包含的数据单元个数

58 MPI点对点通讯函数 标准模式: MPI_Isend 标准模式非阻塞消息发送函数,提交一个非阻塞消息发送操作。
MPI_Isend (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的起始地址 IN count 发送缓存中数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标志 IN comm 通讯器 OUT request 通讯请求

59 MPI点对点通讯函数

60 MPI点对点通讯函数 标准模式: MPI_Irecv 标准模式非阻塞消息接收函数,提交一个非阻塞消息接收操作。
MPI_Irecv (buf, count, datatype, source, tag, comm, request) OUT buf 接收缓存的起始地址 IN count 接收缓存的数据单元个数 IN datatype 数据单元类型 IN source 发送进程号 IN tag 消息标志 IN comm 通讯器 OUT request 通讯请求

61 MPI点对点通讯函数

62 MPI点对点通讯函数 Isend返回时,表明MPI已经开始从消息发送缓存中拷贝数据,但是并不隐含消息拷贝已完成。修改消息发送缓存,不安全。
Irecv返回时,第一,如果接收的消息不在MPI中,则函数立即返回。第二,如果接收的消息已经存在于MPI中,则函数接收该消息,并将消息写入消息接收缓存后返回。修改消息接收缓存,不安全。

63 MPI点对点通讯函数 MPI_Wait 非阻塞通讯完成函数,确保与某个通讯请求相关联的非阻塞通讯操作安全完成。
MPI_Wait (request, status) INOUT request 通讯请求 OUT status 接收返回状态信息

64 MPI点对点通讯函数 MPI_Waitany 非阻塞通讯完成函数,确保至少存在一个与给定序列中某个通讯请求相关联的非阻塞通讯操作安全完成。
MPI_Waitany (count, array_of_requests, index, status) IN count 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT index 完成的通讯请求在序列中位置 OUT status 接收返回状态信息

65 MPI点对点通讯函数

66 MPI点对点通讯函数 MPI_Waitall 非阻塞通讯完成函数,确保与给定序列中所有通讯请求各自相关联的非阻塞通讯操作全部安全完成。
MPI_Waitall (count, array_of_requests, array_of_statuses) IN count 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT array_of_statuses 接收返回状态信息序列

67 MPI点对点通讯函数

68 MPI点对点通讯函数 MPI_Waitsome 非阻塞通讯完成函数,确保与给定序列中某些通讯请求各自相关联的非阻塞通讯操作安全完成。
MPI_Waitsome (incount, array_of_requests, outcount, array_of_indices, array_of_statuses) IN incount 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT outcount 序列中已完成的通讯请求个数 OUT araay_of_indices 完成的通讯请求在序列中位置 OUT array_of_statuses 接收返回状态信息序列

69 MPI点对点通讯函数

70 MPI点对点通讯函数 MPI_Test 非阻塞通讯完成查询函数,查询某个通讯请求相关联的非阻塞通讯操作是否安全完成。
MPI_Test (request, flag, status) INOUT request 通讯请求 OUT flag ture表示该通讯请求已完成 OUT status 接收返回状态信息

71 MPI点对点通讯函数 MPI_Testany
非阻塞通讯完成查询函数,查询是否至少存在一个与给定序列中某个通讯请求相关联的非阻塞通讯操作已经安全完成。 MPI_Testany (count, array_of_requests, index, flag, status) IN count 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT index 已完成的通信请求在序列中的 位置 OUT flag ture表示该通讯请求已完成 OUT status 接收返回状态信息

72 MPI点对点通讯函数

73 MPI点对点通讯函数 MPI_Testall
非阻塞通讯完成查询函数,查询给定序列中所有通讯请求各自相关联的非阻塞通讯操作是否已经全部安全完成。 MPI_Testall (count, array_of_requests, flag, array_of_statuses) IN count 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT flag ture表示该通讯请求已完成 OUT array_of_statuses 接收返回状态信息序列

74 MPI点对点通讯函数

75 MPI点对点通讯函数 MPI_Testsome
非阻塞通讯完成查询函数,查询与给定序列中某些通讯请求各自相关联的非阻塞通讯操作是否已经安全完成。 MPI_Testsome (incount, array_of_requests, outcount, array_of_indices, array_of_statuses) IN incount 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT outcount 序列中已完成的请求个数 OUT araay_of_indices 已完成的通讯请求在序列中的 位置 OUT array_of_statuses 接收返回状态信息序列

76 MPI点对点通讯函数

77 MPI点对点通讯函数 MPI_Probe 阻塞式消息查询函数,阻塞地查询某个特定消息是否已在MPI环境中
MPI_Probe (source, tag, comm, status) IN source 发送消息进程号 IN tag 消息标记 IN comm 通讯器 OUT status 接收返回状态信息

78 MPI点对点通讯函数

79 MPI点对点通讯函数 MPI_Iprobe 非阻塞式消息查询函数,非阻塞地查询某个特定消息是否已在MPI环境中。
MPI_Iprobe (source, tag, comm, flag, status) IN source 发送消息进程号 IN tag 消息标记 IN comm 通讯器 OUT flag ture表示消息已在MPI环境中 OUT status 接收返回状态

80 MPI点对点通讯函数

81 MPI点对点通讯函数 缓存模式: MPI_Bsend 缓存模式消息发送函数,执行一个缓存模式的阻塞式消息发送操作。
MPI_Bsend (buf, count, datatype, dest, tag, comm) IN buf 发送缓存的起始地址 IN count 发送缓存中的数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器

82 MPI点对点通讯函数

83 MPI点对点通讯函数

84 MPI点对点通讯函数 MPI_Buffer_attach 缓存提交函数。提交应用程序的内存空间给MPI系统用于缓存消息。
MPI_Buffer_attach (buffer, size) IN buffer 缓存起始地址 IN size 缓存大小(单位:字节) 提交的消息缓存要比实际将要发送的消息对,这些多余的空间被用于管理缓存。 一个进程只能定义一个缓存,也就是定义另一个缓存时必须释放前一个已经定义的缓存。

85 MPI点对点通讯函数 MPI_Buffer_detach 缓存释放函数。释放应用程序提交给MPI环境用于缓存消息的内存空间。
MPI_Buffer_detach (buffer, size) IN buffer 缓存起始地址 IN size 缓存大小(单位:字节)

86 MPI点对点通讯函数 缓存模式: MPI_Ibsend 缓存模式非阻塞消息发送函数,提交一个缓存模式非阻塞消息发送操作。
MPI_Ibsend (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 发送缓存中的数据单元个数 IN datatype 数据类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 通讯请求

87 MPI点对点通讯函数

88 MPI点对点通讯函数 同步模式: MPI_Ssend 同步模式消息发送函数,执行一个同步模式的阻塞式消息发送操作。
MPI_Ssend (buf, count, datatype, dest, tag, comm) IN buf 发送缓存的初始地址 IN count 发送缓存中的数据单元个数 IN datatype 数据类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器

89 MPI点对点通讯函数

90 MPI点对点通讯函数

91 MPI点对点通讯函数 同步模式: MPI_Issend 同步模式非阻塞消息发送函数,提交一个同步模式的非阻塞式消息发送操作。
MPI_Issend (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 发送缓存中的数据单元个数 IN datatype 数据类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 通讯请求

92 MPI点对点通讯函数

93 MPI点对点通讯函数 就绪模式: MPI_Rsend 就绪模式消息发送函数,执行一个就绪模式的阻塞式消息发送操作。
MPI_Rsend (buf, count, datatype, dest, tag, comm) IN buf 发送缓存的初始地址 IN count 发送缓存中数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器

94 MPI点对点通讯函数

95 MPI点对点通讯函数

96 MPI点对点通讯函数 就绪模式: MPI_Irsend 就绪模式非阻塞消息发送函数,提交一个就绪模式的非阻塞式消息发送操作。
MPI_Irsend (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 发送缓存中数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 通讯请求

97 MPI点对点通讯函数

98 MPI点对点通讯函数 持久通讯模式: MPI_Send_init 消息发送持久通讯请求创建函数,创建一个消息发送持久通讯请求。
MPI_Send_init (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 持久通讯请求 重复执行具有相同参数的消息发送和消息接收通讯操作。 创建非阻塞消息发送和消息接收持久通讯请求,并将消息捆绑到该请求中。 只是空间绑定,里面内容任意修改。

99 MPI点对点通讯函数

100 MPI点对点通讯函数 持久通讯模式: MPI_Recv_init 消息接收持久通讯请求创建函数,创建一个消息接收持久通讯请求。
MPI_Recv_init (buf, count, datatype, source, tag, comm, request) IN buf 消息接收缓存的初始地址 IN count 数据单元个数 IN datatype 数据单元类型 IN source 发送进程号 IN tag 消息标记 IN comm 通讯器 OUT request 持久通讯请求

101 MPI点对点通讯函数

102 MPI点对点通讯函数 持久通讯模式: MPI_Start 持久通讯请求提交函数,创建一个持久通讯请求。
MPI_Start (request) INOUT request 持久通讯请求

103 MPI点对点通讯函数 持久通讯模式: MPI_Startall 持久通讯请求提交函数,创建一个给定序列包含的所有持久通讯请求
MPI_Startall (count, array_of_requests) IN count 持久通讯序列包含的通讯请求个数。 INOUT array_of_requests 持久通讯请求序列

104 MPI点对点通讯函数 持久通讯模式: MPI_Bsend_init 缓存模式持久通讯函数,创建一个缓存模式消息发送持久通讯请求。
MPI_Bsend_init (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 持久通讯请求

105 MPI点对点通讯函数

106 MPI点对点通讯函数 持久通讯模式: MPI_Ssend_init 同步模式持久通讯函数,创建一个同步模式消息发送持久通讯请求。
MPI_Ssend_init (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 持久通讯请求

107 MPI点对点通讯函数

108 MPI点对点通讯函数 持久通讯模式: MPI_Rsend_init 就绪模式持久通讯函数,创建一个就绪模式消息发送持久通讯请求。
MPI_Rsend_init (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 持久通讯请求

109 MPI点对点通讯函数

110 MPI点对点通讯函数 MPI_Request_free 通讯请求取消函数,在通讯请求相关联的非阻塞通讯操作完成后,释放该请求。
MPI_Request_free (request) INOUT request 通讯请求 非阻塞通讯请求和持久通讯请求。

111 MPI点对点通讯函数 MPI_Cancel
MPI_Cancel (request) IN request 通讯请求 与MPI_Request_free不同,强行取消通讯请求。

112 MPI点对点通讯函数 MPI_Test_cancelled 通讯请求查询函数,查询一个通讯请求是否已被取消。
MPI_Test_cancelled (status, flag) IN status 接收返回状态信息 OUT flag true表示该请求已被取消

113 MPI集合通讯函数 通信器的所有进程参与,所有进程都调用聚合通信函数 聚合通信不需要消息标号 聚合通信函数都为阻塞式函数
聚合通信的功能:通信、同步、计算等 1 2 3 4 5 communicator

114 MPI集合通讯函数 集合通讯函数必须包含通讯器对应的组中所有进程。 默认情况下,所有进程都是通讯器MPI_COMM_WORLD中成员。
用户可以自定义通讯器。 如果组内进程并未全部参与到集合通讯函数中,会导致程序出现不和预知的行为。 用户负责保证组内所有进程参与到集合通讯函数中,MPI并不进行相关检查。

115 MPI集合通讯函数 集合通讯的类型: 进程同步。进程到达同步点后进行等待,直到所有进程都到达同步点。 数据移动。
集合计算。一个进程收集来自组内其他进程的数据,并对这些数据进行计算操作。

116 MPI集合通讯函数 MPI_Barrier
同步操作。在组中设置一个障碍同步。当到达MPI_Barrier语句时,每个进程都要等到组中所有进程都到达MPI_Barrier语句时才能进入到下一条语句。 MPI_Barrier (comm) IN comm 通讯器

117 MPI集合通讯函数 MPI_Bcast 消息广播函数,在进程组各成员中执行一个消息广播操作。
MPI_Bcast (buffer, count, datatype, root, comm) INOUT buffer 待广播的消息缓存起始地址 IN count 待广播的消息缓存内数据单元个数 IN datatype 待广播的消息缓存内数据单元类型 IN root 根进程的进程号 IN comm 通讯器

118 MPI集合通讯函数

119 MPI集合通讯函数 根进程中该消息缓存为消息发送缓存 其他进程该消息缓存为消息接收缓存
每个进程提供的root和comm必须完全一致,否则程序死锁。

120 MPI集合通讯函数 MPI_Scatter 分发聚合通讯函数,在进程组各成员中执行一个消息分发操作。

121 MPI集合通讯函数 MPI_Scatter (sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) IN sendbuf 根进程消息发送缓存起始地址 IN sendcount 根进程向各进程发送的数据单元个数 IN sendtype 根进程消息发送缓存内数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcount 各进程从根进程接收的数据单元个数 IN recvtype 各进程从根进程接收的数据单元类型 IN root 根进程的进程号 IN comm 通讯器

122 MPI集合通讯函数

123 MPI集合通讯函数

124 MPI集合通讯函数 MPI_Scatterv 向量分发聚合通讯函数,在进程组各成员中执行一个基于向量的消息分发操作。

125 MPI集合通讯函数 MPI_Scatterv (sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) IN sendbuf 根进程消息发送缓存起始地址 IN sendcounts 数组,包含发送给各个进程的消息包含 的数据单元个数 IN displs 数组,包含发送给各个进程的消息起始 地址(数据单元为单位) IN sendtype 发送给各进程的消息包含数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcount 各进程从根进程接收的数据单元个数 IN recvtype 各进程从根进程接收的数据单元类型 IN root 根进程的进程号 IN comm 通讯器

126 MPI集合通讯函数

127 MPI集合通讯函数 MPI_Gather 收集聚合通讯函数,在进程组各成员中执行一个消息收集操作。

128 MPI集合通讯函数 MPI_Gather (sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) IN sendbuf 各进程消息发送缓存起始地址 IN sendcount 各进程消息发送缓存中数据单元个数 IN sendtype 各进程消息发送缓存中数据单元类型 OUT recvbuf 根进程提供的消息接收缓存起始地址 IN recvcount 根进程从各进程接收的数据单元个数 IN recvtype 根进程从各进程接收的数据单元类型 IN root 根进程的进程号 IN comm 通讯器

129 MPI集合通讯函数

130 MPI集合通讯函数

131 MPI集合通讯函数 MPI_Gatherv 向量收集聚合通讯函数,在进程组各成员中执行一个基于向量的消息收集操作。

132 MPI集合通讯函数 MPI_Gatherv (sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, root, comm) IN sendbuf 各进程消息发送缓存起始地址 IN sendcount 各进程消息发送缓存中数据单元个数 IN sendtype 各进程消息发送缓存中数据单元类型 OUT recvbuf 根进程提供的消息接收缓存起始地址 IN recvcounts 数组,含从各进程接收的数据单元个数 IN displs 数组,含存储各进程数据单元起始地址 (以数据单元为单位) IN recvtype 消息接收缓存中数据单元类型 IN root 根进程的进程号 IN comm 通讯器

133 MPI集合通讯函数

134 MPI集合通讯函数 MPI_Allgather 全收集聚合通讯函数,进程组各成员执行一个全收集聚合通讯操作。
MPI_Allgather (sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) IN sendbuf 各进进程消息发送缓存起始地址 IN sendcount 各进程消息发送缓存中数据单元个数 IN sendtype 各进程消息发送缓存中数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcount 各进程从其他进程接收的数据单元个数 IN recvtype 各进程从其他进程接收的数据单元类型 IN comm 通讯器

135 MPI集合通讯函数

136 MPI集合通讯函数

137 MPI集合通讯函数 MPI_Allgatherv 向量全收集聚合通讯函数,进程组各成员中执行一个基于向量的全收集聚合通讯操作。
MPI_Allgatherv (sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm) IN sendbuf 各进程消息发送缓存起始地址 IN sendcount 各进程消息发送缓存中数据单元个数 IN sendtype 各进程消息发送缓存中数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcounts 数组,包含从各进程接收数据单元个数 IN displs 数组,包含接收数据单元的起始地址( 数据单元为单位) IN recvtype 各进程从其他进程接收的数据单元类型 IN comm 通讯器

138 MPI集合通讯函数

139 MPI集合通讯函数 MPI_Alltoall 全交换聚合通讯函数,在进程组各成员中执行一个全交换聚合通讯操作。
MPI_Alltoall (sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 IN sendcount 各进程向其他进程发送的数据单元个数 IN sendtype 各进程向其他进程发送的数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcount 各进程从其他进程接收的数据单元个数 IN recvtype 各进程从其他进程接收的数据单元类型 IN comm 通讯器

140 MPI集合通讯函数

141 MPI集合通讯函数 首先,每个进程均执行一个分发聚合通讯操作MPI_Scatther(sendbuf, sendcount, sendtype,…),即将消息发送缓存内所有数据按进程个数等分,按由小到大的进程序号,依次分发给各个进程。 然后,每个进程均执行一个收集聚合通讯操作MPI_Gather(…, recvbuf, recvcount, recvtype,…),即从各个进程收集被分发给自身的数据,也同样按按由小到大的进程序号,依次存储在消息接收缓存中。

142 MPI集合通讯函数 MPI_Alltoallv 向量全交换聚合通讯函数,在进程组各成员中执行一个基于向量的全交换聚合通讯操作。
MPI_Alltoallv (sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, rdispls, recvtype, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 IN sendcounts 数组,包含个进程发送的数据单元个数 IN sdispls 数组,包含各进程发送的数据起始存储 地址(单元为单位) IN sendtype 各进程向其他进程发送的数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcounts 数组,含从各进程接收的数据单元个数 IN rdispls 数组,包含从各进程接收的数据起始存 储地址(单元为单位) IN recvtype 各进程从其他进程接收的数据单元类型 IN comm 通讯器 每个进程首先执行一个基于变量的分发聚合通讯操作MPI_SCATTERV,然后执行一个基于向量的收集聚合通讯操作MPI_GATHERV。 元素sendcounts(i)表示分发给第i个进程的消息包含的数据单元个数,sdispls(i)表示这些数据在消息发送缓存的首地址,元素recvcounts(i)表示从第j个进程接收的消息包含的数据单元个数,rdispls(j)表示这些数据在消息接收缓存中的首地址。

143 MPI集合通讯函数

144 MPI集合通讯函数 MPI_Reduce 归约聚合通讯函数,对各进程提供的局部变量执行一个全局归约操作,并将结果存储在根进程的消息接收缓存中。 MPI_Reduce (sendbuf, recvbuf, count, datatype, op, root, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 OUT recvbuf 根进程提供的消息接收缓存起始地址 IN count 各进程提供的待归约的数据单元个数 IN datatype 各进程提供的待归约的数据单元类型 IN op 归约操作 IN root 根进程的进程号 IN comm 通讯器

145 MPI集合通讯函数

146 MPI集合通讯函数 消息发送缓存和消息接收缓存必须互不重叠,并且提供的数据类型与提供的规约操作相匹配。

147 MPI Reduction Operation
C Data Types Fortran Data Type MPI_MAX maximum integer, float integer, real, complex MPI_MIN minimum MPI_SUM sum MPI_PROD product MPI_LAND logical AND integer logical MPI_BAND bit-wise AND integer, MPI_BYTE MPI_LOR logical OR MPI_BOR bit-wise OR MPI_LXOR logical XOR MPI_BXOR bit-wise XOR MPI_MAXLOC max value and location float, double and long double real, complex,double precision MPI_MINLOC min value and location real, complex, double precision

148 MPI集合通讯函数 MPI_MAXLOC, MPI_MINLOC
对各进程提供的局部变量求全局最大值(最小值),并返回属于该值的某个信息,例如拥有该值的进程号。

149 MPI集合通讯函数 C Fortran 数据类型 描述 MPI_FLOAT_INT float与int MPI_2REAL
REAL与REAL MPI_LONG_DOUBLE_INT long double与int MPI_2DOUBLE_PRECISION DOUBLE PRECISION与 DOUBLE PRECISION MPI_LONG_INT long与int MPI_2INTEGER INTEGER与INTEGER MPI_2INT int与int MPI_SHORT_INT short与int MPI_DOUBLE_INT double与int

150 MPI集合通讯函数 MPI_Allreduce
全归约聚合通讯函数,对各进程提供的局部变量执行一个全局归约操作,并将结果存储在各进程的消息接收缓存中。 MPI_Allreduce (sendbuf, recvbuf, count, datatype, op, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN count 各进程提供的待归约的数据单元个数 IN datatype 各进程提供的待归约的数据单元类型 IN op 归约操作 IN comm 通讯器

151 MPI集合通讯函数

152 MPI集合通讯函数

153 MPI集合通讯函数 MPI_Reduce_scatter
归约分发聚合通讯函数,对各进程提供的局部变量执行一个全局归约操作,并将结果分发到各进程提供的消息接收缓存中。 MPI_Reduce_scatter (sendbuf, recvbuf, recvcounts, datatype, op, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcounts 数组,各进程待接收的数据单元个数 IN datatype 各进程提供的待归约的数据单元类型 IN op 归约操作 IN comm 通讯器

154 MPI集合通讯函数

155 MPI集合通讯函数 首先,在个进程提供的消息发送缓存 (sendbuf, count, datatype) 包含的数据单元中执行规约操作,其中count为recvcounts数组中元素之和。 然后,将规约结果分成n个连续的端,其中第i段包含recvcounts(i)个数据单元,并存储在第i个进程的接收缓存中。

156 MPI集合通讯函数 MPI_Scan 并行前缀归约聚合通讯函数,对各个进程提供的局部变量执行一个并行前缀归约,并将结果分别存储在各进程提供的消息接收缓存中。 MPI_Scan (sendbuf, recvbuf, count, datatype, op, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN count 各进程提供的数据单元个数 IN datatype 各进程提供的数据单元类型 IN op 归约操作 IN comm 通讯器

157 MPI集合通讯函数

158 MPI集合通讯函数 按由小到大的进程序号与操作op,执行并行前缀计算,其中第i个进程获得进程0到进程i的规约结果。

159 MPI集合通讯函数 MPI_Op_create 归约操作创建函数,创建一个归约操作。
MPI_Op_create (function, commute, op) IN function 外部函数,用于定义特殊的归约操作 IN commute 若true,则归约操作可交换 OUT op 归约操作

160 MPI集合通讯函数

161 MPI集合通讯函数 外部函数:

162 MPI集合通讯函数 MPI_Op_free 归约操作释放函数,释放一个归约操作。 MPI_Op_free (op) IN op 归约操作

163 MPI自定义数据类型与数据封装 MPI_Type_contiguous 自定义数据类型创建函数,在连续的内存空间上创建一个新的数据类型。
MPI_Type_contiguous (count, oldtype, newtype) IN count oldtrype数据单元个数 IN oldtype 旧的数据类型 OUT newtype 新的数据类型

164 MPI自定义数据类型与数据封装

165 MPI自定义数据类型与数据封装

166 MPI自定义数据类型与数据封装 MPI_Type_vector 自定义数据类型创建函数,创建一个新的数据类型,由间隔的多个数据块组成。
MPI_Type_vector (count, blocklength, stride, oldtype, newtype) IN count 数据块个数 IN blocklength 每个数据块包含的oldtype数据单元个数 IN stride 以数据单元为单位,连续两个数据块起 始地址之间的间距 IN oldtype 旧的数据类型 OUT newtype 新的数据类型

167 MPI自定义数据类型与数据封装

168 MPI自定义数据类型与数据封装

169 MPI自定义数据类型与数据封装 MPI_Type_hvector 自定义数据类型创建函数,创建一个新的数据类型,由间隔的多个数据块组成。
MPI_Type_hvector (count, blocklength, stride, oldtype, newtype) IN count 数据块个数 IN blocklength 每个数据块包含的oldtype数据单元个数 IN stride 以字节为单位,连续两个数据块起 始地址之间的间距 IN oldtype 旧的数据类型 OUT newtype 新的数据类型

170 MPI自定义数据类型与数据封装

171 MPI自定义数据类型与数据封装 MPI_Type_indexed
自定义数据类型创建函数,创建一个新的数据类型,由任意间隔(以原始数据类型为单位)的多个数据块组成。 MPI_Type_indexed (count, array_of_blocklengths, array_of_displacements, oldtype, newtype) IN count 数据块个数 IN array_of_blocklengths 数组,包含每个数据块拥有的 数据单元个数 IN array_of_displacements 数组,包含每个数据块的初始 位置(oldtype为单位) IN oldtype 旧的数据类型 OUT newtype 新的数据类型

172 MPI自定义数据类型与数据封装

173 MPI自定义数据类型

174 MPI自定义数据类型与数据封装 MPI_Type_hindexed
自定义数据类型创建函数,创建一个新的数据类型,由任意间隔(以字节为单位)的多个数据块组成。 MPI_Type_hindexed (count, array_of_blocklengths, array_of_displacements, oldtype, newtype) IN count 数据块个数 IN array_of_blocklengths 数组,包含每个数据块拥有的 数据单元个数 IN array_of_displacements 数组,包含每个数据块的初始 位置(字节为单位) IN oldtype 旧的数据类型 OUT newtype 新的数据类型

175 MPI自定义数据类型与数据封装

176 MPI自定义数据类型与数据封装 MPI_Type_struct 自定义数据类型创建函数,创建一个新的数据类型,由多种不同数据类型组成。
MPI_Type_struct (count, array_of_blocklengths, array_of_displacements, array_of_types, newtype) IN count 数据块个数 IN array_of_blocklengths 数组,包含每个数据块拥有的 数据单元个数 IN array_of_displacements 数组,包含每个数据块的初始 位置(字节为单位) IN array_of_types 数组,包含每个数据块拥有的数据 单元类型 OUT newtype 新的数据类型

177 MPI自定义数据类型与数据封装

178 MPI自定义数据类型与数据封装

179 MPI自定义数据类型与数据封装 MPI_Address 内存地址查询函数,获取给定变量在内存空间的绝对地址。
MPI_Address (location, address) IN location 变量 OUT address 内存地址

180 MPI自定义数据类型与数据封装 MPI_Type_commit 自定义数据类型提交函数,提交一个已定义的自定义数据类型给MPI环境。
MPI_Type_commit (datatype) INOUT datatype 被提交的自定义数据类型

181 MPI自定义数据类型与数据封装 MPI_Type_free 自定义数据类型释放函数,MPI环境释放一个已定义的自定义数据类型。
MPI_Type_free (datatype) INOUT datatype 被释放的自定义数据类型

182 MPI自定义数据类型与数据封装 MPI_Pack 数据封装函数,封装应用程序数据单元到应用程序提供的缓存中。
MPI_Pack (inbuf, incount, dataytpe, outbuf, outsize, position, comm) IN inbuf 包含数据单元的输入缓存起始地址 IN incount 输入数据单元个数 IN datatype 输入数据单元类型 OUT outbuf 输出缓存起始地址 IN outsize 输出缓存大小(字节为单位) INOUT position 输出缓存当前位置(字节为单位) IN comm 通讯器

183 MPI自定义数据类型与数据封装

184 MPI自定义数据类型与数据封装 MPI_Unpack 数据拆卸函数,从应用程序显示提供的输入缓存中拆卸数据单元到个输出缓存。
MPI_Unpack (inbuf, insize, position, outbuf, outcount, dataytpe, comm) IN inbuf 包含数据单元的输入缓存起始地址 IN insize 输入缓存大小(字节为单位) INOUT position 被拆卸的数据单元在输入缓存的起始 位置(字节为单位) OUT outbuf 输出缓存起始地址 IN outcount 被拆卸的数据单元个数 IN datatype 数据单元类型 IN comm 通讯器

185 MPI自定义数据类型与数据封装

186 MPI自定义数据类型与数据封装 MPI_Pack_size 消息大小查询函数,获取某个消息包含的所有数据单元的大小。
MPI_Pack_size (incount, datatype, comm, size) IN incount 消息包含的数据单元个数 IN datatype 消息包含的数据单元类型 IN comm 通讯器 OUT size 消息大小(字节为单位)

187 MPI自定义数据类型与数据封装

188 MPI进程组与通讯器 进程组(process group): MPI中一类有序进程的集合,并且每个进程都具有唯一的序号。 通讯器:
域内通讯器:如果某个通讯域只涉及同一个进程组内部成员之间的通讯,则称该通讯域内发生的通讯为域内通讯,且称相应通讯器为域内通讯器。 域间通讯器:如果某个通讯域涉及两个不同进程组成员之间的通讯,则称该类通讯为域间通讯,且称相应通讯器为域间通讯器。

189 MPI进程组与通讯器 域内通讯器属性: 1. 所包含的进程组 2. 描述该进程组内成员联接状态的拓扑结构 域间通讯器属性:
MPI_GROUP_EMPTY 空进程组 MPI_GROUP_NULL 无效进程组 MPI_COMM_WORLD 全局通讯器 MPI_COMM_SELF 局部通讯器

190 MPI进程组与通讯器

191 MPI进程组与通讯器 MPI_Comm_group 初始进程组获取函数,获取某个通讯器包含的进程组。
MPI_Comm_group (comm, group) IN comm 通讯器 OUT group 通讯器包含的进程组

192 MPI进程组与通讯器 MPI_Group_union 进程组并集创建函数,基于两个进程组成员的并集,创建一个新的进程组。
MPI_Group_union (group1, gourp2, newgroup) IN group1 进程组1 IN group2 进程组2 OUT newgroup 新进程组

193 MPI进程组与通讯器

194 MPI进程组与通讯器 MPI_Group_intersection 进程组交集创建函数,基于两个进程组成员的交集,创建一个新的进程组。
MPI_Group_intersection (group1, gourp2, newgroup) IN group1 进程组1 IN group2 进程组2 OUT newgroup 新进程组

195 MPI进程组与通讯器

196 MPI进程组与通讯器 MPI_Group_difference 进程组差集创建函数,基于两个进程组成员的差集,创建一个新的进程组。
MPI_Group_difference (group1, gourp2, newgroup) IN group1 进程组1 IN group2 进程组2 OUT newgroup 新进程组

197 MPI进程组与通讯器

198 MPI进程组与通讯器 MPI_Group_union
进程组group1的所有进程,加上进程组group2中不属于进程组group1的所有进程,组成新的进程组。新进程组中的进程重新排序,先把group1中进程由小到大,然后不属于group1中的group2中进程由小到大排序。 MPI_Group_intersection 进程组group1中属于进程组group2的所有进程,组成新的进程组。并以它们在进程组group1中的序号,由小到大重新排序。 MPI_Group_difference 进程组group1中不属于进程组group2的所有进程,组成新的进程组。并以它们在进程组group1中的序号,由小到大重新排序。

199 MPI进程组与通讯器 MPI_Group_incl 进程组子集创建函数,基于两个进程组成员的子集,创建一个新的进程组。
MPI_Group_incl (group, n, ranks, newgroup) IN group 进程组 IN n 新进程组包含的进程个数 IN ranks 新进程组包含的进程在group中的序号组成 的数组 OUT newgroup 新进程组 保持在原进程组中的次序。 如果n=0,返回空进程组newgroup=MPI_GROUP_NULL。

200 MPI进程组与通讯器

201 MPI进程组与通讯器 MPI_Group_excl 进程组补集创建函数,基于两个进程组成员的补集,创建一个新的进程组。
MPI_Group_excl (group, n, ranks, newgroup) IN group 进程组 IN n 进程组group中不属于新进程组的进程个数IN ranks 进程组group中不属于新进程组的进程序号 组成的数组 OUT newgroup 新进程组 保持在原进程组中的次序。

202 MPI进程组与通讯器

203 MPI进程组与通讯器 MPI_Group_size 进程组大小查询函数,查询进程组成员的个数。
MPI_Group_size (group, size) IN group 进程组 OUT size 进程组成员个数 group=MPI_GROUP_EMPTY,size=0 group=MPI_GROUP_NULL,程序出错。

204 MPI进程组与通讯器 MPI_Group_rank 进程序号查询函数,查询进程组某个成员的序号。
MPI_Group_rank (group, rank) IN group 进程组 OUT rank 进程组成员的序号 如果不在group中,则rank=MPI_UNDEFINED。

205 MPI进程组与通讯器 MPI_Group_translate_ranks
进程序号对应关系查询函数,查询一个进程组内某个进程在另一个进程组内的相应序号。 MPI_Group_translate_ranks (group1, n, ranks1, group2, ranks2) IN group1 进程组1 IN n 数组ranks1和ranks2的长度 IN ranks1 数组,包含进程组group1内待查询的进程 序号 IN group2 进程组2 OUT ranks2 数组,包含进程组group1内待查询的进程 在进程组group2中的序号 如果不在group2中,则返回MPI_UNDEFINED。

206 MPI进程组与通讯器

207 MPI进程组与通讯器 MPI_Group_compare 进程组比较函数,返回两个进程组的比较结果。
MPI_Group_compare (group1, group2, result) IN group1 进程组1 IN group2 进程组2 OUT result 比较结果

208 MPI进程组与通讯器 result = MPI_IDENT 两个进程组包含的进程相同,它们的序 号相同
result = MPI_SIMILAR 两个进程组包含的进程相同,但是进程 的序号不同 result = MPI_UNEQUAL 两个进程组分别包含不同的进程

209 MPI进程组与通讯器 MPI_Group_free 进程组释放函数,释放一个已创建的进程组。 MPI_Group_free (group)
INOUT group 进程组 MPI_GROUP_NULL MPI_GROUP_EMPTY MPI_COMM_WORLD MPI_COMM_SELF

210 MPI进程组与通讯器 MPI_Comm_dup 通讯器复制函数,复制一个进程通讯器。
MPI_Comm_dup (comm, newcomm) IN comm 原通讯器 OUT newcomm 复制的新通讯器

211 MPI进程组与通讯器 需要通讯器中所有进程共同参与。 虽然生成的新通讯器与原通讯器具有相同的进程组,但是仍然是两个不同的通讯器。

212 MPI进程组与通讯器 MPI_Comm_create 通讯器创建函数,基于某个通讯器包含的进程组子集,创建一个新通讯器。
MPI_Comm_create (comm, group, newcomm) IN comm 原通讯器 IN group 组成新通讯器的进程组子集 OUT newcomm 新通讯器 需要通讯器中所有进程共同参与。 新通讯器不继承原通讯器的属性(例如拓扑结构)。 不属于新通讯器的进程,newcomm=MPI_COMM_NULL。每个进程提供的group是相同的,否则函数出错。

213 MPI进程组与通讯器

214 MPI进程组与通讯器 MPI_Comm_split 通讯器创建函数,分裂某个通讯器成多个进程组,并同时为每个进程组创建一个新通讯器。
MPI_Comm_split (comm, color, key, newcomm) IN comm 原通讯器 IN color 各个进程提供的用于分组的整形参数 IN key 各个进程提供的用于同组内进程排序的整 形参数 OUT newcomm 新通讯器

215 MPI进程组与通讯器

216 newcomm=MPI_COMM_NULL
序号 1 2 3 4 5 6 7 8 9 进程 a b c d e f g h i j color * key comm1 comm2 comm3 comm4 a c h j g i d e f color区分通讯器,key给进程新的序号,如果相等则按照原通讯器中的序号,由小到大的顺序。 a=2 d=3 f=0 g=1 c=2 e=0 i=1 h=0 j=0 color=MPI_UNDEFINED newcomm=MPI_COMM_NULL

217 MPI进程组与通讯器 MPI_Comm_size 通讯器大小查询函数,获取某个通讯器包含的进程个数。
MPI_Comm_size (comm, size) IN comm 通讯器 OUT size 通讯器包含的进程个数

218 MPI进程组与通讯器 MPI_Comm_rank 进程序号查询函数,获取某个进程在通讯器中的序号。
MPI_Comm_rank (comm, rank) IN comm 通讯器 OUT rank 进程序号

219 MPI进程组与通讯器 MPI_Comm_compare 通讯器比较函数,比较两个通讯器的异同。
MPI_Comm_compare (comm1, comm2, result) IN comm1 通讯器1 IN comm2 通讯器2 OUT result 比较结果

220 MPI进程组与通讯器 result = MPI_IDENT comm1与comm2代表同一个通讯域
result = MPI_CONGRUENT comm1与comm2拥有相同的进程组 result = MPI_SIMILAR comm1与comm2拥有的进程组成员相同 ,但是进程序号不同 result = MPI_UNEQUAL comm1与comm2拥有的进程组成员不同

221 MPI进程组与通讯器 MPI_Comm_free 通讯器释放函数,释放一个已创建的进程通讯器。 MPI_Comm_free (comm)
INOUT comm 通讯器 需要通讯器中所有进程共同参与。 释放已创建的通讯器comm,并将comm=MPI_COMM_NULL。 如果存在尚未完成的通讯操作,则阻塞等待这些通讯操作完成后才释放该通讯器。 MPI_COMM_WORLD,MPI_COMM_NULL,MPI_COMM_SELF则函数调用出错。

222 MPI进程组与通讯器 将两个进程组合为一个进程组,并建立通讯器,也就是转化为域内通讯。
直接组织属于不同通讯域的两个进程之间的通讯,也就是域间通讯。

223 MPI进程组与通讯器 MPI_Intercomm_create 域间通讯器创建函数,创建一个联接两个不同域内通讯器的域间通讯器
MPI_Intercomm_create (local_comm, local_leader, bridge_comm, remote_leader, tag, newintercomm) IN local_comm 本地域内通讯器 IN local_leader 本地桥进程在本地域内通讯器 local_comm中的序号 IN bridge_comm 包含本地桥进程和远程桥进程的 域内通讯器 IN remote_leader 远程桥进程在通讯器bridge_comm 中的序号 IN tag 安全标号 OUT newintercomm 域间通讯器 需要两个域内通讯器中所有进程共同参与,且属于同一域内通讯器的进程必须提供相同的域内通讯器local_comm。

224 MPI进程组与通讯器

225 MPI进程组与通讯器 comm1 MPI_Intercomm_create (comm1, 1, MPI_COMM_WORLD, 3, 111, intercomm) comm2 MPI_Intercomm_create (comm2, 0, MPI_COMM_WORLD, 1, 111, intercomm) comm1 comm2 1 3 6 4 2 5

226 MPI进程组与通讯器 MPI_Intercomm_merge 域间通讯器合并函数,通过合并两个域间通讯器,创建一个域内通讯器。
MPI_Intercomm_merge (intercomm, high, newintracomm) IN intercomm 域间通讯器 IN high 进程序号排序优先级 OUT newintracomm 域内通讯器

227 MPI进程组与通讯器

228 MPI进程组与通讯器 MPI_Comm_test_inter 域间通讯器查询函数,返回一个通讯器是否为域间通讯器的信息。
MPI_Comm_test_inter (comm, flag) IN comm 通讯器 OUT flag 若comm为域间通讯器,则返回true

229 MPI进程组与通讯器 MPI_Comm_remote_size 域间通讯器查询函数,返回域间通讯器联接的远程进程组大小。
MPI_Comm_remote_size (comm, size) IN comm 通讯器 OUT size 域间通讯器联接的远程进程组大小

230 MPI进程组与通讯器 MPI_Comm_remote_group 域间通讯器查询函数,返回域间通讯器联接的远程进程组。
MPI_Comm_remote_group (comm, group) IN comm 通讯器 OUT group 域间通讯器联接的远程进程组

231 MPI进程拓扑结构 MPI_Cart_create Cartesian拓扑结构创建函数,创建一个包含Cartesian拓扑结构的新通讯器。
MPI_Cart_create (comm_old, ndim, dims, periods, reorder, comm_cart) IN comm_old 原通讯器 IN ndim 待创建的Cartesian拓扑结构的维数 IN dims 数组,含拓扑结构各维包含的进程个数 IN periods 数组,含各维的进程是否周期联接标志 IN reorder true表示重新排列进程的序号 OUT comm_cart 含Cartesian拓扑结构的新通讯器 只存在于域内通讯器。 需要通讯器comm_old中所有进程共同参与,且每个进程提供完全一致的参数(ndim, dims, periods, reorder)

232 MPI进程拓扑结构

233 MPI进程拓扑结构 ndim 待创建的拓扑结构维数 dims 长度为ndim的数组,元素分别表示拓扑结构各维度包含 的进程数量
periods 长度为ndim的数组,元素若为真表示拓扑结构沿着该维 度的所有结点首尾相连 reorder true表示进程在新通讯器中重新排序 ndim = 2 dims(0) = 3 dims(1) = 4 periods(0) = 0 periods(0) = 0 reorder = true 0/(0,0) 1/(0,1) 2/(0,2) 3/(0,3) 4/(1,0) 5/(1,1) 6/(1,2) 7/(1,3) 8/(2,0) 9/(2,1) 10/(2,2) 11/(2,3) 如果comm_cart包含的进程数量小于comm_old,则存在一些进程返回comm_cart=MPI_COMM_NULL。 反之,各进程函数调用出错。 无论对于C还是Fortran, Cartesian拓扑结构以行来排列进程,其坐标序号从0开始。

234 MPI进程拓扑结构 MPI_Dims_create
Cartesian拓扑结构辅助函数,给定结点总数和维数,该函数返回Cartesian拓扑结构各维包含的最优结点个数。 MPI_Dims_create (nnode, ndim, dims) IN nnode 结点总数 IN ndim Cartesian拓扑结构的维数 INOUT dims 长度为ndim的数组,其元素代表各维包 含的结点个数

235 MPI进程拓扑结构 输入dims 函数调用 返回dims (0,0) (6,2,dims) (3,2) (7,2,dims) (7,1)
(0,3,0) (6,3,dims) (2,3,1) (7,3,dims) 出错

236 MPI进程拓扑结构 MPI_Cartdim_get Cartesian拓扑结构查询函数,返回Cartesian拓扑结构的维数。
MPI_Cartdim_get (comm, ndim) IN comm 含Cartesian拓扑结构的通讯器 OUT ndim Cartesian拓扑结构的维数

237 MPI进程拓扑结构 MPI_Cart_get Cartesian拓扑结构查询函数,返回Cartesian拓扑结构的基本信息。
MPI_Cart_get (comm, maxdim, dims, periods, coords) IN comm 含Cartesian拓扑结构的通讯器 IN maxdim Cartesian拓扑结构的维数 OUT dims 数组,包含各维度结点个数 OUT periods 数组,包含各维度是否周期联接信息 OUT coords 数组,包含调用该函数进程的坐标

238 MPI进程组与通讯器

239 MPI进程拓扑结构 MPI_Cart_rank Cartesian拓扑结构查询函数,返回某个坐标对应的进程序号。
MPI_Cart_rank (comm, coords, rank) IN comm 含Cartesian拓扑结构的通讯器 IN coords 数组,待查询进程的Cartesian坐标 OUT rank 待查询进程的序号

240 MPI进程拓扑结构 MPI_Cart_coords Cartesian拓扑结构相邻进程查询函数,返回某个进程的坐标。
MPI_Cart_coords (comm, rank, maxdim, coords) IN comm 含Cartesian拓扑结构的通讯器 IN rank 待查询进程号 IN maxdim Cartesian拓扑结构维数 OUT coords 数组,包含待查询进程的Cartesian坐标

241 MPI进程拓扑结构 MPI_Cart_shift Cartesian拓扑结构相邻进程查询函数,查询某个进程沿某个方向的相邻进程。
MPI_Cart_shift (comm, disp, direction, rank_source, rank_dest) IN comm 含Cartesian拓扑结构的通讯器 IN disp 待查询的坐标维 IN direction 待查询的坐标方向 OUT rank_source 源进程的序号 OUT rank_dest 目的进程的序号

242 MPI进程组与通讯器

243 MPI进程拓扑结构 direction>0 沿坐标值大的方向 direction<0 沿坐标值小的方向
rank_source 源进程,沿移位逆方向,函数调用进程的相邻进程 rank_dest 目的进程,沿移位方向,函数调用进程的相邻进程

244 MPI进程拓扑结构 MPI_Cart_sub
Cartesian拓扑结构分解函数,按坐标的不同维,将某个通讯器分解为多个独立的新通讯器,且每个新通讯器集成它包含的所有进程在原通讯器中的拓扑结构。 MPI_Cart_sub (comm, remain_dims, newcomm) IN comm 含Cartesian拓扑结构的通讯器 IN remain_dims 数组,是否包含在新通讯器中 OUT newcomm 新通讯器 需要通讯器中所有进程共同参与,根据各进程提供的参数remain_dims来确定如何分解通讯器,并形成多个独立的新通讯器。

245 MPI进程拓扑结构 remian_dims(i) = true 第i-1维的所有进程将被保留在新通讯器中
remian_dims(i) = false 第i-1维的所有进程将被排除在新通讯器之外 Cartesian拓扑结构为2×3×4 reamian_dims = (true, false, true) 产生3个独立的通讯器,每个包含8个进程,具有2×4 Cartesian拓扑结构。 reamian_dims = (false, false, true) 产生6个独立的通讯器,每个包含4个进程,具有 一维Cartesian拓扑结构。

246 MPI进程组与通讯器

247 MPI进程拓扑结构 MPI_Cart_map Cartesian拓扑结构映射函数,为每个进程映射一个新的序号。
MPI_Cart_map (comm, ndim, dims, periods, newrank) IN comm 通讯器 IN ndim 拓扑结构的维数 IN dims 数组,拓扑结构各维度的进程数量 IN periods 数组,各维度进程是否周期联接信息 OUT newrank 新的进程序号

248 MPI进程组与通讯器

249 MPI进程拓扑结构 MPI_Graph_create 图拓扑结构创建函数,给定一个图,在原通讯器上创建一个以图为拓扑结构的新通讯器。
MPI_Graph_create (comm_old, nnode, indexs, edges, reorder, comm_graph) IN comm_old 原通讯器 IN nnode 图拓扑结构包含的结点总数 IN indexs 图拓扑结构的邻居结点数组 IN edges 图拓扑结构的边数组 IN reorder true表示进程将在新通讯器中重新排序 OUT comm_graph 含图拓扑结构的新通讯器 需要所有进程共同参与,且要求所有进程提供一直的参数(nnode, indexs, edges)。

250 MPI进程组与通讯器

251 MPI进程拓扑结构 nnode 图中结点个数 index(i) 前i个结点邻居结点数之和
edges 结点0,…,nnode-1的邻居结点的序号 nnode = 4 index = (2, 3, 4, 6) edges = (1, 3, 0, 3, 0, 2)

252 MPI进程拓扑结构 MPI_Graphdims_get 图拓扑结构查询函数,查询图拓扑结构包含的结点数和边数。
MPI_Graphdims_get (comm, nnode, nedge) IN comm 含图拓扑结构的通讯器 OUT nnode 图拓扑结构中结点总数 OUT nedge 图拓扑结构中边总数

253 MPI进程拓扑结构 MPI_Graph_get 图拓扑结构查询函数,查询图拓扑结构包含的邻居结点数组和边数组
MPI_Graph_get (comm, maxindexs, maxedges, indexs, edges) IN comm 含图拓扑结构的通讯器 IN maxindexs 图拓扑结构包含的结点总数 IN maxedges 数组edges的长度,边条数的二倍 OUT indexs 图拓扑结构的邻居结点数组 OUT edges 图拓扑结构的边数组

254 MPI进程组与通讯器

255 MPI进程拓扑结构 MPI_Graph_neighbors_count 图拓扑结构查询函数,返回某个进程的邻居结点数。
MPI_Graph_neighbors_count (comm, rank, nneighbor) IN comm 含图拓扑结构的通讯器 IN rank 进程序号 OUT nneighbor 进程rank的邻居结点数

256 MPI进程拓扑结构 MPI_Graph_neighbors 图拓扑结构查询函数,返回某个进程的所有邻居结点。
MPI_Graph_neighbors (comm, rank, maxneighbors, neighbors) IN comm 含图拓扑结构的通讯器 IN rank 进程序号 IN maxneighbors 数组neighbors的长度 OUT neighbors 进程rank所有邻居结点序号组成的数组 通讯器comm中进程rank的所有邻居结点,按照从小到大的序号,将结点存储在neighbors数组中。

257 MPI进程组与通讯器

258 MPI进程拓扑结构 MPI_Graph_map 图拓扑结构映射函数,为每个进程映射一个新的序号。
MPI_Graph_map (comm, nnode, index, edges, newrank) IN comm 通讯器 IN nnode 图拓扑结构的结点总数 IN index 图拓扑结构的邻居结点数组 IN edges 图拓扑结构的边数组 OUT newrank 新的进程序号

259 MPI进程组与通讯器

260 MPI进程拓扑结构 MPI_Topo_test 拓扑结构类型查询函数,返回某个通讯器包含的拓扑结构的类型。
MPI_Topo_test (comm, type) IN comm 通讯器 OUT type 通讯器包含的拓扑结构类型

261 MPI进程拓扑结构 type = MPI_GRAPH 通讯器包含图拓扑结构
type = MPI_CART 通讯器包含Cartesian拓扑结构 type = MPI_UNDEFINED 通讯器不包含任何拓扑结构 例: MPI_Topo_test (MPI_COMM_WORLD, type) type = MPI_UNDEFINED

262 1. https://computing.llnl.gov/tutorials/mpi/ 2.

263 谢谢大家


Download ppt "周纯葆 中国科学院计算机网络信息中心 超级计算中心"

Similar presentations


Ads by Google