一种应用于CFD高性能计算的数据跨进程传输方法与流程

文档序号:26278260发布日期:2021-08-13 19:34阅读:230来源:国知局
一种应用于CFD高性能计算的数据跨进程传输方法与流程

本发明属于数据跨进程传输领域,具体涉及一种应用于cfd高性能计算的数据跨进程传输方法。



背景技术:

计算流体力学(computationalfluiddynamics,简称为cfd),是利用计算机和数值方法对流体力学问题进行数值模拟和分析的新兴交叉学科,属于典型的计算、访存密集型的科学计算领域,强烈地依赖于高性能计算机的发展。目前,随着计算机硬件和并行计算技术的发展,为适应航空航天等领域大规模数值模拟的需求,高性能cfd软件的研制引起了日益广泛的关注。至今,以mpi、openmp等为代表的并行编程环境已在高性能cfd软件的研制中得到广泛应用。

目前,在国内外已经有了不少的针对基于网格离散的数值模拟领域的并行计算框架,例如openfoam、moose、overture、jasmin/jaumin/jcogin等。但由于结构网格拓扑的不同,以上并行编程框架基本都是单独针对结构网格或者非结构网格开发的,难以做到并行通信与网格无关。而在cfd工程应用中,非结构网格因其生成简单被广泛应用于复杂几何外形,但离散精度较低;结构网格因其具有较高的离散精度对于特殊问题有不可替代的角色,但生成复杂。如果对于结构、非结构网格分别采用不同的并行计算框架,那么同样的一套计算方法将难以适应于不同的网格类型,难以对不同应用领域实施灵活且精细地数值模拟。

随着高性能计算(highperformancecomputing,缩写hpc)技术不断地更新迭代,其主流体系结构趋向于采用在分布式内存管理模式下的超级计算机集群(简称超算),如titan、summit、“神威·太湖之光”等。但在分布式内存管理模式下,伴随着cfd计算网格规模与基于区域分解计算的分区总数的增加以及多学科求解器的融合,跨进程传输的抽象数据总量和次数也相应增加,从而在并行通信方面产生更多的成本开销。在实际运用中,如重叠网格隐式并行算法,数据的跨进程传输量比网格块对接关系高出若干量级。此外,在传统cfd软件中,为降低整体的通信次数,经常将不同精度的数据转化成单一类型的数据(比如将int、float类型提升为double型数据),统一存储在一维数组中;当通信结束后,再执行数据类型的逆转化操作。显然,这种方法增加了通信数据的总长度,不仅对缓冲区造成了浪费,而且产生了额外的通信时间。同时,在给定的操作系统上,单个双精度浮点型数组可分配的连续内存是有限的,缓冲区的大小也是有限的,这就意味着单一数组打包技术对海量数据的运载能力是有限的。尽管mpi为用户提供了结构体数据打包传输接口,但是受内存对齐原理的约束,这种通讯方式仍然造成缓存浪费和通讯成本的增加。



技术实现要素:

本发明的目的在于:针对上述存在的问题,提供一种应用于cfd高性能计算的数据跨进程传输方法,将不同进程间需要进行通信的数据利用动态容器进行打包,利用动态容器打包后的通信数据全部转换成了统一的字符型数据,动态容器中首尾链接的基本片段有长度上限,在进行数据传输时,可以摆脱缓冲区大小的约束,不会造成通信阻塞,且大大减少了通信次数。传输完成后只需要根据动态容器的全局指针和基本片段的局部指针,将不同类型的数据元素依次读出,并进行逆向解码,即可得到打包前的原数据类型的通信数据。

本发明目的通过下述技术方案来实现:一种应用于cfd高性能计算的数据跨进程传输方法,包括:

s1、数据打包:创建动态容器,将cfd数值模拟中不同进程间需要进行通信的各种类型的通信数据拷贝至所述动态容器中,完成数据打包;

s2、将mpi通信函数封装在所述动态容器中;

s3、进行mpi通信,将所述动态容器打包后的所述通信数据在不同进程间进行传输;

其中,所述动态容器由首尾顺次链接的基本片段构成,每个所述基本片段的核心数据为字符型向量容器;每个所述基本片段对应的标准长度上限为1024000000。

本发明的动态容器由首尾链接的基本片段构成,而基本片段的本质是字符型向量容器,动态容器可以将不同类型的数据都压缩为字符型数据,实现任意类型网格的并行计算的兼容性。且基本片段的标准长度上限为10240000000,在mpi通信进行数据传输时,可以通过分片执行的模式,摆脱mpi缓冲区大小的约束,避免通信发生阻塞。

优选地,所述不同进程间需要进行通信的各种类型的通信数据包括当前进程的数据和/或其他多个进程的数据。

本发明的数据打包不仅应用于当前进程,而且应用于多进程的分散数据的收集与共享,可将多个进程的数据统一打包传输。

