CN105260222A - 一种可重构编译器中循环流水迭代间启动间距优化方法 - Google Patents
一种可重构编译器中循环流水迭代间启动间距优化方法 Download PDFInfo
- Publication number
- CN105260222A CN105260222A CN201510676586.8A CN201510676586A CN105260222A CN 105260222 A CN105260222 A CN 105260222A CN 201510676586 A CN201510676586 A CN 201510676586A CN 105260222 A CN105260222 A CN 105260222A
- Authority
- CN
- China
- Prior art keywords
- raw
- flowing water
- iteration
- circulation
- statement
- 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
Abstract
本发明公开了一种可重构编译器中循环流水迭代间启动间距优化方。对计数类循环进行RAW数据依赖关系分析,得到RAW_DDA模型;遍历RAW_DDA模型中的[NEXT]集合,对依赖关系next中的Load指令按照ALAP调度算法进行流水段延后;遍历RAW_DDA模型中的[NEXT]集合,对依赖关系next中的Store指令按照ASAP调度算法进行流水段提前;实现启动间距优化。本发明是针对细粒度可重构编译器ASCRA而开发的一种循环流水启动间距的自动优化算法,可以有效改善可重构编译器对可重构计算应用的部署效率,还能有效提高循环流水硬件结构的性能。
Description
技术领域
本发明属于可重构编译器优化领域,尤其涉及高层次综合过程中的,一种可重构编译器中循环流水迭代间启动间距优化方法。
背景技术
面向CPU-FPGA异构加速平台的可重构自动化编译工具已经成为了可重构计算领域研究的热点。相对于多核处理器的高功耗及并行粒度过低、ASIC芯片成本过于昂贵,基于CPU-FPGA的异构加速系统更加适应嵌入式系统中对性能、功耗、成本均比较苛刻的计算密集型应用,例如图像压缩、模式识别、数字信号处理等应用,兼顾了通用计算的灵活性和定制计算的高效性,计算密集型应用中85%左右的程序执行时间都集中在其中多层循环部分。如何实现循环流水迭代间启动间距的自动优化技术是可重构编译器研究的难点是可重构编译器研究的难点。
正是基于以上问题,本发明提出了一种可重构编译器中循环流水迭代间启动间距优化方法,并在基于ARM-FPGA异构加速平台的细粒度可重构编译器ASCRA上展开相关设计与验证。
发明内容
本发明的目的是提供一种能够有效改善可重构编译器对可重构计算应用的部署效率的,可重构编译器中循环流水迭代间启动间距优化方法
一种可重构编译器中循环流水迭代间启动间距优化方法,包括以下步骤,
步骤一:对计数类循环进行RAW数据依赖关系分析,得到RAW_DDA模型:RAW_DDA=(statement,I,[Array],[NEXT]),其中RAW_DDA表示循环流水迭代间数据依赖关系分析结果,statement表示多层循环程序中的一个循环体的声明;I表示循环体索引变量Ir,1≤r≤m;[Array]是与索引变量Ir相关的RAW数据依赖关系涉及到的数组集合;[NEXT]表示statement声明中所有迭代间RAW数据依赖关系集合;
步骤二:遍历RAW_DDA模型中的[NEXT]集合,对依赖关系next中的Load指令按照ALAP调度算法进行流水段延后;
步骤三:遍历RAW_DDA模型中的[NEXT]集合,对依赖关系next中的Store指令按照ASAP调度算法进行流水段提前;
步骤四:实现启动间距优化。
本发明一种可重构编译器中循环流水迭代间启动间距优化方法,还可以包括:
计数类循环描述为:索引变量向量其中m为多层循环的最大深度;Loop(r)表示索引变量为Ir的循环,其中1≤r≤m,循环体用表示,表示循环体由索引向量控制,索引变量Ir=(pr,qr,θr),其中,pr和qr分别表示索引变量Ir的初值和终值,且是(I1,I2,...,Ir-1)的整值函数,θr表示循环变量Ir的增量且θr为常数。
有益效果:
在现有细粒度可重构编译器中,例如:VivadoHLS、ROCCC、ImpulseC等,尚不具备针对启动间距的自动优化技术,往往需要使用人工输入指导语句方法控制循环并行流水硬件结构自动映射所需启动间距信息的生成,因此不能充分发挥并行流水硬件结构的性能,同时编译效率以及质量都不甚理想。本发明是针对细粒度可重构编译器ASCRA而开发的一种循环流水启动间距的自动优化算法,可以有效改善可重构编译器对可重构计算应用的部署效率,还能有效提高循环流水硬件结构的性能。
本发明所提出的一种可重构编译器中循环流水迭代间启动间距优化方法,在面向ARM-FPGA异构加速平台的可重构编译器ASCRA上进行了部署实施,并且针对测试集PolyBench-3.2中的经典循环程序进行了实验和分析,对比本发明所提出的循环流水迭代间启动间距优化方法与现有HLS工具采用的制导语句控制方式,测试循环程序在FPGA硬件中流水执行时消耗的时钟节拍数,并分析随着循环程序迭代空间的变大,本发明方法对循环程序性能加速效果的变化。
本发明采用jacobi-1D、jacobi-2D、Seidel-2D三个经典循环程序进行测试。其中,jacobi-1D是一个单层循环,索引变量Ii=(0,N,1),jacobi-2D和Seidel-2D是一个两层循环,循环索引变量向量均为这三个测试程序的共同特征是不同深度循环的索引变量迭代次数均是常量。与采用制导语句控制方式的现有HLS工具相比,本发明方法能够有效减少循环流水执行时的时钟节拍数。实验结果如表1所示,N表示循环索引变量迭代次数,表1中的测试程序不同深度循环的索引变量迭代次数均为N,clockcycles表示循环流水执行时消耗的时钟节拍数。根据如图7中实验结果,可以得知,随着迭代空间的增大,采用本发明提出的循环流水迭代间启动间距优化方法,能够有效提高具有常量迭代次数索引变量的循环程序的性能,并且能够保持稳定的性能加速比。与采用制导语句方式的现有HLS工具相比,采用循环流水跌代间启动间距优化方法的可重构编译器ASCRA分别获得了20%、33.3%、42.86%的稳定加速比。
附图说明
图1为启动间距优化实例;图1(a)为间距向量为(0,1,4,1,4,···);图1(b)为间距向量为(0,1,3,1,3,···);
图2为计数类多层循环伪代码描述;
图3为计数类循环伪代码递归描述;
图4为计数类多层循环示例代码;
图5为示例代码的SCoPs结构;
图6为ASCRA系统架构图;
图7为索引变量边界值为常量时实验结果表;
图8为多层循环启动间距优化算法。
具体实施方式
下面将结合附图对本发明做进一步详细说明。
在进行多层循环流水执行迭代间启动间距自动优化方法研究的时候,发现最内层循环的执行时间对整个循环性能影响最大,因此本发明从降低最内层循环循环体迭代间启动间距向量值方法入手,提出了一种采用流水线调度技术进行启动间距优化的方法,为了能更加直观地展示本发明针对上述问题的改进之处,本部分采用一个多层嵌套循环的实例描述问题所在。
如附图1所示,附图1(a)和附图1(b)中的RAW数据依赖关系均为NEXTA={A[i+2]→A[i+4],δ=2},而迭代间流水段延时Δa=4,Δb=3,所得到的迭代间流水启动间距向量 通过降低数组A产生的RAW数据依赖关系在循环体中所跨过的流水延时,能够降低循环流水迭代间启动间距,有效的提高循环程序的数据吞吐率。
针对这一实例所描述的问题所在,本发明建立了一套支持对循环流水迭代间启动间距自动优化的描述模型。该循环流水迭代间启动间距自动优化描述模型由四部分组成:
1)计数类多层循环
定义:索引变量向量其中m为多层循环的最大深度;Loop(r)表示索引变量为Ir的循环,其中1≤r≤m,循环体用表示,表示循环体由索引向量控制,索引变量Ir=(pr,qr,θr),其中,pr和qr分别表示索引变量Ir的初值和终值,且是(I1,I2,...,Ir-1)的整值函数,θr表示循环变量Ir的增量且θr为常数。
为了建立循环流水启动间距信息模型,需要将附图2所描述的多层循环Loop抽象成如附图3所示多个单层循环递归表示的形式。其中Loop(m)表示最内层循环。
在细粒度可重构编译器ASCRA中是对中间代码IR进行数据依赖关系分析,将附图2所示的高级语言描述形式转换成LLVM能够进行分析的数据结构,通过LLVMPASS将多层循环描述成一种抽象语法树(AbstractSyntaxtree,AST),筛选符合定义1)中所描述限制条件的计数类多层循环,实现附图2到附图3循环表示形式的抽象表示。
2)SCoPs
在本发明中用SCoPs(StaticControlParts)描述计数类多层循环模型中AST数据结构,其定义如下:
SCoPs由context和一系列声明statement构成一个二元组<Context,[Statement]>。其中context是SCoP约束参数的集合;每个声明statement都是一个四元组<Name,Domain,Schedule,[Access]>,Statement的单位是多层循环Loop中循环体其中1≤r≤m,其中Name表示声明statement的名称,是声明的唯一标识符;Domain是声明的迭代域,表示一个statement在多层循环中的多维迭代空间域,限制了statement的迭代范围;Schedule是多维空间中迭代向量的整型映射,表示迭代空间中statement的迭代向量;[Access]是声明中对数组元素的访存操作集合,主要包括读、写、读写三种。
本发明提出的SCoPs数据结构基于LLVM开发的多面体模型分析程序开源软件Polly进行设计,由于其能够准确的对不同深度循环体中数组元素访存操作进行描述,有利于对计数类多层循环迭代间的数据依赖关系进行精确分析。例如,附图4中所示的多层循环可以用附图5所示SCoPs表示,其中,循环Loop(i)中的循环体stmt(i)=Loop(j),所以Statement只描述了的声明,
利用得到的SCoPs数据结构可以进行循环体迭代间数据依赖关系分析,本发明基于改进后的ISL数据流分析方法,可以得到写后读(readafterwrite,RAW)、写后写(writeafterwrite,WAW)、读后写(writeafterread,WAR)三种数据依赖关系。通过研究可以得出,在细粒度可重构编译器中进行多层循环映射到流水硬件结构时,WAW和WAR数据依赖关系影响并行存储体系结构的设计,而RAW数据依赖关系会影响到迭代间启动间距,因此本发明只考虑RAW数据依赖关系分析结果。
3)RAW_DDA模型
在本发明中RAW_DDA模型用于描述RAW数据依赖关系,其定义如下:
RAW_DDA=(statement,I,[Array],[NEXT])。其中statement表示多层循环程序中的一个循环体的声明;I表示循环体索引变量Ir,1≤r≤m;[Array]是与索引变量Ir相关的RAW数据依赖关系涉及到的数组集合,用Array(Ir)表示;[NEXT]表示statement声明中所有迭代间RAW数据依赖关系集合,用NEXT(Array(Ir))表示Array(Ir)中单个数组所引起的RAW数据依赖关系集合,其中NEXT是一个三元组(next,δ,Δ),其中δ表示迭代间RAW数据依赖关系的依赖距离,Δ表示依赖关系next在循环体中跨过的流水段延时。
基于数据依赖关系分析算法得到的RAW_DDA结果,本发明对多层循环中每一个循环体进行迭代间启动间距分析,当循环体的索引变量Ir的边界pr或qr是变量时,会引起迭代间的启动间距不是一个固定值,提出采用向量来表示迭代间启动间距信息,建立非固定启动间距模型(None-FixedInitiationInterval,NF_II),如定义4)所描述。
4)NF_II模型
多层循环中循环体迭代间启动间距信息用二维向量表示,1≤r≤m。其中表示循环体在索引变量Ir控制下流水启动时的延时向量,即循环体在迭代空间中迭代点(I1,I2,...,Ir,...,Im)与(I1,I2,...,Ir+θr,...,Im)之间的启动延时按照字典顺序生成的迭代间启动间距向量。
NF_II模型能够表示计数类多层循环中循环体每次迭代流水执行启动时的精确时间,采用非固定启动间距的思想,实现细粒度可重构编译生成的多层循环流水硬件单元的时序控制,能够有效减少多层循环流水执行时冒泡现象,提高多层循环流水执行的吞吐率。
本发明所提出的基于流水线调度技术的一种可重构编译器中循环流水迭代间启动间距优化方法的实现原理为:本方法的实施是基于上述模型的正确分析结果,例如:在循环Loop(m)中,对循环体采用基于硬件延时的流水线划分技术进行流水线划分,当存在导致下一次迭代推后执行的迭代间RAW依赖关系next时,启动间距大于1,则可以通过如下算法1中描述进行最内层循环迭代间启动间距优化,主要思想是将依赖关系next中的Load指令操作按照ALAP调度算法进行流水段延后,对Store指令按照ASAP调度算法进行流水段数提前,提高RAW依赖关系中访存指令之间的时间间隔。经过实验表明该方法对于一些循环程序应用能够有效减少最内层循环中循环体流水执行时迭代间启动间距,从而达到提高循环应用流水执行的性能。
一种可重构编译器中循环流水迭代间启动间距优化方法,主要包括如下几个步骤:
步骤一:对计数类循环进行RAW数据依赖关系分析,得到RAW_DDA模型:
步骤二:遍历RAW_DDA中的[NEXT],对依赖关系next中的Load指令按照ALAP调度算法进行流水段延后;
步骤三:遍历RAW_DDA中的[NEXT],对依赖关系next中的Store指令按照ASAP调度算法进行流水段提前;
步骤一中所述的计数类循环描述为:索引变量向量其中m为多层循环的最大深度;Loop(r)表示索引变量为Ir的循环,其中1≤r≤m,循环体用表示,表示循环体由索引向量控制,索引变量Ir=(pr,qr,θr),其中,pr和qr分别表示索引变量Ir的初值和终值,且是(I1,I2,...,Ir-1)的整值函数,θr表示循环变量Ir的增量且θr为常数。
步骤一中所述的RAW_DDA模型是指:RAW_DDA=(statement,I,[Array],[NEXT])。其中RAW_DDA表示循环流水迭代间数据依赖关系分析结果,statement表示多层循环程序中的一个循环体的声明;I表示循环体索引变量Ir,1≤r≤m;[Array]是与索引变量Ir相关的RAW数据依赖关系涉及到的数组集合,用Array(Ir)表示;[NEXT]表示statement声明中所有迭代间RAW数据依赖关系集合,用NEXT(Array(Ir))表示Array(Ir)中单个数组所引起的RAW数据依赖关系集合,其中NEXT是一个三元组(next,δ,Δ),其中δ表示迭代间RAW数据依赖关系的依赖距离,Δ表示依赖关系next在循环体中跨过的流水段延时。
步骤二中所述的ALAP调度算法是指:在不影响程序正确执行结果的同时,将依赖关系next中的Load指令流水段数值增大,在循环程序流水线执行时,推后Load指令的执行。
步骤三中所述的ASAP调度算法是指:在不影响程序正确执行结果的同时,将依赖关系next中的Store指令流水段数值减少,在循环程序流水线执行时,提前该Store指令的执行。
为了验证本发明所提出的可重构编译器中循环流水迭代间启动间距优化方法的有效性,本发明在基于ARM-FPGA异构加速平台的细粒度可重构编译器ASCRA(Application-SpecificCompilerforReconfigurableArchitecture)上进行了具体的技术实施方案实现。
ASCRA基于开源编译框架LLVM源码基础上进行开发,可以实现C-to-VHDL的自动映射,ASCRA系统架构图如附图6所示。首先,将计算密集型应用程序编译成LLVM中间代码(IR,IntermediateRepresentation)表示,采用一些前端优化技术进行IR优化;其次,对循环程序进行数据依赖关系分析、流水线划分、流水启动间距分析和优化,基于流水线划分结果和启动间距分析结果进行循环程序代价评估,评估将该循环程序映射到FPGA上执行时消耗的代价和获得的应用加速比;然后,基于循环程序代价评估结果进行软硬件划分,判断是否将其划分到协处理器FPGA硬件加速单元上执行;最后进行代码生成,结合并行编译优化技术和并行存储模型完成FPGA并行流水硬件加速单元VHDL代码的生成,同时生成软硬件接口驱动程序和将该循环程序封装成接口调用的C源程序,完成异构加速平台对计算密集型C应用程序的加速。
本发明所提出的一种可重构编译器中循环流水迭代间启动间距优化方法,在ASCRA可重构编译器中实施的伪代码描述如图8所示。
Claims (2)
1.一种可重构编译器中循环流水迭代间启动间距优化方法,其特征在于:包括以下步骤,
步骤一:对计数类循环进行RAW数据依赖关系分析,得到RAW_DDA模型:RAW_DDA=(statement,I,[Array],[NEXT]),其中RAW_DDA表示循环流水迭代间数据依赖关系分析结果,statement表示多层循环程序中的一个循环体的声明;I表示循环体索引变量Ir,1≤r≤m;[Array]是与索引变量Ir相关的RAW数据依赖关系涉及到的数组集合;[NEXT]表示statement声明中所有迭代间RAW数据依赖关系集合;
步骤二:遍历RAW_DDA模型中的[NEXT]集合,对依赖关系next中的Load指令按照ALAP调度算法进行流水段延后;
步骤三:遍历RAW_DDA模型中的[NEXT]集合,对依赖关系next中的Store指令按照ASAP调度算法进行流水段提前;
步骤四:实现启动间距优化。
2.根据权利要求1所述的一种可重构编译器中循环流水迭代间启动间距优化方法,其特征在于:所述的计数类循环描述为:索引变量向量其中m为多层循环的最大深度;Loop(r)表示索引变量为Ir的循环,其中1≤r≤m,循环体用表示,表示循环体由索引向量控制,索引变量Ir=(pr,qr,θr),其中,pr和qr分别表示索引变量Ir的初值和终值,且是(I1,I2,...,Ir-1)的整值函数,θr表示循环变量Ir的增量且θr为常数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510676586.8A CN105260222B (zh) | 2015-10-13 | 2015-10-13 | 一种可重构编译器中循环流水迭代间启动间距优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510676586.8A CN105260222B (zh) | 2015-10-13 | 2015-10-13 | 一种可重构编译器中循环流水迭代间启动间距优化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105260222A true CN105260222A (zh) | 2016-01-20 |
CN105260222B CN105260222B (zh) | 2018-10-26 |
Family
ID=55099925
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510676586.8A Active CN105260222B (zh) | 2015-10-13 | 2015-10-13 | 一种可重构编译器中循环流水迭代间启动间距优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105260222B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106126311A (zh) * | 2016-06-22 | 2016-11-16 | 华东师范大学 | 一种基于代数演算的中间代码优化方法 |
CN112444810A (zh) * | 2020-10-27 | 2021-03-05 | 电子科技大学 | 一种雷达对空多目标超分辨方法 |
CN112445486A (zh) * | 2019-08-28 | 2021-03-05 | 无锡江南计算技术研究所 | 基于编译指导的有读写依赖循环的多线程并行方法 |
CN112631610A (zh) * | 2020-11-30 | 2021-04-09 | 上海交通大学 | 一种针对粗粒度可重构结构的数据重用消除访存冲突方法 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101944040A (zh) * | 2010-09-15 | 2011-01-12 | 复旦大学 | 一种基于谓词的自动并行优化方法 |
-
2015
- 2015-10-13 CN CN201510676586.8A patent/CN105260222B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101944040A (zh) * | 2010-09-15 | 2011-01-12 | 复旦大学 | 一种基于谓词的自动并行优化方法 |
Non-Patent Citations (3)
Title |
---|
QI GUO ETC.: "Automatic Loop-based Pipeline Optimization on Reconfigurable Platform", 《TRUST, SECURITY AND PRIVACY IN COMPUTING AND COMMUNICATIONS (TRUSTCOM), 2013 12TH IEEE INTERNATIONAL CONFERENCE ON》 * |
吴艳霞等: "面向应用的可重构编译器ASCRA(英文)", 《计算机科学与探索》 * |
郭振华等: "一种改进ASAP调度的流水线自动划分算法", 《计算机科学》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106126311A (zh) * | 2016-06-22 | 2016-11-16 | 华东师范大学 | 一种基于代数演算的中间代码优化方法 |
CN106126311B (zh) * | 2016-06-22 | 2019-06-14 | 华东师范大学 | 一种基于代数演算的中间代码优化方法 |
CN112445486A (zh) * | 2019-08-28 | 2021-03-05 | 无锡江南计算技术研究所 | 基于编译指导的有读写依赖循环的多线程并行方法 |
CN112444810A (zh) * | 2020-10-27 | 2021-03-05 | 电子科技大学 | 一种雷达对空多目标超分辨方法 |
CN112631610A (zh) * | 2020-11-30 | 2021-04-09 | 上海交通大学 | 一种针对粗粒度可重构结构的数据重用消除访存冲突方法 |
CN112631610B (zh) * | 2020-11-30 | 2022-04-26 | 上海交通大学 | 一种针对粗粒度可重构结构的数据重用消除访存冲突方法 |
WO2022110567A1 (zh) * | 2020-11-30 | 2022-06-02 | 上海交通大学 | 一种针对粗粒度可重构结构的数据重用消除访存冲突方法 |
Also Published As
Publication number | Publication date |
---|---|
CN105260222B (zh) | 2018-10-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Li et al. | Performance analysis of GPU-based convolutional neural networks | |
CN110764744B (zh) | 用于神经网络计算的中间表示生成方法和装置 | |
Tristan et al. | Evaluating value-graph translation validation for LLVM | |
Xiao et al. | A load balancing inspired optimization framework for exascale multicore systems: A complex networks approach | |
Fauzia et al. | Characterizing and enhancing global memory data coalescing on GPUs | |
CN105224452B (zh) | 一种针对科学计算程序静态分析性能的预测代价优化方法 | |
CN105260222A (zh) | 一种可重构编译器中循环流水迭代间启动间距优化方法 | |
WO2017205118A1 (en) | Sample driven profile guided optimization with precise correlation | |
CN105302624A (zh) | 一种可重构编译器中循环流水迭代间启动间距自动分析方法 | |
CN103116493A (zh) | 一种应用于粗粒度可重构阵列的自动映射方法 | |
CN114995823A (zh) | 一种面向cnn专用加速器的深度学习编译器优化方法 | |
CN105242929B (zh) | 一种针对多核平台的二进制程序自动并行化的设计方法 | |
CN109471636B (zh) | 粗粒度可重构体系结构的算子映射方法及系统 | |
Balasubramanian et al. | Pathseeker: a fast mapping algorithm for cgras | |
Xu et al. | Optimizing finite volume method solvers on Nvidia GPUs | |
Gerum et al. | Source level performance simulation of gpu cores | |
CN112306500B (zh) | 一种针对粗粒度可重构结构的降低多类访存冲突编译方法 | |
Cheng et al. | Dynamic inter-block scheduling for HLS | |
Zhang et al. | An abstraction-guided simulation approach using Markov models for microprocessor verification | |
Luk et al. | A high-level compilation toolchain for heterogeneous systems | |
US20120096247A1 (en) | Reconfigurable processor and method for processing loop having memory dependency | |
CN112558977B (zh) | 面向异构众核后端基于代价模型的多面体优化方法 | |
CN105260166B (zh) | 一种应用于机器学习线程划分的手工样本集生成方法 | |
CN109522127A (zh) | 一种基于gpu的流体机械仿真程序异构加速方法 | |
Letras et al. | Multi-objective optimization of mapping dataflow applications to mpsocs using a hybrid evaluation combining analytic models and measurements |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |