JP2006309430A - コンパイラによる最適化方法 - Google Patents

コンパイラによる最適化方法 Download PDF

Info

Publication number
JP2006309430A
JP2006309430A JP2005129903A JP2005129903A JP2006309430A JP 2006309430 A JP2006309430 A JP 2006309430A JP 2005129903 A JP2005129903 A JP 2005129903A JP 2005129903 A JP2005129903 A JP 2005129903A JP 2006309430 A JP2006309430 A JP 2006309430A
Authority
JP
Japan
Prior art keywords
range
language program
processing
instruction
compiler
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.)
Pending
Application number
JP2005129903A
Other languages
English (en)
Inventor
Takenori Yonezu
武紀 米津
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.)
Panasonic Holdings Corp
Original Assignee
Matsushita Electric Industrial Co 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 Matsushita Electric Industrial Co Ltd filed Critical Matsushita Electric Industrial Co Ltd
Priority to JP2005129903A priority Critical patent/JP2006309430A/ja
Publication of JP2006309430A publication Critical patent/JP2006309430A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】 安価で容易にキャッシュミスに起因する性能の低下を抑制できる、コンパイラによる最適化方法を提供する。
【解決手段】 コンパイラは、入力された高級言語プログラムに、実行される確率が高い分岐先処理を指定する記述が含まれている場合には、指定された分岐先処理に相当する命令コードを分岐命令の直後または後続命令の直前に配置する。また、コンパイラは、入力された高級言語プログラムに、下位処理を有する処理を指定する記述が含まれている場合には、キャッシュメモリ内の格納位置が重複しないように、当該処理およびその下位処理に相当する命令コードを配置する。
【選択図】 図1

Description

本発明は、プログラムの実行時間を短縮するコンパイル方法に関し、より特定的には、キャッシュミスに起因する性能の低下を抑制するコンパイラによる最適化方法に関する。
近年では、CPUの処理能力が向上したために、プログラムの実行時間を短縮するためには、メモリアクセスに要する時間を短縮することが重要な課題となっている。メモリアクセスに要する時間を短縮する方法の1つとして、キャッシュメモリを使用する方法が従来から広く知られている。
キャッシュメモリの使用によってメモリアクセスに要する時間を短縮できる理由は、プログラムが参照の局所性を有するからである。参照の局所性には、時間的局所性(同じデータに近い将来アクセスする可能性が高い)と、空間的局所性(近傍のデータに近い将来アクセスする可能性が高い)とが含まれる。プログラムがこのような参照の局所性を有するので、キャッシュメモリに格納されたデータは、近い将来アクセスされる可能性が高い。そこで、キャッシュメモリとしてメインメモリよりも高速にアクセスできるメモリを使用すれば、メモリアクセスに要する時間を外見上短縮することができる。
キャッシュメモリを備えた計算機システムでは、プログラム実行中にキャッシュミスが発生すると、プログラムの実行時間が長くなる。このため、命令コードを格納するキャッシュメモリの効果は、一連の命令コードをアドレス順に実行する場合や、キャッシュメモリに収まる範囲の命令コードを繰り返し実行する場合に大きくなる。しかし、現実のプログラムでは、処理性能、プログラムの開発効率、メモリサイズの制限、プログラムの可読性などの理由により、分岐、ループ、サブルーチンなどの構造が使用される。このため、現実のプログラムを実行したときに、キャッシュミスの発生を完全に抑えることはできない。
キャッシュミスに起因する性能の低下を抑制する方法の1つとして、近い将来実行される可能性が高いデータをキャッシュメモリにプリフェッチしておく方法が知られている。この方法では、プリフェッチの効果を高めるために、プログラムの実行に先だって、プログラム中の分岐やループの繰り返し回数などを解析し、キャッシュミスを予測する処理が行われることがある。しかしながら、分岐先やループの繰り返し回数などは、プログラム実行中に動的に決定されるので、多くの場合、プログラム実行前の静的な解析では正しく予測できない。このように、プログラムの静的な解析結果に基づきプリフェッチを行う方法には、キャッシュミスの予測がはずれやすいという問題がある。
また、キャッシュミスに起因する性能の低下をより効果的に抑制する方法として、コンパイラによる最適化を行うときに、プログラムの動的な解析結果(以下、プロファイル情報という)を用いる方法も提案されている。例えば、特許文献1には、プログラムの1次コンパイル結果を仮想的に実行してプロファイル情報を求め、求めたプロファイル情報に基づき2次コンパイルを行うことにより、好適な位置にプリフェッチ命令が挿入されたオブジェクトファイルを求める方法が開示されている。特許文献2には、プロファイル情報に基づき、条件付き分岐命令における分岐方向に偏りを持たせる方法が開示されている。
特開平7−306790号公報(第一図) 特開平11−149381号公報(第一図)
しかしながら、上記特許文献に開示された方法では、プログラムの動的な解析結果であるプロファイル情報を求める必要がある。このため、これらの方法には、プロファイリングのアルゴリズムやコンパイラに特殊な方式が必要で、高度な技術や経験的に積み重ねられた分析技術が必要とされるという問題がある。
それ故に、本発明は、安価で容易にキャッシュミスに起因する性能の低下を抑制できる、コンパイラによる最適化方法を提供することを目的とする。
本発明のコンパイラによる最適化方法は、高級言語プログラムを機械語プログラムに変換するコンパイラによって実行される最適化方法であって、高級言語プログラムに含まれる記述に基づき、機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを備える。
この場合、高級言語プログラムには、高優先度の分岐先処理を指定する記述が含まれており、範囲決定ステップは、機械語プログラムのうちで高優先度の分岐先処理を含む分岐ブロックに相当する部分を処理範囲として選択し、配置決定ステップは、処理範囲内にある命令コードの配置位置を分岐先処理ごとに決定してもよい。
より好ましくは、配置決定ステップは、高級言語プログラム内の分岐先処理の記述順序と、機械語プログラム内の相当する命令コードの配置順序とが異なるように、処理範囲内にある命令コードの配置位置を決定する場合があってもよい。
あるいは、配置決定ステップは、高優先度の分岐先処理に相当する命令コードの配置位置として、処理範囲内の先頭部分に配置される分岐命令の直後の位置を選択してもよい。
あるいは、配置決定ステップは、高優先度の分岐先処理に相当する命令コードの配置位置として、処理範囲内の次に配置される命令コードの直前の位置を選択してもよい。
あるいは、配置決定ステップは、高優先度の分岐先処理に相当する命令コードのサイズと、キャッシュメモリを備えたコンピュータが機械語プログラムを実行する際のキャッシュメモリの残りライン容量とに基づき、当該命令コードの配置位置として、処理範囲の先頭部分に配置される分岐命令の直後の位置、および、処理範囲の次に配置される命令コードの直前の位置のいずれかを選択してもよい。特に、高級言語プログラムには、キャッシュメモリのラインサイズを指定する記述が含まれていてもよい。
また、高級言語プログラムには、下位処理を有する高優先度の処理を指定する記述が含まれており、範囲決定ステップは、機械語プログラムのうちで高優先度の処理および当該処理の下位処理に相当する部分を処理範囲として選択し、配置決定ステップは、キャッシュメモリを備えたコンピュータが機械語プログラムを実行する際に、処理範囲内にある命令コードのキャッシュメモリにおける格納位置が互いに重複しないように、処理範囲内にある命令コードの配置位置を下位処理ごとに決定してもよい。
あるいは、高級言語プログラムには、第1の範囲を指定する記述が含まれており、範囲決定ステップは、機械語プログラムのうちで第1の範囲に相当する部分を処理範囲として選択してもよい。特に、高級言語プログラムには、第1の範囲内にある第2の範囲を指定する記述がさらに含まれており、範囲決定ステップは、機械語プログラムのうちで第1の範囲から第2の範囲を除いた部分に相当する部分を処理範囲として選択してもよい。
あるいは、高級言語プログラムには、第1の範囲を指定する記述が含まれており、範囲決定ステップは、機械語プログラムのうちで第1の範囲の外に相当する部分を処理範囲として選択してもよい。特に、高級言語プログラムには、第1の範囲内にある第2の範囲を指定する記述がさらに含まれており、範囲決定ステップは、機械語プログラムのうちで第1の範囲から第2の範囲を除いた部分の外に相当する部分を処理範囲として選択してもよい。
また、上記最適化方法をコンピュータに実行させるためのコンパイラ、および、これを記録したコンピュータ読み取り可能な記録媒体も、本発明の範囲に含まれる。
本発明によれば、プログラム開発者は高級言語プログラムを作成するときに高優先度の処理を指定し、コンパイラは高優先度の処理に相当する命令コードを好適な位置に配置する。これにより、安価で容易にキャッシュミスの発生を防止し、キャッシュミスに起因する性能の低下を防止することができる。
以下では、ある高級言語で記述されたプログラム(以下、高級言語プログラムという)をある機械語で記述されたプログラム(以下、機械語プログラムという)に変換するコンパイラ、および、このコンパイラによって実行される最適化処理について説明する。
機械語プログラムは、キャッシュメモリを備えたコンピュータによって実行される。機械語プログラムが、分岐やサブルーチン呼び出しなどを含まず、アドレス空間内の1つの領域に連続して配置されていれば、キャッシュミスの発生は少なく、キャッシュミスに起因する性能の低下も大きな問題にはならない。しかしながら、現実の機械語プログラムは、分岐やサブルーチン呼び出しなどを含み、アドレス空間内の複数の領域に分割して配置される。このため、現実の機械語プログラムを実行する際には、キャッシュミスに起因する性能の低下が問題となる。
以下に示す各実施形態では、分岐やサブルーチン呼び出しを含む高級言語プログラムを機械語プログラムに変換するとともに、機械語プログラムに含まれる命令コードの配置位置を決定する最適化処理を行うコンパイラについて説明する。第1および第2の実施形態では、分岐を含む高級言語プログラムに対する最適化処理について説明し、第3の実施形態では、サブルーチン呼び出しを含む高級言語プログラムに対する最適化処理について説明する。なお、以下の説明では、高級言語の例としてC言語が使用されているが、高級言語および機械語の種類は任意でよい。
(第1の実施形態)
図1〜図3を参照して、本発明の第1の実施形態に係るコンパイラによる最適化処理の実行例を説明する。図1は、機械語プログラムに含まれる命令コードをキャッシュメモリのライン上に配置した様子を示す図である。図1に示す命令コードは、図2に示すPAD図で表された処理に相当する。図2に示す処理では、まず条件判定処理が行われ、次に判定結果に従い分岐先処理1〜4のいずれかが行われ、その後に後続処理が行われる。この処理に相当する命令コードは、図1に示すように、条件判定処理に相当する命令コード(以下、分岐命令という)、分岐先処理1〜4に相当する命令コード(以下、分岐先命令1〜4という)、および、後続処理に相当する命令コード(以下、後続命令という)を含んでいる。
図1には、命令コードをキャッシュメモリの3つのライン上に配置した様子が、2とおり記載されている。図1(a)では、分岐命令および分岐先命令1が1番目のラインに配置され、分岐先命令2および3が2番目のラインに配置され、分岐先命令4および後続命令が3番目のラインに配置されている。この配置(以下、第1の配置という)は、従来のコンパイラによって得られる。
これに対して、図1(b)では、分岐命令および分岐先命令2が1番目のラインに配置され、分岐先命令1および3が2番目のラインに配置され、分岐先命令4および後続命令が3番目のラインに配置されている。この配置(以下、第2の配置という)は、本実施形態に係るコンパイラによって得られる。第2の配置では第1の配置と比べて、分岐先命令1と分岐先命令2とが、逆の位置に配置されている。
本実施形態では、コンピュータが機械語プログラムを実行するときには、ライン単位のプリフェッチが行われるとする。言い換えると、ある命令コードの読み出し時にキャッシュミスが発生した場合には、その命令コードを含む1ライン分の命令コードが、メインメモリからキャッシュメモリに転送されるとする。また、分岐先処理1〜4のうちで実行される確率が最も高い分岐先処理は、分岐先処理2であるとする。
上記の条件下で、分岐先処理2が実行されるときに発生するキャッシュミスについて説明する。第1の配置(図1(a))では、分岐命令が実行されるときには、キャッシュメモリには分岐命令および分岐先命令1がプリフェッチされている。分岐命令の次に分岐先命令2が実行されるときに、分岐先命令2はキャッシュメモリ内に格納されていないので、キャッシュミスが発生する。このキャッシュミスが発生したときに、分岐先命令2および3がメインメモリからキャッシュメモリに転送される。その後、分岐先命令2の次に後続命令が実行されるときに、後続命令はキャッシュメモリ内に格納されていないので、再びキャッシュミスが発生する。このキャッシュミスが発生したときに、分岐先命令4および後続命令がメインメモリからキャッシュメモリに転送される。このように第1の配置では、キャッシュミスは2回発生する。
一方、第2の配置(図1(b))では、分岐命令が実行されるときには、キャッシュメモリには分岐命令および分岐先命令2がプリフェッチされている。分岐命令の次に分岐先命令2が実行されるときに、分岐先命令2はキャッシュメモリ内に格納されているので、キャッシュミスは発生しない。その後、分岐先命令2の次に後続命令が実行されるときに、後続命令はキャッシュメモリ内に格納されていないので、キャッシュミスが発生する。このキャッシュミスが発生したときに、分岐先命令4および後続命令がメインメモリからキャッシュメモリに転送される。このように第2の配置では、キャッシュミスは1回しか発生しない。したがって、第2の配置によれば、第1の配置よりもキャッシュミスの発生を抑制することができる。
プログラム開発者が図2に示すPAD図に基づき従来どおりのプログラミングを行うと、図3(a)に示す高級言語プログラムが得られる。この高級言語プログラムを従来のコンパイラで処理すると、図3(b)に示す機械語プログラムが得られる。この機械語プログラムでは、分岐先命令1〜4は、高級言語プログラム内の分岐先処理1〜4の記述順序と同じ順序で配置されている。このように高級言語プログラム内の分岐先処理の記載順序と、機械語プログラム内の相当する命令コードの配置順序とが同じであると、分岐命令と、高級言語プログラム内で後方に記載された分岐先処理に相当する命令コードとが、キャッシュメモリ内の同じライン上に格納される可能性が低くなる。このため、高級言語プログラム内で後方に記載された分岐処理の発生確率が高い場合には、キャッシュミスが発生しやすくなる。
そこで、本実施形態では、プログラム開発者は、分岐を含む高級言語プログラムを作成するときに、実行される確率が高い分岐先処理を高優先度の分岐先処理として指定する。より詳細には、プログラム開発者は、図3(c)に示すように、実行される確率が高い分岐先処理を#pragma プリプロセッサディレクティブを用いて指定する。この#pragma プリプロセッサディレクティブは、#pragma プリプロセッサを呼び出す機能を有する。パラメータが_Line_Priority_ON (ライン優先度オン)である#pragma プリプロセッサディレクティブと、パラメータが_Line_Priority_OFF(ライン優先度オフ)である#pragma プリプロセッサディレクティブとに挟まれた分岐先処理が、高優先度の分岐先処理となる。
図3(c)に示す高級言語プログラムを本実施形態に係るコンパイラで処理すると、図3(d)に示す機械語プログラムが得られる。この機械語プログラムでは、高優先度の分岐先処理に対応した命令コード(ここでは、分岐先命令2)は、分岐命令の直後に配置されている。この結果、分岐先命令1〜4は、高級言語プログラム内の分岐先処理1〜4の記述順序と異なる順序に配置される。このように高優先度の分岐先処理に相当する命令コードを分岐命令の直後に配置すると、分岐命令と、高優先度の分岐先処理に相当する命令コードとは、キャッシュメモリ内の同じライン上に格納される。したがって、高級言語プログラム内で後方に記載された分岐処理の発生確率が高い場合でも、キャッシュミスの発生を抑制することができる。
以下、図4および図5を参照して、本実施形態に係るコンパイラの構成を説明する。図4は、本実施形態に係るコンパイラの全体構成を示す図である。図4に示すように、本実施形態に係るコンパイラは、翻訳部10および連結部20を備えている。翻訳部10は、入力されたソースファイルに基づき、オブジェクトファイルを生成する。連結部20は、生成されたオブジェクトファイルに基づき、実行形式ファイルを生成する。ソースファイルには高級言語プログラムが記録され、オブジェクトファイルおよび実行形式ファイルには機械語プログラムが記録される。
翻訳部10は、プリプロセッサディレクティブ解析ステップS11、分岐構造処理ステップS12、および、命令コード生成ステップS13を実行する。プリプロセッサディレクティブ解析ステップS11では、ソースファイルに記録された高級言語プログラムから、高優先度の分岐先処理を指定する#pragma プリプロセッサディレクティブが抽出される。
図5は、分岐構造処理ステップS12の詳細を示す図である。図5に示すように、分岐構造処理ステップS12(図5ではステップS12aと記載)では、範囲決定ステップS31、分岐命令生成ステップS32、および、配置決定ステップS33が実行される。
範囲決定ステップS31では、抽出された#pragma プリプロセッサディレクティブに基づき、分岐命令生成ステップS32および配置決定ステップS33の処理範囲が決定される。より詳細には、#pragma プリプロセッサディレクティブがある分岐先処理を指定する場合、範囲決定ステップS31では、機械語プログラムのうちで当該分岐先処理を含む分岐ブロックに相当する部分が処理範囲として選択される。
分岐命令生成ステップS32では、範囲決定ステップS31で決定された処理範囲の先頭部分に配置される分岐命令が生成される。より詳細には、分岐命令生成ステップS32では、途中で分岐しなければ、高優先度の分岐先処理に到達する1以上の分岐命令が生成される。例えば、図3(c)に示す高級言語プログラムでは、分岐先処理2が高優先度の分岐先処理として指定されている。したがって、分岐命令生成ステップS32では、図3(d)に示すように、分岐命令として4つの命令「CMP r0,r1」、「BEQ LABEL_1]、「CMP r0,r2」および「BNE LABEL_3」が生成される。
配置決定ステップS33では、範囲決定ステップS31で決定された処理範囲内にある命令コードの配置位置が分岐先処理ごとに決定される。例えば図3(d)に示す機械語プログラムでは、分岐先命令2の配置位置は、命令「BNE LABEL_3」の直後の位置に決定される。また、分岐先命令1、3および4の配置位置は、それぞれ、ラベルLABEL_1、LABEL_3およびLABEL_4の位置に決定される。このようにして分岐構造処理ステップS12では、高優先度の分岐先処理を含む分岐ブロックに相当する命令コードの配置位置が、分岐先処理ごとに決定される。
命令コード生成ステップS13では、分岐命令生成ステップS32で生成された分岐命令以外の命令コードが生成される。生成された命令コードは、リンク前の機械語プログラムとしてオブジェクトファイルに記録される。
連結部20は、結合ステップS21を実行する。結合ステップS21では、オブジェクトファイルに記録されたリンク前の機械語プログラムに対してリンク処理が実行される。リンク後の機械語プログラムは、実行形式ファイルに記録される。
以上に示すように、本実施形態に係るコンパイラは、入力された高級言語プログラムに高優先度の分岐先処理を指定する記述が含まれている場合には、高優先度の分岐先処理に相当する命令コードを分岐命令の直後に配置する。プログラム開発者は、高級言語プログラムを作成するときに、実行される確率が高い分岐先処理を高優先度の分岐先処理として指定する。プログラム開発者は、高級言語プログラムの動作を理解し、いずれの分岐処理が高い確率で実行されるかを知っているので、多くの場合、高優先度の分岐先処理を正しく指定することができる。例えば、分岐先処理に正常時処理と異常時処理とが含まれている場合には、プログラム開発者は、正常時処理を高優先度の分岐先処理として指定すればよい。
したがって、本実施形態に係るコンパイラによれば、実行される確率が高い分岐先処理に相当する命令コードを分岐命令の直後に配置することにより、分岐ブロックが実行されるときのキャッシュミスの発生を抑制し、キャッシュミスに起因する性能の低下を抑制することができる。
なお、以上の説明では、高優先度の分岐先処理に相当する命令コードを分岐命令の直後に配置することとしたが、当該命令コードを分岐ブロックに相当する命令コードの最後(すなわち、分岐ブロックに相当する命令コードの次に配置される命令コードの直前)に配置しても同じ効果が得られる。
(第2の実施形態)
第1の実施形態に係るコンパイラは、入力された高級言語プログラムに高優先度の分岐先処理を指定する記述が含まれている場合には、高優先度の分岐先処理に相当する命令コードを分岐命令の直後に配置する。この方法では、高優先度の分岐先処理に相当する命令コードのサイズや、分岐命令および後続命令の配置位置によっては、キャッシュミスの発生を十分に抑制できない場合がある。
図6は、図1と同様に、機械語プログラムに含まれる命令コードをキャッシュメモリのライン上に配置した様子を示す図である。まず、図6(a)に示す場合(すなわち、分岐先命令2が2つのライン上に跨がって配置され、後続命令が分岐先命令2と異なるライン上に配置される場合)を考える。この場合、分岐命令の次に分岐先命令2が実行されるときには、キャッシュミスは発生しない。しかし、読み出し対象のラインが分岐先命令2の実行中に変化するとき、および、分岐先命令2の次に後続命令が実行されるときに、合わせて2回のキャッシュミスが発生する。
次に、図6(b)に示す場合(すなわち、分岐命令がラインの終端付近に配置される場合)を考える。この場合、分岐命令と分岐先命令2とは連続的に配置されているにも関わらず、分岐命令の次に分岐先命令2が実行されるとき、および、分岐先命令2の次に後続命令が実行されるときに、合わせて2回のキャッシュミスが発生する。
このような場合に対応するために、本発明の第2の実施形態に係るコンパイラは、高優先度の分岐先処理に相当する命令コードのサイズと、機械語プログラムが実行される際のキャッシュメモリの残りライン容量とに基づき、高優先度の分岐先処理に相当する命令コードの配置位置を複数の候補の中から選択する。より詳細には、本実施形態に係るコンパイラは、分岐命令の直後の位置および後続命令の直前の位置のうちでキャッシュミスが発生しにくいほうを、高優先度の分岐先処理に相当する命令コードの配置位置として選択する。
図7は、図1と同様に、機械語プログラムに含まれる命令コードをキャッシュメモリのライン上に配置した様子を示す図である。従来のコンパイラによれば、命令コードは、図7(a)に示すように配置される。この配置では、分岐命令の次に分岐先命令2が実行されるとき、および、分岐先命令2の次に後続命令が実行されるときに、合わせて2回のキャッシュミスが発生する。
これに対して、本実施形態に係るコンパイラによれば、高優先度の分岐先処理に相当する命令コードのサイズと、機械語プログラムが実行される際のキャッシュメモリの残りライン容量とに基づき、命令コードは図7(b)や(c)に示すように配置される。図7(b)に示す配置では、高優先度の分岐先処理(分岐先処理2)に相当する命令コード(分岐先命令2)は、分岐命令の直後に配置される。この結果、分岐先命令2は、分岐命令と同じライン上に配置される。この配置では、分岐先命令2の次に後続命令が実行されるときに、キャッシュミスは1回だけ発生する。また、図7(c)に示す配置では、分岐先命令2は、後続命令の直前に配置される。この結果、分岐先命令2は、後続命令と同じライン上に配置される。この配置では、分岐命令の次に分岐先命令2が実行されるときに、キャッシュミスは1回だけ発生する。
以下、図8〜図10を参照して、本実施形態に係るコンパイラの構成を説明する。本実施形態に係るコンパイラの全体構成は、第1の実施形態に係るコンパイラと同じである(図4を参照)。ただし、本実施形態に係るコンパイラの翻訳部10は、分岐構造処理ステップS12として、図8に示すステップS12bを実行する。図8に示すステップS12bは、図5に示すステップS12aに配置選択ステップS40を追加したものである。
図9は、配置選択ステップS40の詳細を示す図である。配置選択ステップS40では、高優先度の分岐先処理に相当する命令コードのサイズSZ0が算出され(ステップS41)、キャッシュメモリにおける分岐命令の後の残りライン容量SZ1が算出され(ステップS42)、キャッシュメモリにおける後続命令の前の残りライン容量SZ2が算出される(ステップS43)。
ステップS41〜S43では、次式を用いて、命令コードのサイズSZ0、分岐命令後の残りライン容量SZ1、および、後続命令前の残りライン容量SZ2が算出される(図10を参照)。
SZ0= (高優先度の分岐先処理に相当する命令コードの終端アドレス)
−(高優先度の分岐先処理に相当する命令コードの先頭アドレス)
SZ1=(分岐命令を含むラインの終端アドレス)−(分岐命令の終端アドレス)
SZ2=(後続命令の先頭アドレス)−(後続命令を含むラインの先頭アドレス)
ステップS44およびS45では、ステップS41〜S43で算出された値SZ0〜SZ2に従い、3とおりの場合分けが行われる。ステップS46〜S48では、3とおりの場合分けに従い、高優先度の分岐先処理に相当する命令コードの配置位置が決定される。より詳細には、SZ1≧SZ0が成立する第1の場合(ステップS44でYES)には、高優先度の分岐先処理に相当する命令コードの配置位置として、分岐命令の直後の位置が選択される(ステップS46)。SZ1<SZ0かつSZ2≧SZ0が成立する第2の場合(ステップS44でNOかつステップS45でYES)には、高優先度の分岐先処理に相当する命令コードの配置位置として、後続命令の直前の位置が選択される(ステップS47)。SZ1<SZ0かつSZ2<SZ0が成立する第3の場合(ステップS44でNOかつステップS45でNO)には、高優先度の分岐先処理に相当する命令コードの配置位置として、分岐命令の直後の位置が選択される(ステップS48)。
上記第3の場合には、キャッシュミスの発生を抑制できない可能性があるが、上記第1および第2の場合には、例えば図7(b)および(c)に示すように、高優先度の分岐先処理に相当する命令コードを配置することができる。したがって、上記第1および第2の場合には、キャッシュミスの発生を1回に減らすことができる。
なお、以上の説明では、配置選択ステップS40において、高優先度の分岐先処理に相当する命令コードのサイズSZ0を算出することとしたが、プログラムの開発状況によっては、プログラム開発者はサイズSZ0の値を知っている場合がある。この場合、プログラム開発者は、#pragma プリプロセッサディレクティブを用いて、高級言語プログラム内でサイズSZ0を指定してもよい。これにより、サイズSZ0を算出する処理を行う必要がなくなるので、コンパイル時間を短縮することができる。この方法は、プログラムの再利用が行われている場合や、高優先度の分岐先処理のプログラミングは完成しているが、それ以外の処理のプログラムが未完成である場合などに効果的である。
また、プログラム開発者は、#pragma プリプロセッサディレクティブを用いて、高級言語プログラム内でキャッシュメモリのラインサイズを指定してもよい。一般にコンパイラは、コンピュータのアーキテクチャを考慮して作成されるが、この方法を用いれば、キャッシュメモリの構成変更に対応できるコンパイラを得ることができる。
(第3の実施形態)
図11は、プログラム実行中にサブルーチンが階層的に呼び出される様子を示す図である。図11では、処理Aから処理Bが呼び出され、処理Bから処理Cが呼び出され、処理Cから処理Dが呼び出され、処理Dから処理Eが呼び出されている。以下、処理A〜Eに相当する命令コードを、それぞれ、処理コードA〜Eという。
図11に示すサブルーチン呼び出しが行われるときに発生するキャッシュミスについて説明する。このサブルーチン呼び出しを行うコンピュータは、2ウェイ・セット・アソシエイティブ方式で、ラインサイズが32バイト、総容量が8Kバイトのキャッシュメモリを備えているとする。また、メインメモリ内において、処理コードAおよびBはアドレスの最上位ビットが0である領域(00000000〜01111111)に配置され、処理コードC〜Eはアドレスの最上位ビット1である領域(10000000〜11111111)に配置されているとする。さらに、キャッシュメモリの2つのウェイは、アドレスの最上位ビットが0か1かによって区別されるとする。
図12は、処理Dが実行されているときのキャッシュメモリの内容を示す図である。図12では、処理コードA〜Dは、キャッシュメモリ内に互いに重複しない位置に格納されている。一方、処理コードEのキャッシュメモリ内の格納位置は、処理コードCのキャッシュメモリ内の格納位置と重複するとする。この場合、処理Dから処理Eが呼び出されたときに、キャッシュメモリ内に格納された処理コードCは、処理コードEによって上書きされる。したがって、その後に処理コードCが実行されるときに、キャッシュミスが発生する。例えば、処理Aがループ内で実行される場合には、ループ処理が1回実行されるたびに、処理コードCは処理コードEによって上書きされ、キャッシュミスが発生する。
そこで、本実施形態では、プログラム開発者は、下位処理を有する処理を含む高級言語プログラムを作成するときに、最適化の対象とする処理を高優先度の処理として指定する。より詳細には、プログラム開発者は、図13に示すように、最適化の対象とする処理を#pragma プリプロセッサディレクティブを用いて指定する。この#pragma プリプロセッサディレクティブは、#pragma プリプロセッサを呼び出す機能を有する。パラメータが_Page_Priority_ON (ページ優先度オン)である#pragma プリプロセッサディレクティブと、パラメータが_Page_Priority_OFF(ページ優先度オフ)である#pragma プリプロセッサディレクティブとに挟まれた処理が、下位処理を有する高優先度の処理となる。
処理Aが高優先度の処理として指定された高級言語プログラムを本実施形態に係るコンパイラで処理すると、処理コードEはキャッシュメモリ内で処理コードA〜Dと重複しない位置に配置される(図14を参照)。これにより、処理コードCが処理コードEによって上書きされることを防止し、処理コードCが実行されるときに発生するキャッシュミスを防止することができる。
このような命令コードの配置位置を求めるために、本実施形態に係るコンパイラは、高級言語プログラムに含まれる記述に基づき、機械語プログラムの一部を処理範囲として決定する処理と、処理範囲内にある命令コードの配置位置を決定する処理と行う。図13に示す例では、高優先度の処理として指定された処理Aは、下位処理として処理B〜Eを有している。処理範囲を決定する処理では、サブルーチンの呼び出し関係が解析され、これにより、処理Aとその下位処理である処理B〜Eとが処理範囲として選択される。次に、命令コードの配置位置を決定する処理では、処理コードEのキャッシュメモリ内の格納位置が処理コードCのキャッシュメモリ内の格納位置と重複することが検出され、処理コードEの配置位置として、キャッシュメモリ内で処理コードA〜Dと重複しない位置が探索される。これにより、下位処理として処理B〜Eを有する処理Aがループ内で実行される場合など、プログラムの時間的局所性が高い場合に、キャッシュミスを大幅に削減し、キャッシュミスに起因する性能の低下を防止することができる。
以下、図15を参照して、本実施形態に係るコンパイラの構成を説明する。本実施形態に係るコンパイラの全体構成は、第1の実施形態に係るコンパイラと同じである(図4を参照)。ただし、本実施形態に係るコンパイラは、図1に示す連結部20に代えて、図15に示す連結部50を備えている。連結部50は、1次結合ステップS51、範囲決定ステップS52、アドレス重複検出ステップS53、配置決定ステップS54、および、配置ステップS55を実行する。また、連結部50は、1次結合ステップS51の出力データを記録する1次実行形式ファイルおよびアドレスマッピング情報ファイルを含む。
1次結合ステップS51では、オブジェクトファイルに記録された機械語プログラムに対してリンク処理が行われる。これにより、実行可能な機械語プログラム(リンク後の機械語プログラム)と、サブルーチンやラベルのアドレス情報とが生成される。実行可能な機械語プログラムは1次実行形式ファイルに記録され、アドレス情報はアドレスマッピング情報ファイルに記録される。1次実行形式ファイルには、高級言語プログラムにおいて高優先度の処理として指定された処理を特定する情報も記録される。
範囲決定ステップS52では、1次実行形式ファイルに記録された内容に基づき、サブルーチンの階層構造が解析される。その結果、高優先度の処理およびその下位処理に相当する命令コードが、処理対象として選択される。
アドレス重複検出ステップS53では、アドレスマッピング情報ファイルに記録された内容に基づき、高優先度の処理およびその下位処理に相当する命令コードのメインメモリ上のアドレスが求められる。また、求めたアドレスと、キャッシュメモリの構成に関する情報とに基づき、高優先度の処理およびその下位処理に相当する命令コードのキャッシュメモリ内の格納位置のうちで、互いに重複しているものが検出される。
キャッシュメモリ内の格納位置が重複している命令コードが存在する場合、配置決定ステップS54では、命令コードの重複配置が解消されるように、命令コードの配置位置が下位処理ごとに決定される。配置ステップS55では、高優先度の処理およびその下位処理に相当する命令コードが、配置決定ステップS54で決定された位置に配置される。
図16および図17を参照して、アドレス重複検出ステップS53で使用される、メインメモリのアドレスとキャッシュメモリのアドレスとの対応づけについて説明する。ここでは、例として、2ウェイ・セット・アソシエイティブ方式で、ラインサイズが32バイト、総容量が8Kバイトのキャッシュメモリ(図16を参照)について説明する。
メインメモリのアドレス幅が32ビットであるとすると、このうち下位13ビットがキャッシュメモリのアドレスに対応づけられる(図17を参照)。キャッシュメモリのアドレスは、タグアドレスの最下位ビット(1ビット)、インデックス(7ビット)、および、オフセット(5ビット)に分けられる。タグアドレスの最下位ビットは、2ウェイのいずれかを指定し、インデックスはラインを指定し、オフセットはライン上のバイトを指定する。
2つの処理に相当する命令コードのメインメモリのアドレスのうち、タグアドレスの最下位ビットとインデックスとを合わせた8ビットが一致する場合には、これら2つの命令コードは、キャッシュメモリ内に重複して配置される。このようにアドレス重複検出ステップS53では、メインメモリのアドレスの一部が一致しているか否かにより、命令コードのキャッシュメモリ内の格納位置が重複しているか否かを判断することができる。
図18を参照して、配置決定ステップS54について説明する。アドレス重複検出ステップS53において、ある処理の命令コード(以下、上位命令コードという。図18では処理コードC)と当該処理の下位処理に相当する命令コード(以下、下位命令コードという。図18では処理コードE)とが、重複した位置に配置されていることが検出されたとする。この場合、下位命令コードのサイズSchildと、上位命令コードの後方に存在するキャッシュメモリ内の空き領域のサイズSfreeとが算出される。Sfree>Schildが成立する場合には、次式により、下位命令コードの移動量Snopが算出される。
Snop= (上位命令コードの終端アドレス)
−(下位命令コードの先頭アドレス)
下位命令コードの前には、求めた移動量Snop分のNOP命令が配置される。このようにして上位命令コードと重複しない位置に下位命令コードを移動させることにより、上位命令コードと下位命令コードのキャッシュメモリ内の配置位置が重複することを防止することができる。なお、下位命令コードの前にNOP命令を配置することに代えて、org命令を用いて下位命令コードの配置位置を制御してもよい。具体的には、「org 上位命令コードの終端アドレス+1」の後に下位命令コードを記載すればよい。
なお、本発明の第1〜第3の実施形態では、高級言語プログラム内でパラメータがオンである#pragma プリプロセッサディレクティブとパラメータがオフである#pragma プリプロセッサディレクティブとに挟まれた部分が、高優先度の処理として指定されることとしたが、高優先度の処理の指定方法として、これ以外の方法を用いてもよい。例えば、高級言語プログラム内には、高優先度の処理として指定された範囲内にある高優先度の処理でない部分を指定する#pragma プリプロセッサディレクティブがさらに含まれていてもよい。あるいは、高級言語プログラム内には、高優先度の処理でない範囲を指定する#pragma プリプロセッサディレクティブや、その範囲内にある高優先度の処理である部分を指定する#pragma プリプロセッサディレクティブが含まれていてもよい。
一般に、プログラム実行時に異常時処理が実行されるように動作条件を設定することは困難である。そこで、最適化処理の一部を無効する#pragma プリプロセッサディレクティブを好適に組み合わせて利用することにより、キャッシュミスが発生しやすい機械語プログラムを得ることができる。これにより、本発明の最適化処理を施した場合の最悪の性能を容易に見積ることができる。
さらに、本発明の最適化処理を施した場合と施さない場合とでプログラムの実行速度を比較し、最適化処理を施してもプログラムの実行速度が改善されない場合には、最適化処理の一部を無効化することができる。これにより、最適化処理に伴い挿入されるNOP命令の量を削減してROMサイズを減らし、システムのコストを削減することができる。
本発明のコンパイラによる最適化方法は、安価で容易にキャッシュミスに起因する性能の低下を抑制できるので、高級言語プログラムを機械語プログラムに変換する各種のコンパイラに利用することができる。
命令コードをキャッシュメモリのライン上に配置した様子を示す図 最適化処理の対象となる処理を表すPAD図 本発明の第1の実施形態に係るコンパイラによる最適化処理の実行例を示す図 本発明の第1の実施形態に係るコンパイラの全体構成を示す図 本発明の第1の実施形態に係るコンパイラの分岐構造処理ステップを示す図 図5に示す分岐構造処理ステップの詳細を示す図 命令コードをキャッシュメモリのライン上に配置した様子を示す図 本発明の第2の実施形態に係るコンパイラの分岐構造処理ステップを示す図 図8に示す配置選択ステップの詳細を示す図 図8に示す配置選択ステップで算出される値を示す図 プログラム実行中にサブルーチンが階層的に呼び出される様子を示す図 ある時点でのキャッシュメモリの内容を示す図 本発明の第3の実施形態において、高優先度の処理が指定される様子を示す図 本発明の第3の実施形態において、ある時点でのキャッシュメモリの内容を示す図 本発明の第3の実施形態に係るコンパイラの連結部の詳細を示す図 キャッシュメモリの例を示す図 メインメモリのアドレスとキャッシュメモリのアドレスの対応づけを示す図 本発明の第3の実施形態に係るコンパイラの配置決定ステップを説明するための図
符号の説明
10…翻訳部
20、50…連結部
S11…プリプロセッサディレクティブ解析ステップ
S12…分岐構造処理ステップ
S13…命令コード生成ステップ
S21…結合ステップ
S31、S52…範囲決定ステップ
S32…分岐命令生成ステップ
S33、S54…配置決定ステップ
S40…配置選択ステップ
S51…1次結合ステップ
S53…アドレス重複解析ステップ
S55…配置ステップ

Claims (14)

  1. 高級言語プログラムを機械語プログラムに変換するコンパイラによって実行される最適化方法であって、
    前記高級言語プログラムに含まれる記述に基づき、前記機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、
    前記処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを備えた、コンパイラによる最適化方法。
  2. 前記高級言語プログラムには、高優先度の分岐先処理を指定する記述が含まれており、
    前記範囲決定ステップは、前記機械語プログラムのうちで前記高優先度の分岐先処理を含む分岐ブロックに相当する部分を前記処理範囲として選択し、
    前記配置決定ステップは、前記処理範囲内にある命令コードの配置位置を分岐先処理ごとに決定することを特徴とする、請求項1に記載のコンパイラによる最適化方法。
  3. 前記配置決定ステップは、前記高級言語プログラム内の分岐先処理の記述順序と、前記機械語プログラム内の相当する命令コードの配置順序とが異なるように、前記処理範囲内にある命令コードの配置位置を決定する場合があることを特徴とする、請求項2に記載のコンパイラによる最適化方法。
  4. 前記配置決定ステップは、前記高優先度の分岐先処理に相当する命令コードの配置位置として、前記処理範囲内の先頭部分に配置される分岐命令の直後の位置を選択することを特徴とする、請求項2に記載のコンパイラによる最適化方法。
  5. 前記配置決定ステップは、前記高優先度の分岐先処理に相当する命令コードの配置位置として、前記処理範囲内の次に配置される命令コードの直前の位置を選択することを特徴とする、請求項2に記載のコンパイラによる最適化方法。
  6. 前記配置決定ステップは、前記高優先度の分岐先処理に相当する命令コードのサイズと、キャッシュメモリを備えたコンピュータが前記機械語プログラムを実行する際の前記キャッシュメモリの残りライン容量とに基づき、当該命令コードの配置位置として、前記処理範囲の先頭部分に配置される分岐命令の直後の位置、および、前記処理範囲の次に配置される命令コードの直前の位置のいずれかを選択することを特徴とする、請求項2に記載のコンパイラによる最適化方法。
  7. 前記高級言語プログラムには、前記キャッシュメモリのラインサイズを指定する記述が含まれていることを特徴とする、請求項6に記載のコンパイラによる最適化方法。
  8. 前記高級言語プログラムには、下位処理を有する高優先度の処理を指定する記述が含まれており、
    前記範囲決定ステップは、前記機械語プログラムのうちで前記高優先度の処理および当該処理の下位処理に相当する部分を前記処理範囲として選択し、
    前記配置決定ステップは、キャッシュメモリを備えたコンピュータが前記機械語プログラムを実行する際に、前記処理範囲内にある命令コードの前記キャッシュメモリにおける格納位置が互いに重複しないように、前記処理範囲内にある命令コードの配置位置を下位処理ごとに決定することを特徴とする、請求項1に記載のコンパイラによる最適化方法。
  9. 前記高級言語プログラムには、第1の範囲を指定する記述が含まれており、
    前記範囲決定ステップは、前記機械語プログラムのうちで前記第1の範囲に相当する部分を前記処理範囲として選択することを特徴とする、請求項1に記載のコンパイラによる最適化方法。
  10. 前記高級言語プログラムには、前記第1の範囲内にある第2の範囲を指定する記述がさらに含まれており、
    前記範囲決定ステップは、前記機械語プログラムのうちで前記第1の範囲から前記第2の範囲を除いた部分に相当する部分を前記処理範囲として選択することを特徴とする、請求項9に記載のコンパイラによる最適化方法。
  11. 前記高級言語プログラムには、第1の範囲を指定する記述が含まれており、
    前記範囲決定ステップは、前記機械語プログラムのうちで前記第1の範囲の外に相当する部分を前記処理範囲として選択することを特徴とする、請求項1に記載のコンパイラによる最適化方法。
  12. 前記高級言語プログラムには、前記第1の範囲内にある第2の範囲を指定する記述がさらに含まれており、
    前記範囲決定ステップは、前記機械語プログラムのうちで前記第1の範囲から前記第2の範囲を除いた部分の外に相当する部分を前記処理範囲として選択することを特徴とする、請求項11に記載のコンパイラによる最適化方法。
  13. 高級言語プログラムを機械語プログラムに変換する処理および最適化処理をコンピュータに実行させるためのコンパイラであって、前記最適化処理として、
    前記高級言語プログラムに含まれる記述に基づき、前記機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、
    前記処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを、コンピュータに実行させるためのコンパイラ。
  14. 高級言語プログラムを機械語プログラムに変換する処理および最適化処理をコンピュータに実行させるためのコンパイラを記録したコンピュータ読み取り可能な記録媒体であって、前記最適化処理として、
    前記高級言語プログラムに含まれる記述に基づき、前記機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、
    前記処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを、コンピュータに実行させるためのコンパイラを記録したコンピュータ読み取り可能な記録媒体。
JP2005129903A 2005-04-27 2005-04-27 コンパイラによる最適化方法 Pending JP2006309430A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2005129903A JP2006309430A (ja) 2005-04-27 2005-04-27 コンパイラによる最適化方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2005129903A JP2006309430A (ja) 2005-04-27 2005-04-27 コンパイラによる最適化方法

Publications (1)

Publication Number Publication Date
JP2006309430A true JP2006309430A (ja) 2006-11-09

Family

ID=37476258

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2005129903A Pending JP2006309430A (ja) 2005-04-27 2005-04-27 コンパイラによる最適化方法

Country Status (1)

Country Link
JP (1) JP2006309430A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2010010678A1 (ja) * 2008-07-22 2010-01-28 パナソニック株式会社 プログラム最適化方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS5960640A (ja) * 1982-09-30 1984-04-06 Fujitsu Ltd コンパイラ処理方法
JPH07271607A (ja) * 1994-03-31 1995-10-20 Nec Corp 選択頻度順プログラム自動修正方式
JP2000222218A (ja) * 1999-02-01 2000-08-11 Fujitsu Ltd コンパイル装置および記録媒体
JP2002024031A (ja) * 2000-07-07 2002-01-25 Sharp Corp オブジェクトコードの再合成方法および生成方法
JP2002099427A (ja) * 2000-09-25 2002-04-05 Toshiba Corp プログラムの開発方法、プログラムの開発システム及びマイクロプロセッサ

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS5960640A (ja) * 1982-09-30 1984-04-06 Fujitsu Ltd コンパイラ処理方法
JPH07271607A (ja) * 1994-03-31 1995-10-20 Nec Corp 選択頻度順プログラム自動修正方式
JP2000222218A (ja) * 1999-02-01 2000-08-11 Fujitsu Ltd コンパイル装置および記録媒体
JP2002024031A (ja) * 2000-07-07 2002-01-25 Sharp Corp オブジェクトコードの再合成方法および生成方法
JP2002099427A (ja) * 2000-09-25 2002-04-05 Toshiba Corp プログラムの開発方法、プログラムの開発システム及びマイクロプロセッサ

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2010010678A1 (ja) * 2008-07-22 2010-01-28 パナソニック株式会社 プログラム最適化方法
JP2010026851A (ja) * 2008-07-22 2010-02-04 Panasonic Corp コンパイラによる最適化方法
CN102099786A (zh) * 2008-07-22 2011-06-15 松下电器产业株式会社 程序优化方法

