一种适用于大规模分布式水文模拟的并行方法转让专利

申请号 : CN201910116373.8

文献号 : CN109918740B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 吴佳豪胡长军储根深李扬吴彦飞

申请人 : 北京科技大学

摘要 :

本发明提供一种适用于大规模分布式水文模拟的并行方法,能够提高使用时空离散并行策略进行分布式水文模拟的计算速度。所述方法包括:获取待模拟流域,其中,所述待模拟流域包括:多个子流域;采用时空离散并行策略,在空间上对所述待模拟流域的各个子流域进行静态任务划分,将所述待模拟流域的多个子流域的水文模拟任务分配到多个处理器核上并行执行;其中,单个子流域在某个模拟时刻的水文模拟计算过程作为并行化执行的任务单元;静态任务划分下,单个处理器核上的进程用于执行被分配到本进程上的所有子流域在所有时刻上的水文模拟任务,进程间采用非阻塞通信方式传递数据。本发明涉及水文模拟领域。

权利要求 :

1.一种适用于大规模分布式水文模拟的并行方法,其特征在于,包括:获取待模拟流域,其中,所述待模拟流域包括:多个子流域;

采用时空离散并行策略,在空间上对所述待模拟流域的各个子流域进行静态任务划分,将所述待模拟流域的多个子流域的水文模拟任务分配到多个处理器核上并行执行;

其中,单个子流域在某个模拟时刻的水文模拟计算过程作为并行化执行的任务单元;

静态任务划分下,单个处理器核上的进程用于执行被分配到本进程上的所有子流域在所有时刻上的水文模拟任务,进程间采用非阻塞通信方式传递数据;

其中,所述单个处理器核上的进程用于执行被分配到本进程上的所有子流域在所有时刻上的水文模拟任务包括:A11,根据任务分配结果,读取分配到本进程上的子流域在进行水文模拟任务时所需要的输入数据;

A12,初始化消息接收池、消息发送池、汇流数据容器和各个子流域当前模拟时刻,其中,每个子流域对应一个汇流数据容器;

A13,基于进程间点对点非阻塞通信,使用消息接收池中的所有空闲载体监听接收汇流数据;

A14,将接收到的所有汇流数据存入相应的子流域的汇流数据容器;

A15,遍历本进程上的所有子流域的汇流数据容器,获取在当前模拟时刻下已满足计算依赖的可执行子流域;

A16,执行可执行子流域在当前模拟时刻的水文模拟任务,得到该可执行子流域在当前模拟时刻要传递给下游子流域的汇流数据;

A17,基于进程间点对点非阻塞通信,使用消息发送池中的所有空闲载体监听发送要传递给下游子流域的汇流数据;

A18,将该可执行子流域的当前模拟时刻自增一;

A19,判断本进程上的所有子流域是否都已完成了预设个模拟时刻的水文模拟任务;若都已完成,保存本进程上所有子流域在所有时刻的水文模拟计算结果;否则,返回步骤A13继续执行。

2.根据权利要求1所述的适用于大规模分布式水文模拟的并行方法,其特征在于,在静态任务划分下,各个进程采用对等模式执行被分配到本进程上的所有子流域在所有时刻上的水文模拟任务。

3.根据权利要求1所述的适用于大规模分布式水文模拟的并行方法,其特征在于,所述初始化消息接收池、消息发送池、汇流数据容器和各个子流域当前模拟时刻包括:初始化一个含有空闲载体的消息接收池和一个含有空闲载体的消息发送池;

为本进程上的所有子流域各初始化一个以模拟时刻Tj为关键字的字典形式的汇流数据容器,所述汇流数据容器用于保存从直接上游子流域在不同时刻发送过来的汇流数据;

将分配到本进程上的所有子流域的当前模拟时刻Tj置为第一预设值。

4.根据权利要求1所述的适用于大规模分布式水文模拟的并行方法,其特征在于,所述基于进程间点对点非阻塞通信,使用消息接收池中的所有空闲载体监听接收汇流数据包括:选取消息接收池中所有的空闲载体,使用该些空闲载体作为调用非阻塞点对点接收函数的数据缓存区来监听接收其它进程发送过来的汇流数据,同时将这些载体的状态设置为非空闲。

