JP2011022746A - キャッシュメモリのデータ入れ替え方法 - Google Patents

キャッシュメモリのデータ入れ替え方法 Download PDF

Info

Publication number
JP2011022746A
JP2011022746A JP2009166451A JP2009166451A JP2011022746A JP 2011022746 A JP2011022746 A JP 2011022746A JP 2009166451 A JP2009166451 A JP 2009166451A JP 2009166451 A JP2009166451 A JP 2009166451A JP 2011022746 A JP2011022746 A JP 2011022746A
Authority
JP
Japan
Prior art keywords
stack
cache line
value
cache
operation count
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2009166451A
Other languages
English (en)
Other versions
JP2011022746A5 (ja
Inventor
Mitsuru Nakagawa
満 中川
Masanao Sasai
政尚 笹井
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Renesas Electronics Corp
Original Assignee
Renesas Electronics Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Renesas Electronics Corp filed Critical Renesas Electronics Corp
Priority to JP2009166451A priority Critical patent/JP2011022746A/ja
Publication of JP2011022746A publication Critical patent/JP2011022746A/ja
Publication of JP2011022746A5 publication Critical patent/JP2011022746A5/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Memory System Of A Hierarchy Structure (AREA)

Abstract

【課題】すでに不要となったデータもつキャッシュラインを優先的にリフィルするキャッシュライン選択方法を提供すること
【解決手段】実行中のプログラムにおけるサブルーチンの呼び出し情報であるコールスタックの情報をCPU30から受け付ける。キャッシュライン選択処理部40は、コールスタックの情報を参照することにより、以後のプログラムの実行において参照されることがないデータを保持するキャッシュラインを選択し、前記キャッシュラインを優先的に入れ替え対象とする。
【選択図】図1

Description

本発明はキャッシュメモリにおけるキャッシュラインの入れ替え方法に関する。
キャッシュメモリは、小容量の記憶装置で構成されるため、主記憶装置よりも記憶できるデータ容量が少ない。しかし、キャッシュメモリへはデータに拘束にアクセスすることができる。そのため、頻繁に参照するデータをキャッシュメモリに格納しておくことにより、CPU(Central Processing Unit: 中央演算処理装置)からメモリへのアクセスタイムを短縮することができ、システム性能を向上させることができる。キャッシュメモリは、データをラインと呼ばれる(以後、キャッシュラインと表現する。)ある程度まとまった単位で管理し、必要に応じて保持するキャッシュラインのデータを入れ替える(以下、キャッシュラインのデータの入れ替えを、キャッシュラインをリフィルする、という。)。
ここで、非特許文献1に記載のキャッシュラインの入れ替え方法について説明する。図33の構成図は一般的なLRU(Least Recently Used)アルゴリズムを用いたキャッシュラインの入れ替えを行うキャッシュを含むキャッシュメモリシステムの基本構成を示す図である。図33には、キャッシュ10と、メモリ20と、CPU30と、キャッシュライン選択処理部40と、が示されている。
キャッシュ10は、キャッシュライン101と、キャッシュライン102と、LRU情報テーブル103と、を備える。なお、キャッシュラインサイズは任意の大きさでよく、複数のキャッシュラインを有することができる。
キャッシュライン101は、メモリアクセス先のアドレス情報111と、データ112との組を複数保持する。同様に、キャッシュライン102は、メモリアクセス先のアドレス情報121と、データ122との組を複数保持する。LRU情報テーブル103は、キャッシュラインのリフィルにおいて、選択対象毎のLRU情報131を保持する。LRU情報131は、リフィルの対象となるキャッシュラインの中で、データアクセスがされてから最も時間が経過しているキャッシュラインを示す。
メモリ20は、実行されるプログラム、その他のデータを格納するRAM(Random Access Memory)等の記憶装置である。CPU30は、制御プログラムに基づいて、このシステム内の各種処理を実行する中央制御装置である。
キャッシュライン選択処理部40は、キャッシュラインのリフィルの必要が生じた際に、リフィル対象とするキャッシュラインを選択する処理部である。キャッシュライン選択処理部40は、LRU情報131に基づいて、リフィル対象となるキャッシュラインを選択する。
キャッシュ20のデータ格納構造について説明する。図34は、2Wayのセット・アソシアティブ方式のデータ格納構造をもつキャッシュの図である。図示したデータ格納構造では、アドレス0x10*n+N (nは0以上の整数、N は0x0から0xf)のデータが、2つあるキャッシュラインのアドレスNに対応しており、ここにデータを格納する。
CPU30は、プログラムカウンタにより命令を順次実行し、命令にメモリアクセスがある場合、以下の動作を行う。
アクセスするアドレスに対応するキャッシュラインが、キャッシュテーブルに存在する場合、そのキャッシュラインに格納されたデータを用いる。アクセスするアドレスに対応するキャッシュラインが、キャッシュテーブルに存在しない場合、メモリアクセス先のアドレスからキャッシュラインのリフィルに用いる選択対象のLRU情報を取得する。キャッシュライン選択処理部40は、取得したLRU情報に基づき、アクセスが最も古いキャッシュラインを選択する。キャッシュライン選択処理部40は、選択したキャッシュラインのアドレス情報と、データと、を更新する。
LRU情報テーブル103は、アクセスするアドレスに対応するキャッシュラインの情報から、キャッシュラインに対応するLRU情報131に対して最後に利用したキャッシュラインの情報を反映する。
John L. Hennessy, David A. Patterson著、コンピュータの構成と設計―ハードウエアとソフトウエアのインタフェース 第3版(上)(下)ISBN-13: 978-4822282660、ISBN-13: 978-4822282677
しかしながら、非特許文献1のキャッシュラインの入れ替え方法では、リフィルの対象とすべきキャッシュラインの選択を誤り、キャッシュミスを起こす場合があるという問題がある。以下に、非特許文献1のキャッシュラインの入れ替え方法では、キャッシュミスを引き起こす具体例を説明する。
図35は、以後の説明に用いる実行プログラムを、(簡易的な記載をした)C言語のソースプログラム(Cソース)と、アセンブリコード(asmソース)と、を用いて示す図である。また、図35には、命令がロードされるアドレス情報(アドレス)も図示している。図36は、asmソース内の命令動作を記述したものである。図35に示したasmソースは、図35に示したCソースの動作を図36に示す命令で記述したものである。図37は、図35に示したasmソースの命令を実行した際の実行トレース結果を示す図である。図37の実行トレース結果は、アドレスで参照されるasmソースの命令を実行した際の、sp(スタックポインタ)の値と、キャッシュラインの内容と、LRU情報と、を示している。図37内の、「キャッシュライン1」、「キャッシュライン2」は、そのStepでのキャッシュラインに設定されているデータと、アドレスと、を示す。キャッシュラインをリフィルする際の、キャッシュラインの選択にはLRU情報を利用する。
非特許文献1に記載のLRU情報を利用したキャッシュラインの選択では、最後にアクセスしたデータをキャッシュラインに残す。そのため、図35に示すようなプログラムのケースでは、図37のStep8において、最後にアクセスしたデータ(c)をキャッシュラインに残してしまう。
以下に、図37の実行トレースの詳細を説明する。以下の例では、コールスタックの開始位置(スタック開始位置)を0x8000、コールスタックの終了位置(スタック終了位置)を0x7000、スタックポインタの初期値を0x80000とする。また、LRU情報131の初期値は、「キャッシュライン1」を指すものとする。変数に割り当てられるアドレスにより、変数a,b,cはキャッシュライン上で同じ領域を示すものとする。
Step1では、関数Func1のスタックフレーム確保のため、sub命令でspの値は0x7fe0となる。また、変数aのアドレスは0x7ff0、変数bのアドレスは0x7fe0に割り当てるものとする。
Step2では、変数aを利用するため、アドレス0x7ff0のデータをロードする。その際に、LRU情報が指すキャッシュラインが「キャッシュライン1(ライン1)」であるため、キャッシュライン1に変数aのデータと、アドレスと、を設定する。また、LRU情報131は、アクセスがされていない「キャッシュライン2(ライン2)」に変更される。Step3では、関数の呼び出し命令のため、関数Func2の処理へ分岐する。
Step4では、関数Func2のスタックフレーム確保のため、sub命令によってspの値は、0x7fc0になる。また、変数cのアドレスは、0x7fd0に割り当てるものとする。Step5では、変数cを利用するため、アドレス0x7fd0のデータをロードする。その際に、LRU情報131が指すキャッシュラインが「キャッシュライン2(ライン2)」であるため、キャッシュライン2に変数cのデータと、アドレスと、を設定する。また、LRU情報は、もっとも古くアクセスされたキャッシュラインである「キャッシュライン1(ライン1)」に変更される。
Step6では、関数Func2のスタックフレーム解放のため、add命令によりspの値は、0x7fe0となる。Step7では、return命令により、関数Func1に処理が戻る。
Step8では、変数bを利用するため、アドレス0x7fe0のデータをロードする。その際、キャッシュライン1およびキャッシュライン2には、変数bのデータが存在しないため、LRU情報131が指すキャッシュライン1をリフィルして、変数bのデータと、アドレスと、を設定する。また、LRU情報131は、もっとも古くアクセスされたキャッシュラインである「キャッシュライン2(ライン2)」に変更される。
Step9では、変数aを利用するため、アドレス0x7ff0のデータをロードする。その際、キャッシュライン1およびキャッシュライン2には、変数aのデータが存在しないため、LRU情報131が指すキャッシュライン2をリフィルして、変数aのデータと、アドレスと、を設定する。また、LRU情報131は、もっとも古くアクセスされたキャッシュラインである「キャッシュライン1(ライン1)」に変更される。
Step10では、関数Func1のスタックフレーム解放のため、add命令によりspの値は、0x8000となる。Step11では、プログラムの実行を終了する。
Step8で変数bを利用する際には、関数Func2から処理がFunc1に戻っているため、以降の処理で変数cを利用することはない。しかし、非特許文献1に記載のLRU情報を利用したキャッシュラインの選択では、Step8において、LRU情報131が指すキャッシュライン1(変数a)を選択してリフィルする。そのため、Step9で変数aを利用する時点でキャッシュミスとなる。すなわち、LRU情報のみに基づいてリフィルするキャッシュラインの選択を行っているため、すでに不要となったデータもつキャッシュラインをリフィルしないという問題点がある。
本発明にかかるキャッシュライン入れ替え方法の一態様は、キャッシュメモリにおけるデータの管理の単位であるキャッシュラインの入れ替え方法であって、実行中のプログラムにおけるサブルーチンの呼び出し情報であるコールスタックの情報を参照することにより、以後のプログラムの実行において参照されることがないデータを保持するキャッシュラインである対象キャッシュラインとして選択し、前記対象キャッシュラインを優先的に入れ替え対象とするものである。
本発明は、サブルーチンの呼び出し情報であるコールスタックの情報を参照することにより、LRU情報を用いたキャッシュの選択に優先して、すでに不要となったデータを持つキャッシュラインを選択することができる。
本発明により、すでに不要となったデータもつキャッシュラインを優先的にリフィルするキャッシュライン入れ替え方法を提供することができる。
実施の形態1にかかるキャッシュメモリシステムの構成図である。 実施の形態1にかかるプログラム開始処理のフローチャートである。 実施の形態1にかかるキャッシュラインのリフィル手順の図である。 実施の形態1にかかるキャッシュのリフィル手順を利用した場合の、プログラムの実行トレース結果の図である。 実施の形態2において、説明に利用するプログラムの図である。 実施の形態2において、プログラムの実行内で注目するspの値を示す図である。 実施の形態2にかかるキャッシュメモリシステムの構成図である。 実施の形態2にかかるキャッシュの構成で追加された情報の初期値を説明する図である。 実施の形態2にかかるプログラム開始処理のフローチャートである。 実施の形態2にかかるスタックフレーム確保・解放時の処理のフローチャートである。 実施の形態2にかかるキャッシュラインのリフィル手順の図である。 実施の形態2にかかるキャッシュのリフィル手順を利用した場合の、プログラムの実行トレース結果の図である。 実施の形態2にかかるspの遷移を表す図である。 実施の形態2、実施の形態3の説明に利用するプログラムの図である。 実施の形態3において、プログラムの実行内で注目するspの値を示す図である。 実施の形態3において、プログラムの実行内で注目するspの値を示す図である。 実施の形態3にかかるキャッシュメモリシステムの構成図である。 実施の形態3にかかるキャッシュの構成で追加された情報の初期値を説明する図である。 実施の形態3にかかるプログラム開始処理のフローチャートである。 実施の形態3にかかるスタックフレーム確保、解放時の処理のフローチャートである。 実施の形態3にかかるキャッシュリフィル処理に用いる条件を表す図である。 実施の形態3にかかるにかかるキャッシュラインのリフィル手順の図である。 実施の形態3にかかるにかかるキャッシュラインのリフィル手順の図である。 実施の形態3にかかるキャッシュのリフィル手順を利用した場合の、プログラムの実行トレース結果の図である。 実施の形態3にかかるキャッシュのリフィル手順を利用した場合の、プログラムの実行トレース結果の図である。 実施の形態3にかかるspの遷移を表す図である。 実施の形態4にかかるキャッシュメモリシステムの構成図である。 実施の形態4にかかるキャッシュの構成で追加された情報の初期値を説明する図である。 実施の形態4にかかるプログラム開始処理のフローチャートである。 実施の形態4にかかるスタックフレーム確保、解放時の処理のフローチャートである。 実施の形態4にかかるキャッシュリフィル処理に用いる条件を表す図である。 実施の形態4にかかるにかかるキャッシュラインのリフィル手順の図である。 実施の形態4にかかるにかかるキャッシュラインのリフィル手順の図である。 実施の形態4にかかるキャッシュのリフィル手順を利用した場合の、プログラムの実行トレース結果の図である。 実施の形態4にかかるキャッシュのリフィル手順を利用した場合の、プログラムの実行トレース結果の図である。 実施の形態4にかかるspの遷移を表す図である。 従来のLRUを用いたキャッシュメモリシステムの構成図である。 キャッシュのデータ格納構造の図である。 従来のLRUを用いたキャッシュライン入れ替え、および実施の形態1の説明に用いる実行プログラムの図である。 実施の形態1、実施の形態2、実施の形態3、および実施の形態4にかかるasmソース内の命令動作の説明である。 従来のLRUアルゴリズムを利用した場合の、プログラムの実行トレース結果の図である。
実施の形態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に比べて処理の高速化が図れる。
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
10 キャッシュ
101 キャッシュライン1
102 キャッシュライン2
103 LRU情報テーブル
131 LRU情報
20 メモリ
30 CPU
40 キャッシュライン選択処理部
401 スタック開始位置
402 スタック終了位置

Claims (10)

  1. キャッシュメモリにおけるデータの管理の単位であるキャッシュラインの入れ替え方法であって、
    実行中のプログラムにおけるサブルーチンの呼び出し情報であるコールスタックの情報を参照することにより、以後のプログラムの実行において参照されることがないデータを保持するキャッシュラインを対象キャッシュラインとして選択し、前記対象キャッシュラインを優先的に入れ替え対象とするキャッシュライン入れ替え方法。
  2. 前記キャッシュラインの選択の際に、
    前記コールスタックの情報を格納するスタック領域の開始アドレスおよび終了アドレスと、前記キャッシュラインに保持されたデータのアドレス情報と、を比較し、
    前記キャッシュラインに保持されたデータのアドレスの値が前記スタック領域内に存在し、前記キャッシュラインに保持されたデータのアドレスの値が前記スタックポインタの値よりも低い値を持つ前記キャッシュラインを前記対象キャッシュラインとして選択する請求項1に記載のキャッシュライン選択方法。
  3. 作業スタック位置として、前記コールスタックのスタックフレーム解放時に、前記スタックポインタの値を記憶し、
    最終最上スタック位置として、前記コールスタックのスタックフレーム確保時に、前記作業用スタック位置と等しい値を設定した値を記憶し、
    最終最上スタック操作回数として、前記コールスタックのスタックフレーム確保時に、最終最下スタック操作回数に1を加算した値を設定した値を記憶し、
    前記最終最下スタック操作回数として、前記コールスタックのスタックフレーム解放時に、前記最終最上スタック操作回数と等しい値を設定した値を記憶し、
    前記キャッシュラインに保持されたデータが前記スタック領域内に存在し、前記キャッシュラインに保持されたデータのアドレスの値が前記スタックポインタの値よりも高い、または等しい値であり、前記スタック操作回数と前記最終最上スタック操作回数との差が0ではなく、かつ前記キャッシュラインのアドレスが前記最終最上スタック位置よりも低い値を持つ前記キャッシュラインを前記対象キャッシュラインとして選択する請求項2に記載のキャッシュライン入れ替え方法。
  4. 作業スタック位置として、前記コールスタックのスタックフレーム解放時に、前記スタックポインタの値を記憶し、
    最終最上スタック位置として、前記コールスタックのスタックフレーム確保時に、前記作業用スタック位置と等しい値を設定した値を記憶し、
    最終最上スタック操作回数として、前記コールスタックのスタックフレーム確保時に、最終最下スタック操作回数に1を加算した値を設定した値を記憶し、
    前記最終最下スタック操作回数として、前記コールスタックのスタックフレーム解放時に、前記最終最上スタック操作回数と等しい値を設定した値を記憶し、
    残存最上スタック位置として、前記コールスタックのスタックフレーム確保時に、実行中のプログラムの開始時から現在の実行時までの範囲において、前記範囲の前半のプロセス実行時に格納されたキャッシュラインのデータ数が前記範囲の後半のプロセス実行時に格納されたキャッシュラインのデータ数以上となる時点の前記スタックポインタの値を記憶し、
    残存ライン数として、前記最上スタック位置を設定した範囲以前に、前記スタック領域に格納したキャッシュラインの数を設定した値を記憶し、
    留保ライン数として、前記最上スタック位置を設定した範囲以後に、前記スタック領域に格納したキャッシュラインの数を設定した値を記憶し、
    残存最上スタック操作回数として、前記残存最上スタック位置が設定された際に、前記最終最上スタック操作回数と等しい値を設定した値を記憶し、
    前記キャッシュラインに保持されたデータが前記スタック領域内に存在し、前記キャッシュラインに保持されたデータのアドレスの値が前記スタックポインタの値よりも高い、または等しい値であり、前記スタック操作回数が前記残存最上スタック操作回数よりも小さく、かつ前記キャッシュラインのアドレスが前記残存最上スタック位置よりも低い値を持つ前記キャッシュラインを前記対象キャッシュラインとして選択する請求項2に記載のキャッシュライン入れ替え方法。
  5. 作業スタック位置として、前記スタック領域の解放時に、前記スタックポインタの値を記憶し、
    最終最上スタック操作回数として、前記コールスタックのスタックフレーム確保時に、最終最下スタック操作回数に1を加算した値を設定した値を記憶し、
    最終最下スタック操作回数として、前記コールスタックのスタックフレーム解放時に、前記最終最上スタック操作回数と等しい値を設定した値を記憶し、
    残存最上スタック位置として、前記コールスタックのスタックフレーム確保時に、実行中のプログラムの開始時から現在の実行時までの範囲において、前記範囲の前半のプロセス実行時に格納されたキャッシュラインのデータ数が前記範囲の後半のプロセス実行時に格納されたキャッシュラインのデータ数以上となる時点の前記スタックポインタの値を記憶し、
    残存ライン数として、前記最上スタック位置を設定した範囲以前に、前記スタック領域に格納したキャッシュラインの数を設定した値を記憶し、
    留保ライン数として、前記最上スタック位置を設定した範囲以後に、前記スタック領域に格納したキャッシュラインの数を設定した値を記憶し、
    前記キャッシュラインは、キャッシュライン内に格納したデータが前記留保ライン数にカウントされているか否かを示す留保ラインフラグを備え、
    前記キャッシュラインに保持されたデータが前記スタック領域内に存在し、前記キャッシュラインに保持されたデータのアドレスの値が前記スタックポインタの値よりも高い、または等しい値であり、
    前記キャッシュラインのアドレスが前記残存最上スタック位置よりも低い値を持ち、前記キャッシュライン内の前記留保フラグが前記留保ライン数にカウントされていないことを表す値である前記キャッシュラインを前記対象キャッシュラインとして選択する請求項2に記載のキャッシュライン入れ替え方法。
  6. 選択された前記キャッシュラインの中から、前記キャッシュラインに保持されたデータへのアクセス状況に基づいて入れ替えを行うキャッシュラインを決定する請求項2から請求項5のいずれか一に記載のキャッシュライン選択方法。
  7. 前記アクセス状況はLRU(Least Recently Used)であることを特徴とする請求項6に記載のキャッシュライン入れ替え方法。
  8. 実行中のプログラムにおけるサブルーチンの呼び出し情報であるコールスタックの情報をCPU(Central Processing Unit)から受け付け、キャッシュメモリ内のデータの管理の単位であるキャッシュラインの情報を取得し、前記コールスタックの情報と、前記キャッシュラインの情報とに基づき、以後のプログラム実行において参照されることがないデータを保持するキャッシュラインを選択するキャッシュライン選択処理部、を備えるキャッシュ選択処理装置。
  9. 請求項8に記載のキャッシュ選択処理装置と、キャッシュメモリと、を備えるキャッシュ装置。
  10. 請求項9に記載のキャッシュ装置を備えるCPU装置。
JP2009166451A 2009-07-15 2009-07-15 キャッシュメモリのデータ入れ替え方法 Pending JP2011022746A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2009166451A JP2011022746A (ja) 2009-07-15 2009-07-15 キャッシュメモリのデータ入れ替え方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2009166451A JP2011022746A (ja) 2009-07-15 2009-07-15 キャッシュメモリのデータ入れ替え方法

Publications (2)

Publication Number Publication Date
JP2011022746A true JP2011022746A (ja) 2011-02-03
JP2011022746A5 JP2011022746A5 (ja) 2012-04-05

Family

ID=43632772

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009166451A Pending JP2011022746A (ja) 2009-07-15 2009-07-15 キャッシュメモリのデータ入れ替え方法

Country Status (1)

Country Link
JP (1) JP2011022746A (ja)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS62298850A (ja) * 1986-06-19 1987-12-25 Nec Corp バツフアメモリ装置
JPS6446858A (en) * 1987-08-17 1989-02-21 Fuji Xerox Co Ltd Data processor
JPH05143330A (ja) * 1991-07-26 1993-06-11 Mitsubishi Electric Corp スタツクキヤツシユの制御方式及びスタツクキヤツシユ
JP2004178016A (ja) * 2002-11-22 2004-06-24 Sharp Corp Cpuおよびこれを備えた情報処理装置、cpuの制御方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS62298850A (ja) * 1986-06-19 1987-12-25 Nec Corp バツフアメモリ装置
JPS6446858A (en) * 1987-08-17 1989-02-21 Fuji Xerox Co Ltd Data processor
JPH05143330A (ja) * 1991-07-26 1993-06-11 Mitsubishi Electric Corp スタツクキヤツシユの制御方式及びスタツクキヤツシユ
JP2004178016A (ja) * 2002-11-22 2004-06-24 Sharp Corp Cpuおよびこれを備えた情報処理装置、cpuの制御方法

Similar Documents

Publication Publication Date Title
US9372811B2 (en) Retention priority based cache replacement policy
CN111344684B (zh) 多层缓存安置机制
EP2593861B1 (en) System and method to allocate portions of a shared stack
US8909870B2 (en) Cache evictions from data cache based on content of address translation table cache and address translation table
JP4829191B2 (ja) キャッシュシステム
US9990299B2 (en) Cache system and method
CN108984130A (zh) 一种分布式存储的缓存读取方法及其装置
US8086804B2 (en) Method and system for optimizing processor performance by regulating issue of pre-fetches to hot cache sets
KR20210019584A (ko) 다중 테이블 분기 타겟 버퍼
CN106066831B (zh) 存储器管理
US9384131B2 (en) Systems and methods for accessing cache memory
JP2011095852A (ja) キャッシュメモリ制御回路
US9996478B1 (en) No allocate cache policy
CN109597771B (zh) 用于控制分层存储器系统的方法和装置
JP2007272681A (ja) キャッシュメモリ装置及びそのキャッシュラインの入れ替え方法
JP2011022746A (ja) キャッシュメモリのデータ入れ替え方法
EP2192493A1 (en) Method of paging on demand for virtual memory management in a processing system, and corresponding processing system
US20160179676A1 (en) Cleaning a write-back cache
US20170357585A1 (en) Setting cache entry age based on hints from another cache level
JP2011141754A (ja) キャッシュメモリ
US20090164726A1 (en) Programmable Address Processor for Graphics Applications
KR102058739B1 (ko) 비휘발성 메모리의 데이터 스와핑 방법 및 장치
Banerjee et al. A New Proposed Hybrid Page Replacement Algorithm (HPRA) in Real Time Systems.
US8065485B2 (en) Method and apparatus for determining cache storage locations based on latency requirements
CN114600091A (zh) 基于重用距离的高速缓存管理

Legal Events

Date Code Title Description
A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120217

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20120217

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20130627

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130709

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20131119