优选地,步骤s1包括:

s11、创建所述基本片段,所述基本片段是字符型向量容器,通过指针记录对所述字符型向量容器内的数据进行读写操作;所述动态容器由若干个所述基本片段利用指针首尾顺次链接而成,且每个所述基本片段有确定的序列编号;所述动态容器初始为单个所述基本片段,后续增加的所述基本片段的个数由需要存储的数据长度确定;

s12、获取不同类型的所述通信数据,并将所述通信数据赋值给每个类型的数据对应的临时数组中;

s13:利用memcpy函数,将所述临时数组中的值拷贝至所述基本片段中,将所述通信数据中不同类型数据转化为单一的字符型数据;

s14:在对所述通信数据进行存储时,统计所述通信数据的长度,并比较所述通信数据的长度与当前基本片段实际长度、新增长度与标准长度上限之间的关系,将所述通信数据顺序写入所述动态容器中;

s15:重复步骤s14的操作,直至所有所述通信数据完整地存储在所述动态容器中,完成数据打包。

将不同进程间需要进行通信的数据拷贝到动态容器中时,利用通信数据的长度与当前基本片段的实际长度、新增长度与标准长度上限之间的关系,可以决定当前基本片段的内存增量以及新基本片段的创建和链接,拷贝进动态容器中的数据间没有间隔,读取方便。

优选地,步骤s14中,当所述通信数据的长度与当前基本片段实际长度之和小于或等于标准长度上限时,将所述通信数据直接拷贝至当前基本片段中,并同时记录当前末尾字符的局部指针和全局位置指针。

当通信数据的长度与当前基本片段实际长度之和小于或等于标准长度上限时,则当前基本片段的剩余长度足够存储通信数据,根据通信数据的剩余长度即可得到当前基本片段的内存增量,通信数据剩余多少长度,当前基本片段就新增多少长度。

优选地,步骤s14中,当所述通信数据的长度与当前基本片段实际长度之和大于标准长度上限时,将部分所述通信数据填充至当前基本片段的剩余空间,记录所述通信数据的剩余长度,通过全局指针的位置与标准长度上限的值做对比,获得需要新创建的基本片段个数,并确定新创建基本片段在动态容器中的序列编号,此时用于记录当前末尾字符的局部位置的指针位于新基本片段的首端,然后将剩余的所述通信数据填充至新的基本片段中。

当所述通信数据的长度与当前基本片段实际长度之和大于标准长度上限时,则当前基本片段不能将通信数据全部储存完,需要创建新的基本片段,利用全局指针的位置与基本片段的标准长度上限值确定需要新创建的基本片段个数,并确定新创建的基本片段的序列编号。通过序列编号和局部指针在读取数据时,可以确定数据在动态容器中的位置。

优选地,步骤s3中,数据进行传输时,将所述动态容器中的多个所述基本片段按照所述序列编号依次传输,执行完一个所述基本片段的发送-接受,或广播通讯后,再按照所述序列编号依次对所述基本片段进行处理,直到数据传输完成。

对于大规模数据,一般需要若干个基本片段依次存储。每个基本数据片段的长度阈值不超过mpi缓冲区的限制。在mpi环境中,按照序列编号从小到大的顺序对基本片段进行传输,执行完发送-接受,或者广播等通讯之后,再进行下一数据片段的处理。可以实现分片执行的模式,摆脱缓冲区大小的约束,避免通信堵塞的发生。

优选地,还包括,传输完成后,获取接收到的所述动态容器中每个所述基本片段的长度以及所述基本片段的元素个数,将所述动态容器中的所述通信数据依次读出,并对所述通信数据进行逆向解码,将所述通信数据转换为打包前的原本数据类型,并释放所述动态容器。

传输完成后,为了实现消息的长度匹配,仅关注每个基本片段的长度以及基本片段链表的元素个数,而不必关注基本片段内部压缩信息的原始类型,即可将动态容器中的数据依次读出,完成不同类型数据的跨进程传输。

前述本发明主方案及其各进一步选择方案可以自由组合以形成多个方案,均为本发明可采用并要求保护的方案;且本发明,(各非冲突选择)选择之间以及和其他选择之间也可以自由组合。本领域技术人员在了解本发明方案后根据现有技术和公知常识可明了有多种组合,均为本发明所要保护的技术方案,在此不做穷举。

本发明的有益效果:

1、本发明的基本片段有标准长度上限,与mpi自带的打包信息传输机制相比,本发明对缓冲区的利用率大幅提升的前提下又降低了数据的通信次数,同时,标准片段长度阈值m也有效避免了缓冲区溢出,对于大规模数据的传输,可以通过分片执行的模式,摆脱缓冲区大小的约束,避免通信堵塞的发生,降低通信次数。