Similar Documents

Publication Publication Date Title
US11216258B2 (en) Direct function call substitution using preprocessor
US9798528B2 (en) Software solution for cooperative memory-side and processor-side data prefetching
JP4374221B2 (ja) コンピュータシステムおよび記録媒体
WO2010010678A1 (ja) プログラム最適化方法
US6539541B1 (en) Method of constructing and unrolling speculatively counted loops
JP4844971B2 (ja) インタープリタの最適化をプログラム・コード変換の間に実行する方法及び装置
US6834383B2 (en) Method for binary-level branch reversal on computer architectures supporting predicated execution
US8990786B2 (en) Program optimizing apparatus, program optimizing method, and program optimizing article of manufacture
US20020066081A1 (en) Speculative caching scheme for fast emulation through statically predicted execution traces in a caching dynamic translator
JP5579694B2 (ja) 復帰スタックを管理する方法および装置
JP2016536665A (ja) 推論的ベクトル演算の実行を制御するためのデータ処理装置及び方法
US9465595B2 (en) Computing apparatus, computing method, and computing program
US8359435B2 (en) Optimization of software instruction cache by line re-ordering
JPWO2009004709A1 (ja) 間接分岐処理プログラムおよび間接分岐処理方法
US20140157248A1 (en) Conversion apparatus, method of converting, and non-transient computer-readable recording medium having conversion program stored thereon
JP2008003882A (ja) コンパイラプログラム,リストベクトルの領域割当て最適化方法,コンパイル処理装置およびコンパイラプログラムを記録したコンピュータ読み取り可能な記録媒体
US8166252B2 (en) Processor and prefetch support program
US20160011889A1 (en) Simulation method and storage medium
JP2006309430A (ja) コンパイラによる最適化方法
JP2009020695A (ja) 情報処理装置及びシステム
JP4473626B2 (ja) コンパイラ、記録媒体、コンパイル装置、通信端末装置及びコンパイル方法
US8745599B2 (en) Probabilistic pointer analysis method using SSA form
JP2002014868A (ja) メモリ参照動作検出機構を有するマイクロプロセッサおよびコンパイル方法
US20220269508A1 (en) Methods and systems for nested stream prefetching for general purpose central processing units
US6430682B1 (en) Reliable branch predictions for real-time applications

Legal Events

Date Code Title Description
A621 Written request for application examination

Effective date: 20080310

Free format text: JAPANESE INTERMEDIATE CODE: A621

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20100426

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110315

A521 Written amendment

Effective date: 20110510

Free format text: JAPANESE INTERMEDIATE CODE: A523

A131 Notification of reasons for refusal

Effective date: 20110531

Free format text: JAPANESE INTERMEDIATE CODE: A131

A521 Written amendment

Effective date: 20110727

Free format text: JAPANESE INTERMEDIATE CODE: A523

A131 Notification of reasons for refusal

Effective date: 20110812

Free format text: JAPANESE INTERMEDIATE CODE: A131

RD02 Notification of acceptance of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7422

Effective date: 20110826

A02 Decision of refusal

Effective date: 20111201

Free format text: JAPANESE INTERMEDIATE CODE: A02