(57)【要約】【課題】安価で容易にキャッシュミスに起因する性能の低下を抑制できる、コンパイラによる最適化方法を提供する。【解決手段】コンパイラは、入力された高級言語プログラムに、相関関係にない（輻輳動作関係にない）処理を指定する記述が含まれている場合には、指定された処理に相当する命令コードを分岐命令の直後または近傍に配置しない。また、コンパイラは、入力された高級言語プログラムに、相関関係にない（輻輳動作関係にない）処理を指定する記述が含まれている場合には、キャッシュメモリ内の格納位置が重複するように、当該処理に相当する命令コードを配置する。【選択図】図４
2010026851.tif 000002
【特許請求の範囲】
【請求項１】
高級言語プログラムを機械語プログラムに変換するコンパイラによって実行される最適化方法であって、
前記高級言語プログラムに含まれる記述に基づき、前記機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、
前記処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを備えた、コンパイラによる最適化方法であって、
前記高級言語プログラムには、処理ブロックの相関関係（輻輳関係）を指定する記述が含まれており、
前記範囲決定ステップは、前記機械語プログラムのうちで相関関係を指定した処理ブロックに相当する部分を前記処理範囲として選択し、
前記配置決定ステップは、前記処理範囲内にある命令コードの配置位置を処理ブロックごとに決定することを特徴とする、コンパイラによる最適化方法。
【請求項２】
前記配置決定ステップは、前記高級言語プログラム内の相関関係を指定した処理の記述順序と、前記機械語プログラム内の相当する命令コードの配置順序とが異なるように、前記処理範囲内にある命令コードの配置位置を決定する場合があることを特徴とする、請求項１に記載のコンパイラによる最適化方法。
【請求項３】
前記高級言語プログラムには、第１の範囲を指定する記述が含まれており、
前記範囲決定ステップは、前記機械語プログラムのうちで前記第１の範囲に相当する部分を前記処理範囲として選択することを特徴とする、請求項１に記載のコンパイラによる最適化方法。
【請求項４】
前記高級言語プログラムには、前記第１の範囲内にある第２の範囲を指定する記述がさらに含まれており、
前記範囲決定ステップは、前記機械語プログラムのうちで前記第１の範囲から前記第２の範囲を除いた部分に相当する部分を前記処理範囲として選択することを特徴とする、請求項３に記載のコンパイラによる最適化方法。
【請求項５】
前記高級言語プログラムには、第１の範囲を指定する記述が含まれており、
前記範囲決定ステップは、前記機械語プログラムのうちで前記第１の範囲の外に相当する部分を前記処理範囲として選択することを特徴とする、請求項１に記載のコンパイラによる最適化方法。
【請求項６】
前記高級言語プログラムには、前記第１の範囲内にある第２の範囲を指定する記述がさらに含まれており、
前記範囲決定ステップは、前記機械語プログラムのうちで前記第１の範囲から前記第２の範囲を除いた部分の外に相当する部分を前記処理範囲として選択することを特徴とする、請求項５に記載のコンパイラによる最適化方法。
【請求項７】
高級言語プログラムを機械語プログラムに変換する処理および最適化処理をコンピュータに実行させるためのコンパイラであって、前記最適化処理として、
前記高級言語プログラムに含まれる記述に基づき、前記機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、
前記処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを、コンピュータに実行させるためのコンパイラ。
【請求項８】
高級言語プログラムを機械語プログラムに変換する処理および最適化処理をコンピュータに実行させるためのコンパイラを記録したコンピュータ読み取り可能な記録媒体であって、前記最適化処理として、
前記高級言語プログラムに含まれる記述に基づき、前記機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、
前記処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを、コンピュータに実行させるためのコンパイラを記録したコンピュータ読み取り可能な記録媒体。
【請求項９】
高級言語プログラムを機械語プログラムに変換する処理および最適化処理をコンピュータに実行させるためのコンパイラを伝送する情報伝送媒体であって、前記最適化処理として、
前記高級言語プログラムに含まれる記述に基づき、前記機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、
前記処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを、コンピュータに実行させるためのコンパイラを伝送する情報伝送媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの実行時間を短縮するコンパイル方法に関し、より特定的には、キャッシュミスに起因する性能の低下を抑制するコンパイラによる最適化方法に関する。
【背景技術】
【０００２】
近年では、ＣＰＵの処理能力が向上したために、プログラムの実行時間を短縮するためには、メモリアクセスに要する時間を短縮することが重要な課題となっている。メモリアクセスに要する時間を短縮する方法の１つとして、キャッシュメモリを使用する方法が従来から広く知られている。
【０００３】
キャッシュメモリの使用によってメモリアクセスに要する時間を短縮できる理由は、プログラムが参照の局所性を有するからである。参照の局所性には、時間的局所性（同じデータに近い将来アクセスする可能性が高い）と、空間的局所性（近傍のデータに近い将来アクセスする可能性が高い）とが含まれる。プログラムがこのような参照の局所性を有するので、キャッシュメモリに格納されたデータは、近い将来アクセスされる可能性が高い。そこで、キャッシュメモリとしてメインメモリよりも高速にアクセスできるメモリを使用すれば、メモリアクセスに要する時間を外見上短縮することができる。
【０００４】
キャッシュメモリを備えた計算機システムでは、プログラム実行中にキャッシュミスが発生すると、プログラムの実行時間が長くなる。このため、命令コードを格納するキャッシュメモリの効果は、一連の命令コードをアドレス順に実行する場合や、キャッシュメモリに収まる範囲の命令コードを繰り返し実行する場合に大きくなる。しかし、現実のプログラムでは、処理性能、プログラムの開発効率、メモリサイズの制限、プログラムの可読性などの理由により、分岐、ループ、サブルーチンなどの構造が使用される。このため、現実のプログラムを実行したときに、キャッシュミスの発生を完全に抑えることはできない。
【０００５】
キャッシュミスに起因する性能の低下を抑制する方法の１つとして、近い将来実行される可能性が高いデータをキャッシュメモリにプリフェッチしておく方法が知られている。この方法では、プリフェッチの効果を高めるために、プログラムの実行に先だって、プログラム中の分岐やループの繰り返し回数などを解析し、キャッシュミスを予測する処理が行われることがある。しかしながら、分岐先やループの繰り返し回数などは、プログラム実行中に動的に決定されるので、多くの場合、プログラム実行前の静的な解析では正しく予測できない。このように、プログラムの静的な解析結果に基づきプリフェッチを行う方法には、キャッシュミスの予測がはずれやすいという問題がある。
【０００６】
また、キャッシュミスに起因する性能の低下をより効果的に抑制する方法として、コンパイラによる最適化を行うときに、プログラムの動的な解析結果（以下、プロファイル情報という）を用いる方法も提案されている。例えば、特許文献１には、プログラムの１次コンパイル結果を仮想的に実行してプロファイル情報を求め、求めたプロファイル情報に基づき２次コンパイルを行うことにより、好適な位置にプリフェッチ命令が挿入されたオブジェクトファイルを求める方法が開示されている。特許文献２には、プロファイル情報に基づき、条件付き分岐命令における分岐方向に偏りを持たせる方法が開示されている。
【０００７】
また、特許文献３には、空間的局所性を利用したキャッシュ効率をあげる方法が開示されている。
【特許文献１】特開平７−３０６７９０号公報（第一図）
【特許文献２】特開平１１−１４９３８１号公報（第一図）
【特許文献３】特開２００６−３０９４３０（第四図）
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、上記特許文献に開示された方法では、プログラムの動的な解析結果であるプロファイル情報を求める必要がある。このため、これらの方法には、プロファイリングのアルゴリズムやコンパイラに特殊な方式が必要で、高度な技術や経験的に積み重ねられた分析技術が必要とされるという問題がある。
【０００９】
また、空間的局所性を利用した方法では、システム動作上の動作モードや、複数タスクの動作であって、動作しない処理部分のソースコードがキャッシュメモリに配置されることによって、必要な処理がキャッシュに配置されることを阻害されるという問題がある。
【００１０】
それ故に、本発明は、安価で容易にキャッシュミスに起因する性能の低下を抑制できる、コンパイラによる最適化方法を提供することを目的とする。
【課題を解決するための手段】
【００１１】
本発明のコンパイラによる最適化方法は、高級言語プログラムを機械語プログラムに変換するコンパイラによって実行される最適化方法であって、高級言語プログラムに含まれる記述に基づき、機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、処理範囲内にある命令コードの配置位置を決定する配置決定ステップとを備える。
【００１２】
この場合、高級言語プログラムには、処理ブロックの相関関係（輻輳関係）を指定する記述が含まれており、範囲決定ステップは、機械語プログラムのうちで相関関係を指定した処理ブロックに相当する部分を処理範囲として選択し、配置決定ステップは、処理範囲内にある命令コードの配置位置を処理ブロックごとに決定してもよい。
【００１３】
より好ましくは、配置決定ステップは、高級言語プログラム内の相関関係を指定した処理の記述順序と、機械語プログラム内の相当する命令コードの配置順序とが異なるように、処理範囲内にある命令コードの配置位置を決定する場合があってもよい。
【００１４】
あるいは、高級言語プログラムには、第１の範囲を指定する記述が含まれており、範囲決定ステップは、機械語プログラムのうちで第１の範囲に相当する部分を処理範囲として選択してもよい。特に、高級言語プログラムには、第１の範囲内にある第２の範囲を指定する記述がさらに含まれており、範囲決定ステップは、機械語プログラムのうちで第１の範囲から第２の範囲を除いた部分に相当する部分を処理範囲として選択してもよい。
【００１５】
あるいは、高級言語プログラムには、第１の範囲を指定する記述が含まれており、範囲決定ステップは、機械語プログラムのうちで第１の範囲の外に相当する部分を処理範囲として選択してもよい。特に、高級言語プログラムには、第１の範囲内にある第２の範囲を指定する記述がさらに含まれており、範囲決定ステップは、機械語プログラムのうちで第１の範囲から第２の範囲を除いた部分の外に相当する部分を処理範囲として選択してもよい。
【００１６】
また、上記最適化方法をコンピュータに実行させるためのコンパイラ、および、これを記録したコンピュータ読み取り可能な記録媒体、ネットワークを介して伝送する情報伝送媒体も本発明の範囲に含まれる。
【発明の効果】
【００１７】
本発明によれば、プログラム開発者は高級言語プログラムを作成するときに処理ブロックの相関関係（輻輳関係）を指定し、コンパイラは相関関係を指定した処理ブロックに相当する命令コードを好適な位置に配置する。これにより、安価で容易にキャッシュミスの発生を防止し、キャッシュミスに起因する性能の低下を防止することができる。
【発明を実施するための最良の形態】
【００１８】
以下では、ある高級言語で記述されたプログラム（以下、高級言語プログラムという）をある機械語で記述されたプログラム（以下、機械語プログラムという）に変換するコンパイラ、および、このコンパイラによって実行される最適化処理について説明する。
【００１９】
機械語プログラムは、キャッシュメモリを備えたコンピュータによって実行される。機械語プログラムが、分岐やサブルーチン呼び出しなどを含まず、アドレス空間内の１つの領域に連続して配置されていれば、キャッシュミスの発生は少なく、キャッシュミスに起因する性能の低下も大きな問題にはならない。しかしながら、現実の機械語プログラムは、分岐やサブルーチン呼び出しなどを含み、アドレス空間内の複数の領域に分割して配置される。このため、現実の機械語プログラムを実行する際には、キャッシュミスに起因する性能の低下が問題となる。
【００２０】
以下に示す各実施形態では、複数の処理タスクや複数の動作モードを含む高級言語プログラムを機械語プログラムに変換するとともに、機械語プログラムに含まれる命令コードの配置位置を決定する最適化処理を行うコンパイラについて説明する。実施形態では、複数の処理タスクや複数の動作モードを含む高級言語プログラムに対する最適化処理について説明する。なお、以下の説明では、高級言語の例としてＣ言語が使用されているが、高級言語および機械語の種類は任意でよい。
【００２１】
（第１の実施形態）
図１〜図５を参照して、本発明の第１の実施形態に係るコンパイラによる最適化処理の実行例を説明する。図１は、機械語プログラムに含まれる命令コードをキャッシュメモリのライン上に配置した様子を示す図である。図１に示す命令コードは、図２に示すフロー図で表された処理に相当する。図２に示す処理では、複数の処理タスク（もしくは複数の動作モード）ごとの処理ブロックを示す。この処理に相当する命令コードは、図１に示すように、各処理ブロックに相当する命令コードを含んでいる。
【００２２】
図１には、命令コードをキャッシュメモリの２つのウェイ上に配置した様子が、２とおり記載されている。図１（ａ）では、複数の処理タスク（もしくは複数の動作モード）の処理ブロックが混在して２つのウェイ上に配置されている。この配置（以下、第１の配置という）は、従来のコンパイラによって得られる。
【００２３】
これに対して、図１（ｂ）では、複数の処理タスク（もしくは複数の動作モード）のうち、同一の処理タスク（もしくは同一の動作モード）の処理ブロックが1つのウェイ上に配置されている。この配置（以下、第２の配置という）は、本実施形態に係るコンパイラによって得られる。第２の配置では第１の配置と比べて、複数の処理タスク（もしくは複数の動作モード）の処理ブロックが、キャッシュのウェイに上書きして配置されている。
【００２４】
本実施形態では、コンピュータが機械語プログラムを実行するときには、ライン単位のプリフェッチが行われるとする。言い換えると、ある命令コードの読み出し時にキャッシュミスが発生した場合には、その命令コードを含む１ライン分の命令コードが、メインメモリからキャッシュメモリに転送されるとする。
【００２５】
上記の条件下で、発生するキャッシュミスについて説明する。第１の配置（図１（ａ））では、順次処理が実行されるときには、キャッシュメモリには処理タスクＡ（もしくは動作モードＡ）の処理Ａ−１に相当する処理ブロックの命令がプリフェッチされている。次に処理タスクＡ（もしくは動作モードＡ）の処理Ａ−２に相当する処理ブロックの命令が実行されるときに、処理Ａ−２に相当する処理ブロックの命令はキャッシュメモリ内に格納されていないので、キャッシュミスが発生する。このキャッシュミスが発生したときに、処理Ａ−２および処理Ａ−３がメインメモリからキャッシュメモリに転送される。このように第１の配置では、処理されない（相関関係のない）処理タスクＢ（もしくは動作モードＢ）に関わる処理ブロックによって処理タスクＡ（もしくは動作モードＡ）に関わる一連の処理にキャッシュミスが発生する。
【００２６】
一方、第２の配置（図１（ｂ））では、処理タスクＡ（もしくは動作モードＡ）に関わる処理が実行されるときには、キャッシュメモリには処理Ａ−１および処理Ａ−２および処理Ａ−３がプリフェッチされている。処理Ａ−１の次に処理Ａ−２が実行されるときに、処理Ａ−２はキャッシュメモリ内に格納されているので、処理タスクＡ（もしくは動作モードＡ）に関わる一連の処理にキャッシュミスは発生しない。このように第２の配置では、キャッシュミスが発生しない。したがって、第２の配置によれば、第１の配置よりもキャッシュミスの発生を抑制することができる。
【００２７】
プログラム開発者が図２に示すフロー図に基づき従来どおりのプログラミングを行うと、図３（ａ）に示す高級言語プログラムが得られる。この高級言語プログラムを従来のコンパイラで処理すると、図３（ｂ）に示す機械語プログラムが得られる。この機械語プログラムでは、処理タスクＡ（もしくは動作モードＡ）の処理ブロックと、処理タスクＢ（もしくは動作モードＢ）の処理ブロックとが混在して配置されている。このように高級言語プログラム内の処理の記載によって、機械語プログラム内の相当する命令コードの配置で、処理タスクＡ（もしくは動作モードＡ）に関わる処理に相当する命令コードもしくは、処理タスクＢ（もしくは動作モードＢ）に関わる処理に相当する命令コードが、キャッシュメモリ内に混在せずに格納される可能性が低くなる。このため、高級言語プログラム内で任意に混在して記載された処理ブロックの発生確率が高い場合には、キャッシュミスが発生しやすくなる。
【００２８】
そこで、本実施形態では、プログラム開発者は、複数の処理タスク（もしくは複数の動作モード）を含む高級言語プログラムを作成するときに、同一のタスクもしくは、同時に動作しない動作モードなど一連の処理シーケンスとして実行されない、処理ブロックの相関関係（輻輳関係）を相関関係にない（輻輳動作関係にない）処理として指定する。より詳細には、プログラム開発者は、図４（ａ）に示すように、同一のタスクもしくは、同時に動作しない動作モードなど一連の処理シーケンスとして実行されない、処理ブロックを＃ｐｒａｇｍａプリプロセッサディレクティブを用いて指定する。この＃ｐｒａｇｍａプリプロセッサディレクティブは、＃ｐｒａｇｍａプリプロセッサを呼び出す機能を有する。パラメータが＿ｕｎｃｏｒｒｅｌａｔｅｄ＿ＯＮ （相関関係なし指定オン）である＃ｐｒａｇｍａ プリプロセッサディレクティブと、パラメータが＿  ｕｎｃｏｒｒｅｌａｔｅｄ＿ＯＦＦ（相関関係なし指定オフ）である＃ｐｒａｇｍａ プリプロセッサディレクティブとに挟まれた処理ブロックが、処理ブロックの相関関係（輻輳関係）を相関関係にない（輻輳動作関係にない）処理となる。この＃ｐｒａｇｍａ プリプロセッサディレクティブが、高級言語プログラムに含まれる処理ブロックの相関関係（輻輳関係）を指定する記述に相当する。
【００２９】
図４（ａ）に示す高級言語プログラムを本実施形態に係るコンパイラで処理すると、図４（ｂ）に示す機械語プログラムが得られる。この機械語プログラムでは、処理タスクＡ（もしくは動作モードＡ）に関わる処理が実行されるときには、キャッシュメモリには処理Ａ−１の次に対応した命令コード（ここでは、処理Ａ−２）は、処理Ａ−１の直後に配置されている。この結果、処理Ａ−１ないしＡ−３は、高級言語プログラム内の記述配置と異なる位置に配置される。このように相関関係のない処理ブロックに相当する命令コードを直後に配置しないと、処理タスクＡ（もしくは動作モードＡ）に関わる一連の処理に相当する命令コードは、キャッシュメモリ上に格納される。したがって、キャッシュミスの発生を抑制することができる。
【００３０】
以下、図５を参照して、本実施形態に係るコンパイラの構成を説明する。図５は、本実施形態に係るコンパイラの全体構成を示す図である。図５に示すように、本実施形態に係るコンパイラは、翻訳部１０および連結部２０を備えている。翻訳部１０は、入力されたソースファイル１に基づき、オブジェクトファイル２を生成する。連結部２０は、生成されたオブジェクトファイル２に基づき、実行形式ファイル３を生成する。ソースファイル１には高級言語プログラムが記録され、オブジェクトファイル２および実行形式ファイル３には機械語プログラムが記録される。
【００３１】
翻訳部１０は、プリプロセッサディレクティブ解析ステップＳ１１、分岐構造処理ステップＳ１２、および、命令コード生成ステップＳ１３を実行する。プリプロセッサディレクティブ解析ステップＳ１１では、ソースファイルに記録された高級言語プログラムから、処理ブロックの相関関係（輻輳関係）を指定する＃ｐｒａｇｍａ プリプロセッサディレクティブが抽出される。分岐構造処理ステップＳ１２では、処理ブロックの相関関係（輻輳関係）の指定に基づき分岐命令が生成され、命令コード生成ステップＳ１３では、分岐構造処理ステップＳ１２で生成された分岐命令以外の命令コードが生成され、相関関係にある（輻輳関係にある）命令コードが連続するように命令コードが配置される。生成された命令コードは、リンク前の機械語プログラムとしてオブジェクトファイルに記録される。
【００３２】
なお、分岐構造処理ステップＳ１２、命令コード生成ステップＳ１３が、請求項１中の前記高級言語プログラムに含まれる記述に基づき、前記機械語プログラムの一部を処理範囲として決定する範囲決定ステップと、前記処理範囲内にある命令コードの配置位置を決定する配置決定ステップに相当する。すなわち、相関関係にある処理ブロックが連続するように分岐命令で並べ替え、最終の配置決定（さらに効率化する位置決定）は、後述する第２の実施形態の図６のステップＳ３４にて行われる。
【００３３】
連結部２０は、結合ステップＳ２１を実行する。結合ステップＳ２１では、オブジェクトファイル２に記録されたリンク前の機械語プログラムに対してリンク処理が実行される。リンク後の機械語プログラムは、実行形式ファイル３に記録される。
【００３４】
以上に示すように、本実施形態に係るコンパイラは、入力された高級言語プログラムに処理ブロックの相関関係（輻輳関係）を指定する記述によって相関関係にない（輻輳動作関係にない）ことを示す処理であることを指定する記述が含まれている場合には、相関関係のない処理ブロックに相当する命令コードを直後に配置しない。プログラム開発者は、高級言語プログラムを作成するときに、同一のタスクもしくは、同時に動作しない動作モードなど一連の処理シーケンスとして実行されない、処理ブロックを相関関係にない（輻輳動作関係にない）処理ブロックとして指定する。プログラム開発者は、高級言語プログラムの動作を理解し、いずれの処理ブロックが相関関係にない（輻輳動作関係にない）処理ブロックで実行されるかを知っているので、多くの場合、相関関係にない（輻輳動作関係にない）処理ブロックを正しく指定することができる。例えば、再生系の処理と、記録系の処理があり、独立した動作モードで動作する場合、再生系の処理に必要な処理ブロックと、記録系の処理に必要な処理ブロックとが含まれている場合には、プログラム開発者は、再生系に必要な処理ブロックと、記録系に必要な処理ブロックを相関関係にない（輻輳動作関係にない）処理ブロックとして指定すればよい。
【００３５】
したがって、本実施形態に係るコンパイラによれば、相関関係のない（輻輳動作関係にない）処理ブロックに相当する命令コードを分岐命令の直後または近傍に配置しないことによって、ある一連の処理に相当する命令コードを直後に配置することにより、前記ある一連の処理が実行されるときのキャッシュミスの発生を抑制し、キャッシュミスに起因する性能の低下を抑制することができる。
【００３６】
（第２の実施形態）
図６〜図８を参照して、本発明の第２の実施形態に係るコンパイラによる最適化処理の実行例を説明する。なお、高級言語プログラムに含まれる処理ブロックの相関関係（輻輳関係）を指定する記述に関しては図４（ａ）に示したものと同様である。
【００３７】
第１の実施形態では、相関関係にない（輻輳動作関係にない）処理ブロックに相当する命令コードを直後に配置しないこととしたが、本実施形態は相関関係にない（輻輳動作関係にない）処理ブロックをキャッシュメモリ上の同一アドレスに配置するようにメインメモリ上のアドレスに配置することで、キャッシュミスに起因する性能の低下をより一層抑制できるようにしたものである。
【００３８】
このような命令コードの配置位置を求めるために、本実施形態に係るコンパイラは、高級言語プログラムに含まれる記述に基づき、機械語プログラムの一部を処理範囲として決定する処理と、処理範囲内にある命令コードの配置位置を決定する処理と行う。
【００３９】
以下、図６を参照して、本実施形態に係るコンパイラの構成を説明する。本実施形態に係るコンパイラの全体構成は、第１の実施形態に係るコンパイラと同じである（図５を参照）。ただし、本実施形態に係るコンパイラは、図５に示す連結部２０において、図６に示す連結部３０を備えている。連結部３０は、１次結合ステップＳ３１、範囲決定ステップＳ３２、アドレス重複検出ステップＳ３３、配置決定ステップＳ３４、および、配置ステップＳ３５を実行する。また、連結部３０は、１次結合ステップＳ３１の出力データを記録する１次実行形式ファイル４およびアドレスマッピング情報ファイル５を含む。
【００４０】
１次結合ステップＳ３１では、オブジェクトファイル２に記録された機械語プログラムに対してリンク処理が行われる。これにより、実行可能な機械語プログラム（リンク後の機械語プログラム）と、サブルーチンやラベルのアドレス情報とが生成される。実行可能な機械語プログラムは１次実行形式ファイル４に記録され、アドレス情報はアドレスマッピング情報ファイル５に記録される。１次実行形式ファイル４には、高級言語プログラムにおいて高優先度の処理として指定された処理を特定する情報も記録される。
【００４１】
範囲決定ステップＳ３２では、１次実行形式ファイル４に記録された内容に基づき、処理ブロックの相関関係（輻輳関係）が解析される。その結果、相関関係にない（輻輳動作関係にない）処理ブロックに相当する命令コードが、処理対象として選択される。
【００４２】
アドレス重複検出ステップＳ３３では、アドレスマッピング情報ファイル５に記録された内容に基づき、相関関係にない（輻輳動作関係にない）処理ブロックに相当する命令コードのメインメモリ上のアドレスが求められる。また、求めたアドレスと、キャッシュメモリの構成に関する情報とに基づき、相関関係にない（輻輳動作関係にない）処理ブロックに相当する命令コードのキャッシュメモリ内の格納位置のうちで、互いに重複しないものが検出される。
【００４３】
キャッシュメモリ内の格納位置が重複しない命令コードが存在する場合、配置決定ステップＳ３４では、命令コードが重複配置されるように、命令コードの配置位置が決定される。配置ステップＳ３５では、相関関係にない（輻輳動作関係にない）処理ブロックに相当する命令コードが、配置決定ステップＳ３４で決定された位置に配置される。
【００４４】
図７および図８を参照して、アドレス重複検出ステップＳ３３で使用される、メインメモリのアドレスとキャッシュメモリのアドレスとの対応づけについて説明する。ここでは、例として、２ウェイ・セット・アソシエイティブ方式で、ラインサイズが３２バイト、総容量が８Ｋバイトのキャッシュメモリ（図７を参照）について説明する。
【００４５】
メインメモリのアドレス幅が３２ビットであるとすると、このうち下位１３ビットがキャッシュメモリのアドレスに対応づけられる（図８を参照）。キャッシュメモリのアドレスは、タグアドレスの最下位ビット（１ビット）、インデックス（７ビット）、および、オフセット（５ビット）に分けられる。タグアドレスの最下位ビットは、２ウェイのいずれかを指定し、インデックスはラインを指定し、オフセットはライン上のバイトを指定する。
【００４６】
２つの処理に相当する命令コードのメインメモリのアドレスのうち、タグアドレスの最下位ビットとインデックスとを合わせた８ビットが一致する場合には、これら２つの命令コードは、キャッシュメモリ内に重複して配置される。このようにアドレス重複検出ステップＳ３３では、メインメモリのアドレスの一部が一致しているか否かにより、命令コードのキャッシュメモリ内の格納位置が重複しているか否かを判断することができる。
【００４７】
したがって、本実施形態に係るコンパイラによれば、相関関係のない（輻輳動作関係にない）処理ブロックに相当する命令コードをキャッシュメモリ内の格納位置が重複するように配置することによって、キャッシュミスに起因する性能の低下を抑制することができる。
【００４８】
なお、本発明の第１，２の実施形態では、高級言語プログラム内でパラメータがオンである＃ｐｒａｇｍａプリプロセッサディレクティブとパラメータがオフである＃ｐｒａｇｍａプリプロセッサディレクティブとに挟まれた部分が、相関関係にない（輻輳動作関係にない）処理として指定されることとした。すなわち、高級言語プログラムに含まれる第１の範囲を指定する記述であり、機械語プログラムのうちで第１の範囲に相当する部分を処理範囲として選択するものである。なお、相関関係にない（輻輳動作関係にない）処理の指定方法として、これ以外の方法を用いてもよい。例えば、高級言語プログラム内には、相関関係にない（輻輳動作関係にない）処理として指定された範囲内にある相関関係のある（輻輳動作関係にある）処理部分を指定する＃ｐｒａｇｍａプリプロセッサディレクティブがさらに含まれていてもよい。すなわち、高級言語プログラムに含まれる第１の範囲内にある第２の範囲を指定する記述であり、機械語プログラムのうちで第１の範囲から第２の範囲を除いた部分に相当する部分を処理範囲として選択するものである。あるいは、高級言語プログラム内には、相関関係のある（輻輳動作関係にある）処理範囲を指定する＃ｐｒａｇｍａプリプロセッサディレクティブや、その範囲内にある相関関係にない（輻輳動作関係にない）処理である部分を指定する＃ｐｒａｇｍａプリプロセッサディレクティブが含まれていてもよい。すなわち、高級言語プログラムに含まれる第１の範囲を指定する記述であり、機械語プログラムのうちで第１の範囲の外に相当する部分を処理範囲として選択したり、高級言語プログラムに含まれる第１の範囲内にある第２の範囲を指定する記述であり、機械語プログラムのうちで第１の範囲から第２の範囲を除いた部分の外に相当する部分を処理範囲として選択するものである。
【００４９】
また、本発明のコンパイラは、第１，２の実施形態の最適化方法をコンピュータに実行させるためのコンパイラであり、本発明の記録媒体は、第１，２の実施形態の最適化方法をコンピュータに実行させるためのコンパイラを記録したコンピュータ読み取り可能な記録媒体であり、本発明の情報伝送媒体は、第１，２の実施形態の最適化方法をコンピュータに実行させるためのコンパイラをインターネット等を介して伝送するための情報伝送媒体である。
【産業上の利用可能性】
【００５０】
本発明のコンパイラによる最適化方法は、安価で容易にキャッシュミスに起因する性能の低下を抑制できるので、高級言語プログラムを機械語プログラムに変換する各種のコンパイラに利用することができる。
【図面の簡単な説明】
【００５１】
【図１】命令コードをキャッシュメモリのライン上に配置した様子を示す図
【図２】最適化処理の対象となる処理を表すフロー図
【図３】コンパイラの実行例を示す図
【図４】本発明の第１の実施形態に係るコンパイラによる最適化処理の実行例を示す図
【図５】本発明の第１の実施形態に係るコンパイラの全体構成を示す図
【図６】本発明の第２の実施形態に係るコンパイラの連結部の詳細を示す図
【図７】本発明の第２の実施形態に係るキャッシュメモリの例を示す図
【図８】本発明の第２の実施形態に係るメインメモリのアドレスとキャッシュメモリのアドレスの対応づけを示す図
【符号の説明】
【００５２】
１  ソースファイル
２  オブジェクトファイル
３  実行形式ファイル
４  一次実行形式ファイル
５  アドレスマッピング情報ファイル
１０  翻訳部
２０、３０  連結部
Ｓ１１  プリプロセッサディレクティブ解析ステップ
Ｓ１２  分岐構造処理ステップ
Ｓ１３  命令コード生成ステップ
Ｓ２１  結合ステップ
Ｓ３１  一次結合ステップ
Ｓ３２  範囲決定ステップ
Ｓ３３  アドレス重複解析ステップ
Ｓ３４  配置決定ステップ
Ｓ３５  配置ステップ
【図１】
2010026851.tif 000003
【図２】
2010026851.tif 000004
【図３】
2010026851.tif 000005
【図４】
2010026851.tif 000006
【図５】
2010026851.tif 000007
【図６】
2010026851.tif 000008
【図７】
2010026851.tif 000009
【図８】
2010026851.tif 000010