2、本发明的动态容器,为基本片段都设置了序列编号,在进行逆向解码时,可以快速的确定不同类型数据的位置,便于解码,仅需关注每个基本片段的长度以及基本片段链表的元素个数,而不必关注基本片段内部压缩信息的原始类型。

3、本发明提出的方法,不仅可以实现任意类型网格的并行计算兼容性,它还可以在充分利用缓存空间的前提下降低数据的通信次数。同时,对于大规模数据的传输,可以通过分片执行的模式,摆脱缓冲区大小的约束,避免通信堵塞的发生。将cfd高性能计算中的并行编程表现为数据打包、数据传输、数据解码三个过程,极大提升了软件开发的效率。

附图说明

图1是本发明的方法流程图。

图2是本发明实施例的动态容器结构示意图。

图3是本发明实施例的数据打包示意图。

图4是本发明实施例的网格块-交界面-数据交换机制。

图5是本发明实施例的数据打包前后通信次数统计对比图。

具体实施方式

下列非限制性实施例用于说明本发明。

实施例

参照图1,一种应用于cfd高性能计算的数据跨进程传输方法,包括以下步骤:

s1、数据打包:创建动态容器,将cfd数值模拟中不同进程间需要进行通信的各种类型通信数据拷贝至所述动态容器中,完成数据打包;

s11、创建所述基本片段,所述基本片段是字符型向量容器,通过指针记录对所述字符型向量容器内的数据进行读写操作;所述动态容器由若干个所述基本片段利用指针首尾顺次链接而成,且每个所述基本片段有确定的序列编号;所述动态容器初始为单个所述基本片段,后续增加的所述基本片段的个数由需要存储的数据长度确定;

s12、获取不同类型的所述通信数据,并将所述通信数据赋值给每个类型数据的对应临时数组中;

s13:利用memcpy函数,将所述临时数组中的值拷贝至字符型向量容器中,将所述通信数据中不同类型数据转化为单一的字符型数据,即char型数据;

s14:在对所述通信数据进行存储时,统计所述通信数据的长度,并比较所述通信数据的长度与当前基本片段实际长度、新增长度与标准长度上限之间的关系,将通信数据顺序写入动态容器中。

参照图2,所述动态容器由首尾顺次链接的基本片段构成,每个所述基本片段的核心数据为字符型向量容器。将每个所述基本片段的标准长度上限设置为1024000000,一方面是因为内存管理系统不允许开辟过长的连续内存;另一方面,在后续的mpi通信过程中,mpi通信函数对应的缓冲区有一定的限制,限制所述基本片段的标准长度上限,可以摆脱缓冲区大小的约束,避免同心发生阻塞。

所述基本片段可以将int、float、double、c++基本数据类型等不同类型的数据均转换成字符型数据,即char型数据,char为占一个字节的基本字符类型,能确保可存放机器基本字符集中任意对应的数字。每个所述基本片段对应的标准长度上限m为1024000000,即每个所述基本片段可以存储1024000000个字符型数据。

参照图3,当通信数据的长度与当前基本片段实际长度之和小于或等于标准长度上限时,将通信数据直接拷贝至当前基本片段中,并同时记录当前末尾字符的局部指针和全局位置指针;其中,当前基本片段实际长度为,当前基本片段已储存有数据的长度。当前基本片段的内存增量即为通信数据的剩余长度,数据有多少,内存就新增多少,节约了内存空间的同时,保证了每位数据之间没有间隔,便于数据读取时的定位。

当通信数据的长度与当前基本片段实际长度之和大于标准长度上限时,将部分通信数据填充至当前基本片段的剩余空间,然后创建新的基本片段,将通信数据的剩余部分填充至新的基本片段中。

当通信数据的长度与当前基本片段实际长度之和大于标准长度上限时,将部分通信数据填充至当前基本片段剩余空间中。记录通信数据的剩余长度,即还未进行存储的通信数据的长度;通过全局指针的位置与标准长度上限的值做对比,获得需要新创建的基本片段个数以及每个新创建的基本片段在动态容器中的序列编号n,其中,n的取值为自然数1,2,3,...n;此时用于记录当前末尾字符的局部位置的指针位于新基本片段的首端,然后将剩余的通信数据填充至新的基本片段中。

s15:重复步骤s14的操作,直至所有所述通信数据完整地存储在动态容器中,完成数据打包。

利用动态容器对数据进行存储的过程是内存空间动态增长过程,该过程通过反复比较当前基本片段实际长度、新增长度与标准长度上限之间的关系,决定当前基本片段的内存增量以及新的基本片段的生成与链接,并通过递归调用自定义的读写函数实现数据之间的转换和存储过程。这种增长方式是一种有计划的比较前提下的动态增长,字符型向量容器的push_back操作应加以避免,而应该使用resize操作完成上述过程。一般地,本实施例中的动态容器,这种新型的数据打包存储结构适用于较大规模的抽象数据二进制转化以及逆向解码,其生存周期控制在较短的范围内,传输且数据读取结束后即进行释放。

