実施の形態1
以下、図面を参照して本発明の実施の形態について説明する。まず、図1を参照して、本実施の形態1にかかるキャッシュメモリシステムの基本構成について説明する。図1に示すキャッシュメモリシステムの基本構成は、キャッシュライン選択処理部40に、スタック開始位置401と、スタック終了位置402と、を備える。スタック開始位置401は、コールスタックの格納領域の開始アドレスを示す。スタック開始位置402は、コールスタックの格納領域の終了アドレスを示す。CPU30は、キャッシュライン選択処理部40に対して、実行プログラムのロード・ストア命令を実行する際に、スタックポインタの値を通知する。
本実施の形態にかかるキャッシュラインのリフィルは、ABI(Application Binary Interface)の情報を利用するものである。ABIは、アプリケーションプログラムとOS(Operating System)間のインターフェイスを表すものである。ABIは、data領域、bss(Block Started by Symbol)領域、およびスタック領域を指す自動変数の仕様を保持する。プログラム実行時に関数がネストする場合、スタックポインタは、スタックフレーム確保のために下方向へ伸びる、すなわちアドレスの低い値に推移する。スタックフレームとは、サブルーチン(関数)毎にコールスタックに格納する情報を指す。ここで、本実施の形態は、スタック領域(スタック開始位置からスタック終了位置の間)のアドレスのうち、プログラム実行時にスタックポインタよりも低い値をアドレスにもつデータにアクセスすることはない、という特性を利用し、リフィルするキャッシュラインを選択する。
図2は、本実施の形態にかかるプログラムの開始処理を示す図である。プログラムの開始時に、プログラム情報(ロードする位置、サイズ、プログラム開始位置、スタック開始位置、スタック終了位置)を取得し(S201)、プログラムのロードを行う(S202)。スタック開始位置およびスタック終了位置をキャッシュライン選択処理部40に通知し(S203)、プログラムの開始位置へ分岐する(S204)。
図3は、本実施の形態にかかるキャッシュラインのリフィル手順を示す図である。キャッシュライン選択処理部40は、各キャッシュラインのアドレスを参照し、アドレスがスタック開始位置とスタック終了位置の間にあるか否かを判定する(S301)。キャッシュラインのアドレスがスタック領域に存在し(S301:Yes)、スタックポインタよりも低い値のアドレスを持つキャッシュラインが存在する場合(S302:Yes)、このキャッシュラインをリフィルの対象とする。対象となるキャッシュラインが複数ある場合、これらのキャッシュラインの中からLRU情報131を利用して、キャッシュライン選択処理部40は、1つのキャッシュラインを選択する(S303)。一方、対象となるキャッシュラインが一つもない場合(S302:No)、従来と同様に、キャッシュライン選択処理部40は、LRU情報131を利用してリフィルの対象とするキャッシュラインを選択する(S304)。
図4は、本実施の形態にかかるキャッシュラインの入れ替え方法により、図35に示すプログラムを実行した際の実行トレース結果を示す図である。なお、キャッシュ10のデータ格納構造は図34に示したものと同様とする。
図4に示した実行トレース結果について説明する。以下の例では、スタック開始位置401を0x8000、スタック終了位置402を0x7000、スタックポインタの初期値を0x80000とする。また、LRU情報131の初期値は、「キャッシュライン1」を指すものとする。変数に割り当てられるアドレスにより、変数a,b,cはキャッシュライン上で同じ領域を示すものとする。
Step1では、関数Func1のスタックフレーム確保のため、sub命令でspの値は0x7fe0となる。また、変数aのアドレスは0x7ff0、変数bのアドレスは0x7fe0に割り当てるものとする。
Step2では、変数aを利用するため、アドレス0x7ff0のデータをロードする。その際に、LRU情報131が指すキャッシュラインが「キャッシュライン1(ライン1)」であるため、キャッシュライン1に変数aのデータと、アドレスと、を設定する。また、LRU情報は、アクセスがされていない「キャッシュライン2(ライン2)」に変更される。Step3では、関数の呼び出し命令のため、関数Func2の処理へ分岐する。
Step4では、関数Func2のスタックフレーム確保のため、sub命令によってspの値は、0x7fc0になる。また、変数cのアドレスは、0x7fd0に割り当てるものとする。Step5では、変数cを利用するため、アドレス0x7fd0のデータをロードする。その際に、LRU情報131が指すキャッシュラインが「キャッシュライン2(ライン2)」であるため、キャッシュライン2に変数cのデータと、アドレスと、を設定する。また、LRU情報131は、もっとも古くアクセスされたキャッシュラインである「キャッシュライン1(ライン1)」に変更される。
Step6では、関数Func2のスタックフレーム解放のため、add命令によりspの値は、0x7fe0となる。Step7では、return命令により、関数Func1に処理が戻る。
Step8では、変数bを利用するため、アドレス0x7fe0のデータをロードする。その際、キャッシュライン1およびキャッシュライン2には、変数bのデータが存在しないため、図3に示した手順でキャッシュラインのリフィルを行う。図3に示した手順によると、キャッシュラインのアドレスがスタック開始位置から終了位置の間であり(S301:Yes)、かつspの値0x7fe0よりも低いアドレスの値を持つキャッシュライン2がリフィルの対象として選択される(S302:Yes、S303)。よって、キャッシュライン2に変数bのデータと、アドレスと、を設定する(S305)。LRU情報131は、もっとも古くアクセスされたキャッシュラインである「キャッシュライン1(ライン1)」に変更される。
Step9では、変数aを利用するため、アドレス0x7ff0のデータをロードする。その際に、キャッシュライン1に変数aのデータが存在するため、この値を参照する。LRU情報131は、もっとも古くアクセスされたキャッシュラインである「キャッシュライン2(ライン2)」に変更される。
Step10では、関数Func1のスタックフレーム解放のため、add命令によりspの値は、0x8000となる。Step11では、プログラムの実行を終了する。
上記一連の処理により、図4のStep8で変数bを利用する際に、LRU情報131はキャッシュライン1を示しているが、キャッシュライン2に格納された変数cのアドレスが0x7fd0で、spの値0x7fe0よりも低い値であるため、キャッシュライン2をリフィルしている。そのため、Step9で変数aを利用する際にキャッシュヒットとなり、従来のキャッシュ入れ替え方法の実行時(図37)にキャッシュミスとなっていた問題が解決される。すなわち、アクセス頻度を示すLRU情報のみならず、スタックポインタの値と、キャッシュライン内に保持されているデータのアドレス情報を参照して、不要となったデータを持つキャッシュラインを優先的にリフィルの対象としている。これにより、従来ではキャッシュミスとなっていた問題が解決される。
なお、本実施の形態では、キャッシュラインのリフィルの選択を、LRUアルゴリズムにより実現したが、これに限らず、LFU(Least Frequently Used: 各データの参照頻度を保持し、もっとも参照頻度の低いデータを選択する方式)アルゴリズム等、1つのデータを選択する方法であればよい。
実施の形態2
本発明の実施の形態2は、解放したスタックフレームのアドレスを持つキャッシュラインを優先的にリフィルの対象とすることを特徴とする。
関数呼び出しによりスタックフレームを確保(spの値は低下)し、その後にスタックフレームを解放(spの値は増加)した場合、解放した時点で解放されたスタックフレームのアドレスを持つデータは参照されることがなくなる。そのため、本実施の形態では、解放されたアドレスを持つデータが格納されたキャッシュラインを優先的にリフィルの対象とする。
図5は、本実施の形態において、実行されるプログラムを示す図である。図6は、プログラム実行の流れの中で注目するスタックポインタの値(spの値)を示す図である。図6において、縦軸はspの値を示し、横軸はプログラム実行の流れを示す。現在実行中のStep(603)において、解放されているスタックフレーム範囲(601)のアドレスを持つデータは参照されることはない。そのため、その範囲を解放した後のspの値(602)を保持し、リフィルするキャッシュラインの選択の条件に利用する。これにより、このspの値(602)よりも低いアドレスの値を持つデータの格納されたキャッシュラインをリフィル対象とできる。この際、現在のStep(603)のスタックフレーム(604)のアドレスと、解放したスタックフレーム範囲(601)のアドレスと、が同じになる場合がある。そのため、キャッシュラインに格納するデータに、プログラムのどの時点においてスタックフレームに格納されたかを判別できる情報(スタックフレームの操作回数)を追加する。スタックフレームの操作回数の詳細は、後述する。
図7を参照して、本実施の形態にかかるキャッシュメモリシステムの基本構成について説明する。図7に示すキャッシュメモリシステムの基本構成は、実施の形態1と以下の点で相違する。キャッシュライン1(101)は、メモリアクセス先のアドレス情報111と、データ112とに加え、データが参照された時点のスタック操作回数113の情報を保持する。同様にキャッシュライン2(102)は、メモリアクセス先のアドレス情報121と、データ122と、に加え、データが参照された時点のスタック操作回数123の情報を保持する。CPU30は、プログラムのロード・ストア命令において、spの値を通知することに加えて、スタックフレームの確保および解放時にspの値をキャッシュライン選択処理部40に通知する。
キャッシュライン選択処理部40は、実施の形態1の構成に加え、最終最上スタック操作回数403と、最終最下スタック操作回数404と、最終最上スタック位置405と、作業用スタック位置406と、を更に備える。
作業用スタック位置406は、スタックフレームの解放によってspの値が増加した場合に、spと同じ値をとるものである。最終最上スタック位置405 は、スタックフレームの確保によってspの値が低下したときに、作業用スタック位置406と同じ値をとるものである。最終最上スタック位置405は、プログラム開始から現在の実行位置の間で、spの値を線グラフで見た場合に、最後に極大値となったときのspの値を示す。
最終最上スタック操作回数403は、spの値が低下したときに、最終最下スタック操作回数404に「1」を加算した値をとる。最終最下スタック操作回数404は、spの値が増加した時に、最終最上スタック操作回数403と同じ値をとる。これにより、最終最上スタック操作回数403は、spの値が極大値から低下するごとにカウントすることを示す。
スタック操作回数113、123は、キャッシュラインにデータを設定した際に、最終最上スタック操作回数403の値を代入するものである。これにより、このキャッシュラインに保持されたデータが、プログラム中のどの時点でキャッシュラインに格納されたかを判別することができる。
図8は、本実施の形態において追加される情報の初期値を示す図である。作業用スタック位置406の初期値は、スタック開始位置401と同じ値となる。スタック操作回数の初期値は、キャッシュラインにデータを設定したときの最終最上スタック操作回数403の値と同じ値となる。最終最上スタック操作回数403、最終最下スタック操作回数404、および最終最上スタック位置405の初期値は「0」となる。
図9は、本実施の形態にかかるプログラムの開始処理を示す図である。図2に示す実施の形態1の処理に加え、最終最上スタック操作回数403と、最終最下スタック操作回数404と、最終最上スタック位置405と、作業用スタック位置406と、の初期化処理(S205)を実行する。初期化処理(S205)とは、各情報を上述(図8)の初期値に設定する処理である。
図10は、スタックフレーム確保・解放時に、CPU30からspの値の通知があった場合の、キャッシュライン選択処理部40の処理を示すフローチャートである。spの値が低下した通知を受けた場合(S401:Yes)、最終最下スタック操作回数404に「1」を加算した値を、最終最上スタック操作回数403に設定する。また、最終最上スタック位置405に、作業用スタック位置406の値を設定する(S403)。一方、spの値が増加した通知を受けた場合(S401:No、S402:Yes)、最終最下スタック操作回数404に、最終最上スタック操作回数403の値を設定する。また、作業用スタック位置406に、spの値を設定する(S404)。
図11は、本実施の形態にかかるキャッシュラインのリフィル手順を示す図である。っこでは、実施の形態1と異なる処理について以下に記載する。実施の形態1において、キャッシュラインに格納されたデータのアドレスが、spの値よりも低いものがない場合(S302:No)には、次の処理を行う。
キャッシュライン内のスタック操作回数から最終最上スタック操作回数403を引いた値が「0」ではないデータがあるか否かを判定する(S306)。S306の条件に合致するキャッシュラインがある場合、該当するキャッシュラインの中で、アドレス111が最終最上スタック位置405よりも低いものが存在するか否かを判定する(S307)。S306およびS307の条件を満たすキャッシュラインの中から、キャッシュライン選択処理部40は、LRU情報131に基づき、リフィルするキャッシュラインを選択する(S308)。
spの値より低い値を持つアドレス111が格納されたキャッシュラインがある場合(S302:Yes)、およびキャッシュラインのアドレス111がスタック開始位置と終了位置との間にない場合(S301:No)、図3と同様の処理を行う。
キャッシュラインをリフィル(S305)した後、キャッシュライン選択処理部40は、リフィルの対象となったキャッシュラインのスタック操作回数に、最終最上スタック操作回数403の値を設定する(S309)。
図12は、本実施の形態にかかるキャッシュラインの入れ替え方法により、図5に示すプログラムを実行した際の実行トレース結果を示す図である。なお、キャッシュ10のデータ格納構造は図34に示したものと同様とする。
図12に示した実行トレースについて説明する。以下の例では、スタック開始位置401を0x8000、スタック終了位置402を0x7000、スタックポインタの初期値を0x8000とする。また、LRU情報131の初期値は、「キャッシュライン1」を指すものとする。変数に割り当てられるアドレスにより、変数a,b,cはキャッシュライン上で同じ領域を示すものとする。
Step1では、関数Func1のスタックフレーム確保のため、sub命令でspの値は0x7fe0となる。また、変数aのアドレスは0x7ff0に割り当てるものとする。ここで、スタックフレームの確保によりspの値が低下したため、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「0」に「1」を加算した「1」が設定される。また、最終最上スタック位置405には、作業用スタック位置406の値である0x8000が設定される。
Step2では、変数aを利用するため、アドレス0x7ff0のデータをロードする。その際に、LRU情報131が指すキャッシュラインが「キャッシュライン1(ライン1)」であるため、キャッシュライン1に変数aのデータと、アドレスと、を設定する。また、LRU情報131は、アクセスがされていない「キャッシュライン2(ライン2)」に変更される。Step3では、関数の呼び出し命令のため、関数Func2の処理へ分岐する。
Step4では、関数Func2のスタックフレーム確保のため、sub命令によってspの値は、0x7fc0になる。また、変数bのアドレスは、0x7fd0に割り当てるものとする。ここで、スタックフレームの確保によりspの値が低下したため、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「0」に「1」を加算した「1」が設定される。また、最終最上スタック位置405には、作業用スタック位置406の値である0x8000が設定される。
Step5では、変数bを利用するため、アドレス0x7fd0のデータをロードする。その際に、LRU情報131が指すキャッシュラインが「キャッシュライン2(ライン2)」であるため、キャッシュライン2に変数bのデータと、アドレスと、を設定する。また、スタック操作回数113に最終最上スタック操作回数403の値である「1」を設定する。LRU情報131は、もっとも古くアクセスされたキャッシュラインである「キャッシュライン1(ライン1)」に変更される。
Step6では、関数Func2のスタックフレーム解放のため、add命令によりspの値は、0x7fe0となる。また、スタックフレームの解放によりspの値が増加したため、最終最下スタック操作回数404は、最終最上スタック操作回数403と同じ値である「1」が設定される。また、作業用スタック位置406は、spの値である0x7fe0に設定される。
Step7では、return命令により、関数Func1に処理が戻る。Step8では、関数の呼び出し命令のため、関数Func2の処理へ分岐する。
Step9では、関数Func3のスタックフレーム確保のため、add命令によりspの値は、0x7fc0となる。また、変数cのアドレスは、0x7fd0に割り当てるものとする。ここで、スタックフレームの確保によりspの値が低下したため、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「1」に「1」を加算した「2」が設定される。また、最終最上スタック位置405には、作業用スタック位置406の値である0x7fe0が設定される。
Step10では、変数cを利用するため、アドレス0x7fd0のデータをロードする。その際、キャッシュライン1およびキャッシュライン2には、変数cのデータが存在しないため、図11に示した手順でキャッシュラインのリフィルを行う。図11に示した手順によると、キャッシュラインのアドレスがスタック開始位置から終了位置の間に存在するが(S301:Yes)、キャッシュラインのアドレスがいずれもspの値0x7fc0よりも低くない(S302:No)。そのため、キャッシュライン内に保持するスタック操作回数と最終最上スタック操作回数403の差が「0」ではなく(S306:Yes)、キャッシュラインのアドレスが最終最上スタック位置405の値である0x7fe0よりも低い値を持つ(S307:Yes)、キャッシュライン2がリフィル対象となる。よって、キャッシュライン2に変数cのデータと、アドレスと、スタック操作回数と、を設定する。キャッシュライン2のスタック操作回数には、最終最上スタック操作回数403の値である「2」が設定される。LRU情報131は、もっとも古くアクセスされたキャッシュラインである「キャッシュライン1(ライン1)」に変更される。
Step11では、関数Func3のスタックフレーム解放のため、add命令によりspの値は、0x7fe0となる。また、スタックフレームの解放によりspの値が増加したため、最終最下スタック操作回数404は、最終最上スタック操作回数403と同じ値である「2」が設定される。また、作業用スタック位置406は、spの値である0x7fe0に設定される。
Step12では、return命令により、関数Func1に処理が戻る。Step13では、変数aを利用するため、アドレス0x7ff0のデータをロードする。その際に、キャッシュライン1に変数aのデータが存在するため、この値を参照する。LRU情報131は、もっとも古くアクセスされたキャッシュラインである「キャッシュライン2(ライン2)」に変更される。
Step14では、関数Func1のスタックフレーム解放のため、add命令によりspの値は、0x8000となる。また、スタックフレームの解放によりspの値が増加したため、最終最下スタック操作回数404は、最終最上スタック操作回数403と同じ値である「2」が設定される。また、作業用スタック位置406は、spの値である0x8000に設定される。Step15では、プログラムの実行を終了する。
次に、本実施の形態におけるキャッシュライン入れ替え方法の効果について説明する。まず、非特許文献1に記載のキャッシュライン入れ替え方法および実施の形態1に記載のキャッシュライン入れ替え方法によって、図5に示すプログラムを実行した際の、キャッシュ10の動作の概要について述べる。
非特許文献1に記載のキャッシュライン入れ替え方法では、Step10で変数cを利用する際に、LRU情報131に基づいてリフィルするキャッシュラインを選択するため、変数aを保持するキャッシュライン1がリフィルの対象となる。その結果、Step13において、変数aを利用する際に、キャッシュミスとなる。
実施の形態1に記載のキャッシュライン入れ替え方法では、Step10で変数cを利用する際に、キャッシュライン2のアドレスは0x7fd0であり、spの値よりも低い値ではない。そのため、LRU情報131に基づいてリフィルするキャッシュラインを選択するため、変数aを保持するキャッシュライン1がリフィルの対象となる。その結果、Step13において、変数aを利用する際に、キャッシュミスとなる。
本実施の形態に記載のキャッシュライン入れ替え方法では、Step10で変数cを利用する際に、スタック操作回数が最終最上スタック操作回数403と異なり、最終最上スタック位置405の0x7fe0より低いアドレス0x7fd0を持つキャッシュライン2がリフィルの対象となる。その結果、Step13において、変数aを利用する際に、キャッシュヒットとなる。
本実施の形態にかかるキャッシュライン入れ替え方法は、コールスタックからの解放済みキャッシュラインを算出するための変数(最終最上スタック位置)を用いて、リフィルするキャッシュラインを選択している。このように、コールスタックからすでに解放され、キャッシュヒットとなることのないキャッシュラインを優先的にリフィルの対象とすることでキャッシュヒット率を高めることができる。
実施の形態3
本発明の実施の形態3は、実施の形態2のキャッシュライン入れ替え方法ではリフィル対象とできなかった、スタックフレームからの解放済みキャッシュラインを、後述の残存ライン数を考慮することによりリフィル対象とできることを特徴とする。
実施の形態2に記載のキャッシュライン入れ替え方法では、現在実行中のStepにおいて、最後にスタックフレームを解放した後、スタックフレームを確保する前のspの値を保存し、このspの値をリフィルするキャッシュラインの選択条件に用いている。しかし、このspの値よりも高い値を持ち、かつ、すでにコールスタックから解放されているデータがキャッシュラインに残っている場合、実施の形態2によっては、当該キャッシュラインをリフィル対象とできない。本実施の形態にかかるキャッシュライン入れ替え方法は、当該キャッシュラインを優先的にリフィル対象とできるように改良したものである。
本実施の形態では、プログラムの開始から現在のStepまでの範囲を、スタックフレームを確保した時を境界として、前後の2つの範囲に分ける。この境界は、現在のStepでキャッシュラインに格納されているデータのうち、前半の範囲でアクセスしたデータ数の方が、後半の範囲でアクセスしたデータ数より多くなっている箇所とする。本実施の形態にかかるキャッシュライン入れ替え方法は、この境界の直前のspの値を、リフィルするキャッシュラインの選択条件に利用する。これにより、前半の範囲で設定されたキャッシュラインは、優先的にリフィル対象とすることができ、複雑な関数呼び出しを行うプログラムに対応可能となる。
図15は、プログラム実行の流れの中で注目するスタックポインタの値(spの値)を示す図である。図15において、縦軸はspの値を示し、横軸はプログラム実行の流れを示す。StepB(612)でスタックフレームを確保した際に、全キャッシュラインのうち、StepA(612)よりも前の範囲(615)でアクセスしてキャッシュラインに残っているデータ数(後述の残存ライン数)が、StepA(611)からStepB(612)の範囲(616)でアクセスしてキャッシュラインに残っているデータ数(後述の留保ライン数)よりも多い場合、StepA(611)でのspの値(613)を保存する(後述の残存最上スタック位置)。本実施の形態にかかるキャッシュライン入れ替え方法は、この残存最上スタック位置をリフィルするキャッシュラインの選択条件に利用する。
図16は、残存最上スタック位置を更新する時の動作を示す図である。StepC(617)でスタックフレームを確保した際に、全キャッシュラインのうち、StepA(611)よりも前の範囲(615)でアクセスしてキャッシュラインに残っているデータ数より、StepA(611)からStepC(617)の間でアクセスしてキャッシュラインに残っているデータ数が多くなった場合、StepC(617)のspの値(614)を、残存最上スタック位置として保存する。なお、図15および図16の説明中にある「アクセスするアドレス」は、スタック領域のアドレスを指す。
図17を参照して、本実施の形態にかかるキャッシュメモリシステムの基本構成について説明する。図17に示すキャッシュメモリシステムの基本構成は、キャッシュライン選択処理部40に、実施の形態2の構成に加え、残存ライン数407と、留保ライン数408と、残存最上スタック操作回数409と、残存最上スタック位置410と、を更に備える。
残存最上スタック位置410は、プログラムの開始から現在位置までを、spの値が極大を取る箇所を境に2つの範囲に分けたときの、境界のspの値を示す。この2つの範囲は、キャッシュライン中に残っているデータを見たとき、プログラム開始から残存最上スタック位置410を設定した前半の範囲で利用したデータの方が、後半の範囲で利用したデータ数より多く残っている状態を示す。
残存最上スタック操作回数409は、残存最上スタック位置410が設定されたときの最終最上スタック操作回数403を示す。残存ライン数407は、残存最上スタック位置410を設定したプログラムの実行位置(Step)より前にアクセスされたスタック領域のアドレスを持つデータの中で、キャッシュラインに残っているデータのデータ数を表す。留保ライン数408は、残存最上スタック位置410を設定したプログラムの実行位置(Step)から、現在のプログラム実行箇所までの間にアクセスされたスタック領域のアドレスを持つデータの中で、キャッシュラインに残っているデータのデータ数を表す。
図18は、本実施の形態において追加される情報の初期値を示す図である。残存ライン数407と、留保ライン数408と、残存最上スタック操作回数409と、残存最上スタック位置410と、の初期値は全て「0」である。
図19は、本実施の形態にかかるプログラムの開始処理を示す図である。図2に示す実施の形態1の処理に加え、残存ライン数407と、留保ライン数408と、残存最上スタック操作回数409と、残存最上スタック位置410と、の初期化処理(S206)を実行する。初期化処理(S206)とは、各情報を上述(図18)の初期値に設定する処理である。
図20は、スタックフレーム確保・解放時に、CPU30からspの値の通知があった場合の、キャッシュライン選択処理部40の処理を示すフローチャートである。実施の形態2における処理(図10)のS403の処理の後に、以下の処理が追加される。
S403に示す処理により、最終最上スタック操作回数403の値が変化したか否かを判定する(S405)。変化がある場合、spの値が極大値から低下したことを表す。最終最上スタック操作回数403の値が変化した場合(S405:Yes)、最終最上スタック操作回数403の値がオーバーフローしているか否かを判定する(S406)。
最終最上スタック操作回数403の値がオーバーフローしている場合(S406:Yes)、以下の設定を行う(S407)。最終最上スタック操作回数403に「1」を設定する。最終最下スタック操作回数404に「0」を設定する。キャッシュライン内のすべてのスタック操作回数に「0」を設定する。残存最上スタック位置410に、最終最上スタック位置405の値を設定する。残存最上スタック操作回数409に、最終最上スタック操作回数403の値を設定する。残存ライン数407に、残存ライン数407の値に留保ライン数408の値を加算した結果を設定する。さらに、留保ライン数408を「0」に設定する。上記の処理(S407)により、キャッシュライン内のすべてのスタック操作回数について初期化を行い、全てのキャッシュライン内のデータが残存ライン数407にカウントされているものとして扱う。
最終最上スタック操作回数403の値がオーバーフローしていない場合(S406:No)、留保ライン数408の値が、残存ライン数407の値以上であるか否かを判定する(S408)。
留保ライン数408の値が、残存ライン数407の値以上である場合(S408:Yes)、以下の設定(S409)を行う。残存最上スタック位置410に、最終最上スタック位置405の値を設定する。残存最上スタック操作回数409に、最終最上スタック操作回数403の値を設定する。残存ライン数407に、残存ライン数407の値に留保ライン数408の値を加算した結果を設定する。さらに、留保ライン数408を「0」に設定する。
留保ライン数408の値が、残存ライン数407の値未満である場合(S408:No)、処理を終了する。
続いて、図22Aおよび図22Bを参照し、本実施の形態にかかるキャッシュラインのリフィル手順について説明する。図22Aおよび図22B内で用いる分岐条件を図21に示す。条件1は、キャッシュラインのアドレスが、スタック開始位置と終了位置との間にあるか否かを判定する。条件2は、キャッシュラインのアドレスが、現在のspの値よりも低い値か否かを判定する。条件3は、キャッシュライン内のスタック操作回数が残存最上スタック操作回数409よりも小さいか否かを判定する。条件4は、キャッシュラインのアドレスが、残存最上スタック位置410よりも低い値か否かを判定する。ここでは、実施の形態2と異なる処理について以下に記載する。
各キャッシュラインのアドレスを参照し、アドレスがスタック開始位置とスタック終了位置の間にあり(条件1)、残存ライン数407にカウントされているデータを保持しており(条件3)、アドレスが残存最上スタック位置405よりも低い値を持つ(条件4)、キャッシュラインを選択する(S310、S311、S312)。上記の条件に当てはまるキャッシュラインが存在しない場合には、LRU情報131からキャッシュラインを選択する(S304)。
選択されたキャッシュラインが、上述の条件1、および条件3を満たす場合、すなわち残存ライン数407にカウントされているデータを保持しているキャッシュラインである場合(S313:Yes)、残存ライン数407の値を「1」を減算する(S314)。
選択されたキャッシュラインが、上述の条件1を満たし、条件3を満たさない場合、すなわち残存ライン数407にカウントされているデータを保持しているキャッシュラインではない場合(S315:Yes)、留保ライン408の値を「1」を減算する(S316)。この処理は、後の処理(S318)において留保ライン408の値を「1」を加算するため、留保ライン408の値を増加させないために予め「1」を減算するものである。
キャッシュラインをリフィルして新しいデータを設定した際に、このデータのアドレスがスタック領域に含まれる場合(S317:Yes)、リフィル対象のキャッシュラインのスタック操作回数に最終最上スタック操作回数403の値を設定する。また、留保ライン数408の値に「1」を加算する(S318)。
図23Aおよび図23Bは、本実施の形態にかかるキャッシュラインの入れ替え方法により、図14に示すプログラムを実行した際の実行トレース結果を示す図である。また、図24は、図14に示すプログラムを実行した際のspの値の推移を示す図である。なお、キャッシュ10のデータ格納構造は図34に示したものと同様とする。
図23Aおよび図23Bに示した実行トレース結果について説明する。以下の例では、スタック開始位置401を0x8000、スタック終了位置402を0x7000、スタックポインタの初期値を0x8000とする。また、LRU情報131の初期値は、「キャッシュライン1」を指すものとする。変数に割り当てられるアドレスにより、変数a,b,cはキャッシュライン上で同じ領域を示すものとする。
Step1では、関数Func1のスタックフレーム確保のため、sub命令でspの値は0x7fe0となる。また、変数aのアドレスは0x7ff0に割り当てるものとする。ここで、スタックフレームの確保によりspの値が低下したため(S401:Yes)、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「0」に「1」を加算した「1」が設定される(S403)。最終最上スタック位置405には、作業用スタック位置406の値である0x8000が設定される(S403)。また、最終最上スタック操作回数403の値が変化し(S405:Yes)、最終最上スタック操作回数403の値がオーバーフローせず(S406:No)、留保ライン数408の値が残存ライン数407の値以上となっているため(S408:Yes)、残存最上スタック位置410には、最終最上スタック位置405の値である0x0000が設定される(S409)。また、残存最上スタック操作回数409には、最終最上スタック操作回数403の値である「1」が設定される(S409)。残存ライン数407、および留保ライン数408はともに0であるため、値は変化しない(S409)。
Step2では、変数aを利用するため、アドレス0x7ff0のデータをロードする。その際に、スタック開始位置と終了位置との間のアドレス値を持つキャッシュラインが存在しないため(S301:No)、LRU情報131が指すキャッシュラインである「キャッシュライン1(ライン1)」を選択し(S304)、キャッシュライン1に変数aのデータと、アドレスとを設定する(S305)。また、キャッシュライン1のスタック操作回数に最終最上スタック操作回数403の値である「1」を設定する(S317:Yes、S318)。また、留保ライン数408に「1」を加算した「1」を設定する(S318)。LRU情報131は、アクセスがされていない「キャッシュライン2(ライン2)」に変更される。Step3では、関数の呼び出し命令のため、関数Func2の処理へ分岐する。
Step4では、関数Func2のスタックフレーム確保のため、sub命令によってspの値は、0x7fc0になる。また、変数bのアドレスは、0x7fd0に割り当てるものとする。ここで、スタックフレームの確保によりspの値が低下したため(S401:Yes)、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「0」に「1」を加算した「1」が設定される(S403)。最終最上スタック位置405には、作業用スタック位置406の値である0x8000が設定される(S403)。最終最上スタック操作回数403の値は変化しないため(S405:No)、処理は終了する。
Step5では、変数bを利用するため、アドレス0x7fd0のデータをロードする。その際に、スタック開始位置と終了位置との間のアドレス値を持つキャッシュラインが存在し(S301:Yes)、現在のspの値よりも低いアドレスを持つキャッシュラインが存在せず(S302:No)、キャッシュライン内のスタック操作回数が、残存最上スタック操作回数409よりも大きい(S310:No)ため、LRU情報131が指すキャッシュラインである「キャッシュライン2(ライン2)」を選択する(S304)。ここで、留保ライン数408の減算は行わず(S315:No)、キャッシュライン2に変数bのデータと、アドレスと、を設定する(S305)。また、キャッシュライン2のスタック操作回数に最終最上スタック操作回数403の値である「1」を設定する(S317:Yes、S318)。また、留保ライン数408に「1」を加算した「2」を設定する(S318)。LRU情報131は、アクセスがされていない「キャッシュライン1(ライン1)」に変更される。
Step6では、関数Func2のスタックフレーム解放のため、add命令によりspの値は、0x7fe0となる。ここで、スタックフレームの確保によりspの値が増加したため(S401:No、S402:Yes)、最終最下スタック操作回数404には、最終最上スタック操作回数403の値である「1」が設定される(S404)。また、作業用スタック位置406の値には、spの値である0x7fe0が設定される(S404)。
Step7では、return命令により、関数Func1に処理が戻る。Step8では、関数の呼び出し命令のため、関数Func3の処理へ分岐する。
Step9では、関数Func3のスタックフレーム確保のため、sub命令によってspの値は、0x7fc0になる。ここで、スタックフレームの確保によりspの値が低下したため(S401:Yes)、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「1」に「1」を加算した「2」が設定される(S403)。最終最上スタック位置405には、作業用スタック位置406の値である0x7fe0が設定される(S403)。最終最上スタック操作回数403の値が変化しており(S405:Yes)、最終最上スタック操作回数403の値がオーバーフローせず(S406:No)、留保ライン数408が残存ライン数409以上であるため(S408:Yes)、以下の処理(S409)を行う。
S409の処理では、残存最上スタック位置410には、最終最上スタック位置405の値である0x7fe0を設定する。残存最上スタック操作回数409には、最終最上スタック操作回数403の値である「2」を設定する。残存ライン数407には、残存ライン数407と留保ライン数408を加算した値である「2」を設定する。また、留保ライン数408には、「0」を設定する。Step10では、関数の呼び出し命令のため、関数Func4の処理へ分岐する。
Step11では、関数Func4のスタックフレーム確保のため、sub命令によってspの値は、0x7fa0になる。ここで、スタックフレームの確保によりspの値が低下したため(S401:Yes)、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「1」に「1」を加算した「2」が設定される(S403)。最終最上スタック位置405には、作業用スタック位置406の値である0x7fe0が設定される(S403)。最終最上スタック操作回数403の値は変化しないため(S405:No)、処理は終了する。
Step12では、関数Func4のスタックフレーム解放のため、add命令によりspの値は、0x7fc0となる。ここで、スタックフレームの確保によりspの値が増加したため(S401:No、S402:Yes)、最終最下スタック操作回数404には、最終最上スタック操作回数403の値である「2」が設定される(S404)。また、作業用スタック位置406の値には、spの値である0x7fc0が設定される(S404)。
Step13では、return命令により、関数Func3に処理が戻る。Step14では、関数の呼び出し命令のため、関数Func5の処理へ分岐する。
Step15では、関数Func5のスタックフレーム確保のため、sub命令によってspの値は、0x7fa0になる。また、変数cのアドレスは、0x7fb0に割り当てるものとする。ここで、スタックフレームの確保によりspの値が低下したため(S401:Yes)、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「2」に「1」を加算した「3」が設定される(S403)。最終最上スタック位置405には、作業用スタック位置406の値である0x7fc0が設定される(S403)。最終最上スタック操作回数403の値は変化しており(S405:Yes)、最終最上スタック操作回数403の値がオーバーフローしないが(S406:No)、留保ライン数408が残存ライン数407未満であるため(S408:No)、処理は終了する。
Step16では、変数cを利用するため、アドレス0x7fb0のデータをロードする。その際に、スタック開始位置と終了位置との間のアドレス値を持つキャッシュラインが存在し(S301:Yes)、現在のspの値よりも低いアドレスを持つキャッシュラインが存在せず(S302:No)、キャッシュライン内のスタック操作回数が、残存最上スタック操作回数409よりも小さく(S310:Yes)、キャッシュラインのアドレスが残存最上スタック位置410よりも低い値を持つキャッシュライン2を選択する(S311:Yes、S312)。選択したキャッシュライン2が、スタック開始位置と終了位置との間のアドレス値を持ち、キャッシュライン内のスタック操作回数が、残存最上スタック操作回数409よりも少ないため(S313:Yes)、残存ライン数407を「2」から「1」を減算して、「1」を設定する(S314)。その後、キャッシュライン2に変数cのデータと、アドレスと、を設定する(S305)。また、キャッシュライン2のスタック操作回数に最終最上スタック操作回数403の値である「3」を設定する(S317:Yes、S318)。また、留保ライン数408に「1」を加算した「1」を設定する(S318)。LRU情報131は、アクセスがされていない「キャッシュライン1(ライン1)」に変更される。
Step17では、関数Func5のスタックフレーム解放のため、add命令によりspの値は、0x7fc0となる。ここで、スタックフレームの確保によりspの値が増加したため(S401:No、S402:Yes)、最終最下スタック操作回数404には、最終最上スタック操作回数403の値である「3」が設定される(S404)。また、作業用スタック位置406の値には、spの値である0x7fc0が設定される(S404)。Step18では、return命令により、関数Func3に処理が戻る。
Step19では、関数Func3のスタックフレーム解放のため、add命令によりspの値は、0x7fe0となる。ここで、スタックフレームの確保によりspの値が増加したため(S401:No、S402:Yes)、最終最下スタック操作回数404には、最終最上スタック操作回数403の値である「3」が設定される(S404)。また、作業用スタック位置406の値には、spの値である0x7fe0が設定される(S404)。Step20では、return命令により、関数Func1に処理が戻る。
Step21では、変数aを利用するため、アドレス0x7ff0のデータをロードする。その際に、キャッシュライン1に変数aのデータが存在するため、この値を参照する。LRU情報131は、もっとも古くアクセスされたキャッシュラインである「キャッシュライン2(ライン2)」に変更される。
Step22では、関数Func1のスタックフレーム解放のため、add命令によりspの値は、0x8000となる。ここで、スタックフレームの確保によりspの値が増加したため(S401:No、S402:Yes)、最終最下スタック操作回数404には、最終最上スタック操作回数403の値である「3」が設定される(S404)。また、作業用スタック位置406の値には、spの値である0x8000が設定される(S404)。Step23では、プログラムの実行を終了する。
次に、本実施の形態におけるキャッシュライン入れ替え方法の効果について説明する。まず、非特許文献1に記載のキャッシュライン入れ替え方法、実施の形態1に記載のキャッシュライン入れ替え方法、および実施の形態2に記載のキャッシュライン入れ替え方法によって、図14に示すプログラムを実行した際の、キャッシュ10の動作の概要について述べる。
非特許文献1に記載のキャッシュライン入れ替え方法では、Step16で変数cを利用する際に、LRU情報131に基づいてリフィルするキャッシュラインを選択するため、変数aを保持するキャッシュライン1がリフィルの対象となる。その結果、Step21において、変数aを利用する際に、キャッシュミスとなる。
実施の形態1に記載のキャッシュライン入れ替え方法では、Step16で変数cを利用する際に、キャッシュライン2のアドレスは0x7fd0であり、spの値よりも高い。そのため、LRU情報131に基づいてリフィルするキャッシュラインを選択するため、変数aを保持するキャッシュライン1がリフィルの対象となる。その結果、Step21において、変数aを利用する際に、キャッシュミスとなる。
実施の形態2に記載のキャッシュライン入れ替え方法では、Step16で変数cを利用する際に、キャッシュライン2のアドレスは0x7fd0であり、最終最上スタック位置405の値0x7fc0よりも高い。そのため、LRU情報131に基づいてリフィルするキャッシュラインを選択するため、変数aを保持するキャッシュライン1がリフィルの対象となる。その結果、Step21において、変数aを利用する際に、キャッシュミスとなる。
本実施の形態に記載のキャッシュライン入れ替え方法では、Step16で変数cを利用する際に、キャッシュライン内のスタック操作回数が、残存最上スタック操作回数409と異なり、残存最上スタック位置410の0x7fe0より低いアドレス0x7fd0を持つ、変数bを格納したキャッシュライン2がリフィルの対象となる。その結果、Step21において、変数aを利用する際に、キャッシュヒットとなる。
本実施の形態に記載のキャッシュライン入れ替え方法では、残存ライン数と、留保ライン数と、残存最上スタック操作回数と、残存最上スタック位置と、を新たに考慮することにより、複雑な関数の呼び出しを行うプログラムの実行時であっても、キャッシュヒット率を高めることができる。
実施の形態4
本発明の実施の形態4は、実施の形態3と比べ、オーバーフローをする恐れのあるスタック操作回数113と、残存最上スタック操作回数409と、を削除し、かつ実施の形態3と同様の処理を行えることを特徴とする。
図25を参照して、本実施の形態にかかるキャッシュメモリシステムの基本構成について説明する。図25に示すキャッシュメモリシステムの基本構成は、実施の形態2にかかるキャッシュメモリシステムの構成と比べ、キャッシュライン選択処理部40から最終最上スタック位置405と、残存ライン数409と、を削除している。また、キャッシュライン101のスタック操作回数113を削除し、留保ラインフラグ114を備える。同様に、キャッシュライン102のスタック操作回数123を削除し、留保ラインフラグ124を備える。留保ラインフラグ114、および留保ラインフラグ124は、「0」または「1」の値をとるものである。留保ラインフラグが「1」である場合、キャッシュライン内のデータが留保ライン数408にカウントされていることを示す。
図26は、本実施の形態において追加される情報の初期値を示す図である。留保ラインフラグ114、および留保ラインフラグ124の初期値は、キャッシュラインのアドレスがスタック領域内である場合は「1」となり、それ以外は「0」となる。
図27は、本実施の形態にかかるプログラムの開始処理を示す図である。実施の形態1の処理に加え、最終最上スタック操作回数403と、最終最下スタック操作回数404と、作業用スタック位置406と、残存ライン数407と、留保ライン数408と、残存最上スタック位置410と、の初期化処理(S207)を実行する。初期化処理(S207)とは、各情報を上述の初期値(図8、図18)に設定する処理である。
図28は、スタックフレーム確保・解放時に、CPU30からspの値の通知があった場合の、キャッシュライン選択処理部40の処理を示すフローチャートである。スタックフレーム解放時の処理は、実施の形態2における処理と同じである。以下に、スタックフレーム確保時の処理について説明する。
関数呼び出しによりスタックフレームが確保され、spの値が低下した場合(S401:Yes)、最終最上スタック操作回数403には、最終最下スタック操作回数404に「1」を加算した値が設定される(S410)。
最終最上スタック操作回数403への値の設定(S410)により、最終最上スタック操作回数403の値に変化があったか否かを判定する(S405)。ここで、実施の形態3における処理(図20)と異なり、最終最上スタック操作回数403がオーバーフローとなる場合であっても、問題は生じない。
最終最上スタック操作回数403の値に変化があった場合(S405:Yes)、留保ライン数408が残存ライン数407以上であるか否かを判定する(S408)。留保ライン数408が残存ライン数407以上である場合(S408:Yes)、以下の設定(S411)を行う。残存最上スタック位置410には、作業用スタック位置406の値が設定される。ここで、キャッシュライン中のデータは、全て残存ライン数407のデータとして扱う。そのため、残存ライン数407には、残存ライン数407に留保ライン数408を加算した値を設定する。また、留保ライン数408には、「0」を設定する。全てのキャッシュラインの留保ラインフラグには、「0」を設定する。
続いて、図30Aおよび図30Bを参照し、本実施の形態にかかるキャッシュラインのリフィル手順について説明する。図30Aおよび図30B内で用いる分岐条件を図29に示す。本実施の形態で用いる分岐条件(図29)は、実施の形態3の分岐条件(図21)と比べ、条件3が条件5に入れ替わったものである。条件5は、キャッシュライン内の留保ラインフラグが「0」であるか否かを判定する条件である。ここでは、実施の形態3と異なる処理を中心に説明する。
図30Aおよび図30BにおけるS319、S320、S321、S322、およびS323の処理は、実施の形態3で残存最上スタック操作回数409とスタック操作回数との比較を行っていた処理(条件3)を、留保ラインフラグが「0」であるか否かを判定する処理(条件5)に変更したものである。
リフィル処理の後(S305)、リフィルしたキャッシュラインがスタック領域に存在する場合(S317:Yes)、リフィルしたキャッシュラインの留保ラインフラグに「1」を設定する(S324)。また、留保ライン数408を「1」増加する(S324)。
図31Aおよび図31Bは、本実施の形態にかかるキャッシュラインの入れ替え方法により、図14に示すプログラムを実行した際の実行トレース結果を示す図である。また、図32は、図14に示すプログラムを実行した際のspの値の推移を示す図である。なお、キャッシュ10のデータ格納構造は図5に示したものと同様とする。
図31Aおよび図31Bに示した実行トレース結果について説明する。以下の例では、スタック開始位置401を0x8000、スタック終了位置402を0x7000、スタックポインタの初期値を0x8000とする。また、LRU情報131の初期値は、「キャッシュライン1」を指すものとする。変数に割り当てられるアドレスにより、変数a,b,cはキャッシュライン上で同じ領域を示すものとする。
Step1では、関数Func1のスタックフレーム確保のため、sub命令でspの値は0x7fe0となる。また、変数aのアドレスは0x7ff0に割り当てるものとする。ここで、スタックフレームの確保によりspの値が低下したため(S401:Yes)、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「0」に「1」を加算した「1」が設定される(S410)。また、最終最上スタック操作回数403の値が変化し(S405:Yes)、留保ライン数408が残存ライン数407以上となっているため(S408:Yes)、残存最上スタック位置410には、作業用スタック位置406の値である0x8000が設定される(S411)。残存ライン数407、および留保ライン数408はともに「0」であるため、値は変化しない(S411)。キャッシュライン中の留保ラインフラグは全て「0」に設定される(S411)。
Step2では、変数aを利用するため、アドレス0x7ff0のデータをロードする。その際に、スタック開始位置と終了位置との間のアドレス値を持つキャッシュラインが存在しないため(S301:No)、LRU情報131が指すキャッシュラインである「キャッシュライン1(ライン1)」を選択し(S304)、キャッシュライン1に変数aのデータと、アドレスとを設定する(S305)。リフィルしたキャッシュラインが、スタック領域に存在するため(S317:Yes)、キャッシュライン1の留保ラインフラグに「1」を設定する(S324)。また、留保ライン数408に「1」を加算した「1」を設定する(S324)。LRU情報131は、アクセスがされていない「キャッシュライン2(ライン2)」に変更される。Step3では、関数の呼び出し命令のため、関数Func2の処理へ分岐する。
Step4では、関数Func2のスタックフレーム確保のため、sub命令によってspの値は、0x7fc0になる。また、変数bのアドレスは、0x7fd0に割り当てるものとする。ここで、スタックフレームの確保によりspの値が低下したため(S401:Yes)、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「0」に「1」を加算した「1」が設定される(S410)。最終最上スタック操作回数403の値は「1」のまま変化しないため(S405:No)、処理を終了する。
Step5では、変数bを利用するため、アドレス0x7fd0のデータをロードする。その際に、スタック開始位置と終了位置との間のアドレス値を持つキャッシュラインが存在し(S301:Yes)、現在のspの値よりも低いアドレスを持つキャッシュラインが存在せず(S302:No)、キャッシュライン中の留保ラインフラグが「0」であるキャッシュラインが存在しないため(S319:No)、LRU情報131が指すキャッシュラインである「キャッシュライン2(ライン2)」を選択する(S304)。ここで、留保ライン数408の減算は行わず(S323:No)、キャッシュライン2に変数bのデータと、アドレスと、を設定する(S305)。また、キャッシュライン2の留保ラインフラグに「1」を設定する(S317:Yes、S324)。また、留保ライン数に「1」を加算した「2」を設定する(S324)。LRU情報131は、アクセスがされていない「キャッシュライン1(ライン1)」に変更される。
Step6では、関数Func2のスタックフレーム解放のため、add命令によりspの値は、0x7fe0となる。ここで、スタックフレームの確保によりspの値が増加したため(S401:No、S402:Yes)、最終最下スタック操作回数404には、最終最上スタック操作回数403の値である「1」が設定される(S404)。また、作業用スタック位置406の値には、spの値である0x7fe0が設定される(S404)。
Step7では、return命令により、関数Func1に処理が戻る。Step8では、関数の呼び出し命令のため、関数Func3の処理へ分岐する。
Step9では、関数Func3のスタックフレーム確保のため、sub命令によってspの値は、0x7fc0になる。ここで、スタックフレームの確保によりspの値が低下したため(S401:Yes)、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「1」に「1」を加算した「2」が設定される(S410)。最終最上スタック操作回数403の値が変化し(S405:Yes)、留保ライン数408が残存ライン数407以上であるため(S408:Yes)、以下の処理(S411)を行う。
残存最上スタック位置410には、作業用スタック位置406の値である0x7fe0を設定する。残存ライン数407には、残存ライン数407に留保ライン数408を加算した値である「2」を設定する。また全てのキャッシュラインの留保ラインフラグには、「0」を設定する。Step10では、関数の呼び出し命令のため、関数Func4の処理へ分岐する。
Step11では、関数Func4のスタックフレーム確保のため、sub命令によってspの値は、0x7fa0になる。ここで、スタックフレームの確保によりspの値が低下したため(S401:Yes)、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「1」に「1」を加算した「2」が設定される(S410)。最終最上スタック操作回数403の値は変化しないため(S405:No)、処理は終了する。
Step12では、関数Func4のスタックフレーム解放のため、add命令によりspの値は、0x7fc0となる。ここで、スタックフレームの確保によりspの値が増加したため(S401:No、S402:Yes)、最終最下スタック操作回数404には、最終最上スタック操作回数403の値である「2」が設定される(S404)。また、作業用スタック位置406の値には、spの値である0x7fc0が設定される(S404)。
Step13では、return命令により、関数Func3に処理が戻る。Step14では、関数の呼び出し命令のため、関数Func5の処理へ分岐する。
Step15では、関数Func5のスタックフレーム確保のため、sub命令によってspの値は、0x7fa0になる。また、変数cのアドレスは、0x7fb0に割り当てるものとする。ここで、スタックフレームの確保によりspの値が低下したため(S401:Yes)、最終最上スタック操作回数403には、最終最下スタック操作回数404の値「2」に「1」を加算した「3」が設定される(S410)。最終最上スタック操作回数403の値は変化したが(S405:Yes)、留保ライン数408が残存ライン数407未満であるため(S408:No)、処理を終了する。
Step16では、変数cを利用するため、アドレス0x7fb0のデータをロードする。その際に、スタック開始位置と終了位置との間のアドレス値を持つキャッシュラインが存在し(S301:Yes)、現在のspの値よりも低いアドレスを持つキャッシュラインが存在せず(S302:No)、キャッシュライン中の留保ラインフラグが「0」であるキャッシュラインが存在し(S319:Yes)、キャッシュラインのアドレスが、残存最上スタック位置410よりも低い値であるキャッシュラインがあるため(S320:Yes)、条件を満たす「キャッシュライン2(ライン2)」を選択する(S321)。選択したキャッシュライン2が、スタック開始位置と終了位置との間のアドレス値を持ち、留保ラインフラグが「0」であるため(S322:Yes)、残存ライン数407を「1」減らす(S314)。その後、キャッシュライン2に変数cのデータと、アドレスとを設定する(S305)。リフィルしたキャッシュラインが、スタック領域に存在するため(S317:Yes)、キャッシュライン2の留保ラインフラグに「1」を設定する(S324)。また、留保ライン数408に「1」を加算した「1」を設定する(S324)。LRU情報131は、アクセスがされていない「キャッシュライン1(ライン1)」に変更される。
Step17では、関数Func5のスタックフレーム解放のため、add命令によりspの値は、0x7fc0となる。ここで、スタックフレームの確保によりspの値が増加したため(S401:No、S402:Yes)、最終最下スタック操作回数404には、最終最上スタック操作回数403の値である「3」が設定される。また、作業用スタック位置406の値には、spの値である0x7fc0が設定される。Step18では、return命令により、関数Func3に処理が戻る。
Step19では、関数Func3のスタックフレーム解放のため、add命令によりspの値は、0x7fe0となる。ここで、スタックフレームの確保によりspの値が増加したため(S401:No、S402:Yes)、最終最下スタック操作回数404には、最終最上スタック操作回数403の値である「3」が設定される(S404)。また、作業用スタック位置406の値には、spの値である0x7fe0が設定される(S404)。Step20では、return命令により、関数Func1に処理が戻る。
Step21では、変数aを利用するため、アドレス0x7ff0のデータをロードする。その際に、キャッシュライン1に変数aのデータが存在するため、この値を参照する。LRU情報131は、もっとも古くアクセスされたキャッシュラインである「キャッシュライン2(ライン2)」に変更される。
Step22では、関数Func1のスタックフレーム解放のため、add命令によりspの値は、0x8000となる。ここで、スタックフレームの確保によりspの値が増加したため(S401:No、S402:Yes)、最終最下スタック操作回数404には、最終最上スタック操作回数403の値である「3」が設定される(S404)。また、作業用スタック位置406の値には、spの値である0x8000が設定される(S404)。Step23では、プログラムの実行を終了する。
次に、本実施の形態におけるキャッシュライン入れ替え方法の効果について説明する。上記の一連の処理により、実施の形態3における最終最上スタック位置405と、残存最上スタック操作回数409とを、削除し、オーバーフローの判定(図20のS406)を行わない場合であっても、Step21において、変数aがキャッシュヒットできる。これは、各キャッシュラインが、留保ラインフラグを備えたことによる。オーバーフローの判定を行わないことにより、本実施の形態にかかるキャッシュライン選択方法は、実施の形態3に比べて処理の高速化が図れる。
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。