(57)【要約】  関数の呼び出し順（３１）を取得する取得部（２１）と、キャッシュメモリのウェイの数分の格納エリアを有する仮想キャッシュメモリを生成する仮想キャッシュメモリ生成部と、仮想キャッシュメモリに対して複数の関数の各関数に含まれる命令コードを呼び出し順（３１）に呼出命令コードとして呼び出すシミュレーションを実行し、競合が発生した場合、発生した競合の情報を競合情報（７０）として取得するシミュレータ部と、競合情報７０に基づいてキャッシュメモリにおける関数の配置位置を決定する配置位置決定部（８０）とを備える。
2016113869.tif 000002
【特許請求の範囲】
【請求項１】
少なくとも１つのウェイを使用するキャッシュメモリに複数の関数を含むプログラムを配置するプログラム配置装置において、  前記プログラムを実行することにより、前記複数の関数の各関数に含まれる命令コードの呼び出し順を取得する取得部と、  前記キャッシュメモリの前記ウェイの数分の格納エリアを有する仮想キャッシュメモリを生成する仮想キャッシュメモリ生成部と、  前記仮想キャッシュメモリに対して前記命令コードを前記呼び出し順に呼出命令コードとして呼び出すシミュレーションを実行し、既に呼び出した前記呼出命令コードを再度呼び出した際に前記格納エリアに前記呼出命令コード以外の命令コードが格納されている競合が発生した場合、発生した前記競合の情報を競合情報として取得するシミュレータ部と、  前記競合情報に基づいて、前記キャッシュメモリにおける前記複数の関数の各関数の配置位置を決定する配置位置決定部とを備えるプログラム配置装置。
【請求項２】
前記シミュレータ部は、  前記複数の関数の各関数に含まれる命令コードのうち前記競合を発生させた命令コードの組み合わせを競合命令コード組として取得し、前記競合命令コード組により発生した前記競合の回数を競合回数として計数し、計数した前記競合回数を前記競合情報として取得し、  前記配置位置決定部は、  前記競合回数に基づいて、前記複数の関数の各関数の前記配置位置を決定する請求項１に記載のプログラム配置装置。
【請求項３】
前記仮想キャッシュメモリ生成部は、  前記仮想キャッシュメモリとして、アドレスが連続する複数のエリアであって前記ウェイの数分の格納エリアと前記ウェイの数分の格納エリアの後ろに連続する複数の仮格納エリアとからなる複数のエリアを生成する請求項２に記載のプログラム配置装置。
【請求項４】
前記シミュレータ部は、  前記呼出命令コードを呼び出した際に前記格納エリアに対して前記競合が発生し、かつ、前記呼出命令コードが前記仮格納エリアにある場合、既に前記仮想キャッシュメモリに格納されている前記呼出命令コードより前のエリアに格納されている全ての命令コードと前記呼出命令コードとの組を前記競合命令コード組として取得する請求項３に記載のプログラム配置装置。
【請求項５】
前記シミュレータ部は、  前記競合命令コード組を取得した後に、既に前記仮想キャッシュメモリに格納されている前記呼出命令コードより前のエリアに格納されている全ての命令コードをそれぞれ１つ後ろのエリアに移動し、既に前記仮想キャッシュメモリに格納されている前記呼出命令コードを前記仮想キャッシュメモリの先頭の前記格納エリアに格納し、前記呼び出し順における前記呼出命令コードの次の命令コードを前記呼出命令コードとして呼び出す請求項４に記載のプログラム配置装置。
【請求項６】
前記プログラム配置装置は、  前記複数の関数の各関数の優先順位を判定するためのルールを設定する優先順位テーブルを備え、  前記配置位置決定部は、  前記優先順位テーブルに基づいて前記キャッシュメモリに配置する前記複数の関数の各関数の優先順位を判定し、判定した優先順位の順に前記複数の関数の各関数の前記配置位置を決定する請求項１から５のいずれか１項に記載のプログラム配置装置。
【請求項７】
前記プログラム配置装置は、  前記配置位置決定部により決定された前記複数の関数の各関数の前記配置位置に基づいて、前記複数の関数の各関数を前記配置位置とは異なる再配置位置に並び替える関数配置調整部を備え、  前記複数の関数の各関数が前記再配置位置に配置された場合の前記キャッシュメモリの空き領域は、前記複数の関数の各関数が前記配置位置に配置された場合の前記キャッシュメモリの空き領域よりも少ない請求項１から６のいずれか１項に記載のプログラム配置装置。
【請求項８】
少なくとも１つのウェイを使用するキャッシュメモリに複数の関数を含むプログラムを配置するプログラム配置装置のプログラム配置方法において、  取得部が、前記プログラムを実行することにより、前記複数の関数の各関数に含まれる命令コードの呼び出し順を取得し、  仮想キャッシュメモリ生成部が、前記キャッシュメモリの前記ウェイの数分の格納エリアを有する仮想キャッシュメモリを生成し、  シミュレータ部が、前記仮想キャッシュメモリに対して前記命令コードを前記呼び出し順に呼出命令コードとして呼び出すシミュレーションを実行し、既に呼び出した前記呼出命令コードを再度呼び出した際に前記格納エリアに前記呼出命令コード以外の命令コードが格納されている競合が発生した場合、発生した前記競合の情報を競合情報として取得し、  配置位置決定部が、前記競合情報に基づいて、前記キャッシュメモリにおける前記複数の関数の各関数の配置位置を決定するプログラム配置方法。
【請求項９】
少なくとも１つのウェイを使用するキャッシュメモリに複数の関数を含むプログラムを配置するプログラム配置装置のプログラム配置プログラムにおいて、  前記プログラムを実行することにより、前記複数の関数の各関数に含まれる命令コードの呼び出し順を取得する取得処理と、  前記キャッシュメモリの前記ウェイの数分の格納エリアを有する仮想キャッシュメモリを生成する仮想キャッシュメモリ生成処理と、  前記仮想キャッシュメモリに対して前記命令コードを前記呼び出し順に呼出命令コードとして呼び出すシミュレーションを実行し、既に呼び出した前記呼出命令コードを再度呼び出した際に前記格納エリアに前記呼出命令コード以外の命令コードが格納されている競合が発生した場合、発生した前記競合の情報を競合情報として取得するシミュレーション処理と、  前記競合情報に基づいて、前記キャッシュメモリにおける前記複数の関数の各関数の配置位置を決定する配置位置決定処理とをコンピュータに実行させるプログラム配置プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】  本発明は、プログラム配置装置、プログラム配置方法及びプログラム配置プログラムに関する。
【背景技術】
【０００２】  コンピュータシステムにおいて、性能向上を目的として、キャッシュメモリが利用される。コンピュータシステムでは、メインメモリの情報をキャッシュメモリにコピーしておくことにより、高速な読出しが可能となる。しかし、キャッシュメモリは小容量のため、命令の読出しに伴う情報の追い出し、すなわち競合キャッシュミスが発生する。競合キャッシュミスの発生は、プログラムの実行速度の低下につながるため、出来る限り抑制する必要がある。【０００３】  そこで、競合キャッシュミスを発生する可能性の高い命令同士が、同一のキャッシュラインに割り当てられないように配置する方法が研究されている。  プログラムが関数単位で構成されることに着目し、関数間の呼び出し関係を表す関数強度を定義し、関数強度が高い関数同士が同一のキャッシュラインに割り当てられないようにする手法が提案されている。【０００４】  特許文献１では、プログラム実行時に、関数の呼び出し順を時系列として表現した動的関数フローを生成し、生成した動的関数フローに基づいて、ある関数と他の全ての関数との関数強度情報を求める。特許文献１では、その関数強度情報に基づいて、関数をメモリ空間に配置することで、競合キャッシュミスを削減する手法が開示されている。【０００５】  また、メインメモリからキャッシュメモリに対して、キャッシュライン単位で、データのコピーが実行されることに着目した手法が提案されている。  特許文献２では、関数をキャッシュラインサイズの命令コードブロック、すなわちＩＣＢに分割してシミュレーションし、ＩＣＢ単位でフロー情報を抽出する。特許文献２では、各ＩＣＢの近傍内に、自分と異なる関数に属するＩＣＢの出現頻度を考慮した情報を、自ＩＣＢから見た他のＩＣＢの近傍重み情報として求める。この近傍重み情報に基づいて、関数配置を決定することによって、競合キャッシュミスを削減する手法が開示されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００９−０３２１９８号公報
【特許文献２】特開２０１０−２１８２１８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】  従来技術では、プログラム実行時における関数相互、またはキャッシュライン相互の時系列的な関係に基づいて、関数間の相関性を求め、相関性の高い関数同士が同一のキャッシュラインに割り当てられないように関数をメモリ空間に配置していた。  しかし、キャッシュメモリの構成によっては、相関性の高い関数同士でも、競合キャッシュミスが発生しない場合が存在する。例えば、キャッシュメモリとして４ウェイ構成を採用した場合、相関性の高い４つの関数が、連続的かつ繰り返し呼び出されたとしても、競合キャッシュミスは発生しない。  このように、キャッシュメモリの構成と関数の呼び出しパターンによっては、競合キャッシュミスが発生しない可能性があるにも関わらず、従来技術では関数の相関性を求める際に、このような事象を考慮していない。そのため、キャッシュメモリの構成と関数の呼び出しパターンによっては、最適な配置が求まらないという課題があった。【０００８】  本発明は、キャッシュメモリの構成と関数の呼び出しパターンに依らず、最適な関数配置情報を出力することを目的とする。
【課題を解決するための手段】
【０００９】  本発明に係るプログラム配置装置は、少なくとも１つのウェイを使用するキャッシュメモリに複数の関数を含むプログラムを配置するプログラム配置装置において、  前記プログラムを実行することにより、前記複数の関数の各関数の呼び出し順を取得する取得部と、  前記キャッシュメモリの前記ウェイの数分の格納エリアを有する仮想キャッシュメモリを生成する仮想キャッシュメモリ生成部と、  前記仮想キャッシュメモリに対して前記複数の関数の各関数を前記呼び出し順に呼出命令コードとして呼び出すシミュレーションを実行し、既に呼び出した前記呼出命令コードを再度呼び出した際に前記格納エリアに前記呼出命令コード以外の関数が格納されている競合が発生した場合、発生した前記競合の情報を競合情報として取得するシミュレータ部と、  前記競合情報に基づいて、前記キャッシュメモリにおける前記複数の関数の各関数の配置位置を決定する配置位置決定部とを備える。
【発明の効果】
【００１０】  本発明に係るプログラム配置装置によれば、取得部が、関数の呼び出し順を取得し、仮想キャッシュメモリ生成部が、キャッシュメモリのウェイの数分の格納エリアを有する仮想キャッシュメモリを生成する。また、シミュレータ部が、仮想キャッシュメモリに対して複数の関数の各関数を前記呼び出し順に呼出命令コードとして呼び出すシミュレーションを実行し、競合が発生した場合、発生した前記競合の情報を競合情報として取得する。さらに、配置位置決定部が、競合情報に基づいてキャッシュメモリにおける関数の配置位置を決定する。よって、キャッシュメモリの構成及び関数の呼び出し順を加味した最適な関数の配置位置を得ることができる。
【図面の簡単な説明】
【００１１】
【図１】実施の形態１に係るプログラム配置装置を示すブロック構成図。
【図２】実施の形態１に係る仮想キャッシュシミュレータ部のブロック構成図。
【図３】実施の形態１に係るＩＣＢの実行系列を示す図である。
【図４】実施の形態１に係る競合情報の構成図。
【図５】実施の形態１に係るプログラム配置装置のハードウェア構成図。
【図６】実施の形態１に係るプログラム配置装置のプログラム配置方法の動作を示すフロー図。
【図７】実施の形態１に係るシミュレーション処理の動作を示すフロー図。
【図８】実施の形態１に係る仮想キャッシュメモリ生成処理を説明する図。
【図９】実施の形態１に係る仮想キャッシュメモリ生成処理を説明する図。
【図１０】関数Ａと関数Ｂが連続したメモリ領域に配置された場合のセット数８のキャッシュメモリ上の配置状況を示す図。
【図１１】関数Ａと関数Ｂが連続したメモリ領域に配置された場合のセット数８のキャッシュメモリ上の配置状況を示す図。
【図１２】キャッシュミス発生時における競合情報への登録方法を説明する図。
【図１３】キャッシュミス発生時における競合情報への登録方法を説明する図。
【図１４】実施の形態１に係る競合情報の一例図。
【図１５】実施の形態１に係る競合情報登録処理の動作を示すフロー図。
【図１６】実施の形態１に係るステップＳ２０５０の詳細処理フロー図。
【図１７】実施の形態１に係るステップＳ２０５１の詳細処理フロー図。
【図１８】実施の形態１に係る仮想キャッシュメモリ更新処理を示す図。
【図１９】実施の形態１に係る仮想キャッシュメモリ更新処理を示す図。
【図２０】実施の形態１に係る配置位置決定処理の動作を示すフロー図。
【図２１】実施の形態１に係るルール１３１の構成図。
【図２２】実施の形態１に係るステップＳ３０３の既配置関数との競合ミス数の計算処理の動作を示すフロー図。
【図２３】関数Ｂをセット０に配置した場合の、キャッシュミス発生回数の計算結果を示す図。
【図２４】関数Ｂをセット１に配置した場合の、キャッシュミス発生回数の計算結果を示す図。
【図２５】関数Ａをセット０に配置した場合の、キャッシュミス発生回数の計算結果を示す図。
【図２６】関数Ａをセット１に配置した場合の、キャッシュミス発生回数の計算結果を示す図。
【図２７】関数配置情報９０の一例を示す図。
【図２８】実施の形態２に係るプログラム配置装置を示すブロック構成図。
【図２９】実施の形態２に係るプログラム配置装置のプログラム配置方法の動作を示すフロー図。
【図３０】実施の形態２に係る関数配置調整処理の動作を示すフロー図。
【図３１】関数配置情報９０の一例を示す図。
【発明を実施するための形態】
【００１２】  実施の形態１．＊＊＊構成の説明＊＊＊  図１は、実施の形態１に係るプログラム配置装置５００を示すブロック構成図である。  プログラム配置装置５００は、プログラム１０、取得部２１、呼び出し順３１、キャッシュ構成情報４０、プログラム情報５０、仮想キャッシュシミュレータ部６０、競合情報７０、配置位置決定部８０、関数配置情報９０、関数配置部１００、最適化済プログラム１１０、優先順位テーブル１３０を備える。
【００１３】  プログラム配置装置５００は、少なくとも１つのウェイを使用するキャッシュメモリに複数の関数を含むプログラムを配置する。プログラム配置装置５００は、コンピュータが備えるキャッシュメモリにおけるプログラム１０の配置位置を最適化するプログラム最適化装置である。
【００１４】  プログラム１０は、競合キャッシュミスの削減を行う対象である最適化対象プログラムである。プログラム１０は、ソースコード、オブジェクトファイル及び実行ファイルの内の１つのファイル、または複数のファイルを含む。
【００１５】  取得部２１は、プログラム１０を実行することにより、複数の関数の各関数に含まれる命令コードの呼び出し順３１を取得する。取得部２１は、プログラム１０を実行し、関数の呼び出し順３１である命令トレース３０を取得するプログラム実行部２０である。プログラム実行部２０は、命令トレース３０を取得できる機構が備わっているのであれば、ターゲットプロセッサを含む実機、またはターゲットプロセッサを模擬するシミュレータのどちらであってもよい。
【００１６】  命令トレース３０は、プログラム１０を実行した際の、実行命令の命令アドレスを時系列に並べたデータである。  キャッシュ構成情報４０は、プログラム１０を、最終的に動作させるターゲットプロセッサに搭載される、キャッシュメモリ４０１の情報であり、キャッシュラインサイズ、ウェイ数、セット数及び置換アルゴリズムの種類の情報を含む。  プログラム情報５０は、プログラム１０に含まれる全関数について、関数のラベル、配置アドレス、関数のサイズの組の情報を保持する。
【００１７】  仮想キャッシュシミュレータ部６０は、命令トレース３０、キャッシュ構成情報４０及びプログラム情報５０を入力として、競合情報７０を出力する。仮想キャッシュシミュレータ部６０は、命令トレース３０に基づいて、実キャッシュメモリであるキャッシュメモリ４０１では取得できない、各関数に含まれるＩＣＢ単位での競合情報を生成し、競合情報７０として出力する。  競合情報７０は、各関数に含まれるキャッシュラインサイズのＩＣＢ単位での競合の情報を保持する競合ミスデータベースである。
【００１８】  配置位置決定部８０は、競合情報７０に基づいて、キャッシュメモリ４０１における複数の関数の各関数の配置位置を決定する。配置位置決定部８０は、キャッシュ構成情報４０、プログラム情報５０及び競合情報７０を入力とし、関数配置情報９０を出力する。配置位置決定部８０は、決められた優先順位に基づいて、各関数を順番にメモリ空間に配置していく。配置位置決定部８０は、ある関数を配置する際には、競合情報７０を参照し、既配置の関数との競合キャッシュミス発生回数を求める。配置位置決定部８０は、この競合キャッシュミス発生回数が最小となるように、関数の配置場所を決定する。
【００１９】  関数配置情報９０は、配置位置決定部８０により算出された、競合キャッシュミス発生回数を最小にする関数配置のリストであり、全ての関数のラベルと配置アドレスの組で構成される。  関数配置部１００は、プログラム１０と関数配置情報９０とを入力として、関数の再配置を実行し、最適化済プログラム１１０を出力する。  最適化済プログラム１１０は、プログラム１０と動作は同じであるが、プログラム内の関数配置が異なり、競合キャッシュミスが最小化されたプログラムである。
【００２０】  優先順位テーブル１３０は、複数の関数の各関数の優先順位を判定するためのルール１３１を設定する。配置位置決定部８０は、優先順位テーブル１３０に基づいてキャッシュメモリ４０１に配置する複数の関数の各関数の優先順位を判定する。配置位置決定部８０は、判定した優先順位の順に複数の関数の各関数の配置位置を決定する。
【００２１】  各機能ブロックは、１つあるいは複数のプログラムとして実装されていてもよいし、複数の機能ブロックが１つのプログラムとして実装されていてもよい。また、命令トレース３０、キャッシュ構成情報４０、プログラム情報５０、競合情報７０及び関数配置情報９０はファイルとして存在してもよいし、メモリ上にのみ配置されるデータであってもよい。
【００２２】  図２は、本実施の形態に係る仮想キャッシュシミュレータ部６０のブロック構成図である。  仮想キャッシュシミュレータ部６０は、仮想キャッシュメモリ生成部６０１とシミュレータ部６０５とを備える。シミュレータ部６０５は、仮想キャッシュデータ保持部６０２、命令トレース読出し部６０３、競合情報生成部６０４を備える。
【００２３】  仮想キャッシュメモリ生成部６０１は、キャッシュメモリ４０１のウェイの数分の格納エリア４０３１を有する仮想キャッシュメモリ４０３を生成する。具体的には、仮想キャッシュメモリ生成部６０１は、仮想キャッシュメモリ４０３として、アドレスが連続する複数のエリア４０３９を生成する。複数のエリア４０３９は、ウェイの数分の格納エリア４０３１とウェイの数分の格納エリア４０３１の後ろに連続する複数の仮格納エリア４０３２とからなる。以下において、格納エリア４０３１を実ウェイと表記し、仮格納エリア４０３２を仮想ウェイと表記する場合がある。  以上のように、仮想キャッシュメモリ生成部６０１は、キャッシュ構成情報４０に基づいて、仮想キャッシュデータ保持部６０２のデータ構造である仮想キャッシュメモリ４０３を構築する。
【００２４】  シミュレータ部６０５は、仮想キャッシュメモリ４０３に対して複数の関数の各関数に含まれる命令コード３０１を呼び出し順３１に呼出命令コード４０３３として呼び出すシミュレーションを実行する。シミュレータ部６０５は、既に呼び出した呼出命令コード４０３３を再度呼び出した際に格納エリア４０３１に呼出命令コード４０３３以外の命令コード３０１が格納されている競合が発生した場合、発生した競合の情報を競合情報７０として取得する。
【００２５】  具体的には、シミュレータ部６０５は、呼出命令コード４０３３を呼び出した際に格納エリア４０３１に対して競合が発生し、かつ、呼出命令コード４０３３が仮格納エリア４０３２にある場合、次のように競合命令コード組７０１を取得する。シミュレータ部６０５は、既に仮想キャッシュメモリ４０３に格納されている呼出命令コード４０３３より前のエリアに格納されている全ての命令コードと呼出命令コードとの組を競合命令コード組７０１として取得する。
【００２６】  また、シミュレータ部６０５は、競合命令コード組７０１を取得した後に、既に仮想キャッシュメモリ４０３に格納されている呼出命令コードより前のエリアに格納されている全ての命令コードをそれぞれ１つ後ろのエリアに移動する。そして、シミュレータ部６０５は、既に仮想キャッシュメモリ４０３に格納されている呼出命令コード４０３３を仮想キャッシュメモリ４０３の先頭の格納エリア４０３１に格納し、呼び出し順３１における呼出命令コード４０３３の次の命令コード３０１を呼出命令コード４０３３として呼び出す。
【００２７】  ここで、呼び出し順３１である命令トレース３０には、関数をキャッシュラインサイズに分割した命令コード３０１、すなわち関数毎のＩＣＢの実行系列３０３が設定されている。よって、シミュレータ部６０５により呼出命令コード４０３３として呼び出される命令コード３０１とは、関数をキャッシュメモリ４０１のキャッシュラインサイズに分割した関数毎のＩＣＢである。以下、命令コード３０１を命令コードブロック、すなわちＩＣＢとして説明する。競合命令コード組７０１は、競合に関連するＩＣＢの組み合わせである競合ＩＣＢ７０２である。
【００２８】  仮想キャッシュデータ保持部６０２は、仮想キャッシュメモリ生成部６０１により構築された仮想キャッシュメモリ４０３のデータ構造に基づいて、命令トレース３０を読み込み、キャッシュの動作を模擬する。
【００２９】  命令トレース読出し部６０３は、命令トレース３０に基づいて、命令コード３０１、すなわちＩＣＢを順番に取り出し、仮想キャッシュデータ保持部６０２に渡す。  競合情報生成部６０４は、仮想キャッシュデータ保持部６０２でキャッシュミスが発生した際に、キャッシュミスを引き起こすＩＣＢの組み合わせに関する情報を競合情報７０に登録する。
【００３０】  以上のように、シミュレータ部６０５は、複数の関数の各関数に含まれる命令コードのうち競合を発生させた命令コード３０１の組み合わせを競合命令コード組７０１として取得する。シミュレータ部６０５は、競合命令コード組７０１により発生した競合の回数を競合回数として計数し、計数した競合回数を競合情報７０として取得する。
【００３１】  図３を用いて、命令トレース３０について説明する。また、図４を用いて、競合情報７０の構成について説明する。  命令トレース３０より、図３のＩＣＢの実行系列３０３が得られているものとする。競合情報生成部６０４は、図３のＩＣＢの実行系列３０３に基づいて、図４に示す競合情報７０を生成する。
【００３２】  図４に示す通り、競合情報７０は、全ＩＣＢごとの競合ミスデータレコード７１から構成される。競合ミスデータレコード７１は、ＩＣＢ名７２、自ＩＣＢとしての合計ミス数７３、他ＩＣＢとしての合計ミス数７４及び１個以上の競合ミスエントリ７５を有する。  競合ミスエントリ７５は、ミスＩＤ７６、競合ＩＣＢ数７７及び競合ＩＣＢごとのミス数７８から構成される。自ＩＣＢとは、着目しているＩＣＢ自身のことを表しており、図４のＡ０の競合ミスデータレコード７１においては、Ａ０が自ＩＣＢとなる。他ＩＣＢとは、着目しているＩＣＢが競合している他のＩＣＢの集合を表しており、図４のＡ０の競合ミスデータレコード７１においては、Ｂ０、Ｃ０が他ＩＣＢとなる。競合ＩＣＢとは、あるキャッシュミスが発生した際に、競合する全ＩＣＢの集合を表す。
【００３３】  ＩＣＢ名７２は各ＩＣＢを識別するための名前である。  自ＩＣＢとしての合計ミス数７３は、自分自身を参照する時に発生した競合キャッシュミス回数を表す。  他ＩＣＢとしての合計ミス数７４は、自分自身と競合する、他のＩＣＢを参照する時に発生した、競合キャッシュミス回数を表す。  競合ミスエントリ７５は、あるＩＣＢの組み合わせにおける、キャッシュミスの発生状況を示すデータであり、競合ミスデータレコード７１ごとに１個以上存在する。
【００３４】  ミスＩＤ７６は、各ＩＣＢ内の競合キャッシュミスを一意に識別するためのＩＤである。  競合ＩＣＢ数７７は、競合キャッシュミス発生時に関連するＩＣＢの数を表す。競合ＩＣＢ数７７には、自ＩＣＢも含まれる。同じＩＣＢ内において、同じ競合ＩＣＢ数であるにも関わらず、別のキャッシュミスとして記録されているのは、競合キャッシュミスの発生回数を、競合ＩＣＢの組み合わせごとに保持しているからである。
【００３５】  競合ＩＣＢごとのミス数７８は、競合キャッシュミス発生時に関連するＩＣＢごとの、競合キャッシュミス発生回数を表す。競合ＩＣＢごとのミス数７８の値の意味を、図４のＡ０の競合ミスデータレコード７１を例に説明する。Ａ０に含まれる競合ミスエントリ７５の内、ミスＩＤ７６が３の行に注目すると、競合ＩＣＢ数７７が２で、競合ＩＣＢごとのミス数７８はＡ０で１、Ｂ０で斜線、Ｃ０で０が入力されている。ミスＩＤが３の行は、Ａ０とＣ０との２つのＩＣＢを競合ＩＣＢとして発生したキャッシュミスの回数が設定されている。数字の入力されているＩＣＢは、キャッシュミスに関連していることを表し、斜線のＩＣＢは関連していないことを表す。よって、ミスＩＤが３の行では、Ａ０とＣ０とに数字が設定されている。また数字は、競合ＩＣＢの組み合わせにより発生したキャッシュミスの発生回数を示している。ミスＩＤが３の行では、Ａ０とＣ０の組み合わせにおいて、Ａ０参照時に１回キャッシュミスが発生し、Ｃ０の参照時にはキャッシュミスが発生しないことを表す。
【００３６】  図５を用いて、本実施の形態に係るプログラム配置装置５００のハードウェア構成の一例について説明する。
【００３７】  プログラム配置装置５００のハードウェア構成例を図５を参照して説明する。  プログラム配置装置５００はコンピュータである。  プログラム配置装置５００は、プロセッサ９０１、補助記憶装置９０２、メモリ９０３、通信装置９０４、入力インタフェース９０５、ディスプレイインタフェース９０６といったハードウェアを備える。  プロセッサ９０１は、信号線９１０を介して他のハードウェアと接続され、これら他のハードウェアを制御する。  入力インタフェース９０５は、入力装置９０７に接続されている。  ディスプレイインタフェース９０６は、ディスプレイ９０８に接続されている。
【００３８】  プロセッサ９０１は、プロセッシングを行うＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）である。  プロセッサ９０１は、例えば、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）、ＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。  補助記憶装置９０２は、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、フラッシュメモリ、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）である。  メモリ９０３は、例えば、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。  通信装置９０４は、データを受信するレシーバー９４０１及びデータを送信するトランスミッター９４０２を含む。  通信装置９０４は、例えば、通信チップ又はＮＩＣ（Ｎｅｔｗｏｒｋ  Ｉｎｔｅｒｆａｃｅ  Ｃａｒｄ）である。  入力インタフェース９０５は、入力装置９０７のケーブル９１１が接続されるポートである。  入力インタフェース９０５は、例えば、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）端子である。  ディスプレイインタフェース９０６は、ディスプレイ９０８のケーブル９１２が接続されるポートである。  ディスプレイインタフェース９０６は、例えば、ＵＳＢ端子又はＨＤＭＩ（登録商標）（Ｈｉｇｈ  Ｄｅｆｉｎｉｔｉｏｎ  Ｍｕｌｔｉｍｅｄｉａ  Ｉｎｔｅｒｆａｃｅ）端子である。  入力装置９０７は、例えば、マウス、キーボード又はタッチパネルである。  ディスプレイ９０８は、例えば、ＬＣＤ（Ｌｉｑｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙ）である。
【００３９】  補助記憶装置９０２には、図１に示す取得部２１、仮想キャッシュシミュレータ部６０、配置位置決定部８０、関数配置部１００（以下、取得部２１、仮想キャッシュシミュレータ部６０、配置位置決定部８０、関数配置部１００をまとめて「部」と表記する）の機能を実現するプログラムが記憶されている。上述したプログラム配置装置５００が備える「部」の機能を実現するプログラムは、プログラム配置プログラムと称される。プログラム配置プログラムは、１つのプログラムであってもよいし、複数のプログラムから構成されていてもよい。  このプログラム配置プログラムは、メモリ９０３にロードされ、プロセッサ９０１に読み込まれ、プロセッサ９０１によって実行される。  更に、補助記憶装置９０２には、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）も記憶されている。  そして、ＯＳの少なくとも一部がメモリ９０３にロードされ、プロセッサ９０１はＯＳを実行しながら、「部」の機能を実現するプログラムを実行する。  図５では、１つのプロセッサ９０１が図示されているが、プログラム配置装置５００が複数のプロセッサ９０１を備えていてもよい。  そして、複数のプロセッサ９０１が「部」の機能を実現するプログラムを連携して実行してもよい。  また、「部」の処理の結果を示す情報やデータや信号値や変数値が、メモリ９０３、補助記憶装置９０２、又は、プロセッサ９０１内のレジスタ又はキャッシュメモリにファイルとして記憶される。
【００４０】  「部」を「サーキットリー」で提供してもよい。  また、「部」を「回路」又は「工程」又は「手順」又は「処理」に読み替えてもよい。  「回路」及び「サーキットリー」は、プロセッサ９０１だけでなく、ロジックＩＣ又はＧＡ（Ｇａｔｅ  Ａｒｒａｙ）又はＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）又はＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）といった他の種類の処理回路をも包含する概念である。
【００４１】  なお、プログラムプロダクトと称されるものは、「部」として説明している機能を実現するプログラム配置プログラムが記録された記憶媒体、記憶装置などであり、見た目の形式に関わらず、コンピュータ読み取り可能なプログラムをロードしているものである。
【００４２】＊＊＊動作の説明＊＊＊  図６を用いて、本実施の形態に係るプログラム配置装置５００のプログラム配置方法、プログラム配置処理Ｓ１０について説明する。  上述したように、プログラム配置プログラムは、少なくとも１つのウェイを使用するキャッシュメモリ４０１に複数の関数を含むプログラム１０を配置するコンピュータであるプログラム配置装置５００に実行させるプログラムである。
【００４３】  取得処理Ｓ１において、取得部２１は、プログラム１０を実行することにより、複数の関数の各関数に含まれる命令コード３０１の呼び出し順３１を取得する取得処理Ｓ１を実行する。すなわち、プログラム実行部２０は、プログラム１０を実行し、命令トレース３０を抽出する。
【００４４】  仮想キャッシュメモリ生成処理Ｓ１ａにおいて、仮想キャッシュメモリ生成部６０１は、キャッシュメモリ４０１のウェイの数分の格納エリア４０３１を有する仮想キャッシュメモリ４０３を生成する仮想キャッシュメモリ生成処理Ｓ１ａを実行する。
【００４５】  シミュレーション処理Ｓ２において、シミュレータ部６０５は、仮想キャッシュメモリ４０３に対して命令コード３０１を呼び出し順３１に呼出命令コード４０３３として呼び出すシミュレーション処理Ｓ２を実行する。シミュレーション処理Ｓ２において、シミュレータ部６０５は、既に呼び出した呼出命令コード４０３３を再度呼び出した際に格納エリア４０３１に呼出命令コード以外の命令コードが格納されている競合が発生した場合、競合の情報を競合情報７０として取得する。すなわち、シミュレーション処理Ｓ２において、仮想キャッシュシミュレータ部６０が、命令トレース３０、キャッシュ構成情報４０及びプログラム情報５０に基づいて、競合情報７０を生成する。
【００４６】  配置位置決定処理Ｓ３において、配置位置決定部８０は、競合情報７０に基づいて、キャッシュメモリ４０１における複数の関数の各関数の配置位置８０１を決定する配置位置決定処理Ｓ３を実行する。すなわち、配置位置決定処理Ｓ３において、配置位置決定部８０が、キャッシュ構成情報４０、プログラム情報５０及び競合情報７０を入力とし、関数の配置位置８０１に関する関数配置情報９０を生成する。
【００４７】  最後に、関数配置処理Ｓ４において、関数配置部１００が、プログラム１０と関数配置情報９０とを入力として、関数をキャッシュメモリ４０１に配置する関数配置処理Ｓ４を実行し、最適化済プログラム１１０を出力する。
【００４８】  図７は、本実施の形態に係る仮想キャッシュシミュレーション処理Ｓ２００の動作を示すフロー図である。  仮想キャッシュシミュレーション処理は、仮想キャッシュメモリ生成処理Ｓ１ａ及びシミュレーション処理Ｓ２を備える。仮想キャッシュシミュレータ部６０は、命令トレース３０、キャッシュ構成情報４０及びプログラム情報５０の情報に基づいて、競合情報７０を生成する仮想キャッシュシミュレーション処理Ｓ２００を実行する。
【００４９】＜仮想キャッシュメモリ生成処理Ｓ１ａ＞  ステップＳ２００において、仮想キャッシュメモリ生成部６０１が、キャッシュ構成情報４０に基づいて、仮想キャッシュメモリ４０３を生成する仮想キャッシュメモリ生成処理Ｓ１ａを実行する。仮想キャッシュメモリ生成処理Ｓ１ａの詳細については後述する。仮想キャッシュデータ保持部６０２は、仮想キャッシュメモリ生成部６０１が構成する仮想キャッシュメモリ４０３にデータを保持する。
【００５０】＜シミュレーション処理Ｓ２＞  ステップＳ２０１において、命令トレース読出し部６０３は、命令トレース３０を最後まで読み出したか判断し、読み出していなければステップＳ２０２に遷移し、読み出していれば処理を終了する。
【００５１】  ステップＳ２０２において、命令トレース読出し部６０３が、命令トレース３０から命令アドレスを１つ取り出し、ステップＳ２０３に遷移する。  ステップＳ２０３において、命令トレース読出し部６０３が、取り出した命令アドレスが含まれるＩＣＢを求めるＩＣＢ取得処理Ｓ２０３を実行する。命令トレース読出し部６０３は、ＩＣＢ取得処理Ｓ２０３を実行した後、ステップＳ２０４に遷移する。
【００５２】  ステップＳ２０４において、競合情報生成部６０４が、ＩＣＢがキャッシュミスを起こすか判断する。競合情報生成部６０４は、キャッシュミスが発生すればステップＳ２０５に遷移し、発生しなければステップＳ２０６に遷移する。  ステップＳ２０５では、競合情報生成部６０４は、キャッシュミス発生時のＩＣＢの組み合わせ情報を競合ＩＣＢ７０２として、競合情報７０に登録し、ステップＳ２０６に遷移する。ステップＳ２０５の詳細は後述する。  ステップＳ２０６では、読み出したブロックに応じて、キャッシュの内容を更新し、ステップＳ２０１に戻る。仮想キャッシュシミュレータ部６０は、上記の処理をステップＳ２０１が真になるまで、すなわちステップＳ２０１においてＹＥＳになるまで続ける。
【００５３】＜仮想キャッシュメモリ生成処理Ｓ１ａの詳細説明＞  図８及び図９を用いて、仮想キャッシュメモリ生成処理Ｓ１ａについて説明する。  仮想キャッシュメモリ生成部６０１は、キャッシュ構成情報４０に基づいて、仮想キャッシュメモリ４０３の構成を変化させる。仮想キャッシュメモリ生成部６０１は、アドレスが連続する複数のエリア４０３９を生成する。複数のエリア４０３９は、ウェイの数分の実ウェイである格納エリア４０３１と、格納エリア４０３１の後ろに連続する複数の仮想ウェイである仮格納エリア４０３２とから構成される。
【００５４】  図８は、キャッシュメモリ４０１が、ダイレクトマップ方式、ウェイの数は１、セット数２、６４Ｂキャッシュライン、ＬＲＵ（Ｌｅａｓｔ  Ｒｅｃｅｎｔｌｙ  Ｕｓｅｄ）方式である場合の仮想キャッシュメモリ４０３の生成方法を示している。  図９は、キャッシュメモリ４０１が、２ウェイセットアソシアティブ方式、ウェイの数は２、セット数４、６４Ｂキャッシュライン、ＬＲＵ方式である場合の、仮想キャッシュメモリ４０３の生成方法を示している。  仮想キャッシュメモリ４０３は、キャッシュメモリ４０１のウェイ数及びセット数に関わらず、セット数１のＮウェイセットアソシアティブキャッシュとして構成される。ここでＮは、使用者が任意に設定できるパラメータであり、大きい値を設定するほど、多数のＩＣＢ間の相関性を観測することができる。
【００５５】  上記の通り、仮想キャッシュメモリ４０３はＮウェイとして構成されるが、キャッシュメモリ４０１の構成によって、シミュレーションを実行する際のキャッシュミスを判定するタイミングが異なる。すなわち、仮想キャッシュメモリ生成処理Ｓ１ａでは、キャッシュメモリ４０１のウェイの数分を格納エリア４０３１、すなわち実ウェイとして扱い、残りのウェイを仮格納エリア４０３２、すなわち仮想ウェイとして扱う。
【００５６】  図８の例では、実ウェイが１、仮想ウェイがＮ−１となる。図９の例では、実ウェイが２、仮想ウェイがＮ−２となる。アクセスしたいデータが、仮想ウェイに入っていたとしても、実ウェイに入っていなければ、競合情報生成部６０４はキャッシュミスが発生したものとして扱う。上記の通り、仮想キャッシュメモリ４０３を構成することで、キャッシュメモリ４０１では観測することができない、キャッッシュミス発生タイミングでの、ＩＣＢ間の相関性を検出する。仮想キャッシュメモリ４０３のキャッシュラインサイズ及び置換アルゴリズムは、キャッシュメモリ４０１と同様である。
【００５７】＜ＩＣＢ取得処理Ｓ２０３＞  ステップＳ２０３における命令アドレスが含まれるＩＣＢを求めるＩＣＢ取得処理Ｓ２０３について補足する。  命令アドレスが含まれるＩＣＢを求めるためには、関数をどのようにＩＣＢへ分割するかを選択する必要がある。手法としては、図１０に示す関数の先頭からＩＣＢのサイズで分割する方法と、図１１に示す関数が含まれるキャッシュラインの先頭から分割する方法とがある。
【００５８】  図１０及び図１１は、関数Ａと関数Ｂとが連続したメモリ領域に配置された場合の、セット数８のキャッシュメモリ上の配置状況を示している。関数Ａはセット０からセット３に配置され、関数Ｂはセット３からセット７に配置されている。ある関数のＩＣＢを表現する際には、関数のラベルに、その関数におけるＩＣＢの通し番号を付加した形式を使用する。ここでは、関数のラベルＡ及びＢに、その関数におけるＩＣＢの通し番号０，１，２，３が付加されている。
【００５９】  図１０に示す手法では、関数の先頭からＩＣＢへ分割する。関数ＡはＡ０からＡ３までのように分割され、関数ＢはＢ０からＢ３のように分割される。このように、図１０に示す手法では実際のキャッシュ配置は考慮せず、関数の先頭を基準に分割を行う。
【００６０】  一方、図１１に示す手法では、ＩＣＢへの分割は、実際のメモリ配置を考慮した上で、キャッシュライン単位で行う。関数Ａのセット０からセット２の命令コードは、Ａ０、Ａ１、Ａ２にそれぞれ分割される。関数Ａのセット３のように、他の関数Ｂと共有している場合は、自分の関数に属する命令コードのみをＩＣＢとして分割する。つまり、Ａ３の内容の内、前半分は関数Ａの命令コードで、残りの半分は何も入っていないものとする。  また、関数Ｂのセット３は、キャッシュラインの先頭ではなく、真ん中から始まっている。このような場合であっても、関数Ｂの先頭からではなく、セット３のキャッシュラインの先頭からＩＣＢへの分割を実行する。つまり、Ｂ０の前半分は何も入っておらず、残りの半分に関数Ｂの命令コードが入っているものとする。  上記の通り、メモリ配置を考慮したＩＣＢの分割を実行することにより、実際のプログラム動作通りの、正確な競合キャッシュミス発生状況を記録することができる。そのため、本実施の形態では、図１１に示す手法を採用する。
【００６１】＜競合情報登録処理Ｓ２０５＞  ＩＣＢの組み合わせ情報を競合情報７０に登録する競合情報登録処理Ｓ２０５について図１２から図１４を用いて説明する。  ここでは、命令トレース３０より、図３のようなＩＣＢの実行系列３０３が得られている場合を考える。  図１２は、１回目の呼出命令コード４０３３であるＣ０を参照したタイミングでの、実ウェイ数１の仮想キャッシュメモリ４０３の内容を示している。１回目のＣ０を参照したタイミングでは、実ウェイにＣ０は無いため、キャッシュミスが発生する。仮想ウェイにもＣ０は存在しないため、１回目のＣ０への参照は初期参照ミスであることが分かる。初期参照ミスの場合、競合情報７０への情報の記録は行わない。
【００６２】  図１３は、２回目の呼出命令コード４０３３であるＢ０を参照したタイミングでの、実ウェイ数１の仮想キャッシュメモリの内容を示している。２回目のＢ０を参照したタイミングでは、実ウェイにＢ０は無いため、キャッシュミスが発生する。一方、仮想ウェイにはＢ０が存在するため、２回目のＢ０への参照は競合キャッシュミス、すなわち競合が発生したとして扱う。仮想ウェイに存在する呼出命令コード４０３３であるＢ０より左側にあるすべてのＩＣＢと呼出命令コード４０３３であるＢ０とを競合ＩＣＢ７０２として、競合情報７０に登録する。すなわち、シミュレータ部６０５は、仮想ウェイに存在する呼出命令コード４０３３であるＢ０より前のエリアにある全てのＩＣＢとＢ０とを競合ＩＣＢ７０２として、競合情報７０に登録する。
【００６３】  競合情報生成部６０４は、まずＢ０に対応する競合ミスデータレコード７１に、Ｂ０及びＣ０の組み合わせによる自ＩＣＢの競合キャッシュミスとして記録する。競合情報生成部６０４は、次に競合ＩＣＢであるＣ０の競合ミスデータレコード７１に、Ｂ０及びＣ０の組み合わせによる他ＩＣＢの競合キャッシュミスとして記録する。競合ＩＣＢが他にもあった場合は、上記Ｃ０と同様に処理を実行する。２回目のＢ０参照後の競合情報７０は図１４のようになる。上記の通り、競合情報７０に記録する際には、自ＩＣＢ参照時に発生する競合キャッシュミスだけでなく、他ＩＣＢに影響して発生する競合キャッシュミスの回数も記録する。
【００６４】  図１５から図１７を用いて、競合情報登録処理Ｓ２０５の動作について説明する。  図１５を用いて、競合情報登録処理Ｓ２０５の全体処理フローについて説明する。  ステップＳ２０５０において、競合情報生成部６０４は、自ＩＣＢを競合情報７０に登録する。  ステップＳ２０５１において、競合情報生成部６０４は、競合ＩＣＢの内、自ＩＣＢ以外の他ＩＣＢを競合情報７０に登録する。
【００６５】＜ステップＳ２０５０自ＩＣＢの登録処理の詳細説明＞  図１６を用いて、図１５のステップＳ２０５０の詳細処理フローについて説明する。  ステップＳ２０５０００において、競合情報生成部６０４は、自ＩＣＢが競合情報７０に存在するか判断する。競合情報生成部６０４は、存在する場合は、ステップＳ２０５００１に遷移し、存在しない場合はステップＳ２０５００２に遷移する。  ステップＳ２０５００１において、競合情報生成部６０４は、自ＩＣＢの競合ミスデータレコード７１を取り出し、ステップＳ２０５００５に遷移する。
【００６６】  ステップＳ２０５００２では、競合情報生成部６０４は、自ＩＣＢの競合ミスデータレコード７１を生成し、ステップＳ２０５００３に遷移する。  ステップＳ２０５００３において、ＩＣＢ名７２に自ＩＣＢ名を設定し、ステップＳ２０５００４に遷移する。  ステップＳ２０５００４で、自ＩＣＢとしての合計ミス数７３を１に、他ＩＣＢとしての合計ミス数７４を０に初期化し、ステップＳ２０５００７に遷移する。
【００６７】  ステップＳ２０５００５において、競合情報生成部６０４は、登録する競合ＩＣＢの組み合わせの記録、すなわち競合ミスエントリ７５が既に存在するか確認する。競合情報生成部６０４は、存在する場合は、ステップＳ２０５００６に遷移し、存在しない場合はステップＳ２０５００７に遷移する。  ステップＳ２０５００６で、競合情報生成部６０４は、自ＩＣＢとしての合計ミス数７３の値を１増加させ、ステップＳ２０５０１１に遷移する。
【００６８】  ステップＳ２０５００７において、競合情報生成部６０４は、競合ミスエントリ７５を生成後、生成した競合ミスエントリ７５を競合ミスデータレコード７１に追加し、ステップＳ２０５００８に遷移する。  ステップＳ２０５００８において、競合情報生成部６０４は、処理対象のキャッシュミスに対して、新しいミスＩＤ７６を割り振り、ステップＳ２０５００９に遷移する。  ステップＳ２０５００９において、競合情報生成部６０４は、処理対象のキャッシュミスの競合ＩＣＢ数を、競合ＩＣＢ数７７に設定し、ステップＳ２０５０１０に遷移する。  ステップＳ２０５０１０で、競合情報生成部６０４は、競合ＩＣＢごとのミス数７８において、競合ＩＣＢの値を０に初期化し、ステップＳ２０５０１１に遷移する。
【００６９】  ステップＳ２０５０１１において、競合情報生成部６０４は、競合ＩＣＢごとのミス数７８において、自ＩＣＢの値を１増加させ、処理を終了する。
【００７０】＜ステップＳ２０５１他ＩＣＢの登録処理の詳細説明＞  図１７を用いて、図１５のステップＳ２０５１の詳細処理フローについて説明する。  ステップＳ２０５１００において、競合情報生成部６０４は、未処理の競合ＩＣＢが存在するか判断する。競合情報生成部６０４は、存在する場合は、ステップＳ２０５１０１に遷移し、存在しない場合は終了する。
【００７１】  ステップＳ２０５１０１において、競合情報生成部６０４は、未処理の競合ＩＣＢから１つ選択し、ステップＳ２０５１０２に遷移する。  ステップＳ２０５１０２において、競合情報生成部６０４は、処理対象の競合ＩＣＢが競合情報７０に存在するか判断する。競合情報生成部６０４は、存在すれば、ステップＳ２０５１０３に遷移し、存在しなければ、ステップＳ２０５１０４に遷移する。
【００７２】  ステップＳ２０５１０３において、競合情報生成部６０４は、処理対象の競合ＩＣＢの競合ミスデータレコード７１を取り出し、ステップＳ２０５１０７に遷移する。
【００７３】  ステップＳ２０５１０４において、競合情報生成部６０４は、処理対象の競合ＩＣＢの競合ミスデータレコード７１を生成し、ステップＳ２０５１０５に遷移する。  ステップＳ２０５１０５において、競合情報生成部６０４は、ＩＣＢ名７２に処理対象の競合ＩＣＢ名を設定し、ステップＳ２０５１０６に遷移する。  ステップＳ２０５１０６において、競合情報生成部６０４は、自ＩＣＢとしての合計ミス数７３を０に、他ＩＣＢとしての合計ミス数７４を１に初期化し、ステップＳ２０５１０９に遷移する。
【００７４】  ステップＳ２０５１０７において、競合情報生成部６０４は、登録する競合ＩＣＢの組み合わせの記録、すなわち、競合ミスエントリ７５が既に存在するか確認する。存在する場合は、ステップＳ２０５１０８に遷移し、存在しない場合はステップＳ２０５１０９に遷移する。  ステップＳ２０５１０８において、競合情報生成部６０４は、他ＩＣＢとしての合計ミス数７４の値を１増加させ、ステップＳ２０５１１２に遷移する。
【００７５】  ステップＳ２０５１０９において、競合情報生成部６０４は、競合ミスエントリ７５を生成後、生成した競合ミスエントリ７５を競合ミスデータレコード７１に追加し、ステップＳ２０５１１０に遷移する。  ステップＳ２０５１１０において、競合情報生成部６０４は、処理対象のキャッシュミスに対して、新しいミスＩＤ７６を割り振り、ステップＳ２０５１１１に遷移する。  ステップＳ２０５１１１において、競合情報生成部６０４は、処理対象のキャッシュミスの競合ＩＣＢ数を、競合ＩＣＢ数７７に設定し、ステップＳ２０５１１２に遷移する。  ステップＳ２０５１１２において、競合情報生成部６０４は、競合ＩＣＢごとのミス数７８において、競合ＩＣＢの値を０に初期化し、ステップＳ２０５１１３に遷移する。
【００７６】  ステップＳ２０５１１３において、競合情報生成部６０４は、競合ＩＣＢごとのミス数７８において、自ＩＣＢの値を１増加させ、ステップＳ２０５１００に戻る。  競合情報生成部６０４は、上記の処理をステップＳ２０５１００が偽、すなわちステップＳ２０５１００においてＮＯになるまで続ける。
【００７７】＜ステップＳ２０６キャッシュ内容の更新処理の詳細説明＞  次に、図７のステップＳ２０６における、キャッシュ内容の更新処理について図１８及び図１９を用いて説明する。  ステップＳ２０６では、仮想キャッシュシミュレータ部６０は、キャッシュ構成情報４０に設定された置換アルゴリズムに基づいて、仮想キャッシュメモリ４０３におけるＩＣＢの置換を実行する。仮想キャッシュメモリ４０３では、置換対象となるＩＣＢは最も右側に配置される。ＬＲＵ方式では、数字の小さいウェイに存在するＩＣＢほど、最近にアクセスされたことを示す。
【００７８】  図１８及び図１９ではＬＲＵ方式でキャッシュの内容を置き換える様子を示している。  図１８では、Ｃ０の参照時にＣ０が仮想キャッシュメモリ４０３上に存在しないため、仮想キャッシュシミュレータ部６０は、仮想キャッシュメモリ４０３上に存在する全てのＩＣＢを右に１ウェイ分ずらし、ウェイ０、すなわち実ウェイ０にＣ０を保存する。言い換えると、仮想キャッシュシミュレータ部６０は、仮想キャッシュメモリ４０３上に存在する全てのＩＣＢを後ろに１エリア分ずらし、仮想キャッシュメモリ４０３の先頭の実ウェイにＣ０を保存する。
【００７９】  図１９では、Ｂ０の参照時にＢ０が仮想キャッシュメモリ４０３上に存在するため、仮想キャッシュシミュレータ部６０は、仮想ウェイ１に存在したＢ０を実ウェイ０に移動し、Ｂ０より左側にあった全てのＩＣＢを右に１ウェイ分ずらしている。図１９では、Ｂ０より左側にあったＩＣＢはＣ０のみであるため、仮想キャッシュシミュレータ部６０は、Ｃ０を右に１ウェイ分ずらしている。言い換えると、仮想キャッシュシミュレータ部６０は、競合ＩＣＢ７０２を取得した後に、呼出命令コード４０３３であるＢ０より前のエリアに格納されている全てのＩＣＢをそれぞれ１つ後ろのエリアに移動する。そして、仮想キャッシュシミュレータ部６０は、Ｂ０を仮想キャッシュメモリ４０３の先頭の実ウェイに格納する。
【００８０】  キャッシュメモリ４０１で置換を行う場合、ウェイ間の置換は起こらず、置換対象を表すビットを有効にする処理を行うが、仮想キャッシュメモリ４０３では、あるＩＣＢの２回の参照の間に参照されたＩＣＢを検出する必要があるため、このような更新処理を行う。
【００８１】＜配置位置決定処理Ｓ３＞  図２０は、本実施の形態に係る配置位置決定処理Ｓ３の動作を示すフロー図である。  配置位置決定部８０が、競合情報７０に基づいて、関数配置情報９０を出力する。  まず、ステップＳ３００において、配置位置決定部８０は、関数を配置する優先順位を決定する。配置位置決定部８０は、ルール１３１に基づいて、関数を配置する順番を決定する。
【００８２】  図２１を用いて、ルール１３１を説明する。図２１は、ルール１３１の一例であり、ルール１３１は図２１以外でもよい。  ルール１３１には、ルール１からルール４まで設定されている。配置位置決定部８０は、数字の小さいルールから適用し、複数の関数で同じ値となる場合は、次のルールを適用する。
【００８３】  まず、配置位置決定部８０は、ルール１に従って、複数の関数の各関数について、関数に属する、各ＩＣＢの他ＩＣＢとしての合計ミス数７４の総和が大きい順に優先順位をつける。競合ミスを起こすかどうかは、既配置の関数との関係で決まるため、配置位置決定部８０は、他ＩＣＢに影響を及ぼす可能性の高い関数から配置していく。  次に、配置位置決定部８０は、ルール１で同じ値となった関数同士では、ルール２を適用し、関数に属する、各ＩＣＢの競合ＩＣＢの種類数で優先順位をつける。ルール２は、他ＩＣＢで発生する競合ミス数が同じであっても、より多くの他ＩＣＢに対して影響を及ぼす関数を、優先的に配置するために適用される。  配置位置決定部８０は、ルール２でも優劣がつかない場合、ルール３を適用し、関数に属する、各ＩＣＢの自ＩＣＢとしての合計ミス数７３の総和で判断する。最後に、配置位置決定部８０は、ルール４の関数のサイズで優劣をつける。ルール４でも優先順位が決まらない場合は、配置位置決定部８０は、任意で配置する関数を選択する。
【００８４】  ステップＳ３０１において、配置位置決定部８０は、全関数を配置したかどうか判断し、配置していなければステップＳ３０２に遷移し、配置していればステップＳ３０５に遷移する。  ステップＳ３０２において、配置位置決定部８０は、未配置の関数の内、優先順位の高い関数を１つ取り出す。  ステップＳ３０３において、取り出した処理対象の関数をセット０から最後のセットまで動かし、全ての配置方法において、既配置の関数と引き起こす競合キャッシュミス発生回数を計算し、最小のミス数となる場所を求める。ステップＳ３０３の詳細は後述する。  ステップＳ３０４において、配置位置決定部８０は、最小の競合キャッシュミス発生回数を示す場所に配置を決定し、ステップＳ３０１に遷移する。上記の処理をステップＳ３０１が真になるまで、すなわちステップＳ３０１でＹＥＳとなるまで続ける。  ステップＳ３０５において、配置位置決定部８０は、上記の配置結果をまとめ、関数配置情報９０を出力する。
【００８５】＜ステップＳ３０３既配置関数との競合ミス数の計算処理＞  図２２を用いて、ステップＳ３０３の既配置関数とのミス数の計算処理について説明する。  ステップＳ３０３００において、配置位置決定部８０は、配置対象の関数である配置対象関数をまだ配置していない場所にセットし、ステップＳ３０３０１に遷移する。  ステップＳ３０３０１において、配置位置決定部８０は、ミス数を格納する一時変数を０に初期化し、ステップＳ３０３０２に遷移する。  ステップＳ３０３０２において、配置位置決定部８０は、配置対象関数に含まれるＩＣＢの内、まだキャッシュミス数を計算していないＩＣＢを取り出し、ステップＳ３０３０３に遷移する。
【００８６】  ステップＳ３０３０３で、取り出した処理対象のＩＣＢが競合情報７０に存在するか調べ、存在すればステップＳ３０３０４に遷移し、存在しなければステップＳ３０３１０に遷移する。  ステップＳ３０３０４で、配置位置決定部８０は、取り出した処理対象のＩＣＢの競合ミスデータレコード７１を取り出し、ステップＳ３０３０５に遷移する。  ステップＳ３０３０５で、配置位置決定部８０は、未調査の競合ミスエントリ７５を１つ取り出し、ステップＳ３０３０６に遷移する。  ステップＳ３０３０６で、配置位置決定部８０は、競合ミスエントリ７５に含まれる競合ＩＣＢの内、既配置の競合ＩＣＢ数を調べ、ステップＳ３０３０７に遷移する。
【００８７】  ステップＳ３０３０７で、配置位置決定部８０は、既配置の競合ＩＣＢ数＋１が、キャッシュ構成情報４０に記述されたウェイ数より大きい、すなわちキャッシュミスが発生する場合、ステップＳ３０３０８に遷移する。配置位置決定部８０は、既配置の競合ＩＣＢ数＋１が、キャッシュ構成情報４０に記述されたウェイ数以下である、すなわちキャッシュミスが発生しない場合、ステップＳ３０３０９に遷移する。
【００８８】  ステップＳ３０３０８で、配置位置決定部８０は、競合ミスエントリ７５に含まれる競合ＩＣＢごとのミス数７８を合計し、ミス数の一時変数に加算し、ステップＳ３０３０９に遷移する。  ステップＳ３０３０９で、配置位置決定部８０は、処理対象のＩＣＢに含まれる全ての競合ミスエントリ７５を調べたか判断する。配置位置決定部８０は、全て調べている場合、ステップＳ３０３１０に遷移し、調べていない競合ミスエントリ７５がある場合はステップＳ３０３０５に戻る。
【００８９】  ステップＳ３０３１０で、配置位置決定部８０は、配置対象関数に含まれる全てのＩＣＢを調べたかどうか判断する。配置位置決定部８０は、調べた場合、ステップＳ３０３１１に遷移し、そうでない場合、ステップＳ３０３０２に戻る。  ステップＳ３０３１１で、配置位置決定部８０は、ミス数の一時変数の値が、現在の最小ミス数より小さい場合、ステップＳ３０３１２に遷移し、そうでない場合、ステップＳ３０３１３に遷移する。  ステップＳ３０３１２で、配置位置決定部８０は、最小ミス数と最小配置を更新し、ステップＳ３０３１３に遷移する。  ステップＳ３０３１３で、配置位置決定部８０は、配置対象関数において、全ての配置を試したか判断し、試した場合は終了し、そうでない場合はステップＳ３０３００に戻る。
【００９０】  配置位置決定部８０は、ステップＳ３０３１３が真となるまで、すなわちステップＳ３０３１３でＹＥＳとなるまで、上記処理を繰り返す。ステップＳ３０３１３でＹＥＳになることは、配置対象関数において全ての配置を試したことを意味する。
【００９１】  次に、具体例を用いて配置位置決定処理Ｓ３について、詳細に説明する。  命令トレース３０より、図３のようなＩＣＢの実行系列３０３が得られている場合に、セット数２のダイレクトマップキャッシュへの配置を考える。関数はＡ、Ｂ、Ｃの三種類であり、全ての関数は１つのＩＣＢ以内のサイズであるとする。図３の実行系列から競合情報７０を生成すると、図４のような結果となる。
【００９２】  配置位置決定部８０による、具体的な処理について、図２０のステップＳ３の詳細処理フローを用いて、以下で説明する。  ステップＳ３００で、ルール１３１と競合情報７０とから、関数の優先順位が計算され、関数Ｃ、関数Ｂ、関数Ａの順番で配置していくことが決定される。
【００９３】  ステップＳ３０２において、まず関数Ｃが取り出される。関数Ｃは最初の関数であるため、セット０に配置される。続いて、ステップＳ３０２で、関数Ｂが取り出される。  ステップＳ３０３において、関数Ｂをセット０から最後のセットまで配置をためし、既配置関数との間で起こる競合ミス数の内、最小のミス数となる場所を求める。  図２３に、関数Ｂをセット０に配置した場合の、キャッシュミス発生回数の計算結果を示す。関数Ｂがセット０に配置される場合の、Ｃ０との間で起こすキャッシュミスが計算される。計算の結果、ＣＭ（Ｂ０，Ｃ０）が４と求まる。ここでＣＭ（Ｘ，Ｙ）は、カッコ内で指定されたＩＣＢが、同じセットに配置された場合のキャッシュミス数を表すものとする。よって、ＣＭ（Ｂ０，Ｃ０）は、Ｂ０，Ｃ０が同じセットに配置された場合のキャッシュミス数である。  図２４に、関数Ｂをセット１に配置した場合の、キャッシュミス発生回数の計算結果を示す。関数Ｂがセット１に配置される場合、ＣＭ（Ｂ０）＝０と求まる。  以上の結果、ステップＳ３０４において、関数Ｂはセット１に配置される。
【００９４】  最後に関数Ａが取り出され、同様にキャッシュミス数の計算が実行される。  ステップＳ３０３において、関数Ａをセット０から最後のセットまで配置をためし、既配置関数との間で起こる競合ミス数の内、最小のミス数となる場所を求める。  図２５に、関数Ａをセット０に配置した場合の、キャッシュミス発生回数の計算結果を示す。関数Ａがセット０に配置される場合の、Ｃ０との間で起こすキャッシュミスが計算される。計算の結果、ＣＭ（Ａ０，Ｃ０）＝３＋２＝５と求まる。ＣＭ（Ａ０，Ｃ０）は、Ａ０，Ｃ０が同じセットに配置された場合のキャッシュミス数である。  図２６に、関数Ａをセット１に配置した場合の、キャッシュミス発生回数の計算結果を示す。関数Ａがセット１に配置される場合、ＣＭ（Ａ０，Ｂ０）＝２＋１＝３と求まる。  以上の結果、ステップＳ３０４において、関数Ａはセット１に配置される。
【００９５】  関数Ａの配置後、全関数の配置が終了するため、ステップＳ３０１が真となり、ステップＳ３０５に遷移する。  ステップＳ３０５において、関数Ｃをセット０に格納されるアドレス、関数Ｂと関数Ａをセット１に格納されるアドレスにそれぞれ配置されるものとして、関数配置情報９０が出力される。
【００９６】＊＊＊効果の説明＊＊＊  本実施の形態に係るプログラム配置装置５００は、命令トレースを入力とし、関数間の競合情報を抽出する仮想キャッシュシミュレータ部を備える。また、各ＩＣＢの競合情報を保持する競合ミスデータベースを備え、競合ミスデータベースに基づいて、競合ミスを抑制する関数配置を算出する配置位置決定部を備える。プログラム配置装置５００は、関数をキャッシュラインサイズのＩＣＢに分割し、競合ミス発生時のＩＣＢの組み合わせ情報の抽出を行い、その情報に基づいて関数を配置する。よって、プログラム配置装置５００によれば、競合ミスを抑制する配置を決定することができる。
【００９７】  本実施の形態に係るプログラム配置装置５００は、仮想キャッシュシミュレータ部において、実キャッシュメモリの構成に関わらず、セット数を１に設定し、全てのＩＣＢが同じキャッシュ領域を使用するものとして、シミュレーションを実行する。よって、プログラム配置装置５００によれば、競合ミス発生時に、相関関係のあるＩＣＢの組み合わせ情報を抽出することができる。
【００９８】  本実施の形態に係るプログラム配置装置５００は、競合ミスデータベースにおいて、競合ミス発生時に、相関関係のあるＩＣＢの組み合わせごとに、競合ミス発生回数を記録する。よって、プログラム配置装置５００によれば、最適配置探索処理、すなわち配置位置決定処理において、正確な競合ミス発生回数を計算することができる。
【００９９】  本実施の形態に係るプログラム配置装置５００は、最適配置探索部、すなわち配置位置決定部は、各関数が原因となり、自分以外の関数の競合ミスを発生させている回数を、競合ミスデータベースに基づいて算出する。そして、配置位置決定部は、算出した競合ミス回数の多い関数から順番にメモリ領域に配置する。よって、プログラム配置装置５００によれば、正確な最適配置を探索できる。
【０１００】  以上のように、本実施の形態に係るプログラム配置装置５００によれば、仮想キャッシュシミュレータ部が、命令トレースにおける、各関数ブロックの相関性を競合情報として保存する。そして、競合情報に基づいて、配置位置決定部にて、競合キャッシュミス数が最小となる関数配置を決定するため、より正確な関数配置情報を出力することができる。
【０１０１】  実施の形態２．  本実施の形態では、主に、実施の形態１と異なる点について説明する。  実施の形態１で説明した構成と同様の構成については同一の符号を付し、その説明を省略する場合がある。
【０１０２】  実施の形態１では、配置位置決定部８０は、優先順位の高い関数からメモリ空間に配置し、関数配置情報９０を出力する。しかし、配置する関数の順番やサイズによっては、メモリ使用効率が悪くなる場合がある。
【０１０３】  図２７に示す関数配置情報９０が出力された場合を考える。  図２７では、最初の関数の先頭から、最後の関数の最後尾までの領域の内、有効な関数の命令で埋まっている割合は約６９％となる。メモリ容量の増大は、コストの増加につながるため、メモリ効率を向上させることが重要である。  そこで、本実施の形態では、メモリ使用効率を向上させる方式について説明する。
【０１０４】＊＊＊構成の説明＊＊＊  図２８は、本実施の形態２に係るプログラム配置装置５００ａを示すブロック構成図である。  本実施の形態のプログラム配置装置５００ａは、図１の構成に加え、関数配置調整部１２０を有する。  関数配置調整部１２０は、配置位置決定部８０により決定された複数の関数の各関数の配置位置８０１に基づいて、複数の関数の各関数を配置位置８０１とは異なる再配置位置８０２に並び替える。複数の関数の各関数が再配置位置８０２に配置された場合のキャッシュメモリ４０１の空き領域４０１５は、複数の関数の各関数が配置位置８０１に配置された場合のキャッシュメモリ４０１の空き領域４０１６よりも少ない。
【０１０５】  関数配置調整部１２０は、プログラム情報５０、関数配置情報９０を入力とし、メモリ使用効率を向上させた関数配置情報９０ａを出力する。関数配置情報９０は、複数の関数の各関数が配置位置８０１に配置される情報である。関数配置情報９０ａは、複数の関数の各関数が再配置位置８０２に配置される情報である。
【０１０６】  なお、各機能ブロックは１つあるいは複数のプログラムとして実装されていてもよいし、複数の機能ブロックが１つのプログラムとして実装されていてもよい。
【０１０７】＊＊＊動作の説明＊＊＊  図２９を用いて、本実施の形態に係るプログラム配置装置５００ａのプログラム配置方法、プログラム配置処理Ｓ１０ａについて説明する。
【０１０８】  図２９のステップＳ１，Ｓ１ａ，Ｓ２，Ｓ３は実施の形態１と同様である。  ステップＳ５において、関数配置調整部１２０は、プログラム情報５０、関数配置情報９０に基づいて、メモリ使用効率を向上させた関数配置情報９０ａを生成する。
【０１０９】  図３０を用いて、本実施の形態に係る関数配置調整処理Ｓ５について説明する。  まず、ステップＳ５００において、関数配置調整部１２０は、メモリアドレスを関数が配置されるメモリ空間の先頭に初期化し、ステップＳ５０１に遷移する。  ステップＳ５０１において、関数配置調整部１２０は、全関数を配置したかどうか確認する。配置していなければ、ステップＳ５０２に遷移し、配置していればステップＳ５０６に遷移する。  ステップＳ５０２において、関数配置調整部１２０は、未配置の関数の内、現在のメモリアドレスが示す、ブロックアドレスとブロックオフセットで始まる関数が存在するか確認する。存在すればステップＳ５０３に遷移し、存在しなければステップＳ５０５に遷移する。  ステップＳ５０３において、関数配置調整部１２０は、未配置の関数の内、現在のメモリアドレスが示す、ブロックアドレスとブロックオフセットを満たす関数を、関数配置情報９０から一つ取り出し、現在のメモリアドレスに配置する。配置後、ステップＳ５０４に遷移する。  ステップＳ５０４において、関数配置調整部１２０は、処理対象の関数のサイズ分、メモリアドレスを進める。  ステップＳ５０５において、関数配置調整部１２０は、ブロックオフセット１つ分、メモリアドレスを進める。  ステップＳ５０６において、関数配置調整部１２０は、現在の配置情報を関数配置情報９０として出力し、処理を終了する。
【０１１０】  次に、具体例を用いて関数配置調整処理Ｓ５について、詳細に説明する。  図２７に示す関数配置情報９０に対して、関数配置調整処理Ｓ５を実行した場合について説明する。関数配置情報９０に対して、関数配置調整処理Ｓ５を実行した結果を図３１の関数配置情報９０ａとする。  この具体例では、メモリ空間の先頭を０、ブロック内の命令数は２とする。  まず、関数配置調整部１２０は、メモリアドレス、ブロックアドレス、ブロックオフセットを関数が配置されるメモリ空間の先頭に初期化する。このとき、メモリアドレス０、ブロックアドレス０、ブロックオフセット０となる。
【０１１１】  次に、関数配置調整部１２０は、未配置の関数のうち、ブロックアドレス０、ブロックオフセット０を満たす関数Ａを、メモリアドレス０に配置する。そして、関数配置調整部１２０は、メモリアドレスに関数Ａのサイズ５を加算し、メモリアドレス５、ブロックアドレス２、ブロックオフセット１とする。
【０１１２】  次に、関数配置調整部１２０は、ブロックアドレス２、ブロックオフセット１を満たす関数Ｅを取り出し、メモリアドレス５に配置する。配置後、関数配置調整部１２０は、メモリアドレスに、関数Ｅのサイズ６を加算し、メモリアドレス１１、ブロックアドレス５、ブロックオフセット１とする。
【０１１３】  次のブロックアドレス５、ブロックオフセット１を満たす関数は存在しないため、関数配置調整部１２０がメモリアドレスをブロックオフセット１進めると、メモリアドレス１２、ブロックアドレス６、ブロックオフセット２となる。続いて、同じように処理を進めることにより、関数Ｄ、関数Ｃ、関数Ｇ、関数Ｆ、関数Ｂの順番で関数が配置される。  以上のように、関数配置調整処理Ｓ５の結果として、最初の関数の先頭から、最後の関数の最後尾までの領域の内、有効な関数の命令で埋まっている割合は９８％となる。
【０１１４】＊＊＊効果の説明＊＊＊  本実施の形態に係るプログラム配置装置５００ａは、配置位置決定部が出力した関数配置情報９０に基づいて、関数配置の並び替えを行う関数配置調整部を備える。そして、プログラム配置装置５００ａはでは、関数配置情報９０に従って配置した場合のメモリの空き領域よりもメモリの空き領域が少なくなるように、関数の並び替えを実行する。  以上のように、本実施の形態に係るプログラム配置装置５００ａによれば、配置位置決定部が出力する関数配置情報９０に基づいて、関数配置調整部１２０が、関数の並び替えを実行することで、メモリの使用効率を向上することができる。
【０１１５】  上記の実施の形態では、「取得部」、「配置位置決定部」、「関数配置部」、「命令トレース読出し部」、「仮想キャッシュメモリ生成部」、「仮想キャッシュデータ保持部」、「競合情報生成部」、「関数配置調整部」がそれぞれ独立した機能ブロックであった。しかし、プログラム配置装置は上記のような構成でなくてもよく、プログラム配置装置の構成は任意である。「取得部」、「配置位置決定部」、「関数配置部」、「関数配置調整部」をひとつの機能ブロックで実現してもよい。また、「命令トレース読出し部」、「仮想キャッシュメモリ生成部」、「仮想キャッシュデータ保持部」、「競合情報生成部」を１つの機能ブロックで実現してもよい。
【０１１６】  また、プログラム配置装置は、１つの装置でなく、複数の装置から構成されたプログラム配置システムでもよい。プログラム配置装置の機能ブロックは、実施の形態に記載した機能を実現することができれば、任意である。これらの機能ブロックを、他のどのような組み合わせでプログラム配置装置を構成しても構わない。
【０１１７】  以上、実施の形態１，２について説明したが、これらの２つの実施の形態のうち、１つの実施の形態を部分的に実施しても構わない。あるいは、これらの２つの実施の形態のうち、複数を部分的に組み合わせて実施しても構わない。その他、これらの２つの実施の形態を、全体としてあるいは部分的に、どのように組み合わせて実施しても構わない。  なお、上記の実施の形態は、本質的に好ましい例示であって、本発明、その適用物や用途の範囲を制限することを意図するものではなく、必要に応じて種々の変更が可能である。
【符号の説明】
【０１１８】  １０  プログラム、２０  プログラム実行部、２１  取得部、３０  命令トレース、３１  呼び出し順、４０  キャッシュ構成情報、５０  プログラム情報、６０  仮想キャッシュシミュレータ部、７０  競合情報、７１  競合ミスデータレコード、７２  ＩＣＢ名、７３  自ＩＣＢとしての合計ミス数、７４  他ＩＣＢとしての合計ミス数、７５  競合ミスエントリ、７６  ミスＩＤ、７７  競合ＩＣＢ数、７８  競合ＩＣＢごとのミス数、８０  配置位置決定部、９０，９０ａ  関数配置情報、１００  関数配置部、１１０  最適化済プログラム、１２０  関数配置調整部、１３０  優先順位テーブル、１３１  ルール、３０１  命令コード、３０３  ＩＣＢの実行系列、４０１  キャッシュメモリ、４０３  仮想キャッシュメモリ、６０１  仮想キャッシュメモリ生成部、６０２  仮想キャッシュデータ保持部、６０３  命令トレース読出し部、６０４  競合情報生成部、６０５  シミュレータ部、７０１  競合命令コード組、７０２  競合ＩＣＢ、７０３  競合回数、８０１  配置位置、８０２  再配置位置、５００，５００ａ  プログラム配置装置、９０１  プロセッサ、９０２  補助記憶装置、９０３  メモリ、９０４  通信装置、９０５  入力インタフェース、９０６  ディスプレイインタフェース、９０７  入力装置、９０８  ディスプレイ、９１０  信号線、９１１，９１２  ケーブル、９４０１  レシーバー、９４０２  トランスミッター、４０１５，４０１６  空き領域、４０３１  格納エリア、４０３２  仮格納エリア、４０３３  呼出命令コード、４０３９  複数のエリア、Ｓ１  取得処理、Ｓ１ａ  仮想キャッシュメモリ生成処理、Ｓ２  シミュレーション処理、Ｓ３  配置位置決定処理、Ｓ４  関数配置処理、Ｓ５  関数配置調整処理、Ｓ１０，Ｓ１０ａ  プログラム配置処理。
【図１】
2016113869.tif 000003
【図２】
2016113869.tif 000004
【図３】
2016113869.tif 000005
【図４】
2016113869.tif 000006
【図５】
2016113869.tif 000007
【図６】
2016113869.tif 000008
【図７】
2016113869.tif 000009
【図８】
2016113869.tif 000010
【図９】
2016113869.tif 000011
【図１０】
2016113869.tif 000012
【図１１】
2016113869.tif 000013
【図１２】
2016113869.tif 000014
【図１３】
2016113869.tif 000015
【図１４】
2016113869.tif 000016
【図１５】
2016113869.tif 000017
【図１６】
2016113869.tif 000018
【図１７】
2016113869.tif 000019
【図１８】
2016113869.tif 000020
【図１９】
2016113869.tif 000021
【図２０】
2016113869.tif 000022
【図２１】
2016113869.tif 000023
【図２２】
2016113869.tif 000024
【図２３】
2016113869.tif 000025
【図２４】
2016113869.tif 000026
【図２５】
2016113869.tif 000027
【図２６】
2016113869.tif 000028
【図２７】
2016113869.tif 000029
【図２８】
2016113869.tif 000030
【図２９】
2016113869.tif 000031
【図３０】
2016113869.tif 000032
【図３１】
2016113869.tif 000033
【手続補正書】
【提出日】平成28年10月3日(2016.10.3)
【手続補正２】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
少なくとも１つのウェイを使用するキャッシュメモリに複数の関数を含むプログラムを配置するプログラム配置装置において、
前記プログラムを実行することにより、前記複数の関数の各関数に含まれる命令コードの呼び出し順を取得する取得部と、
前記キャッシュメモリの前記ウェイの数分の格納エリアと仮想ウェイの数分の仮格納エリアとを有する仮想キャッシュメモリを生成する仮想キャッシュメモリ生成部と、
前記仮想キャッシュメモリに対して前記命令コードを前記呼び出し順に呼出命令コードとして呼び出すシミュレーションを実行し、既に呼び出した前記呼出命令コードを再度呼び出した際に前記格納エリアおよび前記仮格納エリアに前記呼出命令コード以外の命令コードが格納されている競合が発生した場合、発生した前記競合の情報を競合情報として取得するシミュレータ部と、
前記競合情報に基づいて、前記キャッシュメモリにおける前記複数の関数の各関数の配置位置を決定する配置位置決定部と
を備えるプログラム配置装置。
【請求項２】
前記シミュレータ部は、
前記複数の関数の各関数に含まれる命令コードのうち前記競合を発生させた命令コードの組み合わせを競合命令コード組として取得し、前記競合命令コード組により発生した前記競合の回数を競合回数として計数し、計数した前記競合回数を前記競合情報として取得し、
前記配置位置決定部は、
前記競合回数に基づいて、前記複数の関数の各関数の前記配置位置を決定する請求項１に記載のプログラム配置装置。
【請求項３】
前記仮想キャッシュメモリ生成部は、
前記仮想キャッシュメモリとして、アドレスが連続する複数のエリアであって前記ウェイの数分の格納エリアと前記ウェイの数分の格納エリアの後ろに連続する前記仮想ウェイの数分の仮格納エリアとからなる複数のエリアを生成する請求項２に記載のプログラム配置装置。
【請求項４】
前記シミュレータ部は、
前記呼出命令コードを呼び出した際に前記格納エリアに対して前記競合が発生し、かつ、前記呼出命令コードが前記仮格納エリアにある場合、既に前記仮想キャッシュメモリに格納されている前記呼出命令コードより前のエリアに格納されている全ての命令コードと前記呼出命令コードとの組を前記競合命令コード組として取得する請求項３に記載のプログラム配置装置。
【請求項５】
前記シミュレータ部は、
前記競合命令コード組を取得した後に、既に前記仮想キャッシュメモリに格納されている前記呼出命令コードより前のエリアに格納されている全ての命令コードをそれぞれ１つ後ろのエリアに移動し、既に前記仮想キャッシュメモリに格納されている前記呼出命令コードを前記仮想キャッシュメモリの先頭の前記格納エリアに格納し、前記呼び出し順における前記呼出命令コードの次の命令コードを前記呼出命令コードとして呼び出す請求項４に記載のプログラム配置装置。
【請求項６】
前記プログラム配置装置は、
前記配置位置決定部により決定された前記複数の関数の各関数の前記配置位置に基づいて、前記複数の関数の各関数を前記配置位置とは異なる再配置位置に並び替える関数配置調整部を備え、
前記複数の関数の各関数が前記再配置位置に配置された場合の前記キャッシュメモリの空き領域は、前記複数の関数の各関数が前記配置位置に配置された場合の前記キャッシュメモリの空き領域よりも少ない請求項１から５のいずれか１項に記載のプログラム配置装置。
【請求項７】
少なくとも１つのウェイを使用するキャッシュメモリに複数の関数を含むプログラムを配置するプログラム配置装置のプログラム配置方法において、
取得部が、前記プログラムを実行することにより、前記複数の関数の各関数に含まれる命令コードの呼び出し順を取得し、
仮想キャッシュメモリ生成部が、前記キャッシュメモリの前記ウェイの数分の格納エリアと仮想ウェイの数分の仮格納エリアとを有する仮想キャッシュメモリを生成し、
シミュレータ部が、前記仮想キャッシュメモリに対して前記命令コードを前記呼び出し順に呼出命令コードとして呼び出すシミュレーションを実行し、既に呼び出した前記呼出命令コードを再度呼び出した際に前記格納エリアおよび前記仮格納エリアに前記呼出命令コード以外の命令コードが格納されている競合が発生した場合、発生した前記競合の情報を競合情報として取得し、
配置位置決定部が、前記競合情報に基づいて、前記キャッシュメモリにおける前記複数の関数の各関数の配置位置を決定するプログラム配置方法。
【請求項８】
少なくとも１つのウェイを使用するキャッシュメモリに複数の関数を含むプログラムを配置するプログラム配置装置のプログラム配置プログラムにおいて、
前記プログラムを実行することにより、前記複数の関数の各関数に含まれる命令コードの呼び出し順を取得する取得処理と、
前記キャッシュメモリの前記ウェイの数分の格納エリアと仮想ウェイの数分の仮格納エリアとを有する仮想キャッシュメモリを生成する仮想キャッシュメモリ生成処理と、
前記仮想キャッシュメモリに対して前記命令コードを前記呼び出し順に呼出命令コードとして呼び出すシミュレーションを実行し、既に呼び出した前記呼出命令コードを再度呼び出した際に前記格納エリアおよび前記仮格納エリアに前記呼出命令コード以外の命令コードが格納されている競合が発生した場合、発生した前記競合の情報を競合情報として取得するシミュレーション処理と、
前記競合情報に基づいて、前記キャッシュメモリにおける前記複数の関数の各関数の配置位置を決定する配置位置決定処理とをコンピュータに実行させるプログラム配置プログラム。
【手続補正３】
【補正対象書類名】図面
【補正対象項目名】図９
【補正方法】変更
【補正の内容】
【図９】
2016113869.tif 000034
【国際調査報告】
2016113869.tif 000035
2016113869.tif 000036
2016113869.tif 000037
2016113869.tif 000038