5.根据权利要求1所述的适用于大规模分布式水文模拟的并行方法,其特征在于,所述将接收到的所有汇流数据存入相应的子流域的汇流数据容器包括:遍历消息接收池中的所有非空闲载体,判断上次使用该载体进行的非阻塞通信数据接收操作是否已经完成;

若已完成,则说明该载体已接收到有效汇流数据;

解析所有接收的有效汇流数据,依次存入相应子流域的汇流数据容器的相应模拟时刻的汇流数据块中;

将这些接收到有效汇流数据的载体的状态重新置为空闲;

其中,汇流数据容器中保存的每个汇流数据块由2个字段组成,第一字段用于标识本汇流数据容器所对应的子流域有几个直接上游子流域还未将当前模拟时刻的汇流数据传递过来;第二字段用于标识本汇流数据容器所对应的子流域的直接上游子流域已传递过来的当前模拟时刻的汇流数据的加和。

6.根据权利要求1所述的适用于大规模分布式水文模拟的并行方法,其特征在于,所述遍历本进程上的所有子流域的汇流数据容器,获取在当前模拟时刻下已满足计算依赖的可执行子流域包括:遍历本进程上的所有子流域的汇流数据容器中的汇流数据条目,若某个子流域的汇流数据容器在其当前模拟时刻Tj的汇流数据块中的第一字段的值为第二预设值,则说明该子流域在Tj时刻的水文模拟计算任务可以执行,该子流域为可执行子流域;否则,返回步骤A13继续执行。

7.根据权利要求1所述的适用于大规模分布式水文模拟的并行方法,其特征在于,所述执行可执行子流域在当前模拟时刻的水文模拟任务,得到该可执行子流域在当前模拟时刻要传递给下游子流域的汇流数据包括:从该可执行子流域所对应的汇流数据容器中取出当前模拟时刻的上游汇流数据,使用已获取的上游汇流数据,执行该可执行子流域在当前模拟时刻的水文模拟任务,得到该可执行子流域在当前模拟时刻要传递给下游子流域的汇流数据。

8.根据权利要求1所述的适用于大规模分布式水文模拟的并行方法,其特征在于,所述基于进程间点对点非阻塞通信,使用消息发送池中的所有空闲载体监听发送要传递给下游子流域的汇流数据包括:遍历消息发送池中的所有非空闲载体,判断上次使用该载体进行的非阻塞通信数据发送操作是否已经完成;

若完成,则将该载体的状态置为空闲;

在消息发送池中选择所有空闲载体,将步骤A16中要传递给下游子流域的汇流数据拷贝到该空闲载体中;

使用该空闲载体作为调用非阻塞点对点发送函数的数据缓存区来向下游子流域所在进程发送汇流数据,同时将该载体的状态设置为非空闲。

说明书 :

一种适用于大规模分布式水文模拟的并行方法

技术领域

[0001] 本发明涉及水文模拟领域,特别是指一种适用于大规模分布式水文模拟的并行方法。

背景技术

