首页 / 专利库 / 环境工程 / 环境足迹 / 面向直接内存访问互连通信的多核芯片的MPI实现方法

面向直接内存访问互连通信的多核芯片的MPI实现方法

阅读:103发布:2020-05-20

专利汇可以提供面向直接内存访问互连通信的多核芯片的MPI实现方法专利检索,专利查询,专利分析的服务。并且本 发明 公开了一种面向直接内存 访问 互连通信的多核芯片的精简MPI的实现方法,通过在接收方和发送方同时建立一个分布式上下文数据结构和一个接收上下文数据结构作为 支撑 整个并行环境的控制结构和数据结构,消息发送方实际上并没有执行数据发送操作,只需对发送消息进行描述,设置好发送上下文,当接收方运行接收调用时,如果上下文匹配,则将发送方 指定 的内存地址中的消息读回本地内存空间,在应用层中能以极小的内存足迹实现并行程序的设计以及 进程 之间实现消息的传递,用于支持利用直接内存访问互连通信的多核芯片的并行程序设计,实现进程同步功能,可以用于直接内存访问互连通信的多核芯片的复杂并行程序设计。,下面是面向直接内存访问互连通信的多核芯片的MPI实现方法专利的具体信息内容。

1.一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,其特征在于,包括以下步骤:在接收方和发送方同时建立一个分布式上下文数据结构和一个接收上下文数据结构,接收方首先要访问发送方的分布式上下文数据结构,通过分布式上下文数据结构来判断是否有消息需要接收,并通过分布式上下文数据结构信息来确定是否和自身要接收的消息相匹配;如果有消息要接收且消息匹配,接收方再单独发起对消息的读操作,将消息读回自身的内存空间。
2.根据权利要求1所述的一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,其特征在于,分布式上下文在每个进程中都采用静态存储,在整个并行环境运行的过程中占据固定的存储空间,接收上下文采用动态存储。
3.根据权利要求1所述的一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,其特征在于,分布式上下文数据结构包括发送上下文、进程总数和当前进程编号。
4.根据权利要求3所述的一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,其特征在于,发送上下文包括一个控制信号量和用于描述发送消息的五个消息描述成员,所述消息描述成员与发送调用中的消息描述参数相对应,并在运行发送调用时会将调用中的消息描述参数分别赋值给对应的消息描述成员,供接收方通过直接内存访问的方式获取;所述控制信号量为发送上下文的控制结构,用于收发双方的同步协调,控制信号量的初始为0。
5.根据权利要求4所述的一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,其特征在于,接收方首先访问发送方的发送上下文,通过发送方的发送上下文中的控制信号量来判断是否有消息需要接收,并通过发送方的发送上下文中的消息描述成员来确定是否和自身要接收的消息相匹配;如果有消息要接收且消息匹配,接收方再单独发起对消息的读操作,将消息读回自身的内存空间。
6.根据权利要求3所述的一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,其特征在于,所述的进程总数为整个系统中并行执行的进程数量,由并行系统初始化时指定
7.根据权利要求3所述的一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,其特征在于,所述的进程编号为当前进程在所有并行进程中的编号;并行系统初始化时,会给每个进程分配一个互不相同的进程编号值,该进程编号值便保存在这个进程编号分量中。
8.根据权利要求1所述的一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,其特征在于,在实现点对点非阻塞消息传递时定义非阻塞对象结构体类型:非阻塞消息传递的实现依赖于MPI_Context定义的分布式上下文变量,非阻塞对象被定义成一个称为MPI_Request的结构体,该结构体中包括非阻塞调用的消息描述、调用类型、完成标志以及执行状态;所述的消息描述用于备份由当前非阻塞接收/发送调的消息描述参数,其中消息描述的成员包括消息缓冲区指针、消息长度、消息数据类型、源/目的进程编号、消息标志;非阻塞对象结构体只服务于非阻塞相关的调用。
9.根据权利要求1所述的一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,其特征在于,非阻塞对象结构体采用静态存储,并行编程中,每个进程只需维护一个分布式上下文、接收上下文和非阻塞对象结构体,非阻塞对象结构体用于同时执行的非阻塞接收和发送。
10.根据权利要求8所述的一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,其特征在于,非阻塞的等待调用首先查询非阻塞调用的执行状态,如果执行状态显示为传输未启动,则根据非阻塞调用中的消息描述和调用类型,重新发起一次阻塞式传输,传输完成后设置相应的完成标志为1,并将执行状态设置为已经完成,最后返回;如果执行状态显示为正在传输,则检测硬件的传输状态,直到传输完成后设置相应的完成标志为1,并将执行状态设置为已经完成,最后返回;如果执行状态显示传输已完成,则直接返回;
非阻塞的查询调用首先查询非阻塞调用的执行状态,如果执行状态显示为传输未启动,则将完成表示设置为0,然后返回;如果执行状态显示为正在传输,则通过检测硬件的传输状态是否为空闲来来确定传输是否完成,然后设置相应的完成标志以及执行状态,最后返回;如果执行状态显示传输已完成,则直接返回。

