一种流域水环境水生态模拟的并行控制方法及设备

文档序号:33558574发布日期:2023-03-22 13:08阅读:38来源:国知局
一种流域水环境水生态模拟的并行控制方法及设备

1.本发明属于模拟领域,具体涉及一种流域水环境水生态多维多界面多指标全过程模型的多程序高效并行控制方法。


背景技术:

2.随着以有限体积法数值计算为基础的流体力学计算与二三维水动力水质数学模型的不断发展,计算的单元从局部逐渐拓展到流域尺度,流域尺度的模拟计算精度需求越来越高,流域计算网格越来越多,涉及的水动力、水质、水生态过程越来越复杂,进行模拟计算的硬件条件和计算能力的不同,如何灵活架构流域水环境水生态模型的并行控制体系,来适应流域的特征和计算条件,达到计算效率的最大化,是当前流域大尺度水环境水生态模拟计算的重要前提,也是提高模拟能力和效率的重要技术难题。
3.由于流域水环境水生态模拟是一个时空相关性极强、机理错综复杂的过程,计算网格之间紧密耦合,并行子单元之间存在大体量、多层次、全过程数据交换的需求,这就对并行粒度的设置提出了要求。
4.当前线程级别的并行计算通常使用共享内存并行模式(openmp),多核和多机器的分布式并行计算通常使用消息传递模式(mpi),两者的单独或者组合使用可以实现并行子单元之间的数据共享,从而解决并行单元的时空依赖性问题。虽然mpi和openmp的联用可以解决一定数量并行单元的通信问题,但针对在流域尺度下进行水环境水生态模拟并行计算时,由于openmp主要针对循环并行化,只适用于底层独立性强的同类型指标计算并行,单元并行则主要使用mpi进行控制通信,两者局限于同一程序内部并行。对于复杂的水动力、水质和水量耦合模拟计算,交换数据量呈指数增长,交换方式的单一,通信负载分布不均,极大制约了计算的效率和精度。
5.因此,现有技术有待改进。


技术实现要素:

