KR101737785B1 - Apparatus and method for program compilation - Google Patents
Apparatus and method for program compilation Download PDFInfo
- Publication number
- KR101737785B1 KR101737785B1 KR1020150190701A KR20150190701A KR101737785B1 KR 101737785 B1 KR101737785 B1 KR 101737785B1 KR 1020150190701 A KR1020150190701 A KR 1020150190701A KR 20150190701 A KR20150190701 A KR 20150190701A KR 101737785 B1 KR101737785 B1 KR 101737785B1
- Authority
- KR
- South Korea
- Prior art keywords
- circuit
- unit circuit
- unit
- loop statement
- statements
- Prior art date
Links
- 238000000034 method Methods 0.000 title claims abstract description 55
- 238000004364 calculation method Methods 0.000 claims description 13
- 238000004590 computer program Methods 0.000 claims description 7
- 230000003362 replicative effect Effects 0.000 claims description 2
- 230000015654 memory Effects 0.000 description 28
- 238000010586 diagram Methods 0.000 description 8
- 230000008569 process Effects 0.000 description 8
- 230000006870 function Effects 0.000 description 7
- 238000012545 processing Methods 0.000 description 7
- 230000015572 biosynthetic process Effects 0.000 description 6
- 238000003786 synthesis reaction Methods 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 4
- 238000004891 communication Methods 0.000 description 2
- 238000009795 derivation Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000003491 array Methods 0.000 description 1
- 230000015556 catabolic process Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000006731 degradation reaction Methods 0.000 description 1
- PWPJGUXAGUPAHP-UHFFFAOYSA-N lufenuron Chemical compound C1=C(Cl)C(OC(F)(F)C(C(F)(F)F)F)=CC(Cl)=C1NC(=O)NC(=O)C1=C(F)C=CC=C1F PWPJGUXAGUPAHP-UHFFFAOYSA-N 0.000 description 1
- 230000001151 other effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000007723 transport mechanism Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3867—Concurrent instruction execution, e.g. pipeline or look ahead using instruction pipelines
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Logic Circuits (AREA)
Abstract
The present invention relates to a program compiling apparatus and a program compiling method. According to a first aspect of the present invention, there is provided a program compiling apparatus for compiling an OpenCL program, the program compiling apparatus comprising: a syntax separator for separating an OpenCL kernel into statements before a loop statement, statements after a loop statement, and statements after a loop statement; A circuit generator, and a language generator for expressing the generated circuit in a hardware description language.
Description
The present invention relates to a program compiling apparatus and a program compiling method, and more particularly, to an apparatus and method for compiling an OpenCL program for an FPGA.
OpenCL (Open Computing Language) is a standard programming model for programs running in heterogeneous computing environments, defining the OpenCL platform and defining the execution of OpenCL applications on a defined platform.
The OpenCL platform consists of one host processor and one or more compute devices connected to it.
The computing device has one or more compute units (CUs), each of which is again comprised of one or more processing elements (PEs).
Typically, the host processor is a CPU, and the operating system runs on the host processor. The computing device corresponds to a multicore CPU or accelerator (GPU, Intel Xeon Phi coprocessor, FPGA, etc.).
If the system in which the OpenCL platform is implemented is a heterogeneous system equipped with a field programmable gate array (FPGA), the CPU becomes a host processor and the FPGA becomes a computing device. The FPGA processes multiple work items processed by the computing device in parallel according to the instructions of the host program executed by the CPU.
The way to run multiple work items in parallel is to create a circuit corresponding to one work item and then use pipelining techniques to divide the circuit into multiple pipeline stages, There is a way to process work items at the same time.
As another method, there is a method of creating a plurality of circuits corresponding to one work item (hereinafter, referred to as "unit circuits" for convenience), and independently processing different work items in each unit circuit.
In general, we use both methods to handle the OpenCL kernel. In other words, as the capacity of the FPGA permits, multiple unit circuits are replicated and multiple work items are simultaneously executed by the pipelining method in each unit circuit.
However, if there are loops in the kernel, the number of work items that can be processed simultaneously in a unit circuit is reduced to the number of pipeline stages that execute the contents of the loop, not the total number of pipeline stages. As long as the pipeline stage of the loop statement is not terminated, the work item is stalled without processing, and the utilization of the FPGA is degraded.
Korean Patent Laid-Open No. 10-2014-0097548, which is related to the prior art, relates to a software library for heterogeneous parallel processing platforms, wherein the library source code in the OpenCL framework is compiled into an intermediate representation and distributed to the final user computing system , The CPU of the computer system compiles the intermediate representation of the library into a binary that runs on the GPU, executes the host application that calls the kernel, and sends the kernel retrieved from the binaries to the GPU. However, the prior art documents do not solve the problems as described above.
Therefore, a technique for solving the above-described problems is required.
On the other hand, the background art described above is technical information acquired by the inventor for the derivation of the present invention or obtained in the derivation process of the present invention, and can not necessarily be a known technology disclosed to the general public before the application of the present invention .
An embodiment of the present invention is directed to an apparatus and method for compiling an OpenCL program for an FPGA.
In addition, an embodiment of the present invention aims at minimizing unnecessary circuits.
According to a first aspect of the present invention, there is provided a program compilation apparatus for compiling an Open CL program, the syntax of the OpenCL kernel including a syntax for separating an OpenCL kernel into a syntax before a loop statement, A circuit generator for generating a circuit corresponding to each syntax, and a language generator for representing the generated circuit in a hardware description language.
According to a second aspect of the present invention, there is provided a method of compiling an OpenCL program, the method comprising: dividing an OpenCL kernel into statements before a loop statement, statements after a loop statement, and statements after a loop statement; And expressing the generated circuit in a hardware description language.
According to a third aspect of the present invention, there is provided a computer-readable recording medium on which a program for performing a program compilation method is recorded. The program compilation method includes: dividing an OpenCL kernel into statements before a loop statement, Generating a circuit corresponding to each statement, and representing the generated circuit in a hardware description language.
According to a fourth aspect of the present invention, there is provided a computer program stored in a recording medium for performing a program compilation method, the program compiling method comprising the steps of: Separating into a statement after the loop statement, generating a circuit corresponding to each statement, and expressing the generated circuit in a hardware description language.
According to one of the above-mentioned objects of the present invention, an embodiment of the present invention is directed to an apparatus and a method for compiling an OpenCL program for an FPGA.
In addition, according to any one of the above-described embodiments of the present invention, an embodiment of the present invention includes a method of reproducing a circuit for processing an iterative statement included in a kernel called by a host program using OpenCL by using an FPGA , The performance bottleneck of the program by the loop statement can be reduced, and the performance degradation of the system can be prevented.
Further, according to any one of the tasks of the present invention, instead of replicating a circuit for processing contents outside the above-mentioned loop to the OpenCL kernel including the loop statement, .
In addition, according to any one of the tasks of the present invention, unnecessary circuits are minimized, thereby efficiently using FPGA hardware, and consequently, power consumption can be lowered and performance can be improved.
The effects obtained by the present invention are not limited to the above-mentioned effects, and other effects not mentioned can be clearly understood by those skilled in the art from the following description will be.
1 is a configuration diagram of an OpenCL platform system according to an embodiment of the present invention.
2 is a block diagram illustrating a program compiling apparatus according to an embodiment of the present invention.
3 is a flowchart illustrating a method of compiling a program according to an embodiment of the present invention.
4 to 5 are exemplary diagrams for explaining a program compiling method according to an embodiment of the present invention.
Hereinafter, embodiments of the present invention will be described in detail with reference to the accompanying drawings, which will be readily apparent to those skilled in the art. The present invention may, however, be embodied in many different forms and should not be construed as limited to the embodiments set forth herein. In order to clearly illustrate the present invention, parts not related to the description are omitted, and similar parts are denoted by like reference characters throughout the specification.
Throughout the specification, when a part is referred to as being "connected" to another part, it includes not only "directly connected" but also "electrically connected" with another part in between . Also, when an element is referred to as "comprising ", it means that it can include other elements as well, without departing from the other elements unless specifically stated otherwise.
DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTS Hereinafter, the present invention will be described in detail with reference to the accompanying drawings.
1 is a configuration diagram of an OpenCL
The OpenCL
Such a
For example, the
The
And the
The
The
The
At this time, the OpenCL program constituting the Open CL application is composed of several kernel functions, and is written in the language called OpenCL C, which is similar to C, and can be executed in the
When the OpenCL application is executed in the OpenCL
At this time, each index of the NDRange is referred to as a work item, and the work items can be classified into a work group.
The
Each work group can be executed in each of one or
On the other hand, when the
That is, it is necessary to implement an FPGA circuit that takes an OpenCL program, specifically, a kernel function of an OpenCL program as input, and parallelizes various work items of the kernel function.
To do this, a circuit structure is represented by a hardware description language such as Verilog or VHDL as a technology for implementing an FPGA circuit, and a circuit structure of an FPGA can be implemented using the hardware description language, which is called logic synthesis.
On the other hand, there is a way to write a program in a general high-level language such as the C language, and to change the hardware structure of the FPGA accordingly, which is called high-level synthesis.
High-level synthesis is a process of creating a circuit structure by taking a program written in a high-level language as input, and changing the circuit structure of the FPGA by applying logic synthesis technology. In this case, the separated processes are conceptually separated, and they do not necessarily have to be divided into two independent steps.
For example, a high-level synthesis may be performed by a single software. In this case, the hardware description language of the circuit structure is not a human-readable language such as Verilog or VHDL. Instead, It may be an intermediate representation.
The present invention describes a method for implementing an FPGA circuit that processes an OpenCL kernel including a loop through a high-level synthesis.
At this time, the program compiling apparatus according to an exemplary embodiment of the present invention may be an arbitrary component on the
2 is a block diagram illustrating a
As shown in FIG. 2, the
That is, the
Meanwhile, the
In addition, the
Meanwhile, the
The
At this time, in order to minimize the number of the first unit circuit and the third unit circuit and to maximize the number of the second unit circuits, the
Also, the
In addition, the
Meanwhile, the
Although the program compiling apparatus according to an embodiment of the present invention has been described as being implemented by a host processor, the term " part " used in the present embodiment means performing a certain role, Means a hardware component such as software or an FPGA or an ASIC, and may also be a CPU, a GPU, or the like. However, 'part' is not meant to be limited to software or hardware. &Quot; to " may be configured to reside on an addressable storage medium and may be configured to play one or more processors. Thus, by way of example, 'parts' may refer to components such as software components, object-oriented software components, class components and task components, and processes, functions, , Subroutines, segments of program patent code, drivers, firmware, microcode, circuitry, data, databases, data structures, tables, arrays, and variables.
The functions provided within the components and components may be combined with a smaller number of components and components or separated from additional components and components.
In addition, the components and components may be implemented to play back one or more CPUs in a device or a secure multimedia card
3 is a flowchart illustrating a method of compiling a program according to an embodiment of the present invention.
The method for compiling a program according to the embodiment shown in FIG. 3 includes steps that are processed in a time-series manner in the
3 is described below with reference to Figs. 4 and 5. 4 and 5 are diagrams for explaining a program compiling method according to an embodiment of the present invention, and FIG. 4 is an exemplary diagram of an FPGA implementing an OpenCL kernel including a loop statement according to an embodiment of the present invention And FIG. 5 is an exemplary diagram illustrating an FPGA implementing an OpenCL kernel including a plurality of loop statements according to an embodiment of the present invention.
The
For this, the
Thereafter, the
Referring to FIG. 4, the
At this time, the first to
On the other hand, each of the first through third unit circuits shown in FIG. 4 is assumed to have two pipeline stages, but according to another embodiment, at least one pipeline stage of the unit circuits may be implemented.
That is, each of the first to
The execution result of the last pipeline stage of the
For example, if the condition value of the loop statement is false, the work item exits from the loop statement, and therefore, the
According to the embodiment, the
That is, when the work item repeats the contents of the loop in the loop by several tens to hundreds of times, the number of the
Thereafter, the
That is, between the
4, the
The first and
That is, according to one embodiment of the present invention, the
In this case, the first signal may be 1 when the condition value is false, or may be 0 when the condition value is false, and may be 0 when the
For example, when a specific work item reaches the last pipeline stage of the
Alternatively, for example, if the value of the first signal is all 0, the
According to still another embodiment of the present invention, the
For example, if there is one
In this case, the second signal may be 1 when the condition value determined in the last pipeline stage of the
4, it is assumed that one loop is included in the OpenCL kernel. However, if the OpenCL kernel includes one or more loops, it may be divided into several loops based on each loop, Can be implemented as a unit circuit.
5, an OpenCL kernel is divided into first to second iterations according to an embodiment of the present invention. Referring to FIG. 5, in step S310, The
The
Finally, the
The method for compiling a program according to the embodiment described with reference to FIG. 3 may also be implemented in the form of a recording medium including instructions executable by a computer, such as a program module executed by a computer. Computer readable media can be any available media that can be accessed by a computer and includes both volatile and nonvolatile media, removable and non-removable media. In addition, the computer-readable medium may include both computer storage media and communication media. Computer storage media includes both volatile and nonvolatile, removable and non-removable media implemented in any method or technology for storage of information such as computer readable instructions, data structures, program modules or other data. Communication media typically includes any information delivery media, including computer readable instructions, data structures, program modules, or other data in a modulated data signal such as a carrier wave, or other transport mechanism.
The method for compiling a program according to an embodiment of the present invention may also be implemented as a computer program (or a computer program product) including instructions executable by a computer. A computer program includes programmable machine instructions that are processed by a processor and can be implemented in a high-level programming language, an object-oriented programming language, an assembly language, or a machine language . The computer program may also be recorded on a computer readable recording medium of a type (e.g., memory, hard disk, magnetic / optical medium or solid-state drive).
Thus, a method of compiling a program according to an embodiment of the present invention can be implemented by a computer program as described above being executed by a computing device. The computing device may include a processor, a memory, a storage device, a high-speed interface connected to the memory and a high-speed expansion port, and a low-speed interface connected to the low-speed bus and the storage device. Each of these components is connected to each other using a variety of buses and can be mounted on a common motherboard or mounted in any other suitable manner.
Where the processor may process instructions within the computing device, such as to display graphical information to provide a graphical user interface (GUI) on an external input, output device, such as a display connected to a high speed interface And commands stored in memory or storage devices. As another example, multiple processors and / or multiple busses may be used with multiple memory and memory types as appropriate. The processor may also be implemented as a chipset comprised of chips comprising multiple independent analog and / or digital processors.
The memory also stores information within the computing device. In one example, the memory may comprise volatile memory units or a collection thereof. In another example, the memory may be comprised of non-volatile memory units or a collection thereof. The memory may also be another type of computer readable medium such as, for example, a magnetic or optical disk.
And the storage device can provide a large amount of storage space to the computing device. The storage device may be a computer readable medium or a configuration including such a medium and may include, for example, devices in a SAN (Storage Area Network) or other configurations, and may be a floppy disk device, a hard disk device, Or a tape device, flash memory, or other similar semiconductor memory device or device array.
It will be understood by those skilled in the art that the foregoing description of the present invention is for illustrative purposes only and that those of ordinary skill in the art can readily understand that various changes and modifications may be made without departing from the spirit or essential characteristics of the present invention. will be. It is therefore to be understood that the above-described embodiments are illustrative in all aspects and not restrictive. For example, each component described as a single entity may be distributed and implemented, and components described as being distributed may also be implemented in a combined form.
The scope of the present invention is defined by the appended claims rather than the detailed description and all changes or modifications derived from the meaning and scope of the claims and their equivalents are to be construed as being included within the scope of the present invention do.
100: OpenCL platform system
10: Host processor
20: computing device
21: calculation unit 24: local memory
22: PE 25: Private memory
23: Device memory
43: first unit circuit
44: second unit circuit
45: third unit circuit
50: first control circuit
51: second control circuit
Claims (16)
A syntactic separator that separates the OpenCL kernel into statements before the loop statement, statements after the loop statement, and statements after the loop statement;
A circuit generator for generating a circuit corresponding to each syntax; And
And a language generator for expressing the generated circuit in a hardware description language,
Wherein the circuit generation unit is configured to generate a plurality of circuits corresponding to the statements in the loop structure in which the number of circuits corresponding to the loop statement syntax is maximized and the number of circuits respectively corresponding to the statement before the loop statement and the statements after the loop statement is minimized, And replicates the circuit corresponding to the phrase statement in a predetermined number of times or more based on the capacity.
Further comprising a graph generating unit for generating a control flow graph based on the OpenCL kernel,
Wherein the syntax separator comprises:
And separates the OpenCL kernel into statements before the loop statement, statements after the loop statement, and statements after the loop statement based on the control flow graph.
Wherein the circuit generating unit includes:
Generates a first unit circuit corresponding to the statement before the loop statement, a second unit circuit corresponding to the loop statement syntax, and a third unit circuit corresponding to the statement after the loop statement.
Wherein the circuit generating unit includes:
And replicates the second unit circuit more than a predetermined number of times to generate at least one second unit circuit.
Wherein the first unit circuit to the third unit circuit are constituted by one or more pipeline stages so that one or more work items can be executed simultaneously.
Wherein the circuit generating unit includes:
Further comprising a first control circuit between the first unit circuit and the second unit circuit, and a second control circuit between the second unit circuit and the third unit circuit.
Wherein the first control circuit receives and checks a first signal value indicating that a new work item can enter the second unit circuit from the second unit circuit,
And the second control circuit receives from the second unit circuit a second signal value indicating that the work item in the second unit circuit should escape from the second unit circuit.
Separating the OpenCL kernel into statements before the loop statement, statements after the loop statement, and statements after the loop statement;
Generating a circuit corresponding to each syntax; And
And expressing the generated circuit in a hardware description language,
Wherein the step of generating the circuit comprises the steps of: executing the OpenCL kernel so that the number of circuits corresponding to the loop statement syntax becomes a maximum, and the number of circuits corresponding to the statements before the loop statement and the statements after the loop statement is minimized, The circuit corresponding to the loop statement syntax is replicated a predetermined number of times or more based on the capacity of the calculation device for the program.
Further comprising generating a control flow graph based on the OpenCL kernel,
Wherein said separating comprises:
And separating the OpenCL kernel into statements before the loop statement, statements after the loop statement, and statements after the loop statement based on the control flow graph.
Wherein the step of generating the circuit comprises:
Generating a first unit circuit corresponding to the statement before the loop statement, a second unit circuit corresponding to the loop statement syntax, and a third unit circuit corresponding to the statement after the loop statement.
Wherein the step of generating the circuit comprises:
Further comprising: replicating the second unit circuit more than a predetermined number of times to generate at least one second unit circuit.
Wherein the first unit circuit and the third unit circuit are configured as one or more pipeline stages to execute one or more work items at the same time.
Wherein the step of generating the circuit comprises:
Further comprising generating and combining a first control circuit between the first unit circuit and the second unit circuit and a second control circuit between the second unit circuit and the third unit circuit.
Wherein the first control circuit receives and checks a first signal value indicating that a new work item can enter the second unit circuit from the second unit circuit,
Wherein the second control circuit receives from the second unit circuit a second signal value indicating that the work item in the second unit circuit should escape from the second unit circuit.
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/KR2016/000228 WO2016114532A1 (en) | 2015-01-16 | 2016-01-11 | Program compile device and program compile method |
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
KR1020150007904 | 2015-01-16 | ||
KR20150007904 | 2015-01-16 |
Publications (2)
Publication Number | Publication Date |
---|---|
KR20160088796A KR20160088796A (en) | 2016-07-26 |
KR101737785B1 true KR101737785B1 (en) | 2017-05-19 |
Family
ID=56680976
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR1020150190701A KR101737785B1 (en) | 2015-01-16 | 2015-12-31 | Apparatus and method for program compilation |
Country Status (1)
Country | Link |
---|---|
KR (1) | KR101737785B1 (en) |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2013164847A (en) * | 2012-02-09 | 2013-08-22 | Altera Corp | Configuration of programmable device using high-level language |
-
2015
- 2015-12-31 KR KR1020150190701A patent/KR101737785B1/en active IP Right Grant
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2013164847A (en) * | 2012-02-09 | 2013-08-22 | Altera Corp | Configuration of programmable device using high-level language |
Also Published As
Publication number | Publication date |
---|---|
KR20160088796A (en) | 2016-07-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10372431B2 (en) | Unified intermediate representation | |
TWI437491B (en) | Computing device configured to translate an application program for execution by a general purpose processor | |
TWI550412B (en) | A method to be performed in a computer platform having heterogeneous processors and a computer platform | |
US9361079B2 (en) | Method for compiling a parallel thread execution program for general execution | |
US11714780B2 (en) | Compiler flow logic for reconfigurable architectures | |
US20080250227A1 (en) | General Purpose Multiprocessor Programming Apparatus And Method | |
US9645802B2 (en) | Technique for grouping instructions into independent strands | |
US9760356B2 (en) | Loop nest parallelization without loop linearization | |
KR20200002027A (en) | Graph matching for optimized deep network processing | |
US20220269492A1 (en) | Compiler-initiated tile replacement to enable hardware acceleration resources | |
US20190278605A1 (en) | Software-controlled variable wavefront size execution at gpu | |
CN114830135A (en) | Hierarchical partitioning of operators | |
TW201435576A (en) | Cooperative thread array granularity context switch during trap handling | |
US9766866B2 (en) | Techniques for determining instruction dependencies | |
KR101737785B1 (en) | Apparatus and method for program compilation | |
KR101117430B1 (en) | Retargetting an application program for execution by a general purpose processor | |
US9891955B2 (en) | Heterogenous multicore processor configuration framework | |
KR20220002601A (en) | Running software-controlled variable wavefront sizes on GPU | |
US20240094944A1 (en) | Implementing data flows of an application across a memory hierarchy of a data processing array | |
KR101948135B1 (en) | Method for executing application of heterogeneous system, and heterogeneous system for performing the same | |
US9772827B2 (en) | Techniques for determining instruction dependencies | |
KR101867423B1 (en) | Apparatus for processing image and method thereof | |
KR101897624B1 (en) | Data distribution technique for heterogeneous system | |
US10097618B2 (en) | Cluster system and communication method in cluster system | |
JP2005332110A (en) | Simulation system |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A201 | Request for examination | ||
E902 | Notification of reason for refusal | ||
E701 | Decision to grant or registration of patent right |