CN111124415B - 一种开发循环代码中潜在可向量化循环的方法 - Google Patents

一种开发循环代码中潜在可向量化循环的方法 Download PDF

Info

Publication number
CN111124415B
CN111124415B CN201911243343.XA CN201911243343A CN111124415B CN 111124415 B CN111124415 B CN 111124415B CN 201911243343 A CN201911243343 A CN 201911243343A CN 111124415 B CN111124415 B CN 111124415B
Authority
CN
China
Prior art keywords
dependency
data
statement
loop
dependent
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.)
Active
Application number
CN201911243343.XA
Other languages
English (en)
Other versions
CN111124415A (zh
Inventor
刘松
伍卫国
屈彬
王倩
马洁
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Xian Jiaotong University
Original Assignee
Xian Jiaotong University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Xian Jiaotong University filed Critical Xian Jiaotong University
Priority to CN201911243343.XA priority Critical patent/CN111124415B/zh
Publication of CN111124415A publication Critical patent/CN111124415A/zh
Application granted granted Critical
Publication of CN111124415B publication Critical patent/CN111124415B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F17/00Digital computing or data processing equipment or methods, specially adapted for specific functions
    • G06F17/10Complex mathematical operations
    • G06F17/16Matrix or vector computation, e.g. matrix-matrix or matrix-vector multiplication, matrix factorization
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Mathematical Physics (AREA)
  • Mathematical Analysis (AREA)
  • Mathematical Optimization (AREA)
  • Computational Mathematics (AREA)
  • Pure & Applied Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Computing Systems (AREA)
  • Algebra (AREA)
  • Databases & Information Systems (AREA)
  • Devices For Executing Special Programs (AREA)
  • Complex Calculations (AREA)

Abstract

本发明公开了一种开发循环代码中潜在可向量化循环的方法,根据伯恩斯坦条件扫描获取循环代码中的数据依赖,根据读写顺序判断数据依赖的初始类型,采用定位三元组分别表示数据依赖源语句的位置和数据依赖目标语句的位置,计算距离向量并根据距离向量划分数据依赖类型,然后通过对自反依赖语句进行数据缓冲和对交叉依赖语句进行重排,采用数据缓冲消除自反依赖,采用语句重排消除交叉依赖,将部分原本不能够被编译器自动向量化的循环转换为可被向量化的循环,本发明通过形式化算法减小循环代码中数据依赖对向量化的影响,该方法能够有效提高程序向量化效率,提高程序在向量处理器上执行的性能,且操作性良好。

Description

一种开发循环代码中潜在可向量化循环的方法
技术领域
本发明属于编译优化领域,特别涉及一种开发循环代码中潜在可向量化循环的方法。
背景技术
向量计算是一种SIMD(Single Instruction Stream,Multiple Data Stream)并行计算方式,使一条指令同时处理多份数据,以提高程序并行度及性能,从而减小计算成本并产生经济效益。由于高性能、大数据、人工智能等应用类型往往具有对大规模数据执行相同逻辑运算的特征,向量计算能够给这些应用带来显著的加速效果。随着第一代商用向量处理器——英特尔奔腾2(Intel Pentium II)于1996年问世,向量计算功能逐渐成为通用处理器的标配。除向量处理器外,硬件制造商们还开发了一系列的向量计算指令集以便于程序员在软件开发中使用向量计算技术,例如MMX、SSE和AVX等。而主流编译器,如GCC、LLVM-Clang、ICC等,也在逐步支持自动向量化功能,在编译预处理阶段将可向量化的循环代码自动使用向量指令实现。自动向量化给程序员带来了极大的方便,即使是不了解体系结构和向量指令的程序员也可以轻松写出向量化的代码。然而在常见应用的程序代码中,部分循环存在跨迭代依赖,而对存在跨迭代依赖的循环进行向量化可能导致错误的计算结果,因此有大量的循环因为存在跨迭代依赖而不能被向量化。为了充分利用向量处理器的优势,可通过一定的循环变换技巧来避免部分跨迭代依赖对计算结果正确性的破坏,以使尽可能多的循环被向量化,从而提升程序性能。在处理跨迭代依赖方面,现有的多面体编译优化技术通过仿射调度在提高程序并行度的同时又不使跨迭代依赖破坏计算结果的正确性。但仿射调度通常适用于MIMD(Multiple Instruction Stream,Multiple Data Stream)并行方式,在实际程序代码中实施仿射变换往往需要加入分支语句,导致程序对多份数据的逻辑操作不一致,因此不能用于开发潜在可向量化循环。目前,以有效开发潜在可向量化循环为目标的循环变换通常基于程序员的经验手动实现,编程难度较大且容易忽略部分潜在可向量化循环,缺乏一种有效方法来指导这一变换过程。
发明内容
本发明的目的在于提供一种开发循环代码中潜在可向量化循环的方法,以克服现有方法在开发潜在可向量化循环过程编译难度大的问题。
为达到上述目的,本发明采用如下技术方案:
一种开发循环代码中潜在可向量化循环的方法,包括以下步骤:
步骤1)、检测数据依赖:根据伯恩斯坦条件扫描获取循环代码中的数据依赖,根据读写顺序判断数据依赖的初始类型;
步骤2)、数据依赖模型化:通过定位三元组分别表示数据依赖源语句的位置和数据依赖目标语句的位置,计算数据依赖源语句至数据依赖目标语句的距离向量,根据距离向量获取数据依赖的迭代类型,建立由数据依赖源语句、数据依赖目标语句、定位三元组、距离向量、数据依赖的初始类型及数据依赖的迭代类型构成的初始依赖表;
步骤3)、对初始依赖表进行数据缓冲:扫描初始依赖表,若初始依赖表存在自反依赖,且该自反依赖的源/目标语句之间不存在自正依赖,则将该自反依赖复制插入到该自反依赖的源/目标语句代码下方,同时通过缓冲数组分别替换自反依赖中的写数组以及复制的该自反依赖中的读数组,更新依赖表并重新执行步骤3)直至初始依赖表中不存在自反依赖;若不存在自反依赖,则进入步骤4);
步骤4)、对不存在自反依赖的依赖表进行语句重排:扫描不存在自反依赖的依赖表,若存在交叉依赖,则将交叉依赖的数据依赖源语句以及与交叉依赖数据依赖源语句交叉依赖的数据依赖目标语句从当前循环l移动到循环l+1中;若不存在交叉依赖,则结束。
进一步的,所述读地址的序号i从语句表达式中最靠近赋值符的读地址依次递增,最靠近赋值符的读地址序号i=1。
进一步的,定位三元组包括循环位置、迭代步数和语句相对位置。
进一步的,数据依赖源语句至数据依赖目标语句的距离向量由数据依赖目标语句和数据依赖源语句相减得到。
进一步的,根据距离向量划分的依赖类型包括自依赖、交叉依赖、同迭代依赖和跨循环依赖。
进一步的,步骤1)中,根据伯恩斯坦条件判断任意两条语句是否存在数据依赖的条件,若任意两条语句同时满足:
a、该两条语句访问相同的地址;
b、至少一条语句包含写操作;
c、该两条语句被并行执行;
则该两条语句之间存在数据依赖。
进一步的,根据读写顺序划分的依赖类型包括:目标语句在源语句写之后读,则数据依赖为正依赖;目标语句在源语句读之后写,则数据依赖为反依赖;目标语句在源语句写之后写,则数据依赖为输出依赖。
进一步的,步骤4)中,交叉依赖包括直接交叉依赖和间接交叉依赖。
进一步的,间接交叉依赖指S1作为目标语句直接交叉依赖于S2语句,S2作为目标语句又直接交叉依赖于S3语句,则S1作为目标语句间接交叉依赖于S3语句。
进一步的,将交叉依赖中数据依赖源语句以及与交叉依赖数据依赖源语句交叉依赖的数据依赖目标语句从当前循环l移动到循环l+1中,若循环l+1不存在,则创建循环l+1,使交叉依赖转变为跨循环依赖。
与现有技术相比,本发明具有以下有益的技术效果:
本发明一种开发循环代码中潜在可向量化循环的方法,根据伯恩斯坦条件扫描获取循环代码中的数据依赖,根据读写顺序判断数据依赖的初始类型,采用定位三元组分别表示数据依赖源语句的位置和数据依赖目标语句的位置,计算距离向量并根据距离向量划分数据依赖类型,然后通过对自反依赖语句进行数据缓冲和对交叉依赖语句进行重排,采用数据缓冲消除自反依赖,采用语句重排消除交叉依赖,将部分原本不能够被编译器自动向量化的循环转换为可被向量化的循环,本发明通过形式化算法减小循环代码中数据依赖对向量化的影响,该方法能够有效提高程序向量化效率,提高程序在向量处理器上执行的性能,且操作性良好。
附图说明
图1为阐述具体实施方式的示例循环代码。
图2为阐述具体实施方式的经过数据缓冲后的示例循环代码。
图3为阐述具体实施方式的经过语句重排后的示例循环代码。
具体实施方式
下面结合附图对本发明做进一步详细描述:
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步地详细说明。应当理解,此处描述的实施用例仅用于解释本发明的基本构想,并不用于限定本发明的保护范围。
潜在可向量化循环是有确定的迭代次数、迭代变量递增、对多份数据的逻辑操作一致、存在跨迭代依赖但不是自正依赖的循环。
本发明的实施用例为如图1所示的循环代码;其中,S1语句的B[i]为写地址,A[i]为读地址1;S2语句的A[i]为写地址,A[i+1]为读地址1;S3语句的C[i]为写地址,A[i]为读地址1。
一种开发循环代码中潜在可向量化循环的方法,包括以下步骤:
1、进行数据依赖检测:
根据伯恩斯坦条件扫描获取循环代码中的数据依赖,根据读写顺序判断数据依赖的初始类型;
2、将数据依赖模型化:通过定位三元组分别表示数据依赖源语句的位置和数据依赖目标语句的位置,定位三元组包括循环位置l、迭代步数i和语句相对位置s,计算数据依赖源语句至数据依赖目标语句的距离向量,根据距离向量获取数据依赖的迭代类型,建立由数据依赖源语句、数据依赖目标语句、定位三元组、距离向量、数据依赖的初始类型及数据依赖的迭代类型构成的初始依赖表;
具体的:由定位三元组(l,i,s)表示一条赋值语句,即表示数据依赖源语句和数据依赖目标语句,赋值语句具体形式为:写地址=表达式(读地址1、读地址2、…读地址i…读地址n);用xs(ls,is,ss)表示数据依赖源语句,用xt(lt,it,st)表示数据依赖目标语句,用d(Δl,Δi,Δs)=xt-xs=(lt-ls,it-is,st-ss)表示一条数据依赖源语句至数据依赖目标语句的距离向量。读地址的序号i从语句表达式中最靠近赋值符的读地址依次递增,最靠近赋值符的读地址序号i=1。本申请中潜在可向量化循环为单层循环。
根据距离向量划分的依赖类型包括:
a、Δl=0且Δi≠0且Δs=0,数据依赖为自依赖;
b、Δl=0且Δi≠0且Δs≠0,数据依赖为交叉依赖;
c、Δl=0且Δi=0,数据依赖为同迭代依赖;
d、Δl≠0,数据依赖为跨循环依赖。
数据依赖模型化指采用源语句向量xs、目标语句向量xt、距离向量d、循环位置l、迭代步数i和语句相对位置s对数据依赖进行描述。
具体如图1所示的循环代码,根据伯恩斯坦条件扫描循环代码中的数据依赖,归纳得到依赖表(表1)。以数据依赖d1为例,其源语句所在循环L1的位置为第1位,迭代步数为i,语句位置为1,则表示d1源语句位置的三元组为(1,i,1);同理,表示d1目标语句的三元组为(1,i+1,2);确定源语句和目标语句后,将目标语句的位置与源语句的位置相减,得到距离向量(0,1,1)。
表1初始依赖表
Figure GDA0003148826140000061
3、对初始依赖表进行数据缓冲:
数据缓冲用于消除自反依赖。
对所建立的依赖表进行数据扫描,若初始依赖表存在自反依赖,且该自反依赖的源/目标语句之间不存在自正依赖,则将该自反依赖复制插入到该自反依赖的源/目标语句代码下方,同时通过缓冲数组分别替换自反依赖中的写数组以及复制的该自反依赖中的读数组,更新依赖表并重新执行步骤3)直至初始依赖表中不存在自反依赖;若不存在自反依赖,则进入步骤4);
具体如:以表1中自反依赖d2为例,在自反依赖d2的源/目标语句S2的下方插入一条d2的拷贝,用临时数组buf替换S2中左边的写数组,并用buf替换自反依赖d2下一条语句中右边的读数组(即用buf替换拷贝的自反依赖d2的源/目标语句中的读数组),以消除初始依赖表中的自反依赖d2。对于其他自反依赖,也可采用类似的步骤消除。每消除一个自反依赖,就更新一次依赖表,然后重新检查自反依赖,直到代码中不存在自反依赖。图1所示循环代码在完成数据缓冲后得到如图2所示的代码,并得到新的依赖表(表2)。在完成数据缓冲后,循环代码中所有的自反依赖皆被消除。
表2完成数据缓冲后的依赖表
Figure GDA0003148826140000071
4、语句重排方法:
语句重排用于消除交叉依赖。对于交叉依赖,将交叉依赖中数据依赖源语句以及与交叉依赖数据依赖源语句交叉依赖的数据依赖目标语句从当前循环l移动到循环l+1中,若循环l+1不存在,则创建循环l+1,使交叉依赖转变为跨循环依赖,从而避免其对向量化的影响;若不存在交叉依赖,则结束。
具体如:以表2中交叉依赖d3为例,将其目标语句S3从第1个循环移动到第2个循环中,以消除交叉依赖d3。对于其他交叉依赖,也可采用类似的步骤消除。每消除一个交叉依赖,就更新一次依赖表,然后重新检查交叉依赖,直到代码中不存在交叉依赖。图2所示代码在完成语句重排后得到如图3所示的代码,并得到新的依赖表(表3)。
表3完成语句重排后的依赖表
Figure GDA0003148826140000072
验证过程和结果对比
本发明在Intel(R)Xeon(R)Gold 6140服务器上针对进行了实验验证,实验结果表明,本发明能够有效优化程序的向量化效率,并显著提升程序在向量处理器上的运行速度。
选择格子玻尔兹曼方法D3Q19程序进行对比测试,采用Intel C/C++编译器,与基线程序和Pluto优化版本相比,本发明实现的开发潜在可向量化循环的方法使并行任务的向量化效率分别平均提高了292%和96%,将并行任务的执行速度分别平均提高了147%和120%。

