(57)【要約】【課題】本発明は、実行時における関数相互の関係を考慮したキャッシュカラーリング方式を提供することを目的とする。【解決手段】キャッシュカラーリング方法は、複数の関数からなるプログラムの実行時における複数の関数の呼出し順を時系列として表現した動的関数フローに基づいて、複数の関数のうちの任意の関数と他の全ての関数との実行時の呼出し関係についての情報を含む関数強度情報を生成し、関数強度情報に基づいて命令キャッシュ競合が少なくなるように複数の関数をメモリ空間に配置する各段階を含む。【選択図】図１
2005266941.tif 000002
【特許請求の範囲】
【請求項１】
複数の関数からなるプログラムの実行時における該複数の関数の呼出し順を時系列として表現した動的関数フローに基づいて、該複数の関数のうちの任意の関数と他の全ての関数との実行時の呼出し関係についての情報を含む関数強度情報を生成し、
該関数強度情報に基づいて命令キャッシュ競合が少なくなるように該複数の関数をメモリ空間に配置する
各段階を含むことを特徴とするキャッシュカラーリング方法。
【請求項２】
該関数強度情報はマトリクス情報ｎ（ｉ，ｊ）として表現され、ｎ（ｉ，ｊ）は該動的関数フローにおける関数ｉの参照からその後最初に参照された関数ｉまでの区間である全ての区間のうちで関数ｊを少なくとも１回参照する区間の数であり、且つｉ＝ｊの場合には関数ｉの総参照回数であることを特徴とする請求項１記載のキャッシュカラーリング方法。
【請求項３】
該関数強度情報はマトリクス情報ｎ（ｉ，ｊ）として表現され、ｎ（ｉ，ｊ）は、該動的関数フローにおける関数ｉの参照からその後最初に参照された関数ｉまでの区間である全ての区間について、各区間における関数の総参照回数に対する関数ｊの参照回数の比率を総和したものであることを特徴とする請求項１記載のキャッシュカラーリング方法。
【請求項４】
該関数強度情報はマトリクス情報ｎ（ｉ，ｊ）として表現され、ｎ（ｉ，ｊ）は、該動的関数フローにおける関数ｉの参照からその後最初に参照された関数ｉまでの区間である全ての区間について、各区間における関数ｊの参照回数を総和したものであることを特徴とする請求項１記載のキャッシュカラーリング方法。
【請求項５】
該関数強度情報はマトリクス情報ｎ（ｉ，ｊ）として表現され、ｎ（ｉ，ｊ）は、該動的関数フローにおける関数ｉの参照からその後最初に参照された関数ｉまでの区間である全ての区間について、各区間における先頭の関数ｉから最初に参照された関数ｊまでの距離の逆数を総和したものであることを特徴とする請求項１記載のキャッシュカラーリング方法。
【請求項６】
該関数強度情報はマトリクス情報ｎ（ｉ，ｊ）として表現され、ｎ（ｉ，ｊ）はプログラム実行時における関数ｉと関数ｊとの間の命令キャッシュ競合の度合いが高いと大きくなる数値であり、該複数の関数をメモリ空間に配置する段階は、全ての関数ｊについてのｎ（ｉ，ｊ）の総和が大きい順に複数の関数ｉをメモリ空間に順次連続に配置することを特徴とする該請求項１記載のキャッシュカラーリング方法。
【請求項７】
該関数強度情報はマトリクス情報ｎ（ｉ，ｊ）として表現され、ｎ（ｉ，ｊ）はプログラム実行時における関数ｉと関数ｊとの間の命令キャッシュ競合の度合いが高いと大きくなる数値であり、該複数の関数をメモリ空間に配置する段階は、ｎ（ｉ，ｊ）が大きい順に関数ｉ及び関数ｊの組を該メモリ空間に順次連続に配置することを特徴とする該請求項１記載のキャッシュカラーリング方法。
【請求項８】
該関数強度情報はマトリクス情報ｎ（ｉ，ｊ）として表現され、ｎ（ｉ，ｊ）はプログラム実行時における関数ｉと関数ｊとの間の命令キャッシュ競合の度合いが高いと大きくなる数値であり、該複数の関数をメモリ空間に配置する段階は、該メモリ空間の複数のキャッシュラインの各々についてｎ（ｉ，ｊ）を参照してキャッシュ競合が少なくなるように該複数の関数を該複数のキャッシュラインに配置することを特徴とする該請求項１記載のキャッシュカラーリング方法。
【請求項９】
該複数の関数をメモリ空間に配置する段階は、該複数の関数のうちの一の関数が複数のキャッシュラインを占有する大きさを有している場合に該占有される複数のキャッシュラインのそれぞれに対して異なった重みを与えて該一の関数と他の関数とのキャッシュ競合について評価することを特徴とする該請求項８記載のキャッシュカラーリング方法。
【請求項１０】
該プログラムの複数の異なる実行に対応して複数の異なる動的関数フローが存在し、該複数の異なる動的関数フローを重み付けして加算することで１つの動的関数フローを生成する段階を更に含み、該関数強度情報を生成する段階は該１つの動的関数フローに基づいて該関数強度情報を生成することを特徴とする請求項１記載のキャッシュカラーリング方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に関数のメモリ空間への配置方法に関し、詳しくはキャッシュ競合を少なくするように関数をメモリ空間に配置するキャシュカラーリング方法に関する。
【背景技術】
【０００２】
コンピュータシステムにおいては一般に、主記憶メモリとは別に小容量で高速なキャッシュメモリが設けられる。主記憶メモリに記憶される情報の一部をキャッシュにコピーしておくことで、この情報をアクセスする場合には主記憶メモリからではなくキャッシュから読み出すことで、高速な情報の読み出しが可能となる。
【０００３】
キャシュは主記憶メモリに比較して高速でコスト高であるために、その記憶容量は非常に小さい。キャシュは複数のキャッシュラインを含み、外部メモリ（主記憶メモリ）からキャシュへの情報のコピーはキャシュライン単位で実行される。このために、外部メモリのメモリ空間をキャッシュライン単位で分割し、分割されたメモリ領域を順番にキャッシュラインに割当てておく。キャッシュの容量は外部メモリの容量よりも小さいので、外部メモリのメモリ領域を繰り返して同一のキャッシュラインに割当てることになる。
【０００４】
あるアドレスに最初のアクセスが実行されると、そのアドレスの情報（データやプログラム）をキャシュ内の対応するキャッシュラインにコピーし、同一アドレスに対して次のアクセスを実行する場合にはキャシュから直接に情報を読み出す。
【０００５】
関数プログラムの実行において、外部メモリの異なるアドレスに配置された異なる関数プログラムが同一のキャッシュラインに割当てられている場合、これらの関数が交互に読み出されるたびに、関数プログラムをキャシュにコピーする必要が生じる。これをキャシュ競合という。キャシュ競合が頻繁に起こるとプログラムの実行速度が遅くなるという問題がある。この問題を解決するために、同時期に動作する可能性の高い関数同士は同一のキャシュラインに載らないよう配置する方法が研究されている。
【０００６】
キャシュには命令キャシュとデータキャシュとがあるが、上記のような関数読み出しの問題は命令キャシュにおいて生じるものである。キャシュメモリのマッピング方式には一般に、ダイレクト方式、セットアソシエイティブ方式、及びフルアメシエイティブ方式の３つがある。何れの方式においても上記のキャッシュ競合の問題を考える上では基本的に同一であるので、以降においてはダイレクトマップを例にとり説明する。
【０００７】
キャッシュ競合の問題を解決するために、関数間の呼出し回数や特定の関数呼出しパターンの呼出し回数を示す関数強度を定義し、関数強度が高い（即ち互いに読み出す可能性が高い）関数同士が同一のキャッシュラインに割当てられないように設定する方法が従来からある。キャッシュ競合を少なくし命令キャシュミスを少なくすることを目的として、関数単位にリンク順番を設定・変更することをキャシュカラーリングと呼ぶ。
【０００８】
例えば特許文献１乃至３は、呼出し回数の大きい順にコードを配置する手法を開示している。また特許文献４には、関数の時系列情報を抽出し、時系列情報から連続した関数呼出し等直接の関数呼出し以外にキャシュコンフリクトを発生する可能性のある関数の組合せ実行パターンを検出し、ある関数の中で複数の関数が連続して呼ばれる場合やループの中で呼ばれている場合に、そのパターンの実行回数を使用してキャシュコンフリクトを減らす手法が開示されている。また特許文献５には、関数の中で複数の関数が連続して呼ばれる場合やループの中で呼ばれている等の特定パターンでの実行回数の多いものを仮配置により求める手法が開示されている。また特許文献６には、構造グラフの作成及び参照による実行頻度の高いループで呼ばれる関数を連続に配置する方式が開示されている。
【特許文献１】特開平５−３２４２８１号公報
【特許文献２】特開平７−８４７９９号公報
【特許文献３】特開平８−３２８８７０号公報
【特許文献４】特開２００１−２１６１４０号公報
【特許文献５】特開２００１−２８２５４７号公報
【特許文献６】特許第３３０９８１０号公報
【非特許文献１】橋本 敬介、安藤 秀樹、島田 俊夫、「命令キャッシュミス削減のための基本ブロック単位でのコード再配置手法」、１９９９年並列処理シンポジウムＪＳＰＰ’９９、１９９９年６月、ｐｐ．３１−３８
【発明の開示】
【発明が解決しようとする課題】
【０００９】
従来用いられる関数強度は、ある関数内の命令系列における他の関数の読み出し回数に基づいて求められた単なる呼出し回数や、呼出し順を考慮した特定の関数呼出しパターンの呼出し回数に基づくものに過ぎず、実行時における関数相互の時系列的な相関関係を全く考慮していなかった。従って、従来の関数強度でキャッシュカラーリングを行った場合、実際のプログラム実行状態においては適切な関数配置となっていない場合があり、期待する程度にはキャッシュ競合を抑制することができない。
【００１０】
以上を鑑みて本発明は、実行時における関数相互の関係を考慮したキャッシュカラーリング方式を提供することを目的とする。
【課題を解決するための手段】
【００１１】
本発明によるキャッシュカラーリング方法は、複数の関数からなるプログラムの実行時における該複数の関数の呼出し順を時系列として表現した動的関数フローに基づいて、該複数の関数のうちの任意の関数と他の全ての関数との実行時の呼出し関係についての情報を含む関数強度情報を生成し、該関数強度情報に基づいて命令キャッシュ競合が少なくなるように該複数の関数をメモリ空間に配置する各段階を含むことを特徴とする。
【発明の効果】
【００１２】
本発明においては、プログラム実行時の関数の呼出し関係のトレース等により生成された実行時の関数間の呼出し関係を時系列として表現した動的関数フローに基づいて、全ての関数間の実行時の呼出し関係についての情報を含む関数強度情報を生成する。この関数強度情報は、従来では不可能であった関数間の相互情報（任意関数とその他全関数との関係）を表現するものであり、これを用いることで命令キャシュミス数を最小限にするような最適な関数配置を実現することができる。
【発明を実施するための最良の形態】
【００１３】
以下に、本発明の実施例を添付の図面を用いて詳細に説明する。
【００１４】
図１は、本発明によるキャッシュカラーリング方法の実施例を示すフローチャートである。
【００１５】
図１のステップＳ１において、キャッシュカラーリングの対象となるプログラムをシミュレータ等により実行する。ステップＳ２で、関数の入口／出口をトレースすることにより、関数の動的フロー１０を生成する。ここでいう動的関数フロー１０とは、プログラム実行時に呼び出された関数を呼び出された順番（実行された順番）に時系列として並べたものであり、実行時の関数の呼出し関係をそのまま反映した情報である。動的関数フロー１０の生成については、後程詳細に説明する。
【００１６】
ステップＳ３において、動的関数フロー１０に基づいて関数強度情報１１を作成する。この関数強度情報１１は、従来の関数強度に含まれる呼出し回数や呼出し順の情報に加え、全ての関数に対する時系列的な情報を含むものである。関数強度情報１１の作成については、後程詳細に説明する。
【００１７】
ステップＳ４において、関数強度情報１１を参照したカラーリングに基づいて、命令キャッシュミスを最小にするようなリンク文字列を生成する。リンク文字列の生成については、後程詳細に説明する。ステップＳ５では、リンカが、生成されたリンク文字列に基づいて各関数を記憶空間に割当ててリンクすることにより、実行形式モジュールを生成する。ステップＳ６において、生成された実行モジュールを実行してカラーリング後のプログラムを実行する。
【００１８】
このように本発明においては、プログラムの実行時に関数の呼出し関係をトレースすることにより、実行時の関数間の呼出し関係を時系列として表現した動的関数フロー１０を生成し、この動的関数フロー１０に基づいて、全ての関数間の実行時の呼出し関係についての情報を含む関数強度情報１１を生成する。この関数強度情報１１は、従来では不可能であった関数間の相互情報（任意関数とその他全関数との関係）を表現するものであり、これを用いることで命令キャシュミス数を最小限にするような最適な関数配置を実現することができる。
【００１９】
なお以降の説明においては、ダイレクト方式はキャシュｗａｙが１のセットアソシエイティブ方式とみなすことができるので、ダイレクト方式を含んだセットアソシエイティブ方式を例として用いる。
【００２０】
まず動的関数フロー１０の抽出について説明する。
【００２１】
対象となるプログラムが関数Ａ、Ｂ、Ｃ、Ｄ、Ｅ、及びＦからなるとして、このプログラムをシミュレータで実行する。各関数Ａ、Ｂ、Ｃ、Ｄ、Ｅ、及びＦの入口／出口をトレースすることにより、プログラムの実行開始から終了まで、呼び出された全ての関数を順番に記録することで関数の時系列を生成する。図２は、関数Ａ、Ｂ、Ｃ、Ｄ、Ｅ、及びＦからなるプログラムを実行した場合の動的関数フロー１０の一例を示す図である。最初に関数Ａが実行され、関数Ａが関数Ｂを呼び出すことで関数Ｂが実行され、以降順番に関数Ｃ、Ｄ、Ｃ、Ｄ、Ｃ、Ｂ、・・・と呼び出し・実行されている。
【００２２】
次に動的関数フロー１０に基づく関数強度情報１１の生成について説明する。
【００２３】
まず関数強度情報１１の第１の実施例（基本形）について説明する。
【００２４】
ある関数ｉの参照から、その後、最初に参照された関数ｊまでの区間（ｉを含みｊを含まず）の集合をＲｉｊとする。動的関数フローから、Ｒｉｉである全ての区間のうちで、関数ｊを少なくとも１回参照するような区間の数としてｎ（ｉ，ｊ）を求める。ここでｉ＝ｊの場合には、ｎ（ｉ，ｊ）を関数ｉの総参照回数とする。このようにして求めたｎ（ｉ，ｊ）を関数強度と定義する。
【００２５】
ｎ（ｉ，ｊ）は、関数ｉと関数ｊ（≠ｉ）が同じキャシュラインに配置された場合にキャシュミスを発生させる回数（キャシュミス数）に等しい。つまりｎ（ｉ，ｊ）は、キャシュ競合の大小により関数強度を定義したものである。関数強度ｎ（ｉ，ｊ）が大きいほどキャッシュへの影響が大きいので、関数強度ｎ（ｉ，ｊ）の大きい関数同士を同じキャシュラインに配置せず、ｎ（ｉ，ｊ）の小さい関数同士を同じキャシュラインに配置するようにすれば、キャッシュ競合を少なくすることができる。
【００２６】
図３は、図２の動的関数フロー１０について関数強度ｎ（Ｂ，Ｄ）について説明するための図である。図３においてそれぞれ異なる下線で示すように、５つの関数Ｂの区間ＲＢＢ（次の関数Ｂまでの区間）が存在する。この５つの区間ＲＢＢのうちで、少なくともＤを１回参照する区間の数は３つである。したがってｎ（Ｂ，Ｄ）は３となる。同様に全ての関数の組み合せについて強度関数を求めると、図４に示すようなマトリクスが得られる。図４に示すマトリクスが関数強度情報１１である。
【００２７】
以下に関数強度情報１１の第２の実施例について説明する。
【００２８】
第２の実施例は、第１の実施例の強度関数ｎ（ｉ，ｊ）を改善したものである。第１の実施例のｎ（ｉ，ｊ）は、関数ｊを少なくとも１回参照する区間数を意味し、関数ｉと関数ｊ（≠ｉ）が同じキャシュラインに配置された場合のキャシュミス回数に相当する。この際、第１の実施例の関数強度ｎ（ｉ，ｊ）では、区間内に呼ばれる関数の参照回数は考慮していない。
【００２９】
それに対して第２の実施例では、キャシュ再利用率を評価次元に加える。図５は、キャシュ再利用率を説明するための図である。図５のケースλは、ケースτより関数αの呼び出し回数が多く、関数αについてのプログラム局所性が強くてキャシュ再利用率が高いと考えられる。キャシュの再利用率は、区間内に呼ばれる関数の参照回数に比例する。第１の実施例の関数強度ｎ（ｉ，ｊ）にキャシュ再利用率の要素を加え、新たな関数強度情報ｎ＋（ｉ，ｊ）を定義する。
【００３０】
即ち、Ｒｉｉに属する区間の関数ｊ（≠ｉ）について、キャシュ再利用率を考慮した関数強度情報ｎ＋（ｉ，ｊ）として、
ｎ＋（ｉ，ｊ）＝Σ（１×Ｒｅｆ（ｋ）／Ｒ（ｋ））
Ｒ（ｋ）：区間ｋ∈Ｒｉｉの全関数の参照回数
Ｒｅｆ（ｋ）：区間ｋ∈Ｒｉｉ≠ｊの関数ｊの参照回数
を定義する。
【００３１】
図６は、図２の動的関数フロー１０について関数強度ｎ＋（Ｂ，Ｄ）について説明するための図である。図６においてそれぞれ異なる下線で示すように、５つの関数Ｂの区間ＲＢＢ（次の関数Ｂまでの区間）が存在する。この５つの区間ＲＢＢのうちで、最初の区間の関数Ｄの出現頻度は２／５であり、２番目の区間の関数Ｄの出現頻度は２／５であり、３番目の区間の関数Ｄの出現頻度は２／５であり、４番目の区間の関数Ｄの出現頻度は０／３であり、５番目の区間の関数Ｄの出現頻度は０／１である。従って、関数強度ｎ＋（Ｂ，Ｄ）は以下のようになる。
【００３２】
ｎ＋（Ｂ，Ｄ）＝１×２／５＋１×２／５＋１×２／５＋１×０／３＋１×０／１
＝１．２
同様に全ての関数の組み合せについて強度関数を求めると、図７に示すようなマトリクスが得られる。図７に示すマトリクスが第２の実施例による関数強度情報１１である。
【００３３】
関数強度ｎ＋（ｉ，ｊ）が大きいほどキャッシュへの影響が大きくキャッシュ再利用率が高いので、関数強度ｎ＋（ｉ，ｊ）の大きい関数同士を異なるキャシュラインに配置するようにすれば、キャッシュ競合を少なくすることができる。
【００３４】
以下に関数強度情報１１の第３の実施例について説明する。
【００３５】
第３の実施例は、第２の実施例の強度関数ｎ＋（ｉ，ｊ）を改善したものである。上記の第２の実施例では、プログラムの局所性即ちキャシュ再利用率を、全ての関数の呼び出し回数に対する所定の関数の呼び出し回数の割合から求めている。しかしキャシュミス回数に着目した場合には、全ての関数の呼び出し回数に対する割合は余り重要ではなく、所定の関数が何回呼び出されて何回のキャッシュ競合を起こしたかが重要になると考えられる。
【００３６】
そこで第３の実施例の関数強度情報ｎ＋＋（ｉ，ｊ）として、
ｎ＋＋（ｉ，ｊ）＝Σ（１×Ｒｅｆ（ｋ））
Ｒｅｆ（ｋ）：区間ｋ∈Ｒｉｉ≠ｊの関数ｊの参照回数
を定義する。
【００３７】
図８は、図２の動的関数フロー１０について関数強度ｎ＋＋（Ｂ，Ｄ）について説明するための図である。図８においてそれぞれ異なる下線で示すように、５つの関数Ｂの区間ＲＢＢ（次の関数Ｂまでの区間）が存在する。この５つの区間ＲＢＢのうちで、最初の区間の関数Ｄの出現回数は２であり、２番目の区間の関数Ｄの出現回数は２であり、３番目の区間の関数Ｄの出現回数は２であり、４番目の区間の関数Ｄの出現回数は０であり、５番目の区間の関数Ｄの出現回数は０である。従って、関数強度ｎ＋＋（Ｂ，Ｄ）は以下のようになる。
【００３８】
ｎ＋＋（Ｂ，Ｄ）＝１×２＋１×２＋１×２＋１×０＋１×０
＝６
同様に全ての関数の組み合せについて強度関数を求めると、図９に示すようなマトリクスが得られる。図９に示すマトリクスが第３の実施例による関数強度情報１１である。
【００３９】
関数強度ｎ＋＋（ｉ，ｊ）が大きいほどキャッシュへの影響が大きくキャッシュミス回数が多いので、関数強度ｎ＋＋（ｉ，ｊ）の大きい関数同士を異なるキャシュラインに配置するようにすれば、キャッシュ競合を少なくすることができる。
【００４０】
以下に関数強度情報１１の第４の実施例について説明する。
【００４１】
第４の実施例は、第１の実施例の強度関数ｎ（ｉ，ｊ）を改善したものである。前述の第１の実施例の関数強度ｎ（ｉ，ｊ）では、区間内において呼び出される関数の位置情報は考慮していない。即ちある区間において所定の関数に着目した場合、その所定の関数の参照位置が異なっていても、キャシュミス回数としては同一とみなしている。
【００４２】
それに対して第４の実施例では、プログラムの局所性を評価次元として加える。プログラムの局所性を示す尺度として、ある区間において所定の関数が最初に参照されるまでの時間的距離を用いる。この時間的距離は、複数の関数が同一のキャシュラインに配置された場合にキャシュミスが発生するまでの時間を示すことになる。図１０は、プログラムの局所性を説明するための図である。図１０において、ケースμの時間的距離ｓ（μ）はケースεの時間的距離ｓ（ε）よりも短く、プログラムの局所性が高いと考えられる。プログラムの局所性は、プログラムの時間的距離、即ち同一キャシュラインに配置された場合に発生するキャシュミスまでの時間に反比例する。
【００４３】
第４の実施例では、Ｒｉｉに属する区間の関数ｊ（≠ｉ）について、関数ｉから関数ｊのプログラム局所性を考慮した関数強度情報ｎ＃（ｉ，ｊ）として、
ｎ＃（ｉ，ｊ）＝Σ（１／Ｌｅｎ（ｋ））
Ｌｅｎ（ｋ）：区間ｋ∈Ｒｉｉ≠ｊの関数ｊの最初の参照までの距離（≠0）
を定義する。
【００４４】
図１１は、図２の動的関数フロー１０について関数強度ｎ＃（Ｂ，Ｄ）について説明するための図である。図１１においてそれぞれ異なる下線で示すように、５つの関数Ｂの区間ＲＢＢ（次の関数Ｂまでの区間）が存在する。この５つの区間ＲＢＢのうちで、最初の区間の関数Ｄの最初の参照までの時間距離は２であり、２番目の区間の関数Ｄの最初の参照までの時間距離は２であり、３番目の区間の関数Ｄの最初の参照までの時間距離は２である。従って、関数強度ｎ＃（Ｂ，Ｄ）は以下のようになる。
【００４５】
ｎ＃（Ｂ，Ｄ）＝１／２＋１／２＋１／２
＝１．５
同様に全ての関数の組み合せについて強度関数を求めると、図１２に示すようなマトリクスが得られる。図１２に示すマトリクスが第４の実施例による関数強度情報１１である。
【００４６】
関数強度ｎ＃（ｉ，ｊ）が大きいほどキャッシュへの影響が大きく、またプログラムの局所性が高くキャッシュミスまでの時間が短いので、関数強度ｎ＃（ｉ，ｊ）の大きい関数同士を異なるキャシュラインに配置するようにすれば、キャッシュ競合を少なくすることができる。
【００４７】
以下に、関数強度情報１１を生成する手順について説明する。以下においては、上記第１の実施例の場合を例にとって説明する。
【００４８】
図１３は、動作フローと関数リストテーブルとを示す図である。説明の便宜上、図１３（ａ）に示される単純な動作フローに対して関数強度情報１１を生成する手順について説明する。図１３（ｂ）は、（ａ）の動作フローに現れる３つの関数ａ、ｂ、及びｃについての関数リストテーブルである。
【００４９】
まず関数リストテーブルに基づいて抽出区間内関数強度領域（出現済記録領域）を、関数リストテーブルのデータ数からなる１次元配列として生成する。即ちこの場合、３つの要素からなる１次元配列として抽出区間内関数強度領域を生成する。また関数強度マトリクス領域として、関数リストテーブルのデータ数×関数リストテーブルのデータ数のマトリクス状の２次元配列を生成する。この場合は、３×３のマトリクス領域となる。図１４（ａ）に抽出区間内関数強度領域を示し、図１４（ｂ）に関数強度マトリクス領域を示す。
【００５０】
図１５は、関数リストテーブルの最初の関数ａを抽出開始点とした場合の最初の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。（ａ）において、関数ａを抽出開始点とした最初の抽出区間Ｒａａが網掛けで示される。（ｂ）は、（ａ）の抽出区間に対する抽出区間内関数強度領域のデータを示す。抽出区間内関数強度領域においては、対象となる抽出区間において一回以上出現する関数についてデータ“１”を設定する。但し抽出区間開始点の関数ａについては出現回数“２”をデータとして設定する。この抽出区間内関数強度領域のデータを（ｃ）の関数強度マトリクスの対応領域にそのまま設定する。
【００５１】
図１６は、関数リストテーブルの最初の関数ａを抽出開始点とした場合の２番目の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。（ａ）において、関数ａを抽出開始点とした２番目の抽出区間Ｒａａが網掛けで示される。（ｂ）は、（ａ）の抽出区間に対する抽出区間内関数強度領域のデータを示す。抽出区間内関数強度領域においては、対象となる抽出区間において一回以上出現する関数についてデータ“１”を設定する。ここで抽出区間開始点の関数ａの出現回数は２であるが、２番目以降の抽出区間においては抽出区間開始点の関数ａは前区間でカウント済みであるので、抽出開始点の関数についてはカウントしない。この抽出区間内関数強度領域のデータを（ｃ）の関数強度マトリクスの対応領域に加算する。
【００５２】
図１７は、関数リストテーブルの最初の関数ａを抽出開始点とした場合の３番目の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。（ａ）において、関数ａを抽出開始点とした３番目の抽出区間Ｒａａが網掛けで示される。この場合、抽出開始点以降に関数ａは出現しないので、抽出区間が成立しないと判断する。従って、抽出区間内関数強度領域のデータを（ｃ）の関数強度マトリクスの対応領域に反映させることはしない。
【００５３】
図１８は、関数リストテーブルの２番目の関数ｂを抽出開始点とした場合の最初の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。（ａ）において、関数ｂを抽出開始点とした最初の抽出区間Ｒｂｂが網掛けで示される。（ｂ）は、（ａ）の抽出区間に対する抽出区間内関数強度領域のデータを示す。抽出区間内関数強度領域においては、対象となる抽出区間において一回以上出現する関数についてデータ“１”を設定する。但し抽出区間開始点の関数ｂについては出現回数“２”をデータとして設定する。この抽出区間内関数強度領域のデータを（ｃ）の関数強度マトリクスの対応領域にそのまま設定する。
【００５４】
図１９は、関数リストテーブルの２番目の関数ｂを抽出開始点とした場合の２番目の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。（ａ）において、関数ｂを抽出開始点とした２番目の抽出区間Ｒｂｂが網掛けで示される。（ｂ）は、（ａ）の抽出区間に対する抽出区間内関数強度領域のデータを示す。抽出区間内関数強度領域においては、対象となる抽出区間において一回以上出現する関数についてデータ“１”を設定する。ここで抽出区間開始点の関数ｂの出現回数は２であるが、２番目以降の抽出区間においては抽出区間開始点の関数ｂは前区間でカウント済みであるので、抽出開始点の関数についてはカウントしない。この抽出区間内関数強度領域のデータを（ｃ）の関数強度マトリクスの対応領域に加算する。
【００５５】
図２０は、関数リストテーブルの２番目の関数ｂを抽出開始点とした場合の３番目の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。（ａ）において、関数ｂを抽出開始点とした３番目の抽出区間Ｒｂｂが網掛けで示される。この場合、抽出開始点以降に関数ｂは出現しないので、抽出区間が成立しないと判断する。従って、抽出区間内関数強度領域のデータを（ｃ）の関数強度マトリクスの対応領域に反映させることはしない。
【００５６】
図２１は、関数リストテーブルの３番目の関数ｃを抽出開始点とした場合の最初の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。（ａ）において、関数ｃを抽出開始点とした最初の抽出区間Ｒｃｃが網掛けで示される。この場合、抽出開始点以降に関数ｃは出現しないので、抽出区間が成立しないと判断する。但し、関数ｃを抽出開始点とする抽出区間が１つも成立しないことになるので、この場合は抽出開始点である関数ｃのみをカウントし、抽出区間内関数強度領域のデータを生成する。この抽出区間内関数強度領域のデータを（ｃ）の関数強度マトリクスの対応領域にそのまま設定する。
【００５７】
以上のようにして、関数リストテーブルの先頭から順番に関数を選択し、選択された各関数について抽出区間を順次設定して、抽出区間内での関数の出現の有無をデータとして抽出区間内関数強度領域を生成する。こうして生成された抽出区間内関数強度領域のデータを順次関数強度マトリクスに反映させていくことで、第１の実施例による関数強度情報１１が生成される。
【００５８】
以上説明した第１の実施例の関数強度情報１１を求める手順においては、抽出区間内関数強度領域として、関数の出現の有無をデータとする出現済記録領域を用いた。第２乃至第４の実施例については、区間内で要素ごとに出現した回数を記録する出現回数記録領域、区間内の総データ数を記録する抽出区間内総データ数記録領域、最初の要素が出現するまでの順番を記録する初回出現順記録領域等を用意することで、同様にして関数強度情報１１を求めることができる。
【００５９】
以下に、関数強度情報１１に基づいて関数をメモリ空間に配置する方法について説明する。
【００６０】
図２２は、関数配置方法の第１の実施例を示すフローチャートである。この第１の実施例では、関数強度情報が大きい順番に関数を配置する。
【００６１】
ステップＳ１において、関数ｉと関数ｊの関数強度情報を示す行列ｎ（ｉ，ｊ）から関数ｉに対する行を選択する。初回の関数ｉは行の先頭関数とする。
【００６２】
ステップＳ２において、関数ｉの総和（関数Ｍ（ｉ））に初期値０を入れる。
【００６３】
ステップＳ３において、関数強度情報ｎ（ｉ，ｊ）を示す行列から関数ｉ行の列要素関数ｊを選択（初回は先頭列：但しｉ≠ｊ）し、関数ｉの総和（関数Ｍ（ｉ））に加算する。
【００６４】
ステップＳ４において、選択した関数ｊが最終列を超えたか否かを判断する。超えればステップＳ６に進み、超えない場合にはステップＳ５に進む。
【００６５】
ステップＳ５において、次の列要素の関数ｊを求める。その後ステップＳ３に戻り、以降の処理を繰り返す。
【００６６】
ステップＳ６において、関数ｉの総和（関数Ｍ（ｉ））が求まる。
【００６７】
ステップＳ７において、選択した関数ｉは最終行を超えたか否かを判断する。超えればステップＳ８に進む。超えない場合にはステップＳ１に戻り、次行の関数ｉに対して同様の処理を実行する。
【００６８】
以上の処理が終了した段階で、図２３に示すように、図４の関数強度情報１１に対応した関数Ｍ（ｉ）（各関数ｉに対する関数強度情報１１の総和）が求められる。この関数Ｍ（ｉ）は、関数ｉについて他の関数が同一のキャッシュラインに配置された場合のキャッシュミス数の総和に相当する。
【００６９】
次にステップＳ８において、行要素（関数ｉ：ｉ＝１、２、・・・）の総和Ｍ（ｉ）の大きい値の順に対応する関数を抽出して、リンク文字列を作成する。即ち、Ｍ（ｉ）の大きい順に関数を配置する。図２４は、図４の関数強度情報１１の場合に関数配置方法の第１の実施例に従い配置された関数の列を示す図である。
【００７０】
この関数配置方法の第１の実施例では、関数強度情報１１の強い関数同士が同一キャシュライン（異なる論理アドレスを占める同一のキャシュライン）に配置されることを防ぐことができる。即ち、同一のキャシュラインはメモリ空間の連続するアドレス上でキャシュサイズ分だけ離れて周期的に割当てられているので、関数強度情報１１の大きな関数を優先して先に配置していくことで、関数強度情報１１の大きな関数を次の同一キャシュラインが現れるより前に割当てることができる。これにより、キャシュ競合が発生しないようにすることが可能である。
【００７１】
なお上記説明では関数強度情報１１の第１の実施例（ｎ（ｉ，ｊ））を用いて説明したが、第２乃至第４の関数強度情報１１（ｎ＋（ｉ，ｊ）、ｎ＋＋（ｉ，ｊ）、ｎ＃（ｉ，ｊ））を用いても同様にして関数を配置することができる。
【００７２】
以下に、関数強度情報１１に基づいて関数をメモリ空間に配置する方法の第２の実施例について説明する。
【００７３】
図２５は、関数配置方法の第２の実施例を示すフローチャートである。この第２の実施例では、総和ではなく関数個々の関数強度情報ｎ（ｉ，ｊ）に着目して、最も頻繁にキャシュミスが発生する関数同士を、互いに隣接して配置することでキャシュミスの競合をなくすようにしている。
【００７４】
図２５のステップＳ１において、関数強度情報ｎ（ｉ，ｊ）が最も大きい関数の組（関数ｉ、関数ｊ）を選択する。選択された関数の組の左側の関数ｉを起点関数として、リンク文字列に関数ｉ、関数ｊの順番に関数を配置する。
【００７５】
ステップＳ２において、起点関数を関数ｊとし関数強度情報ｎ（ｊ，ｋ）が最も大きくなる関数ｋを求める。この際、既にリンク文字列として選択済の関数を除いた残りの関数中から関数ｋを選択する。リンク文字列の終端に求めた関数ｋを追加する。
【００７６】
ステップＳ３において、起点関数を関数ｋとして、同様に繰り返す。
【００７７】
ステップＳ４において、起点関数が存在しない（リンク文字列にすべての関数を抽出済）であるか否かを判断する。起点関数がまだ存在する場合には、ステップＳ２に戻り以降の処理を繰り返す。
【００７８】
ステップＳ５において、リンク文字列が求まる。
【００７９】
図４の関数強度情報１１の例では、強度情報の最大はｎ（Ｃ，Ｄ）であるので、まず起点関数をＣとして、最も強度情報の大きい関数Ｄを選択する。次に起点関数をＤとして、最も強度情報の大きい関数Ｂを選択する（関数Ｃは既抽出のために除く）。同様に起点関数をＢとして、最も強度情報の大きい関数Ｅを選択する。次に起点関数をＥとして、最も強度情報の大きい関数Ｆを選択する。最後に関数Ｆを起点関数として、残りの関数Ａを選択する。図２６は、図４の関数強度情報１１の場合に関数配置方法の第２の実施例に従い配置された関数の列を示す図である。
【００８０】
なお上記説明では関数強度情報１１の第１の実施例（ｎ（ｉ，ｊ））を用いて説明したが、第２乃至第４の関数強度情報１１（ｎ＋（ｉ，ｊ）、ｎ＋＋（ｉ，ｊ）、ｎ＃（ｉ，ｊ））を用いても同様にして関数を配置することができる。
【００８１】
なお関数強度情報が同じ関数が複数存在する場合、何れの関数を選択するかにより以降の関数配置が大きく変わる可能性がある。そこで関数強度情報が同じ場合について、関数を選択する基準を規定しておいてもよい。例えば、ユーザによる関数配置の指定、関数サイズが小さい関数優先、呼出し数が大きい関数優先等である。
【００８２】
上記関数配置方法の第２の実施例では、強度情報の大きさだけでなく、更に関数サイズを考慮するようにしてもよい。即ち、関数サイズが小さいものほど近くに配置すべきであるという考えに基づいて、（強度情報／サイズ）の値を定義して、この値が大きい関数を配置関数として順次選択して配置するようにしてもよい。
【００８３】
以上説明した関数配置方法においては、メモリ空間上のキャッシュラインについては特に意識することなく、関数を所定の順番で配置している。これに対して、以下に説明する関数配置方法の第３の実施例では、関数強度情報１１を利用してキャッシュライン毎に関数を配置する。
【００８４】
図２７は、関数配置方法の第３の実施例を示すフローチャートである。第３の実施例では、関数強度情報１１に基づいて選択したキャシュミス数の少ないラインから順次関数を配置していく。
【００８５】
図２７のステップＳ１において、配置関数の順番を一意に決定する。配置順番としては、例えば、関数配置方法の第１の実施例と同様に、キャシュミス数の総和に相当するＭ（ｉ）の大きい順としてよい。この順番は一意であればよく、特に限定されるものではない。例えば、自関数の呼出し回数ｎ（ｉ，ｉ）の大きい順としてもよい。ステップＳ２において、上記の順番に従って、関数（まだ選択されていない）を一つ選択する。
【００８６】
ステップＳ３において、メモリ空間に割当てられたキャッシュラインを走査し、既に配置されている関数と選択した関数との間で発生するキャッシュミス数（ｎ（ｉ，ｊ））を、関数強度情報１１に基づいてキャッシュライン毎に算出する。ステップＳ４において、ステップＳ３で算出したキャシュミス数が最も少ないキャシュラインに、ステップＳ２で選択した関数を配置する。このステップＳ３及びステップＳ４の処理については後程詳細に説明する。
【００８７】
ステップＳ５において、全ての関数が配置されたか否かを判定する。全ての関数が配置された場合には、処理はステップＳ６に進む。まだ配置されていない関数が存在する場合には、ステップＳ２に戻り、以降の処理を繰り返す。
【００８８】
ステップＳ５において、キャシュライン毎に関数を配置するリンク文字列を作成する。これにより、キャッシュラインを考慮しながら全ての関数をメモリ空間に配置する処理が終了する。
【００８９】
図２８は、図２７のステップＳ３及びＳ４において、キャッシュミス数をキャッシュライン毎に算出し関数を配置する処理を示すフローチャートである。なおキャッシュラインは、Ｌ１乃至Ｌｚのｚ個が割当てられているとする。
【００９０】
ステップＳ１において、選択した関数ｘが占めることになるキャシュラインの数ｍを関数サイズに基づいて求める。
【００９１】
ステップＳ２において、各キャシュラインＬｎ（ｎ＝１〜ｚ）に配置されている関数を全て抽出する。具体的には、関数配置時に使用キャシュラインの情報が内部テーブルに格納されるので、各キャシュラインＬｎについて既に配置済みの関数の情報が記録されている。この情報に基づいて、各キャシュラインＬｎ（ｎ＝１〜ｚ）に配置されている関数を全て抽出することができる。キャシュラインＬｎに配置されている関数を（Ｌｎ−ｆ１，Ｌｎ−ｆ２，Ｌｎ−ｆ３，・・・Ｌｎ−ｆ）と表記する。
【００９２】
ステップＳ３において、関数ｘを配置するときに、各キャシュラインＬｎ（ｎ＝１〜ｚ）に配置されている関数とキャシュミスを起こす回数を関数強度情報から算出する。ここでキャシュラインＬｎでのキャシュミス数Ｍ（Ｌｎ）は、
Ｍ（Ｌｎ）＝ ｎ（ｘ，Ｌｎ＿ｆ１）＋ｎ（Ｌｎ＿ｆ１，ｘ）
＋ｎ（ｘ，Ｌｎ＿ｆ２）＋ｎ（Ｌｎ＿ｆ２，ｘ）
＋・・・＋ｎ（ｘ，Ｌｎ＿ｆ）＋ｎ（Ｌｎ＿ｆ，ｘ）
として求められる。
【００９３】
ステップＳ４において、連続するキャシュラインをキャシュラインＬ０からm個選択してキャシュミスの総和（Ｍ（Ｌ０）＋Ｍ（Ｌ１）＋…＋Ｍ（Ｌｍ））を求め、キャシュラインＬ１からｍ個選択してキャシュミスの総和（Ｍ（Ｌ１）＋Ｍ（Ｌ２）＋…＋Ｍ（Ｌｍ＋１））を求め、以下同様に各ｍ個のキャッシュラインについてキャッシュミスの総和を求め、最後にキャシュラインＬｚ（最終キャシュライン）からｍ個選択してキャシュミスの総和（Ｍ（Ｌｚ）＋Ｍ（Ｌ０ ）＋…＋Ｍ（Ｌｍ−１））を求める。なお最終キャシュラインＬｚの後は先頭キャシュラインＬ０に戻ることになる。
【００９４】
ステップＳ５において、ステップＳ４で求めたキャッシュミスの総和が最小となるｍ個のキャッシュラインのセットを選択する。ステップＳ６において、選択されたｍ個の連続するキャッシュラインに関数ｘを配置する。
【００９５】
以下に、上記のキャッシュライン毎の配置方法を具体例に基づいて説明する。
【００９６】
図２４に示される順番で、関数Ｂ、Ｃ、Ｄ、Ａ、Ｅ、Ｆを配置する場合について考える。ここでキャッシュラインはＬ０〜Ｌ７の８つであり、各キャッシュラインのサイズは４バイトであるとする。また関数Ｂはサイズが６バイト、関数Ｃは１０バイト、関数Ｄは２２バイト、関数Ａは３バイト、関数Ｅは５バイト、関数Ｆは１０バイトであるとする。
【００９７】
図２９は、関数Ｂ、Ｃ、Ｄ、Ａを順に配置した状態を示す図である。この状態において、次に選択した関数Ｅを配置する位置を決定する。ここで使用する関数強度情報１１は、図４に示す関数強度情報である。
【００９８】
まず図２８のステップＳ３で説明したように、各キャッシュラインについて、選択した関数Ｅと既に配置されている関数とのキャッシュミス数を図４の関数強度情報１１から算出する。例えばキャッシュラインＬ０には、図２９に示すように既に関数Ｂと関数Ｄとが配置されているので、選択した関数Ｅとこれらの関数とのキャッシュミス数を求めることになる。図４の関数強度情報１１において、ｎ（Ｂ，Ｅ）は２、ｎ（Ｅ，Ｂ）は１、ｎ（Ｄ，Ｅ）は０、ｎ（Ｅ，Ｄ）は０であるので、これらの総和としてキャッシュミス数３が求められる。図３０は、各キャッシュラインについて求められたキャッシュミス数を示す図である。
【００９９】
選択した関数Ｅは、そのサイズが５バイトであるから２つのキャッシュラインを占めることになる。従って、２つのキャッシュラインの組として（Ｌ０，Ｌ１）、（Ｌ１，Ｌ２）、（Ｌ２，Ｌ３）、（Ｌ３，Ｌ４）、（Ｌ４，Ｌ５）、（Ｌ５，Ｌ６）、（Ｌ６，Ｌ７）、（Ｌ７，Ｌ０）のうちで、キャシュミスの総和が最も少ない組を選択する。この場合は（Ｌ４，Ｌ５）、（Ｌ５，Ｌ６）、（Ｌ６，Ｌ７）の３組が何れもキャッシュミスの総和がゼロであり、この３組の中から例えばキャシュライン（Ｌ４，Ｌ５）を選択する。
【０１００】
なお上記説明では関数強度情報１１の第１の実施例（ｎ（ｉ，ｊ））を用いて説明したが、第２乃至第４の関数強度情報１１（ｎ＋（ｉ，ｊ）、ｎ＋＋（ｉ，ｊ）、ｎ＃（ｉ，ｊ））を用いても同様にして関数を配置することができる。
【０１０１】
上記のキャッシュライン毎の配置方法により、関数Ｂ、Ｃ、Ｄ、Ａ、Ｅ、及びＦの全てについて、キャシュラインへの配置が決定される。このキャシュラインへの配置においては、キャシュライン単位に関数を配置しているだけであるので、リンク時において論理アドレスを指定する必要がある。
【０１０２】
以下に、キャッシュラインへの関数配置情報に基づいて論理アドレスを求める方法について説明する。
【０１０３】
図３１は、キャッシュラインへの関数配置から各関数の論理アドレスを求める方法を示すフローチャートである。
【０１０４】
ステップＳ１において、連続するキャシュライン番号を、関数強度情報を使用したキャシュラインごとの配置方法により求める。即ち各関数に対して、関数を配置するキャッシュラインを求める。
【０１０５】
ステップＳ２において、キャシュライン番号に対応する最初の論理アドレスとして、論理アドレスのタグ領域にキャシュライン番号を格納しそれ以外はゼロに設定することで論理アドレスを算出する。
【０１０６】
図３２は、論理アドレスの構成及びキャッシュライン番号から論理アドレスへの変換テーブルを示す図である。図３２（ａ）に示されるように、例えば８つのキャッシュラインが論理アドレスの第４ビット〜第６ビット（タグ領域）で指定される。図３２（ｂ）に示されるように、例えばキャッシュラインＬ０は、この第４ビット〜第６ビットが０である論理アドレスに割当てられる。また例えばキャッシュラインＬ１は、この第４ビット〜第６ビットが１である論理アドレスに割当てられる。上記図３１のステップＳ２においては、タグ領域である第４ビット〜第６ビットにキャッシュライン番号を格納し、それ以外のビットにはゼロを設定することで、各キャッシュラインＬ０〜Ｌ７に対するベースとなる論理アドレス（最初の論理アドレス）を設定する。
【０１０７】
図３１のステップＳ３において、同じキャシュライン番号となる２回目以降の論理アドレスとして、前回求めた論理アドレスにキャッシュサイズを加算する。例えば同一キャッシュライン番号に対応する２回目の論理アドレスは、上記のベースとなる論理アドレスからキャシュサイズだけ離れたアドレスとなる。従って、ベースとなる論理アドレスにキャシュサイズを加算することで２回目の論理アドレスを求めることができる。３回目以降の論理アドレスについても同様に、前回求めた論理アドレスにキャシュサイズを加算することで対応するアドレスを求める。
【０１０８】
ステップＳ４において、指定したキャシュラインに対応する論理アドレスを求める。即ち、各関数に対して、その関数の配置先として指定されるキャッシュラインに対応する論理アドレスを求める。
【０１０９】
以上の処理により、各関数を配置する論理アドレスを決定することができる。
【０１１０】
以下に、キャッシュライン毎に関数を配置する関数配置方法の第３の実施例の変形例について説明する。
【０１１１】
前述のキャッシュライン毎に関数を配置する関数配置方法は、関数が占有するキャシュラインの実行頻度については特に考慮していない。しかし関数のサイズが大きく局所性が強い場合、占有する複数のキャシュラインのうちで、特定のキャッシュラインについては頻繁に実行されるがそれ以外のキャッシュラインについては実行頻度が少ない場合がある。このような場合には、キャッシュライン毎に重付けすることが好ましい。
【０１１２】
そこで関数強度情報から求めるキャシュミス数を、キャシュライン毎の実行時間分布に基づいて細分化する。図３３は、キャシュライン毎の実行時間分布を示す図である。例えば関数Ｃは３つのキャッシュラインを占有するが、第２のキャッシュラインの実行頻度が０．８と高く、第１及び第３のキャッシュラインの実行頻度は０．１と低い。
【０１１３】
関数ｉが占有するキャッシュラインと同一のキャシュラインに関数ｊを配置した場合のキャッシュミス数は、ｎ（ｉ，ｊ）で表される。関数配置方法の第３の実施例では、このｎ（ｉ，ｊ）をそのまま使用することになる。それに対してキャッシュライン毎に重付けを考慮した場合、キャッシュラインｌについてのキャッシュミス数は、
キャッシュミス数＝Ｘ（ｉ，ｌ）×Ｘ（ｊ，ｌ）×ｎ（ｉ，ｊ）
となる。ここでＸ（ｉ，ｌ）は、図３３における関数ｉ及びキャッシュラインｌに対する実行頻度である。例えば関数ｉと関数ｊとが３つの同一のキャッシュラインを占有する場合には、ｌ＝０〜２について上式のキャッシュミス数の総和をとればよい。
【０１１４】
このようにキャッシュライン毎に重み付けをすることにより、より細かな関数強度情報に基づいたキャッシュカラーリングが可能になる。
【０１１５】
なお上記説明では関数強度情報１１の第１の実施例（ｎ（ｉ，ｊ））を用いて説明したが、第２乃至第４の関数強度情報１１（ｎ＋（ｉ，ｊ）、ｎ＋＋（ｉ，ｊ）、ｎ＃（ｉ，ｊ））を用いた場合でも同様に重み付けをすることができる。
【０１１６】
また上記説明では、重み付けとして実行比率を用いている。しかしキャシュライン毎の重み付けは、実行比率に限るものではなく、同一キャシュラインに配置されている関数の数等のキャシュラインに関する種々の指標を使用することができる。
【０１１７】
以下に、関数強度情報のマージ処理について説明する。
【０１１８】
プログラムを実行する場合、処理内容がデータ内容に依存して変化することがある。この場合、複数の異なるデータに対して複数の異なるプログラム実行ルートが存在することとなり、それぞれのルート毎に異なった関数強度情報が得られる。そこでこれらの異なった関数強度情報をマージする必要がある。
【０１１９】
関数強度情報のマージには様々な方式が考えられるが、例えば実行ルート毎に重み係数を定め、関数強度情報を重み付けしてマージすることができる。即ち、関数強度情報として、
関数強度情報＝Σ（ｗｉ×Ｄｉ）
を用いることができる。ここでＤｉは実行ルートｉについての関数強度情報であり、ｗｉは実行ルートｉに対する重み係数である。
【０１２０】
図３４は、マージ処理を示すフローチャートである。
【０１２１】
ステップＳ１において、動的関数フロー１０Ａに基づいて関数強度情報１１Ａを生成する。ステップＳ２において、動的関数フロー１０Ｂに基づいて関数強度情報１１Ｂを生成する。ステップＳ３において、関数強度情報１１Ａ、関数強度情報１１Ｂ、及び重み付け情報２０に基づいて、関数強度情報のマージを実行して関数強度情報１１Ｃを生成する。
【０１２２】
なお上記重み付けは、実行比率、ルートの実行回数、ルート内の関数実行回数の総和等、実行ルートに関する種々の指標を使用して設定することができる。
【０１２３】
図３５は、本発明によるキャッシュカラーリングを実行する装置の構成を示す図である。
【０１２４】
図３５に示されるように、本発明によるキャッシュカラーリング方法を実行する装置は、例えばパーソナルコンピュータやエンジニアリングワークステーション等のコンピュータにより実現される。図３５の装置は、コンピュータ５１０と、コンピュータ５１０に接続されるディスプレイ装置５２０、通信装置５２３、及び入力装置よりなる。入力装置は、例えばキーボード５２１及びマウス５２２を含む。コンピュータ５１０は、ＣＰＵ５１１、ＲＡＭ５１２、ＲＯＭ５１３、ハードディスク等の二次記憶装置５１４、可換媒体記憶装置５１５、及びインターフェース５１６を含む。
【０１２５】
キーボード５２１及びマウス５２２は、ユーザとのインターフェースを提供するものであり、コンピュータ５１０を操作するための各種コマンドや要求されたデータに対するユーザ応答等が入力される。ディスプレイ装置５２０は、コンピュータ５１０で処理された結果等を表示すると共に、コンピュータ５１０を操作する際にユーザとの対話を可能にするために様々なデータ表示を行う。通信装置５２３は、遠隔地との通信を行なうためのものであり、例えばモデムやネットワークインターフェース等よりなる。
【０１２６】
本発明によるキャッシュカラーリング方法は、コンピュータ５１０が実行可能なコンピュータプログラムとして提供される。このコンピュータプログラムは、可換媒体記憶装置５１５に装着可能な記憶媒体Ｍに記憶されており、記憶媒体Ｍから可換媒体記憶装置５１５を介して、ＲＡＭ５１２或いは二次記憶装置５１４にロードされる。或いは、このコンピュータプログラムは、遠隔地にある記憶媒体（図示せず）に記憶されており、この記憶媒体から通信装置５２３及びインターフェース５１６を介して、ＲＡＭ５１２或いは二次記憶装置５１４にロードされる。
【０１２７】
キーボード５２１及び／又はマウス５２２を介してユーザからプログラム実行指示があると、ＣＰＵ５１１は、記憶媒体Ｍ、遠隔地記憶媒体、或いは二次記憶装置５１４からプログラムをＲＡＭ５１２にロードする。ＣＰＵ５１１は、ＲＡＭ５１２の空き記憶空間をワークエリアとして使用して、ＲＡＭ５１２にロードされたプログラムを実行し、適宜ユーザと対話しながら処理を進める。なおＲＯＭ５１３は、コンピュータ５１０の基本動作を制御するための制御プログラムが格納されている。
【０１２８】
上記コンピュータプログラムを実行することで、上記各実施例で説明されたようにキャッシュカラーリング方法を実行する。またこのキャッシュカラーリング方法実行環境が、キャッシュカラーリング装置である。
【０１２９】
以上、本発明を実施例に基づいて説明したが、本発明は上記実施例に限定されるものではなく、特許請求の範囲に記載の範囲内で様々な変形が可能である。
【図面の簡単な説明】
【０１３０】
【図１】本発明によるキャッシュカラーリング方法の実施例を示すフローチャートである。
【図２】動的関数フローの一例を示す図である。
【図３】動的関数フローに基づく関数強度について説明するための図である。
【図４】関数強度情報のマトリクスを示す図である。
【図５】キャシュ再利用率を説明するための図である。
【図６】図２の動的関数フローに基づく関数強度について説明するための図である。
【図７】第２の実施例による関数強度情報のマトリクスを示す図である。
【図８】図２の動的関数フローに基づく関数強度について説明するための図である。
【図９】第３の実施例による関数強度情報のマトリクスを示す図である。
【図１０】プログラムの局所性を説明するための図である。
【図１１】図２の動的関数フローに基づく関数強度について説明するための図である。
【図１２】第４の実施例による関数強度情報のマトリクスを示す図である。
【図１３】動作フローと関数リストテーブルとを示す図である。
【図１４】（ａ）は抽出区間内関数強度領域を示し、（ｂ）は関数強度マトリクス領域を示す図である。
【図１５】関数リストテーブルの最初の関数ａを抽出開始点とした場合の最初の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。
【図１６】関数リストテーブルの最初の関数ａを抽出開始点とした場合の２番目の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。
【図１７】関数リストテーブルの最初の関数ａを抽出開始点とした場合の３番目の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。
【図１８】関数リストテーブルの２番目の関数ｂを抽出開始点とした場合の最初の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。
【図１９】関数リストテーブルの２番目の関数ｂを抽出開始点とした場合の２番目の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。
【図２０】関数リストテーブルの２番目の関数ｂを抽出開始点とした場合の３番目の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。
【図２１】関数リストテーブルの３番目の関数ｃを抽出開始点とした場合の最初の抽出区間、抽出区間内関数強度領域、及び関数マトリクス領域を示す図である。
【図２２】関数配置方法の第１の実施例を示すフローチャートである。
【図２３】図４の関数強度情報に対応した関数Ｍ（ｉ）を示す図である。
【図２４】図４の関数強度情報の場合に関数配置方法の第１の実施例に従い配置された関数の列を示す図である。
【図２５】関数配置方法の第２の実施例を示すフローチャートである。
【図２６】図４の関数強度情報の場合に関数配置方法の第２の実施例に従い配置された関数の列を示す図である。
【図２７】関数配置方法の第３の実施例を示すフローチャートである。
【図２８】キャッシュミス数をキャッシュライン毎に算出し関数を配置する処理を示すフローチャートである。
【図２９】関数Ｂ、Ｃ、Ｄ、Ａを順に配置した状態を示す図である。
【図３０】各キャッシュラインについて求められたキャッシュミス数を示す図である。
【図３１】キャッシュラインへの関数配置から各関数の論理アドレスを求める方法を示すフローチャートである。
【図３２】論理アドレスの構成及びキャッシュライン番号から論理アドレスへの変換テーブルを示す図である。
【図３３】キャシュライン毎の実行時間分布を示す図である。
【図３４】マージ処理を示すフローチャートである。
【図３５】本発明によるキャッシュカラーリングを実行する装置の構成を示す図である。
【符号の説明】
【０１３１】
１０  動的関数フロー
１１  関数強度情報
２０  重み付け情報
５１０  コンピュータ
５１１  ＣＰＵ
５１２  ＲＡＭ
５１３  ＲＯＭ
５１４  二次記憶装置
５１５  可換媒体記憶装置
５１６  インターフェース
５２０  ディスプレイ装置
５２３  通信装置
【図１】
2005266941.tif 000003
【図２】
2005266941.tif 000004
【図３】
2005266941.tif 000005
【図４】
2005266941.tif 000006
【図５】
2005266941.tif 000007
【図６】
2005266941.tif 000008
【図７】
2005266941.tif 000009
【図８】
2005266941.tif 000010
【図９】
2005266941.tif 000011
【図１０】
2005266941.tif 000012
【図１１】
2005266941.tif 000013
【図１２】
2005266941.tif 000014
【図１３】
2005266941.tif 000015
【図１４】
2005266941.tif 000016
【図１５】
2005266941.tif 000017
【図１６】
2005266941.tif 000018
【図１７】
2005266941.tif 000019
【図１８】
2005266941.tif 000020
【図１９】
2005266941.tif 000021
【図２０】
2005266941.tif 000022
【図２１】
2005266941.tif 000023
【図２２】
2005266941.tif 000024
【図２３】
2005266941.tif 000025
【図２４】
2005266941.tif 000026
【図２５】
2005266941.tif 000027
【図２６】
2005266941.tif 000028
【図２７】
2005266941.tif 000029
【図２８】
2005266941.tif 000030
【図２９】
2005266941.tif 000031
【図３０】
2005266941.tif 000032
【図３１】
2005266941.tif 000033
【図３２】
2005266941.tif 000034
【図３３】
2005266941.tif 000035
【図３４】
2005266941.tif 000036
【図３５】
2005266941.tif 000037