说明书全文

面向直接内存访问互连通信的多核芯片的MPI实现方法

技术领域

[0001] 本发明属于并行编程领域,涉及面向直接内存访问互连通信的多核芯片的MPI实现方法。

背景技术

[0002] 基于消息传递接口(MPI)的并行编程是目前最常见的一种并行编程方法,它主要面向分布式内存架构的并行程序设计,在高性能计算领域获得了广泛应用。MPI为并行编程提供了一种标准,而不代表某一种具体的MPI实现。MPI标准由MPI论坛进行统一管理,目前已经发展到MPI-3.1标准版本,其中包含数百个支持并行程序设计的调用接口。
[0003] MPI最初应用于分布式多机系统的并行编程,但是随着集成电路技术与工艺的发展,多核芯片成为了目前处理器设计的主流,使得MPI逐渐在片上多核并行程序设计中获得了广泛研究与应用。在大量的多核系统芯片中,采用直接内存访问的核间互连结构实现多核通信是一种常见的技术手段。在这种核间互连结构中,MPI同时还起着保证核间数据一致性的作用,因为直接内存访问的核间互连通信机制一般只提供“路由+直接内存访问”的网络层服务,即硬件只负责将源节点内存中的数据通过网络路由搬运到目的节点的内存中,而将保证数据一致性的方法交由应用层与网络层之间的传输层来完成。MPI在这样的系统中即充当了传输层的色,为并行编程与进程通信提供服务。
[0004] 硬件只提供核间直接内存访问的网络层的好处是将上层的传输层交由软件程序来实现,为传输层的设计实现提供了较大的探索空间。针对多核芯片的MPI的实现一般采用标准MPI的一个子集来完成片上核间消息传递,在资源极为宝贵且受限的单芯片多核环境中实现轻量级的核间通信,同时支持并行程序框架的实现。目前已有的技术中,均没有充分利用核间直接内存访问的特性来实现足够精简的MPI,并在应用层中以尽可能小的内存足迹实现对并行程序设计与多核通信的支持,而这种方法恰恰是在多核芯片中节点内存资源紧张的轻量级处理器核之间实现并行计算所需要的。

发明内容