Claims (9)

1.一种开发循环代码中潜在可向量化循环的方法,其特征在于,包括以下步骤:
步骤1)、检测数据依赖:根据伯恩斯坦条件扫描获取循环代码中的数据依赖,根据读写顺序判断数据依赖的初始类型;
步骤2)、数据依赖模型化:通过定位三元组分别表示数据依赖源语句的位置和数据依赖目标语句的位置,计算数据依赖源语句至数据依赖目标语句的距离向量,根据距离向量获取数据依赖的迭代类型,建立由数据依赖源语句、数据依赖目标语句、定位三元组、距离向量、数据依赖的初始类型及数据依赖的迭代类型构成的初始依赖表,由定位三元组(l,i,s)表示一条赋值语句,即表示数据依赖源语句和数据依赖目标语句,赋值语句具体形式为:写地址=表达式(读地址1、读地址2、…读地址n);
步骤3)、对初始依赖表进行数据缓冲:扫描初始依赖表,若初始依赖表存在自反依赖,且该自反依赖的源/目标语句之间不存在自正依赖,则将该自反依赖复制插入到该自反依赖的源/目标语句代码下方,同时通过缓冲数组分别替换自反依赖中的写数组以及复制的该自反依赖中的读数组,更新依赖表并重新执行步骤3)直至初始依赖表中不存在自反依赖;若不存在自反依赖,则进入步骤4);
步骤4)、对不存在自反依赖的依赖表进行语句重排:扫描不存在自反依赖的依赖表,若存在交叉依赖,则将交叉依赖中数据依赖源语句以及与交叉依赖数据依赖源语句交叉依赖的数据依赖目标语句从当前循环l移动到循环l+1中,若循环l+1不存在,则创建循环l+1,使交叉依赖转变为跨循环依赖。
2.根据权利要求1所述的一种开发循环代码中潜在可向量化循环的方法,其特征在于,所述读地址的序号n从语句表达式中最靠近赋值符的读地址依次递增,最靠近赋值符的读地址序号n=1。
3.根据权利要求1所述的一种开发循环代码中潜在可向量化循环的方法,其特征在于,定位三元组包括循环位置、迭代步数和语句相对位置。
4.根据权利要求1所述的一种开发循环代码中潜在可向量化循环的方法,其特征在于,数据依赖源语句至数据依赖目标语句的距离向量由数据依赖目标语句和数据依赖源语句相减得到。
5.根据权利要求1所述的一种开发循环代码中潜在可向量化循环的方法,其特征在于,根据距离向量划分的依赖类型包括自依赖、交叉依赖、同迭代依赖和跨循环依赖。
6.根据权利要求1所述的一种开发循环代码中潜在可向量化循环的方法,其特征在于,步骤1)中,根据伯恩斯坦条件判断任意两条语句是否存在数据依赖的条件,若任意两条语句同时满足:
a、该两条语句访问相同的地址;
b、至少一条语句包含写操作;
c、该两条语句被并行执行;
则该两条语句之间存在数据依赖。
7.根据权利要求1所述的一种开发循环代码中潜在可向量化循环的方法,其特征在于,根据读写顺序划分的依赖类型包括:目标语句在源语句写之后读,则数据依赖为正依赖;目标语句在源语句读之后写,则数据依赖为反依赖;目标语句在源语句写之后写,则数据依赖为输出依赖。
8.根据权利要求1所述的一种开发循环代码中潜在可向量化循环的方法,其特征在于,步骤4)中,交叉依赖包括直接交叉依赖和间接交叉依赖。
9.根据权利要求1所述的一种开发循环代码中潜在可向量化循环的方法,其特征在于,间接交叉依赖指S1作为目标语句直接交叉依赖于S2语句,S2作为目标语句又直接交叉依赖于S3语句,则S1作为目标语句间接交叉依赖于S3语句。
CN201911243343.XA 2019-12-06 2019-12-06 一种开发循环代码中潜在可向量化循环的方法 Active CN111124415B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911243343.XA CN111124415B (zh) 2019-12-06 2019-12-06 一种开发循环代码中潜在可向量化循环的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911243343.XA CN111124415B (zh) 2019-12-06 2019-12-06 一种开发循环代码中潜在可向量化循环的方法

