(57)【特許請求の範囲】
【請求項１】
複数のプロセッサにそれぞれ対応し、メインメモリに格納された命令およびデータの一部を格納する複数のキャッシュメモリと、
前記複数のキャッシュメモリにそれぞれ対応する複数のキャッシュメモリ制御手段と、
前記複数のプロセッサを相互に接続し、前記複数のプロセッサのうちの第１のプロセッサより前記第１のプロセッサとは異なる第２のプロセッサに対応するキャッシュメモリを操作する指令を受け、前記第２のプロセッサに対応するキャッシュメモリ制御手段へ当該キャッシュメモリを操作する指令を出力するプロセッサ間通信手段とを備え、
前記第２のプロセッサに対応するキャッシュメモリ制御手段は、前記プロセッサ間通信手段からの指令に基づいて、前記第２のプロセッサに対応するキャッシュメモリを操作する
ことを特徴とするコンピュータシステム。
【請求項２】
さらに、プログラムを実行しているプロセッサを識別するプロセッサ識別手段を備え、
前記第１のプロセッサは、前記第２のプロセッサの識別情報を受け、前記第２のプロセッサの識別情報に基づいて、前記プロセッサ間通信手段に対し、前記第２のプロセッサに対応するキャッシュメモリを操作する指令を発行する
ことを特徴とする請求項１に記載のコンピュータシステム。
【請求項３】
前記プロセッサ識別手段は、前記複数のプロセッサの各々に対し割り振られた一意な番号を返すための機械語命令をプロセッサに実行させることにより実現される
ことを特徴とする請求項２に記載のコンピュータシステム。
【請求項４】
前記プロセッサ間通信手段は、前記第１のプロセッサから指令を受付けると、前記第２のプロセッサに対応するキャッシュメモリに対して、プリパージまたはプリフェッチの指令を送出する
ことを特徴とする請求項１〜３のいずれか１項に記載のコンピュータシステム。
【請求項５】
前記複数のキャッシュメモリ制御手段の各々は、対応するキャッシュメモリの使用率を計測する
ことを特徴とする請求項１〜４のいずれか１項に記載のコンピュータシステム。
【請求項６】
前記複数のキャッシュメモリ制御手段の各々は、キャッシュメモリが有効となるエントリの数を計測することによって、前記使用率を特定するカウンタを有する
ことを特徴とする請求項５に記載のコンピュータシステム。
【請求項７】
複数のプロセッサ上で動作する命令列からなるプログラムであって、
前記命令列が実行される第１のプロセッサと異なる第２のプロセッサに対応するキャッシュメモリを制御するための命令を含む命令列からなる
ことを特徴とするプログラム。
【請求項８】
請求項７に記載のプログラムを記録したコンピュータ読取可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータシステム、コンパイラ装置およびオペレーティングシステムに関し、特に、キャッシュメモリを搭載したコンピュータシステム、当該コンピュータシステムで使用されるコンパイラ装置およびオペレーティングシステムに関する。
【背景技術】
【０００２】
近年、プロセッサの演算速度は目覚しく向上しているが、メインメモリのアクセス速度はプロセッサほど向上していない。プロセッサとメインメモリとの速度差が拡大するに従って、メインメモリにアクセスする際の命令またはデータの読み書きにおける待ち時間が、プロセッサの性能向上に悪影響を及ぼしている。
【０００３】
このメモリアクセスの待ち時間を減らすために、近年のプロセッサは、メインメモリの他に、キャッシュメモリと呼ばれる比較的高速にアクセスが可能である小容量のメモリを備えている。このようにコンピュータを構成することで、メインメモリに格納された一部の命令またはデータをキャッシュメモリ上に記憶させることができる。これにより、プロセッサがメモリにアクセスする際の待ち時間を低減することができ、待ち時間によるプロセッサ性能への悪影響を防止することが可能となる。
【０００４】
プロセッサがメモリにアクセスする際、目的の命令またはデータがキャッシュメモリ上に存在すれば、プロセッサはメインメモリにアクセスする場合に比べて、少ない待ち時間で目的の命令またはデータを読み書きすることができる。目的の命令またはデータがキャッシュメモリに存在しない場合は、目的の命令またはデータを含むメインメモリ上の一部の命令またはデータをキャッシュメモリに転送した後、目的の命令またはデータをキャッシュメモリから読み書きする。メインメモリからキャッシュメモリへの転送には多くの時間がかかるが、一般のプログラムシーケンスはメインメモリ上のあるアドレスにアクセスした後、しばらくはその近傍のアドレスにアクセスする確率が高い。このため、直接メインメモリにアクセスする場合に比べて、一旦キャッシュメモリへ命令またはデータを転送した後、アクセスするようにした方がプロセッサの待ち時間を減少させることができる。
【０００５】
しかし、キャッシュメモリ上に目的の命令またはデータが存在しない場合、メインメモリからキャッシュメモリへ命令またはデータを転送する間、プロセッサは処理を停止しなければならず、プロセッサの性能は劣化する。従って、性能劣化を防止するために、キャッシュミスを回避する様々な方法が提案されている。
【０００６】
例えば、ソースプログラムのコンパイル時にプリフェッチ命令をソースプログラムの一部に挿入し、必要となる命令またはデータを、該当する命令の実行前に、メインメモリからキャッシュメモリに転送する技術が開示されている（例えば、特許文献１または特許文献２参照）。
【特許文献１】特開平１１−２１２８０２号公報（第２図）
【特許文献２】特開平１１−３０６０２８号公報（第１図）
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、先に述べたような方法では、実行時のキャッシュメモリの状態を考慮することなく、コンパイル時に挿入されたプリフェッチ命令がプログラム実行時に必ず実行される。このため、マルチタスクの実行環境では優先度の低いプログラムが使用する命令およびデータをプリフェッチしたために、優先度の高いプログラムが使用する命令およびデータがキャッシュメモリから追い出されてしまい、キャッシュのヒット率が低下してしまうという課題がある。
【０００８】
また、優先度の低いプログラムで使用する命令またはデータをプリフェッチしても、優先度の高いプログラムを実行している間に優先度が低いプログラムの命令またはデータがキャッシュメモリから追い出されてしまうため、上記プリフェッチが無駄になってしまうという課題もある。
【０００９】
本発明は上述の課題を解決するためになされたもので、キャッシュメモリのヒット率を向上させることができるコンピュータシステム、コンパイラ装置およびオペレーティングシステムを提供することを目的とする。
また、キャッシュメモリからの無駄なプリフェッチを防止したコンピュータシステム、コンパイラ装置およびオペレーティングシステムを提供することも目的とする。
【課題を解決するための手段】
【００１０】
本発明に係るコンピュータシステムは、メインメモリに格納された命令およびデータの一部を格納するキャッシュメモリと、前記キャッシュメモリを制御するキャッシュメモリ制御手段とを備え、前記キャッシュメモリ制御手段は、前記キャッシュメモリの使用率を計測する。
【００１１】
この構成によると、プロセッサで実行中のプログラムがキャッシュメモリの使用率を知ることができる。このため、当該プログラムは、キャッシュメモリの使用率が大きい場合にはプリフェッチ処理を実行しないなどの処理を実行することができる。これにより、優先度の高いプログラムが使用する命令またはデータをキャッシュメモリから追い出したりすることがなくなり、キャッシュメモリのヒット率を向上させることができる。
【００１２】
好ましくは、前記キャッシュメモリ制御手段は、キャッシュメモリが有効となるエントリの数を計測することによって、前記使用率を特定するカウンタを有する。
このような構成にすれば、キャッシュメモリのライン単位またはエントリ単位で使用状態を管理し、プログラムでメモリアクセスを制御することができる。
【００１３】
本発明の他の局面に係るコンピュータシステムは、複数のプロセッサにそれぞれ対応し、メインメモリに格納された命令およびデータの一部を格納する複数のキャッシュメモリと、前記複数のキャッシュメモリにそれぞれ対応する複数のキャッシュメモリ制御手段と、前記複数のプロセッサを相互に接続し、前記複数のプロセッサのうちの第１のプロセッサより前記第１のプロセッサとは異なる第２のプロセッサに対応するキャッシュメモリを操作する指令を受け、前記第２のプロセッサに対応するキャッシュメモリ制御手段へ当該キャッシュメモリを操作する指令を出力するプロセッサ間通信手段とを備え、前記複数のキャッシュメモリ制御手段の各々は、前記プロセッサ間通信手段からの指令に基づいて、キャッシュメモリを操作する。好ましくは、上記コンピュータシステムは、さらに、プログラムを実行しているプロセッサを識別するプロセッサ識別手段を備え、前記第１のプロセッサは、前記第２のプロセッサの識別情報を受け、前記第２のプロセッサの識別情報に基づいて、前記プロセッサ間通信手段に対し、前記第２のプロセッサに対応するキャッシュメモリを操作する指令を発行する。
【００１４】
プロセッサ間通信手段により、あるプロセッサから他のプロセッサが使用するキャッシュメモリを制御することができる。
【００１５】
さらに好ましくは、前記プロセッサ識別手段は、前記複数のプロセッサの各々に対し割り振られた一意な番号を返す機械語命令よりなる。
このような構成にすれば、プログラム上で容易に複数のキャッシュメモリの制御が可能となる。
【００１６】
さらに好ましくは、前記プロセッサ間通信手段は、前記第１のプロセッサから指令を受付けると、前記第２のプロセッサに対応するキャッシュメモリに対して、プリパージまたはプリフェッチの指令を送出する。
【００１７】
このような構成にすれば、複数のプロセッサおよびそれに対応するキャッシュメモリを搭載する構成に対しても、キャッシュメモリを有効に利用して、プロセッサの性能低下を防止できる。
【００１８】
本発明のさらに他の局面に係るコンパイラ装置は、高級言語で記述されたソースプログラムを実行形式コードに変換するコンパイラ装置であって、ソースプログラム中の所定の実行グループごとに、メインメモリからキャッシュメモリへプリフェッチする対象となる命令またはデータを抽出し、抽出された命令またはデータのアドレスリストを生成するプリフェッチ対象抽出手段と、前記ソースプログラムの制御構造を前記実行グループごとに解析し、解析結果に従ってプリフェッチ対象の命令またはデータのアドレスを前記アドレスリストより選択し、当該アドレスに格納されているデータまたはアドレスをプリフェッチするプリフェッチ用スレッドを生成するスレッド処理生成手段とを備える。
【００１９】
この構成によると、メインのタスクとは別にプリフェッチ用スレッドを生成している。このため、ソースプログラムにプリフェッチ用スレッドを追加することにより、キャッシュメモリの有効利用が図れる。
【００２０】
好ましくは、前記スレッド処理生成手段は、自身を起動するタスクの優先度を調べ、当該優先度よりも優先度の高いタスクがプロセッサ上で実行されていない場合にプリフェッチを実行するプリフェッチ用スレッドを生成する。
【００２１】
プリフェッチ用スレッドを起動したタスクが一番優先度の高いタスクであれば、プリフェッチを行なうようにすることができる。このため、優先度の低いタスクにより優先度の高いタスクの命令またはデータがキャッシュメモリより追い出されることがなく、キャッシュメモリのヒット率が向上する。
【００２２】
さらに好ましくは、前記スレッド処理生成手段は、キャッシュメモリの使用率が一定値以下の場合にのみプリフェッチを実行するプリフェッチ用スレッドを生成する。
キャッシュメモリの使用率が一定値以下の場合にのみプリフェッチを実行することにより、キャッシュメモリの使用率が高い場合に、プリフェッチを行なわないようにすることができる。これにより、優先度の低いプログラムで使用される命令またはデータをプリフェッチすることにより、優先度の高いプログラムで使用される命令またはデータが追い出されてしまい、プリフェッチが無駄になるということがなくなる。
【００２３】
さらに好ましくは、上述のコンパイラ装置は、さらに、着目している実行グループ内の命令の実行時間と次の実行グループの命令またはデータのプリフェッチに係る時間とに基づいて、次の実行グループの命令の実行開始までにプリフェッチの実行が終了するための、ソースプログラム上でのプリフェッチの開始タイミングを求めるプリフェッチタイミング算出手段を備え、前記スレッド起動処理挿入手段は、前記プリフェッチタイミング算出手段で求められたソースプログラム上でのプリフェッチの開始タイミングに次の実行グループの命令またはデータをプリフェッチするプリフェッチ用スレッドの起動処理を挿入する。
【００２４】
このようなタイミングでプリフェッチ用スレッドを挿入することにより、次の実行グループの命令の実行開始までにはプリフェッチが終了している。このため、キャッシュメモリのヒット率を向上させることができ、高速処理が可能になる。
【００２５】
本発明のさらに他の局面に係るオペレーティングシステムは、マルチタスク処理可能なオペレーティングシステムであって、キャッシュメモリの使用率を監視するキャッシュ使用率監視手段と、前記キャッシュメモリの使用率に応じて、プロセッサで実行されるタスクの実行順序を制御するタスク制御手段とを備える。
【００２６】
キャッシュメモリの使用率に応じて、プロセッサで実行されるタスクの実行順序を変えることができる。このため、キャッシュメモリの使用率が大きい場合には、優先度の高いタスクを優先的に実行するようにすれば、キャッシュメモリのヒット率が向上し、プログラムの実行速度が向上する。
【００２７】
好ましくは、上記オペレーティングシステムは、さらに、プロセッサで実行中のタスクが、自身よりも優先度の高いタスクが存在するか否かを確認するための優先度確認手段を備え、前記タスク制御手段は、前記キャッシュメモリの使用率が所定のしきい値よりも大きい場合には、前記キャッシュメモリの使用率が前記所定のしきい値以下の場合に比べ、優先度が高いタスクほど実行頻度を増加させる。
キャッシュメモリの使用率が高いときに優先度の低いタスクが実行されることにより、優先度が高いタスクの命令またはデータが追い出されるのを防止することができる。
【００２８】
本発明の他の局面に係るオペレーティングシステムは、マルチプロセッサを搭載したコンピュータシステム用のオペレーティングシステムであって、前記コンピュータシステムは複数のプロセッサにそれぞれ対応する複数のキャッシュメモリを備え、複数のキャッシュメモリの各々の使用率を監視するキャッシュ使用率監視手段と、前記複数のキャッシュメモリの使用率に応じて、タスクの実行順序を制御するタスク制御手段とを備える。好ましくは、前記タスク制御手段は、前記複数のキャッシュメモリの中から、最も使用率の小さいキャッシュメモリに対応するプロセッサに優先的にタスクを割り当てる。
このような構成にすることにより、キャッシュメモリの使用率の少ないプロセッサにタスクを優先的に割り当てることができ、コンピュータ全体として性能が向上する。
【００２９】
さらに好ましくは、上記オペレーティングシステムは、さらに、複数のプロセッサの各々で実行中のタスクが、自身よりも優先度の高いタスクが存在するか否かを確認するための優先度確認手段を備え、前記タスク制御手段は、前記複数のキャッシュメモリの使用率の各々が、すべて所定のしきい値よりも大きい場合には、それ以外の場合に比べ、優先度の高いタスクほど実行頻度を増加させる。
このような構成にすれば、マルチプロセッサのシステムでも、タスク毎にタスクの優先度を考慮した複数のキャッシュメモリの制御が可能となる。
【００３０】
なお、本発明は、このようなコンピュータシステム、コンパイラ装置、オペレーティングシステムとして実現するだけでなく、コンパイル用プログラムとして実現したり、特徴的な命令を含むプログラムとして実現したりすることもできる。そして、そのようなプログラムは、ＣＤ−ＲＯＭ等の記録媒体やインターネット等の伝送媒体を介して流通させることができるのは言うまでもない。
【発明の効果】
【００３１】
本発明によると、キャッシュメモリのヒット率を向上させることができる。
また、キャッシュメモリからの無駄なプリフェッチを防止することができる。
さらに、プロセッサ上で実行されるプログラムよりメモリアクセスを制御することができる。
【００３２】
さらにまた、マルチプロセッサのコンピュータシステムにおいて、あるプロセッサから他のプロセッサが使用するキャッシュメモリを制御することができる。
また、複数のプロセッサおよびそれに対応するキャッシュメモリを搭載する構成であっても、キャッシュメモリを有効に利用して、プロセッサの性能低下を防止できる。
【００３３】
さらに、優先度が高いタスクの命令またはデータがキャッシュメモリより追い出されるのを防止することができる。
また、上述のようなコンパイル装置を用いることにより、プログラマはキャッシュメモリの存在を意識することなく、プリフェッチを行うプログラムを開発することが可能となり、実行速度の速いプログラムの開発が容易になる。
【００３４】
さらに、優先度の高いタスクがより有効にキャッシュメモリを使用することが可能となり、実行速度の速いプログラムの開発が容易になる。
【発明を実施するための最良の形態】
【００３５】
［実施の形態１］
以下、本発明の実施の形態１に係るコンピュータシステムについて、図面を用いて詳細に説明する。
【００３６】
（１）ハードウェア構成
図１は、本発明の実施の形態に係るコンピュータシステムのハードウェア構成を示す図である。図１に示すように、本発明のコンピュータシステム６００は、ＣＰＵ６０１と、メモリコントローラ６０４と、キャッシュメモリ６０２と、メインメモリ６０３とを備えている。
【００３７】
メインメモリ６０３は、命令およびデータを記憶する低速アクセスが可能で大容量の記憶装置である。キャッシュメモリ６０２は、メインメモリ６０３の一部の領域に記憶されている命令およびデータを一時的に記憶する高速アクセスが可能で小容量の記憶装置である。ＣＰＵ６０１は、メインメモリ６０３またはキャッシュメモリ６０２に記憶された命令を実行し、メインメモリ６０３またはキャッシュメモリ６０２との間でデータの読み書きを行なう演算装置である。メモリコントローラ６０４は、メインメモリ６０３とキャッシュメモリ６０２との間のアクセス制御、およびＣＰＵ６０１とキャッシュメモリ６０２およびメインメモリ６０３との間のアクセス制御を行なう制御装置である。
【００３８】
図２は、図１に示したキャッシュメモリ６０２の記憶領域を説明するための図である。キャッシュメモリ６０２は、エントリと呼ばれる単位でデータを記憶し、Ｎ個のエントリ２０２、２０３、２０４および２０５から構成される。
【００３９】
図３は、図２に示したキャッシュメモリ６０２のエントリについて説明する図である。各エントリ２０５（２０２、２０３、２０４）は、命令・データフィールド３０４と、アドレスフィールド３０１と、有効表示フィールド３０２と、書込み表示フィールド３０３とから構成される。
【００４０】
命令・データフィールド３０４には、命令またはデータが格納される。アドレスフィールド３０１には、命令・データフィールド３０４に記憶されている命令またはデータに対応するメインメモリ６０３のアドレスが格納される。
【００４１】
有効表示フィールド３０２には、そのエントリに格納されている命令またはデータが有効であるか否かを示すビットが格納される。有効表示フィールド３０２は１ビットの要素を持ち、そのビットの値が１ならそのエントリに、有効な命令またはデータが格納されていることを示し、値が０ならそのエントリに有効な命令またはデータが格納されていないことを示す。
【００４２】
書込み表示フィールド３０３には、そのエントリに対して書込みがあったか否かを示すビットが格納される。書き込み表示フィールド３０３は１ビットの要素を持ち、そのビットの値が１ならそのエントリに対して書き込みがあったことを示し、値が０ならそのエントリに対して書き込みが無いことを示す。
【００４３】
図１におけるメインメモリ６０３は、例えば３２ビットのアドレス空間からなり、１６バイト毎に「ライン」と呼ばれる単位に分割される。この場合、キャッシュメモリ６０２の１つのエントリには１ライン分の命令またはデータが格納される。例えば、メインメモリ６０３の０ｘ８００００００８番地上に存在するデータをメインメモリ６０３からキャッシュメモリ６０２に転送する場合は、０ｘ８０００００００番地から０ｘ８００００００Ｆ番地までに格納された１６バイトの命令またはデータを一度にキャッシュメモリ６０２に転送するようにメモリコントローラ６０４は動作する。
【００４４】
図４は、図１に示すメモリコントローラ６０４の概略構成図である。図４に示すように、メモリコントローラ６０４は、キャッシュ使用量レジスタ５０１を備えている。キャッシュ使用量レジスタ５０１には、有効表示フィールド３０２のビットが有効なエントリの数が格納される。すなわち、キャッシュ使用量レジスタ５０１に格納されるエントリ数は、キャッシュメモリ６０２のエントリの有効表示フィールド３０２のビットが、無効から有効に変化すると１つインクリメントされ、有効から無効に変化すると１つデクリメントされる。ＣＰＵ６０１で実行されるソフトウェアは、キャッシュ使用量レジスタ５０１に格納されているエントリ数を参照することにより、キャッシュメモリ６０２の使用状況を知ることができる。
【００４５】
図５は、キャッシュメモリ６０２またはメインメモリ６０３上に存在する命令またはデータに対してＣＰＵ６０１が読出しまたは書込みを行う際のメモリコントローラ６０４の動作を示すフローチャートである。メモリコントローラ６０４は、図５に示すフローチャートに従ってＣＰＵ６０１、キャッシュメモリ６０２およびメインメモリ６０３の間の命令またはデータのアクセス制御をフルアソシエイティブ方式に従い行う。
【００４６】
メモリコントローラ６０４は、ＣＰＵ６０１からメモリアクセス要求を受け取ると、メモリアクセス要求があったアドレスの命令またはデータがキャッシュメモリ６０２上に存在するか否かを確認する（Ｓ４０１）。すなわち、メモリコントローラ６０４は、キャッシュメモリ６０２上の有効表示フィールド３０２のビットが有効となっているエントリのうち、メモリアクセス要求があったアドレスと同じアドレスがアドレスフィールド３０１に格納されているエントリが存在するか否かを確認する。目的とするアドレスを含むエントリがあれば（Ｓ４０１でＹＥＳ）、メモリコントローラ６０４は、キャッシュメモリ６０２上の該当するエントリに対して、命令またはデータの読出しまたは書込みを行うよう制御する（Ｓ４０２）。
【００４７】
有効な全てのエントリについて、アドレスフィールド３０１に格納されたアドレスと目的とするアドレスとが一致しなければ（Ｓ４０１でＮＯ）、メモリコントローラ６０４は、有効表示フィールド３０２のビットが無効になっているエントリが存在するか否かを調べる（Ｓ４０３）。有効表示フィールド３０２のビットが無効となっているエントリが存在する場合には（Ｓ４０３でＹＥＳ）、メモリコントローラ６０４は、その中の１つのエントリを選び、メインメモリ６０３上の目的とするアドレスを含むラインに記憶された命令またはデータを当該エントリに転送する（Ｓ４０４）。それとともに、メモリコントローラ６０４は、命令またはデータを転送したエントリのアドレスフィールド３０１に目的とするアドレスを書込む。また、有効表示フィールド３０２のビットを有効にし、書込み表示フィールド３０３のビットを無効に設定する。
【００４８】
全てのエントリの有効表示フィールド３０２のビットが有効となっているときは、ＬＲＵ（Least Recently Used）アルゴリズムを用いて入れ替え対象とするエントリを選択し、入れ替え対象エントリの書込み表示フィールド３０３のビットが有効になっているか否かを調べる（Ｓ４０５）。書込み表示フィールド３０３が有効になっている場合には（Ｓ４０５でＹＥＳ）、入れ替え対象エントリの命令・データフィールド３０４の内容をメインメモリ６０３に転送する（Ｓ４０６）。その後、上述の書き換え処理（Ｓ４０４）と同様の手順に従い、入れ替え対象エントリに命令またはデータを書込む。
【００４９】
入れ替え対象の書込み表示フィールド３０３が無効になっている場合には（Ｓ４０５でＮＯ）、メインメモリ６０３への追い出し処理（Ｓ４０６）は実行せずに、上述の書換え処理（Ｓ４０４）と同様の手順に従い、入れ替え対象エントリに命令またはデータを書込む。
【００５０】
図６は、ＣＰＵ６０１が実行するプリフェッチ命令およびプリパージ命令を説明するための図である。ＣＰＵ６０１は通常のメモリアクセス命令に加え、プリフェッチ命令１９００またはプリパージ命令１９０３を実行することにより、明示的にキャッシュメモリ６０２を操作することが可能である。
【００５１】
図６（ａ）に示されるように、プリフェッチ命令１９００は、オペコード１９０１「Ｐｒｅｆｅｔｃｈ」で表される命令であり、オペランド１９０２「Ａｄｄｒｅｓｓ」で示されるアドレスを含むメインメモリ６０３上のラインを、ＣＰＵ６０１からメインメモリ６０３へのアクセスがあった場合と同様の手順で、キャッシュメモリ６０２に転送する命令である。
【００５２】
図６（ｂ）に示されるように、プリパージ命令１９０３は、オペコード１９０４「Ｐｒｅｐｕｒｇｅ」で表される命令であり、キャッシュメモリ６０２上の有効表示フィールド３０２のビットが有効になっているエントリの中に、オペランド１９０５「Ａｄｄｒｅｓｓ」で指定されたアドレスとアドレスフィールド３０１に格納されたアドレスとが一致するエントリが存在すれば、該当するエントリの有効表示フィールド３０２を無効にする命令である。ただし、書込み表示フィールド３０３のビットが有効になっている場合には、キャッシュメモリ６０２からメインメモリ６０３にデータを転送した後、有効表示フィールド３０２を無効にする。
【００５３】
（２）オペレーティングシステムの構成
図７は、本発明の実施の形態に係るコンピュータシステム６００で使用されるオペレーティングシステムの構成を示す図である。オペレーティングシステム１８００は、一般的なマルチタスク実行可能な制御プログラムであり、キャッシュ使用率監視装置１８０１と、タスク制御装置１８０２と、優先度通知装置１８０３とを備える。各装置は、ＣＰＵ６０１上で実行されるプログラムである。
【００５４】
キャッシュ使用率監視装置１８０１は、メモリコントローラ６０４のキャッシュ使用量レジスタ５０１を参照することによりキャッシュメモリ６０２の使用率を監視する。
【００５５】
タスク制御装置１８０２は、複数のタスクを一定時間毎に切り替えて実行させる。実行中の各タスクには優先度が与えられており、タスク制御装置１８０２は優先度の高いタスクに、より多くの実行時間を与えるようにタスクを切り替える。ただし、タスク制御装置１８０２は、キャッシュ使用率監視装置１８０１が監視しているキャッシュメモリ６０２の使用率が一定値を超えている場合には、優先度の低いタスクの実行頻度を減少させ、その代わり優先度の高いタスクの実行頻度を増加させる。ここで、上述の一定値は、対応するアプリケーションやプログラムシーケンスの種類によって決まってくる値であり、任意の数値が設定できるようにしておくことが好ましい。
【００５６】
優先度通知装置１８０３は、実行中のタスクからの問い合わせに対して、そのタスクより優先度が高いタスクが他に存在するか否かを通知する。なお、優先度通知装置１８０３は、呼び出しを行なったタスクよりも優先度の高いタスクが存在すれば真の値を返し、存在しなければ偽の値を返すＡＰＩ（Application Programming Interface）であってもよい。
【００５７】
（３）コンパイラの構成
図８は、コンピュータシステム６００のＣＰＵ６０１で実行されるプログラムを生成するコンパイラ装置の構成を示す図である。コンパイラ装置１００は、ソースプログラムを実行形式のプログラムに変換するプログラムであり、ソースコード解析装置１０１と、最適化装置１０２と、プリフェッチ対象抽出装置１０３と、スレッド起動処理挿入装置１０４と、スレッド処理生成装置１０５と、オブジェクトコード生成装置１０６とを備える。これらの装置は、ＣＰＵ６０１上で実行されるプログラムにより実現され、シーケンシャルに動作するように構成されている。
【００５８】
コンパイラ装置１００は、ソースプログラムを基本ブロックと呼ばれるブロックに分割して、コンパイル処理を行う。基本ブロックとは、分岐などを含まない必ずシーケンシャルに動作する命令群のことである。例えば、図９のようなソースコード７００は、図１０に示すような基本ブロック８０１、８０２、８０３、８０４、８０５に分割され、基本ブロック毎にコンパイル処理が実行される。
【００５９】
ソースコード解析装置１０１は、プログラマが記述したソースプログラムを読み込み、構文解析および意味解析を行って中間コードを生成する。
【００６０】
最適化装置１０２は、ソースコード解析装置１０１によって生成された中間コードに対して、最終的に生成される実行形式コードのサイズやその実行時間が短くなるように最適化を行う。
【００６１】
プリフェッチ対象抽出装置１０３は、プリフェッチの対象となる変数を抽出する。プリフェッチ対象抽出装置１０３の詳細については後述する。
【００６２】
スレッド起動処理挿入装置１０４は、プリフェッチ用スレッドとプリパージ用スレッドを起動する処理を挿入する。スレッド起動処理挿入装置１０４の詳細については後述する。
【００６３】
スレッド処理生成装置１０５は、プリフェッチ用スレッドとプリパージ用スレッドとを生成する。スレッド処理生成装置１０５で生成されるプリフェッチ用スレッドおよびプリパージ用スレッドの詳細については後述する。
【００６４】
オブジェクトコード生成装置１０６は、ソースコード解析装置１０１および最適化装置１０２で生成、最適化され、プリフェッチ対象抽出装置１０３、スレッド起動処理挿入装置１０４およびスレッド処理生成装置１０５でプリフェッチ用スレッドおよびプリパージ用スレッドが挿入された中間コードから実行形式コードを生成する。
【００６５】
ソースコード解析装置１０１、最適化装置１０２、オブジェクトコード生成装置１０６の詳細の動作については、本発明の主題ではなく、従来のコンパイラで行われてきた処理と同様であるので、詳細な説明は省略する。
【００６６】
図１１は、図８に示したプリフェッチ対象抽出装置１０３の動作を示すフローチャートである。プリフェッチ対象抽出装置１０３は、図１１で示されるフローチャートに従って、各基本ブロックに対応したプリフェッチ対象リストを作成する。プリフェッチ対象リストとは、プリフェッチ対象となる基本ブロックのアドレスと、その基本ブロックに含まれる変数のアドレスとを組にして記憶するリストである。
【００６７】
プリフェッチ対象抽出装置１０３は、基本ブロックの命令が格納されるラインのアドレスを抽出し、プリフェッチ対象リストに追加する（Ｓ９０１）。基本ブロックの命令が１つのラインに格納できない場合には、複数のラインのアドレスをプリフェッチ対象リストに追加する。
【００６８】
基本ブロック中で使用されている変数のアドレスがすでにプリフェッチ対象リストに登録されているか否かを調べる（Ｓ９０３）。まだ登録されていなければ（Ｓ９０３でＮｏ）、変数のアドレスをプリフェッチ対象リストに登録する（Ｓ９０５）。このような変数のアドレスのプリフェッチ対象リストへの登録処理（Ｓ９０３、Ｓ９０５）を基本ブロックの最初から最後まで順次繰り返し（Ｓ９０２〜Ｓ９０４）、処理を終了する。ただし、通常はコンパイル時には変数や命令が配置されるメモリ上のアドレスを決定することはできない。このため、一時的なアドレス情報をプリフェッチ対象リストに保持しておき、実際のアドレスが決定するリンク時に、一時的なアドレス情報を実際のアドレス情報に書換えるように構成される。
【００６９】
図１２は、図１０に示した基本ブロック８０１、８０２、８０３、８０５から、図１１で示す手順に従って生成されたプリフェッチ対象リストを示す図である。図１０に示した基本ブロック８０１、８０２、８０３、８０５に対応して、プリフェッチ対象リスト１００１、１００２、１００３、１００４がそれぞれ生成される。ただし、基本ブロック８０４に対応したプリフェッチ対象リストは、関数ｆｕｎｃ２をコンパイルする際に生成されるので、関数ｆｕｎｃ１をコンパイルする際には生成されない。
【００７０】
図１３は、図８に示したスレッド起動処理挿入装置１０４によるプリフェッチ用スレッドの起動処理を挿入する処理のフローチャートである。図１３に示す処理は基本ブロックごとに行なわれる。スレッド起動処理挿入装置１０４は、現在処理中の基本ブロックに続く基本ブロックが１つか否かを調べる（Ｓ１１０１）。後続する基本ブロックが１つであれば（Ｓ１１０１でＹｅｓ）、スレッド起動処理挿入装置１０４は、後続基本ブロックの実行が開始されるまでに後続基本ブロックのプリフェッチ対象リストに登録された変数のプリフェッチが完了するような位置に、当該変数をプリフェッチするスレッドの起動処理を挿入する（Ｓ１１０２）。
【００７１】
後続基本ブロックが２個以上の場合には（Ｓ１１０１でＮｏ）、着目している基本ブロック内に分岐条件が存在する。このため、次に実行される基本ブロックがどれになるかを決定するための分岐条件が確定した後に、プリフェッチを開始しても、そのプリフェッチが、後続の基本ブロックの処理開始時までに終了するか否かを判定する（Ｓ１１０３）。後続の基本ブロックの処理開始時までにプリフェッチが終了すると判定された場合には（Ｓ１１０３でＹｅｓ）、分岐条件により決定される後続の基本ブロックに応じて、プリフェッチ対象リストに登録された変数をプリフェッチするスレッドの起動処理を挿入する（Ｓ１１０４）。なお、起動処理は、分岐条件を判断するための変数の値が確定した直後に挿入される。これにより、後続する基本ブロックの処理開始時までにプリフェッチが終了する。例えば、基本ブロック８０１に着目すると、代入文「ａ＝ｘ＋ｙ；」および「ｂ＝ｘ＊ｙ；」が実行された後に変数ａおよびｂの値が確定する。この時点で、基本ブロック８０２および８０３のいずれを実行するかを決める分岐条件が確定する。このため、代入文「ｂ＝ｘ＊ｙ；」が実行された直後にプリフェッチ用スレッドの起動処理が挿入される。
【００７２】
後続の基本ブロックの処理開始時までにプリフェッチが終了しないと判定された場合には（Ｓ１１０３でＮｏ）、分岐条件が確定する前に、後続するすべての基本ブロックのプリフェッチ対象リストに登録された変数をプリフェッチするスレッドの起動処理を挿入する（Ｓ１１０５）。なお、起動処理は、後続する基本ブロックの処理開始時までにプリフェッチが終了するような位置に挿入される。
【００７３】
例えば、図９に示すソースコード７００および図１０に示す基本ブロック８０１、８０２、８０３および８０５の場合では、基本ブロック８０１の後には変数ａと変数ｂとの大小関係で決定される分岐条件によって、基本ブロック８０２または基本ブロック８０３が実行される。分岐条件で使用される変数ａおよびｂの値は基本ブロック８０１中で決定されるので、例えばｂの値が決定してから基本ブロック８０２または８０３の実行が開始されるまで２０マシンサイクルかかり、プリフェッチに１０マシンサイクルかかるとすると、スレッド起動処理挿入装置１０４は、次の基本ブロック８０２または８０３の起動時までにプリフェッチが終了すると判断する。このため、スレッド起動処理挿入装置１０４は、変数ｂの値を決定する処理よりも後に、プリフェッチ用のスレッド起動処理を挿入する。
【００７４】
逆に、変数ｂの値が決定してから基本ブロック８０２または８０３の実行が開始されるまで１０マシンサイクルかかり、プリフェッチに２０マシンサイクルかかるとすると、変数ｂの値を決定する処理よりも前に、基本ブロック８０２と基本ブロック８０３の両方に対応したプリフェッチ用スレッドの起動処理を挿入する。また、プリパージ用スレッドを起動する処理は基本ブロックの最後尾に挿入されるが、これについては後に説明する。
【００７５】
図１４は、図８に示したスレッド処理生成装置１０５で生成されるプリフェッチ用スレッドの処理を示すフローチャートである。図１４に示すプリフェッチ用スレッドは、分岐条件によりプリフェッチ対象とする基本ブロックを変更しないプリフェッチ用スレッド（図１３に示したプリフェッチ用スレッドの起動処理（Ｓ１１０２およびＳ１１０５）で起動されるスレッド）である。
【００７６】
プリフェッチ用スレッドは、自身を起動したタスクより優先度が高いタスクが実行されているか否かをオペレーティングシステム１８００に対して問い合わせる（Ｓ１２０１）。呼び出し側のタスクよりも優先度の高いタスクが実行されていなければ（Ｓ１２０１でＹｅｓ）、プリフェッチ対象リストに登録されているアドレスの命令およびデータをメインメモリ６０３よりプリフェッチする（Ｓ１２０３）。
【００７７】
他に優先度が高いタスクが実行されている場合には（Ｓ１２０１でＮｏ）、プリフェッチ用スレッドはキャッシュ使用量レジスタ５０１の値を確認し、キャッシュメモリ６０２の使用率が一定値以下か否かを調べる（Ｓ１２０２）。キャッシュメモリ６０２の使用率が一定値以下であれば（Ｓ１２０２でＹｅｓ）、プリフェッチ対象リストに登録されているアドレスの命令およびデータをメインメモリ６０３よりプリフェッチする（Ｓ１２０３）。キャッシュメモリ６０２の使用率が一定値を超えている場合には（Ｓ１２０２でＮｏ）、処理を終了する。
【００７８】
なお、上述の一定値は、対応するアプリケーションやプログラムシーケンスの種類によって定まる値であり、任意の数値を設定できるようにしておくことが望ましい。
【００７９】
このように、優先度やキャッシュメモリの使用率を考慮して、プリフェッチを実行するか否かを決定することにより、優先度の高いタスクで使用される命令やデータがキャッシュメモリ６０２から追い出されるのを防止することができる。このため、キャッシュメモリ６０２のヒット率を向上させることができ、キャッシュメモリ６０２を効率的に使用することができる。これにより、高速処理が可能になる。
【００８０】
図１５は、図８に示したスレッド処理生成装置１０５で生成されるプリフェッチ用スレッドの処理を示すフローチャートである。図１５に示すプリフェッチ用スレッドは、分岐条件によりプリフェッチ対象とする基本ブロックを変更するプリフェッチ用スレッド（図１３に示したプリフェッチ用スレッドの起動処理（Ｓ１１０４）で起動されるスレッド）である。
【００８１】
ここで、後続する基本ブロックが基本ブロックＢ１からＢｎまでｎ個存在するものとする（ただし、ｎは整数）。また、基本ブロックＢ１〜Ｂｎが実行されるための条件を条件Ｃ１〜Ｃｎとそれぞれ定義する。
【００８２】
このプリフェッチ用スレッドでは、図１４に示したプリフェッチ用スレッドと同様、プリフェッチ用スレッドを起動したタスクよりも優先度の高いタスクがないか（Ｓ１２０１でＹｅｓ）、または優先度の高いタスクはあるものの、キャッシュメモリ６０２の使用率が一定値以下の場合に（Ｓ１２０１でＮｏ、Ｓ１２０２でＹｅｓ）、以下の処理を実行する。
【００８３】
条件Ｃ１〜Ｃｎのうち、いずれの条件を満たすか否かを調べる（Ｓ１３０１〜Ｓ１３０５）。その後、満たされた条件Ｃｉに対応する基本ブロックＢｉのプリフェッチ対象リストを選択し、当該プリフェッチ対象リストに登録されているアドレスの命令およびデータをプリフェッチする（Ｓ１３０２、１３０４、１３０６、Ｓ１３０７）。
【００８４】
例えば、条件Ｃ１が真である場合には（Ｓ１３０１でＹｅｓ）、基本ブロックＢ１に対応付けられたプリフェッチ対象リストに登録されているアドレスの命令およびデータをプリフェッチする（Ｓ１３０２）。条件Ｃ２が真である場合には（Ｓ１３０３でＹｅｓ）、基本ブロックＢ２に対応付けられたプリフェッチ対象リストに登録されているアドレスの命令およびデータをプリフェッチする（Ｓ１３０４）。条件Ｃ（ｎ−１）が真である場合には（Ｓ１３０５でＹｅｓ）、基本ブロックＢ（ｎ−１）に対応付けられたプリフェッチ対象リストに登録されているアドレスの命令およびデータをプリフェッチする（Ｓ１３０６）。条件Ｃ１からＣ（ｎ−１）がすべて偽の場合には、条件Ｃｎを満たすため（Ｓ１３０５でＮｏ）、基本ブロックＢｎに対応付けられたプリフェッチ対象リストに登録されているアドレスの命令およびデータをプリフェッチする（Ｓ１３０７）。
【００８５】
次に、スレッド起動処理によって起動されるプリフェッチ用スレッドの実例について説明する。図１６は、図１０に示される基本ブロック８０１中に挿入されるプリフェッチ用スレッド起動処理により起動されるプリフェッチ用スレッドの処理を示すフローチャートである。
【００８６】
プリフェッチ用スレッドは、自身を起動したタスクよりも優先度が高いタスクが実行されているか否かを調べる（Ｓ１４０１）。優先度が高いタスクが実行されていれば（Ｓ１４０１でＮｏ）、プリフェッチ用スレッドは、キャッシュ使用量レジスタ５０１の値を確認し、キャッシュメモリ６０２の使用率が一定値以下であるか否かを判定する（Ｓ１４０２）。優先度が高いタスクがあり、かつキャッシュメモリ６０２の使用率が一定値を超えている場合には（Ｓ１４０１でＮｏ、Ｓ１４０２でＮｏ）、プリフェッチ処理を行わずに処理を終了する。
【００８７】
優先度が高いタスクがないか（Ｓ１４０１でＹｅｓ）、またはキャッシュメモリの使用率が一定値以下である場合には（Ｓ１４０２でＹｅｓ）、基本ブロック８０２または基本ブロック８０３への分岐のための条件判定を行なう（Ｓ１４０３）。すなわち、変数ａと変数ｂとの大小比較を行なう。変数ａの値が変数ｂの値よりも大きい場合には（Ｓ１４０３でＹｅｓ）、後続する基本ブロックは、基本ブロック８０２である。このため、基本ブロック８０２に対応するプリフェッチ対象リスト１００２に登録されているアドレスに基づいて、命令およびデータをプリフェッチする（Ｓ１４０４）。
【００８８】
変数ａの値が変数ｂの値以下の場合には（Ｓ１４０３でＮｏ）、後述する基本ブロックは、基本ブロック８０３である。このため、基本ブロック８０３に対応するプリフェッチ対象リスト１００３に登録されているアドレスに基づいて、命令およびデータをプリフェッチする（Ｓ１４０５）。
【００８９】
スレッド処理生成装置１０５は、上述したプリフェッチ用スレッドに加えて、プリパージ用のスレッドも生成する。図１７は、プリパージ用スレッドの処理のフローチャートである。プリパージ用スレッドでは、第１のループ処理（Ｓ１５０１〜Ｓ１５０６）においてプリパージ対象の基本ブロックに対応するプリフェッチ対象リストに含まれるアドレスを順次選択する。また、第２のループ処理（Ｓ１５０２〜Ｓ１５０４）において、プリパージ対象の基本ブロックの次に実行される基本ブロックに含まれるアドレスを順次選択する。第１および第２のループ内において、プリパージ対象の基本ブロックに対応するプリフェッチ対象リストに含まれるアドレスと、次の基本ブロックに対応するプリフェッチ対象リストに含まれるすべてのアドレスとを比較し、プリフェッチ対象リストに含まれるアドレスと同一ライン上に存在するアドレスが次の基本ブロックに対応するプリフェッチ対象リストに含まれていなければ（Ｓ１５０３でＹｅｓ）、プリパージ対象の基本ブロックに対応するプリフェッチ対象リストに含まれるアドレスの命令またはデータをメインメモリ６０３にプリパージする（Ｓ１５０５）。次の基本ブロックに対応するプリフェッチ対象リストに含まれていなければ（Ｓ１５０５でＮｏ）、プリパージ対象の基本ブロックに対応するプリフェッチ対象リストに含まれる他のアドレスを選択し（Ｓ１５０６）、同様の処理を繰返す（Ｓ１５０１〜Ｓ１５０６）。
【００９０】
例えば、図９に示したソースコード７００および図１０に示した基本ブロック８０１、８０２、８０３、８０５を例にあげ、基本ブロック８０１で使用されたキャッシュメモリの領域をプリパージする場合を考える。基本ブロック８０１の次に実行されるのは、基本ブロック８０２または基本ブロック８０３である。このため、プリフェッチ対象リスト１００１とプリフェッチ対象リスト１００２および１００３と比較する。
【００９１】
まず、基本ブロック８０１に対応するプリフェッチ対象リスト１００１に格納されているアドレスと、プリフェッチ対象リスト１００２および１００３に格納されている全てのアドレスとを比較する。プリフェッチ対象リスト１００２および１００３には基本ブロック８０１のアドレスと同じアドレスは存在しないが、同じライン上のアドレスがプリフェッチ対象リスト１００２および１００３に存在すれば、基本ブロック８０１のアドレスに対してプリパージを行わない。反対に同じライン上のアドレスがプリフェッチ対象リスト１００２および１００３に存在しなければ、プリパージを行なう。
【００９２】
変数ａおよびｂのアドレスは、プリフェッチ対象リスト１００２および１００３に存在するので、プリパージを行わない。変数ｘのアドレスはプリフェッチ対象リスト１００２および１００３に存在しないが、同じライン上のアドレスが存在すれば変数ｘのアドレスに対してプリパージを行わない。同様に、変数ｙのアドレスも同一ライン上のアドレスが存在すればプリパージを行わない。以上のような処理を行なうプリパージ用スレッドが生成され、そのプリパージ用スレッドを起動する処理が生成される。
【００９３】
（４）実行時のイメージ
図１８は、図９のソースコード７００から作成されたプログラムシーケンスの実行時の動作イメージである。図１８において、メインスレッド１６０１はソースコードで記述されたプログラムを示す。区間１６０４では基本ブロック８０１、区間１６０５では基本ブロック８０２または基本ブロック８０３がそれぞれ実行される。
【００９４】
プログラムにはコンパイラ装置１００のスレッド起動処理挿入装置１０４によって、スレッド起動処理が挿入されているので、基本ブロック８０１を実行している途中で、プリフェッチ用スレッド１６０２が起動される。プリフェッチ用スレッド１６０２はコンパイラ装置１００のスレッド処理生成装置１０５によって生成されたスレッドである。プリフェッチ用スレッド１６０２は、メインスレッド１６０１と並列に動作しながら、図１４、図１５または図１６で示されるフローチャートに従って、次に実行される基本ブロック８０２および８０３のどちらか一方または両方で使用される命令およびデータをプリフェッチする。プリフェッチ処理が完了すればプリフェッチ用スレッド１６０２は消滅する。
【００９５】
コンパイラのスレッド起動処理挿入装置１０４は、基本ブロック８０１の処理終了時にもスレッド起動処理を挿入している。このため、基本ブロック８０１の実行が終了すれば、プリパージ用スレッド１６０３が起動される。プリパージ用スレッド１６０３はコンパイラ装置１００のスレッド処理生成装置１０５によって作成されたスレッドである。プリパージ用スレッド１６０３は、メインスレッド１６０１と並列に動作しながら、図１７で示されるフローチャートに従って、基本ブロック８０１で使用された命令およびデータをプリパージする。プリパージ処理が完了すればプリパージ用スレッド１６０３は消滅する。
【００９６】
区間１６０５では、基本ブロック８０２または基本ブロック８０３の処理が実行される。通常、基本ブロック８０２または８０３で実行される命令や、使用される変数はキャッシュメモリ６０２に存在しない。このため、メインメモリ６０３からキャッシュメモリ６０２へ命令およびデータが転送されるまでの間、プログラムの実行を行うことができない。しかし、本発明のコンパイラ装置１００でコンパイルされたプログラムでは、区間１６０４において、プリフェッチ用スレッド１６０２によって区間１６０５で使用される命令およびデータがキャッシュメモリ６０２に事前に転送されている。このため、基本ブロック８０１の処理の実行の後、すぐに次の基本ブロック８０２または８０３の処理を実行することができる。
【００９７】
また、プリパージ用スレッド１６０３によって、次の基本ブロック８０２および８０３で使用されることのない命令およびデータを予めキャッシュメモリ６０２からパージしている。これにより、必要な命令およびデータがキャッシュメモリ６０２から追い出されることを防止することができる。なお、これ以降の処理においてもプリフェッチ用スレッドおよびプリパージ用スレッドの生成および消滅が同様に繰返される。
【００９８】
以上説明したように本発明の実施の形態に係るコンピュータシステムによると、プリフェッチ用スレッドは、キャッシュメモリの使用率を監視し、使用率が大きい場合には、プリフェッチを行わないようにしている。これにより、プリフェッチを行なうことにより現在使用されている命令およびデータがメインメモリに追い出されるのを防止することができる。そのため、キャッシュミスの発生を減少させることが可能となり、プログラムの実行速度を向上させることができる。また、優先度の低いプログラムで使用される命令またはデータをプリフェッチすることにより、優先度の高いプログラムで使用される命令またはデータが追い出されてしまい、プリフェッチが無駄になるということがなくなる。
【００９９】
また、後続する基本ブロックが２つ以上ある場合に、分岐条件が確定した後にプリフェッチを行なっても後続する基本ブロックの実行までにプリフェッチが終了する場合には、分岐条件確定の後にプリフェッチを行なうようにしている。これにより、不必要な基本ブロックの命令やデータをプリフェッチすることがなくなる。
【０１００】
さらに、プリフェッチ用スレッドを起動したタスクが一番優先度の高いタスクであれば、プリフェッチを行なうようにすることができる。このため、優先度の低いタスクによって優先度の高いタスクの命令またはデータがキャッシュメモリから追い出されることがなく、キャッシュメモリのヒット率が向上する。
【０１０１】
［実施の形態２］
次に、本発明の実施の形態２に係るコンピュータシステムについて、図面を用いて詳細に説明する。本実施の形態に係るコンピュータシステムは、実施の形態１に係るコンピュータシステムと異なり、複数のＣＰＵを搭載しており、並列処理が可能である。
【０１０２】
図１９は、プロセッサを複数搭載したコンピュータシステムの構成を示す図である。コンピュータシステム１７００は、２つのＣＰＵ１７０１および１７０５と、メインメモリ１７０３と、２つのキャッシュメモリ１７０２および１７０７と、メモリコントローラ１７０４および１７０６と、プロセッサ間通信装置１７０８とを備えている。
【０１０３】
メインメモリ１７０３は、実施の形態１に係るメインメモリ６０３と同様の構成を有する。
キャッシュメモリ１７０２および１７０７は、キャッシュメモリ６０２と同様の構成を有する。
【０１０４】
ＣＰＵ１７０１は、メインメモリ１７０３またはキャッシュメモリ１７０２に記憶された命令を実行し、メインメモリ１７０３またはキャッシュメモリ１７０２との間でデータの読み書きを行なう演算装置である。ＣＰＵ１７０５は、メインメモリ１７０３またはキャッシュメモリ１７０７に記憶された命令を実行し、メインメモリ１７０３またはキャッシュメモリ１７０７との間でデータの読み書きを行なう演算装置である。
【０１０５】
メモリコントローラ１７０４は、メインメモリ１７０３とキャッシュメモリ１７０２との間のアクセス制御、およびＣＰＵ１７０１とキャッシュメモリ１７０２およびメインメモリ１７０３との間のアクセス制御を行なう制御装置である。メモリコントローラ１７０６は、メインメモリ１７０３とキャッシュメモリ１７０７との間のアクセス制御、およびＣＰＵ１７０５とキャッシュメモリ１７０７およびメインメモリ１７０３との間のアクセス制御を行なう制御装置である。
【０１０６】
プロセッサ間通信装置１７０８は、ＣＰＵ１７０１およびＣＰＵ１７０５を連結し、ＣＰＵ間の通信を行なうための装置である。これにより、それぞれのＣＰＵ上で動作するプログラムはプロセッサ間通信装置１７０８を介して異なるＣＰＵに指令を送ることが可能となる。より詳細には、ＣＰＵ１７０１および１７０５には、一意なプロセッサＩＤが与えられており、プロセッサＩＤを指定することにより任意のＣＰＵに対して指令を送ることが可能となるよう構成されている。
【０１０７】
図２０は、異なるＣＰＵのキャッシュメモリに対してプリフェッチを実行させる命令およびプリパージを実行させる命令の説明図である。図２０（ａ）に示すように、プリフェッチ命令２０００は、図６（ａ）に示したシングルＣＰＵからなるコンピュータシステムで用いられるプリフェッチ命令と同じく、オペコード２００１「Ｐｒｅｆｅｔｃｈ」で表される命令である。ただし、図６（ａ）に示した命令と異なり、オペランド２００３「Ａｄｄｒｅｓｓ」に加えて、どのＣＰＵに対してのプリフェッチ指令であるかを示すオペランド２００２「Ｃｐｕｉｄ」を備えている。この命令は、オペランド２００２「Ｃｐｕｉｄ」で示されたプロセッサＩＤのＣＰＵに対して、オペランド２００３「Ａｄｄｒｅｓｓ」で示されたアドレスに格納された命令またはデータをプリフェッチさせる。
【０１０８】
図２０（ｂ）に示されるプリパージ命令２００４は同様に、オペランド２００６「Ｃｐｕｉｄ」で示されたプロセッサＩＤのＣＰＵに対して、オペランド２００７「Ａｄｄｒｅｓｓ」で示されたアドレスのデータをプリパージさせる。
【０１０９】
図２１は、図２０に示したプリフェッチ命令２０００およびプリパージ命令２００４の一例を示す図である。ここで、ＣＰＵ１７０１のプロセッサＩＤを「０」と、ＣＰＵ１７０５のプロセッサＩＤを「１」と仮定する。
【０１１０】
ここで、プリフェッチ用スレッドがＣＰＵ１７０１上で動作しており、そのプリフェッチ用スレッドを呼び出した基本ブロックのプログラムがＣＰＵ１７０５上で動作しているものとする。この場合、ＣＰＵ１７０１上で動作しているプリフェッチ用スレッドが、ＣＰＵ１７０５に対してプリフェッチを実行させる。例えば、ＣＰＵ１７０１上で動作しているプリフェッチ用スレッドが、ＣＰＵ１７０５にメインメモリ１７０３上の０ｘ８００００００８番地のデータをプリフェッチさせる場合を考える。この場合、プリフェッチ用スレッドは、図２１（ａ）に示されるプリフェッチ命令２１００を実行する。プリフェッチ命令２１００が実行されると、ＣＰＵ１７０１は、プロセッサ間通信装置１７０８に対して、ＣＰＵ１７０５がメインメモリ１７０３の０ｘ８００００００８番地に格納されている命令またはデータをプリフェッチするよう指令を発行する。指令を受取ったプロセッサ間通信装置１７０８は、ＣＰＵ１７０５に対して、メインメモリ１７０３の０ｘ８００００００８番地に格納されている命令またはデータをプリフェッチするよう指令を発行する。その後は、実施の形態１と同じ手順で、メインメモリ１７０３に格納された命令またはデータがキャッシュメモリ１７０７に転送される。
【０１１１】
次に、プリパージ用スレッドがＣＰＵ１７０１上で動作しており、そのプリパージ用スレッドを呼び出した基本ブロックのプログラムがＣＰＵ１７０５上で動作しているものとする。この場合、ＣＰＵ１７０１上で動作しているプリパージ用スレッドが、ＣＰＵ１７０５に対してプリパージを実行させる。例えば、ＣＰＵ１７０１上で動作しているプリパージ用スレッドが、ＣＰＵ１７０５が備えるキャッシュメモリ１７０７上の０ｘ８００００００８番地に対応するデータをプリパージする場合に、図２１（ｂ）に示されるプリパージ命令２１０２を実行する。この場合、プリフェッチの場合と同様の手順でＣＰＵ１７０５にプリパージ指令が発行される。
【０１１２】
図２２は、プログラムが、自分自身が実行されているＣＰＵのプロセッサＩＤを識別するために実行するプロセッサ識別命令の説明図である。プロセッサ識別命令２２００はオペコード２２０１「ＧｅｔＣｐｕｉｄ」で表される命令であり、この命令を実行すると、オペランドで示されるレジスタ２２０２「Ｒｅｇ」にプログラムが実行されているプロセッサＩＤが格納される。
【０１１３】
このように構成することで、プリフェッチ用スレッドを起動するときに、プリフェッチ用スレッドに対してメインスレッドが実行されているプロセッサＩＤを知らせておくことが可能となる。このため、プリフェッチ用スレッドとメインスレッドとが異なるＣＰＵ上で実行されている場合でも、プリフェッチ用スレッドが実行されているＣＰＵからメインスレッドが実行されているＣＰＵに対してプリフェッチを要求することができる。なお、プロセッサ識別命令２２００は、メインスレッドの実行開始時に実行され、プロセッサＩＤは、プリフェッチ用スレッドの起動時に引数の形で渡される。なお、プリフェッチＩＤをメインメモリ１７０３に書込み、メインメモリ１７０３を介してプリフェッチ用スレッドに渡すようにしてもよい。プリパージ用スレッドについても、プリフェッチ用スレッドと同様にしてメインスレッドのプロセッサＩＤが渡される。
【０１１４】
その他の処理については、実施の形態１と同様であるため、その詳細な説明は繰返さない。
なお、本実施の形態に係るオペレーティングシステムにおいては、最も使用率が低いキャッシュメモリ１７０２（１７０７）を備えるＣＰＵ１７０１（１７０５）に対して優先的にタスクを割り当てる。ただし、シングルプロセッサを搭載したコンピュータシステム６００と同様に、すべてのキャッシュメモリ１７０２および１７０７の使用率が一定値を超えている場合には、優先度の低いタスクの実行頻度を減少させ、その代わりに優先度の高いタスクの実行頻度を増加させる。
【０１１５】
本実施の形態によると、実施の形態１に係るコンピュータシステムの作用、効果に加えて、プロセッサ間通信装置があるプロセッサから他のプロセッサが使用するキャッシュメモリを制御している。このため、プログラム上で容易に複数のキャッシュメモリの制御が可能となる。
【０１１６】
また、キャッシュメモリの使用率の少ないプロセッサにタスクを優先的に割り当てることにより、コンピュータ全体として性能を向上させることができる。
また、すべてのキャッシュメモリの使用率が一定値を超えている場合には、優先度の高いタスクほど実行頻度を増加させている。このため、タスクごとにタスクの優先度を考慮した複数のキャッシュメモリの制御が可能となる。
【０１１７】
なお、本実施の形態で示されるコンパイラ装置はプログラムにより実現され、コンピュータ上で実行される。このため、このプログラムを、フロッピー（登録商標）ディスク、ハードディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ−ＲＯＭなどの記録媒体に格納することもできる。また、コンパイラ装置により生成された実行形式のコードをこれらの記録媒体に格納することもできる。
【０１１８】
以上、本発明に係るハードウェア、オペレーティングシステム、コンパイラについて実施の形態に基づいて説明したが、本発明はこれらの実施の形態に限られない。
例えば、上述の実施の形態に係るコンピュータシステムは１つまたは２つのＣＰＵから構成されていたが、３つ以上のＣＰＵを備えていてもよい。
【０１１９】
また、上述の実施の形態では、すべての基本ブロックを対象とし、プリパージ処理およびプリフェッチ処理を実行することを想定していたが、必ずしもすべての基本ブロックを対象にする必要はなく、特定の基本ブロックを対象としてプリフェッチ処理またはプリパージ処理を実行するようにしてもよい。例えば、コンパイラ装置が、プログラム中のループの条件等に基づいてこれらの処理を実行する基本ブロックを選択するようにしてもよいし、プロファイル情報に基づいてプリフェッチ処理またはプリパージ処理が有効な基本ブロックに対してのみこれらの処理を実行するようにしてもよいし、コンパイルオプションやプラグマによる指定により、プリフェッチ処理またはプリパージ処理が実行される基本ブロックを選択するようにしてもよい。
【０１２０】
さらに、上述の実施の形態に係るコンパイラ装置では、基本ブロックごとにプリフェッチ用スレッドおよびプリパージ用スレッドを生成していたが、これらのスレッドは基本ブロックごとに用意される必要はない。例えば、関数ごとや、任意の処理のまとまりごとに、プリフェッチ用スレッドおよびプリパージ用スレッドを用意し、プリフェッチ処理およびプリパージ処理を実行するようにしてもよい。その場合には、プリフェッチ対象抽出装置１０３でプリフェッチ対象リストを生成する範囲と、スレッド起動処理挿入装置１０４でスレッド起動処理を挿入する箇所とを変更すればよい。
【０１２１】
さらにまた、上述の実施の形態に係るキャッシュメモリへのアクセス制御はフルアソシエイティブ方式に従い行なわれたが、セットアソシエイティブ方式やダイレクトマップ方式に従いアクセス制御を行なうようにしても、本発明の有意性は保たれる。
【０１２２】
また、図１７に示したプリパージ用スレッドでは、１つ後の基本ブロックで使用されない変数をプリパージするようにしているが、２つ以上の基本ブロックで使用されない変数をプリパージするようにしてもよい。このように、数個先の基本ブロックまで考慮してプリパージをすることにより、プリパージされた変数が、すぐにプリフェッチされるというのを防ぐことができる。
【産業上の利用可能性】
【０１２３】
本発明は、キャッシュメモリを搭載したコンピュータシステム、ならびにそのコンピュータシステムのためのコンパイラ装置およびオペレーティングシステム等に適用可能である。
【図面の簡単な説明】
【０１２４】
【図１】本発明の実施の形態１に係るコンピュータシステムのハードウェア構成を示す図である。
【図２】キャッシュメモリの記憶領域を説明するための図である。
【図３】図２のキャッシュメモリの構成要素であるエントリの詳細を示す図である。
【図４】メモリコントローラの概略構成図である。
【図５】メモリコントローラの動作を表すフローチャートである。
【図６】プリフェッチ命令およびプリパージ命令の説明図である。
【図７】本発明の実施の形態に係るコンピュータシステムで使用されるオペレーティングシステムの構成を示す図である。
【図８】コンピュータシステムのＣＰＵで実行されるプログラムを生成するコンパイラ装置の構成を示す図である。
【図９】コンパイル対象となるソースコードの一例を示す図である。
【図１０】図９に示したソースコードを基本ブロック単位に分割した図である。
【図１１】図８に示したプリフェッチ対象抽出装置の動作を表すフローチャートである。
【図１２】図１０に示した基本ブロックから生成されたプリフェッチ対象リストを表す図である。
【図１３】図８に示したスレッド起動処理挿入装置の動作を表すフローチャートである。
【図１４】図８に示したスレッド処理生成装置１０５で生成されるプリフェッチ用スレッドの処理を示すフローチャートである。
【図１５】図８に示したスレッド処理生成装置１０５で生成されるプリフェッチ用スレッドの処理を示すフローチャートである。
【図１６】図１０に示される基本ブロック８０１中に挿入されるプリフェッチ用スレッド起動処理により起動されるプリフェッチ用スレッドの処理を示すフローチャートである。
【図１７】プリパージ用スレッドの処理のフローチャートである。
【図１８】図９のソースコード７００から作成されたプログラムシーケンスの実行時の動作イメージである。
【図１９】本発明の実施の形態２に係るプロセッサを複数搭載したコンピュータシステムの構成を示す図である。
【図２０】異なるプロセッサに対するプリフェッチ命令およびプリパージ命令の説明図である。
【図２１】図２０に示したプリフェッチ命令およびプリパージ命令の具体例を示す図である。
【図２２】プロセッサ識別命令の説明図である。
【符号の説明】
【０１２５】
１００  コンパイラ装置
１０１  ソースコード解析装置
１０２  最適化装置
１０３  プリフェッチ対象抽出装置
１０４  スレッド起動処理挿入装置
１０５  スレッド処理生成装置
１０６  オブジェクトコード生成装置
２０２〜２０５  エントリ
３０１  アドレスフィールド
３０２  有効表示フィールド
３０３  表示フィールド
３０４  命令・データフィールド
５０１  キャッシュ使用量レジスタ
６００，１７００  コンピュータシステム
６０１，１７０１，１７０５  ＣＰＵ
６０２  キャッシュメモリ
１７０２，１７０７  キャッシュメモリ
６０３，１７０３  メインメモリ
６０４，１７０４，１７０６  メモリコントローラ
７００  ソースコード
８０１〜８０４  基本ブロック
１００１〜１００４  プリフェッチ対象リスト
１６０１  メインスレッド
１６０２  プリフェッチ用スレッド
１６０３  プリパージ用スレッド
１６０４，１６０５  区間
１７０８  プロセッサ間通信装置
１８００  オペレーティングシステム
１８０１  キャッシュ使用率監視装置
１８０２  タスク制御装置
１８０３  優先度通知装置
１９００，２０００，２１００  プリフェッチ命令
１９０１，１９０４，２００１，２２０１  オペコード
１９０２，１９０５，２００２，２００３，２００６，２００７  オペランド
１９０３，２００４，２１０２  プリパージ命令
２２００  プロセッサ識別命令
２２０２  レジスタ
【図１】
0004374221.tif 000002
【図２】
0004374221.tif 000003
【図３】
0004374221.tif 000004
【図４】
0004374221.tif 000005
【図５】
0004374221.tif 000006
【図６】
0004374221.tif 000007
【図７】
0004374221.tif 000008
【図８】
0004374221.tif 000009
【図９】
0004374221.tif 000010
【図１０】
0004374221.tif 000011
【図１１】
0004374221.tif 000012
【図１２】
0004374221.tif 000013
【図１３】
0004374221.tif 000014
【図１４】
0004374221.tif 000015
【図１５】
0004374221.tif 000016
【図１６】
0004374221.tif 000017
【図１７】
0004374221.tif 000018
【図１８】
0004374221.tif 000019
【図１９】
0004374221.tif 000020
【図２０】
0004374221.tif 000021
【図２１】
0004374221.tif 000022
【図２２】
0004374221.tif 000023