CN109976810B - 一种基于OpenCL的稠密矩阵乘GPU加速方法 - Google Patents

一种基于OpenCL的稠密矩阵乘GPU加速方法 Download PDF

Info

Publication number
CN109976810B
CN109976810B CN201910191263.8A CN201910191263A CN109976810B CN 109976810 B CN109976810 B CN 109976810B CN 201910191263 A CN201910191263 A CN 201910191263A CN 109976810 B CN109976810 B CN 109976810B
Authority
CN
China
Prior art keywords
matrix
gpu
opencl
dense
data
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
CN201910191263.8A
Other languages
English (en)
Other versions
CN109976810A (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 CN201910191263.8A priority Critical patent/CN109976810B/zh
Publication of CN109976810A publication Critical patent/CN109976810A/zh
Application granted granted Critical
Publication of CN109976810B publication Critical patent/CN109976810B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining

Abstract

本发明公开了一种基于OpenCL的稠密矩阵乘GPU加速方法,先在CPU上对稠密矩阵A和稠密矩阵B进行边界补齐,矩阵A和B的尺寸为OpenCL工作组的倍数;然后CPU将填充后矩阵A和B的数据传送给GPU;进行任务分配和设备内存优化,采用矩阵分块思想将矩阵待计算数据缓存至GPU局部存储器;采用向量计算合并多个矩阵元素;采用单个工作项计算多个数据方式;最后GPU按照划分的子矩阵计算每个子矩阵的运算结果,去除补齐的边界部分,将计算结果返回CPU完成加速。本发明针对稠密矩阵乘这一计算任务,在GPU上进行了多层次优化,极大提升了任务计算速度。

Description

一种基于OpenCL的稠密矩阵乘GPU加速方法
技术领域
本发明属于计算机应用技术领域,具体涉及一种基于OpenCL的稠密矩阵乘 GPU加速方法。
背景技术
异构并行编程模型随着GPU的发展而兴起。NVIDIA GPU在商业上获得的 巨大成功,并于2007年推出GPU计算平台CUDA。然而CUDA仅适用以NVIDIA GPU为加速设备的异构系统,多家公司因此于2008年共同制定了跨平台异构并 行编程框架标准OpenCL。OpenCL将不同硬件抽象为统一平台模型,适用于多 种异构系统。
随着人工智能不断发展,GPU广泛运用于多种人工智能任务。由于人工智能 涉及大量矩阵运算,其结果矩阵的每一元素求解过程具有独立性,十分适合使用 GPU进行加速。由于GPU存储层次复杂,为了最大化矩阵运算的加速性能,需 要从计算量分配、存储层次合理划分等角度深入优化,充分发挥GPU的计算优 势。
发明内容
本发明所要解决的技术问题在于针对上述现有技术中的不足,提供一种基于OpenCL的稠密矩阵乘GPU加速方法,可提高稠密矩阵乘法的运算速度,极大发 挥GPU的计算性能。本方法为用户提供API接口,并完成了上述功能的设计细 节、实现算法以及编码工作。
本发明采用以下技术方案:
一种基于OpenCL的稠密矩阵乘GPU加速方法,先在CPU上对稠密矩阵A 和稠密矩阵B进行边界补齐,矩阵A和B的尺寸为OpenCL工作组的倍数;然 后CPU将填充后矩阵A和B的数据传送给GPU;进行任务分配和设备内存优化, 采用矩阵分块思想将矩阵待计算数据缓存至GPU局部存储器;采用向量计算合 并多个矩阵元素;采用单个工作项计算多个数据方式;最后GPU按照划分的子 矩阵计算每个子矩阵的运算结果,去除补齐的边界部分,将计算结果返回CPU 完成加速。
具体的,对稠密矩阵A和稠密矩阵B进行边界补齐,填充后稠密矩阵A和 B的尺寸变为M'×P'、P'×N',具体为:
M'=M+(ls-M%ls)%ls
N'=N+(ls-N%ls)%ls
P'=P+(ls-P%ls)%ls
其中,M、P、N为矩阵原始维度,M'、P'、N'为矩阵零填充部分以及矩阵填充 后维度,ls为OpenCL工作组尺寸。
进一步的,稠密矩阵A和B的尺寸分别为M×P、P×N,设定OpenCL工作 组尺寸ls,在稠密矩阵A和B外进行零填充,填充后矩阵变为:
Figure BDA0001993806850000021
具体的,任务分配和设备内存优化中,对矩阵进行子矩阵划分,将矩阵相乘 任务分配到GPU的工作组执行,并根据合并访存原则优化内存使用;分别采用 GPU的SIMD指令以及单个工作项计算多个数据的方式,并将数据读入本地内 存。
进一步的,定义GPU内核函数如下:
Matrix_Mul<global_size,local_size>
其中,global_size表示内核函数NDRange大小,local_size表示NDRange中 工作组尺寸。
更进一步的,NDRange中工作组尺寸local_size取16,在计算过程中,每个 工作组内包含16×16个工作项。
进一步的,每个工作项计算过程如下:
S301、OpenCL为每个工作项分配工作组索引groupID和工作组中工作项索 引localID;
S302、设置宏unroll_m_float4与unroll_n_float4,每个结果采用OpenCL中float4 类型存储,一个float4数组包含四个结果,默认两个宏数值均为1;
S303、工作组内的每个工作项采用向量类型,从全局存储器加载 4×4×unroll_m_float4×unroll_n_float4个数据至局部存储器;
S304、根据矩阵分块原理,每个工作项计算各自结果,采用barrier原语保证 工作组内所有工作项均使用完加载进局部存储器的数据,累加计算结果,将计算 所得的子矩阵写回全局存储器。
更进一步的,步骤S303中,每个工作项采用跨块访问方式计算结果,每个 结果在矩阵中的位置计算公式为:
BS×N×by×unroll_m+bx×BS*unroll_n+ty×N+ii*BS×N+tx+jj×BS
其中,bx、by、tx、ty分别为该工作项的所在工作组id以及局部id,BS为块 大小,unroll_m和unroll_n为每个工作项在行列方向计算的结果个数,ii、jj为循 环变量,同时使用OpenCL中barrier原语进行同步。
具体的,GPU按照划分的子矩阵计算每个子矩阵的运算结果后,先去除稠密 矩阵A和稠密矩阵B进行边界补齐中的零填充。
进一步的,去除稠密矩阵A和稠密矩阵B中零填充的步骤如下:
S401、在OpenCL主机端,分配大小为M'×N'×sizeof(type)的连续内存,并从 GPU全局内存读取计算结果,记录内存首地址p;
S402、从地址p开始,拷贝N个数据,并将地址p后移N';
S403、重复执行S402,直至拷贝M次。
与现有技术相比,本发明至少具有以下有益效果:
本发明一种基于OpenCL的稠密矩阵乘GPU加速方法,通过优化GPU存储 访问、使用向量加载语句、控制单工作项计算数量等方式对稠密矩阵乘法进行优 化,极大缩短计算时间,提升了整体任务的加速比,对于规模4096×4096的两 个稠密矩阵,乘法运算只需60.65ms,比不做任何优化提高了近100倍。
进一步的,提供API屏蔽底层设备的差异性,对矩阵的填充保证内核计算时 不会发生访问越界。
进一步的,利用CPU控制程序执行流程并处理基础数据和GPU处理密集的 浮点运算任务相结合的模式提高了大量计算任务的计算速度;
进一步的,采用跨块访问方式为每个GPU上的计算单元分配足量任务,发 挥最大的计算性能,同时多层次访存优化降低访存时间开销,提升任务计算速度。
综上所述,本发明针对稠密矩阵乘这一计算任务,在GPU上进行了多层次 优化,极大提升了任务计算速度。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
附图说明
图1为本发明流程示意图。
具体实施方式
本发明提供了一种基于OpenCL的稠密矩阵乘GPU加速方法,先在CPU上 对稠密矩阵A和稠密矩阵B进行边界补齐,使得矩阵A和B的尺寸为OpenCL 工作组的倍数;CPU将所需数据传送给GPU;计算分配和设备内存优化:采用 矩阵分块思想,将矩阵待计算数据缓存至GPU局部存储器,优化数据读写速度; 采用向量计算指令,合并多个矩阵元素的计算;采用单个工作项计算多个数据方 式,发挥单个计算单元最大计算性能。本发明用于解决现有技术中GPU调度资 源利用率低,吞吐率低下的问题,通过进行访存及并行优化,可以大幅度提高稠 密矩阵的乘法计算速度。
请参阅图1,本发明一种基于OpenCL的稠密矩阵乘GPU加速方法,包括以 下步骤:
S1、在CPU上对两个稠密矩阵进行尺寸补齐,稠密矩阵A和B的尺寸分别 为M×P、P×N,根据设定的OpenCL工作组尺寸ls,在矩阵A和B外进行零填充, 填充后矩阵变为:
Figure BDA0001993806850000051
经过填充后,稠密矩阵A和B的尺寸变为M'×P'、P'×N',具体地,有:
M'=M+(ls-M%ls)%ls
N'=N+(ls-N%ls)%ls
P'=P+(ls-P%ls)%ls
S2、CPU将填充之后的矩阵A和B的数据传输给GPU;
S3、任务分配和设备内存优化
对矩阵进行子矩阵划分,将矩阵相乘任务分配到GPU中的大量工作组中执 行,并根据合并访存原则优化内存使用;分别采用GPU的SIMD(单指令多数据) 指令以及单个工作项计算多个数据的方式,发挥单个GPU计算核心的计算性能, 并将数据读入本地内存,减少访存所需开销。
S4、GPU按照划分的子矩阵计算每个子矩阵的运算结果,计算完毕后,对整 个计算结果进行汇总,并去除补齐的边界部分,将计算结果返回CPU。
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实 施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所 描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中 的描述和所示的本发明实施例的组件可以通过各种不同的配置来布置和设计。因 此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的 本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本 领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属 于本发明保护的范围。
对于输入的两个稠密矩阵A和B,矩阵尺寸分别为M×P、P×N,为了便于 OpenCL工作组的划分,需要对矩阵进行尺寸补齐,根据指定的工作组大小ls, 分别在矩阵下侧和右侧进行零填充,填充后矩阵尺寸变为M'×P'、P'×N',具体地, 有:
M'=M+(ls-M%ls)%ls
N'=N+(ls-N%ls)%ls
P'=P+(ls-P%ls)%ls
根据矩阵分块原理,矩阵计算过程及结果可表示为:
Figure BDA0001993806850000071
矩阵乘所需数据包括矩阵A和B,矩阵原始维度M、P、N,矩阵零填充部分 以及矩阵填充后维度M'、P'、N'。
GPU中的内核函数定义为Matrix_Mul<global_size,local_size>,其中, global_size表示内核函数NDRange大小,其数值取决于填充后矩阵尺寸 M'、P'、N',local_size表示NDRange中工作组尺寸,默认情况下,其值为16,在 计算过程中,每个工作组内包含16×16个工作项,每个工作项计算部分结果, 具体过程如下:
S301、OpenCL自动为每个工作项分配工作组索引groupID和工作组中工作 项索引localID;
S302、设置宏unroll_m_float4与unroll_n_float4,每个结果采用OpenCL中float4 类型存储,一个float4数组包含四个结果,默认两个宏数值均为1,即一个工作 项计算4×4×1×1个结果,发挥最大计算性能;
S303、工作组内的每个工作项采用向量类型,从全局存储器加载4×4×unroll_m_float4×unroll_n_float4个数据至局部存储器,
为了避免因存储体冲突造成的延时,每个工作项采用跨块访问方式计算结 果,每个结果在矩阵中的位置计算公式为:
BS×N×by×unroll_m+bx×BS*unroll_n+ty×N+ii*BS×N+tx+jj×BS
其中,bx、by、tx、ty分别为该工作项的所在工作组id以及局部id,BS为块 大小,视不同GPU而定,一般为16,unroll_m和unroll_n为每个工作项在行列方 向计算的结果个数,ii、jj为循环变量,同时使用OpenCL中barrier原语进行同 步,保证结果写入局部存储器;
S304、根据矩阵分块原理,每个工作项计算各自结果,并采用barrier原语保 证工作组内所有工作项都已经使用完加载进局部存储器的数据,累加计算结果, 将计算所得的子矩阵写回全局存储器。
GPU按照划分的子矩阵计算每个子矩阵的运算结果,根据矩阵分块原理,矩 阵计算过程及结果可表示为:
Figure BDA0001993806850000081
计算所得的矩阵大小为M'×N',为了获取最终计算结果A×B,需要去除S1 中零填充,具体过程如下:
S401、在OpenCL主机端,分配大小为M'×N'×sizeof(type)的连续内存,并从 GPU全局内存读取计算结果,记录内存首地址p;
S402、从地址p开始,拷贝N个数据,并将地址p后移N';
S403、重复执行S402,直至拷贝M次。
表1本发明加速效果图
Figure BDA0001993806850000082
通过优化GPU存储访问、使用向量加载语句、控制单工作项计算数量等方 式对稠密矩阵乘法进行优化,极大缩短计算时间,提升了整体任务的加速比,对 于规模4096×4096的两个稠密矩阵,乘法运算只需60.65ms,比不做任何优化提 高了进100倍。
以上内容仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡 是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发 明权利要求书的保护范围之内。

Claims (5)

1.一种基于OpenCL的稠密矩阵乘GPU加速方法,其特征在于,先在CPU上对稠密矩阵A和稠密矩阵B进行边界补齐,矩阵A和B的尺寸为OpenCL工作组的倍数;然后CPU将填充后矩阵A和B的数据传送给GPU;进行任务分配和设备内存优化,采用矩阵分块思想将矩阵待计算数据缓存至GPU局部存储器;采用向量计算合并多个矩阵元素;采用单个工作项计算多个数据方式;最后GPU按照划分的子矩阵计算每个子矩阵的运算结果,去除补齐的边界部分,将计算结果返回CPU完成加速;
对稠密矩阵A和稠密矩阵B进行边界补齐,填充后稠密矩阵A和B的尺寸变为M'×P'、P'×N',具体为:
M'=M+(ls-M%ls)%ls
N'=N+(ls-N%ls)%ls
P'=P+(ls-P%ls)%ls
其中,M、P、N为矩阵原始维度,M'、P'、N'为矩阵零填充部分以及矩阵填充后维度,ls为OpenCL工作组尺寸;
任务分配和设备内存优化中,对矩阵进行子矩阵划分,将矩阵相乘任务分配到GPU的工作组执行,并根据合并访存原则优化内存使用;分别采用GPU的SIMD指令以及单个工作项计算多个数据的方式,并将数据读入本地内存,定义GPU内核函数如下:
Matrix_Mul<global_size,local_size>
其中,global_size表示内核函数NDRange大小,local_size表示NDRange中工作组尺寸,NDRange中工作组尺寸local_size取16,在计算过程中,每个工作组内包含16×16个工作项;
GPU按照划分的子矩阵计算每个子矩阵的运算结果后,先去除稠密矩阵A和稠密矩阵B进行边界补齐中的零填充。
2.根据权利要求1所述的基于OpenCL的稠密矩阵乘GPU加速方法,其特征在于,稠密矩阵A和B的尺寸分别为M×P、P×N,设定OpenCL工作组尺寸ls,在稠密矩阵A和B外进行零填充,填充后矩阵变为:
Figure FDA0002928019400000021
3.根据权利要求1所述的基于OpenCL的稠密矩阵乘GPU加速方法,其特征在于,每个工作项计算过程如下:
S301、OpenCL为每个工作项分配工作组索引groupID和工作组中工作项索引localID;
S302、设置宏unroll_m_float4与unroll_n_float4,每个结果采用OpenCL中float4类型存储,一个float4数组包含四个结果,默认两个宏数值均为1;
S303、工作组内的每个工作项采用向量类型,从全局存储器加载4×4×unroll_m_float4×unroll_n_float4个数据至局部存储器;
S304、根据矩阵分块原理,每个工作项计算各自结果,采用barrier原语保证工作组内所有工作项均使用完加载进局部存储器的数据,累加计算结果,将计算所得的子矩阵写回全局存储器。
4.根据权利要求3所述的基于OpenCL的稠密矩阵乘GPU加速方法,其特征在于,步骤S303中,每个工作项采用跨块访问方式计算结果,每个结果在矩阵中的位置计算公式为:
BS×N×by×unroll_m+bx×BS*unroll_n+ty×N+ii*BS×N+tx+jj×BS
其中,bx、by、tx、ty分别为该工作项的所在工作组id以及局部id,BS为块大小,unroll_m和unroll_n为每个工作项在行列方向计算的结果个数,ii、jj为循环变量,同时使用OpenCL中barrier原语进行同步。
5.根据权利要求1所述的基于OpenCL的稠密矩阵乘GPU加速方法,其特征在于,去除稠密矩阵A和稠密矩阵B中零填充的步骤如下:
S401、在OpenCL主机端,分配大小为M'×N'×sizeof(type)的连续内存,并从GPU全局内存读取计算结果,记录内存首地址p;
S402、从地址p开始,拷贝N个数据,并将地址p后移N';
S403、重复执行S402,直至拷贝M次。
CN201910191263.8A 2019-03-13 2019-03-13 一种基于OpenCL的稠密矩阵乘GPU加速方法 Active CN109976810B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910191263.8A CN109976810B (zh) 2019-03-13 2019-03-13 一种基于OpenCL的稠密矩阵乘GPU加速方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910191263.8A CN109976810B (zh) 2019-03-13 2019-03-13 一种基于OpenCL的稠密矩阵乘GPU加速方法

Publications (2)

Publication Number Publication Date
CN109976810A CN109976810A (zh) 2019-07-05
CN109976810B true CN109976810B (zh) 2021-07-13

Family

ID=67078851

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910191263.8A Active CN109976810B (zh) 2019-03-13 2019-03-13 一种基于OpenCL的稠密矩阵乘GPU加速方法

Country Status (1)

Country Link
CN (1) CN109976810B (zh)

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103631761A (zh) * 2012-08-29 2014-03-12 睿励科学仪器(上海)有限公司 并行处理架构进行矩阵运算并用于严格波耦合分析的方法

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103049241B (zh) * 2013-01-24 2015-10-14 重庆邮电大学 一种提高cpu+gpu异构装置计算性能的方法
US9910714B2 (en) * 2015-06-29 2018-03-06 Advanced Micro Devices, Inc. Scriptable dynamic load balancing in computer systems
CN108960203B (zh) * 2018-08-01 2021-08-17 西安电子科技大学 一种基于fpga异构计算的车辆检测方法

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103631761A (zh) * 2012-08-29 2014-03-12 睿励科学仪器(上海)有限公司 并行处理架构进行矩阵运算并用于严格波耦合分析的方法

Also Published As

Publication number Publication date
CN109976810A (zh) 2019-07-05

Similar Documents

Publication Publication Date Title
US20210201124A1 (en) Systems and methods for neural network convolutional layer matrix multiplication using cache memory
CN112559163B (zh) 优化张量计算性能的方法及装置
CN103336758A (zh) 一种稀疏矩阵的存储方法CSRL及基于该方法的SpMV实现方法
CN110516316B (zh) 一种间断伽辽金法求解欧拉方程的gpu加速方法
CN110515053B (zh) 基于cpu和多gpu的异构平台sar回波仿真并行方法
EP3742350A1 (en) Parallelization strategies for training a neural network
US11556757B1 (en) System and method of executing deep tensor columns in neural networks
CN110135569A (zh) 一种异构平台神经元定位三级流水并行方法、系统及介质
WO2024027039A1 (zh) 数据处理方法、装置、设备和可读存储介质
CN108470211B (zh) 一种卷积计算的实现方法、设备和计算机存储介质
CN111949932A (zh) 一种在TVM中实现TensorCore卷积计算的方法及系统
Bisson et al. A GPU implementation of the sparse deep neural network graph challenge
Creel et al. High performance implementation of an econometrics and financial application on GPUs
CN114490011A (zh) N体模拟在异构架构的并行加速实现方法
CN108615262A (zh) 一种基于gpu的海量模型并行碰撞检测方法
US20090064120A1 (en) Method and apparatus to achieve maximum outer level parallelism of a loop
CN109976810B (zh) 一种基于OpenCL的稠密矩阵乘GPU加速方法
CN106484532B (zh) 面向sph流体模拟的gpgpu并行计算方法
Kim et al. Las: locality-aware scheduling for GEMM-accelerated convolutions in GPUs
CN110490308B (zh) 加速库的设计方法、终端设备及存储介质
Giuliani et al. Face coloring in unstructured CFD codes
CN115906684A (zh) 面向申威架构的流体动力学多重网格求解器并行优化方法
CN108038304B (zh) 一种利用时间局部性的格子玻尔兹曼方法并行加速方法
CN111104765B (zh) 基于神威架构的气体动理学算法优化方法
CN110187975B (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