[0005] 本发明的目的在于提供面向直接内存访问互连通信的多核芯片的MPI实现方法,以克服现有技术的不足。
[0006] 为达到上述目的,本发明采用如下技术方案:
[0007] 一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,包括以下步骤:在接收方和发送方同时建立一个分布式上下文数据结构和一个接收上下文数据结构,接收方首先要访问发送方的分布式上下文数据结构,通过分布式上下文数据结构来判断是否有消息需要接收,并通过分布式上下文数据结构信息来确定是否和自身要接收的消息相匹配;如果有消息要接收且消息匹配,接收方再单独发起对消息的读操作,将消息读回自身的内存空间。
[0008] 进一步的,分布式上下文在每个进程中都采用静态存储,在整个并行环境运行的过程中占据固定的存储空间。
[0009] 进一步的,分布式上下文数据结构包括发送上下文、进程总数和当前进程编号。
[0010] 进一步的,发送上下文包括一个控制信号量和用于描述发送消息的五个消息描述成员,所述消息描述成员与发送调用中的消息描述参数相对应,并在运行发送调用时会将调用中的消息描述参数分别赋值给对应的消息描述成员,供接收方通过直接内存访问的方式获取;所述控制信号量为发送上下文的控制结构,用于收发双方的同步协调,控制信号量的初始为0。
[0011] 进一步的,接收方首先访问发送方的发送上下文,通过发送方的发送上下文中的控制信号量来判断是否有消息需要接收,并通过发送方的发送上下文中的消息描述成员来确定是否和自身要接收的消息相匹配;如果有消息要接收且消息匹配,接收方再单独发起对消息的读操作,将消息读回自身的内存空间。
[0012] 进一步的,所述的进程总数为整个系统中并行执行的进程数量,由并行系统初始化时指定
[0013] 进一步的,所述的进程编号为当前进程在所有并行进程中的编号;并行系统初始化时,会给每个进程分配一个互不相同的进程编号值,该进程编号值便保存在这个进程编号分量中。
[0014] 进一步的,接收上下文采用动态存储。
[0015] 进一步的,在实现点对点非阻塞消息传递时定义非阻塞对象结构体类型:非阻塞消息传递的实现依赖于MPI_Context定义的分布式上下文变量,非阻塞对象被定义成一个称为MPI_Request的结构体,该结构体中包括非阻塞调用的消息描述、调用类型、完成标志以及执行状态;所述的消息描述用于备份由当前非阻塞接收/发送调的消息描述参数,其中消息描述的成员包括消息缓冲区指针、消息长度、消息数据类型、源/目的进程编号、消息标志;非阻塞对象结构体只服务于非阻塞相关的调用。
[0016] 进一步的,非阻塞对象结构体采用静态存储,并行编程中,每个进程只需维护一个分布式上下文、接收上下文和非阻塞对象结构体,非阻塞对象结构体用于同时执行的非阻塞接收和发送。
[0017] 进一步的,非阻塞的等待调用首先查询非阻塞调用的执行状态,如果执行状态显示为传输未启动,则根据非阻塞调用中的消息描述和调用类型,重新发起一次阻塞式传输,传输完成后设置相应的完成标志为1,并将执行状态设置为已经完成,最后返回;如果执行状态显示为正在传输,则检测硬件的传输状态,直到传输完成后设置相应的完成标志为1,并将执行状态设置为已经完成,最后返回;如果执行状态显示传输已完成,则直接返回;
[0018] 非阻塞的查询调用首先查询非阻塞调用的执行状态,如果执行状态显示为传输未启动,则将完成表示设置为0,然后返回;如果执行状态显示为正在传输,则通过检测硬件的传输状态是否为空闲来来确定传输是否完成,然后设置相应的完成标志以及执行状态,最后返回;如果执行状态显示传输已完成,则直接返回。
[0019] 与现有技术相比,本发明具有以下有益的技术效果:
[0020] 本发明一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,通过在接收方和发送方同时建立一个分布式上下文数据结构和一个接收上下文数据结构作为支撑整个并行环境的控制结构和数据结构,利用分布式上下文数据结构和一个接收上下文数据结构作为消息传输载体,消息发送方实际上并没有执行数据发送操作,只需对发送消息进行描述,设置好发送上下文即可,当接收方运行接收调用时,如果上下文匹配,则将发送方指定的内存地址中的消息读回本地内存空间,在应用层中能以极小的内存足迹实现并行程序的设计以及进程之间实现消息的传递,用于支持利用直接内存访问互连通信的多核芯片的并行程序设计,以及用于直接内存访问互连通信的多核芯片的复杂并行程序设计。
[0021] 进一步的,在实现点对点非阻塞消息传递时定义非阻塞对象结构体类型,如果需要用到非阻塞消息传递,那么需再定义最多两个非阻塞对象结构体,分别用于同时执行的非阻塞接收和发送,便能实现整个并行系统的搭建,从存储上来说,结构体中的每个成员分量均可以采用单字存储,因此只需极小的内存空间开销便能实现整个并行框架的搭建。
[0022] 进一步的,本发明通过定义非阻塞对象结构体,提供了并行进程之间的阻塞和非阻塞消息传递功能,以及进程同步功能,可以用于直接内存访问互联通信的多核芯片的复杂并行程序设计。附图说明
[0023] 图1为分布式上下文类型MPI_Context的声明
[0024] 图2为接收上下文类型MPI_Rcontext的声明;
[0025] 图3为非阻塞对MPI_Request的声明;
[0026] 图4为分布式上下文的存储及直接内存访问互连的通信模型;
[0027] 图5消息传递协议的执行流程;
[0028] 图6为消息发送的执行流程;图6(a)为MPI_Send的执行流程图;图6(b)为MPI_Isend的执行流程图;
[0029] 图7为消息接收的执行流程;图7(a)为MPI_Recv的执行流程图;图7(b)为MPI_Irecv的执行流程图;
[0030] 图8为等待非阻塞传输完成的执行流程;
[0031] 图9为非阻塞传输的状态检测执行流程。

具体实施方式