本方法中,不同进程间需要进行通信的各种类型通信数据包括当前进程的数据和/或其他多个进程的数据。在实际运用中,如大规模重叠网格隐式并行装配算法,数据的跨进程传输量比网格块对接关系高出若干量级。该数据打包技术不仅应用于当前进程,而且应用于多进程的分散数据的收集与共享。因为单个数组的运载能力有限,所以在该技术使用之前,仅能处理3000万量级重叠网格的几何装配,而采用数据打包技术之后,网格处理能力突破了数亿量级。非重叠网格计算节点到部件壁面的距离时,也会涉及壁面几何信息的收集。因为壁面几何数据可能分布于各个进程。所以,本发明的方法中,进行数据打包的通信数据可能来自当前进程,或者是其他多个进程;打包后的数据,传输简便,通信次数大大减少。

s2、将mpi通信函数封装在所述动态容器中。

在数据打包过程完成之后,将mpi通信函数封装在基本片段中,当整体存储结构发生跨进程传输时,利用mpi通信函数进行通信。

s3、进行mpi通信,将所述动态容器打包后的所述通信数据在不同进程间进行传输。

这个传输过程为每个基本片段内部连续缓冲数据的阻塞或非阻塞的发送-接收操作以及广播操作等等,将动态容器中的多个基本片段按照序列编号依次传输,执行完一个基本片段的发送-接受,或广播等通讯后,再按照所述序列编号依次对所述基本片段进行处理,并基于网格分区块的循环遍历完成不同网格块之间的通信。

传输完成后,获取接收到的所述动态容器中每个基本片段的长度以及基本片段链的元素个数,将所述动态容器中的所述通信数据依次读出,并对所述通信数据进行逆向解码,将所述通信数据转换为打包前的原本数据类型,并释放所述动态容器。

数据传输过程完成之后,为了实现消息的长度匹配,用户仅关注每个基本片段的长度以及基本片段链表的元素个数,而不必关注基本片段内部压缩信息的原始类型,即可将动态容器中的数据依次读出,完成不同类型数据的跨进程传输。

本实施例在nnw-phenglei软件平台上,需要进行的并行通信过程包括:①进程内的结构多块网格交界面数据;②节点内任意网格块交界面数据,主要用于openmp并行化和结构/非结构耦合计算;③进程间的相邻网格块交界面数据,主要用于mpi通信.④结构网格与非结构网格块间的数据交换.为了实现以上信息交换功能,nnw-phenglei将数据打包存储与跨进程传输技术加以应用。

参照图4,其中,网格块grid[is-1]为i进程中对应任意类型的网格,dc[is-1]为i进程中的动态容器,其中s的取值为为自然数0,1,2...s;的网格块grid[it-1]为j进程中对应任意类型的网格,dc[it-1]为j进程中的动态容器,其中t的取值为自然数0,1,2...t;由于cfd数值模拟基本上都是采用迭代方法进行,因此在每一个迭代步上都需要进行通信。每进行完一步迭代计算后,在求解器的后处理过程中进行mpi通信。整个数据通信过程包括三个步骤,即数据压缩、mpi通信以及数据解码。在数据压缩步骤中,第i和j进程分别将自身拥有的网格块交界面信息压缩到所述动态容器中,目的是将两两进程间需要通信的数据打包,这既能通过封装实现任意类型数据的交换又能减少通信次数。在这种数据交换模式中,将任意类型网格块的交界面数据按照接口标准压缩到所述动态容器中,不同进程间只进行所述动态容器数据的并行通信,将数据结构隔离在并行通信的底层,从而实现任意类型网格的并行计算兼容性。

参照图5,是采用本发明的方法进行数据打包跨进程传输时,对于32768块网格,2048进程下,是否打包通信的通信次数对比,可见数据打包技术使总的通信次数有量级上的减少。

综上所述,本发明提供的一种应用于cfd高性能计算的数据打包与跨进程传输方法,将不同进程间需要进行传输的数据利用动态容器进行打包,将不同类型的通信数据统一转化成字符型数据,将数据结构隔离在并行通信的底层,实现了任意类型网格的并行计算兼容性,且动态容器的基本片段中的压缩信息不存在间隔,与mpi自带的打包信息传输机制相比,本发明对缓冲区的利用率大幅提升,使用组合基本片段的概念有效规避了单个数组的运载能力的限制,限制了基本片段的标准长度上限也有效避免了缓冲区溢出。

前述本发明基本例及其各进一步选择例可以自由组合以形成多个实施例,均为本发明可采用并要求保护的实施例。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1