Publications (2)

Publication Number Publication Date
CN111124415A CN111124415A (zh) 2020-05-08
CN111124415B true CN111124415B (zh) 2022-02-01

Family

ID=70497686

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911243343.XA Active CN111124415B (zh) 2019-12-06 2019-12-06 一种开发循环代码中潜在可向量化循环的方法

Country Status (1)

Country Link
CN (1) CN111124415B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114840256A (zh) * 2021-01-30 2022-08-02 华为技术有限公司 一种程序数据级并行分析方法、装置及相关设备

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103279327A (zh) * 2013-04-28 2013-09-04 中国人民解放军信息工程大学 面向异构simd扩展部件的自动向量化方法
CN106445666A (zh) * 2016-09-26 2017-02-22 西安交通大学 一种doacross循环的并行优化方法
CN108038304A (zh) * 2017-12-08 2018-05-15 西安交通大学 一种利用时间局部性的格子玻尔兹曼方法并行加速方法
CN109408867A (zh) * 2018-09-12 2019-03-01 西安交通大学 一种基于mic协处理器的显式r-k时间推进加速方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103279327A (zh) * 2013-04-28 2013-09-04 中国人民解放军信息工程大学 面向异构simd扩展部件的自动向量化方法
CN106445666A (zh) * 2016-09-26 2017-02-22 西安交通大学 一种doacross循环的并行优化方法
CN108038304A (zh) * 2017-12-08 2018-05-15 西安交通大学 一种利用时间局部性的格子玻尔兹曼方法并行加速方法
CN109408867A (zh) * 2018-09-12 2019-03-01 西安交通大学 一种基于mic协处理器的显式r-k时间推进加速方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
Outer-Loop Auto-Vectorization for SIMD Architectures Based on Open64 Compiler;Wang Dong;《IEEE》;20170608;正文第19-23页 *

