CN111858066A - 气体动理论统一算法中的cpu+gpu异构并行优化方法 - Google Patents
气体动理论统一算法中的cpu+gpu异构并行优化方法 Download PDFInfo
- Publication number
- CN111858066A CN111858066A CN202010751046.2A CN202010751046A CN111858066A CN 111858066 A CN111858066 A CN 111858066A CN 202010751046 A CN202010751046 A CN 202010751046A CN 111858066 A CN111858066 A CN 111858066A
- Authority
- CN
- China
- Prior art keywords
- parallel
- cpu
- optimization
- gpu
- memory
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3452—Performance evaluation by statistical analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/10—Geometric CAD
- G06F30/15—Vehicle, aircraft or watercraft design
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/20—Design optimisation, verification or simulation
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Geometry (AREA)
- Computer Hardware Design (AREA)
- Software Systems (AREA)
- Evolutionary Computation (AREA)
- Probability & Statistics with Applications (AREA)
- Evolutionary Biology (AREA)
- Bioinformatics & Computational Biology (AREA)
- Quality & Reliability (AREA)
- Bioinformatics & Cheminformatics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Automation & Control Theory (AREA)
- Aviation & Aerospace Engineering (AREA)
- Computational Mathematics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种气体动理论统一算法中的CPU+GPU异构并行优化方法,包括CPU+GPU异构并行的实现以及优化;优化方法包括:S1、基于Boltzmann方程统一算法的并行运行流程和热点代码,对CPU消耗时间进行统计;S2、基于Boltzmann模型方程统一算法的数据结构和变量使用情况,对各存储器的使用情况进行统计;S3、基于Boltzmann模型方程统一算法并行计算得到对应的变量依赖关系;S4、基于Boltzmann模型方程统一算法并行计算的CPU消耗时间、存储器配置、变量依赖关系,通过系统、算法、语句三种级别对CPU+GPU异构并行的Boltzmann模型方程统一算法进行并行优化。本发明提供一种气体动理论统一算法中的CPU+GPU异构并行优化方法,凭借系统、算法、语句三个层次的优化手段,实现并行效率的提升。
Description
技术领域
本发明属于飞行器空气动力技术领域,特别是涉及一种针对求解高稀薄自由分子流到连续流各流域复杂多尺度非平衡流动问题气体动理论统一算法的GPU并行优化方法。
背景技术
随着科学技术的迅猛发展,高性能计算已成为科学技术发展和重大工程设计中具有战略意义的研究手段,它与传统的理论研究和风洞实验室实验一起构成了现代科学技术尤其是航天飞行器空气动力学设计中互相补充、互为关联的研究方法,成为21世纪科学研究的三大支柱。特别是大内存、高速度超级并行计算机的研制使用,高性能并行计算已成为复杂科学计算领域的主宰,基于巨型计算机与互联网技术所发展起来的国家高性能计算环境对解决航天飞行器从外层空间再入大气层复杂空气动力学问题具有极其重要的机遇与挑战。
根据国际上关于玻尔兹曼(Boltzmann)方程研究现状与发展趋势,结合从事DSMC方法与计算流体力学有限差分方法研究基础,为了探索跨流域气体流动问题一体化模拟方法,本专利第一发明人从开展Boltzmann方程碰撞积分物理分析与可计算建模出发,研究提出描述各流域复杂流动输运现象统一的Boltzmann模型方程与适于高低不同马赫数绕流模拟离散速度坐标法与动态确定物理空间宏观流动量的离散速度数值积分技术,将计算流体力学有限差分方法引入基于时间、位置空间和速度空间Boltzmann模型方程数值计算研究,提出求解稀薄流到连续流各流域复杂多尺度非平衡流动问题气体动理论统一算法(GKUA)理论与系列计算技术,在国际上开展起三维高马赫数绕流问题统一算法并行计算及其在飞船返回舱、箔条云、近空间飞行器、服役期满大型航天器离轨陨落再入解体等航天再入跨流域空气动力学大规模并行计算应用,解决航天军工系列工程研制问题。随着我国高性能计算机系统研制与投入社会使用,统一算法良好的并行加速性能可保证在较高并行效率,通过增加处理机数,可大大增加计算规模,使依靠传统计算条件难以解决的跨流域三维复杂高超声速绕流问题求解变为可能,已经开展的研究预示发展高效能计算机系统及大规模并行数值模拟应用环境对航天流体力学数值方法研究与应用发展具有巨大推动作用,对解决航天、军工领域重大需求具有广阔的应用前景。
Boltzmann方程可计算建模气体动理论统一算法(GKUA)广泛应用的同时,越来越需要单一计算任务使用数千数万以至更大规模CPU稳定运行的高性能大规模并行计算资源环境,然而前期基于64~80750CPU核心并行计算与算法测试研究现状是,如果作业运行所用CPU核心数超过8192,则CPU数越多越不稳定,如作业运行使用23800个CPU并行计算过程中,通常数个小时就会有参加并行计算的某个处理器或并行通讯、输入输出I/O或计算机系统某个地方出现问题导致正在运行的作业被迫停止,下图绘出尖前缘翼身组合体飞行器近空间跨流域绕流统一算法使用23800个核心并行计算收敛曲线。研究发现:虽然理论上,程序调用的CPU资源越多,其运算速度就会越快,总的计算耗时就会越少,但从实际效果来看,作业一旦调用超过2048个核心,实测加速比就会和理论加速比产生较明显的差距,作业一旦调用超过8192个核心,程序就会出现不稳定情况。这是因为随着CPU资源的增加,并行程序会产生越来越多的并行通信,这些并行通信除了会占用CPU资源之外,还会增加输入堵塞、读写竞争等一系列故障的概率。因此,一味使用增加CPU资源来提升并行能力的方法是不可行的,如图6中尖前缘翼身组合体飞行器近空间跨流域绕流统一算法23800个核心并行计算收敛曲线图所示,A点会导致计算数据丢失,回卷到上一次数据备份处重新继续运行,而B点处会在作业推进到两万步以后,程序会因计算机故障而被迫中止。但是这并不意味着统一算法程序就没有进一步提升优化的可能。
发明内容
本发明的一个目的是解决至少上述问题和/或缺陷,并提供至少后面将说明的优点。
为了实现根据本发明的这些目的和其它优点,提供了一种气体动理论统一算法中的CPU+GPU异构并行优化方法,包括CPU+GPU异构并行的实现以及优化;
其中,所述CPU+GPU异构并行的实现是在原有MPI并行程序的基础上,将六层嵌套循环分别以速度矢量信息和空间位置坐标为线索分配给CPU和GPU设备,从而将原有MPI并行程序三个维度的并行,扩展为六个维度的并行;
所述CPU+GPU异构并行的优化方法包括:
S1、基于Boltzmann方程统一算法的并行运行流程和热点代码,对CPU消耗时间进行统计;
S2、基于Boltzmann模型方程统一算法的数据结构和变量使用情况,对各存储器的使用情况进行统计;
S3、基于Boltzmann模型方程统一算法并行计算得到对应的变量依赖关系;
S4、基于Boltzmann模型方程统一算法并行计算的CPU消耗时间、存储器配置、变量依赖关系,通过系统、算法、语句三种级别对CPU+GPU异构并行的Boltzmann模型方程统一算法进行并行优化。
优选的是,在S1中,通过对三维程序计算流程和需求分析进行梳理,得到三维CUDA程序总体设计思路与子程序之间的调用关系,进而通过子程序的运行流程和热点代码,得出软件内部各子程序的CPU消耗时间。
优选的是,在S2中,存储器的使用进行配置方法被配置为包括:
S21、将统一算法中子程序用于数据传输的全局变量按照功能进行分组;
S22、对热点代码中的每组变量被各子程序调用的次数进行统计。
优选的是,在S3中,变量依赖关系是基于大规模并行计算的参数作为并行线索,以此设计线程映射方案;
其中,所述映射方案的建立包括:
S31、基于MPI+CUDA软件架构的并行计算程序,将主程序进行任务拆分,并将拆分后的任务通过MPI分配至多个CPU线程;
S32、各线程进一步将任务拆分为多个子任务,基于CUDA架构将子任务分配到各GPU线程开始并行计算。
优选的是,在S4中,所述系统级别的优化被配置为包括分别对数据传输、内存使用的优化。
优选的是,所述数据传输优化被配置为包括:
减少数据传输次数,其是通过对程序的输入数据进行甄别和筛选,分层次进行数据传输,以减少每次数据输入的数量;
减少输入数组中的部分元素,其是通过将大数组降维处理成为小数组,以提升GPU显存的使用效率。
优选的是,所述内存使用优化被配置为包括:
根据参数特点分配内存,其是基于存储器的使用情况统计,对热点代码中调用次数和修改次数很多的数据,放入私有或是共享存储器中;对于调用次数多但是没有修改的数据,放入常量存储器中;调用和修改次数不多的数据,保留在全局存储器中;
减少数组内存的申请次数,其是基于GPU核函数可变数组的最大使用需求,将申请的内存长期赋予这些可变数组。
优选的是,在S4中,对算法级别的优化是在原有的MPI并行模式离散速度空间基础上,在每个计算节点的CPU将位置空间计算分配给CUDA架构的GPU设备。
优选的是,在S4中,所述语句级别的优化被配置为包括:
循环合并,其是将热点代码中的部分循环进行合并处理;
循环拆分,其是将子程序中的一个归约运算拆分成多个归约运算进行并行处理;
指令优化,其是将延迟高、吞吐量低的指令转化成延迟低、吞吐量大的指令;
分支优化,其是通过将分支置于循环外、拆分循环、合并多个条件、优化分支顺序四种方式以实现。
本发明至少包括以下有益效果:本发明在基于CPU并行的统一算法程序基础上,凭借GPU设备在并行方面的计算优势,通过将统一算法三个维度的并行扩展为六个维度的并行,配合系统、算法、语句三个层次的优化手段,实现CPU+GPU的异构并行,使得原有算法在不增加计算节点规模、不增加CPU间通信量以及不增加内存资源占用的情况下,降低CPU运算负担,从而实现并行效率的提升。
本发明与统一算法原有CPU并行程序相比,统一算法CPU+GPU异构并行程序在运算网格规模大、计算任务量大的运算任务中发挥更加明显的优势,能够在保证结果精确度的前提下,提升玻尔兹曼方程可计算建模气体动理论统一算法程序的并行效率,为更加快速得到飞行器相关气动力、热及绕流特性计算结果奠定基础。经测试结果证明,经过优化后的CPU+GPU异构并行可以缩短原有程序一半以上的运算时间,即原有两个月的运算任务可以缩短为一个月,这样的效果在实际运用中具有较高的使用价值。
本发明的其它优点、目标和特征将部分通过下面的说明体现,部分还将通过对本发明的研究和实践而为本领域的技术人员所理解。
附图说明
图1为本发明的统一算法三维计算软件子程序功能分布图;
图2为本发明的algorithm模块全局变量使用修改次数统计图;
图3为本发明的三维程序的线程映射图;
图4为本发明的算法优化示意图;
图5为统一算法软件内部各子程序CPU消耗时序图;
图6为现有技术中尖前缘翼身组合体飞行器近空间跨流域绕流统一算法23800个核心并行计算收敛曲线图。
具体实施方式
下面结合附图对本发明做进一步的详细说明,以令本领域技术人员参照说明书文字能够据以实施。
根据本发明的一种气体动理论统一算法中的CPU+GPU异构并行优化方法的实现形式,其中包括CPU+GPU异构并行的实现以及优化;
其中,所述CPU+GPU异构并行的实现是在原有MPI并行程序的基础上,将六层嵌套循环分别以速度矢量信息和空间位置坐标为线索分配给CPU和GPU设备,从而将原有MPI并行程序三个维度的并行,扩展为六个维度的并行;求解三维问题的气体动理论数值算法计算空间是六维空间,包括离散速度空间和位置空间,因此往往需要生成六维数组,如存储速度分布函数运算数据的FDV(x,y,z,Vx,Vy,Vz),其中包括空间位置坐标(如x、y、z)和速度矢量信息(如Vx、Vy、Vz),由于统一算法运算过程具有较强的数据独立性,因此对于六维数组中的每个数据,在理论上都可以放到独立的处理器中进行运算,这也就为六维嵌套循环的全部展开提供了必要条件。然而在MPI的技术条件下,三维程序只能以速度矢量信息为线索进行并行,也就是对于一个六层嵌套循环来说,只能并行其中的三个维度,另外三个维度是以串行的方式逐一进行运算的,这极大地浪费统一算法程序良好的数据并行独立性。
如果能够解决这个问题,那么程序的性能将会得到进一步提升。举一个例子:若用离散速度坐标法将速度空间各个方向的速度分量离散成20个网格点,位置空间三维方向离散成1000个网格点,则对于串行程序,CPU将要处理20×20×20×1000×1000×1000=8×1012个数据;对于原有MPI并行程序,统一算法程序以速度矢量信息为线索实施并行运算,将六维嵌套循环展开为三维嵌套循环,每个CPU线程至少计算1000×1000×1000=1×109个数据;现在,如果在此基础上展开以空间位置坐标为线索的剩余三维循环,并调用1000×1000×1000=1×109个GPU线程处理之,那么在理想状态下,每个GPU线程将只需处理1个数据,这将极大地减轻每个处理器的运算负担,从而提升程序运算效率,这意味着统一算法程序具有进一步提升优化的可能。
而这样的方案在现有的技术条件下是可行的:2007年,基于英伟达CUDA架构图形处理单元(GPU)硬件开始投入市场。而GPU设备的特点,完全符合需求:一是GPU作为辅助CPU运算的产品定位,在并行架构方面形成了MPI+CUDA异构并行模式,这种模式满足了同时并行位置坐标(如x、y、z)和速度矢量信息(如Vx、Vy、Vz)两条线索的需求。这使得将三个维度的并行展开为六个维度的并行从技术上变得可行;二是GPU集成核心的能力较CPU要强大得多(例如,英伟达Tesla架构的K20X芯片包含2688个核心),这就意味着可以调用更少的GPU设备完成更多的任务,从而减少通信消耗,提升统一算法程序并行能力。自然,GPU设备在能够带来性能提升的同时,也存在一些缺陷和瓶颈,这就需要在程序编写的过程中需要根据实际情况进行优化。
所述CPU+GPU异构并行的优化方法包括:S1、基于Boltzmann方程统一算法的并行运行流程和热点代码,对CPU消耗时间进行统计;在这一步骤中,主要是掌握基于CPU并行的Boltzmann模型方程统一算法,摸清其运行流程和热点代码,确定重点优化方向,通常情况下大多数的代码满足80%-20%定律(即程序20%的代码消耗整体运行时间的80%),如果能够只优化这些计算热点,那么就可以用小成本的工作换取好的并行收益,而根据Amdahl定律对最大性能收益的估计,如果热点事件占总运行时间的80%,那么并行化最多可加速4倍,而这样的收益相当可观;
S2、基于Boltzmann模型方程统一算法的数据结构和变量使用情况,对各存储器的使用情况进行统计,分析基于CPU并行的Boltzmann模型方程统一算法,以摸清其数据结构和变量使用情况,方便后期为其分配合适的存储器,减小时间耗费,CUDA显式地将GPU计算内核(kernel)使用的存储器分成四种不同的类型:全局存储器(global memory)、常量存储器(constant memory)、共享存储器(share memory)或称局部存储器(local memory)、私有存储器(private memory)。虽然其中除全局存储器有较大容量之外(如tesla K20全局内存为5GB),其余三种存储器的存储容量只有64KB左右,但是这四种存储器的读取速度却有很大差异:全局存储器是最慢的,其延迟为几百个时钟周期;常量存储器次之,延迟为几十个时钟周期;共享存储器的延迟在几个至几十个时钟周期之内;而私有存储器通常就是硬件的寄存器,它是GPU的存储器中读取最快的,几乎不用耗费时间。而相较全局变量耗费的几百个周期,一个时钟周期可以做四次整形加法、两次浮点乘加,三个周期可以做一次乘法,十几个周期可以做一次除法。因此,如果能够合理利用常量存储器、共享存储器和私有存储器,尽量减少读取全局存储器所产生的时间耗费,那么所产生收益相当可观;
S3、基于Boltzmann模型方程统一算法并行计算得到对应的变量依赖关系,重新梳理基于CPU并行的Boltzmann模型方程统一算法,摸清其变量依赖关系,本步骤的作用是便于后期根据变量依赖关系设计线程映射方案,解决软件计算任务与硬件计算过程的对应关系,减少计算时间,这里的依赖是指代码必须按照某种顺序执行,如果顺序发生调换则会产生不一样的结果,而分析这种依赖关系的过程就是变量依赖分析,由此重新梳理原有代码的变量依赖关系,可增加算法并行度;
S4、基于Boltzmann模型方程统一算法并行计算的CPU消耗时间、存储器配置、变量依赖关系,通过系统、算法、语句三种级别对CPU+GPU异构并行的Boltzmann模型方程统一算法进行并行优化,在本步骤中,CPU+GPU异构并行是通过架构编译器,再通过代码调用该编译器实现的,在系统级别的优化中,主要是优化程序的性能,首先需要在系统级别找出程序性能的控制因素,然后再做有针对性优化,提高程序运算能力;
在算法级别的优化中,主要涉及算法实现时要考虑的问题,Boltzmann模型方程统一算法程序迭代和升级比较频繁,导致内置变量的大小和数量常常有所变化,另外随着并行计算机的逐级发展,程序依托的平台也常有变化,因此研究过程必须要考虑代码的易读性、通用性和可扩展性;
在语句级别的优化中,主要包括对函数、循环、指令等语句细节优化,具体方法包括:调用成熟运算库、内联小型函数、循环展开、循环累积、循环合并、循环拆分、减少内存读写、选用合适数据类型、结构体对齐、分支优化等,在本方案中,经过优化后的CPU+GPU异构并行可以缩短原有程序一半以上的运算时间,即原有两个月的运算任务可以缩短为一个月,这样的效果在实际运用中具有较高的使用价值。
在另一种实例中,在S1中,通过对三维程序计算流程和需求分析进行梳理,得到三维CUDA程序总体设计思路与子程序之间的调用关系,进而通过子程序的运行流程和热点代码,得出软件内部各子程序的CPU消耗时间,通过梳理三维程序计算流程和需求分析,整理出三维CUDA程序总体设计思路与子程序调用关系,即如图1所示的统一算法三维计算软件子程序功能分布图,三维程序的重复循环阶段,检验离散速度分布函数、数值求解离散速度分布函数方程以及宏观流动量离散速度数值积分这三个步骤分别表现为judgefenbu、algorithm、detfp这三个子程序,其中,求解离散速度分布函数方程(algorithm)过程又包含求解源项松弛和对流运动项的RHSFDVsub子程序、计算边界部分的wallboundary子程序以及被用作宏观流动量演化更新求解的detfp子程序。
更进一步,通过对软件内部各子程序CPU消耗时间进行统计,可得出如图5的时序图。
在另一种实例中,在S2中,存储器的使用进行配置方法被配置为包括:
S21、将统一算法中子程序用于数据传输的全局变量按照功能进行分组;
S22、对热点代码中的每组变量被各子程序调用的次数进行统计,在这种方案中,分析基于CPU并行的Boltzmann模型方程统一算法,摸清其数据结构和变量使用情况,并为其分配合适的存储器。因为统一算法运算过程较为复杂,涉及二至三个层次的子程序,且个数较多,所以为了方便各个子程序之间的数据传输,申请了大量的全局变量作为传输媒介,这就造成了统一算法整体内存读、写效率低下,在设计统一算法程序之初,本步骤先将这些变量按照功能进行分组,再分别统计热点代码中(即algorithm模块)每组变量被各子程序调用的次数,而后期的优化就基于统计的次数对其存储位置进行设定,进而对其使用情况和使用时间进行合理配置,达到优化的效果。
在另一种实例中,在S3中,变量依赖关系是基于大规模并行的参数作为并行线索,以此设计线程映射方案,其线程映射图如图3所示;
其中,所述映射方案的建立包括:
S31、基于MPI+CUDA软件架构的并行程序,将主程序进行任务拆分,并将拆分后的任务通过MPI分配至多个CPU线程;
S32、各线程进一步将任务拆分为多个子任务,基于CUDA架构将子任务分配到各GPU线程开始并行计算,在这种方案中,根据变量依赖关系寻找一个大规模并行的参数作为并行线索,并以此设计线程映射方案,解决软件计算任务与硬件计算过程的对应关系,其映射方案如图3的程序线程映射图所示,具体来说,由于程序是基于MPI+CUDA软件架构的并行程序,实现了CPU+GPU两级并行运算,因此本步骤将速度矢量信息(Vx、Vy、Vz)并行计算利用MPI架构交给多个CPU线程处理,再利用每个CPU配属CUDA架构GPU设备对空间位置坐标(x、y、z)进行并行处理,代码如下所示:
i=(blockIdx%x-1)*TILE_DIM+threadIdx%x
j=(blockIdx%y-1)*TILE_DIM+threadIdx%y
k=(blockIdx%z-1)*TILE_DIM+threadIdx%z
这样就比单纯使用CPU并行扩展了两层并行循环,减少了每个计算核心的运算压力,从而更加充分地发挥硬件的并行加速性能。
在另一种实例中,在S4中,所述系统级别的优化被配置为包括分别对数据传输、内存使用的优化,在这种方案中,通过数据传输优化对GPU进行加速,其原因在于目前大多数GPU设备通过PCIe接口与主板相连,相比CPU与内存、GPU与显存,这个接口的传输带宽明显不足(高端双路内存带宽约为50GB/s,高端GPU显存带宽约为200GB/s,而PCIe3 X16理论带宽约为16GB/s,远不如前两者)。在统一算法的GPU实现过程中,常常会遇到:相同的运算从CPU交给GPU并行后,GPU调用过程中的计算部分所消耗的时间会减少为原来的1%以内,但在没有进行传输优化的情况下,数据传输部分会占用GPU调用过程绝大多数时间,甚至是计算部分的几十倍、几百倍(在三维GPU程序优化前,数据传输过程耗时是计算过程的156倍)。可见,CPU与GPU之间的数据传输往往会极大削弱GPU加速的效果;
另外,通过内存使用对内存的读取进行合理规划,提升读取速度,具体来说,CUDA显式地将GPU计算内核(kernel)使用的存储器分成四种不同的类型:全局存储器(globalmemory)、常量存储器(constant memory)、共享存储器(share memory)或称局部存储器(local memory)、私有存储器(private memory)。虽然其中除全局存储器有较大容量之外(如tesla K20全局内存为5GB),其余三种存储器的存储容量只有64KB左右,但是这四种存储器的读取速度却有很大差异:全局存储器是最慢的,其延迟为几百个时钟周期;常量存储器次之,延迟为几十个时钟周期;共享存储器的延迟在几个至几十个时钟周期之内;而私有存储器通常就是硬件的寄存器,它是GPU的存储器中读取最快的,几乎不用耗费时间。而相较全局变量耗费的几百个周期,一个时钟周期可以做四次整形加法、两次浮点乘加,三个周期可以做一次乘法,十几个周期可以做一次除法。因此,如果能够合理利用常量存储器、共享存储器和私有存储器,尽量减少读取全局存储器所产生的时间耗费,那么所产生收益相当可观。
在另一种实例中,所述数据传输优化被配置为包括:
减少数据传输次数,其是通过对程序的输入数据进行甄别和筛选,分层次进行数据传输,以减少每次数据输入的数量,由于GPU核函数的输入数据并不是每一次都有变化,而是伴随着一些特定事件的发生才会改变,因此,在对程序的输入数据进行甄别和筛选之后,分层次进行数据传输,减少了每次数据输入的数量,从而减少因为传输数据而带来的时间消耗,而由于GPU核函数的输入数据具有规律性和重复性,因此可以通过对输入数据进行甄别和筛选,将输入的数据分为只需传输一次并长期使用的数据、间隔一定迭代次数后才需要更新的数据以及需要及时更新的数据,然后分层次进行数据传输,以减少每次数据输入的数量;
减少输入数组中的部分元素,其是通过将大数组降维处理成为小数组,以提升GPU显存的使用效率,由于程序使用了MPI进行并行计算,因此会出现程序调用多个CPU继而调用多个GPU的情况,由于每个GPU线程往往只会用到数组一小部分,因此将大数组降维处理成为小数组将会提升GPU显存的使用效率。例如在每个GPU线程中,五维数组FRD(ird,i,j,iv,jv)的iv和jv都是确定值,因此,在代码中设定:
FRD_cuda(:,:,:)=FRD(:,:,:,iv,jv)
五维数组FRD可降维处理成为三维数组FRD_cuda放入GPU,从而极大地降低了传输量,提升数据传输效率。
在另一种实例中,所述内存使用优化被配置为包括:
根据参数特点分配内存,其是基于存储器的使用情况统计,而algorithm模块全局变量使用修改次数统计如图2所示,对热点代码中调用次数和修改次数很多的数据,放入私有或是共享存储器中;对于调用次数多但是没有修改的数据,放入常量存储器中;调用和修改次数不多的数据,保留在全局存储器中,通过分析统计数据,发现在algorithm模块中,不同参数的使用情况有着明显的区别,因此可以对这些参数进行针对性地调整:对于那些调用次数和修改次数都很多的数据,可以把它们放入私有或是共享存储器中;对于那些调用次数多但是没有修改的数据,可以把它们放入常量存储器中;对于其余那些调用和修改次数不多的数据,就可以把它们留在全局存储器中;
减少数组内存的申请次数,其是基于GPU核函数可变数组的最大使用需求,将申请的内存长期赋予这些可变数组,为了方便程序能够根据不同网格的大小申请内存、执行运算,部分大小是可变的,这就导致每次调用GPU核函数都需要花费时间进行内存申请(在三维GPU程序优化前,这一过程耗时是计算过程的394倍)。为此,需要首先分析清楚这些可变数组的最大使用需求,再将申请的内存长期赋予这些可变数组,而不是每次在GPU核函数调用结束后进行释放,这样就减少了申请内存引发的时间消耗。
在另一种实例中,在S4中,对算法级别的优化是在原有的MPI模式并行离散速度空间基础上,把每个计算节点的CPU将位置空间计算分配给CUDA架构的GPU设备,其算法优化如图4所示,由于Boltzmann模型方程统一算法需要分别在位置空间和速度空间离散求解,在模拟三维问题尤其是高超声速绕流时,多相空间内的网格总量往往达到数十亿甚至更多,这一问题在代码中的表现为六维双精度浮点数组的反复调用(单个数组大小超过24GB),而处理如此庞大的数据并不是CPU擅长,因此引入CUDA构架,利用GPU强大的核心集成能力解决这一问题,具体来说,求解三维问题的气体动理论数值算法计算空间是六维空间,包括离散速度空间和位置空间。可在原有MPI模式并行离散速度空间的基础上,让每个计算节点的CPU将位置空间计算分配给CUDA架构的GPU设备,从而实现六个维度的并行计算,其算法优化示意图如图5所示,以增强了程序的计算效率。
在另一种实例中,在S4中,所述语句级别的优化被配置为包括:
循环合并,其是将热点代码中的部分循环进行合并处理,由于计算机在CPU运算模式与GPU运算模式之间来回切换需要传输数据、调用函数等过程,因此会消耗大量时间,因此在前期设计并行方案时就对热点代码进行了梳理和排查,将一些循环进行合并处理,减少了GPU核函数的调用次数,减少了相关时间消耗,在程序中,子程序RHSFDVsub以及detfp内部存在多个小循环,符合MPI+CUDA异构并行的基本运行条件。根据这一情况,将其中多个循环进行合并,如此一来,一是减少CPU与GPU之间数据传输次数,提升并行效率;二是可以减少判断次数,还能够增加指令级并行能力;三是能够更好地隐藏线程建立开销,增加程序执行能力;
循环拆分,其是将子程序中的一个归约运算拆分成多个归约运算进行并行处理,在归约运算中,即便数据与数据存在依赖关系,但仍然存在可以拆分的可能,因此可以将一个归约运算拆分成多个归约运算并行处理,从而增加程序的并行效率,例如,在程序中,RHSFDVsub的第7个循环末尾有一个求三维数组RHSFRD最大元素的归约运算,可根据RHSFRD的自身特点,将它拆分为4个小数组分别同时求得最大值,再将四个值进行比较,从而可以在理论上增加循环4倍的并行效率;
指令优化,其是将延迟高、吞吐量低的指令转化成延迟低、吞吐量大的指令,每种指令具有不同的延迟和吞吐量,比如:一个时钟周期可以做四次整形加法运算、两次浮点乘加运算,三个周期可以做一次乘法运算,十几个周期可以做一次除法运算,幂次运算则会消耗更长时间。因此在优化中,尽量使用延迟低、吞吐量大的指令,例如将除法改为乘以倒数,将幂次运算展开为乘法运算,以提升性能;
分支优化,其是通过将分支置于循环外、拆分循环、合并多个条件、优化分支顺序四种方式以实现,说明当GPU遇到条件指令的时候,由于没有分支预测机制,因此其处理器会将每个分支都执行一遍。这是一项非常耗时的工作,因此分支优化格外重要;
减少数组内存的申请次数,为了方便程序能够根据不同网格的大小申请内存、执行运算,部分GPU核函数的数组大小是可变的,这就导致每次调用GPU核函数都需要花费时间进行内存申请。为此,经过优化处理,可将申请的内存长期赋予这些可变数组,而不是每次在GPU核函数调用结束后进行释放,这样就节省了申请内存引发的时间消耗。
实施例:
本实施例使用国家超级计算天津中心的巨型计算机平台进行测试,所用计算节点CPU设备型号为Intel Xeon X5670,GPU设备型号为NVIDIA Fermi M2050。针对三个模型进行了GPU并行加速测试,它们的网格数量分别为70482、207638、397434,三维离散速度空间坐标点取值范围皆为[-5.4,5.4],间隔为1.8,来流马赫数Ma=2,Kn=1E-1。分别使用512、768、1152、1728、2304、3072、4096、6144、9216个线程进行测试。取得结果如下:
表1网格数大小为70482的单步计算优化情况对比表
附注:时间单位:秒(s)。
表2网格数大小为207638的单步计算优化情况对比表
附注:时间单位:秒(s)。
表3网格数大小为397434的单步计算优化情况对比表
附注:时间单位:秒(s)。
三维程序单步计算平均时间统计表中,加速比指代的是GPU加速后的程序相比原有CPU并行程序的加速倍数,从表中可以看出,加速比随着核心数的增加,一直稳定在2倍以上,可见GPU设备在加速过程中表现较好,没有受到数据通信较大的影响。
程序在始终保持加速比大于2的基础上,随着任务网格数的提高,三维程序的加速比随之提高。这说明随着总运算量的增加,各个处理器所分摊的计算任务也会增加,使得计算任务较之传输任务的比例有所增加,从而会弱化GPU设备在数据传输方面的劣势。这意味着统一算法CPU+GPU异构并行程序可扩展性较好,在处理运算量大的任务中会发挥出更明显的优势
以上方案只是一种较佳实例的说明,但并不局限于此。在实施本发明时,可以根据使用者需求进行适当的替换和/或修改。
这里说明的设备数量和处理规模是用来简化本发明的说明的。对本发明的应用、修改和变化对本领域的技术人员来说是显而易见的。
尽管本发明的实施方案已公开如上,但其并不仅仅限于说明书和实施方式中所列运用。它完全可以被适用于各种适合本发明的领域。对于熟悉本领域的人员而言,可容易地实现另外的修改。因此在不背离权利要求及等同范围所限定的一般概念下,本发明并不限于特定的细节和这里示出与描述的图例。
Claims (9)
1.一种气体动理论统一算法中的CPU+GPU异构并行优化方法,其特征在于,包括CPU+GPU异构并行的实现以及优化;
其中,所述CPU+GPU异构并行的实现是在原有MPI并行程序的基础上,将六层嵌套循环分别以速度矢量信息和空间位置坐标为线索分配给CPU和GPU设备,从而将原有MPI并行程序三个维度的并行,扩展为六个维度的并行;
所述CPU+GPU异构并行的优化方法包括:
S1、基于Boltzmann方程统一算法的并行运行流程和热点代码,对CPU消耗时间进行统计;
S2、基于Boltzmann模型方程统一算法的数据结构和变量使用情况,对各存储器的使用情况进行统计;
S3、基于Boltzmann模型方程统一算法并行计算得到对应的变量依赖关系;
S4、基于Boltzmann模型方程统一算法并行计算的CPU消耗时间、存储器配置、变量依赖关系,通过系统、算法、语句三种级别对CPU+GPU异构并行的Boltzmann模型方程统一算法进行并行优化。
2.如权利要求1所述的气体动理论统一算法中的CPU+GPU异构并行优化方法,其特征在于,在S1中,通过对三维程序计算流程和需求分析进行梳理,得到三维CUDA程序总体设计思路与子程序之间的调用关系,进而通过子程序的运行流程和热点代码,得出软件内部各子程序的CPU消耗时间。
3.如权利要求1所述的气体动理论统一算法中的CPU+GPU异构并行优化方法,其特征在于,在S2中,存储器的使用进行配置方法被配置为包括:
S21、将统一算法中子程序用于数据传输的全局变量按照功能进行分组;
S22、对热点代码中的每组变量被各子程序调用的次数进行统计。
4.如权利要求1所述的气体动理论统一算法中的CPU+GPU异构并行优化方法,其特征在于,在S3中,变量依赖关系是基于大规模并行的参数作为并行线索,以此设计线程映射方案;
其中,所述映射方案的建立包括:
S31、基于MPI+CUDA软件架构的并行程序,将主程序进行任务拆分,并将拆分后的任务通过MPI分配至多个CPU线程;
S32、各线程进一步将任务拆分为多个子任务,基于CUDA架构将子任务分配到各GPU线程开始并行计算。
5.如权利要求1所述的气体动理论统一算法中的CPU+GPU异构并行优化方法,其特征在于,在S4中,所述系统级别的优化被配置为包括分别对数据传输、内存使用的优化。
6.如权利要求1所述的气体动理论统一算法中的CPU+GPU异构并行优化方法,其特征在于,所述数据传输优化被配置为包括:
减少数据传输次数,其是通过对程序的输入数据进行甄别和筛选,分层次进行数据传输,以减少每次数据输入的数量;
减少输入数组中的部分元素,其是通过将大数组降维处理成为小数组,以提升GPU显存的使用效率。
7.如权利要求1所述的气体动理论统一算法中的CPU+GPU异构并行优化方法,其特征在于,所述内存使用优化被配置为包括:
根据参数特点分配内存,其是基于存储器的使用情况统计,对热点代码中调用次数和修改次数很多的数据,放入私有或是共享存储器中;对于调用次数多但是没有修改的数据,放入常量存储器中;调用和修改次数不多的数据,保留在全局存储器中;
减少数组内存的申请次数,其是基于GPU核函数可变数组的最大使用需求,将申请的内存长期赋予这些可变数组。
8.如权利要求1所述的气体动理论统一算法中的CPU+GPU异构并行优化方法,其特征在于,在S4中,对算法级别的优化是在原有的MPI模式并行离散速度空间基础上,将每个计算节点的CPU将位置空间计算分配给CUDA架构的GPU设备。
9.如权利要求1所述的气体动理论统一算法中的CPU+GPU异构并行优化方法,其特征在于,在S4中,所述语句级别的优化被配置为包括:
循环合并,其是将热点代码中的部分循环进行合并处理;
循环拆分,其是将子程序中的一个归约运算拆分成多个归约运算进行并行处理;
指令优化,其是将延迟高、吞吐量低的指令转化成延迟低、吞吐量大的指令;
分支优化,其是通过将分支置于循环外、拆分循环、合并多个条件、优化分支顺序四种方式以实现。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010751046.2A CN111858066B (zh) | 2020-07-30 | 2020-07-30 | 气体动理论统一算法中的cpu+gpu异构并行优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010751046.2A CN111858066B (zh) | 2020-07-30 | 2020-07-30 | 气体动理论统一算法中的cpu+gpu异构并行优化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111858066A true CN111858066A (zh) | 2020-10-30 |
CN111858066B CN111858066B (zh) | 2022-07-15 |
Family
ID=72946543
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010751046.2A Active CN111858066B (zh) | 2020-07-30 | 2020-07-30 | 气体动理论统一算法中的cpu+gpu异构并行优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111858066B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112364436A (zh) * | 2020-11-19 | 2021-02-12 | 中国空气动力研究与发展中心超高速空气动力研究所 | 用于简化离散速度空间中传统数值积分的方法 |
CN112750101A (zh) * | 2020-11-11 | 2021-05-04 | 北京平恒智能科技有限公司 | 基于fft的超大图gpu并行检测oca缺陷算法 |
CN112906224A (zh) * | 2021-02-23 | 2021-06-04 | 中国地质大学(北京) | 一种基于cuda c的短波辐射模式加速方法 |
CN114153494A (zh) * | 2021-12-02 | 2022-03-08 | 中国核动力研究设计院 | 一种基于热力图的热点代码优化方法及装置 |
CN114492230A (zh) * | 2022-01-06 | 2022-05-13 | 中国空气动力研究与发展中心计算空气动力研究所 | 一种飞行器高空气动力曲线的获得方法 |
CN114546413A (zh) * | 2022-02-21 | 2022-05-27 | 深圳市佳贤通信设备有限公司 | 一种监测函数耗时的自动部署和自动优化的方法 |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101727653A (zh) * | 2008-10-31 | 2010-06-09 | 中国科学院过程工程研究所 | 一种基于图形处理器的多组分系统离散模拟计算方法 |
WO2011162628A2 (en) * | 2010-06-26 | 2011-12-29 | Paulo Jorge Pimenta Marques | Apparatus and method for data stream processing using massively parallel processors |
CN103425833A (zh) * | 2013-08-07 | 2013-12-04 | 湖南大学 | 一种基于熵格子波尔兹曼模型的并行流体计算实现方法 |
CN103713949A (zh) * | 2012-10-09 | 2014-04-09 | 鸿富锦精密工业(深圳)有限公司 | 动态任务分配系统及方法 |
US20150116342A1 (en) * | 2013-10-25 | 2015-04-30 | Harman International Industries, Incorporated | Start-up processing task distribution among processing units |
CN104933225A (zh) * | 2015-05-25 | 2015-09-23 | 中国科学院过程工程研究所 | 实现计算流体力学大规模实时模拟的方法 |
CN106021828A (zh) * | 2016-07-15 | 2016-10-12 | 华中科技大学 | 一种基于格子-玻尔兹曼模型的流体模拟方法 |
US20170004019A1 (en) * | 2013-12-23 | 2017-01-05 | Deutsche Telekom Ag | System and method for mobile augmented reality task scheduling |
US20170124758A1 (en) * | 2015-10-29 | 2017-05-04 | Intelligent Fusion Technology, Inc | Method and system for predicting collision probability of space objects via graphics processing unit |
CN110275733A (zh) * | 2019-06-27 | 2019-09-24 | 上海交通大学 | 基于有限体积法求解声子玻尔兹曼方程的gpu并行加速方法 |
CN111258557A (zh) * | 2020-01-16 | 2020-06-09 | Oppo(重庆)智能科技有限公司 | 代码处理方法、装置、电子设备及计算机可读介质 |
-
2020
- 2020-07-30 CN CN202010751046.2A patent/CN111858066B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101727653A (zh) * | 2008-10-31 | 2010-06-09 | 中国科学院过程工程研究所 | 一种基于图形处理器的多组分系统离散模拟计算方法 |
WO2011162628A2 (en) * | 2010-06-26 | 2011-12-29 | Paulo Jorge Pimenta Marques | Apparatus and method for data stream processing using massively parallel processors |
CN103713949A (zh) * | 2012-10-09 | 2014-04-09 | 鸿富锦精密工业(深圳)有限公司 | 动态任务分配系统及方法 |
CN103425833A (zh) * | 2013-08-07 | 2013-12-04 | 湖南大学 | 一种基于熵格子波尔兹曼模型的并行流体计算实现方法 |
US20150116342A1 (en) * | 2013-10-25 | 2015-04-30 | Harman International Industries, Incorporated | Start-up processing task distribution among processing units |
US20170004019A1 (en) * | 2013-12-23 | 2017-01-05 | Deutsche Telekom Ag | System and method for mobile augmented reality task scheduling |
CN104933225A (zh) * | 2015-05-25 | 2015-09-23 | 中国科学院过程工程研究所 | 实现计算流体力学大规模实时模拟的方法 |
US20170124758A1 (en) * | 2015-10-29 | 2017-05-04 | Intelligent Fusion Technology, Inc | Method and system for predicting collision probability of space objects via graphics processing unit |
CN106021828A (zh) * | 2016-07-15 | 2016-10-12 | 华中科技大学 | 一种基于格子-玻尔兹曼模型的流体模拟方法 |
CN110275733A (zh) * | 2019-06-27 | 2019-09-24 | 上海交通大学 | 基于有限体积法求解声子玻尔兹曼方程的gpu并行加速方法 |
CN111258557A (zh) * | 2020-01-16 | 2020-06-09 | Oppo(重庆)智能科技有限公司 | 代码处理方法、装置、电子设备及计算机可读介质 |
Non-Patent Citations (7)
Title |
---|
MING FANG等: "DSMC modeling of rarefied ionization", 《ADVANCES IN AERODYNAMICS》 * |
MINH TUANHO等: "A multi-level parallel solver for rarefied gas flows in porous media", 《COMPUTER PHYSICS COMMUNICATIONS》 * |
李大普: "金属凝固分子动力学模拟的CPU-GPU异构并行算法研究", 《中国优秀博硕士学位论文全文数据库(博士)信息科技辑》 * |
李志辉等: "求解Boltzmann模型方程高性能并行算法在航天跨流域空气动力学应用研究", 《计算机学报》 * |
李志辉等: "跨流域三维复杂绕流问题的气体运动论并行计算", 《空气动力学学报》 * |
李志辉等: "跨流域高超声速绕流Boltzmann模型方程并行算法", 《航空学报》 * |
龚若皓等: "基于移动多核GPU的并行二维DCT变换实现方法", 《成都信息工程学院学报》 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112750101A (zh) * | 2020-11-11 | 2021-05-04 | 北京平恒智能科技有限公司 | 基于fft的超大图gpu并行检测oca缺陷算法 |
CN112364436A (zh) * | 2020-11-19 | 2021-02-12 | 中国空气动力研究与发展中心超高速空气动力研究所 | 用于简化离散速度空间中传统数值积分的方法 |
CN112906224A (zh) * | 2021-02-23 | 2021-06-04 | 中国地质大学(北京) | 一种基于cuda c的短波辐射模式加速方法 |
CN114153494A (zh) * | 2021-12-02 | 2022-03-08 | 中国核动力研究设计院 | 一种基于热力图的热点代码优化方法及装置 |
CN114153494B (zh) * | 2021-12-02 | 2024-02-13 | 中国核动力研究设计院 | 一种基于热力图的热点代码优化方法及装置 |
CN114492230A (zh) * | 2022-01-06 | 2022-05-13 | 中国空气动力研究与发展中心计算空气动力研究所 | 一种飞行器高空气动力曲线的获得方法 |
CN114492230B (zh) * | 2022-01-06 | 2022-08-09 | 中国空气动力研究与发展中心计算空气动力研究所 | 一种飞行器高空气动力曲线的获得方法 |
CN114546413A (zh) * | 2022-02-21 | 2022-05-27 | 深圳市佳贤通信设备有限公司 | 一种监测函数耗时的自动部署和自动优化的方法 |
CN114546413B (zh) * | 2022-02-21 | 2024-06-04 | 深圳市佳贤通信科技股份有限公司 | 一种监测函数耗时的自动部署和自动优化的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN111858066B (zh) | 2022-07-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111858066B (zh) | 气体动理论统一算法中的cpu+gpu异构并行优化方法 | |
Zhong et al. | Data partitioning on heterogeneous multicore and multi-GPU systems using functional performance models of data-parallel applications | |
Economon et al. | Performance optimizations for scalable implicit RANS calculations with SU2 | |
Liu et al. | A hybrid solution method for CFD applications on GPU-accelerated hybrid HPC platforms | |
Elteir et al. | Performance characterization and optimization of atomic operations on amd gpus | |
Suchoski et al. | Adapting sparse triangular solution to GPUs | |
Li et al. | 3-D parallel fault simulation with GPGPU | |
Clarke et al. | Fupermod: A framework for optimal data partitioning for parallel scientific applications on dedicated heterogeneous hpc platforms | |
Smirnov et al. | Efficiency of classical molecular dynamics algorithms on supercomputers | |
Xie et al. | CuMF_SGD: Fast and scalable matrix factorization | |
He et al. | A multiple-GPU based parallel independent coefficient reanalysis method and applications for vehicle design | |
Komatsu et al. | Parallel processing of the Building-Cube Method on a GPU platform | |
Jiang et al. | FlatDD: A High-Performance Quantum Circuit Simulator using Decision Diagram and Flat Array | |
Shah et al. | An efficient sparse matrix multiplication for skewed matrix on gpu | |
Lorenzon et al. | The influence of parallel programming interfaces on multicore embedded systems | |
Zheng et al. | GPU-based multifrontal optimizing method in sparse Cholesky factorization | |
Holmes et al. | An events based algorithm for distributing concurrent tasks on multi-core architectures | |
Gan et al. | Customizing the HPL for China accelerator | |
Aslam et al. | Performance comparison of gpu-based jacobi solvers using cuda provided synchronization methods | |
Garba et al. | Asymptotic peak utilisation in heterogeneous parallel CPU/GPU pipelines: a decentralised queue monitoring strategy | |
Maliţa et al. | Map-scan node accelerator for big-data | |
Smart et al. | CPU Parallelization and GPU Acceleration of SUAVE: Advancements in Sampling and Optimization | |
Choi et al. | Overlapped Data Processing Scheme for Accelerating Training and Validation in Machine Learning | |
Goz et al. | Cosmological simulations in exascale era | |
Xia et al. | A Hybrid Parallel Strategy for Isogeometric Topology Optimization via CPU/GPU Heterogeneous Computing. |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |