JP6160232B2 - コンパイルプログラムおよびコンパイル方法 - Google Patents

コンパイルプログラムおよびコンパイル方法 Download PDF

Info

Publication number
JP6160232B2
JP6160232B2 JP2013105537A JP2013105537A JP6160232B2 JP 6160232 B2 JP6160232 B2 JP 6160232B2 JP 2013105537 A JP2013105537 A JP 2013105537A JP 2013105537 A JP2013105537 A JP 2013105537A JP 6160232 B2 JP6160232 B2 JP 6160232B2
Authority
JP
Japan
Prior art keywords
loop
fusion
unit
combination
processing
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
JP2013105537A
Other languages
English (en)
Other versions
JP2014228891A (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
Priority to JP2013105537A priority Critical patent/JP6160232B2/ja
Priority to US14/255,236 priority patent/US9141357B2/en
Publication of JP2014228891A publication Critical patent/JP2014228891A/ja
Application granted granted Critical
Publication of JP6160232B2 publication Critical patent/JP6160232B2/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/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • 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
    • 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
    • G06F8/4442Reducing the number of cache misses; Data prefetching

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は、コンパイラおよびコンパイル方法に関する。
コンパイラでは、データの局所性を高め、ループの判定の繰り返し処理にかかるコストを削減して実行性能を高速化させる最適化技術として、ループ融合が利用されている。ループ融合は、ソースプログラム中に存在する多重ループの処理構造に対して、隣接するループの初期値、終値、増分値が同じであり、融合によって依存関係が壊れない場合に、ループを融合してループの判定回数の削減をする。
特開平09−114675号公報 特開昭62−35944号公報 特開2009−104422号公報
しかしながら、上記のループ融合の条件だけでは、ループ融合後にデータアクセス待ちや演算処理待ちが発生する場合があり、効果的ではないループ融合が発生するという問題がある。
例えば、隣接するループ同士かつ初期値、終値、増分値が同じループ同士であっても、データアクセスが演算数に比べて多いループ同士を融合した場合、データアクセス待ちが発生するので、性能が向上しない。同様に、演算数がデータアクセスに比べて多いループ同士を融合した場合、演算処理待ちが発生するので、性能が向上しない。
1つの側面では、効果的なループ融合を実行することができるコンパイラおよびコンパイル方法を提供することを目的とする。
第1の案では、コンパイラは、処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定する。コンパイラは、ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する。
本発明の1実施形態によれば、効果的なループ融合を実行することができる。
図1は、実施例1に係るコンパイラを含む情報処理装置の構成を示す機能ブロック図である。 図2は、ループの初期値、終値、増分値を観点にしたループ融合判定の例を示す図である。 図3は、データ依存を観点にしたループ融合判定の例1を示す図である。 図4は、データ依存を観点にしたループ融合判定の例2を示す図である。 図5は、タイトリを観点にしたループ融合判定の例を示す図である。 図6は、ループ融合の例を説明する図である。 図7は、実施例1に係るループ融合の全体的な処理の流れを示すフローチャートである。 図8は、実施例1に係るループ融合におけるデータ生成処理の流れを示すフローチャートである。 図9は、ループ融合を判定する対象の処理コード例を示す図である。 図10は、ループ融合対象リストの例を示す図である。 図11は、ループ融合判定リストの生成例を示す図である。 図12は、各種データのカウント対象の例を示す図である。 図13は、同一ストリームの説明をソースコードを例にして説明する図である。 図14は、同一ストリームの説明を中間言語を例にして説明する図である。 図15は、B/F値の算出例を説明する図である。 図16は、ループ融合の可否判定を説明する図である。 図17は、情報処理装置のハードウェア構成例を示す図である。
以下に、本願の開示するコンパイラおよびコンパイル方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。以下の実施例は、矛盾を起こさない範囲で適宜組み合わせることができる。
[機能構成]
図1は、実施例1に係るコンパイラを含む情報処理装置の構成を示す機能ブロック図である。この情報処理装置10は、プログラム言語で記述されたソースコードを読み込んで最適化してオブジェクトコードを生成し、オブジェクトコードをリンクさせて実行ファイルを生成するコンピュータ装置である。つまり、情報処理装置は、一般的なコンパイラとしての機能を有する。
図1に示すように、情報処理装置10は、記憶部11とコンパイラ実行部12とリンカ20とを有する。なお、図示した処理部は、あくまで例示であり、例えばディスプレイなどの表示部やキーボードなどの入力部を有していてもよい。
記憶部11は、ソースプログラム11a、中間言語11b、オブジェクトファイル11c、実行ファイル11dを記憶する記憶装置である。例えば、記憶部11の一例としては、メモリやハードディスクなどがある。なお、ソースプログラム11aは、複数の処理対象コードが記述される。
コンパイラ実行部12は、ソースコードをコンパイルする処理部である。コンパイラ実行部12の一例としては、プロセッサが実行するコンパイラなどがある。このコンパイラ実行部12は、ソースプログラム入力部13、入出力制御部14、中間言語生成部15、最適化部16、コード生成部17、オブジェクトファイル出力部18を有する。
ソースプログラム入力部13は、コンパイラ実行部12から指定されたソースプログラム11aをオープンする処理部である。例えば、ソースプログラム入力部13は、コンパイラ実行部12からコンパイル開始が指示されると、記憶部11に記憶されるソースプログラムを読み込んで入出力制御部14に出力する。
入出力制御部14は、オプションやファイルの種別に応じて各種処理の選択を実行する処理部である。例えば、入出力制御部14は、ソースプログラム入力部13からソースプログラム11aが入力された場合には、当該ソースプログラム11aを中間言語生成部15に出力する。また、入出力制御部14は、コード生成部17からアセンブリ言語から入力された場合に、当該アセンブリ言語をオブジェクトファイル出力部18に出力する。
中間言語生成部15は、入出力制御部14から入力されたソースプログラム11aから中間言語11bを生成して、メモリ上に格納する処理部である。具体的には、中間言語生成部15は、ソースプログラム11aを最適化部16で利用される中間コード、すなわち、コンパイラ内部で利用するコードに変換する処理部である。そして、中間言語生成部15は、変換した中間言語11bを記憶部11等に格納する。
最適化部16は、ソースプログラム11aの実行を高速化するために、ループ融合などの最適化を実行する処理部である。この最適化部16は、ソース解析部16a、組合せ抽出部16b、情報抽出部16c、比率算出部16d、判定部16e、融合部16fを有する。
ソース解析部16aは、中間言語11bを解析する処理部である。例えば、ソース解析部16aは、中間言語11bを記憶部11から読み込み、行再構築、字句解析、構文解析、意味解析などを実行し、その結果を組合せ抽出部16bに出力する。
組合せ抽出部16bは、ループ融合が可能なループの組合せを抽出する処理部である。具体的には、組合せ抽出部16bは、ソース解析部16aからの解析結果から、ソースプログラム11aまたは中間言語11bに存在する複数のループ各々のループ条件に基づいて、ループ処理を融合する対象の組合せ(以下、仮想ループと記載する場合がある)を決定する。
例えば、組合せ抽出部16bは、ループの初期値、終値、増分値に基づいて、仮想ループを抽出する。図2は、ループの初期値、終値、増分値を観点にしたループ融合判定の例を示す図である。図2の(a)の場合、組合せ抽出部16bは、ループ1とループ2との間で、ループの初期値、終値、増分値が一致するので、ループ融合が可能な組合せと判定する。一方、図2の(b)の場合、組合せ抽出部16bは、ループ1とループ2との間で、ループの初期値が異なるので、ループ融合が可能ではない組合せと判定する。
また、組合せ抽出部16bは、ループのデータ依存に基づいて、仮想ループを抽出する。図3は、データ依存を観点にしたループ融合判定の例1を示す図である。図3の(a)の場合、組合せ抽出部16bは、ループ1とループ2との間で、A(j)とA(j+1)とが依存しているが、順方向の依存であることから、融合してもデータが壊れないと判断できるので、ループ融合が可能な組合せと判定する。一方、図3の(b)の場合、組合せ抽出部16bは、ループ1とループ2との間で、A(j+1)とA(j)とが依存しているが、逆方向の依存であることから、融合するとデータが壊れると判断できるので、ループ融合が可能ではない組合せと判定する。
図4は、データ依存を観点にしたループ融合判定の例2を示す図である。図4の(a)の場合、組合せ抽出部16bは、ループ1とループ2とを融合候補とした場合、ループ3がループ2の算出結果を利用しないことから、ループ2とループ3とが依存関係にないと判断する。その結果、組合せ抽出部16bは、ループ1とループ2とをループ融合が可能な組合せと判定する。
一方、図4の(b)の場合、組合せ抽出部16bは、ループ1とループ2とを融合候補とした場合、ループ3がループ2の算出結果を利用することから、ループ2とループ3とが依存関係にあると判断する。その結果、組合せ抽出部16bは、ループ1とループ2とをループ融合が可能ではない組合せと判定する。
また、組合せ抽出部16bは、タイトリに基づいて、仮想ループを抽出する。つまり、組合せ抽出部16bは、重ループにおいて、最内ループにのみ演算を所有するループを組合せ候補と判定し、途中のループの間に演算を含む場合は、演算を含むループより下のループをタイトとみなして、組合せ候補から除外する。
図5は、タイトリを観点にしたループ融合判定の例を示す図である。図5の(a)の場合、組合せ抽出部16bは、ループ1もループ2もともにタイトリであるから、ループ融合が可能な組合せと判定する。一方、図5の(b)の場合、組合せ抽出部16bは、ループ2はタイトリであるが、ループ1には最内ループ内以外に演算式「c=d*1」が存在するのでタイトリではないと判定する。その結果、組合せ抽出部16bは、ループ1とループ2とをループ融合が可能ではない組合せと判定する。
図1に戻り、情報抽出部16cは、組合せ抽出部16bが抽出したループ融合の候補、すなわち、仮想ループについて演算数、データ転送数、命令数、ストリーム数を抽出する処理部である。
例えば、情報抽出部16cは、各組み合わせに対して、「MULT」命令や「ADD」命令などレジスタの浮動小数点演算を実行する演算命令の数を計数して、演算数を算出する。また、情報抽出部16cは、各組み合わせに対して、各ループがアクセスするメモリのキャッシュラインの数を計数し、ストリーム数として算出する。
また、情報抽出部16cは、各組み合わせに対して、データをレジスタにロードする「LOAD」命令、データをメモリにストアする「STORE」命令などの命令数を計数する。そして、情報抽出部16cは、各命令の数と各命令が参照されるバイト数とから、データ転送数言い換えるとデータアクセス数を算出する。なお、「STORE」命令については、一度レジスタにロードしてから、ロードした領域にストアするので、データ転送数としては2倍となる。
比率算出部16dは、情報抽出部16cが抽出した各種データを用いて、各組合せについてデータ転送数と演算数の比率を算出する処理部である。具体的には、比率算出部16dは、「仮想ループ内の総データ転送数/仮想ループ内の総演算数=B(Byte)/F(FLOP)値」を算出する。例えば、比率算出部16dは、データ転送数が「78」で演算数が「156」であった場合、B/F値を「0.5」と算出する。
判定部16eは、比率算出部16dが算出したB/F値に基づいて、各組合せがループ融合可能か否かを判定する処理部である。具体的には、判定部16eは、各組合せのB/F値が、プロセッサの演算性能を最大限利用し、メモリバンド幅を使い切る最適な状態である場合に、ループ融合可能と判定する。
例えば、判定部16eは、B/F値が所定の範囲内にある組合せをループ融合可能と判定する。ここで、閾値となる値について説明する。例えば、16GFLOPS、8コアで動作するコンピュータについて、1秒間に実行した浮動小数点演算の演算数値は、16×8=128GFLOPSとなる。そして、メモリの論理スループットを64GB/sとした場合、コンピュータのシステム資源を最大限に使いきる理想的なB/F値は「64/128=0.5」となる。この値は、マシンの諸元に依存し、メモリスループットやFLOPS値によって変動する。この例の場合では、この理想的なB/F値を基準にして、閾値となる範囲は、0.3<B/F値<0.6などと設定される。
なお、判定部16eは、ループ融合可能と判定された複数の組み合わせに同じループが存在する場合、B/F値と、上記閾値(理想値)との差が小さい組合せに該当するループを融合させる。そして、判定部16eは、ループ融合可能と判定されたループ以外が含まれる組合せについて、同様の判定を実行する。
また、判定部16eは、ストリーム数や命令数を考慮して判定することもできる。例えば、B/F値が条件を満たす仮想ループであっても、ストリーム数や命令数が閾値以上である場合には、当該仮想ループを融合可能ではないと判定する。
融合部16fは、判定部16eによってループ融合可能と判定されたループ同士を融合させる処理部である。図6は、ループ融合の例を説明する図である。図6に示すように、融合部16fは、ループAとループBとが融合可能と判定された場合、ループAにおける演算式の次にループBの演算式を挿入して、1つのループとして処理させる。このようにすることで、ループの判定の繰り返し処理にかかるコストを削減して実行性能を高速化させることができる。
コード生成部17は、最適化部16によって最適化された中間言語からアセンブリ言語を生成する処理部である。そして、コード生成部17は、生成したアセンブリ言語を入出力制御部14に出力する。
オブジェクトファイル出力部18は、入出力制御部14からアセンブリ言語が入力されると、当該アセンブリ言語からオブジェクトファイル11cを生成して、記憶部11に格納する処理部である。
リンカ20は、オブジェクトファイル出力部18によって生成されたオブジェクトファイル11cを記憶部11から読み込み、オブジェクトファイル11cとライブラリファイルとを結合して実行ファイル11dを生成する処理部である。そして、リンカ20は、生成した実行ファイル11dを記憶部11に格納する。
[処理の流れ]
次に、情報処理装置が実行する処理の流れについて説明する。ここでは、ループ融合の全体的な流れと、全体的な流れで実行されるデータ生成処理とについて説明する。
(全体的な流れ)
図7は、実施例1に係るループ融合の全体的な処理の流れを示すフローチャートである。図7に示すように、ソースプログラム入力部13は、コンパイル処理が開始されると(S101:Yes)、記憶部11からソースプログラム11aを読み込む(S102)。
続いて、中間言語生成部15は、ソースプログラム入力部13が読み込んだソースプログラム11aから中間言語11bを生成する(S103)。その後、ソース解析部16aによる解析等が実行される。
そして、組合せ抽出部16bは、ループ融合の候補となる組合せを示す仮想ループを抽出する(S104)。その後、情報抽出部16cおよび比率算出部16dは、抽出された仮想ループの中から1つの仮想ループを選択し(S105)、データ生成処理を実行する(S106)。
そして、情報抽出部16cおよび比率算出部16dは、選択した仮想ループに対するデータ生成処理が完了すると、全仮想ループについて処理が終了したか否かを判定する(S107)。ここで、未処理の仮想ループが存在する場合(S107:No)、情報抽出部16cおよび比率算出部16dは、S105に戻って以降の処理を繰り返す。
一方、全仮想ループについて処理が終了したと判定された場合(S107:Yes)、判定部16eは、B/F値が条件を満たす仮想ループを抽出する(S108)。このとき、判定部16eは、ストリーム数や命令数を考慮してもよい。
続いて、判定部16eは、条件を満たす仮想ループのうちB/F値が理想値に最も近い仮想ループを融合対象に決定する(S109)。そして、判定部16eは、融合対象に決定された仮想ループに属するループを融合対象から除外する(S110)。つまり、判定部16eは、融合が決定されたループを含む他の仮想ループを、融合対象から除外する。
その後、判定部16eは、条件を満たす他の仮想ループが存在すると判定した場合(S111:Yes)、S109に戻って以降の処理を繰り返す。一方、判定部16eが条件を満たす他の仮想ループが存在しないと判定した場合(S111:No)、融合部16fは、融合対象と決定された仮想ループに属する各ループを融合する(S112)。その後は、一般的なコンパイル処理が実行される。
(データ生成処理の流れ)
図8は、実施例1に係るループ融合におけるデータ生成処理の流れを示すフローチャートである。ここで実行される処理は、図7のS106で実行される処理に該当する。
図8に示すように、情報抽出部16cは、選択された仮想ループ内の命令を探索し(S201)、未探索の命令が探索された場合(S202:Yes)、探索された命令が「STORE」命令か否かを判定する(S203)。
続いて、情報抽出部16cは、探索された命令が「STORE」命令であると判定した場合(S203:Yes)、対象となっている仮想ループ内の各ループがアクセスするストリームが同一ではないか否かを判定する(S204)。
そして、情報抽出部16cは、同一ストリームへのアクセスではないと判定した場合(S204:Yes)、データ転送数すなわちデータアクセス数をカウントし(S205)、S202に戻って以降の処理を繰り返す。このとき、情報抽出部16cは、仮想ループ内でアクセスされるストリームの数も計数する。なお、情報抽出部16cは、同一ストリームへのアクセスであると判定した場合(S204:No)、データ転送数をカウントすることなく、S202に戻って以降の処理を繰り返す。
一方、S203において、情報抽出部16cは、探索された命令が「STORE」命令ではなく(S203:No)、「LOAD」命令であると判定した場合(S206:Yes)、S207を実行する。すなわち、情報抽出部16cは、対象となっている仮想ループ内の各ループがアクセスするストリームと同一ではないか否かを判定する(S207)。
そして、情報抽出部16cは、同一ストリームへのアクセスではないと判定した場合(S207:Yes)、データ転送数すなわちデータアクセス数をカウントし(S208)、S202に戻って以降の処理を繰り返す。このとき、情報抽出部16cは、仮想ループ内でアクセスされるストリームの数も計数する。なお、情報抽出部16cは、同一ストリームへのアクセスであると判定した場合(S207:No)、データ転送数をカウントすることなく、S202に戻って以降の処理を繰り返す。
一方、S206において、情報抽出部16cは、探索された命令が「LOAD」命令でもなく(S206:No)、ADDなどの四則演算命令であると判定した場合(S209:Yes)、S210を実行する。すなわち、情報抽出部16cは、探索された四則演算命令が浮動小数点型の命令であるか否かを判定する。
そして、情報抽出部16cは、探索された四則演算命令が浮動小数点型の命令であると判定した場合(S210:Yes)、演算数すなわち浮動小数点演算数をカウントし(S211)、S202に戻って以降の処理を繰り返す。
なお、情報抽出部16cは、探索された四則演算命令が浮動小数点型の命令ではないと判定した場合(S210:No)、演算数をカウントすることなく、S202に戻って以降の処理を繰り返す。
また、情報抽出部16cは、探索された命令が四則演算命令でもないと判定した場合(S209:No)、演算数をカウントすることなく、S202に戻って以降の処理を繰り返す。
また、情報抽出部16cは、S203〜S211を実行し、S202において未探索の命令が残っていないと判定した場合(S202:No)、S203〜S211で算出されたデータ転送数およびストリーム数を、仮想ループに対応付けて登録する(S212)。
続いて、情報抽出部16cは、S203〜S211で算出された浮動小数点演算数についても、S212の情報に対応付けて登録する(S213)。さらに、比率算出部16dは、算出されたデータ転送数と浮動小数点演算数とからB/F値を算出して、S212およびS213の情報に対応付けて登録する(S214)。このようにして、最適化部16は、1つの仮想ループについて、演算数、データ転送数、命令数、ストリーム数、B/F値を算出する。
[具体例]
次に、上述したループ融合の具体例を説明する。図9は、ループ融合を判定する対象の処理コード例を示す図である。図9に示すように、ループ融合の判定を行うソースコードは、ループ1からループ5の5つのループで構成されている。以下では、このループ1からループ5について、どの組合せがループ融合として最適化を判定する例を説明する。
(組合せ抽出)
まず、組合せ抽出部16bは、中間言語生成部15が生成した図9に示したソースコードの中間言語から、ループ融合の組合せ候補、すなわち仮想ループを抽出する。図9の場合、組合せ抽出部16bは、ループ1をトリガーにして候補を抽出し、ループ2、ループ3、ループ4、ループ5をトリガーにして順に判定する。
まず、ループ1をトリガーにする。例えば、組合せ抽出部16bは、ループ1とループ2とでは初期値が異なるので、組合せ不可と判定する。続いて、組合せ抽出部16bは、ループ1とループ3とでは、初期値、終値、増分値が同一、かつ、A(j)とA(j+1)とが順方向の依存関係にあり、ループ2とループ3は依存関係にないので、組合せ可能と判定する。また、組合せ抽出部16bは、ループ1とループ4とでは、初期値、終値、増分値が同一、かつ、ループ4がループ3のデータに対して順方向の依存関係でありデータを壊さないので、組合せ可能と判定する。また、組合せ抽出部16bは、ループ1とループ5とでは、初期値が異なるので、組合せ不可と判定する。
次に、ループ2をトリガーにする。組合せ抽出部16bは、ループ2とループ3とでは初期値が異なるので、組合せ不可と判定する。続いて、組合せ抽出部16bは、ループ2とループ4とでは、初期値が異なるので、組合せ不可と判定する。また、組合せ抽出部16bは、ループ2とループ5とでは、初期値、終値、増分値が同一、かつ、ループ5がループ4のデータに依存しておらず依存関係を壊さないので、組合せ可能と判定する。
次に、ループ3をトリガーにする。組合せ抽出部16bは、ループ3とループ4とでは初期値、終値、増分値が同一、かつ、C(j)とC(j+1)とが順方向の依存関係にあるので、組合せ可能と判定する。続いて、組合せ抽出部16bは、ループ3とループ5とでは、初期値が異なるので、組合せ不可と判定する。次に、ループ4をトリガーにする。組合せ抽出部16bは、ループ4とループ5とでは初期値が異なるので、組合せ不可と判定する。
このようにして、抽出した組合せを図10に示す。図10は、ループ融合対象リストの例を示す図である。図10に示すように、組合せ抽出部16bは、「ループ1」に対しては「ループ3、ループ4」を融合可能と特定し、「ループ2」に対しては「ループ5」を融合可能と特定し、「ループ3」に対しては「ループ4」を融合可能と特定する。なお、図10に示した表は、組合せ抽出部16bが内部メモリや一時領域に作成してもよい。
続いて、組合せ抽出部16bは、抽出した組合せ結果から、図11に示したループ融合判定リストを生成する。図11は、ループ融合判定リストの生成例を示す図である。図11に示すように、組合せ抽出部16bは、「ループ1、ループ3」、「ループ1、ループ4」、「ループ1、ループ3、ループ4」、「ループ2、ループ5」、「ループ3、ループ4」の組合せを仮想ループとして生成する。また、組合せ抽出部16bは、各仮想ループについて「データ転送数、浮動小数点演算数、B/F値、命令数、ストリーム数」を格納する領域を対応付けたループ判定リストを生成する。なお、図11に示したループ判定リストは、組合せ抽出部16bが内部メモリや一時領域に作成してもよい。
(情報抽出)
次に、各仮想ループから「データ転送数、浮動小数点演算数、B/F値、命令数、ストリーム数」を抽出する例を説明する。図12は、各種データのカウント対象の例を示す図である。ここでは、図12に示した中間言語およびループ1とループ3の仮想ループを例にして説明する。なお、図12では、メモリをmemと表記する。図12に示した中間言語で記述されたコードでは、メモリ1〜メモリ3ついて、1アクセスで4バイトの領域にアクセスすることを示し、メモリ4〜メモリ8ついて、1アクセスで8バイトの領域にアクセスすることを示す。
(情報抽出:命令数)
まず、命令数について説明する。情報抽出部16cは、ループ1とループ3とについて各ループで実行される各命令を計数する。図12の場合、ループ1について、情報抽出部16cは、6つのLOAD命令、2つのMULT命令、3つのADD命令、2つのSTORE命令を検出するので、ループ1の命令数を「13」と抽出する。同様の手法で、情報抽出部16cは、ループ3の命令数を「338」と抽出する。この結果、情報抽出部16cは、ループ1とループ3とから構成される仮想ループの命令数を「13+338=351」と算出して、ループ判定リストに格納する。
(情報抽出:浮動小数点演算数)
次に、浮動小数点演算数について説明する。情報抽出部16cは、ループ1とループ3とについて各ループで実行される各命令から浮動小数点演算の数を計数する。図12の場合、ループ1について、情報抽出部16cは、浮動小数点演算として、2つのMULT命令、3つのADD命令を検出するので、ループ1の浮動小数点演算数を「5」と抽出する。同様の手法で、情報抽出部16cは、ループ3の浮動小数点演算数を「151」と抽出する。この結果、情報抽出部16cは、ループ1とループ3とから構成される仮想ループの浮動小数点演算数を「5+151=156」と算出して、ループ判定リストに格納する。
(情報抽出:ストリーム数)
次に、ストリーム数について説明する。ここでは、同一ストリームの考え方について説明する。図13は、同一ストリームの説明をソースコードを例にして説明する図である。A(i)を基準(0)でそれぞれの配列の距離を考える。A(i+10)は、基準から10離れており、対象のメモリアクセスが8バイトであることから、A(i)から80バイト離れた所をアクセスする。ここで、1キャッシュラインを128バイトとすると、80バイト先の領域は、同じキャッシュライン上であると判定できる。一方、A(i+20)は、基準から20離れており、対象のメモリアクセスが8バイトであることから、A(i)から160バイト離れた所をアクセスする。そのため、A(i+20)がアクセスする領域は、A(i)と同じキャッシュラインではないので、同じストリームではないと判定し、データアクセス数すなわちデータ転送数にカウントする。
図14は、同一ストリームの説明を中間言語を例にして説明する図である。図14の場合、(1)はmemAの先頭をアクセスし、(2)は先頭から80離れた先をアクセスしている。また、(3)は先頭から160離れた先をアクセスしている。ここで、1キャッシュラインを128バイトとすると、(1)と(2)は、同一のキャッシュラインにアクセスするため、同じストリームと考える。しかし、(3)は、(1)や(2)がアクセスするキャッシュラインにのっていないため、同じストリームとして考えない。
(情報抽出:データ転送数)
次に、データ転送数について説明する。情報抽出部16cは、ループ1とループ3とについて、各命令がアクセスする数を計数する。ループ1について、情報抽出部16cは、mem01からmem06各々についてLOAD命令を抽出する。また、mem01からmem03へのアクセスは、4バイト単位であり、mem04からmem08へのアクセスは、8バイト単位である。この結果、情報抽出部16cは、LOAD命令の合計アクセス数として、「4(mem01)+4(mem02)+4(mem03)+8(mem04)+8(mem05)+8(mem06)=36個」を算出する。
また、情報抽出部16cは、mem07とmem08についてSTORE命令を抽出する。また、mem07およびmem08へのアクセスは、8バイト単位である。また、STORE命令は、ロードした領域にストアするので、データ転送数としては2倍となる。これらの結果、情報抽出部16cは、STORE命令の合計アクセス数として、「2×8(mem07)+2×8(mem08)=32個」を算出する。
したがって、情報抽出部16cは、ループ1についてのデータ転送数として、LOAD命令の「36」バイト+STORE命令の「32」個=「68」個を算出する。同様の手法で、情報抽出部16cは、ループ3についてのデータ転送数として、「10」を算出する。これらの結果、情報抽出部16cは、ループ1とループ3とから構成される仮想ループのデータ転送数を「68+10=78個」と算出して、ループ判定リストに格納する。
(B/F値算出)
次に、B/F値について説明する。図15は、B/F値の算出例を説明する図である。図15に示すように、比率算出部16dは、ループ1とループ3とについて、上述した浮動小数点演算数およびデータ転送数を用いて、B/F値を算出する。例えば、比率算出部16dは、情報抽出部16cが抽出したデータ転送数「78個」を情報抽出部16cが抽出した浮動小数点演算数「156」で除算して、B/F値「0.5」を算出する。そして、比率算出部16dは、ループ1とループ3とから構成される仮想ループのB/F値「0.5」をループ判定リストに格納する。
(融合可否判定)
次に、情報抽出部16cと比率算出部16dとが生成した結果を用いて、ループ融合の可否を判定する例について説明する。図16は、ループ融合の可否判定を説明する図である。図16に示すように、情報抽出部16cと比率算出部16dとが、仮想ループ「1、3」について「データ転送数、浮動小数点演算数、B/F値、命令数、ストリーム数」として「78、156、0.5、350、13」を生成したとする。
同様に、情報抽出部16cと比率算出部16dとが、仮想ループ「1、4」について「データ転送数、浮動小数点演算数、B/F値、命令数、ストリーム数」として「78、130、0.6、450、13」を生成したとする。
また、情報抽出部16cと比率算出部16dとが、仮想ループ「1、3、4」について「データ転送数、浮動小数点演算数、B/F値、命令数、ストリーム数」として「83、281、0.295、550、15」を生成したとする。
また、情報抽出部16cと比率算出部16dとが、仮想ループ「3、4」について「データ転送数、浮動小数点演算数、B/F値、命令数、ストリーム数」として「15、276、0.054、350、13」を生成したとする。
また、情報抽出部16cと比率算出部16dとが、仮想ループ「2、5」について「データ転送数、浮動小数点演算数、B/F値、命令数、ストリーム数」として「24、145、0.165、540、10」を生成したとする。
このような場合、判定部16eは、B/F値が閾値「0・25<B/F値<0.75」に該当する仮想ループとして、仮想ループ「1、3」と仮想ループ「1、4」を抽出する。なお、判定部16eは、その他の仮想ループについては融合不可と判定する。
そして、判定部16eは、仮想ループ「1、3」のB/F値が「0.5」であり、仮想ループ「1、4」のB/F値が「0.6」であることから、B/F値がより閾値の範囲内にある仮想ループ「1、3」を選択する。
続いて、判定部16eは、融合対象と決定されたループ1またはループ3を含む仮想ループを融合対象から除外する。つまり、判定部16eは、B/F値が閾値内にあるとして抽出された仮想ループ「1、4」についても、対象外とする。こうして、判定部16eは、仮想ループ「1、3」すなわちループ1とループ3とを融合対象と決定する。その後、融合部16fは、ループ1とループ3とを融合する。
なお、判定部16eは、融合対象と決定された仮想ループについても、命令数やストリーム数が閾値を超える場合には、融合対象外と決定することもできる。この結果、命令数が非常に多くなるループ融合やメモリアクセスが効率的でなくなるループ融合を抑制できるので、ループ融合により実行性能の低下を抑制することができる。
上述したように、情報処理装置10は、処理対象コードにある複数のループ処理の融合可否判定に際して、融合後の演算数とデータアクセス数との比率を算出し、システム利用効率が向上すれば、ループ融合可と判定するので、効果的なループ融合を実現できる。
つまり、情報処理装置10は、ソースプログラム11aのループ構造に対して、浮動小数点演算数、データ伝送要求を用いてB/F値を計算する。そして、情報処理装置10は、算出したB/F値から、プロセッサの演算性能を最大限利用し、メモリバンド幅を使い切るループをグルーピングする。その後、情報処理装置10は、グルーピングしたループを融合することで、実行性能を向上させることができる。
この結果、情報処理装置10は、データアクセスが演算数に比べて多いループ同士の融合や演算数がデータアクセスに比べて多いループ同士の融合を抑制できるので、ループ有効後のデータアクセス待ちや演算処理待ちを抑制でき、効果的なループ融合を実現できる。
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に異なる実施例を説明する。
(対象プログラム)
実施例1では、ループ融合を判定するための各種データを中間言語から抽出する例で説明したが、これに限定されるものではない。例えば、ソースプログラム11aから抽出することもでき、仮想ループの特定はソースプログラム11aを用いて実行し、データの抽出は中間言語11bを用いて抽出することもできる。
(演算数)
実施例1では、浮動小数点演算の例としてMULTやADDを例示したが、これに限定されるものではなく、例えばSUB命令やDIV命令であっても同様に処理することができる。また、実施例1では、仮想ループを作成してから、演算数やデータ転送数を算出する例を説明したが、これに限定されるものではなく、各ループについて演算数やデータ転送数等を算出してから、仮想ループを生成してもよい。
(最適化)
実施例1では、最適化の例としてループ融合を実行する例を説明したが、上述したループ融合以外の他の最適化処理を実行してもよい。
(ハードウェア)
図17は、情報処理装置のハードウェア構成例を示す図である。図17に示すように、情報処理装置10は、CPU(Central Processing Unit)101、メモリ102、HDD(Hard Disk Drive)103、通信インタフェース104、入力装置105、表示装置106を有する。
HDD103は、図1に示した機能を動作させるプログラムや各DBを記憶する。記録媒体の例としてHDD103を例に挙げたが、ROM(Read Only Memory)、RAM、CD−ROM等の他のコンピュータが読み取り可能な記録媒体に各種プログラムを格納しておき、コンピュータに読み取らせることとしてもよい。なお、記録媒体を遠隔地に配置し、コンピュータが、その記憶媒体にアクセスすることでプログラムを取得して利用してもよい。また、その際、取得したプログラムをそのコンピュータ自身の記録媒体に格納して用いてもよい。
通信インタフェース104は、ネットワークインタフェースカードなどである。入力装置105は、例えばキーボードなどであり、表示装置106は、例えばタッチパネルやディスプレイなど、各種情報を表示する表示装置である。
CPU101は、図1に示した各処理部と同様の処理を実行するプログラムをHDD103等から読み出してメモリ102に展開することで、図2等で説明した各機能を実行するプロセスを動作させる。すなわち、このプロセスは、情報処理装置10が有する各処理と同様の機能を実行する。具体的には、CPU101は、コンパイラ実行部12が有する各処理部と同様の機能を有するプログラムをHDD103等から読み出す。そして、CPU101は、各処理部と同様の処理を実行するプロセスを実行する。
このように情報処理装置10は、プログラムを読み出して実行することでコンパイル方法を実行する情報処理装置として動作する。また、情報処理装置10は、媒体読取装置によって記録媒体から上記プログラムを読み出し、読み出された上記プログラムを実行することで上記した実施例と同様の機能を実現することもできる。なお、この他の実施例でいうプログラムは、情報処理装置10によって実行されることに限定されるものではない。例えば、他のコンピュータまたはサーバがプログラムを実行する場合や、これらが協働してプログラムを実行するような場合にも、本発明を同様に適用することができる。
(システム)
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともできる。あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散や統合の具体的形態は図示のものに限られない。つまり、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定し、
ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する
処理を実行することを特徴とするコンパイラ。
(付記2)前記処理対象のコードに存在する複数のループ各々のループ条件に基づいて、ループ処理を融合する対象の組合せを決定する処理を前記コンパイラがさらに実行し、
前記判定する処理は、決定した各組合せについて、前記処理対象のコードが実行されるシステムの性能情報、および、組み合わせた場合の演算数およびデータ転送数に基づいて、各組合せのループ融合可否を判定することを特徴とする付記1に記載のコンパイラ。
(付記3)前記判定する処理は、さらに、前記組み合わせた場合の命令数、または、前記組み合わせた各ループがアクセスするメモリのキャッシュライン数を用いて、前記ループ融合可否を判定することを特徴とする付記2に記載のコンパイラ。
(付記4)前記ループ処理の融合を実行する処理は、前記ループ融合可能と判定された複数の組み合わせに同じループが存在する場合、前記組み合わせた場合のデータ転送数と演算数の比率と、前記システムの性能条件によって特定される閾値との差が小さい組合せに該当するループを融合させることを特徴とする付記2または3に記載のコンパイラ。
(付記5)コンピュータが、
処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定し、
ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する
処理を含んだことを特徴とするコンパイル方法。
(付記6)メモリと、
前記メモリに接続されるプロセッサとを有し、
前記プロセッサは、処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定し、
ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する
処理を実行することを特徴とする情報処理装置。
(付記7)処理対象のコードに存在する複数のループ各々について、前記処理対象のコードが実行されるシステムの性能情報、および、各ループ内で実行される演算数およびデータ転送数に基づいて、ループ融合可否を判定し、
ループ融合可否の判定結果にしたがって、前記ループ処理の融合を実行する処理をコンピュータに実行させるコンパイル制御プログラムを記憶する、コンピュータ読み取り可能な記憶媒体。
10 情報処理装置
11 記憶部
11a ソースプログラム
11b 中間言語
11c オブジェクトファイル
11d 実行ファイル
12 コンパイラ実行部
13 ソースプログラム入力部
14 入出力制御部
15 中間言語生成部
16 最適化部
16a ソース解析部
16b 組合せ抽出部
16c 情報抽出部
16d 比率算出部
16e 判定部
16f 融合部
17 コード生成部
18 オブジェクトファイル出力部
20 リンカ

Claims (5)

  1. コンピュータに、
    処理対象のコードに存在する複数のループ処理各々について各ループ処理内で実行される演算数およびデータ転送数に基づいて、前記データ転送数と前記演算数の比率を算出し、
    前記比率がシステムの性能条件によって特定される基準値を満たすか否かによって、前記ループ処理の融合可否を判定し、
    ループ処理の融合可否の判定結果にしたがって、前記ループ処理の融合を実行する
    処理を実行させることを特徴とするコンパイルプログラム
  2. 前記処理対象のコードに存在する複数のループ処理各々のループ条件に基づいて、ループ処理を融合する対象の組合せを決定する処理を前記コンピュータにさらに実行させ
    前記判定する処理は、決定した各組合せについて、前記処理対象のコードが実行されるシステムの性能情報、および、組み合わせた場合の演算数およびデータ転送数に基づいて、各組合せのループ処理の融合可否を判定することを特徴とする請求項1に記載のコンパイルプログラム
  3. 前記判定する処理は、さらに、前記組み合わせた場合の命令数、または、前記組み合わせた各ループ処理がアクセスするメモリのキャッシュライン数を用いて、前記ループ処理の融合可否を判定することを特徴とする請求項2に記載のコンパイルプログラム
  4. 前記ループ処理の融合を実行する処理は、前記ループ処理の融合可能と判定された複数の組み合わせに同じループ処理が存在する場合、前記組み合わせた場合のデータ転送数と演算数の比率と、前記システムの性能条件によって特定される閾値との差が小さい組合せに該当するループ処理を融合させることを特徴とする請求項2または3に記載のコンパイルプログラム
  5. コンピュータが、
    処理対象のコードに存在する複数のループ処理各々について各ループ処理内で実行される演算数およびデータ転送数に基づいて、前記データ転送数と前記演算数の比率を算出し、
    前記比率がシステムの性能条件によって特定される基準値を満たすか否かによって、前記ループ処理の融合可否を判定し、
    ループ処理の融合可否の判定結果にしたがって、前記ループ処理の融合を実行する
    処理を含んだことを特徴とするコンパイル方法。
JP2013105537A 2013-05-17 2013-05-17 コンパイルプログラムおよびコンパイル方法 Active JP6160232B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2013105537A JP6160232B2 (ja) 2013-05-17 2013-05-17 コンパイルプログラムおよびコンパイル方法
US14/255,236 US9141357B2 (en) 2013-05-17 2014-04-17 Computer-readable recording medium, compiling method, and information processing apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013105537A JP6160232B2 (ja) 2013-05-17 2013-05-17 コンパイルプログラムおよびコンパイル方法

Publications (2)

Publication Number Publication Date
JP2014228891A JP2014228891A (ja) 2014-12-08
JP6160232B2 true JP6160232B2 (ja) 2017-07-12

Family

ID=51896885

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013105537A Active JP6160232B2 (ja) 2013-05-17 2013-05-17 コンパイルプログラムおよびコンパイル方法

Country Status (2)

Country Link
US (1) US9141357B2 (ja)
JP (1) JP6160232B2 (ja)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10228938B2 (en) * 2016-12-30 2019-03-12 Intel Corporation Apparatus and method for instruction-based flop accounting
JP7225859B2 (ja) * 2019-02-04 2023-02-21 富士通株式会社 情報処理装置、情報処理プログラム、及び情報処理方法
JP2022140995A (ja) 2021-03-15 2022-09-29 富士通株式会社 情報処理装置、コンパイルプログラムおよびコンパイル方法

Family Cites Families (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6235944A (ja) 1985-08-09 1987-02-16 Fujitsu Ltd コンパイラ処理方式
US5774727A (en) * 1991-06-27 1998-06-30 Digital Equipment Corporation Parallel processing system for virtual processor implementation of machine-language instructions
JPH09114675A (ja) * 1995-10-16 1997-05-02 Hitachi Ltd ループ融合方法
US5822593A (en) * 1996-12-06 1998-10-13 Xerox Corporation High-level loop fusion
US6058266A (en) * 1997-06-24 2000-05-02 International Business Machines Corporation Method of, system for, and computer program product for performing weighted loop fusion by an optimizing compiler
US6041181A (en) * 1997-07-23 2000-03-21 International Business Machines Corporation Method of, system for, and computer program product for providing quick fusion in WHERE constructs
US6070011A (en) * 1997-10-21 2000-05-30 Hewlett-Packard Co. Compiler for performing a loop fusion, dependent upon loop peeling and/or loop reversal
JP4128439B2 (ja) * 2002-12-26 2008-07-30 富士通株式会社 配列圧縮方法
US7669194B2 (en) * 2004-08-26 2010-02-23 International Business Machines Corporation Fine-grained software-directed data prefetching using integrated high-level and low-level code analysis optimizations
US20070089104A1 (en) * 2005-10-13 2007-04-19 Arie Tal Method and system for managing heuristic properties
US7926046B2 (en) * 2005-12-13 2011-04-12 Soorgoli Ashok Halambi Compiler method for extracting and accelerator template program
JP4339907B2 (ja) 2007-10-24 2009-10-07 株式会社日立製作所 マルチプロセッサ向け最適コード生成方法及びコンパイル装置
US8677338B2 (en) * 2008-06-04 2014-03-18 Intel Corporation Data dependence testing for loop fusion with code replication, array contraction, and loop interchange
US8516468B2 (en) * 2008-06-30 2013-08-20 Intel Corporation Multiversioning if statement merging and loop fusion
US9015690B2 (en) * 2009-08-22 2015-04-21 Advanced Micro Devices, Inc. Proactive loop fusion of non-adjacent loops with intervening control flow instructions

Also Published As

Publication number Publication date
US20140344795A1 (en) 2014-11-20
US9141357B2 (en) 2015-09-22
JP2014228891A (ja) 2014-12-08

Similar Documents

Publication Publication Date Title
KR101731742B1 (ko) 결합된 분기 타깃 및 프레디킷 예측
TWI455025B (zh) 根據迴路分裂或索引陣列的迴路並列化的方法與電腦可讀取媒體
US8296746B2 (en) Optimum code generation method and compiler device for multiprocessor
JP3311462B2 (ja) コンパイル処理装置
US11068247B2 (en) Vectorizing conditional min-max sequence reduction loops
US9823911B2 (en) Method and apparatus for compiling code based on a dependency tree
US20190079805A1 (en) Execution node selection method and information processing apparatus
US9395986B2 (en) Compiling method and compiling apparatus
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
Petric et al. Reno: a rename-based instruction optimizer
CN104035895A (zh) 用于存储器操作绑定的装置和方法
JP6160232B2 (ja) コンパイルプログラムおよびコンパイル方法
Hong et al. Improving simd parallelism via dynamic binary translation
Parravicini et al. Cicero: A domain-specific architecture for efficient regular expression matching
Handa et al. An order-aware dataflow model for parallel unix pipelines
Halstead et al. Compiling irregular applications for reconfigurable systems
JP2007193423A (ja) プログラム処理装置、並列処理プログラム、プログラム処理方法、並列処理コンパイラおよび並列処理コンパイラを格納した記録媒体
JP4719415B2 (ja) 情報処理システム及びコード生成方法
Lukoschus et al. Removing cycles in Esterel programs
KR101559651B1 (ko) 동적 분석 방법 및 장치
Jia et al. Design and implementation of an efficient container tag dynamic taint analysis
Mohr et al. Hardware acceleration for programs in SSA form
Gurumurthy et al. ADAMANT: A Query Executor with Plug-In Interfaces for Easy Co-processor Integration
HU216990B (hu) Eljárás és számítógépes rendszer utasítások feldolgozására
US20230367570A1 (en) Information processing device and compiler method

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20160226

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20170117

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20170131

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20170403

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: 20170516

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20170529

R150 Certificate of patent or registration of utility model

Ref document number: 6160232

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150