(57)【要約】【課題】  安価で容易にキャッシュミスに起因する性能の低下を抑制できる、コンパイラによる最適化方法を提供する。【解決手段】  コンパイラは、入力された高級言語プログラムに、実行される確率が高い分岐先処理を指定する記述が含まれている場合には、指定された分岐先処理に相当する命令コードを分岐命令の直後または後続命令の直前に配置する。また、コンパイラは、入力された高級言語プログラムに、下位処理を有する処理を指定する記述が含まれている場合には、キャッシュメモリ内の格納位置が重複しないように、当該処理およびその下位処理に相当する命令コードを配置する。【選択図】  図１
2006309430.tif 000002
【特許請求の範囲】
【請求項１】
高級言語プログラムを機械語プログラムに変換するコンパイラによって実行される最適化方法であって、
前記高級言語プログラムに含まれる記述に基づき、前記機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、
前記処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを備えた、コンパイラによる最適化方法。
【請求項２】
前記高級言語プログラムには、高優先度の分岐先処理を指定する記述が含まれており、
前記範囲決定ステップは、前記機械語プログラムのうちで前記高優先度の分岐先処理を含む分岐ブロックに相当する部分を前記処理範囲として選択し、
前記配置決定ステップは、前記処理範囲内にある命令コードの配置位置を分岐先処理ごとに決定することを特徴とする、請求項１に記載のコンパイラによる最適化方法。
【請求項３】
前記配置決定ステップは、前記高級言語プログラム内の分岐先処理の記述順序と、前記機械語プログラム内の相当する命令コードの配置順序とが異なるように、前記処理範囲内にある命令コードの配置位置を決定する場合があることを特徴とする、請求項２に記載のコンパイラによる最適化方法。
【請求項４】
前記配置決定ステップは、前記高優先度の分岐先処理に相当する命令コードの配置位置として、前記処理範囲内の先頭部分に配置される分岐命令の直後の位置を選択することを特徴とする、請求項２に記載のコンパイラによる最適化方法。
【請求項５】
前記配置決定ステップは、前記高優先度の分岐先処理に相当する命令コードの配置位置として、前記処理範囲内の次に配置される命令コードの直前の位置を選択することを特徴とする、請求項２に記載のコンパイラによる最適化方法。
【請求項６】
前記配置決定ステップは、前記高優先度の分岐先処理に相当する命令コードのサイズと、キャッシュメモリを備えたコンピュータが前記機械語プログラムを実行する際の前記キャッシュメモリの残りライン容量とに基づき、当該命令コードの配置位置として、前記処理範囲の先頭部分に配置される分岐命令の直後の位置、および、前記処理範囲の次に配置される命令コードの直前の位置のいずれかを選択することを特徴とする、請求項２に記載のコンパイラによる最適化方法。
【請求項７】
前記高級言語プログラムには、前記キャッシュメモリのラインサイズを指定する記述が含まれていることを特徴とする、請求項６に記載のコンパイラによる最適化方法。
【請求項８】
前記高級言語プログラムには、下位処理を有する高優先度の処理を指定する記述が含まれており、
前記範囲決定ステップは、前記機械語プログラムのうちで前記高優先度の処理および当該処理の下位処理に相当する部分を前記処理範囲として選択し、
前記配置決定ステップは、キャッシュメモリを備えたコンピュータが前記機械語プログラムを実行する際に、前記処理範囲内にある命令コードの前記キャッシュメモリにおける格納位置が互いに重複しないように、前記処理範囲内にある命令コードの配置位置を下位処理ごとに決定することを特徴とする、請求項１に記載のコンパイラによる最適化方法。
【請求項９】
前記高級言語プログラムには、第１の範囲を指定する記述が含まれており、
前記範囲決定ステップは、前記機械語プログラムのうちで前記第１の範囲に相当する部分を前記処理範囲として選択することを特徴とする、請求項１に記載のコンパイラによる最適化方法。
【請求項１０】
前記高級言語プログラムには、前記第１の範囲内にある第２の範囲を指定する記述がさらに含まれており、
前記範囲決定ステップは、前記機械語プログラムのうちで前記第１の範囲から前記第２の範囲を除いた部分に相当する部分を前記処理範囲として選択することを特徴とする、請求項９に記載のコンパイラによる最適化方法。
【請求項１１】
前記高級言語プログラムには、第１の範囲を指定する記述が含まれており、
前記範囲決定ステップは、前記機械語プログラムのうちで前記第１の範囲の外に相当する部分を前記処理範囲として選択することを特徴とする、請求項１に記載のコンパイラによる最適化方法。
【請求項１２】
前記高級言語プログラムには、前記第１の範囲内にある第２の範囲を指定する記述がさらに含まれており、
前記範囲決定ステップは、前記機械語プログラムのうちで前記第１の範囲から前記第２の範囲を除いた部分の外に相当する部分を前記処理範囲として選択することを特徴とする、請求項１１に記載のコンパイラによる最適化方法。
【請求項１３】
高級言語プログラムを機械語プログラムに変換する処理および最適化処理をコンピュータに実行させるためのコンパイラであって、前記最適化処理として、
前記高級言語プログラムに含まれる記述に基づき、前記機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、
前記処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを、コンピュータに実行させるためのコンパイラ。
【請求項１４】
高級言語プログラムを機械語プログラムに変換する処理および最適化処理をコンピュータに実行させるためのコンパイラを記録したコンピュータ読み取り可能な記録媒体であって、前記最適化処理として、
前記高級言語プログラムに含まれる記述に基づき、前記機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、
前記処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを、コンピュータに実行させるためのコンパイラを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの実行時間を短縮するコンパイル方法に関し、より特定的には、キャッシュミスに起因する性能の低下を抑制するコンパイラによる最適化方法に関する。
【背景技術】
【０００２】
近年では、ＣＰＵの処理能力が向上したために、プログラムの実行時間を短縮するためには、メモリアクセスに要する時間を短縮することが重要な課題となっている。メモリアクセスに要する時間を短縮する方法の１つとして、キャッシュメモリを使用する方法が従来から広く知られている。
【０００３】
キャッシュメモリの使用によってメモリアクセスに要する時間を短縮できる理由は、プログラムが参照の局所性を有するからである。参照の局所性には、時間的局所性（同じデータに近い将来アクセスする可能性が高い）と、空間的局所性（近傍のデータに近い将来アクセスする可能性が高い）とが含まれる。プログラムがこのような参照の局所性を有するので、キャッシュメモリに格納されたデータは、近い将来アクセスされる可能性が高い。そこで、キャッシュメモリとしてメインメモリよりも高速にアクセスできるメモリを使用すれば、メモリアクセスに要する時間を外見上短縮することができる。
【０００４】
キャッシュメモリを備えた計算機システムでは、プログラム実行中にキャッシュミスが発生すると、プログラムの実行時間が長くなる。このため、命令コードを格納するキャッシュメモリの効果は、一連の命令コードをアドレス順に実行する場合や、キャッシュメモリに収まる範囲の命令コードを繰り返し実行する場合に大きくなる。しかし、現実のプログラムでは、処理性能、プログラムの開発効率、メモリサイズの制限、プログラムの可読性などの理由により、分岐、ループ、サブルーチンなどの構造が使用される。このため、現実のプログラムを実行したときに、キャッシュミスの発生を完全に抑えることはできない。
【０００５】
キャッシュミスに起因する性能の低下を抑制する方法の１つとして、近い将来実行される可能性が高いデータをキャッシュメモリにプリフェッチしておく方法が知られている。この方法では、プリフェッチの効果を高めるために、プログラムの実行に先だって、プログラム中の分岐やループの繰り返し回数などを解析し、キャッシュミスを予測する処理が行われることがある。しかしながら、分岐先やループの繰り返し回数などは、プログラム実行中に動的に決定されるので、多くの場合、プログラム実行前の静的な解析では正しく予測できない。このように、プログラムの静的な解析結果に基づきプリフェッチを行う方法には、キャッシュミスの予測がはずれやすいという問題がある。
【０００６】
また、キャッシュミスに起因する性能の低下をより効果的に抑制する方法として、コンパイラによる最適化を行うときに、プログラムの動的な解析結果（以下、プロファイル情報という）を用いる方法も提案されている。例えば、特許文献１には、プログラムの１次コンパイル結果を仮想的に実行してプロファイル情報を求め、求めたプロファイル情報に基づき２次コンパイルを行うことにより、好適な位置にプリフェッチ命令が挿入されたオブジェクトファイルを求める方法が開示されている。特許文献２には、プロファイル情報に基づき、条件付き分岐命令における分岐方向に偏りを持たせる方法が開示されている。
【特許文献１】特開平７−３０６７９０号公報（第一図）
【特許文献２】特開平１１−１４９３８１号公報（第一図）
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、上記特許文献に開示された方法では、プログラムの動的な解析結果であるプロファイル情報を求める必要がある。このため、これらの方法には、プロファイリングのアルゴリズムやコンパイラに特殊な方式が必要で、高度な技術や経験的に積み重ねられた分析技術が必要とされるという問題がある。
【０００８】
それ故に、本発明は、安価で容易にキャッシュミスに起因する性能の低下を抑制できる、コンパイラによる最適化方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明のコンパイラによる最適化方法は、高級言語プログラムを機械語プログラムに変換するコンパイラによって実行される最適化方法であって、高級言語プログラムに含まれる記述に基づき、機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを備える。
【００１０】
この場合、高級言語プログラムには、高優先度の分岐先処理を指定する記述が含まれており、範囲決定ステップは、機械語プログラムのうちで高優先度の分岐先処理を含む分岐ブロックに相当する部分を処理範囲として選択し、配置決定ステップは、処理範囲内にある命令コードの配置位置を分岐先処理ごとに決定してもよい。
【００１１】
より好ましくは、配置決定ステップは、高級言語プログラム内の分岐先処理の記述順序と、機械語プログラム内の相当する命令コードの配置順序とが異なるように、処理範囲内にある命令コードの配置位置を決定する場合があってもよい。
【００１２】
あるいは、配置決定ステップは、高優先度の分岐先処理に相当する命令コードの配置位置として、処理範囲内の先頭部分に配置される分岐命令の直後の位置を選択してもよい。
【００１３】
あるいは、配置決定ステップは、高優先度の分岐先処理に相当する命令コードの配置位置として、処理範囲内の次に配置される命令コードの直前の位置を選択してもよい。
【００１４】
あるいは、配置決定ステップは、高優先度の分岐先処理に相当する命令コードのサイズと、キャッシュメモリを備えたコンピュータが機械語プログラムを実行する際のキャッシュメモリの残りライン容量とに基づき、当該命令コードの配置位置として、処理範囲の先頭部分に配置される分岐命令の直後の位置、および、処理範囲の次に配置される命令コードの直前の位置のいずれかを選択してもよい。特に、高級言語プログラムには、キャッシュメモリのラインサイズを指定する記述が含まれていてもよい。
【００１５】
また、高級言語プログラムには、下位処理を有する高優先度の処理を指定する記述が含まれており、範囲決定ステップは、機械語プログラムのうちで高優先度の処理および当該処理の下位処理に相当する部分を処理範囲として選択し、配置決定ステップは、キャッシュメモリを備えたコンピュータが機械語プログラムを実行する際に、処理範囲内にある命令コードのキャッシュメモリにおける格納位置が互いに重複しないように、処理範囲内にある命令コードの配置位置を下位処理ごとに決定してもよい。
【００１６】
あるいは、高級言語プログラムには、第１の範囲を指定する記述が含まれており、範囲決定ステップは、機械語プログラムのうちで第１の範囲に相当する部分を処理範囲として選択してもよい。特に、高級言語プログラムには、第１の範囲内にある第２の範囲を指定する記述がさらに含まれており、範囲決定ステップは、機械語プログラムのうちで第１の範囲から第２の範囲を除いた部分に相当する部分を処理範囲として選択してもよい。
【００１７】
あるいは、高級言語プログラムには、第１の範囲を指定する記述が含まれており、範囲決定ステップは、機械語プログラムのうちで第１の範囲の外に相当する部分を処理範囲として選択してもよい。特に、高級言語プログラムには、第１の範囲内にある第２の範囲を指定する記述がさらに含まれており、範囲決定ステップは、機械語プログラムのうちで第１の範囲から第２の範囲を除いた部分の外に相当する部分を処理範囲として選択してもよい。
【００１８】
また、上記最適化方法をコンピュータに実行させるためのコンパイラ、および、これを記録したコンピュータ読み取り可能な記録媒体も、本発明の範囲に含まれる。
【発明の効果】
【００１９】
本発明によれば、プログラム開発者は高級言語プログラムを作成するときに高優先度の処理を指定し、コンパイラは高優先度の処理に相当する命令コードを好適な位置に配置する。これにより、安価で容易にキャッシュミスの発生を防止し、キャッシュミスに起因する性能の低下を防止することができる。
【発明を実施するための最良の形態】
【００２０】
以下では、ある高級言語で記述されたプログラム（以下、高級言語プログラムという）をある機械語で記述されたプログラム（以下、機械語プログラムという）に変換するコンパイラ、および、このコンパイラによって実行される最適化処理について説明する。
【００２１】
機械語プログラムは、キャッシュメモリを備えたコンピュータによって実行される。機械語プログラムが、分岐やサブルーチン呼び出しなどを含まず、アドレス空間内の１つの領域に連続して配置されていれば、キャッシュミスの発生は少なく、キャッシュミスに起因する性能の低下も大きな問題にはならない。しかしながら、現実の機械語プログラムは、分岐やサブルーチン呼び出しなどを含み、アドレス空間内の複数の領域に分割して配置される。このため、現実の機械語プログラムを実行する際には、キャッシュミスに起因する性能の低下が問題となる。
【００２２】
以下に示す各実施形態では、分岐やサブルーチン呼び出しを含む高級言語プログラムを機械語プログラムに変換するとともに、機械語プログラムに含まれる命令コードの配置位置を決定する最適化処理を行うコンパイラについて説明する。第１および第２の実施形態では、分岐を含む高級言語プログラムに対する最適化処理について説明し、第３の実施形態では、サブルーチン呼び出しを含む高級言語プログラムに対する最適化処理について説明する。なお、以下の説明では、高級言語の例としてＣ言語が使用されているが、高級言語および機械語の種類は任意でよい。
【００２３】
（第１の実施形態）
図１〜図３を参照して、本発明の第１の実施形態に係るコンパイラによる最適化処理の実行例を説明する。図１は、機械語プログラムに含まれる命令コードをキャッシュメモリのライン上に配置した様子を示す図である。図１に示す命令コードは、図２に示すＰＡＤ図で表された処理に相当する。図２に示す処理では、まず条件判定処理が行われ、次に判定結果に従い分岐先処理１〜４のいずれかが行われ、その後に後続処理が行われる。この処理に相当する命令コードは、図１に示すように、条件判定処理に相当する命令コード（以下、分岐命令という）、分岐先処理１〜４に相当する命令コード（以下、分岐先命令１〜４という）、および、後続処理に相当する命令コード（以下、後続命令という）を含んでいる。
【００２４】
図１には、命令コードをキャッシュメモリの３つのライン上に配置した様子が、２とおり記載されている。図１（ａ）では、分岐命令および分岐先命令１が１番目のラインに配置され、分岐先命令２および３が２番目のラインに配置され、分岐先命令４および後続命令が３番目のラインに配置されている。この配置（以下、第１の配置という）は、従来のコンパイラによって得られる。
【００２５】
これに対して、図１（ｂ）では、分岐命令および分岐先命令２が１番目のラインに配置され、分岐先命令１および３が２番目のラインに配置され、分岐先命令４および後続命令が３番目のラインに配置されている。この配置（以下、第２の配置という）は、本実施形態に係るコンパイラによって得られる。第２の配置では第１の配置と比べて、分岐先命令１と分岐先命令２とが、逆の位置に配置されている。
【００２６】
本実施形態では、コンピュータが機械語プログラムを実行するときには、ライン単位のプリフェッチが行われるとする。言い換えると、ある命令コードの読み出し時にキャッシュミスが発生した場合には、その命令コードを含む１ライン分の命令コードが、メインメモリからキャッシュメモリに転送されるとする。また、分岐先処理１〜４のうちで実行される確率が最も高い分岐先処理は、分岐先処理２であるとする。
【００２７】
上記の条件下で、分岐先処理２が実行されるときに発生するキャッシュミスについて説明する。第１の配置（図１（ａ））では、分岐命令が実行されるときには、キャッシュメモリには分岐命令および分岐先命令１がプリフェッチされている。分岐命令の次に分岐先命令２が実行されるときに、分岐先命令２はキャッシュメモリ内に格納されていないので、キャッシュミスが発生する。このキャッシュミスが発生したときに、分岐先命令２および３がメインメモリからキャッシュメモリに転送される。その後、分岐先命令２の次に後続命令が実行されるときに、後続命令はキャッシュメモリ内に格納されていないので、再びキャッシュミスが発生する。このキャッシュミスが発生したときに、分岐先命令４および後続命令がメインメモリからキャッシュメモリに転送される。このように第１の配置では、キャッシュミスは２回発生する。
【００２８】
一方、第２の配置（図１（ｂ））では、分岐命令が実行されるときには、キャッシュメモリには分岐命令および分岐先命令２がプリフェッチされている。分岐命令の次に分岐先命令２が実行されるときに、分岐先命令２はキャッシュメモリ内に格納されているので、キャッシュミスは発生しない。その後、分岐先命令２の次に後続命令が実行されるときに、後続命令はキャッシュメモリ内に格納されていないので、キャッシュミスが発生する。このキャッシュミスが発生したときに、分岐先命令４および後続命令がメインメモリからキャッシュメモリに転送される。このように第２の配置では、キャッシュミスは１回しか発生しない。したがって、第２の配置によれば、第１の配置よりもキャッシュミスの発生を抑制することができる。
【００２９】
プログラム開発者が図２に示すＰＡＤ図に基づき従来どおりのプログラミングを行うと、図３（ａ）に示す高級言語プログラムが得られる。この高級言語プログラムを従来のコンパイラで処理すると、図３（ｂ）に示す機械語プログラムが得られる。この機械語プログラムでは、分岐先命令１〜４は、高級言語プログラム内の分岐先処理１〜４の記述順序と同じ順序で配置されている。このように高級言語プログラム内の分岐先処理の記載順序と、機械語プログラム内の相当する命令コードの配置順序とが同じであると、分岐命令と、高級言語プログラム内で後方に記載された分岐先処理に相当する命令コードとが、キャッシュメモリ内の同じライン上に格納される可能性が低くなる。このため、高級言語プログラム内で後方に記載された分岐処理の発生確率が高い場合には、キャッシュミスが発生しやすくなる。
【００３０】
そこで、本実施形態では、プログラム開発者は、分岐を含む高級言語プログラムを作成するときに、実行される確率が高い分岐先処理を高優先度の分岐先処理として指定する。より詳細には、プログラム開発者は、図３（ｃ）に示すように、実行される確率が高い分岐先処理を＃ｐｒａｇｍａ プリプロセッサディレクティブを用いて指定する。この＃ｐｒａｇｍａ プリプロセッサディレクティブは、＃ｐｒａｇｍａ プリプロセッサを呼び出す機能を有する。パラメータが＿Ｌｉｎｅ＿Ｐｒｉｏｒｉｔｙ＿ＯＮ （ライン優先度オン）である＃ｐｒａｇｍａ プリプロセッサディレクティブと、パラメータが＿Ｌｉｎｅ＿Ｐｒｉｏｒｉｔｙ＿ＯＦＦ（ライン優先度オフ）である＃ｐｒａｇｍａ プリプロセッサディレクティブとに挟まれた分岐先処理が、高優先度の分岐先処理となる。
【００３１】
図３（ｃ）に示す高級言語プログラムを本実施形態に係るコンパイラで処理すると、図３（ｄ）に示す機械語プログラムが得られる。この機械語プログラムでは、高優先度の分岐先処理に対応した命令コード（ここでは、分岐先命令２）は、分岐命令の直後に配置されている。この結果、分岐先命令１〜４は、高級言語プログラム内の分岐先処理１〜４の記述順序と異なる順序に配置される。このように高優先度の分岐先処理に相当する命令コードを分岐命令の直後に配置すると、分岐命令と、高優先度の分岐先処理に相当する命令コードとは、キャッシュメモリ内の同じライン上に格納される。したがって、高級言語プログラム内で後方に記載された分岐処理の発生確率が高い場合でも、キャッシュミスの発生を抑制することができる。
【００３２】
以下、図４および図５を参照して、本実施形態に係るコンパイラの構成を説明する。図４は、本実施形態に係るコンパイラの全体構成を示す図である。図４に示すように、本実施形態に係るコンパイラは、翻訳部１０および連結部２０を備えている。翻訳部１０は、入力されたソースファイルに基づき、オブジェクトファイルを生成する。連結部２０は、生成されたオブジェクトファイルに基づき、実行形式ファイルを生成する。ソースファイルには高級言語プログラムが記録され、オブジェクトファイルおよび実行形式ファイルには機械語プログラムが記録される。
【００３３】
翻訳部１０は、プリプロセッサディレクティブ解析ステップＳ１１、分岐構造処理ステップＳ１２、および、命令コード生成ステップＳ１３を実行する。プリプロセッサディレクティブ解析ステップＳ１１では、ソースファイルに記録された高級言語プログラムから、高優先度の分岐先処理を指定する＃ｐｒａｇｍａ プリプロセッサディレクティブが抽出される。
【００３４】
図５は、分岐構造処理ステップＳ１２の詳細を示す図である。図５に示すように、分岐構造処理ステップＳ１２（図５ではステップＳ１２ａと記載）では、範囲決定ステップＳ３１、分岐命令生成ステップＳ３２、および、配置決定ステップＳ３３が実行される。
【００３５】
範囲決定ステップＳ３１では、抽出された＃ｐｒａｇｍａ プリプロセッサディレクティブに基づき、分岐命令生成ステップＳ３２および配置決定ステップＳ３３の処理範囲が決定される。より詳細には、＃ｐｒａｇｍａ プリプロセッサディレクティブがある分岐先処理を指定する場合、範囲決定ステップＳ３１では、機械語プログラムのうちで当該分岐先処理を含む分岐ブロックに相当する部分が処理範囲として選択される。
【００３６】
分岐命令生成ステップＳ３２では、範囲決定ステップＳ３１で決定された処理範囲の先頭部分に配置される分岐命令が生成される。より詳細には、分岐命令生成ステップＳ３２では、途中で分岐しなければ、高優先度の分岐先処理に到達する１以上の分岐命令が生成される。例えば、図３（ｃ）に示す高級言語プログラムでは、分岐先処理２が高優先度の分岐先処理として指定されている。したがって、分岐命令生成ステップＳ３２では、図３（ｄ）に示すように、分岐命令として４つの命令「ＣＭＰ  ｒ０，ｒ１」、「ＢＥＱ  ＬＡＢＥＬ＿１］、「ＣＭＰ  ｒ０，ｒ２」および「ＢＮＥ  ＬＡＢＥＬ＿３」が生成される。
【００３７】
配置決定ステップＳ３３では、範囲決定ステップＳ３１で決定された処理範囲内にある命令コードの配置位置が分岐先処理ごとに決定される。例えば図３（ｄ）に示す機械語プログラムでは、分岐先命令２の配置位置は、命令「ＢＮＥ  ＬＡＢＥＬ＿３」の直後の位置に決定される。また、分岐先命令１、３および４の配置位置は、それぞれ、ラベルＬＡＢＥＬ＿１、ＬＡＢＥＬ＿３およびＬＡＢＥＬ＿４の位置に決定される。このようにして分岐構造処理ステップＳ１２では、高優先度の分岐先処理を含む分岐ブロックに相当する命令コードの配置位置が、分岐先処理ごとに決定される。
【００３８】
命令コード生成ステップＳ１３では、分岐命令生成ステップＳ３２で生成された分岐命令以外の命令コードが生成される。生成された命令コードは、リンク前の機械語プログラムとしてオブジェクトファイルに記録される。
【００３９】
連結部２０は、結合ステップＳ２１を実行する。結合ステップＳ２１では、オブジェクトファイルに記録されたリンク前の機械語プログラムに対してリンク処理が実行される。リンク後の機械語プログラムは、実行形式ファイルに記録される。
【００４０】
以上に示すように、本実施形態に係るコンパイラは、入力された高級言語プログラムに高優先度の分岐先処理を指定する記述が含まれている場合には、高優先度の分岐先処理に相当する命令コードを分岐命令の直後に配置する。プログラム開発者は、高級言語プログラムを作成するときに、実行される確率が高い分岐先処理を高優先度の分岐先処理として指定する。プログラム開発者は、高級言語プログラムの動作を理解し、いずれの分岐処理が高い確率で実行されるかを知っているので、多くの場合、高優先度の分岐先処理を正しく指定することができる。例えば、分岐先処理に正常時処理と異常時処理とが含まれている場合には、プログラム開発者は、正常時処理を高優先度の分岐先処理として指定すればよい。
【００４１】
したがって、本実施形態に係るコンパイラによれば、実行される確率が高い分岐先処理に相当する命令コードを分岐命令の直後に配置することにより、分岐ブロックが実行されるときのキャッシュミスの発生を抑制し、キャッシュミスに起因する性能の低下を抑制することができる。
【００４２】
なお、以上の説明では、高優先度の分岐先処理に相当する命令コードを分岐命令の直後に配置することとしたが、当該命令コードを分岐ブロックに相当する命令コードの最後（すなわち、分岐ブロックに相当する命令コードの次に配置される命令コードの直前）に配置しても同じ効果が得られる。
【００４３】
（第２の実施形態）
第１の実施形態に係るコンパイラは、入力された高級言語プログラムに高優先度の分岐先処理を指定する記述が含まれている場合には、高優先度の分岐先処理に相当する命令コードを分岐命令の直後に配置する。この方法では、高優先度の分岐先処理に相当する命令コードのサイズや、分岐命令および後続命令の配置位置によっては、キャッシュミスの発生を十分に抑制できない場合がある。
【００４４】
図６は、図１と同様に、機械語プログラムに含まれる命令コードをキャッシュメモリのライン上に配置した様子を示す図である。まず、図６（ａ）に示す場合（すなわち、分岐先命令２が２つのライン上に跨がって配置され、後続命令が分岐先命令２と異なるライン上に配置される場合）を考える。この場合、分岐命令の次に分岐先命令２が実行されるときには、キャッシュミスは発生しない。しかし、読み出し対象のラインが分岐先命令２の実行中に変化するとき、および、分岐先命令２の次に後続命令が実行されるときに、合わせて２回のキャッシュミスが発生する。
【００４５】
次に、図６（ｂ）に示す場合（すなわち、分岐命令がラインの終端付近に配置される場合）を考える。この場合、分岐命令と分岐先命令２とは連続的に配置されているにも関わらず、分岐命令の次に分岐先命令２が実行されるとき、および、分岐先命令２の次に後続命令が実行されるときに、合わせて２回のキャッシュミスが発生する。
【００４６】
このような場合に対応するために、本発明の第２の実施形態に係るコンパイラは、高優先度の分岐先処理に相当する命令コードのサイズと、機械語プログラムが実行される際のキャッシュメモリの残りライン容量とに基づき、高優先度の分岐先処理に相当する命令コードの配置位置を複数の候補の中から選択する。より詳細には、本実施形態に係るコンパイラは、分岐命令の直後の位置および後続命令の直前の位置のうちでキャッシュミスが発生しにくいほうを、高優先度の分岐先処理に相当する命令コードの配置位置として選択する。
【００４７】
図７は、図１と同様に、機械語プログラムに含まれる命令コードをキャッシュメモリのライン上に配置した様子を示す図である。従来のコンパイラによれば、命令コードは、図７（ａ）に示すように配置される。この配置では、分岐命令の次に分岐先命令２が実行されるとき、および、分岐先命令２の次に後続命令が実行されるときに、合わせて２回のキャッシュミスが発生する。
【００４８】
これに対して、本実施形態に係るコンパイラによれば、高優先度の分岐先処理に相当する命令コードのサイズと、機械語プログラムが実行される際のキャッシュメモリの残りライン容量とに基づき、命令コードは図７（ｂ）や（ｃ）に示すように配置される。図７（ｂ）に示す配置では、高優先度の分岐先処理（分岐先処理２）に相当する命令コード（分岐先命令２）は、分岐命令の直後に配置される。この結果、分岐先命令２は、分岐命令と同じライン上に配置される。この配置では、分岐先命令２の次に後続命令が実行されるときに、キャッシュミスは１回だけ発生する。また、図７（ｃ）に示す配置では、分岐先命令２は、後続命令の直前に配置される。この結果、分岐先命令２は、後続命令と同じライン上に配置される。この配置では、分岐命令の次に分岐先命令２が実行されるときに、キャッシュミスは１回だけ発生する。
【００４９】
以下、図８〜図１０を参照して、本実施形態に係るコンパイラの構成を説明する。本実施形態に係るコンパイラの全体構成は、第１の実施形態に係るコンパイラと同じである（図４を参照）。ただし、本実施形態に係るコンパイラの翻訳部１０は、分岐構造処理ステップＳ１２として、図８に示すステップＳ１２ｂを実行する。図８に示すステップＳ１２ｂは、図５に示すステップＳ１２ａに配置選択ステップＳ４０を追加したものである。
【００５０】
図９は、配置選択ステップＳ４０の詳細を示す図である。配置選択ステップＳ４０では、高優先度の分岐先処理に相当する命令コードのサイズＳＺ０が算出され（ステップＳ４１）、キャッシュメモリにおける分岐命令の後の残りライン容量ＳＺ１が算出され（ステップＳ４２）、キャッシュメモリにおける後続命令の前の残りライン容量ＳＺ２が算出される（ステップＳ４３）。
【００５１】
ステップＳ４１〜Ｓ４３では、次式を用いて、命令コードのサイズＳＺ０、分岐命令後の残りライン容量ＳＺ１、および、後続命令前の残りライン容量ＳＺ２が算出される（図１０を参照）。
ＳＺ０＝  （高優先度の分岐先処理に相当する命令コードの終端アドレス）
−（高優先度の分岐先処理に相当する命令コードの先頭アドレス）
ＳＺ１＝（分岐命令を含むラインの終端アドレス）−（分岐命令の終端アドレス）
ＳＺ２＝（後続命令の先頭アドレス）−（後続命令を含むラインの先頭アドレス）
【００５２】
ステップＳ４４およびＳ４５では、ステップＳ４１〜Ｓ４３で算出された値ＳＺ０〜ＳＺ２に従い、３とおりの場合分けが行われる。ステップＳ４６〜Ｓ４８では、３とおりの場合分けに従い、高優先度の分岐先処理に相当する命令コードの配置位置が決定される。より詳細には、ＳＺ１≧ＳＺ０が成立する第１の場合（ステップＳ４４でＹＥＳ）には、高優先度の分岐先処理に相当する命令コードの配置位置として、分岐命令の直後の位置が選択される（ステップＳ４６）。ＳＺ１＜ＳＺ０かつＳＺ２≧ＳＺ０が成立する第２の場合（ステップＳ４４でＮＯかつステップＳ４５でＹＥＳ）には、高優先度の分岐先処理に相当する命令コードの配置位置として、後続命令の直前の位置が選択される（ステップＳ４７）。ＳＺ１＜ＳＺ０かつＳＺ２＜ＳＺ０が成立する第３の場合（ステップＳ４４でＮＯかつステップＳ４５でＮＯ）には、高優先度の分岐先処理に相当する命令コードの配置位置として、分岐命令の直後の位置が選択される（ステップＳ４８）。
【００５３】
上記第３の場合には、キャッシュミスの発生を抑制できない可能性があるが、上記第１および第２の場合には、例えば図７（ｂ）および（ｃ）に示すように、高優先度の分岐先処理に相当する命令コードを配置することができる。したがって、上記第１および第２の場合には、キャッシュミスの発生を１回に減らすことができる。
【００５４】
なお、以上の説明では、配置選択ステップＳ４０において、高優先度の分岐先処理に相当する命令コードのサイズＳＺ０を算出することとしたが、プログラムの開発状況によっては、プログラム開発者はサイズＳＺ０の値を知っている場合がある。この場合、プログラム開発者は、＃ｐｒａｇｍａ プリプロセッサディレクティブを用いて、高級言語プログラム内でサイズＳＺ０を指定してもよい。これにより、サイズＳＺ０を算出する処理を行う必要がなくなるので、コンパイル時間を短縮することができる。この方法は、プログラムの再利用が行われている場合や、高優先度の分岐先処理のプログラミングは完成しているが、それ以外の処理のプログラムが未完成である場合などに効果的である。
【００５５】
また、プログラム開発者は、＃ｐｒａｇｍａ プリプロセッサディレクティブを用いて、高級言語プログラム内でキャッシュメモリのラインサイズを指定してもよい。一般にコンパイラは、コンピュータのアーキテクチャを考慮して作成されるが、この方法を用いれば、キャッシュメモリの構成変更に対応できるコンパイラを得ることができる。
【００５６】
（第３の実施形態）
図１１は、プログラム実行中にサブルーチンが階層的に呼び出される様子を示す図である。図１１では、処理Ａから処理Ｂが呼び出され、処理Ｂから処理Ｃが呼び出され、処理Ｃから処理Ｄが呼び出され、処理Ｄから処理Ｅが呼び出されている。以下、処理Ａ〜Ｅに相当する命令コードを、それぞれ、処理コードＡ〜Ｅという。
【００５７】
図１１に示すサブルーチン呼び出しが行われるときに発生するキャッシュミスについて説明する。このサブルーチン呼び出しを行うコンピュータは、２ウェイ・セット・アソシエイティブ方式で、ラインサイズが３２バイト、総容量が８Ｋバイトのキャッシュメモリを備えているとする。また、メインメモリ内において、処理コードＡおよびＢはアドレスの最上位ビットが０である領域（00000000〜01111111）に配置され、処理コードＣ〜Ｅはアドレスの最上位ビット１である領域（10000000〜11111111）に配置されているとする。さらに、キャッシュメモリの２つのウェイは、アドレスの最上位ビットが０か１かによって区別されるとする。
【００５８】
図１２は、処理Ｄが実行されているときのキャッシュメモリの内容を示す図である。図１２では、処理コードＡ〜Ｄは、キャッシュメモリ内に互いに重複しない位置に格納されている。一方、処理コードＥのキャッシュメモリ内の格納位置は、処理コードＣのキャッシュメモリ内の格納位置と重複するとする。この場合、処理Ｄから処理Ｅが呼び出されたときに、キャッシュメモリ内に格納された処理コードＣは、処理コードＥによって上書きされる。したがって、その後に処理コードＣが実行されるときに、キャッシュミスが発生する。例えば、処理Ａがループ内で実行される場合には、ループ処理が１回実行されるたびに、処理コードＣは処理コードＥによって上書きされ、キャッシュミスが発生する。
【００５９】
そこで、本実施形態では、プログラム開発者は、下位処理を有する処理を含む高級言語プログラムを作成するときに、最適化の対象とする処理を高優先度の処理として指定する。より詳細には、プログラム開発者は、図１３に示すように、最適化の対象とする処理を＃ｐｒａｇｍａ プリプロセッサディレクティブを用いて指定する。この＃ｐｒａｇｍａ プリプロセッサディレクティブは、＃ｐｒａｇｍａ プリプロセッサを呼び出す機能を有する。パラメータが＿Ｐａｇｅ＿Ｐｒｉｏｒｉｔｙ＿ＯＮ （ページ優先度オン）である＃ｐｒａｇｍａ プリプロセッサディレクティブと、パラメータが＿Ｐａｇｅ＿Ｐｒｉｏｒｉｔｙ＿ＯＦＦ（ページ優先度オフ）である＃ｐｒａｇｍａ プリプロセッサディレクティブとに挟まれた処理が、下位処理を有する高優先度の処理となる。
【００６０】
処理Ａが高優先度の処理として指定された高級言語プログラムを本実施形態に係るコンパイラで処理すると、処理コードＥはキャッシュメモリ内で処理コードＡ〜Ｄと重複しない位置に配置される（図１４を参照）。これにより、処理コードＣが処理コードＥによって上書きされることを防止し、処理コードＣが実行されるときに発生するキャッシュミスを防止することができる。
【００６１】
このような命令コードの配置位置を求めるために、本実施形態に係るコンパイラは、高級言語プログラムに含まれる記述に基づき、機械語プログラムの一部を処理範囲として決定する処理と、処理範囲内にある命令コードの配置位置を決定する処理と行う。図１３に示す例では、高優先度の処理として指定された処理Ａは、下位処理として処理Ｂ〜Ｅを有している。処理範囲を決定する処理では、サブルーチンの呼び出し関係が解析され、これにより、処理Ａとその下位処理である処理Ｂ〜Ｅとが処理範囲として選択される。次に、命令コードの配置位置を決定する処理では、処理コードＥのキャッシュメモリ内の格納位置が処理コードＣのキャッシュメモリ内の格納位置と重複することが検出され、処理コードＥの配置位置として、キャッシュメモリ内で処理コードＡ〜Ｄと重複しない位置が探索される。これにより、下位処理として処理Ｂ〜Ｅを有する処理Ａがループ内で実行される場合など、プログラムの時間的局所性が高い場合に、キャッシュミスを大幅に削減し、キャッシュミスに起因する性能の低下を防止することができる。
【００６２】
以下、図１５を参照して、本実施形態に係るコンパイラの構成を説明する。本実施形態に係るコンパイラの全体構成は、第１の実施形態に係るコンパイラと同じである（図４を参照）。ただし、本実施形態に係るコンパイラは、図１に示す連結部２０に代えて、図１５に示す連結部５０を備えている。連結部５０は、１次結合ステップＳ５１、範囲決定ステップＳ５２、アドレス重複検出ステップＳ５３、配置決定ステップＳ５４、および、配置ステップＳ５５を実行する。また、連結部５０は、１次結合ステップＳ５１の出力データを記録する１次実行形式ファイルおよびアドレスマッピング情報ファイルを含む。
【００６３】
１次結合ステップＳ５１では、オブジェクトファイルに記録された機械語プログラムに対してリンク処理が行われる。これにより、実行可能な機械語プログラム（リンク後の機械語プログラム）と、サブルーチンやラベルのアドレス情報とが生成される。実行可能な機械語プログラムは１次実行形式ファイルに記録され、アドレス情報はアドレスマッピング情報ファイルに記録される。１次実行形式ファイルには、高級言語プログラムにおいて高優先度の処理として指定された処理を特定する情報も記録される。
【００６４】
範囲決定ステップＳ５２では、１次実行形式ファイルに記録された内容に基づき、サブルーチンの階層構造が解析される。その結果、高優先度の処理およびその下位処理に相当する命令コードが、処理対象として選択される。
【００６５】
アドレス重複検出ステップＳ５３では、アドレスマッピング情報ファイルに記録された内容に基づき、高優先度の処理およびその下位処理に相当する命令コードのメインメモリ上のアドレスが求められる。また、求めたアドレスと、キャッシュメモリの構成に関する情報とに基づき、高優先度の処理およびその下位処理に相当する命令コードのキャッシュメモリ内の格納位置のうちで、互いに重複しているものが検出される。
【００６６】
キャッシュメモリ内の格納位置が重複している命令コードが存在する場合、配置決定ステップＳ５４では、命令コードの重複配置が解消されるように、命令コードの配置位置が下位処理ごとに決定される。配置ステップＳ５５では、高優先度の処理およびその下位処理に相当する命令コードが、配置決定ステップＳ５４で決定された位置に配置される。
【００６７】
図１６および図１７を参照して、アドレス重複検出ステップＳ５３で使用される、メインメモリのアドレスとキャッシュメモリのアドレスとの対応づけについて説明する。ここでは、例として、２ウェイ・セット・アソシエイティブ方式で、ラインサイズが３２バイト、総容量が８Ｋバイトのキャッシュメモリ（図１６を参照）について説明する。
【００６８】
メインメモリのアドレス幅が３２ビットであるとすると、このうち下位１３ビットがキャッシュメモリのアドレスに対応づけられる（図１７を参照）。キャッシュメモリのアドレスは、タグアドレスの最下位ビット（１ビット）、インデックス（７ビット）、および、オフセット（５ビット）に分けられる。タグアドレスの最下位ビットは、２ウェイのいずれかを指定し、インデックスはラインを指定し、オフセットはライン上のバイトを指定する。
【００６９】
２つの処理に相当する命令コードのメインメモリのアドレスのうち、タグアドレスの最下位ビットとインデックスとを合わせた８ビットが一致する場合には、これら２つの命令コードは、キャッシュメモリ内に重複して配置される。このようにアドレス重複検出ステップＳ５３では、メインメモリのアドレスの一部が一致しているか否かにより、命令コードのキャッシュメモリ内の格納位置が重複しているか否かを判断することができる。
【００７０】
図１８を参照して、配置決定ステップＳ５４について説明する。アドレス重複検出ステップＳ５３において、ある処理の命令コード（以下、上位命令コードという。図１８では処理コードＣ）と当該処理の下位処理に相当する命令コード（以下、下位命令コードという。図１８では処理コードＥ）とが、重複した位置に配置されていることが検出されたとする。この場合、下位命令コードのサイズＳｃｈｉｌｄと、上位命令コードの後方に存在するキャッシュメモリ内の空き領域のサイズＳｆｒｅｅとが算出される。Ｓｆｒｅｅ＞Ｓｃｈｉｌｄが成立する場合には、次式により、下位命令コードの移動量Ｓｎｏｐが算出される。
Ｓｎｏｐ＝  （上位命令コードの終端アドレス）
−（下位命令コードの先頭アドレス）
【００７１】
下位命令コードの前には、求めた移動量Ｓｎｏｐ分のＮＯＰ命令が配置される。このようにして上位命令コードと重複しない位置に下位命令コードを移動させることにより、上位命令コードと下位命令コードのキャッシュメモリ内の配置位置が重複することを防止することができる。なお、下位命令コードの前にＮＯＰ命令を配置することに代えて、ｏｒｇ命令を用いて下位命令コードの配置位置を制御してもよい。具体的には、「ｏｒｇ  上位命令コードの終端アドレス＋１」の後に下位命令コードを記載すればよい。
【００７２】
なお、本発明の第１〜第３の実施形態では、高級言語プログラム内でパラメータがオンである＃ｐｒａｇｍａ プリプロセッサディレクティブとパラメータがオフである＃ｐｒａｇｍａ プリプロセッサディレクティブとに挟まれた部分が、高優先度の処理として指定されることとしたが、高優先度の処理の指定方法として、これ以外の方法を用いてもよい。例えば、高級言語プログラム内には、高優先度の処理として指定された範囲内にある高優先度の処理でない部分を指定する＃ｐｒａｇｍａ プリプロセッサディレクティブがさらに含まれていてもよい。あるいは、高級言語プログラム内には、高優先度の処理でない範囲を指定する＃ｐｒａｇｍａ プリプロセッサディレクティブや、その範囲内にある高優先度の処理である部分を指定する＃ｐｒａｇｍａ プリプロセッサディレクティブが含まれていてもよい。
【００７３】
一般に、プログラム実行時に異常時処理が実行されるように動作条件を設定することは困難である。そこで、最適化処理の一部を無効する＃ｐｒａｇｍａ プリプロセッサディレクティブを好適に組み合わせて利用することにより、キャッシュミスが発生しやすい機械語プログラムを得ることができる。これにより、本発明の最適化処理を施した場合の最悪の性能を容易に見積ることができる。
【００７４】
さらに、本発明の最適化処理を施した場合と施さない場合とでプログラムの実行速度を比較し、最適化処理を施してもプログラムの実行速度が改善されない場合には、最適化処理の一部を無効化することができる。これにより、最適化処理に伴い挿入されるＮＯＰ命令の量を削減してＲＯＭサイズを減らし、システムのコストを削減することができる。
【産業上の利用可能性】
【００７５】
本発明のコンパイラによる最適化方法は、安価で容易にキャッシュミスに起因する性能の低下を抑制できるので、高級言語プログラムを機械語プログラムに変換する各種のコンパイラに利用することができる。
【図面の簡単な説明】
【００７６】
【図１】命令コードをキャッシュメモリのライン上に配置した様子を示す図
【図２】最適化処理の対象となる処理を表すＰＡＤ図
【図３】本発明の第１の実施形態に係るコンパイラによる最適化処理の実行例を示す図
【図４】本発明の第１の実施形態に係るコンパイラの全体構成を示す図
【図５】本発明の第１の実施形態に係るコンパイラの分岐構造処理ステップを示す図
【図６】図５に示す分岐構造処理ステップの詳細を示す図
【図７】命令コードをキャッシュメモリのライン上に配置した様子を示す図
【図８】本発明の第２の実施形態に係るコンパイラの分岐構造処理ステップを示す図
【図９】図８に示す配置選択ステップの詳細を示す図
【図１０】図８に示す配置選択ステップで算出される値を示す図
【図１１】プログラム実行中にサブルーチンが階層的に呼び出される様子を示す図
【図１２】ある時点でのキャッシュメモリの内容を示す図
【図１３】本発明の第３の実施形態において、高優先度の処理が指定される様子を示す図
【図１４】本発明の第３の実施形態において、ある時点でのキャッシュメモリの内容を示す図
【図１５】本発明の第３の実施形態に係るコンパイラの連結部の詳細を示す図
【図１６】キャッシュメモリの例を示す図
【図１７】メインメモリのアドレスとキャッシュメモリのアドレスの対応づけを示す図
【図１８】本発明の第３の実施形態に係るコンパイラの配置決定ステップを説明するための図
【符号の説明】
【００７７】
１０…翻訳部
２０、５０…連結部
Ｓ１１…プリプロセッサディレクティブ解析ステップ
Ｓ１２…分岐構造処理ステップ
Ｓ１３…命令コード生成ステップ
Ｓ２１…結合ステップ
Ｓ３１、Ｓ５２…範囲決定ステップ
Ｓ３２…分岐命令生成ステップ
Ｓ３３、Ｓ５４…配置決定ステップ
Ｓ４０…配置選択ステップ
Ｓ５１…１次結合ステップ
Ｓ５３…アドレス重複解析ステップ
Ｓ５５…配置ステップ
【図１】
2006309430.tif 000003
【図２】
2006309430.tif 000004
【図３】
2006309430.tif 000005
【図４】
2006309430.tif 000006
【図５】
2006309430.tif 000007
【図６】
2006309430.tif 000008
【図７】
2006309430.tif 000009
【図８】
2006309430.tif 000010
【図９】
2006309430.tif 000011
【図１０】
2006309430.tif 000012
【図１１】
2006309430.tif 000013
【図１２】
2006309430.tif 000014
【図１３】
2006309430.tif 000015
【図１４】
2006309430.tif 000016
【図１５】
2006309430.tif 000017
【図１６】
2006309430.tif 000018
【図１７】
2006309430.tif 000019
【図１８】
2006309430.tif 000020