Also Published As

Publication number Publication date
CN111124415A (zh) 2020-05-08

Similar Documents

Publication Publication Date Title
US11216258B2 (en) Direct function call substitution using preprocessor
US7793278B2 (en) Systems and methods for affine-partitioning programs onto multiple processing units
US9645803B2 (en) Methods and systems for forming an adjusted perform range
US9720667B2 (en) Automatic loop vectorization using hardware transactional memory
JP6141365B2 (ja) 逐次コンピュータプログラムコードを並列処理する方法及びシステム
JP2015084251A (ja) ソフトウェア・アプリケーションの性能向上
US20100095286A1 (en) Register reduction and liveness analysis techniques for program code
US11467827B1 (en) Index space mapping using static code analysis
US5854928A (en) Use of run-time code generation to create speculation recovery code in a computer system
Kruse et al. DeLICM: scalar dependence removal at zero memory cost
CN111124415B (zh) 一种开发循环代码中潜在可向量化循环的方法
Jiang et al. Revealing parallel scans and reductions in recurrences through function reconstruction
Jenista et al. OoOJava: An out-of-order approach to parallel programming
US20150212804A1 (en) Loop distribution detection program and loop distribution detection method
US20170206068A1 (en) Program optimization based on directives for intermediate code
US7120905B2 (en) System and method for transformation of assembly code for conditional execution
WO2019241979A1 (en) Method of deadlock detection and synchronization-aware optimizations on asynchronous processor architectures
Kobeissi et al. The polyhedral model beyond loops recursion optimization and parallelization through polyhedral modeling
CN112445486A (zh) 基于编译指导的有读写依赖循环的多线程并行方法
Smitha et al. Method of extracting parallelization in very large applications through automated tool and iterative manual intervention
Almghawish et al. An automatic parallelizing model for sequential code using Python
Kawahito et al. Automatic Optimize-time Validation for Binary Optimizers
Ghafar et al. Parallel Processing-A Case Study on Automatic Parallelization
Stuglik et al. J-Parallelio--automatic parallelization framework for Java virtual machine code
CN118092931A (zh) 基于指导语句的函数向量化方法及系统

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