[0002] 水文模拟是用于模拟自然界降雨、下渗、土壤蒸发、植物蒸腾、积雪融化、河网汇流等复杂水循环物理过程的技术,其作为水资源开发利用、防洪减灾、水库管理、道路修建、城市规划、点源污染评价、人类活动的流域响应等领域的支柱,与人类的生存息息相关。当下水文模拟中使用得最广泛的模拟方式是分布式模拟,分布式水文模拟根据河网流向等因素将待研究流域划分为若干个小的计算单元(也称为:子流域)后,分别在各个子流域内将各种复杂物理过程如降水、下渗、蒸发、植物蒸腾、融雪等自然现象以数学模型的方式进行模拟计算,最后再将各个子流域上的模拟结果按照河网汇流关系进行汇总得到整个待研究流域的模拟结果。然而作为预测类的应用技术,分布式水文模拟在大空间规模、大时间规模、多复杂物理过程背景下的计算速度受到了单核处理器的严重限制。
[0003] 为了提高水文模拟的计算速度,保证其计算的及时性和时效性,引入了高性能计算技术,尝试利用多核处理器来并行化分布式水文模拟的计算过程。现有的并行化分布式水文模拟的相关研究中,大多数仅仅只考虑了分布式水文模拟空间上的可并行性,即可将无依赖关系的多个子流域的分配到多个处理器核上并行执行,然而水文模拟上下子流域间的河网汇流关系决定了子流域间的强空间依赖性,使得水文模拟的计算过程越进行到流域的出口子流域时可并行执行的子流域个数越少而浪费了大量的处理器资源,分布式水文模拟的该种特性严重限制了仅对水文模拟进行空间分解的并行化方式的并行加速效果;极少数相关研究在对水文模拟进行空间离散并行的基础上,进一步从时间角度上考虑了分布式水文模拟的可并行性,即某个上游子流域完成t1时刻的计算后,其自身下一时刻t2的计算与其下游子流域t1时刻的计算可以同时进行,该种时空离散并行策略大大加快了大规模分布式水文模拟的计算过程,然而现阶段该策略在实现时所采用的任务分配方式是动态任务分配,通信方式是阻塞通信方式:由主进程负责将不同子流域在不同时刻的水文模拟子任务分配到不同从进程上去执行,该情况下单个子流域的不同时刻的模拟计算任务可能会被分配到不同从进程上去执行,从进程需要频繁和主进程进行阻塞通信来获取进行模拟计算时所需要的数据,造成了较多的通信等待消耗从而影响了时空离散并行策略的加速效果。

发明内容