[0032] 下面结合附图对本发明做进一步详细描述:
[0033] 一种面向直接内存访问互连通信的多核芯片的精简MPI的实现方法,包括以下步骤:在接收方和发送方分别建立一个分布式上下文数据结构和一个接收上下文数据结构,分布式上下文数据结构包括发送上下文、进程总数和当前进程编号;接收方首先访问发送方的发送上下文,通过发送方的发送上下文的控制信号量判断是否有消息需要接收,并通过发送方的发送上下文的消息描述成员来确定是否和自身要接收的消息相匹配;如果有消息要接收且消息匹配,接收方再单独发起对消息的读操作,将消息读回自身的内存空间;运行接收调用时,会利用调用时指定的发送方进程编号通过直接内存访问方式来获取发送方的发送上下文,并保存到接收调用的接收上下文中,以便接收调用通过接收上下文得知发送方的信号量状态,并确认消息发送方所发出的消息是否和待接收的消息相匹配,如果匹配则接收对方发出的消息,如果不匹配则不接收。
[0034] 接收上下文在接收调用中定义,属于接收调用中的动态局部变量,采用动态存储;接收上下文被定义为MPI_Rcontext类型的结构体变量,MPI_Rcontext的声明见图2所示,其中的成员类型与发送上下文中的成员类型相同。
[0035] 分布式上下文的定义:
[0036] 本项发明中采用一个单一的分布式上下文结构体类型来作为点对点的消息传递协议的数据结构和控制结构;分布式上下文在每个进程中都采用静态存储,所述的分布式上下文结构体类型名为MPI_Context,声明方法如图1所示:MPI_Context类型的变量被称为MPI的分布式上下文,在消息传递协议的实现上,并行运行的每个核都维护一个MPI_Context的结构体变量,且该结构体变量在整个并行任务执行过程中采用静态存储,在整个并行环境运行的过程中占据固定的存储空间,以便其它处理器核能对其中的内容进行交互式访问;
[0037] 所述的发送上下文包括一个同步信号量和用于描述发送消息的五个消息描述成员,所述的消息描述成员为发送上下文的数据结构,与发送调用中的消息描述参数相对应,并在运行发送调用时会将调用中的消息描述参数分别赋值给对应的消息描述成员,供接收方通过直接内存访问的方式获取;所述的控制信号量为发送上下文的控制结构,用于收发双方的同步协调,控制信号量的初始为0;五个消息描述成员具体包括发送消息缓冲区指针、发送消息长度、发送消息的数据类型、发送消息的目的进程编号和发送消息标志。
[0038] 所述的进程总数为整个系统中并行执行的进程数量,由并行系统初始化时指定,本项发明中将进程与处理器核之间进行一对一的抽象,即一个核运行一个进程,因此进程总数不会超过核的数量;
[0039] 所述的进程编号为当前进程在所有并行进程中的编号;并行系统初始化时,会给每个进程分配一个互不相同的进程编号值,该进程编号值便保存在这个进程编号分量中。
[0040] 为了实现非阻塞调用的等待和查询,在实现点对点非阻塞消息传递时定义非阻塞对象结构体类型:非阻塞消息传递的实现同样依赖于MPI_Context定义的分布式上下文变量,非阻塞对象被定义成一个称为MPI_Request的结构体,该结构体中包含了非阻塞调用的消息描述、调用类型、完成标志以及执行状态四个部分,共8个成员分量,如图3所示:所述的消息描述用于备份由当前非阻塞接收/发送调的消息描述参数,其中消息描述的成员包括消息缓冲区指针、消息长度、消息数据类型、源/目的进程编号、消息标志;非阻塞对象结构体只服务于非阻塞相关的调用,它的应用在4个非阻塞相关的调用的具体实施中介绍:
[0041] 非阻塞调用类型:I_CallType;为非阻塞通信句柄返回当前已经执行的调用类型,该成员可以标注为两种调用类型:MPI_NonblockingSend(非阻塞发送)和MPI_NonblockingReceive(非阻塞接收);
[0042] 非阻塞调用完成标志:I_Flag;调用是否成功执行的标志,成功执行返回1,失败则返回0;
[0043] 非阻塞调用执行状态:I_Status;显示消息传输是否已经启动,或正在传输,或已经传输完成,具体的取值为:
[0044] MPI_UnStart(传输未启动)、MPI_InTransmitting(正在传输)、MPI_TransCompleted(传输已完成)。
[0045] 综上所述,分布式上下文结构体中包含8个成员分量,非阻塞对象结构体中包含了8个成员分量,接收上下文中包含6个成员分量,其中分布式上下文和非阻塞对象结构体采用静态存储,接收上下文采用动态存储;并行编程中,每个进程只需维护一个分布式上下文,加上接收上下文,总共只包含6+8=14个结构体成员分量的存储开销,便能实现基本的点对点阻塞式消息传递。如果需要用到非阻塞消息传递,那么需再定义最多两个非阻塞对象结构体,分别用于同时执行的非阻塞接收和发送,便能实现整个并行系统的搭建;从存储上来说,结构体中的每个成员分量均可以采用单字存储,因此只需极小的内存空间开销便能实现整个并行框架的搭建。本发明提供的是一种精简的消息传递并行编程的实现方法。
[0046] 在消息传递协议的实现上,并行运行的每个核都维护一个MPI_Context的结构体变量,该结构体变量代表的分布式上下文在整个任务执行过程中采用静态存储,占用固定的内存空间,以便其它核通过直接内存访问的方式获取其中的发送上下文,实现进程的同步消息传递,如图4所示。图4中所示的两个节点通过互连网络实现直接内存访问的通信,因此核间数据传输时处理器核只需向网络接口指定源/目的节点编号、源/目的内存地址、传输长度等基本的参数,然后直接发起传输请求,数据即可通过双方的存储器控制单元、网络接口和互连网络在两个节点下的内存之间传输。
[0047] 消息传递协议的执行流程如图5所示。图5中表示了Node0节点向Node1节点发送消息的执行过程。Node0上的进程调用MPI_Send实现消息的阻塞式发送,而Node1上的进程调用MPI_Recv实现消息的阻塞式接收:
[0048] Node0调用MPI_Send时的执行顺序为:
[0049] (1)确认信号量的值是否为0,如果为0,则表明发送通道可用,流程进入第(2)步;如果不为0,则等待,直到信号量为0为止;
[0050] (2)将调用MPI_Send时的接口参数赋值给发送上下文的对应成员,完成对发送消息的描述,流程进入第(3)步;
[0051] (3)将信号量更改为1,流程进入第(4)步;
[0052] (4)等待直到信号量的值为0,表明消息已经成功被对方接收,流程进入第(5)步;
[0053] (5)调用返回。
[0054] Node1调用MPI_Recv的执行顺序为:
[0055] (1)根据调用MPI_Recv给出的源进程号获取源端的发送上下文(总共六个成员分量),并赋值给本地内存中的接收上下文的相应成员;
[0056] (2)检查从源端获取的信号量,如果获取的信号量值为0,则返回第(1)步,重新获取源端的发送上下文;如果信号量为1,怎进入第(3)步;
[0057] (3)用本地内存中的接收上下文和调用中给出的消息描述参数进行消息匹配检查,如果不匹配,则该消息不是发给本节点的,流程返回到第(1)步;如果匹配,则该消息是发给本地节点的消息,流程进入第(4)步;
[0058] (4)根据接收调用中的消息描述参数以及接收上下文信息,直接读取源节点内存中的消息到本地内存空间,完成消息传输之后流程进入第(5)步;
[0059] (5)设置发送方的发送上下文中的信号量值为0,流程进入第(6)步;
[0060] (6)调用返回,完成消息接收。
[0061] 从以上过程可以看出,消息发送方实际上并没有执行数据发送操作,只需对发送消息进行描述,设置好发送上下文即可,当接收方运行接收调用时,如果上下文匹配,则将发送方指定的内存地址中的消息读回本地内存空间,然后设置对方的信号量为0,完成一次消息传递。
[0062] 非阻塞消息传递执行过程与此类似,只是在执行过程中需要对非阻塞对象中的信息进行设置和备份,并且可以在消息传递未完成之前就返回。
[0063] 非阻塞消息传递的等待和查询具体和非阻塞对象相关,根据非阻塞对象中的执行状态成员的取值来执行不同的操作。
[0064] 非阻塞的等待调用首先查询非阻塞调用的执行状态,如果执行状态显示为传输未启动,则根据非阻塞调用中的消息描述和调用类型,重新发起一次阻塞式传输,传输完成后设置相应的完成标志为1,并将执行状态设置为已经完成,最后返回;如果执行状态显示为正在传输,则检测硬件的传输状态,直到传输完成后设置相应的完成标志为1,并将执行状态设置为已经完成,最后返回;如果执行状态显示传输已完成,则直接返回。
[0065] 非阻塞的查询调用首先查询非阻塞调用的执行状态,如果执行状态显示为传输未启动,则将完成表示设置为0,然后返回;如果执行状态显示为正在传输,则通过检测硬件的传输状态是否为空闲来确定传输是否完成,然后设置相应的完成标志以及执行状态,最后返回;如果执行状态显示传输已完成,则直接返回。
[0066] 下面结合附图对本发明的结构原理和使用步骤作进一步说明:
[0067] 基于本发明公开的方法实现的并行编程库包含11个调用,这11个调用如表2所示,其中包括6个基本调用,4个非阻塞相关的调用和1个扩展的进程同步调用。
[0068] 表2基于本项发明实现的11个并行编程调用接口
[0069]
[0070]
[0071]
[0072]
[0073] 下面结合这11个调用接口进一步介绍本发明的实施方式。
[0074] 1.并行环境初始化
[0075] 并行环境初始化调用名称为MPI_Init,它是本项发明用于多核芯片并行程序设计的第一个调用,调用原型为:MPI_Init(int proc_num,MPI_Context*context);MPI_Init的功能是建立多个并行任务,对并行环境作适当的初始化,然后进入多任务运行;MPI_Init调用包含两个参数:
[0076] proc_num为启动的并行进程数量,类型为整型;将进程与处理器核之间进行一对一的抽象,即一个核运行一个进程,因此进程总数不能超过核的数量;
[0077] context为指向分布式上下文数据结构的指针,通过该指针向调用传入进程的分布式上下文,实现对分布式上下文的初始化;
[0078] 本项发明中默认将第0号进程首先启动运行,即在Node0上执行MPI_Init,并实现并行环境的初始化,实施步骤为:
[0079] (1)根据指定的进程总数proc_num依次将各个进程的指令通过片上互连网络发送到Node1…Noder-1的程序存储区中,这里r=proc_num,加上Node0所在的进程,总共proc_num个进程;
[0080] (2)对每个节点下由context指定的上下文进行初始化,主要设置进程总数和进程编号,并将信号量初始化为0,其中分配给每个进程的编号依次为0、1、2…proc_num-1;
[0081] (3)启动新创建的进程所对应的节点开始运行,调用返回。
[0082] 2.获取并行进程总数
[0083] 本项发明中获取并行系统中的进程总数的调用为MPI_Comm_size,调用原型为:MPI_Comm_size(MPI_Context*context,int*size);其中context向调用传入当前进程的分布式上下文,size向调用传递一个进程总数的指针。
[0084] MPI_Comm_size的实现较简单,只需由context找到上下文信息中的进程总数成员,并将其赋值到size指向的位置
[0085] 3.获取当前进程编号
[0086] 本项发明中获取当前进程编号的调用为MPI_Comm_rank,调用原型为:MPI_Comm_rank(MPI_Context*context,int*rank);其中context向调用传入当前进程的分布式上下文,rank向调用传递一个返回进程编号的指针;MPI_Comm_rank的实现上直接将分布式上下文中的进程编号成员赋值到rank指向的位置。
[0087] 4.消息发送
[0088] 本项发明中消息发送分为阻塞式发送和非阻塞式发送两种;阻塞式发送是指在调用发起之后一直到消息全部发送完成才返回的调用;非阻塞式发送是指调用发起之后可以立即返回的调用,但是调用返回并不意味着消息传输已经成功完成。
[0089] 阻塞式发送调用原型为MPI_Send(void*buf,int  count,MPI_Datatype datatype,int dest,int tag,MPI_Context*context),其中的参数:
[0090] buf为待发送消息的指针,即待发送消息在内存中的起始地址;
[0091] count为待发送消息的长度,该长度的单位由数据类型决定;
[0092] datatype为待发送消息的数据类型,可以支持例如字符型的字节数据,短整型的半字数据,整型和单精度浮点型的字数据等,具体根据系统需要来设计;
[0093] dest为目的进程编号;
[0094] tag为发送消息的标志,以整型数据的形式给出,该标志必须与接收方接收本消息时给出的标志相同;
[0095] context向调用传递分布式上下文结构体的指针,消息发送时以便通过该指针来寻址并设置发送上下文信息;
[0096] MPI_Send的执行流程如图6(a)所示,实现中根据参数context访问本进程所维护的分布式上下文,依次执行以下步骤:
[0097] (1)确认信号量的值是否为0,如果为0,则表明发送通道可用,流程进入第(2)步;如果不为0,则等待,直到信号量为0为止。
[0098] (2)将调用MPI_Send时的消息描述参数写入内存中发送上下文的对应成员中,完成对发送消息的描述,流程进入第(3)步。
[0099] (3)将信号量更改为1,流程进入第(4)步。
[0100] (4)等待直到信号量的值为0,表明消息已经成功被对方接收,流程进入第(5)步。
[0101] (5)调用返回。
[0102] 为了实现核内进程与消息传递的重叠执行,以进一步提升系统的处理性能,本项发明还提供一种非阻塞消息发送的实现方法,其调用原型为MPI_Isend(void*buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Context*context,MPI_Request*request)。该调用与MPI_Send相比在名称上多了一个字母“I”,表明为非阻塞调用。调用参数中还多了一个request指针,通过该指针返回非阻塞调用对象的信息,以便后续对非阻塞调用执行等待和查询。
[0103] MPI_Isend的执行流程如图6(b)所示,依次为以下几个步骤:
[0104] (1)将调用参数中给出的消息描述赋值给request所指向的非阻塞对象中的消息描述的相应成员,完成当前非阻塞发送消息的资料备份,流程进入第(2)步。
[0105] (2)查询发送上下文中的信号量,如果信号量值不为0,则进入第(3)步,否则进入第(5)步。
[0106] (3)判断是否产生发送超时,如果发送超时,流程进入第(4)步,如果没超时流程进入第(2)步。本步骤中根据已经对信号量查询的次数来判定是否要产生发送超时,此处连续查询的次数在实现中可以根据需要来适当调整。
[0107] (4)将状态信息中的调用类型成员设置为MPI_NonblockingSend(非阻塞发送),完成标志设置为0(返回0值,表示未完成通信),执行状态设置为MPI_UnStart(未启动),流程进入第(8)步。
[0108] (5)将调用MPI_Isend时给出的消息描述全部赋值给发送上下文的相应成员,完成发送消息描述,流程进入第(6)步。
[0109] (6)设置信号量值为1,消息正式发出,流程进入第(6)步。
[0110] (7)将状态信息中的调用类型成员设置为MPI_NonblockingSend(非阻塞发送),完成标志设置为0(返回0值,表示未完成通信),执行状态设置为MPI_InTransmiting(正在传输),流程进入第(8)步。
[0111] (8)调用返回。
[0112] 从以上的非阻塞发送流程可以看出,非阻塞发送调用的返回不能保证消息已经成功发送,调用的返回要么发生在第(4)步,要么发生在第(7)步。发生在第(4)步的返回是因为发送通道一直被占用,产生了发送超时,而本项发明没有考虑对多发送任务的支持,后一个发送任务必须等到前一个发送任务完成之后才能执行,发送调用如果从第(4)步返回,消息发送请求实际上并没有得到执行,只是对当前的发送调用及其状态进行了标注,程序设计人员可以通过调用LMPI_Wait来完成该调用,或者用MPI_Test来查询该调用的状态。MPI_Wait和MPI_Test调用的具体实施方案将在后文详细说明。非阻塞发送调用执行后的状态尚未明确之前,不能对发送缓冲区的数据进行读操作,以免造成数据丢失或错误。
[0113] 5.消息接收
[0114] 消息接收分为阻塞式接收和非阻塞式接收两种;阻塞式接收是指在调用发起之后一直到消息全部接收完成才返回的调用;非阻塞式接收是指调用发起之后可以立即返回的调用,但是调用返回并不意味着消息已经全部接收到本地;
[0115] 阻塞式接收调用原型为MPI_Recv(void*buf,int  count,MPI_Datatype datatype,int source,int tag,MPI_Context*context),其中的参数:
[0116] buf为接收消息的缓冲区指针,即接收消息存放在内存中的起始地址;
[0117] count为待接收消息的长度,该长度的单位由数据类型决定,且必须大于等于发送方的发送长度,消息才能被正确接收;
[0118] datatype为待接收消息的数据类型,可以支持例如字符型的字节数据,短整型的半字数据,整型和单精度浮点型的字数据等,具体根据系统需要来设计;
[0119] source为接收消息的来源的进程编号;
[0120] tag为接收消息的标志,以整型数据的形式给出,该标志必须与发送方发送本消息时给出的标志相同;
[0121] context向调用传递分布式上下文结构体的指针,消息接收时以便通过该指针来寻址分布式上下文信息;
[0122] MPI_Recv的执行流程如图7(a)所示,实现中根据参数context访问本进程以及发送进程的分布式上下文,依次执行以下步骤:
[0123] (1)根据调用MPI_Recv给出的源进程号获取源端的发送上下文(总共六个成员分量),并赋值给本地内存中的接收上下文的相应成员。
[0124] (2)检查从源端获取的信号量,如果获取的信号量值为0,则返回第(1)步骤,重新获取源端的发送上下文;如果信号量为1,则进入第(3)步。
[0125] (3)用本地内存中的接收上下文和调用中给出的参数进行消息匹配检查,如果不匹配,则该消息不是发给本节点的,流程返回到第(1)步;如果匹配,则该消息是发给本地节点的消息,流程进入第(4)步。
[0126] (4)根据接收调用中的参数以及接收上下文信息,直接读取源节点内存中的消息到本地内存空间,完成消息传输之后流程进入第(5)步。
[0127] (5)设置发送方的发送上下文中的信号量值为0,流程进入第(6)步。
[0128] (6)调用返回。
[0129] 为了实现核内进程与消息传递的重叠执行,以进一步提升系统的处理性能,本项发明还提供一种非阻塞消息接收的实现方法,其调用原型为MPI_Irecv(void*buf,int count,MPI_Datatype datatype,int source,int tag,MPI_Context*context,MPI_Request*request)。该调用与MPI_Recv相比在名称上多了一个字母“I”,表明为非阻塞调用。调用参数中还多了一个request指针,通过该指针返回非阻塞调用对象的信息,以便后续对非阻塞调用执行等待和查询。
[0130] MPI_Irecv的执行流程如图7(b)所示,依次分为以下几个步骤:
[0131] (1)将调用参数中给出的消息描述赋值给request所指向的非阻塞对象中的消息描述的相应成员,完成当前非阻塞接收消息的资料备份,流程进入第(2)步。
[0132] (2)根据源进程编号获取源进程的发送上下文,并将收到的发送上下文赋值给本地进程接收上下文的对应成员,流程进入第(3)步。
[0133] (3)如果收到的对方信号量值不为1,则进入第(4)步,否则进入第(5)步。
[0134] (4)判断是否产生接收超时,如果接收超时,流程进入第(6)步,如果没超时流程进入第(2)步。本步骤中根据已经执行的获取源进程的发送上下文次数来判定是否要产生发送超时,此处连续获取的次数在实现中可以根据需要来适当调整。
[0135] (5)将本地接收上下文中的信息与接收调用时的消息描述进行匹配检查。如果有不匹配项,表明对方发送的消息不是发给本进程的,流程进入第(6)步,如果接收上下文中获取的信息与接收调用时的描述完全匹配,表明该消息为本进程需要接收的消息,流程进入第(7)步。
[0136] (6)将状态信息中的调用类型成员设置为MPI_NonblockingRecv(非阻塞接收),完成标志设置为0(返回0值,表示未完成通信),执行状态设置为MPI_UnStart(未启动),流程进入第(9)步。
[0137] (7)根据接收调用中的参数以及接收上下文信息,发起对源节点内存中的消息的读操作,流程立即进入第(8)步。
[0138] (8)将状态信息中的调用类型成员设置为MPI_NonblockingRecv(非阻塞接收),完成标志设置为0(返回0值,表示未完成通信),执行状态设置为MPI_InTransmiting(正在传输),流程进入第(9)步。
[0139] (9)调用返回。
[0140] 从以上的流程可以看出,非阻塞接收调用的返回不能保证消息已经成功发送,调用的返回要么发生在第(6)步,要么发生在第(8)步。发生在第(6)步的返回是因为发送方一直没有发出本进程要接收的数据而产生了接收超时,或者因为发送方发出的消息不是本进程要接收的消息。发生在第(6)步的返回,消息接收请求实际上并没有得到执行,只是对当前的接收调用及其状态进行了标注,程序设计人员可以通过调用MPI_Wait来等待消息完成,或者调用MPI_Test来查询该调用的状态。非阻塞接收时发送方信号量的清0是在接收方调用MPI_Wait或MPI_Test来实现的,当接收方调用MPI_Wait或MPI_Test时,如果检测到传输已经完成,会自动将发送方的信号量设置为0,向发送进程表明接收进程完成消息接收。
[0141] 6.等待完成
[0142] 等待完成调用为MPI_Wait,功能是等待一个非阻塞调用的完成,它的调用原型为MPI_Wait(MPI_Request*request,MPI_Status*status),其中的参数request为非阻塞调用指针,通过该指针可以获取非阻塞调用的状态信息;status向MPI_Wait传递一个返回状态的指针。
[0143] MPI_Wait的执行流程如图8所示,依次分为以下几个步骤:
[0144] (1)根据句柄值request查询执行状态,如果当前执行状态为MPI_InTransmiting(正在传输),流程进入第(2)步;如果当前执行状态为MPI_UnStart(未启动),则流程进入第(3)步;如果当前执行状态为MPI_TransCompleted(传输已完成),流程进入第(9)步。
[0145] (2)检测硬件的传输状态,直到传输完成,流程进入(4)步。
[0146] (3)查询调用类型,如果调用类型为MPI_NonblockingReceive(非阻塞接收),则流程进入第(5)步,如果调用类型为MPI_NonblockingSend(非阻塞发送),流程直接进入第(6)步。
[0147] (4)查询调用类型,如果调用类型为MPI_NonblockingReceive(非阻塞接收),流程进入第(7)步,否则进入第(8)步。
[0148] (5)根据request指向的非阻塞调用对象的消息描述备份信息,执行一次阻塞接收,流程进入第(7)步。
[0149] (6)根据request指向的非阻塞调用对象的消息描述备份信息,执行一次阻塞发送,流程进入第(8)步。
[0150] (7)设置发送方信号量为0,流程进入第(8)步。
[0151] (8)设置状态信息中的完成标志为1(返回1表示传输完成),status指向的状态值设置为MPI_TransCompleted(传输已完成),流程进入第(9)步。
[0152] (9)调用返回。
[0153] 7.状态检测
[0154] 状态检测调用为MPI_Test,它的功能是检测非阻塞调用的执行状态,调用原型为MPI_Test(MPI_Request*request,int*flag,MPI_Status*status),其中参数request为非阻塞调用对象指针;flag传递一个调用是否成功完成的标志的指针;status为返回状态的指针。
[0155] MPI_Test的执行流程如图9所示,依次分为以下几个步骤:
[0156] (1)根据句柄值request查询执行状态,如果当前执行状态为MPI_InTransmiting(正在传输),流程进入第(2)步;如果当前执行状态为MPI_UnStart(未启动),流程进入第(3)步;如果当前执行状态为MPI_TransCompleted(传输已完成),流程进入第(6)步。。
[0157] (2)检测硬件的传输状态,如果传输已经完成,流程进入第(4)步,如果传输没有完成,流程进入第(5)步。
[0158] (3)将flag指向的标志值设置为0,流程进入第(6)步。
[0159] (4)设置flag指向的标志值为1,status指向的状态值设置为MPI_TransCompleted(传输已完成),流程进入第(6)步。
[0160] (5)将flag指向的标志值设置为0,status指向的状态值设置为MPI_InTransmiting(正在传输),流程进入第(6)步。
[0161] (6)调用返回。
[0162] 8.进程同步
[0163] 本项发明中进程同步调用原型为MPI_Barrier(MPI_Context*context),它的功能是同步所有进程,只有当所有的进程都运行了MPI_Barrier的调用时,各个进程才能继续往后执行,先到达MPI_Barrier调用处的进程必须等待。MPI_Barrier实现时需要调用前面所述的阻塞发送和阻塞接收功能。MPI_Barrier内部首先执行一个从Node0开始的空消息(无消息内容,只传递消息描述信息)环状传递,即Node0向Node1进程发送一个长度为0的消息,Node1接收到该消息之后发送给Node2,各个进程依次传递,直到最后一个进程将空消息传回给Node0,这时可以判断各个进程都已经执行到MPI_Barrier调用处。Node0进程接收到最后返回的空消息之后再次向各个进程广播发送一个空消息并从MPI_Barrier调用返回,继续执行后续任务。各个进程接收到Node0广播的空消息之后也从MPI_Barrier调用返回,继续执行后续任务。
[0164] 9.并行环境结束
[0165] 本项发明中并行环境的结束调用为MPI_Finalize,它的功能是结束MPI的并行进程,调用原型为MPI_Finalize()。执行MPI_Finalize后由MPI_Init创建的所有进程都被撤销,只保留Node0进程继续运行。非Node0的进程调用MPI_Finalize时向Node0发送一个消息,表明自己的任务已经全面完成,随后一直等待Node0接收该消息并将自己从并行环境中结束掉。Node0进程调用MPI_Finalize时,逐个查询其它进程,如果接收到其它进程的结束信息,则对相应的进程作必要的结束处理。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