JPWO2014064798A1 - 実行制御方法及び情報処理装置 - Google Patents

実行制御方法及び情報処理装置 Download PDF

Info

Publication number
JPWO2014064798A1
JPWO2014064798A1 JP2014543074A JP2014543074A JPWO2014064798A1 JP WO2014064798 A1 JPWO2014064798 A1 JP WO2014064798A1 JP 2014543074 A JP2014543074 A JP 2014543074A JP 2014543074 A JP2014543074 A JP 2014543074A JP WO2014064798 A1 JPWO2014064798 A1 JP WO2014064798A1
Authority
JP
Japan
Prior art keywords
code
loop
true
conditional branch
true rate
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
Application number
JP2014543074A
Other languages
English (en)
Other versions
JP6179524B2 (ja
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.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
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 Fujitsu Ltd filed Critical Fujitsu Ltd
Publication of JPWO2014064798A1 publication Critical patent/JPWO2014064798A1/ja
Application granted granted Critical
Publication of JP6179524B2 publication Critical patent/JP6179524B2/ja
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
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops
    • 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 or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • G06F9/3844Speculative instruction execution using dynamic branch prediction, e.g. using branch history tables
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording 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/3466Performance evaluation by tracing or monitoring
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • 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/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30058Conditional branch instructions
    • 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/32Address formation of the next instruction, e.g. by incrementing the instruction counter
    • G06F9/322Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address
    • G06F9/325Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address for loops, e.g. loop detection or loop counter
    • 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • G06F9/45525Optimisation or modification within the same instruction set architecture, e.g. HP Dynamo
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording 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/3409Recording 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 for performance assessment
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/865Monitoring of software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/88Monitoring involving counting

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Advance Control (AREA)
  • Executing Machine-Instructions (AREA)
  • Complex Calculations (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本技術によれば、内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ条件分岐がそのままコード化されたループについての第1のコード、又はオブジェクトコードに含まれ且つ条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて前記条件が真となる場合における分岐先演算を実行するための第2のコードを実行している間において、条件分岐による条件が真となった回数についての特徴量を取得する。そして、取得された特徴量に基づき、第2のコードと、オブジェクトコードに含まれ且つ述語付き命令を用いて条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第3のコードとのうちいずれかをプロセッサに実行させる。

Description

本技術は、オブジェクトコードの実行制御技術に関する。
スーパーコンピュータの進歩と共に、その上で動作するアプリケーションプログラムも複雑化してきている。例えば、空間軸や時間軸に沿って単一の処理内容を繰り返し行う処理(例えば単純なDOループ処理)が主流であったが、個々の空間によって処理内容を変えたり、時間進展と共に処理内容を変えたりするようになった。すなわち、繰り返し処理において様々な条件(プログラムコードではIF文に相当)に対応する処理を含むアプリケーションプログラムが開発され、より現実的なシミュレーションをコンピュータ上で実行するようになってきている。そして、このような複雑に動作するアプリケーションプログラムを、高性能なコンピュータ上でいかに高速に動作させるかが1つの課題となっている。
DOループ中にIF文が含まれるコードをコンパイラ最適化によって高速化する方法として、述語付き命令(predicated instruction)を用いた高速化手法や、リストベクトルを生成して高速化する手法が存在する。
例えば図1Aに示すようなIF文を含むDOループの場合、通常であれば図1Bに示すようなコードが生成される。すなわち、x(i)>0がTRUEであれば、「TRUE」で囲った部分の命令の実行が行われ、x(i)>0がFALSEであれば、分岐命令fbleからL0のラインにジャンプしてFALSEの場合の命令を実行するようなコードが生成される。一方、述語付き命令を用いる場合には、図1Cに示すようなコードが生成される。図1Cにおいて点線の四角で示すように、分岐命令は含まれておらず、常にTRUEの場合の命令及びFALSEの場合の命令が実行され、x(i)>0がFALSEであればTRUEについての述語付き「store」命令はキャンセルされ且つTRUEについての演算結果は破棄されるようなコードが生成される。
従って、例えばDOループ内のIF文についてFALSEの時に何もしないというコードの場合、図2に示すように、IF文の条件が常に真と判断される場合、すなわち真率(=TRUEについての命令実行回数/DOループの実行回数)が100%であれば、実行する命令の全てが有効となる。一方、例えば真率が100%ではないが90%と高い場合には、実行する命令のうち有効な命令aは多いが、一部冗長な命令も出てくる。そして、真率が10%と低くなると、有効な命令が少なくなって、冗長な命令bが多くなってしまう。すなわち、真率が高くないと多くの演算結果が破棄されるので高命令実行効率の効果が得られない。
この手法によれば、図3Aに示すようにDOループを何度も実行する場合に、真率が高いままでおおよそ一定であれば、全体としても有効な命令の数が多くなって、高速化の効果が得られる。一方、図3Bに示すように、真率が低いままでおおよそ一定であれば、全体としても冗長な命令数が多くなって、高命令実行効率の効果が全く得られない。このように真率がおおよそ一定であれば、真率が高い場合には述語付き命令を用いる手法を用いることが有効であるが、図3Cに示すように、DOループを繰り返して実行するうちに、途中で真率が大幅に変化するといった状況が発生すると、途中から大幅に命令の実行効率が低下するという問題がある。なお、述語付き命令を用いる場合には、図3A乃至図3Cに模式的に示すように、処理時間自体は真率に拘わらず一定であり、演算実行効率が変化することになる。
また、図4Aに示すようなIF文を含むDOループであってTRUEの場合には命令が存在するがFALSEの場合に命令が存在しない場合、リストベクトルを生成する手法によれば、図4Bに模式的に示すようなコードが生成される。すなわち、IF文についての条件が真となるときのインデックスiをリストベクトルindex(jjj)に設定するループについてのコードcと、リストベクトルindexに設定されているインデックスiについてのみ演算を繰り返すループ(リストベクトルループとも呼ぶ)についてのコードdとが生成される。すなわち、IF節とTHEN節を分離して、分岐命令のないTHEN節を高速化するものである。
このようなリストベクトルを生成する手法においては、リストベクトルを生成するコードcの実行は真率に拘わらず常に行われるが、図5Aに模式的に示すように、例えば90%と真率が高ければリストベクトルに含まれるインデックスの数が多くなり、リストベクトルループのための処理時間が長くなる。一方、図5Bに模式的に示すように、例えば10%と真率が低ければリストベクトルに含まれるインデックスの数は少なくなり、リストベクトルループのための処理時間が短くなる。このように、IF文における条件がTRUEの場合には命令が存在するがFALSEの場合に命令が存在しない場合、真率が低いほど処理時間が短くなる。このように真率が低い状態で一定であれば、真率が低い場合にはリストベクトルを生成する手法を採用することが効率的であるが、図5Cに示すように、初めは真率が低くて効率的な実行が行われていたとしても、途中で真率が高くなるように状況が変化すると、全体として効率的に実行できるわけではない。
従来技術は、このような問題に対処するような手法を提示していない。
特開昭59−165147号公報
従って、本技術の目的は、一側面によれば、内部に条件分岐を含むループ処理を複数回実行する場合に効率的に演算実行するための技術を提供することである。
本技術に係る実行制御方法は、(A)内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ条件分岐がそのままコード化されたループについての第1のコード、又はオブジェクトコードに含まれ且つ条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて条件が真となる場合における分岐先演算を実行するための第2のコードを実行している間において、条件分岐による条件が真となった回数についての特徴量を取得する処理と、(B)取得された特徴量に基づき、第2のコードと、オブジェクトコードに含まれ且つ述語付き命令を用いて条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第3のコードとのうちいずれかをプロセッサに実行させる処理とを含む。
一側面によれば、内部に条件分岐を含むループ処理を繰り返す場合に効率的に演算実行できるようになる。
図1Aは、ソースコードの一例を示す図である。 図1Bは、通常処理のコードの一例を示す図である。 図1Cは、述語付き命令を用いたコードの一例を示す図である。 図2は、真率と実行効率を説明するための図である。 図3Aは、真率と実行効率を説明するための図である。 図3Bは、真率と実行効率を説明するための図である。 図3Cは、真率と実行効率を説明するための図である。 図4Aは、ソースコードの一例を示す図である。 図4Bは、リストベクトルを生成するコードを模式的に示す図である。 図5Aは、真率と処理時間を説明するための図である。 図5Bは、真率と処理時間を説明するための図である。 図5Cは、真率と処理時間を説明するための図である。 図6は、実施の形態の前処理について説明するための図である。 図7は、本実施の形態に係る実行制御の概要を示す図である。 図8は、本実施の形態に係るコンピュータの構成を示す図である。 図9は、本実施の形態における処理フローを示す図である。 図10は、実行制御処理の処理フローを示す図である。 図11は、真率調査処理の処理フローを示す図である。 図12は、真率調査結果の一例を示す図である。 図13は、コード決定処理の処理フローを示す図である。 図14は、実行制御処理の処理フローを示す図である。 図15は、変形例に係るオブジェクトコードの一例を示す図である。 図16は、実行制御処理の処理フローの変形例を示す図である。 図17は、変形例の処理時間について説明するための図である。 図18は、ループに2つのIF文を含むソースコードの一例を示す図である。 図19は、ループ分割の一例を示す図である。 図20(a)乃至(d)は、ループ分割した場合の処理時間等を説明するための図である。 図21は、コンピュータの機能ブロック図である。
図6を用いて、本技術の実施の形態における前処理の概要を説明する。図6に示すように、本実施の形態に係るランタイムモジュールを利用するユーザは、ソースコード100において、IF文を含み且つ高速化を図るべきループの直前に、コンパイラ200への指示文として「!ocl select−if」文を挿入しておく。本実施の形態では、IF文の条件が真の場合には演算を行うが、IF文の条件が偽の場合には演算を行わないような場合を例に説明する。
本実施の形態に係るコンパイラ200は、このような指示文が挿入されたソースコード100が入力されると、指示文が挿入されていない部分については通常どおりコンパイルを行う。一方、指示文が挿入されている部分について、コンパイラ200は、以下のコードを生成する。すなわち、(A)通常どおり条件分岐を行うコードAと、(B)述語付き命令を用いたコードBと、(C)リストベクトルを生成するコードCと、(D)さらにこれらの直前に、以下で説明するランタイムモジュールに対して、ループの識別子(すなわちループID)とループ内における繰り返し回数とループの実行回数とを含む実行時環境変数をセットする命令「setenv(ループID)」と、(E)ランタイムモジュールからループID及びコード種別の設定を受け取る命令「getenv(ループID,コード種別)」とが生成される。
コードAは、図1Bに示すようなコードであって、条件分岐がそのままコード化されたループについてのコードである。また、コードBは、図1Cに示すようなコードであって、述語付き命令を用いて条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むようにしたループについてのコードである。より具体的には、述語付き命令を用いて条件分岐の条件が真の場合にのみ真の場合における分岐先演算の演算結果をメモリに書き込むようにしたループについてのコードである。さらに、コードCは、図4Bに示すようなコードであって、条件分岐の条件が真となるループインデックスをリストベクトルとして抽出した上で抽出されたループインデックスのみについて条件分岐の条件が真の場合における分岐先演算を実行するためのコードである。
このようなオブジェクトコード300の生成は、オブジェクトコード300を実行するコンピュータと同じコンピュータで行っても良いし、異なるコンピュータで行っても良い。
次に、図7を用いて、このように生成したオブジェクトコード300の実行制御の概要を説明する。図7における横軸の刻みは、コードA乃至Cが生成されたループの実行回数を表している。図7の例では、ループそのものが何度も繰り返し実行されるため、ランタイムモジュールは、5回ループを例えば最初はコードAで実行する間にループ内部のIF文における条件が真である割合、すなわち真率を調査する。この真率調査区間において取得された真率の特徴量(真率の平均値、最小値など)に応じて、真率調査区間終了後、ランタイムモジュールは、コードBとコードCとのうちいずれかを実行するように設定する。背景技術の欄にも述べたようにコードBは真率が高い場合に有効であるから、真率の特徴量が閾値を超えている場合には、コードBを実行するように設定し、真率の特徴量が閾値以下であれば、コードCを実行するように設定する。
その後、図7の例では、15回ループを、設定したコードで実行した後、再度真率調査区間となる。2回目以降の真率調査区間では、本実施の形態では、それまでにコードCを実行している場合にはそのままコードCを実行して真率の特徴量を取得する。一方、それまでにコードBを実行している場合には、真率調査区間ではコードAを実行して真率の特徴量を取得する。そして、真率調査区間終了後、ランタイムモジュールは、上で述べたように、真率の特徴量が閾値を超える場合には、コードBを実行するように設定し、真率の特徴量が閾値以下である場合には、コードCを実行するように設定する。
以上のような処理を、指定されたDOループが実行されなくなるまで繰り返す。これによって、DOループの実行を繰り返しているうちに真率が変化した場合においても、非効率なコードを実行し続けることなく、効率的なコードに実行を動的に切り替えることができるようになる。
なお、以下でも述べるが、真率を算出するためのデータを取得するのにコストが大きくかかるようでは高速化の効果を得ることができないので、CPUが有するハードウエアカウンタを活用する。多くの種類のCPUは、アプリケーションプログラムの実行中にIF文の条件が真の場合の演算を実行した回数やIF文の条件が偽の場合の演算を実行した回数、ループの実行回数、ループ内の繰り返し回数などをカウントすることが可能なハードウエアカウンタを備えている。ランタイムモジュールは、このようなハードウエアカウンタに保持されているカウンタ値を読み出すことで真率算出のためのデータを取得するコストを抑える。
次に、図8を用いて、オブジェクトコード300を実行するコンピュータ1000について説明する。コンピュータ1000は、CPU(Central Processing Unit)1100と、メモリ1200と、ハードディスクドライブなどのデータ格納部1300とを有する。
データ格納部1300は、オブジェクトコード300とランタイムモジュール400とのファイルを格納しており、これらはユーザからの指示に応じてメモリ1200にロードされる。メモリ1200におけるオブジェクトコード300のイメージについてはオブジェクトコード1220として表し、メモリ1200におけるランタイムモジュール400のイメージについてはランタイムモジュール1210として表すものとする。ランタイムモジュール1210がCPU1100により実行されると、ループ特定部1211と、真率計算部1212と、コード決定部1213とが実現される。また、ランタイムモジュール1210は、ユーザによる設定データを格納する設定データ格納部1214を有する。設定データ格納部1214は、真率の特徴量についての閾値、真率調査区間のループ実行回数、真率調査区間の間隔に相当するループ実行回数、真率の特徴量として使用する指標(例えば平均値、最低値など)などの設定データを格納する。オブジェクトコード1220は、ユーザにより指定されたループについてコードA、コードB及びコードCを含んでいる。
また、CPU1100は、上で述べたように複数のハードウエアカウンタを有しており、IF文の条件が真の場合のコードを実行した回数をカウントするカウンタ1と、ループの実行回数をカウントするカウンタ2と、ループ内の繰り返し回数をカウントするカウンタ3とを有する。
次に、オブジェクトコード300の実行時の処理について図9乃至図20を用いて説明する。まず、ユーザからの指示に応じて、オブジェクトコード300及びランタイムモジュール400をデータ格納部1300からメモリ1200にロードしてCPU1100による実行を開始する(ステップS1)。そして、ユーザが指定したループについてのコードを実行する段階になると、ランタイムモジュール1210は、実行制御処理を実行する(ステップS3)。実行制御処理については、図10乃至図14を用いて説明する。
まず、ループ特定部1211は、真率調査対象のループが検出されるまで待機する(ステップS11)。図6に模式的に示したように、setenv命令に応じてランタイムモジュール1210のループ特定部1211は、コードの動的切替を実施すべき箇所を実行することを認識し、ループIDとループ内における繰り返し回数とループの実行回数とを含む実行環境変数を取得する。
また、ループ特定部1211は、ループの実行回数のカウンタ及び真率チェックのカウンタを共に0に初期化する(ステップS13)。初めて検出したループIDの場合には、まだどのコードを実行するのが好ましいのかが不明であるから、コード決定部1213は、本実施の形態ではコードA、すなわち通常処理のコードを実行するように設定を行う(ステップS15)。オブジェクトコード1220側では、getenv命令で、コードAの実行指示を特定し、コードAの実行を開始する。
そして、真率計算部1212は、真率チェックのカウンタの値に基づき、真率調査区間が終了したか判断する(ステップS17)。例えば、図7の例では、真率調査区間に相当するループ実行回数は「5」であるから、真率チェックのカウンタのカウンタ値が「5」以上となったか否かを判断する。真率調査区間が終了していない場合には、真率計算部1212は、真率調査処理を実行する(ステップS19)。真率調査処理については、図11及び図12を用いて説明する。
真率計算部1212は、CPU1100のカウンタ1(IF文の条件が真の場合にカウントアップされるカウンタ)、カウンタ2(ループの実行回数についてのカウンタ)及びカウンタ3(ループの繰り返し回数についてのカウンタ)のカウント値を取得して、メモリ1200に格納する(ステップS41)。カウンタ1の現在値を取得するため、ループを実行する前に取得する。そして、ループの繰り返し回数がNであればカウンタ3がN増加した後又はカウンタ2が1増加した後(ステップS43)、真率計算部1212は、CPU1100のカウンタ1のカウント値を取得し、メモリ1200に格納する(ステップS45)。そして、真率計算部1212は、(ステップS45で取得したカウンタ1のカウント値−ステップS41で取得したカウンタ1のカウント値)/Nによって、今回のループの真率を算出し、メモリ1200に格納する(ステップS47)。そして、真率計算部1212は、真率チェックのカウンタを1インクリメントする(ステップS49)。その後、処理は呼び出し元の処理に戻る。
図10の処理の説明に戻って、処理はステップS19の後にステップS17に戻る。このような真率調査処理を5回繰り返すと、メモリ1200には、例えば図12に示すようなデータが得られる。図12の例では、真率が5回分得られたことになる。なお、条件が真となった回数のデータを保持するようにしても良い。
ステップS17で真率調査区間が終了したと判断された場合、真率計算部1212は、真率チェックのカウンタを0に初期化する(ステップS21)。そして、コード決定部1213は、真率の調査結果に基づきコード決定処理を実行する(ステップS23)。コード決定処理については、図13を用いて説明する。
コード決定部1213は、真率の特徴量を算出する(図13:ステップS51)。真率の特徴量は、設定データ格納部1214に設定されている種別の特徴量であり、例えば平均値、最小値である。例えば、図12の例であれば、(r1+r2+r3+r4+r5)/5によって平均値を算出し、最小値であれば、r1乃至r5のうち最も小さい値を特定する。なお、最小値を採用するのは、リストベクトルを生成するコードCを実行する方がリスクが低いためである。すなわち、述語付き命令を用いるコードBを選択して真率が低くなってしまうと、処理時間についてのペナルティが大きいためである。
そして、コード決定部1213は、真率の特徴量が、設定データ格納部1214に格納されている閾値を超えているか判断する(ステップS53)。真率の特徴量が、閾値を超えている場合には、コードB、すなわち述語付き命令を用いるコードを実行するように設定を行う(ステップS57)。オブジェクトコード1220側は、設定に応じてコードBを実行し始める。そして処理は呼び出し元の処理に戻る。
このように真率が高ければ処理時間は変わらないが、演算結果が採用される可能性が高いので、効率的に実行できるようになる。
一方、真率の特徴量が閾値以下であれば、コード決定部1213は、コードC、すなわちリストベクトルを生成するコードを実行するように設定を行う(ステップS55)。オブジェクトコード1220側は、設定に応じてコードCを実行し始める。そして処理は呼び出し元の処理の処理に戻る。
このように真率が低ければ処理時間を短縮でき、処理の高速化が図られる。
図10の説明に戻って、ステップS23の後に、述語付き命令を用いるコードBを実行中であれば(ステップS25:Yesルート)、処理は端子Aを介して図14の処理に移行する。一方、コードCを実行中であれば(ステップS25:Noルート)、真率計算部1212は、真率調査タイミングであるか判断する(ステップS27)。これは、実行回数のカウンタのカウント値が、設定データ格納部1214に格納されている真率調査区間の間隔(例えば15)以上となったかを判断する。
真率調査タイミングではない場合には(ステップS27:Noルート)、ループの繰り返し回数がNであればカウンタ3がN増加した後又はカウンタ2が1増加した後(ステップS31)、真率計算部1212は、実行回数のカウンタのカウント値を1インクリメントする(ステップS33)。そして処理はステップS27に戻る。
一方、ループの実行回数が、真率調査区間の間隔(例えば15)に達して、真率調査タイミングとなれば(ステップS27:Yesルート)、真率計算部1212は、実行回数のカウンタのカウント値を0に初期化し(ステップS29)、処理はステップS17に戻る。これによって、真率計算を再度行うようにする。
次に図14の処理の説明に移行して、コードBを実行中であれば、真率計算部1212は、真率調査タイミングであるか判断する(ステップS61)。これは、実行回数のカウンタのカウント値が、設定データ格納部1214に格納されている真率調査区間の間隔(例えば15)以上となったかを判断する。
真率調査タイミングではない場合には(ステップS61:Noルート)、ループの繰り返し回数がNであればカウンタ3がN増加した後又はカウンタ2が1増加した後(ステップS63)、真率計算部1212は、実行回数のカウンタのカウント値を1インクリメントする(ステップS65)。そして処理はステップS61に戻る。
一方、ループの実行回数が、真率調査区間の間隔(例えば15)に達して、真率調査タイミングとなれば(ステップS61:Yesルート)、真率計算部1212は、実行回数のカウンタのカウント値を0に初期化し(ステップS67)、処理は図10のステップS15に戻る。
コードBを実行中は、IF文が除去されているので、CPU1100におけるカウンタ1を用いた真率の算出ができない。従って、ステップS15に戻って、通常処理のコードAの実行を指示することで、真率を算出できるようにする。
このような処理を、オブジェクトコード1220の実行が終了するまで繰り返すことで、真率の変動が生じていても、真率に応じたコードを実行することで、演算処理を効率化することができるようになる。
上で述べた例では、条件分岐をそのまま処理するコードAと、述語付き命令を用いるコードBと、リストベクトルを生成するコードCとを生成する処理の例を示したが、図15に模式的に示すように、コードAを生成せずに、コードB及びコードCだけを含むオブジェクトコード300bを生成するようにしてもよい。
すなわち、実行制御処理においてコードAを実行する部分についてはコードCを実行するようにしてもよい。コードCを実行すれば、真率を算出することができるので、真率に応じたコードBとコードCの動的な切替を実施できる。なお、変更点は、図10の処理フローにおけるステップS15を、以下のように変更する。すなわち、コード決定部1213が、リストベクトルを生成するコードCを実行するように設定する(図16:ステップS15b)。
コードBとコードCを用いる場合、図17に模式的に示すように、真率が90%で高い状態から急に真率が10%で低い状態に変化すると、コードBの実行状態からコードCの実行状態に遷移するものとする。そうすると、処理時間は、コードCを実行するようになると急激に削減され、効率的な演算実行が行われるようになる。なお、コードBを実行している間のハッチングは有効な命令の実行の割合を模式的に示すものであり、コードCを実行している間のハッチングはリストベクトルループの処理時間を模式的に示すものである。
なお、DOループ1回あたりの処理時間をTmとし、DOループの全実行回数をaとし、真率Truexの時のDOループの実行回数をbとし、1回あたりのリスト生成の処理時間をαとし、真率Truex及びTrueyは0以上1以下の実数であるものとする。
このような状態で、a回すべてコードBを実行した場合には、コードBによる処理時間はaTmとなる。また、コードCによる処理時間は以下のように表される。
b(TruexTm+α)+(a−b)(TrueyTm+α)
=TruexbTm+bα+TrueyaTm−TrueybTm+(a−b)α
=(Truex−Truey)bTm+TrueyaTm+aα (1)
さらに、本実施の形態のように真率Truexの場合にコードBを実行し、真率Trueyの場合にコードCを実行する場合の処理時間は以下のように表される。
bTm+(a−b)(TrueyTm+α)
=bTm+TrueyaTm−TrueybTm+(a−b)α
=(1−Truey)bTm+TrueyaTm+(a−b)α
=((1−Truey)b+Trueya)Tm+(a−b)α (2)
ここでaTm>(2)式となる条件は以下のように表される。
aTm>((1−Truey)b+Trueya)Tm+(a−b)α
aTm−((1−Truey)b+Trueya)Tm>(a−b)α
(1−Truey)aTm−(1−Truey)bTm>(a−b)α
(1−Truey)(a−b)Tm>(a−b)α
(1−Truey)Tm>α (3)
さらに、(1)式>(2)式となる条件は以下のように表される。
(Truex−Truey)bTm+Trueya+aα>((1−Truey)b+Trueya)Tm+(a−b)α
TruexbTm−bTm>−bα
bα>(1−Truex)bTm
α>(1−Truex)Tm (4)
従って、(3)式及び(4)式から、以下のような条件が分かる。
(1−Truex)Tm<α<(1−Truey)Tm
なお、図18のようにループ内にIFブロックxとIFブロックyとが含まれる場合がある。一般的に、IFブロックx内の演算と、IFブロックy内の演算とに相互依存性がなければ、図19のようにループ分割される。すなわち、図19の例では、IFブロックxについてのループXと、IFブロックyについてのループYとに分割する。このようにすれば、ループXとループYとで異なるコードを実行することができるようになる。例えば、ループXについては真率が高いためコードBを実行し、ループYについては真率が低いためコードCを実行するものである。
さらに、片方のループ又は両方のループで、途中で真率が大きく変化した場合についても、上で述べた処理フローに従ってコードBとコードCとを動的に切り替えれば、演算処理を効率的に実行できるようになる。
例えば、図20(a)に示すように、ループX及びループYをコードBで実行すると、ループYがきわめて非効率な実行となり処理時間も長くなる。一方、図20(b)に示すように、ループX及びループYをコードCで実行すると、ループXについてはリストベクトルループの処理時間が長くなってしまうので、あまり処理時間を短縮できない。一方、図20(c)に示すように、真率が例えば90%と高いループXについてはコードBで実行し、真率が例えば10%と低いループYについてはコードCで実行すれば、処理時間が全体として短くなり効率的な演算処理が行われるようになる。同様に、途中で真率が変化して、ループXについて真率が例えば10%となり、ループYについては真率が例えば90%となったとすると、本実施の形態によればループXについてコードCを実行し、ループYについてはコードBを実行するようになる。この場合、図20(d)に示すように、ループの実行回数が同じであれば図20(c)と処理時間自体は変化しない。但し、動的な切替を実施しなければ、コードCを実行しているループの方の処理時間が増加してしまう。
以上本技術の実施の形態を説明したが、本技術はこれに限定されない。例えば、処理フローは一例であって、処理結果が変わらない限り、処理順番を入れ替えたり、処理を並列実行させるようにしても良い。また、ランタイムモジュール400の機能ブロック構成は一例であって、プログラムモジュール構成とは異なる場合もある。
また、上で述べた例では、真率の平均値又は最小値を採用する例を示したが、真率調査区間が短い場合等には、真率そのものに対して閾値を設定するようにしても良い。さらに、ループ内の繰り返し回数が分かっていれば、真率ではなく、特徴量として、条件が真の回数、条件が真の回数の平均値、条件が真の回数の最小値を採用しても良い。
さらに、真率調査区間を定期的に設ける例を示したが、例えば真率が下落している間は真率調査区間の間隔を短くして早期にコードCの実行に遷移するようにすることも可能である。
なお、図8におけるコンピュータ1000は、本実施の形態に係る部分のみを示すものであったが、全体としては例えば図21に示すように、メモリ2501とCPU2503とハードディスク・ドライブ(HDD)2505と表示装置2509に接続される表示制御部2507とリムーバブル・ディスク2511用のドライブ装置2513と入力装置2515とネットワークに接続するための通信制御部2517とがバス2519で接続されている。オペレーティング・システム(OS:Operating System)及び本実施の形態における処理を実施するためのプログラムは、HDD2505に格納されており、CPU2503により実行される際にはHDD2505からメモリ2501に読み出される。CPU2503は、プログラムの処理内容に応じて表示制御部2507、通信制御部2517、ドライブ装置2513を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ2501に格納されるが、HDD2505に格納されるようにしてもよい。本技術の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク2511に格納されて頒布され、ドライブ装置2513からHDD2505にインストールされる。インターネットなどのネットワーク及び通信制御部2517を経由して、HDD2505にインストールされる場合もある。このようなコンピュータは、上で述べたCPU2503、メモリ2501などのハードウエアとOS及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
以上述べた本実施の形態をまとめると以下のようになる。
本実施の形態に係る実行制御方法は、(A)内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ条件分岐がそのままコード化されたループについての第1のコード、又はオブジェクトコードに含まれ且つ条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて条件が真となる場合における分岐先演算を実行するための第2のコードを実行している間において、条件分岐による条件が真となった回数についての特徴量を取得する処理と、(B)取得された特徴量に基づき、第2のコードと、オブジェクトコードに含まれ且つ述語付き命令を用いて条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第3のコードとのうちいずれかをプロセッサに実行させる処理とを含む。
このように動的に実行するコードを切り替えることで、条件が真となる回数が動的に変化しても効率的に演算処理を実行できるようになる。
なお、上で述べた特徴量が、上記回数、上記回数の割合、上記回数の平均値、上記回数の割合の平均値、上記回数の最小値、又は上記回数の割合の最小値である場合もある。
さらに、上で述べた取得する処理を、オブジェクトコードの実行中定期的又は不定期に実行するようにしても良い。
さらに、上で述べた回数についてのデータを、上記プロセッサのカウンタから取得するようにしても良い。ハードウエアカウンタによりカウントを行えば、実行制御のための処理のコストを下げることができるようになる。
なお、上記実行制御方法による処理をプロセッサに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、CD−ROM、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
そして、真率計算部1212は、真率チェックのカウンタの値に基づき、真率調査区間が終了したか判断する(ステップS17)。例えば、図7の例では、真率調査区間に相当するループ実行回数は「5」であるから、真率チェックのカウンタのカウン値が「5」以上となったか否かを判断する。真率調査区間が終了していない場合には、真率計算部1212は、真率調査処理を実行する(ステップS19)。真率調査処理については、図11及び図12を用いて説明する。
一方、真率の特徴量が閾値以下であれば、コード決定部1213は、コードC、すなわちリストベクトルを生成するコードを実行するように設定を行う(ステップS55)。オブジェクトコード1220側は、設定に応じてコードCを実行し始める。そして処理は呼び出し元の処に戻る。
図10の説明に戻って、ステップS23の後に、述語付き命令を用いるコードBを実行中であれば(ステップS25:Yesルート)、処理は端子Aを介して図14の処理に移行する。一方、コードCを実行中であれば(ステップS25:Noルート)、真率計算部1212は、真率調査タイミングであるか判断する(ステップS27)。これは、ループの実行回数のカウンタのカウント値が、設定データ格納部1214に格納されている真率調査区間の間隔(例えば15)以上となったかを判断する。
真率調査タイミングではない場合には(ステップS27:Noルート)、ループの繰り返し回数がNであればカウンタ3がN増加した後又はカウンタ2が1増加した後(ステップS31)、真率計算部1212は、ループの実行回数のカウンタのカウント値を1インクリメントする(ステップS33)。そして処理はステップS27に戻る。
一方、ループの実行回数が、真率調査区間の間隔(例えば15)に達して、真率調査タイミングとなれば(ステップS27:Yesルート)、真率計算部1212は、ループの実行回数のカウンタのカウント値を0に初期化し(ステップS29)、処理はステップS17に戻る。これによって、真率計算を再度行うようにする。
次に図14の処理の説明に移行して、コードBを実行中であれば、真率計算部1212は、真率調査タイミングであるか判断する(ステップS61)。これは、ループの実行回数のカウンタのカウント値が、設定データ格納部1214に格納されている真率調査区間の間隔(例えば15)以上となったかを判断する。
真率調査タイミングではない場合には(ステップS61:Noルート)、ループの繰り返し回数がNであればカウンタ3がN増加した後又はカウンタ2が1増加した後(ステップS63)、真率計算部1212は、ループの実行回数のカウンタのカウント値を1インクリメントする(ステップS65)。そして処理はステップS61に戻る。
一方、ループの実行回数が、真率調査区間の間隔(例えば15)に達して、真率調査タイミングとなれば(ステップS61:Yesルート)、真率計算部1212は、ループの実行回数のカウンタのカウント値を0に初期化し(ステップS67)、処理は図10のステップS15に戻る。
さらに、(1)式>(2)式となる条件は以下のように表される。
(Truex−Truey)bTm+TrueyaTm+aα>((1−Truey)b+Trueya)Tm+(a−b)α
TruexbTm−bTm>−bα
bα>(1−Truex)bTm
α>(1−Truex)Tm (4)

Claims (6)

  1. 内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ前記条件分岐がそのままコード化された前記ループについての第1のコード、又は前記オブジェクトコードに含まれ且つ前記条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて前記条件が真となる場合における分岐先演算を実行するための第2のコードを実行している間において、前記条件分岐による条件が真となった回数についての特徴量を取得し、
    取得された前記特徴量に基づき、前記第2のコードと、前記オブジェクトコードに含まれ且つ述語付き命令を用いて前記条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第3のコードとのうちいずれかをプロセッサに実行させる
    処理を、前記プロセッサに実行させるためのプログラム。
  2. 前記特徴量が、前記回数、前記回数の割合、前記回数の平均値、前記回数の割合の平均値、前記回数の最小値、又は前記回数の割合の最小値である
    請求項1記載のプログラム。
  3. 前記取得する処理を、前記オブジェクトコードの実行中定期的又は不定期に実行する
    請求項1記載のプログラム。
  4. 前記回数についてのデータを、前記プロセッサのカウンタから取得する
    請求項1乃至3のいずれか1つ記載のプログラム。
  5. 内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ前記条件分岐がそのままコード化された前記ループについての第1のコード、又は前記オブジェクトコードに含まれ且つ前記条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて前記条件が真となる場合における分岐先演算を実行するための第2のコードを実行している間において、前記条件分岐による条件が真となった回数についての特徴量を取得し、
    取得された前記特徴量に基づき、前記第2のコードと、前記オブジェクトコードに含まれ且つ述語付き命令を用いて前記条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第3のコードとのうちいずれかをプロセッサに実行させる
    処理を含み、前記プロセッサにより実行される実行制御方法。
  6. 内部に条件分岐を含み且つ予め指定されたループを含むソースコードから生成されたオブジェクトコードに含まれ且つ前記条件分岐がそのままコード化された前記ループについての第1のコード、又は前記オブジェクトコードに含まれ且つ前記条件分岐による条件が真となるループインデックスを抽出した上で抽出されたループインデックスのみについて前記条件が真となる場合における分岐先演算を実行するための第2のコードを実行している間において、前記条件分岐による条件が真となった回数についての特徴量を取得する手段と、
    取得された前記特徴量に基づき、前記第2のコードと、前記オブジェクトコードに含まれ且つ述語付き命令を用いて前記条件分岐による分岐先演算のいずれかの演算結果をメモリに書き込むための第3のコードとのうちいずれかをプロセッサに実行させる手段と、
    有する情報処理装置。
JP2014543074A 2012-10-25 2012-10-25 実行制御方法及び情報処理装置 Active JP6179524B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2012/077599 WO2014064798A1 (ja) 2012-10-25 2012-10-25 実行制御方法及び情報処理装置

Publications (2)

Publication Number Publication Date
JPWO2014064798A1 true JPWO2014064798A1 (ja) 2016-09-05
JP6179524B2 JP6179524B2 (ja) 2017-08-16

Family

ID=50544196

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014543074A Active JP6179524B2 (ja) 2012-10-25 2012-10-25 実行制御方法及び情報処理装置

Country Status (4)

Country Link
US (1) US9459852B2 (ja)
EP (1) EP2913761A4 (ja)
JP (1) JP6179524B2 (ja)
WO (1) WO2014064798A1 (ja)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10521208B2 (en) * 2017-06-23 2019-12-31 Microsoft Technology Licensing, Llc. Differentiated static analysis for dynamic code optimization
JP7091726B2 (ja) * 2018-03-08 2022-06-28 富士通株式会社 情報処理装置,プログラム及び情報処理方法
US20230315453A1 (en) * 2022-04-01 2023-10-05 Intel Corporation Forward conditional branch event for profile-guided-optimization (pgo)

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS608942A (ja) * 1983-06-28 1985-01-17 Fujitsu Ltd 条件文のベクトル処理方式
JPS63632A (ja) * 1986-06-19 1988-01-05 Fujitsu Ltd 原始プログラムの最適化処理方式
JPS6353646A (ja) * 1986-08-22 1988-03-07 Nec Corp 最適目的プログラム生成方式
JPH03110670A (ja) * 1989-09-25 1991-05-10 Nec Corp ベクトル計算機
JPH10240573A (ja) * 1996-12-26 1998-09-11 Nec Corp コンパイル装置、コンパイル方法およびコンパイラを記録した記録媒体
WO2000038054A1 (fr) * 1998-12-22 2000-06-29 Fujitsu Limited Appareil et procede de generation d'objet d'optimisation
US20080127134A1 (en) * 2006-10-27 2008-05-29 Sun Microsystems, Inc. Adaptive code through self steered execution
WO2012087988A2 (en) * 2010-12-24 2012-06-28 Intel Corporation Loop parallelization based on loop splitting or index array

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS59165147A (ja) 1983-03-11 1984-09-18 Fujitsu Ltd コンパイラにおける条件文のベクトル命令化方式

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS608942A (ja) * 1983-06-28 1985-01-17 Fujitsu Ltd 条件文のベクトル処理方式
JPS63632A (ja) * 1986-06-19 1988-01-05 Fujitsu Ltd 原始プログラムの最適化処理方式
JPS6353646A (ja) * 1986-08-22 1988-03-07 Nec Corp 最適目的プログラム生成方式
JPH03110670A (ja) * 1989-09-25 1991-05-10 Nec Corp ベクトル計算機
JPH10240573A (ja) * 1996-12-26 1998-09-11 Nec Corp コンパイル装置、コンパイル方法およびコンパイラを記録した記録媒体
WO2000038054A1 (fr) * 1998-12-22 2000-06-29 Fujitsu Limited Appareil et procede de generation d'objet d'optimisation
US20080127134A1 (en) * 2006-10-27 2008-05-29 Sun Microsystems, Inc. Adaptive code through self steered execution
WO2012087988A2 (en) * 2010-12-24 2012-06-28 Intel Corporation Loop parallelization based on loop splitting or index array

Also Published As

Publication number Publication date
JP6179524B2 (ja) 2017-08-16
US9459852B2 (en) 2016-10-04
EP2913761A4 (en) 2016-06-15
US20150234641A1 (en) 2015-08-20
WO2014064798A1 (ja) 2014-05-01
EP2913761A1 (en) 2015-09-02

Similar Documents

Publication Publication Date Title
US9569179B1 (en) Modifying models based on profiling information
KR100875836B1 (ko) 병렬 처리 vliw 컴퓨터를 위한 인스트럭션 명령어 압축장치 및 그 방법
US20120154412A1 (en) Run-time allocation of functions to a hardware accelerator
CN105579967A (zh) Gpu发散栅栏
JP6379654B2 (ja) 処理実行プログラム、処理実行方法、及び情報処理装置
US10558500B2 (en) Scheduling heterogenous processors
JP6179524B2 (ja) 実行制御方法及び情報処理装置
CN105404635B (zh) 字符串匹配的方法、设备和异构计算系统
KR102603377B1 (ko) 데이터 처리
US20110154337A1 (en) Relational Modeling for Performance Analysis of Multi-Core Processors Using Virtual Tasks
KR20200128702A (ko) 분기 명령의 추적
US20160357655A1 (en) Performance information generating method, information processing apparatus and computer-readable storage medium storing performance information generation program
US9804849B2 (en) Space reduction in processor stressmark generation
US10108529B2 (en) Dynamic instrumentation based on detected errors
US11061988B2 (en) Reducing web page load times
WO2015062369A1 (zh) 轮廓技术编译的优化方法及装置
JP6528531B2 (ja) コンパイラプログラム、コンパイル方法、及び情報処理装置
CN114020274B (zh) 一种计算具有循环结构的OpenMP程序WCRT方法
KR101721341B1 (ko) 이종 멀티코어 환경에서 사용되는 수행장치 결정 모듈 및 이를 이용한 수행장치 결정방법
Pompougnac et al. Performance bottlenecks detection through microarchitectural sensitivity
KR102297435B1 (ko) 응용 프로그램의 이벤트 스트림 데이터 처리 성능 향상 방법 및 장치
US9772825B2 (en) Program structure-based blocking
KR20240119492A (ko) Gpu 데이터 접근 코알레싱 시각화 방법
CN104462368A (zh) 数据计算方法、装置和服务器
CN118672661A (zh) 数据处理方法、装置、电子设备和存储介质

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20160705

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20160902

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20170214

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20170417

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20170620

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20170703

R150 Certificate of patent or registration of utility model

Ref document number: 6179524

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150