[0004] 本发明要解决的技术问题是提供一种适用于大规模分布式水文模拟的并行方法,以解决现有技术所存在的使用动态任务分配和阻塞通信时由于进程间频繁通信而造成的处理器资源的额外消耗的问题。
[0005] 为解决上述技术问题,本发明实施例提供一种适用于大规模分布式水文模拟的并行方法,包括:
[0006] 获取待模拟流域,其中,所述待模拟流域包括:多个子流域;
[0007] 采用时空离散并行策略,在空间上对所述待模拟流域的各个子流域进行静态任务划分,将所述待模拟流域的多个子流域的水文模拟任务分配到多个处理器核上并行执行;
[0008] 其中,单个子流域在某个模拟时刻的水文模拟计算过程作为并行化执行的任务单元;静态任务划分下,单个处理器核上的进程用于执行被分配到本进程上的所有子流域在所有时刻上的水文模拟任务,进程间采用非阻塞通信方式传递数据。
[0009] 进一步地,在静态任务划分下,各个进程采用对等模式执行被分配到本进程上的所有子流域在所有时刻上的水文模拟任务。
[0010] 进一步地,所述单个处理器核上的进程用于执行被分配到本进程上的所有子流域在所有时刻上的水文模拟任务包括:
[0011] A11,根据任务分配结果,读取分配到本进程上的子流域在进行水文模拟任务时所需要的输入数据;
[0012] A12,初始化消息接收池、消息发送池、汇流数据容器和各个子流域当前模拟时刻,其中,每个子流域对应一个汇流数据容器;
[0013] A13,基于进程间点对点非阻塞通信,使用消息接收池中的所有空闲载体监听接收汇流数据;
[0014] A14,将接收到的所有汇流数据存入相应的子流域的汇流数据容器;
[0015] A15,遍历本进程上的所有子流域的汇流数据容器,获取在当前模拟时刻下已满足计算依赖的可执行子流域;
[0016] A16,执行可执行子流域在当前模拟时刻的水文模拟任务,得到该可执行子流域在当前模拟时刻要传递给下游子流域的汇流数据;
[0017] A17,基于进程间点对点非阻塞通信,使用消息发送池中的所有空闲载体监听发送要传递给下游子流域的汇流数据;
[0018] A18,将该可执行子流域的当前模拟时刻自增一;
[0019] A19,判断本进程上的所有子流域是否都已完成了预设个模拟时刻的水文模拟任务;若都已完成,保存本进程上所有子流域在所有时刻的水文模拟计算结果;否则,返回步骤A13继续执行。
[0020] 进一步地,所述初始化消息接收池、消息发送池、汇流数据容器和各个子流域当前模拟时刻包括:
[0021] 初始化一个含有空闲载体的消息接收池和一个含有空闲载体的消息发送池;
[0022] 为本进程上的所有子流域各初始化一个以模拟时刻Tj为关键字的字典形式的汇流数据容器,所述汇流数据容器用于保存从直接上游子流域在不同时刻发送过来的汇流数据;
[0023] 将分配到本进程上的所有子流域的当前模拟时刻Tj置为第一预设值。
[0024] 进一步地,所述基于进程间点对点非阻塞通信,使用消息接收池中的所有空闲载体监听接收汇流数据包括:
[0025] 选取消息接收池中所有的空闲载体,使用该些空闲载体作为调用非阻塞点对点接收函数的数据缓存区来监听接收其它进程发送过来的汇流数据,同时将这些载体的状态设置为非空闲。
[0026] 进一步地,所述将接收到的所有汇流数据存入相应的子流域的汇流数据容器包括:
[0027] 遍历消息接收池中的所有非空闲载体,判断上次使用该载体进行的非阻塞通信数据接收操作是否已经完成;
[0028] 若已完成,则说明该载体已接收到有效汇流数据;
[0029] 解析所有接收的有效汇流数据,依次存入相应子流域的汇流数据容器的相应模拟时刻的汇流数据块中;
[0030] 将这些接收到有效汇流数据的载体的状态重新置为空闲;
[0031] 其中,汇流数据容器中保存的每个汇流数据块由2个字段组成,第一字段用于标识本汇流数据容器所对应的子流域有几个直接上游子流域还未将当前模拟时刻的汇流数据传递过来;第二字段用于标识本汇流数据容器所对应的子流域的直接上游子流域已传递过来的当前模拟时刻的汇流数据的加和。
[0032] 进一步地,所述遍历本进程上的所有子流域的汇流数据容器,获取在当前模拟时刻下已满足计算依赖的可执行子流域包括:
[0033] 遍历本进程上的所有子流域的汇流数据容器中的汇流数据条目,若某个子流域的汇流数据容器在其当前模拟时刻Tj的汇流数据块中的第一字段的值为第二预设值,则说明该子流域在Tj时刻的水文模拟计算任务可以执行,该子流域为可执行子流域;否则,返回步骤A13继续执行。
[0034] 进一步地,所述执行可执行子流域在当前模拟时刻的水文模拟任务,得到该可执行子流域在当前模拟时刻要传递给下游子流域的汇流数据包括:
[0035] 从该可执行子流域所对应的汇流数据容器中取出当前模拟时刻的上游汇流数据,使用已获取的上游汇流数据,执行该可执行子流域在当前模拟时刻的水文模拟任务,得到该可执行子流域在当前模拟时刻要传递给下游子流域的汇流数据。
[0036] 进一步地,所述基于进程间点对点非阻塞通信,使用消息发送池中的所有空闲载体监听发送要传递给下游子流域的汇流数据包括:
[0037] 遍历消息发送池中的所有非空闲载体,判断上次使用该载体进行的非阻塞通信数据发送操作是否已经完成;
[0038] 若完成,则将该载体的状态置为空闲;
[0039] 在消息发送池中选择所有空闲载体,将步骤A16中要传递给下游子流域的汇流数据拷贝到该空闲载体中;
[0040] 使用该空闲载体作为调用非阻塞点对点发送函数的数据缓存区来向下游子流域所在进程发送汇流数据,同时将该载体的状态设置为非空闲。
[0041] 本发明的上述技术方案的有益效果如下:
[0042] 上述方案中,获取待模拟流域,其中,所述待模拟流域包括:多个子流域;采用时空离散并行策略,在空间上对所述待模拟流域的各个子流域进行静态任务划分,将所述待模拟流域的多个子流域的水文模拟任务分配到多个处理器核上并行执行;这样,利用静态任务划分和非阻塞通信方式进行分布式水文模拟,减少了进程间通信上的额外消耗,且避免了使用阻塞通信造成的进程间相互等待所造成的额外消耗,从而能够提高使用时空离散并行策略分布式水文模拟的计算速度。