6.本发明的目的在于针对现有技术的不足之处,提供一种流域水环境水生态模拟的并行控制方法,通过构建多程序并行、mpi和openmp联用的并行控制体系,对水动力-水质-水生态计算过程及数据进行程序划分处理,设置程序间通信规则,构建多程序边界交换控制模块,设置多程序计算边界交换规则,实现多程序计算数据的精确提取,异步读写和通信控制和计算边界自动交换,从而有效地提高流域模拟效率。
7.第一方面,本发明实施例提供了一种流域水环境水生态模拟的并行控制方法,所述方法包括:
8.步骤一:构建多程序并行,采用消息传递模式(mpi)和共享内存并行模式(openmp)联用的并行控制体系;
9.步骤二:构建多程序边界交换控制方法;
10.步骤三:设置多程序计算边界交换规则。
11.作为进一步的改进技术方案,步骤一具体包括:
12.s11:河网分块,划分并行层级,使用消息传递模式(mpi)控制不同分块间的数据交换通信,以分块数作为开启进程的数量;
13.s12:对网格分块进行二次划分作为并行域,每个并行域由一个程序控制,使用多程序并行控制。
14.作为进一步的改进技术方案,在网格内部,使用openmp控制多指标计算并行,包括水动力多指标-水质多指标-水生态多指标的并行。
15.作为进一步的改进技术方案,选择以几何边界相邻的多个分块组合作为多程序并行域的划分标准。
16.作为进一步的改进技术方案,每个并行域由一个程序控制,每个程序标识号为ppid,每个程序包括多个进程,采用openmp负责处理单个进程,共享内存的并行线程之间采用fork-join关系,计算时使用循环并行的方式,在循环开始前只存在一个主线程,当需要进行并行计算的时候,派生出若干个分支线程来执行循环并行任务,当并行代码执行完成之后,分支线程会合,并把控制流程交给单独的主线程。
17.作为进一步的改进技术方案,步骤二具体包括:
18.步骤s21:设定交换数据key-value;
19.步骤s22:调用redis的set及get函数执行存储读取;
20.步骤s23:封装模块,提供接口。
21.作为进一步的改进技术方案,步骤三具体包括:
22.步骤31:设定多程序数据交换边界,基于步骤s11分块步骤中完成的交换规则文件,设置多程序交换规则;
23.步骤32:设置交换方案。
24.作为进一步的改进技术方案,所述交换方案包括:在主程序中调取交换模块接口,设定本机或跨机两种并行模式:当程序被布置在不同的机器上时,增加判断发送程序标识符send_pid是否等于接收程序标识符rec_pid,若相等,即当程序被布置在同一机器上时,则在本地redis数据库进行存储提取,若不等则设定主机redis的ip及端口,在跨机通信时统一将数据存入主机redis数据库。
25.第二方面,本发明提供了一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现上述任意一项所述的一种流域水环境水生态模拟的并行控制方法。
26.第三方面,本发明提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现上述任意一项所述的一种流域水环境水生态模拟的并行控制方法。
27.与现有技术相比,本发明实施例具有以下优点:
28.本发明通过构建多程序并行、mpi和openmp联用的并行控制体系,对水动力-水质-水生态计算过程及数据进行程序划分处理,设置程序间通信规则,构建多程序边界交换控制模块,设置多程序计算边界交换规则,实现多程序计算数据的精确提取,异步读写和通信控制和计算边界自动交换,从而有效地提高流域模拟效率。
29.本发明通过并行域的划分,构建多程序并行、mpi和openmp联用的并行控制体系,
克服了两者局限于同一程序内部并行,提高了运行效率。
30.本发明通过设置多程序边界交换控制方法,方便程序之间的数据传输。本发明通过设置多程序计算边界交换规则,保证了多程序体系间编号的连续性,简化了计算流程,提高了运算效率。
31.本发明设置了交换方案,保证了数据访问的正确性和效率。
附图说明
32.图1为本发明所提供的流域水环境水生态模拟的并行控制方法的模块图;
33.图2为本发明所提供的并行控制体系的示意图;
34.图3为本发明所提供的key-value键值对存储读取示意图;
35.图4为本发明所提供的生成程序交换信息的流程图;
36.图5为本发明所提供的生成跨程序交换标识号的流程图;
37.图6为本发明所提供的跨机交换读写示意图。
具体实施方式
38.下面结合附图所示的实施例对本发明作进一步说明。
39.实施例一
40.本发明提供了一种流域水环境水生态模拟的并行控制方法,图1为本发明所提供的流域水环境水生态模拟的并行控制方法的模块图,如图1所示,本发明包括以下步骤:
41.步骤一:构建多程序并行,采用mpi和openmp联用的并行控制体系。
42.如图2所示,步骤一具体包括:
43.s11:河网分块,划分并行层级。
44.具体的,基于实际河网关系概化,进行河网分块。在网格内部,使用openmp控制多指标计算并行,包括水动力多指标(水位、流量、流速等)-水质多指标(常规水质、重金属等)-水生态多指标(藻类、鱼类、浮游动植物等)的并行等。
45.河网分块即是将一块完整的流域网格拆分成多个独立的网格进行并行计算,同时为了保证计算的准确率,使用消息传递模式(mpi)控制不同分块间的数据交换通信以降低分块导致的截断误差。对于mpi并行层级,以网格分块作为并行域划分标准,一个分块开辟一个新的进程。在这个过程中,使用mpi_send和mpi_recv两个函数控制数据的发送和接收,在函数参数中需要设置发送或接收的对象标识符,即分块号,以实现点对点的数据传输。
46.在初始化mpi时,以分块数作为开启进程的数量,发送/接收进程标识号为imcr,当前块号为ma,发送分块标识号为ma_send,接收分块标识号为ma_rec。imcr遵循mpi设定,从0开始往后编号,而ma则是从1开始往后编号,为了两者一一对应,需要让ma整体减1,即发送进程标识号imcr=ma_send-1,接收进程标识号imcr=ma_rec-1。
47.s12:对网格分块进行二次划分作为并行域,使用多程序并行控制。
48.并行域对应了多程序并行的并行层级,位于mpi并行的上一层级,由于mpi并行主要是同一程序内部的并行,在进行大规模并行计算时灵活度较差,所以添加新的并行层级以拓展并行计算的适用性。并行域是指部分分块的组合,对应多程序并行的层级,在并行时,并行的对象是多个程序,而程序作用的区域则是在并行域内。
49.具体的,对网格分块进行二次划分,通常根据硬件和通信条件、速度需求以及计算量确定,优选的,可以选择以几何边界相邻的多个分块组合作为多程序并行域的划分标准,如图2所示,其构建了两个并行域。
50.每个并行域由一个程序控制,每个程序标识号为ppid,每个程序包括多个进程,采用openmp负责处理单个进程,共享内存的并行线程之间采用fork-join关系,对于同类型的指标,彼此之间存在独立性,且计算流程相似。计算时使用循环并行的方式,在循环开始前只存在一个主线程,当需要进行并行计算的时候,派生出若干个分支线程来执行循环并行任务。当并行代码执行完成之后,分支线程会合,并把控制流程交给单独的主线程。具体的,通常使用fortran中的do循环进行循环计算,此时调用openmp的!$omp parallel do的并行构造指令,可以将循环次数分配到不同的线程上分别执行。。
51.由此构建多程序并行、采用mpi和openmp三个层级的并行粒度,数据交换过程在每次迭代计算的间隙发生。
52.步骤二:构建多程序边界交换控制方法。
53.多程序边界交换即并行域的分块边界处的数据交换,为了保证截断误差的影响最小,因此,通常将数据交换区域设置在分块的边界附近。
54.步骤二具体包括:
55.步骤s21:设定交换数据key-value。
56.设定每个程序每个进程有唯一的通信标识符,由发送程序标识符send_pid,发送进程标识符send_myid,接收程序标识符rec_pid,接收进程标识符rec_myid和发送数据长度lenc组成字符串“lpush exchange send_pid send_myid rec_pid rec_myid lenc”,作为唯一指定的发送键key,给定发送键key对应的发送数据send_value;同样的,接收键key则为“brpop exchange send_pid send_myid rec_pid rec_myid lenc”,在完成key值匹配后,使用rec_value数组来接收key对应的数据。lpush、brpop为人为设置标识符,方便在程序输出时区分检查数据发送和接收的情况。
57.步骤s22:调用redis的set及get函数执行存储读取。
58.如图3所示,调用redis数据库提供的redisconnect()函数,输入数据库ip地址及数据库访问端口,执行数据库连接操作,成功连接上redis数据库后,对key-value键值对赋值,之后调用rediscommand()函数,设定数据库存储对象,并将key-value拼接入字符串commset来作为函数的输入参数,从而执行set方法将数据存入redis;同样的,在接收时,完成数据库连接和key键赋值后,将key拼接入字符串commget,调用rediscommand()执行get方法获得redisreply结构体数组,从中提取交换数据data并将其赋给rec_value数组。
59.步骤s23:封装模块,提供接口。
60.由于兼容性问题,使用c语言编写redis发送和接收的函数模块c_sendc.c和c_recvc.c,以发送/接收数据datas,其中,模块输入参数包括数据长度lenr,发送程序号send_pidr,发送进程号send_myidr,接收程序号rec_pidr和接收进程号rec_myidr;而主程序则由fortran编写,在调用时,使用子程序转换的方式,编写f_send.f90及f_recv.f90两个fortran模块,在其中调用c语言接口,进而调用redis发送和接收模块,并完成fortran变量到c语言变量的传递转化。
61.步骤三:设置多程序计算边界交换规则。
62.具体包括:
63.步骤31:设定多程序数据交换边界,基于步骤s11分块步骤中完成的交换规则文件,设置多程序交换规则。
64.所述交换规则文件是在mpi通信时,设定交换信息的区域和信息的具体内容。
65.参见图4,给定分块总数nu_ma,程序总数nu_pr,进而计算获得每个程序的交换信息文件p_exc.dat,其中包括三个参数:程序编号ppid,程序起始块编号exc_id以及程序包括块数nu_exc。其中,程序编号ppid由人为给定,便于区分不同的程序,通常从1开始递增编号。程序起始块编号由并行域划分方式确定,并行域中囊括的分块均有唯一编号,由分块编号可知程序起始块编号,程序包括块数也由并行域划分方式确定,nu_exc即等于并行域中包括的分块数。
66.nu_excc实质上为取整前的nu_exc,由分块总数nu_ma除以程序总数nu_pr得到,反映了每一个并行域中包含的分块数量,必须为整数,但相除后得到的结果nu_excc不一定为整数,所以需要做出判断是否取整。之后进行一个循环,给定一个变量i从1开始逐步累加,代表程序的编号从1开始增大,由i和nu_exc的值计算每个程序的程序编号ppid以及程序起始块编号exc_id,直到程序编号ppid等于程序总数nu_pr,此时整个计算流程结束。
67.在分配进程时,由于分块号在多程序中是连续的,共用一套分块编号体系,而由于mpi的设定,不同程序所用进程均需从0重新开始编号,每个程序进程编号体系是独立的。
68.为了保证分块编号与进程编号对应,如图5所示,初始化时,使用ma ma_send ma_rec_ppid nu_exc exc_id作为程序流程的输入值。
69.多程序并行中,每一个程序均调用mpi进行多进程并行,每一个程序包括的进程需重新编号,由于mpi进程编号规定从0开始,程序中进程总数与该程序分块总数相等。
70.数据发送流程中,ma_send等于ma,接收流程中,ma_rec等于ma。
71.针对数据发送流程,在调用mpi进行数据交换时,依据mpi的设定,需要为每一个进程给定一个唯一的数字标识号,它的取值范围从0开始,小于进程总数。在本技术中,发送进程号send_myid即为每一个程序中mpi的进程标识号,同时为了满足上述取值范围,设定send_myid为ma_send和exc_id之差。
72.设定发送进程号send_myid初值为发送块号ma_send与程序起始块编号exc_id之差,即send_myid=ma_send-exc_id=ma-exc_id,接收进程号rec_myid=ma_rec-exc_id。发送程序编号send_pid初值等于当前程序编号ppid。
73.针对数据接收流程,设定接收进程号rec_myid初值为接收块号ma_rec与程序起始块编号exc_id之差,rec_myid=ma_rec-exc_id,发送进程号send_myid初值为send_myid=ma_send-exc_id。接收程序编号rec_pid初值等于当前程序编号ppid。
74.针对数据发送流程,参见图5,考虑到存在跨程序交换和程序内交换两种情况,根据此时发送进程号send_myid的值进行情况判定,若小于0,则说明发送数据的进程属于编号在接收程序之前的另一程序,则有发送程序号send_pid等于当前send_pid与1的差值,发送进程号等于当前send_myid与nu_exc之和。若send_myid的值大于等于0且小于nu_exc,则说明发送数据的进程属于当前程序,send_pid与send_myid的值即等于初值。若send_myid的值大于等于nu_exc,说明发送数据的进程属于编号在接收程序之后的另一程序,则发送进程号send_myid等于当前send_myid与nu_exc之差,发送程序号send_pid等于当前send_
pid与1的和,。
75.发送数据时接收程序编号rec_pid与接收进程编号rec_myid同理。
76.通过这种设置方法,保证了:
77.(1)分块编号send_ma/rec_ma在多程序体系间是连续的;
78.(2)各程序进程编号均从0开始,且小于nu_exc,进程总数等于分块总数,进程编号与分块编号对应。
79.步骤32:设置交换方案。
80.当程序被布置在不同的机器上时,在本地redis数据库进行读写;否则,在跨机通信时统一将数据存入主机数据库。
81.在主程序中调取交换模块接口,设定本机或跨机两种并行模式:当程序被布置在不同的机器上时,增加判断发送程序标识符send_pid是否等于接收程序标识符rec_pid,若相等,即当程序被布置在同一机器上时,则在本地redis数据库进行存储提取,若不等则设定主机redis的ip及端口,在跨机通信时统一将数据存入主机redis数据库,如图6所示。
82.应当理解的是,本说明书未详细阐述的部分均属于现有技术。
83.本发明的保护范围不限于上述的实施例,显然,本领域的技术人员可以对本发明进行各种改动和变形而不脱离本发明的范围和精神。倘若这些改动和变形属于本发明权利要求及其等同技术的范围,则本发明的意图也包含这些改动和变形在内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1