附图说明

[0043] 图1为本发明实施例提供的适用于大规模分布式水文模拟的并行方法的流程示意图;
[0044] 图2为本发明实施例提供的分布式水文模拟子流域时空依赖关系示意图;
[0045] 图3为本发明实施例提供的静态任务划分下水文模拟时空离散并行策略中的汇流过程示意图;
[0046] 图4为本发明实施例提供的使用非阻塞通信消息池收发汇流数据的示意图;
[0047] 图5为本发明实施例提供的单个进程执行水文模拟任务的流程示意图。

具体实施方式

[0048] 为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
[0049] 本发明针对现有的使用动态任务分配和阻塞通信时由于进程间频繁通信而造成的处理器资源的额外消耗的问题,提供一种适用于大规模分布式水文模拟的并行方法。
[0050] 实施例一
[0051] 如图1所示,本发明实施例提供的适用于大规模分布式水文模拟的并行方法[0052] S101,获取待模拟流域,其中,所述待模拟流域包括:多个子流域;
[0053] S102,采用时空离散并行策略,在空间上对所述待模拟流域的各个子流域进行静态任务划分,将所述待模拟流域的多个子流域的水文模拟任务分配到多个处理器核上并行执行;
[0054] 其中,单个子流域在某个模拟时刻的水文模拟计算过程作为并行化执行的任务单元;静态任务划分下,单个处理器核上的进程用于执行被分配到本进程上的所有子流域在所有时刻上的水文模拟任务,进程间采用非阻塞通信方式传递数据。
[0055] 本发明实施例所述的适用于大规模分布式水文模拟的并行方法,获取待模拟流域,其中,所述待模拟流域包括:多个子流域;采用时空离散并行策略,在空间上对所述待模拟流域的各个子流域进行静态任务划分,将所述待模拟流域的多个子流域的水文模拟任务分配到多个处理器核上并行执行;这样,利用静态任务划分和非阻塞通信方式进行分布式水文模拟,减少了进程间通信上的额外消耗,且避免了使用阻塞通信造成的进程间相互等待所造成的额外消耗,从而能够提高使用时空离散并行策略分布式水文模拟的计算速度。
[0056] 为了更好地理解本发明实施例,对单处理器核、多处理器核、多核处理器和单核处理器进行简要说明:
[0057] 单处理器核是单个处理器核的简称,多处理器核是多个处理器核的简称。进程依赖于处理器核的计算资源,一个处理器核(不含超线程技术)同一时刻只能执行一个进程,但是多个进程可以并发在一个处理器核上交替执行(并发是多个进程交替占用处理器核,同一时刻还是只有一个任务在跑;并行是多个进程同时执行)。
[0058] 处理器分为多核处理器和单核处理器,多核处理器中含有多个处理器核,单核处理器只含有一个处理器核;所以,单处理器核指的是处理器中的一个处理器核,而单核处理器则是只含有一个核的处理器。多处理器核指的是多个处理器核(这些核可能在不同处理器上),而多核处理器指的是一个含有多个核的处理器。
[0059] 为了更好地理解本发明实施例所述的适用于大规模分布式水文模拟的并行方法,先简单介绍一下分布式水文模拟子流域时空依赖关系,如图2所示,图2以一个划分为了7个子流域的待模拟流域为例,说明了分布式水文模拟的执行过程以及执行过程中各个子流域在各个时刻的依赖关系。图2中,该待模拟流域中的所有子流域在初始时刻t0下,进行N个时刻的模拟计算最终得到这些子流域在tN时刻的状态。每个子流域在ti时刻的模拟计算在空间上依赖于其直接上游子流域在ti时刻的模拟计算结果(如7号子流域在t2时刻的计算依赖于4号、6号子流域在t2时刻的计算结果),在时间上又依赖于自身前一时刻ti-1的状态(如7号子流域在t2时刻的计算还依赖于7号子流域在t1时刻的状态)。
[0060] 本实施例中,根据分布式水文模拟子流域时空依赖关系,基于时空离散并行策略,在空间和时间这两个尺度上去对分布式水文模拟进行任务分解,即将单个子流域在某个模拟时刻的水文模拟计算过程作为并行化执行的任务单元;其中,图2中除了初始模拟时刻t0以外的其它圆圈都代表特定子流域在特定模拟时刻下的一个水文模拟计算任务单元,在时间和空间上都无依赖关系的这些任务单元可以被分配到不同进程上去并行执行。
[0061] 本实施例中,在采用时空离散并行策略的同时,为避免采用动态任务划分而导致单个子流域的不同时刻的模拟计算过程被分配到不同进程上去执行而产生的额外通信消耗,对待模拟流域的各个子流域在空间上进行静态任务划分得到子流域模拟任务分配结果,即将多个子流域的水文模拟任务分配到多个处理器核上去并行执行,其中,可以利用第三方图划分算法(例如,METIS图划分软件)在空间上对待模拟流域的各个子流域的水文模拟任务进行静态任务划分。。静态任务划分下,单个处理器核上的进程负责被分配到本进程上的所有子流域在所有时刻上的水文模拟任务。
[0062] 本实施例中,为实现静态任务划分下的分布式水文模拟的时空离散并行化,本实施例提出以模拟时刻Ti为关键字(key,键)的字典形式的汇流数据容器(如图3所示,在静态任务划分方式下,使用自定义的汇流数据容器来保存不同进程上各个子流域在不同时刻进行水文模拟计算时所需要的直接上游子流域发送的汇流数据)来实现静态任务划分下的时空离散并行策略:每个子流域都对应一个这样的汇流数据容器,用于保存其直接上游子流域在不同时刻发送过来的汇流数据。同时,本实施例考虑到非阻塞通信必须需要保证收发双方进程正式完成数据的接收后水文模拟过程才能继续执行,会造成进程间相互等待从而浪费处理器资源,本实施例在对分布式水文模拟时空离散并行策略进行静态任务划分的前提下,对非阻塞通信标准中的非阻塞点对点通信函数进行封装提出非阻塞通信消息池这一数据结构(如图4所示),使得进程间传输汇流数据通过该消息池结构可快速高效地进行。
[0063] 图4是使用自定义的非阻塞消息池数据结构,在不同进程间收发汇流数据的示意图。消息池是由多个载体组成的可动态扩容和可复用的容器,消息池中的载体用于为进程间使用非阻塞点对点通信函数收发汇流数据时的内存缓存区。消息池中每个载体均有一个空闲与否的标识字段Ft,当Ft为1说明该载体空闲即可被用于进行非阻塞通信,当Ft为0则说明该载体非空闲即正在被用于进行非阻塞通信。
[0064] 如图4所示,本实施例中的非阻塞消息池根据用途的不同,进一步分为消息接收池和消息发送池。每当某个进程中有子流域需要往其下游子流域所在进程发送汇流数据时,可在消息发送池中选取空闲载体(即Ft为1的载体)作为调用非阻塞点对点发送函数(MPI_Isend)发送该汇流数据时的数据缓存区。每当某个进程中有子流域需要接收其上游子流域所在进程发送的汇流数据时,可选取消息接收池中的空闲载体(即Ft为1的载体)作为调用非阻塞点对点接收函数(MPI_Irecv)来监听接收从其它进程发送过来的汇流数据的数据缓存区。
[0065] 如图3所示,采用时空离散并行策略,将一个含有8个子流域的待模拟流域的水文模拟任务划分到3个进程上去并行执行,图3中,进程P1负责3号、4号和5号子流域在所有时刻的水文模拟计算。P1将为这3个子流域各初始化一个以模拟时刻Ti为key的字典形式的汇流数据容器,分别用于保存该3个子流域的直接上游子流域在不同时刻传递过来的汇流数据。如图2所示,汇流数据容器中保存的每个汇流数据块由2个字段组成:fTagi字段(第一字段)用于标识本汇流数据容器所对应的子流域还有几个直接上游子流域还未将Ti模拟时刻的汇流数据传递过来;fDatai字段是本汇流数据容器所对应的子流域的直接上游子流域已传递过来的Ti模拟时刻的汇流数据的加和(在图3中,6号、7号和8号这3个子流域中已有2个子流域将Tk时刻的汇流数据传递给了5号子流域)。直接上游子流域传递给下游子流域的单个汇流数据块由3个字段组成:字段T用于标识本汇流数据是上游子流域在哪个模拟时刻产生的;字段nid用于标识本汇流数据具体需要传递给哪个下游子流域;字段newfData则是真正的由上游子流域在时刻T产生的需要传递给nid子流域用于计算的汇流数据。
[0066] 本实施例中的时空离散并行化水文模拟策略,在使用静态任务划分的前提下,各个进程将采用对等模式来负责待模拟流域中被分配到本进程上的所有子流域在所有时刻上的水文模拟任务,即每个进程采用如图5所示的执行流程来执行子流域的水文模拟计算任务,同时每个进程将使用如图3示的以模拟时刻为key的字典形式的汇流数据容器来保存不同时刻的由上游传递过来的汇流数据,使用如图4所示的消息池数据结构来进行汇流数据的非阻塞接收与发送。
[0067] 本实施例中,结合图3、4、5,对单个进程执行被分配到本进程上的所有子流域在所有时刻上的水文模拟任务的具体步骤进行说明,具体可以包括以下步骤:
[0068] A11,读取输入数据:根据任务分配结果,读取分配到本进程Pi上的子流域在进行水文模拟任务时所需要的输入数据,其中,进程Pi泛指所有进程中的任意进程,被分配到进程Pi上的子流域都有一个当前模拟时刻Tj,用于标识该子流域上的水文模拟过程当前进行到了哪个时刻。
[0069] 本实施例中,所述输入数据指的是进行水文模拟计算时需要的一些外界输入数据,例如,降雨,气温,土壤状态等数据。
[0070] A12,初始化消息接收池、消息发送池、汇流数据容器和各个子流域当前模拟时刻,其中,每个子流域对应一个汇流数据容器。
[0071] 本实施例中,初始化一个含有一定个数空闲载体的消息接收池和一个含有一定个数空闲载体的消息发送池。
[0072] 本实施例中,为本进程上的所有子流域各初始化一个以模拟时刻Tj为key的字典形式的的汇流数据容器,所述汇流数据容器用于保存从直接上游子流域在不同时刻发送过来的汇流数据。
[0073] 本实施例中,将分配到本进程上的所有子流域的当前模拟时刻Tj置为第一预设值,例如,1。
[0074] A13,基于进程间点对点非阻塞通信,使用消息接收池中的所有空闲载体监听接收汇流数据。
[0075] 本实施例中,选取消息接收池中所有的空闲载体(Ft为1(空闲)的载体,无空闲载体时可新生成一个空闲载体),使用这些空闲载体作为调用非阻塞点对点接收函数(即MPI_Irecv函数)的数据缓存区来监听接收其它进程发送过来的汇流数据,同时将这些载体的Ft字段置为0(非空闲)。
[0076] A14,将接收到的所有汇流数据存入相应的子流域的汇流数据容器。
[0077] 本实施例中,遍历消息接收池中的所有非空闲载体(Ft为0的载体),判断上次使用该载体进行的非阻塞通信数据接收操作是否已经完成;若已完成,则说明该载体已接收到有效汇流数据;解析所有接收的有效汇流数据,依次存入相应子流域的汇流数据容器的相应模拟时刻的汇流数据块中(每个汇流数据块中fTag字段(第一字段)的初始值是对应子流域的直接上游子流域的个数,fData字段(第二字段)的初始值是0;后续每汇入一个直接上游子流域的数据,fTag字段就自减一,fData字段则加上接收到的汇流数据中的newfData);然后将这些接收到有效汇流数据的载体的Ft字段重新置为1(空闲)。
[0078] A15,遍历本进程上的所有子流域的汇流数据容器,获取在当前模拟时刻下已满足计算依赖的可执行子流域。
[0079] 本实施例中,遍历本进程上的所有子流域的汇流数据容器中的汇流数据条目,若某个子流域的汇流数据容器在其当前模拟时刻Tj的汇流数据块中的fTag字段为0(第二预设值),说明该子流域的所有直接上游子流域均已完成Tj时刻的计算任务并已将Tj时刻的汇流数据发送了过来,并且该子流域也接收到了这些汇流数据,使得该子流域在Tj时刻的水文模拟计算任务可以执行,该子流域为可执行子流域,可以向下继续执行A16;否则,返回步骤A13继续执行。
[0080] A16,执行可执行子流域在当前模拟时刻的水文模拟任务,得到该可执行子流域在当前模拟时刻要传递给下游子流域的汇流数据。
[0081] 本实施例中,从该可执行子流域所对应的汇流数据容器中取出当前模拟时刻Tj的上游汇流数据,使用已获取的上游汇流数据,执行该可执行子流域在当前模拟时刻Tj的水文模拟任务,得到该可执行子流域在当前模拟时刻Tj要传递给下游子流域的汇流数据。
[0082] A17,基于进程间点对点非阻塞通信,使用消息发送池中的所有空闲载体监听发送要传递给下游子流域的汇流数据。。
[0083] 本实施例中,首先遍历消息发送池中的所有非空闲载体,判断上次使用该载体进行的非阻塞通信数据发送操作是否已经完成,若完成,则将该载体的Ft字段置为1(空闲);然后在消息发送池中选择所有空闲载体(Ft为1的载体,无空闲载体时可新生成一个空闲载体),将步骤A16中要传递给下游子流域的汇流数据拷贝到该空闲载体中;最后使用该载体作为调用非阻塞点对点发送函数(即MPI_Isend函数)的数据缓存区来向下游子流域所在进程发送汇流数据,同时将该载体的Ft字段置为0(非空闲)。
[0084] A18,更新子流域的模拟状态。
[0085] 本实施例中,将该可执行子流域的当前模拟时刻Tj自增一,即Tj=Tj+1。
[0086] A19,判断本进程的水文模拟任务是否结束,若都已完成,则保存本进程上所负责的所有子流域在所有时刻的水文模拟计算结果,否则,返回步骤A13继续执行。
[0087] 本实施例中,水文模拟计算结果可以包括各个子流域在不同模拟时刻的河道流量、土壤湿度等信息;水文模拟作为预测类应用技术,其计算出来的结果被广泛应用于水资源开发利用、防洪减灾、水库管理、道路修建、城市规划、点源污染评价、人类活动的流域响应等领域,使得应用周期缩减、应用精度提高。
[0088] 本实施例中,遍历本进程上的所有子流域的当前模拟时刻Tj,判断本进程上的所有子流域是否都已完成了预设个模拟时刻的水文模拟任务,例如,目标为完成N个模拟时刻的水文模拟任务,则完成时Tj=TN;若都已完成,保存本进程上所有子流域在所有时刻的水文模拟计算结果,本进程的整个执行过程结束;否则,返回步骤A13继续执行。
[0089] 本实施例所述的适用于大规模分布式水文模拟的并行方法具有以下优点:
[0090] 1)可并行性更高:从时间和空间两个尺度上去离散化分布式水文模拟过程,加大了可并行执行的子任务的个数,突破了传统仅在空间尺度上进行任务分解的并行策略的加速效果瓶颈。
[0091] 2)减少了在数据输入/输出和进程间通信上的额外消耗:使用静态任务划分,单个进程只需要读取待模拟流域中的相应部分子流域的输入数据,同时也只需要和与本进程所负责的子流域有直接汇流关系的部分进程进行通信。
[0092] 3)避免了由于使用阻塞通信造成的进程间相互等待所造成的额外消耗:自定义点对点通信消息池数据结构,使用非阻塞通信方式高效可靠地传递汇流数据,使得收发数据时进程无需阻塞等待。
[0093] 需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。
[0094] 以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。