JP2009277243A - コンパイラ装置およびオペレーティングシステム - Google Patents

コンパイラ装置およびオペレーティングシステム Download PDF

Info

Publication number
JP2009277243A
JP2009277243A JP2009170604A JP2009170604A JP2009277243A JP 2009277243 A JP2009277243 A JP 2009277243A JP 2009170604 A JP2009170604 A JP 2009170604A JP 2009170604 A JP2009170604 A JP 2009170604A JP 2009277243 A JP2009277243 A JP 2009277243A
Authority
JP
Japan
Prior art keywords
prefetch
thread
instruction
task
data
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
JP2009170604A
Other languages
English (en)
Inventor
Kiyoshi Nakajima
聖志 中島
Takehito Heiji
岳人 瓶子
Shohei Domoto
昌平 道本
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.)
Panasonic Corp
Original Assignee
Panasonic 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 Panasonic Corp filed Critical Panasonic Corp
Priority to JP2009170604A priority Critical patent/JP2009277243A/ja
Publication of JP2009277243A publication Critical patent/JP2009277243A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

【課題】キャッシュメモリのヒット率を向上させることができるコンピュータシステム用のコンパイラ装置を提供することを目的とする。
【解決手段】コンパイラ装置100は、プリフェッチ対象抽出装置103、スレッド起動処理挿入装置104およびスレッド処理生成装置105を備え、プリフェッチおよびプリパージを行うスレッドを生成する。コンパイラ装置100によって生成されたプリフェッチおよびプリパージ用スレッドはメインプログラムと並列に動作しながら、プログラムの優先度やキャッシュメモリの使用率を考慮したプリフェッチおよびプリパージを行う。
【選択図】図8

Description

本発明は、コンパイラ装置およびオペレーティングシステムに関し、特に、キャッシュメモリを搭載したコンピュータシステムで使用されるコンパイラ装置およびオペレーティングシステムに関する。
近年、プロセッサの演算速度は目覚しく向上しているが、メインメモリのアクセス速度はプロセッサほど向上していない。プロセッサとメインメモリとの速度差が拡大するに従って、メインメモリにアクセスする際の命令またはデータの読み書きにおける待ち時間が、プロセッサの性能向上に悪影響を及ぼしている。
このメモリアクセスの待ち時間を減らすために、近年のプロセッサは、メインメモリの他に、キャッシュメモリと呼ばれる比較的高速にアクセスが可能である小容量のメモリを備えている。このようにコンピュータを構成することで、メインメモリに格納された一部の命令またはデータをキャッシュメモリ上に記憶させることができる。これにより、プロセッサがメモリにアクセスする際の待ち時間を低減することができ、待ち時間によるプロセッサ性能への悪影響を防止することが可能となる。
プロセッサがメモリにアクセスする際、目的の命令またはデータがキャッシュメモリ上に存在すれば、プロセッサはメインメモリにアクセスする場合に比べて、少ない待ち時間で目的の命令またはデータを読み書きすることができる。目的の命令またはデータがキャッシュメモリに存在しない場合は、目的の命令またはデータを含むメインメモリ上の一部の命令またはデータをキャッシュメモリに転送した後、目的の命令またはデータをキャッシュメモリから読み書きする。メインメモリからキャッシュメモリへの転送には多くの時間がかかるが、一般のプログラムシーケンスはメインメモリ上のあるアドレスにアクセスした後、しばらくはその近傍のアドレスにアクセスする確率が高い。このため、直接メインメモリにアクセスする場合に比べて、一旦キャッシュメモリへ命令またはデータを転送した後、アクセスするようにした方がプロセッサの待ち時間を減少させることができる。
しかし、キャッシュメモリ上に目的の命令またはデータが存在しない場合、メインメモリからキャッシュメモリへ命令またはデータを転送する間、プロセッサは処理を停止しなければならず、プロセッサの性能は劣化する。従って、性能劣化を防止するために、キャッシュミスを回避する様々な方法が提案されている。
例えば、ソースプログラムのコンパイル時にプリフェッチ命令をソースプログラムの一部に挿入し、必要となる命令またはデータを、該当する命令の実行前に、メインメモリからキャッシュメモリに転送する技術が開示されている(例えば、特許文献1または特許文献2参照)。
特開平11−212802号公報(第2図) 特開平11−306028号公報(第1図)
しかしながら、先に述べたような方法では、実行時のキャッシュメモリの状態を考慮することなく、コンパイル時に挿入されたプリフェッチ命令がプログラム実行時に必ず実行される。このため、マルチタスクの実行環境では優先度の低いプログラムが使用する命令およびデータをプリフェッチしたために、優先度の高いプログラムが使用する命令およびデータがキャッシュメモリから追い出されてしまい、キャッシュのヒット率が低下してしまうという課題がある。
また、優先度の低いプログラムで使用する命令またはデータをプリフェッチしても、優先度の高いプログラムを実行している間に優先度が低いプログラムの命令またはデータがキャッシュメモリから追い出されてしまうため、上記プリフェッチが無駄になってしまうという課題もある。
本発明は上述の課題を解決するためになされたもので、キャッシュメモリのヒット率を向上させることができるコンパイラ装置およびオペレーティングシステムを提供することを目的とする。
また、キャッシュメモリからの無駄なプリフェッチを防止したコンパイラ装置およびオペレーティングシステムを提供することも目的とする。
本発明に係るコンパイラ装置は、高級言語で記述されたソースプログラムを実行形式コードに変換するコンパイラ装置であって、ソースプログラム中の所定の実行グループごとに、メインメモリからキャッシュメモリへプリフェッチする対象となる命令またはデータを抽出し、抽出された命令またはデータのアドレスリストを生成するプリフェッチ対象抽出手段と、前記ソースプログラムの制御構造を前記実行グループごとに解析し、解析結果に従ってプリフェッチ対象の命令またはデータのアドレスを前記アドレスリストより選択し、当該アドレスに格納されているデータまたはアドレスをプリフェッチするプリフェッチ用スレッドを生成するスレッド処理生成手段とを備える。
この構成によると、メインのタスクとは別にプリフェッチ用スレッドを生成している。このため、ソースプログラムにプリフェッチ用スレッドを追加することにより、キャッシュメモリの有効利用が図れる。
好ましくは、前記スレッド処理生成手段は、自身を起動するタスクの優先度を調べ、当該優先度よりも優先度の高いタスクがプロセッサ上で実行されていない場合にプリフェッチを実行するプリフェッチ用スレッドを生成する。
プリフェッチ用スレッドを起動したタスクが一番優先度の高いタスクであれば、プリフェッチを行なうようにすることができる。このため、優先度の低いタスクにより優先度の高いタスクの命令またはデータがキャッシュメモリより追い出されることがなく、キャッシュメモリのヒット率が向上する。
さらに好ましくは、前記スレッド処理生成手段は、キャッシュメモリの使用率が一定値以下の場合にのみプリフェッチを実行するプリフェッチ用スレッドを生成する。
キャッシュメモリの使用率が一定値以下の場合にのみプリフェッチを実行することにより、キャッシュメモリの使用率が高い場合に、プリフェッチを行なわないようにすることができる。これにより、優先度の低いプログラムで使用される命令またはデータをプリフェッチすることにより、優先度の高いプログラムで使用される命令またはデータが追い出されてしまい、プリフェッチが無駄になるということがなくなる。
さらに好ましくは、上述のコンパイラ装置は、さらに、着目している実行グループ内の命令の実行時間と次の実行グループの命令またはデータのプリフェッチに係る時間とに基づいて、次の実行グループの命令の実行開始までにプリフェッチの実行が終了するための、ソースプログラム上でのプリフェッチの開始タイミングを求めるプリフェッチタイミング算出手段を備え、前記スレッド起動処理挿入手段は、前記プリフェッチタイミング算出手段で求められたソースプログラム上でのプリフェッチの開始タイミングに次の実行グループの命令またはデータをプリフェッチするプリフェッチ用スレッドの起動処理を挿入する。
このようなタイミングでプリフェッチ用スレッドを挿入することにより、次の実行グループの命令の実行開始までにはプリフェッチが終了している。このため、キャッシュメモリのヒット率を向上させることができ、高速処理が可能になる。
本発明のさらに他の局面に係るオペレーティングシステムは、マルチタスク処理可能なオペレーティングシステムであって、キャッシュメモリの使用率を監視するキャッシュ使用率監視手段と、前記キャッシュメモリの使用率に応じて、プロセッサで実行されるタスクの実行順序を制御するタスク制御手段とを備える。
キャッシュメモリの使用率に応じて、プロセッサで実行されるタスクの実行順序を変えることができる。このため、キャッシュメモリの使用率が大きい場合には、優先度の高いタスクを優先的に実行するようにすれば、キャッシュメモリのヒット率が向上し、プログラムの実行速度が向上する。
好ましくは、上記オペレーティングシステムは、さらに、プロセッサで実行中のタスクが、自身よりも優先度の高いタスクが存在するか否かを確認するための優先度確認手段を備え、前記タスク制御手段は、前記キャッシュメモリの使用率が所定のしきい値よりも大きい場合には、前記キャッシュメモリの使用率が前記所定のしきい値以下の場合に比べ、優先度が高いタスクほど実行頻度を増加させる。
キャッシュメモリの使用率が高いときに優先度の低いタスクが実行されることにより、優先度が高いタスクの命令またはデータが追い出されるのを防止することができる。
本発明の他の局面に係るオペレーティングシステムは、マルチプロセッサを搭載したコンピュータシステム用のオペレーティングシステムであって、前記コンピュータシステムは複数のプロセッサにそれぞれ対応する複数のキャッシュメモリを備え、複数のキャッシュメモリの各々の使用率を監視するキャッシュ使用率監視手段と、前記複数のキャッシュメモリの使用率に応じて、タスクの実行順序を制御するタスク制御手段とを備える。好ましくは、前記タスク制御手段は、前記複数のキャッシュメモリの中から、最も使用率の小さいキャッシュメモリに対応するプロセッサに優先的にタスクを割り当てる。
このような構成にすることにより、キャッシュメモリの使用率の少ないプロセッサにタスクを優先的に割り当てることができ、コンピュータ全体として性能が向上する。
さらに好ましくは、上記オペレーティングシステムは、さらに、複数のプロセッサの各々で実行中のタスクが、自身よりも優先度の高いタスクが存在するか否かを確認するための優先度確認手段を備え、前記タスク制御手段は、前記複数のキャッシュメモリの使用率の各々が、すべて所定のしきい値よりも大きい場合には、それ以外の場合に比べ、優先度の高いタスクほど実行頻度を増加させる。
このような構成にすれば、マルチプロセッサのシステムでも、タスク毎にタスクの優先度を考慮した複数のキャッシュメモリの制御が可能となる。
なお、本発明は、このようなコンパイラ装置、オペレーティングシステムとして実現するだけでなく、コンパイル用プログラムとして実現したり、特徴的な命令を含むプログラムとして実現したりすることもできる。そして、そのようなプログラムは、CD−ROM等の記録媒体やインターネット等の伝送媒体を介して流通させることができるのは言うまでもない。
本発明によると、キャッシュメモリのヒット率を向上させることができる。
また、キャッシュメモリからの無駄なプリフェッチを防止することができる。
さらに、プロセッサ上で実行されるプログラムよりメモリアクセスを制御することができる。
また、複数のプロセッサおよびそれに対応するキャッシュメモリを搭載する構成であっても、キャッシュメモリを有効に利用して、プロセッサの性能低下を防止できる。
さらに、優先度が高いタスクの命令またはデータがキャッシュメモリより追い出されるのを防止することができる。
また、上述のようなコンパイル装置を用いることにより、プログラマはキャッシュメモリの存在を意識することなく、プリフェッチを行うプログラムを開発することが可能となり、実行速度の速いプログラムの開発が容易になる。
さらに、優先度の高いタスクがより有効にキャッシュメモリを使用することが可能となり、実行速度の速いプログラムの開発が容易になる。
本発明の実施の形態1に係るコンピュータシステムのハードウェア構成を示す図である。 キャッシュメモリの記憶領域を説明するための図である。 図2のキャッシュメモリの構成要素であるエントリの詳細を示す図である。 メモリコントローラの概略構成図である。 メモリコントローラの動作を表すフローチャートである。 プリフェッチ命令およびプリパージ命令の説明図である。 本発明の実施の形態に係るコンピュータシステムで使用されるオペレーティングシステムの構成を示す図である。 コンピュータシステムのCPUで実行されるプログラムを生成するコンパイラ装置の構成を示す図である。 コンパイル対象となるソースコードの一例を示す図である。 図9に示したソースコードを基本ブロック単位に分割した図である。 図8に示したプリフェッチ対象抽出装置の動作を表すフローチャートである。 図10に示した基本ブロックから生成されたプリフェッチ対象リストを表す図である。 図8に示したスレッド起動処理挿入装置の動作を表すフローチャートである。 図8に示したスレッド処理生成装置105で生成されるプリフェッチ用スレッドの処理を示すフローチャートである。 図8に示したスレッド処理生成装置105で生成されるプリフェッチ用スレッドの処理を示すフローチャートである。 図10に示される基本ブロック801中に挿入されるプリフェッチ用スレッド起動処理により起動されるプリフェッチ用スレッドの処理を示すフローチャートである。 プリパージ用スレッドの処理のフローチャートである。 図9のソースコード700から作成されたプログラムシーケンスの実行時の動作イメージを示す図である。 本発明の実施の形態2に係るプロセッサを複数搭載したコンピュータシステムの構成を示す図である。 異なるプロセッサに対するプリフェッチ命令およびプリパージ命令の説明図である。 図20に示したプリフェッチ命令およびプリパージ命令の具体例を示す図である。 プロセッサ識別命令の説明図である。
[実施の形態1]
以下、本発明の実施の形態1に係るコンピュータシステムについて、図面を用いて詳細に説明する。
(1)ハードウェア構成
図1は、本発明の実施の形態に係るコンピュータシステムのハードウェア構成を示す図である。図1に示すように、本発明のコンピュータシステム600は、CPU601と、メモリコントローラ604と、キャッシュメモリ602と、メインメモリ603とを備えている。
メインメモリ603は、命令およびデータを記憶する低速アクセスが可能で大容量の記憶装置である。キャッシュメモリ602は、メインメモリ603の一部の領域に記憶されている命令およびデータを一時的に記憶する高速アクセスが可能で小容量の記憶装置である。CPU601は、メインメモリ603またはキャッシュメモリ602に記憶された命令を実行し、メインメモリ603またはキャッシュメモリ602との間でデータの読み書きを行なう演算装置である。メモリコントローラ604は、メインメモリ603とキャッシュメモリ602との間のアクセス制御、およびCPU601とキャッシュメモリ602およびメインメモリ603との間のアクセス制御を行なう制御装置である。
図2は、図1に示したキャッシュメモリ602の記憶領域を説明するための図である。キャッシュメモリ602は、エントリと呼ばれる単位でデータを記憶し、N個のエントリ202、203、204および205から構成される。
図3は、図2に示したキャッシュメモリ602のエントリについて説明する図である。各エントリ205(202、203、204)は、命令・データフィールド304と、アドレスフィールド301と、有効表示フィールド302と、書込み表示フィールド303とから構成される。
命令・データフィールド304には、命令またはデータが格納される。アドレスフィールド301には、命令・データフィールド304に記憶されている命令またはデータに対応するメインメモリ603のアドレスが格納される。
有効表示フィールド302には、そのエントリに格納されている命令またはデータが有効であるか否かを示すビットが格納される。有効表示フィールド302は1ビットの要素を持ち、そのビットの値が1ならそのエントリに、有効な命令またはデータが格納されていることを示し、値が0ならそのエントリに有効な命令またはデータが格納されていないことを示す。
書込み表示フィールド303には、そのエントリに対して書込みがあったか否かを示すビットが格納される。書き込み表示フィールド303は1ビットの要素を持ち、そのビットの値が1ならそのエントリに対して書き込みがあったことを示し、値が0ならそのエントリに対して書き込みが無いことを示す。
図1におけるメインメモリ603は、例えば32ビットのアドレス空間からなり、16バイト毎に「ライン」と呼ばれる単位に分割される。この場合、キャッシュメモリ602の1つのエントリには1ライン分の命令またはデータが格納される。例えば、メインメモリ603の0x80000008番地上に存在するデータをメインメモリ603からキャッシュメモリ602に転送する場合は、0x80000000番地から0x8000000F番地までに格納された16バイトの命令またはデータを一度にキャッシュメモリ602に転送するようにメモリコントローラ604は動作する。
図4は、図1に示すメモリコントローラ604の概略構成図である。図4に示すように、メモリコントローラ604は、キャッシュ使用量レジスタ501を備えている。キャッシュ使用量レジスタ501には、有効表示フィールド302のビットが有効なエントリの数が格納される。すなわち、キャッシュ使用量レジスタ501に格納されるエントリ数は、キャッシュメモリ602のエントリの有効表示フィールド302のビットが、無効から有効に変化すると1つインクリメントされ、有効から無効に変化すると1つデクリメントされる。CPU601で実行されるソフトウェアは、キャッシュ使用量レジスタ501に格納されているエントリ数を参照することにより、キャッシュメモリ602の使用状況を知ることができる。
図5は、キャッシュメモリ602またはメインメモリ603上に存在する命令またはデータに対してCPU601が読出しまたは書込みを行う際のメモリコントローラ604の動作を示すフローチャートである。メモリコントローラ604は、図5に示すフローチャートに従ってCPU601、キャッシュメモリ602およびメインメモリ603の間の命令またはデータのアクセス制御をフルアソシエイティブ方式に従い行う。
メモリコントローラ604は、CPU601からメモリアクセス要求を受け取ると、メモリアクセス要求があったアドレスの命令またはデータがキャッシュメモリ602上に存在するか否かを確認する(S401)。すなわち、メモリコントローラ604は、キャッシュメモリ602上の有効表示フィールド302のビットが有効となっているエントリのうち、メモリアクセス要求があったアドレスと同じアドレスがアドレスフィールド301に格納されているエントリが存在するか否かを確認する。目的とするアドレスを含むエントリがあれば(S401でYES)、メモリコントローラ604は、キャッシュメモリ602上の該当するエントリに対して、命令またはデータの読出しまたは書込みを行うよう制御する(S402)。
有効な全てのエントリについて、アドレスフィールド301に格納されたアドレスと目的とするアドレスとが一致しなければ(S401でNO)、メモリコントローラ604は、有効表示フィールド302のビットが無効になっているエントリが存在するか否かを調べる(S403)。有効表示フィールド302のビットが無効となっているエントリが存在する場合には(S403でYES)、メモリコントローラ604は、その中の1つのエントリを選び、メインメモリ603上の目的とするアドレスを含むラインに記憶された命令またはデータを当該エントリに転送する(S404)。それとともに、メモリコントローラ604は、命令またはデータを転送したエントリのアドレスフィールド301に目的とするアドレスを書込む。また、有効表示フィールド302のビットを有効にし、書込み表示フィールド303のビットを無効に設定する。
全てのエントリの有効表示フィールド302のビットが有効となっているときは、LRU(Least Recently Used)アルゴリズムを用いて入れ替え対象とするエントリを選択し、入れ替え対象エントリの書込み表示フィールド303のビットが有効になっているか否かを調べる(S405)。書込み表示フィールド303が有効になっている場合には(S405でYES)、入れ替え対象エントリの命令・データフィールド304の内容をメインメモリ603に転送する(S406)。その後、上述の書き換え処理(S404)と同様の手順に従い、入れ替え対象エントリに命令またはデータを書込む。
入れ替え対象の書込み表示フィールド303が無効になっている場合には(S405でNO)、メインメモリ603への追い出し処理(S406)は実行せずに、上述の書換え処理(S404)と同様の手順に従い、入れ替え対象エントリに命令またはデータを書込む。
図6は、CPU601が実行するプリフェッチ命令およびプリパージ命令を説明するための図である。CPU601は通常のメモリアクセス命令に加え、プリフェッチ命令1900またはプリパージ命令1903を実行することにより、明示的にキャッシュメモリ602を操作することが可能である。
図6(a)に示されるように、プリフェッチ命令1900は、オペコード1901「Prefetch」で表される命令であり、オペランド1902「Address」で示されるアドレスを含むメインメモリ603上のラインを、CPU601からメインメモリ603へのアクセスがあった場合と同様の手順で、キャッシュメモリ602に転送する命令である。
図6(b)に示されるように、プリパージ命令1903は、オペコード1904「Prepurge」で表される命令であり、キャッシュメモリ602上の有効表示フィールド302のビットが有効になっているエントリの中に、オペランド1905「Address」で指定されたアドレスとアドレスフィールド301に格納されたアドレスとが一致するエントリが存在すれば、該当するエントリの有効表示フィールド302を無効にする命令である。ただし、書込み表示フィールド303のビットが有効になっている場合には、キャッシュメモリ602からメインメモリ603にデータを転送した後、有効表示フィールド302を無効にする。
(2)オペレーティングシステムの構成
図7は、本発明の実施の形態に係るコンピュータシステム600で使用されるオペレーティングシステムの構成を示す図である。オペレーティングシステム1800は、一般的なマルチタスク実行可能な制御プログラムであり、キャッシュ使用率監視装置1801と、タスク制御装置1802と、優先度通知装置1803とを備える。各装置は、CPU601上で実行されるプログラムである。
キャッシュ使用率監視装置1801は、メモリコントローラ604のキャッシュ使用量レジスタ501を参照することによりキャッシュメモリ602の使用率を監視する。
タスク制御装置1802は、複数のタスクを一定時間毎に切り替えて実行させる。実行中の各タスクには優先度が与えられており、タスク制御装置1802は優先度の高いタスクに、より多くの実行時間を与えるようにタスクを切り替える。ただし、タスク制御装置1802は、キャッシュ使用率監視装置1801が監視しているキャッシュメモリ602の使用率が一定値を超えている場合には、優先度の低いタスクの実行頻度を減少させ、その代わり優先度の高いタスクの実行頻度を増加させる。ここで、上述の一定値は、対応するアプリケーションやプログラムシーケンスの種類によって決まってくる値であり、任意の数値が設定できるようにしておくことが好ましい。
優先度通知装置1803は、実行中のタスクからの問い合わせに対して、そのタスクより優先度が高いタスクが他に存在するか否かを通知する。なお、優先度通知装置1803は、呼び出しを行なったタスクよりも優先度の高いタスクが存在すれば真の値を返し、存在しなければ偽の値を返すAPI(Application Programming Interface)であってもよい。
(3)コンパイラの構成
図8は、コンピュータシステム600のCPU601で実行されるプログラムを生成するコンパイラ装置の構成を示す図である。コンパイラ装置100は、ソースプログラムを実行形式のプログラムに変換するプログラムであり、ソースコード解析装置101と、最適化装置102と、プリフェッチ対象抽出装置103と、スレッド起動処理挿入装置104と、スレッド処理生成装置105と、オブジェクトコード生成装置106とを備える。これらの装置は、CPU601上で実行されるプログラムにより実現され、シーケンシャルに動作するように構成されている。
コンパイラ装置100は、ソースプログラムを基本ブロックと呼ばれるブロックに分割して、コンパイル処理を行う。基本ブロックとは、分岐などを含まない必ずシーケンシャルに動作する命令群のことである。例えば、図9のようなソースコード700は、図10に示すような基本ブロック801、802、803、804、805に分割され、基本ブロック毎にコンパイル処理が実行される。
ソースコード解析装置101は、プログラマが記述したソースプログラムを読み込み、構文解析および意味解析を行って中間コードを生成する。
最適化装置102は、ソースコード解析装置101によって生成された中間コードに対して、最終的に生成される実行形式コードのサイズやその実行時間が短くなるように最適化を行う。
プリフェッチ対象抽出装置103は、プリフェッチの対象となる変数を抽出する。プリフェッチ対象抽出装置103の詳細については後述する。
スレッド起動処理挿入装置104は、プリフェッチ用スレッドとプリパージ用スレッドを起動する処理を挿入する。スレッド起動処理挿入装置104の詳細については後述する。
スレッド処理生成装置105は、プリフェッチ用スレッドとプリパージ用スレッドとを生成する。スレッド処理生成装置105で生成されるプリフェッチ用スレッドおよびプリパージ用スレッドの詳細については後述する。
オブジェクトコード生成装置106は、ソースコード解析装置101および最適化装置102で生成、最適化され、プリフェッチ対象抽出装置103、スレッド起動処理挿入装置104およびスレッド処理生成装置105でプリフェッチ用スレッドおよびプリパージ用スレッドが挿入された中間コードから実行形式コードを生成する。
ソースコード解析装置101、最適化装置102、オブジェクトコード生成装置106の詳細の動作については、本発明の主題ではなく、従来のコンパイラで行われてきた処理と同様であるので、詳細な説明は省略する。
図11は、図8に示したプリフェッチ対象抽出装置103の動作を示すフローチャートである。プリフェッチ対象抽出装置103は、図11で示されるフローチャートに従って、各基本ブロックに対応したプリフェッチ対象リストを作成する。プリフェッチ対象リストとは、プリフェッチ対象となる基本ブロックのアドレスと、その基本ブロックに含まれる変数のアドレスとを組にして記憶するリストである。
プリフェッチ対象抽出装置103は、基本ブロックの命令が格納されるラインのアドレスを抽出し、プリフェッチ対象リストに追加する(S901)。基本ブロックの命令が1つのラインに格納できない場合には、複数のラインのアドレスをプリフェッチ対象リストに追加する。
基本ブロック中で使用されている変数のアドレスがすでにプリフェッチ対象リストに登録されているか否かを調べる(S903)。まだ登録されていなければ(S903でNo)、変数のアドレスをプリフェッチ対象リストに登録する(S905)。このような変数のアドレスのプリフェッチ対象リストへの登録処理(S903、S905)を基本ブロックの最初から最後まで順次繰り返し(S902〜S904)、処理を終了する。ただし、通常はコンパイル時には変数や命令が配置されるメモリ上のアドレスを決定することはできない。このため、一時的なアドレス情報をプリフェッチ対象リストに保持しておき、実際のアドレスが決定するリンク時に、一時的なアドレス情報を実際のアドレス情報に書換えるように構成される。
図12は、図10に示した基本ブロック801、802、803、805から、図11で示す手順に従って生成されたプリフェッチ対象リストを示す図である。図10に示した基本ブロック801、802、803、805に対応して、プリフェッチ対象リスト1001、1002、1003、1004がそれぞれ生成される。ただし、基本ブロック804に対応したプリフェッチ対象リストは、関数func2をコンパイルする際に生成されるので、関数func1をコンパイルする際には生成されない。
図13は、図8に示したスレッド起動処理挿入装置104によるプリフェッチ用スレッドの起動処理を挿入する処理のフローチャートである。図13に示す処理は基本ブロックごとに行なわれる。スレッド起動処理挿入装置104は、現在処理中の基本ブロックに続く基本ブロックが1つか否かを調べる(S1101)。後続する基本ブロックが1つであれば(S1101でYes)、スレッド起動処理挿入装置104は、後続基本ブロックの実行が開始されるまでに後続基本ブロックのプリフェッチ対象リストに登録された変数のプリフェッチが完了するような位置に、当該変数をプリフェッチするスレッドの起動処理を挿入する(S1102)。
後続基本ブロックが2個以上の場合には(S1101でNo)、着目している基本ブロック内に分岐条件が存在する。このため、次に実行される基本ブロックがどれになるかを決定するための分岐条件が確定した後に、プリフェッチを開始しても、そのプリフェッチが、後続の基本ブロックの処理開始時までに終了するか否かを判定する(S1103)。後続の基本ブロックの処理開始時までにプリフェッチが終了すると判定された場合には(S1103でYes)、分岐条件により決定される後続の基本ブロックに応じて、プリフェッチ対象リストに登録された変数をプリフェッチするスレッドの起動処理を挿入する(S1104)。なお、起動処理は、分岐条件を判断するための変数の値が確定した直後に挿入される。これにより、後続する基本ブロックの処理開始時までにプリフェッチが終了する。例えば、基本ブロック801に着目すると、代入文「a=x+y;」および「b=x*y;」が実行された後に変数aおよびbの値が確定する。この時点で、基本ブロック802および803のいずれを実行するかを決める分岐条件が確定する。このため、代入文「b=x*y;」が実行された直後にプリフェッチ用スレッドの起動処理が挿入される。
後続の基本ブロックの処理開始時までにプリフェッチが終了しないと判定された場合には(S1103でNo)、分岐条件が確定する前に、後続するすべての基本ブロックのプリフェッチ対象リストに登録された変数をプリフェッチするスレッドの起動処理を挿入する(S1105)。なお、起動処理は、後続する基本ブロックの処理開始時までにプリフェッチが終了するような位置に挿入される。
例えば、図9に示すソースコード700および図10に示す基本ブロック801、802、803および805の場合では、基本ブロック801の後には変数aと変数bとの大小関係で決定される分岐条件によって、基本ブロック802または基本ブロック803が実行される。分岐条件で使用される変数aおよびbの値は基本ブロック801中で決定されるので、例えばbの値が決定してから基本ブロック802または803の実行が開始されるまで20マシンサイクルかかり、プリフェッチに10マシンサイクルかかるとすると、スレッド起動処理挿入装置104は、次の基本ブロック802または803の起動時までにプリフェッチが終了すると判断する。このため、スレッド起動処理挿入装置104は、変数bの値を決定する処理よりも後に、プリフェッチ用のスレッド起動処理を挿入する。
逆に、変数bの値が決定してから基本ブロック802または803の実行が開始されるまで10マシンサイクルかかり、プリフェッチに20マシンサイクルかかるとすると、変数bの値を決定する処理よりも前に、基本ブロック802と基本ブロック803の両方に対応したプリフェッチ用スレッドの起動処理を挿入する。また、プリパージ用スレッドを起動する処理は基本ブロックの最後尾に挿入されるが、これについては後に説明する。
図14は、図8に示したスレッド処理生成装置105で生成されるプリフェッチ用スレッドの処理を示すフローチャートである。図14に示すプリフェッチ用スレッドは、分岐条件によりプリフェッチ対象とする基本ブロックを変更しないプリフェッチ用スレッド(図13に示したプリフェッチ用スレッドの起動処理(S1102およびS1105)で起動されるスレッド)である。
プリフェッチ用スレッドは、自身を起動したタスクより優先度が高いタスクが実行されているか否かをオペレーティングシステム1800に対して問い合わせる(S1201)。呼び出し側のタスクよりも優先度の高いタスクが実行されていなければ(S1201でYes)、プリフェッチ対象リストに登録されているアドレスの命令およびデータをメインメモリ603よりプリフェッチする(S1203)。
他に優先度が高いタスクが実行されている場合には(S1201でNo)、プリフェッチ用スレッドはキャッシュ使用量レジスタ501の値を確認し、キャッシュメモリ602の使用率が一定値以下か否かを調べる(S1202)。キャッシュメモリ602の使用率が一定値以下であれば(S1202でYes)、プリフェッチ対象リストに登録されているアドレスの命令およびデータをメインメモリ603よりプリフェッチする(S1203)。キャッシュメモリ602の使用率が一定値を超えている場合には(S1202でNo)、処理を終了する。
なお、上述の一定値は、対応するアプリケーションやプログラムシーケンスの種類によって定まる値であり、任意の数値を設定できるようにしておくことが望ましい。
このように、優先度やキャッシュメモリの使用率を考慮して、プリフェッチを実行するか否かを決定することにより、優先度の高いタスクで使用される命令やデータがキャッシュメモリ602から追い出されるのを防止することができる。このため、キャッシュメモリ602のヒット率を向上させることができ、キャッシュメモリ602を効率的に使用することができる。これにより、高速処理が可能になる。
図15は、図8に示したスレッド処理生成装置105で生成されるプリフェッチ用スレッドの処理を示すフローチャートである。図15に示すプリフェッチ用スレッドは、分岐条件によりプリフェッチ対象とする基本ブロックを変更するプリフェッチ用スレッド(図13に示したプリフェッチ用スレッドの起動処理(S1104)で起動されるスレッド)である。
ここで、後続する基本ブロックが基本ブロックB1からBnまでn個存在するものとする(ただし、nは整数)。また、基本ブロックB1〜Bnが実行されるための条件を条件C1〜Cnとそれぞれ定義する。
このプリフェッチ用スレッドでは、図14に示したプリフェッチ用スレッドと同様、プリフェッチ用スレッドを起動したタスクよりも優先度の高いタスクがないか(S1201でYes)、または優先度の高いタスクはあるものの、キャッシュメモリ602の使用率が一定値以下の場合に(S1201でNo、S1202でYes)、以下の処理を実行する。
条件C1〜Cnのうち、いずれの条件を満たすか否かを調べる(S1301〜S1305)。その後、満たされた条件Ciに対応する基本ブロックBiのプリフェッチ対象リストを選択し、当該プリフェッチ対象リストに登録されているアドレスの命令およびデータをプリフェッチする(S1302、1304、1306、S1307)。
例えば、条件C1が真である場合には(S1301でYes)、基本ブロックB1に対応付けられたプリフェッチ対象リストに登録されているアドレスの命令およびデータをプリフェッチする(S1302)。条件C2が真である場合には(S1303でYes)、基本ブロックB2に対応付けられたプリフェッチ対象リストに登録されているアドレスの命令およびデータをプリフェッチする(S1304)。条件C(n−1)が真である場合には(S1305でYes)、基本ブロックB(n−1)に対応付けられたプリフェッチ対象リストに登録されているアドレスの命令およびデータをプリフェッチする(S1306)。条件C1からC(n−1)がすべて偽の場合には、条件Cnを満たすため(S1305でNo)、基本ブロックBnに対応付けられたプリフェッチ対象リストに登録されているアドレスの命令およびデータをプリフェッチする(S1307)。
次に、スレッド起動処理によって起動されるプリフェッチ用スレッドの実例について説明する。図16は、図10に示される基本ブロック801中に挿入されるプリフェッチ用スレッド起動処理により起動されるプリフェッチ用スレッドの処理を示すフローチャートである。
プリフェッチ用スレッドは、自身を起動したタスクよりも優先度が高いタスクが実行されているか否かを調べる(S1401)。優先度が高いタスクが実行されていれば(S1401でNo)、プリフェッチ用スレッドは、キャッシュ使用量レジスタ501の値を確認し、キャッシュメモリ602の使用率が一定値以下であるか否かを判定する(S1402)。優先度が高いタスクがあり、かつキャッシュメモリ602の使用率が一定値を超えている場合には(S1401でNo、S1402でNo)、プリフェッチ処理を行わずに処理を終了する。
優先度が高いタスクがないか(S1401でYes)、またはキャッシュメモリの使用率が一定値以下である場合には(S1402でYes)、基本ブロック802または基本ブロック803への分岐のための条件判定を行なう(S1403)。すなわち、変数aと変数bとの大小比較を行なう。変数aの値が変数bの値よりも大きい場合には(S1403でYes)、後続する基本ブロックは、基本ブロック802である。このため、基本ブロック802に対応するプリフェッチ対象リスト1002に登録されているアドレスに基づいて、命令およびデータをプリフェッチする(S1404)。
変数aの値が変数bの値以下の場合には(S1403でNo)、後述する基本ブロックは、基本ブロック803である。このため、基本ブロック803に対応するプリフェッチ対象リスト1003に登録されているアドレスに基づいて、命令およびデータをプリフェッチする(S1405)。
スレッド処理生成装置105は、上述したプリフェッチ用スレッドに加えて、プリパージ用のスレッドも生成する。図17は、プリパージ用スレッドの処理のフローチャートである。プリパージ用スレッドでは、第1のループ処理(S1501〜S1506)においてプリパージ対象の基本ブロックに対応するプリフェッチ対象リストに含まれるアドレスを順次選択する。また、第2のループ処理(S1502〜S1504)において、プリパージ対象の基本ブロックの次に実行される基本ブロックに含まれるアドレスを順次選択する。第1および第2のループ内において、プリパージ対象の基本ブロックに対応するプリフェッチ対象リストに含まれるアドレスと、次の基本ブロックに対応するプリフェッチ対象リストに含まれるすべてのアドレスとを比較し、プリフェッチ対象リストに含まれるアドレスと同一ライン上に存在するアドレスが次の基本ブロックに対応するプリフェッチ対象リストに含まれていなければ(S1503でYes)、プリパージ対象の基本ブロックに対応するプリフェッチ対象リストに含まれるアドレスの命令またはデータをメインメモリ603にプリパージする(S1505)。次の基本ブロックに対応するプリフェッチ対象リストに含まれていなければ(S1505でNo)、プリパージ対象の基本ブロックに対応するプリフェッチ対象リストに含まれる他のアドレスを選択し(S1506)、同様の処理を繰返す(S1501〜S1506)。
例えば、図9に示したソースコード700および図10に示した基本ブロック801、802、803、805を例にあげ、基本ブロック801で使用されたキャッシュメモリの領域をプリパージする場合を考える。基本ブロック801の次に実行されるのは、基本ブロック802または基本ブロック803である。このため、プリフェッチ対象リスト1001とプリフェッチ対象リスト1002および1003と比較する。
まず、基本ブロック801に対応するプリフェッチ対象リスト1001に格納されているアドレスと、プリフェッチ対象リスト1002および1003に格納されている全てのアドレスとを比較する。プリフェッチ対象リスト1002および1003には基本ブロック801のアドレスと同じアドレスは存在しないが、同じライン上のアドレスがプリフェッチ対象リスト1002および1003に存在すれば、基本ブロック801のアドレスに対してプリパージを行わない。反対に同じライン上のアドレスがプリフェッチ対象リスト1002および1003に存在しなければ、プリパージを行なう。
変数aおよびbのアドレスは、プリフェッチ対象リスト1002および1003に存在するので、プリパージを行わない。変数xのアドレスはプリフェッチ対象リスト1002および1003に存在しないが、同じライン上のアドレスが存在すれば変数xのアドレスに対してプリパージを行わない。同様に、変数yのアドレスも同一ライン上のアドレスが存在すればプリパージを行わない。以上のような処理を行なうプリパージ用スレッドが生成され、そのプリパージ用スレッドを起動する処理が生成される。
(4)実行時のイメージ
図18は、図9のソースコード700から作成されたプログラムシーケンスの実行時の動作イメージである。図18において、メインスレッド1601はソースコードで記述されたプログラムを示す。区間1604では基本ブロック801、区間1605では基本ブロック802または基本ブロック803がそれぞれ実行される。
プログラムにはコンパイラ装置100のスレッド起動処理挿入装置104によって、スレッド起動処理が挿入されているので、基本ブロック801を実行している途中で、プリフェッチ用スレッド1602が起動される。プリフェッチ用スレッド1602はコンパイラ装置100のスレッド処理生成装置105によって生成されたスレッドである。プリフェッチ用スレッド1602は、メインスレッド1601と並列に動作しながら、図14、図15または図16で示されるフローチャートに従って、次に実行される基本ブロック802および803のどちらか一方または両方で使用される命令およびデータをプリフェッチする。プリフェッチ処理が完了すればプリフェッチ用スレッド1602は消滅する。
コンパイラのスレッド起動処理挿入装置104は、基本ブロック801の処理終了時にもスレッド起動処理を挿入している。このため、基本ブロック801の実行が終了すれば、プリパージ用スレッド1603が起動される。プリパージ用スレッド1603はコンパイラ装置100のスレッド処理生成装置105によって作成されたスレッドである。プリパージ用スレッド1603は、メインスレッド1601と並列に動作しながら、図17で示されるフローチャートに従って、基本ブロック801で使用された命令およびデータをプリパージする。プリパージ処理が完了すればプリパージ用スレッド1603は消滅する。
区間1605では、基本ブロック802または基本ブロック803の処理が実行される。通常、基本ブロック802または803で実行される命令や、使用される変数はキャッシュメモリ602に存在しない。このため、メインメモリ603からキャッシュメモリ602へ命令およびデータが転送されるまでの間、プログラムの実行を行うことができない。しかし、本発明のコンパイラ装置100でコンパイルされたプログラムでは、区間1604において、プリフェッチ用スレッド1602によって区間1605で使用される命令およびデータがキャッシュメモリ602に事前に転送されている。このため、基本ブロック801の処理の実行の後、すぐに次の基本ブロック802または803の処理を実行することができる。
また、プリパージ用スレッド1603によって、次の基本ブロック802および803で使用されることのない命令およびデータを予めキャッシュメモリ602からパージしている。これにより、必要な命令およびデータがキャッシュメモリ602から追い出されることを防止することができる。なお、これ以降の処理においてもプリフェッチ用スレッドおよびプリパージ用スレッドの生成および消滅が同様に繰返される。
以上説明したように本発明の実施の形態に係るコンピュータシステムによると、プリフェッチ用スレッドは、キャッシュメモリの使用率を監視し、使用率が大きい場合には、プリフェッチを行わないようにしている。これにより、プリフェッチを行なうことにより現在使用されている命令およびデータがメインメモリに追い出されるのを防止することができる。そのため、キャッシュミスの発生を減少させることが可能となり、プログラムの実行速度を向上させることができる。また、優先度の低いプログラムで使用される命令またはデータをプリフェッチすることにより、優先度の高いプログラムで使用される命令またはデータが追い出されてしまい、プリフェッチが無駄になるということがなくなる。
また、後続する基本ブロックが2つ以上ある場合に、分岐条件が確定した後にプリフェッチを行なっても後続する基本ブロックの実行までにプリフェッチが終了する場合には、分岐条件確定の後にプリフェッチを行なうようにしている。これにより、不必要な基本ブロックの命令やデータをプリフェッチすることがなくなる。
さらに、プリフェッチ用スレッドを起動したタスクが一番優先度の高いタスクであれば、プリフェッチを行なうようにすることができる。このため、優先度の低いタスクによって優先度の高いタスクの命令またはデータがキャッシュメモリから追い出されることがなく、キャッシュメモリのヒット率が向上する。
[実施の形態2]
次に、本発明の実施の形態2に係るコンピュータシステムについて、図面を用いて詳細に説明する。本実施の形態に係るコンピュータシステムは、実施の形態1に係るコンピュータシステムと異なり、複数のCPUを搭載しており、並列処理が可能である。
図19は、プロセッサを複数搭載したコンピュータシステムの構成を示す図である。コンピュータシステム1700は、2つのCPU1701および1705と、メインメモリ1703と、2つのキャッシュメモリ1702および1707と、メモリコントローラ1704および1706と、プロセッサ間通信装置1708とを備えている。
メインメモリ1703は、実施の形態1に係るメインメモリ603と同様の構成を有する。
キャッシュメモリ1702および1707は、キャッシュメモリ602と同様の構成を有する。
CPU1701は、メインメモリ1703またはキャッシュメモリ1702に記憶された命令を実行し、メインメモリ1703またはキャッシュメモリ1702との間でデータの読み書きを行なう演算装置である。CPU1705は、メインメモリ1703またはキャッシュメモリ1707に記憶された命令を実行し、メインメモリ1703またはキャッシュメモリ1707との間でデータの読み書きを行なう演算装置である。
メモリコントローラ1704は、メインメモリ1703とキャッシュメモリ1702との間のアクセス制御、およびCPU1701とキャッシュメモリ1702およびメインメモリ1703との間のアクセス制御を行なう制御装置である。メモリコントローラ1706は、メインメモリ1703とキャッシュメモリ1707との間のアクセス制御、およびCPU1705とキャッシュメモリ1707およびメインメモリ1703との間のアクセス制御を行なう制御装置である。
プロセッサ間通信装置1708は、CPU1701およびCPU1705を連結し、CPU間の通信を行なうための装置である。これにより、それぞれのCPU上で動作するプログラムはプロセッサ間通信装置1708を介して異なるCPUに指令を送ることが可能となる。より詳細には、CPU1701および1705には、一意なプロセッサIDが与えられており、プロセッサIDを指定することにより任意のCPUに対して指令を送ることが可能となるよう構成されている。
図20は、異なるCPUのキャッシュメモリに対してプリフェッチを実行させる命令およびプリパージを実行させる命令の説明図である。図20(a)に示すように、プリフェッチ命令2000は、図6(a)に示したシングルCPUからなるコンピュータシステムで用いられるプリフェッチ命令と同じく、オペコード2001「Prefetch」で表される命令である。ただし、図6(a)に示した命令と異なり、オペランド2003「Address」に加えて、どのCPUに対してのプリフェッチ指令であるかを示すオペランド2002「Cpuid」を備えている。この命令は、オペランド2002「Cpuid」で示されたプロセッサIDのCPUに対して、オペランド2003「Address」で示されたアドレスに格納された命令またはデータをプリフェッチさせる。
図20(b)に示されるプリパージ命令2004は同様に、オペランド2006「Cpuid」で示されたプロセッサIDのCPUに対して、オペランド2007「Address」で示されたアドレスのデータをプリパージさせる。
図21は、図20に示したプリフェッチ命令2000およびプリパージ命令2004の一例を示す図である。ここで、CPU1701のプロセッサIDを「0」と、CPU1705のプロセッサIDを「1」と仮定する。
ここで、プリフェッチ用スレッドがCPU1701上で動作しており、そのプリフェッチ用スレッドを呼び出した基本ブロックのプログラムがCPU1705上で動作しているものとする。この場合、CPU1701上で動作しているプリフェッチ用スレッドが、CPU1705に対してプリフェッチを実行させる。例えば、CPU1701上で動作しているプリフェッチ用スレッドが、CPU1705にメインメモリ1703上の0x80000008番地のデータをプリフェッチさせる場合を考える。この場合、プリフェッチ用スレッドは、図21(a)に示されるプリフェッチ命令2100を実行する。プリフェッチ命令2100が実行されると、CPU1701は、プロセッサ間通信装置1708に対して、CPU1705がメインメモリ1703の0x80000008番地に格納されている命令またはデータをプリフェッチするよう指令を発行する。指令を受取ったプロセッサ間通信装置1708は、CPU1705に対して、メインメモリ1703の0x80000008番地に格納されている命令またはデータをプリフェッチするよう指令を発行する。その後は、実施の形態1と同じ手順で、メインメモリ1703に格納された命令またはデータがキャッシュメモリ1707に転送される。
次に、プリパージ用スレッドがCPU1701上で動作しており、そのプリパージ用スレッドを呼び出した基本ブロックのプログラムがCPU1705上で動作しているものとする。この場合、CPU1701上で動作しているプリパージ用スレッドが、CPU1705に対してプリパージを実行させる。例えば、CPU1701上で動作しているプリパージ用スレッドが、CPU1705が備えるキャッシュメモリ1707上の0x80000008番地に対応するデータをプリパージする場合に、図21(b)に示されるプリパージ命令2102を実行する。この場合、プリフェッチの場合と同様の手順でCPU1705にプリパージ指令が発行される。
図22は、プログラムが、自分自身が実行されているCPUのプロセッサIDを識別するために実行するプロセッサ識別命令の説明図である。プロセッサ識別命令2200はオペコード2201「GetCpuid」で表される命令であり、この命令を実行すると、オペランドで示されるレジスタ2202「Reg」にプログラムが実行されているプロセッサIDが格納される。
このように構成することで、プリフェッチ用スレッドを起動するときに、プリフェッチ用スレッドに対してメインスレッドが実行されているプロセッサIDを知らせておくことが可能となる。このため、プリフェッチ用スレッドとメインスレッドとが異なるCPU上で実行されている場合でも、プリフェッチ用スレッドが実行されているCPUからメインスレッドが実行されているCPUに対してプリフェッチを要求することができる。なお、プロセッサ識別命令2200は、メインスレッドの実行開始時に実行され、プロセッサIDは、プリフェッチ用スレッドの起動時に引数の形で渡される。なお、プリフェッチIDをメインメモリ1703に書込み、メインメモリ1703を介してプリフェッチ用スレッドに渡すようにしてもよい。プリパージ用スレッドについても、プリフェッチ用スレッドと同様にしてメインスレッドのプロセッサIDが渡される。
その他の処理については、実施の形態1と同様であるため、その詳細な説明は繰返さない。
なお、本実施の形態に係るオペレーティングシステムにおいては、最も使用率が低いキャッシュメモリ1702(1707)を備えるCPU1701(1705)に対して優先的にタスクを割り当てる。ただし、シングルプロセッサを搭載したコンピュータシステム600と同様に、すべてのキャッシュメモリ1702および1707の使用率が一定値を超えている場合には、優先度の低いタスクの実行頻度を減少させ、その代わりに優先度の高いタスクの実行頻度を増加させる。
本実施の形態によると、実施の形態1に係るコンピュータシステムの作用、効果に加えて、プロセッサ間通信装置があるプロセッサから他のプロセッサが使用するキャッシュメモリを制御している。このため、プログラム上で容易に複数のキャッシュメモリの制御が可能となる。
また、キャッシュメモリの使用率の少ないプロセッサにタスクを優先的に割り当てることにより、コンピュータ全体として性能を向上させることができる。
また、すべてのキャッシュメモリの使用率が一定値を超えている場合には、優先度の高いタスクほど実行頻度を増加させている。このため、タスクごとにタスクの優先度を考慮した複数のキャッシュメモリの制御が可能となる。
なお、本実施の形態で示されるコンパイラ装置はプログラムにより実現され、コンピュータ上で実行される。このため、このプログラムを、フロッピー(登録商標)ディスク、ハードディスク、CD−ROM、MO、DVD−ROMなどの記録媒体に格納することもできる。また、コンパイラ装置により生成された実行形式のコードをこれらの記録媒体に格納することもできる。
以上、本発明に係るハードウェア、オペレーティングシステム、コンパイラについて実施の形態に基づいて説明したが、本発明はこれらの実施の形態に限られない。
例えば、上述の実施の形態に係るコンピュータシステムは1つまたは2つのCPUから構成されていたが、3つ以上のCPUを備えていてもよい。
また、上述の実施の形態では、すべての基本ブロックを対象とし、プリパージ処理およびプリフェッチ処理を実行することを想定していたが、必ずしもすべての基本ブロックを対象にする必要はなく、特定の基本ブロックを対象としてプリフェッチ処理またはプリパージ処理を実行するようにしてもよい。例えば、コンパイラ装置が、プログラム中のループの条件等に基づいてこれらの処理を実行する基本ブロックを選択するようにしてもよいし、プロファイル情報に基づいてプリフェッチ処理またはプリパージ処理が有効な基本ブロックに対してのみこれらの処理を実行するようにしてもよいし、コンパイルオプションやプラグマによる指定により、プリフェッチ処理またはプリパージ処理が実行される基本ブロックを選択するようにしてもよい。
さらに、上述の実施の形態に係るコンパイラ装置では、基本ブロックごとにプリフェッチ用スレッドおよびプリパージ用スレッドを生成していたが、これらのスレッドは基本ブロックごとに用意される必要はない。例えば、関数ごとや、任意の処理のまとまりごとに、プリフェッチ用スレッドおよびプリパージ用スレッドを用意し、プリフェッチ処理およびプリパージ処理を実行するようにしてもよい。その場合には、プリフェッチ対象抽出装置103でプリフェッチ対象リストを生成する範囲と、スレッド起動処理挿入装置104でスレッド起動処理を挿入する箇所とを変更すればよい。
さらにまた、上述の実施の形態に係るキャッシュメモリへのアクセス制御はフルアソシエイティブ方式に従い行なわれたが、セットアソシエイティブ方式やダイレクトマップ方式に従いアクセス制御を行なうようにしても、本発明の有意性は保たれる。
また、図17に示したプリパージ用スレッドでは、1つ後の基本ブロックで使用されない変数をプリパージするようにしているが、2つ以上の基本ブロックで使用されない変数をプリパージするようにしてもよい。このように、数個先の基本ブロックまで考慮してプリパージをすることにより、プリパージされた変数が、すぐにプリフェッチされるというのを防ぐことができる。
本発明は、キャッシュメモリを搭載したコンピュータシステム、ならびにそのコンピュータシステムのためのコンパイラ装置およびオペレーティングシステム等に適用可能である。
100 コンパイラ装置
101 ソースコード解析装置
102 最適化装置
103 プリフェッチ対象抽出装置
104 スレッド起動処理挿入装置
105 スレッド処理生成装置
106 オブジェクトコード生成装置
202〜205 エントリ
301 アドレスフィールド
302 有効表示フィールド
303 表示フィールド
304 命令・データフィールド
501 キャッシュ使用量レジスタ
600,1700 コンピュータシステム
601,1701,1705 CPU
602 キャッシュメモリ
1702,1707 キャッシュメモリ
603,1703 メインメモリ
604,1704,1706 メモリコントローラ
700 ソースコード
801〜804 基本ブロック
1001〜1004 プリフェッチ対象リスト
1601 メインスレッド
1602 プリフェッチ用スレッド
1603 プリパージ用スレッド
1604,1605 区間
1708 プロセッサ間通信装置
1800 オペレーティングシステム
1801 キャッシュ使用率監視装置
1802 タスク制御装置
1803 優先度通知装置
1900,2000,2100 プリフェッチ命令
1901,1904,2001,2201 オペコード
1902,1905,2002,2003,2006,2007 オペランド
1903,2004,2102 プリパージ命令
2200 プロセッサ識別命令
2202 レジスタ

Claims (19)

  1. 高級言語で記述されたソースプログラムを実行形式コードに変換するコンパイラ装置であって、
    ソースプログラム中の所定の実行グループごとに、メインメモリからキャッシュメモリへプリフェッチする対象となる命令またはデータを抽出し、抽出された命令またはデータのアドレスリストを生成するプリフェッチ対象抽出手段と、
    前記ソースプログラムの制御構造を前記実行グループごとに解析し、解析結果に従ってプリフェッチ対象の命令またはデータのアドレスを前記アドレスリストより選択し、当該アドレスに格納されている命令またはデータをプリフェッチするプリフェッチ用スレッドを生成するスレッド処理生成手段とを備える
    ことを特徴とするコンパイラ装置。
  2. 前記スレッド処理生成手段は、自身を起動するタスクの優先度を調べ、当該優先度よりも優先度の高いタスクがプロセッサ上で実行されていない場合にプリフェッチを実行するためのプリフェッチ用スレッドを生成する
    ことを特徴とする請求項1に記載のコンパイラ装置。
  3. 前記スレッド処理生成手段は、自身を起動するタスクの優先度よりも優先度の高いタスクがプロセッサ上で実行されている際には、キャッシュメモリの使用率が一定値以下の場合にのみプリフェッチを実行するためのプリフェッチ用スレッドを生成する
    ことを特徴とする請求項2に記載のコンパイラ装置。
  4. さらに、ソースプログラム上に前記スレッド処理生成手段で生成されたプリフェッチ用スレッドの起動処理を挿入するスレッド起動処理挿入手段を備える
    ことを特徴とする請求項1〜3のいずれか1項に記載のコンパイラ装置。
  5. さらに、着目している実行グループ内の命令の実行時間と次の実行グループの命令またはデータのプリフェッチに係る時間とに基づいて、次の実行グループの命令の実行開始までにプリフェッチの実行が終了するための、ソースプログラム上でのプリフェッチの開始タイミングを求めるプリフェッチタイミング算出手段を備え、
    前記スレッド起動処理挿入手段は、前記プリフェッチタイミング算出手段で求められたソースプログラム上でのプリフェッチの開始タイミングに次の実行グループの命令またはデータをプリフェッチするためのプリフェッチ用スレッドの起動処理を挿入する
    ことを特徴とする請求項4に記載のコンパイラ装置。
  6. 前記プリフェッチタイミング算出手段は、着目している実行グループの直後に実行され得る実行グループが複数存在する場合に、後続する実行グループが確定するタイミングから当該実行グループの命令またはデータをプリフェッチした場合に、当該実行グループの処理開始までにプリフェッチが終了するか否かを調べ、処理が終了する場合には、前記後続する実行グループが確定するタイミングを後続する実行グループの命令またはデータのプリフェッチの開始タイミングとし、
    前記スレッド処理生成手段は、着目している実行グループの直後に実行され得る実行グループが複数存在する場合において、前記プリフェッチタイミング算出手段で後続する実行グループの確定するタイミングからプリフェッチを行なったとしても当該実行グループの処理開始までにプリフェッチが終了すると判断された場合には、後続する実行グループを確定するための処理と、確定結果に応じて後続する実行グループを選択し、選択された実行グループの命令またはデータをプリフェッチするためのプリフェッチ用スレッドを生成する
    ことを特徴とする請求項5に記載のコンパイラ装置。
  7. 前記実行グループは、基本ブロックである
    ことを特徴とする請求項1〜6のいずれか1項に記載のコンパイラ装置。
  8. マルチタスク処理可能なオペレーティングシステムであって、
    キャッシュメモリの使用率を監視するキャッシュ使用率監視ステップと、
    前記キャッシュメモリの使用率に応じて、プロセッサで実行されるタスクの実行順序を制御するタスク制御ステップとをコンピュータに実行させる
    ことを特徴とするオペレーティングシステム。
  9. さらに、プロセッサで実行中のタスクが、自身よりも優先度の高いタスクが存在するか否かを確認するための優先度確認ステップをコンピュータに実行させ、
    前記タスク制御ステップにおいては、前記キャッシュメモリの使用率が所定のしきい値よりも大きい場合には、前記キャッシュメモリの使用率が前記所定のしきい値以下の場合に比べ、優先度が高いタスクほど実行頻度を増加させる
    ことを特徴とする請求項8に記載のオペレーティングシステム。
  10. 前記優先度確認ステップにおいては、呼び出しを行なったタスクよりも優先度の高いタスクが存在すれば真の値を返し、存在しなければ偽の値を返すAPI(Application Programming Interface)をコンピュータに実行させる
    ことを特徴とする請求項9に記載のオペレーティングシステム。
  11. マルチプロセッサを搭載したコンピュータシステム用のオペレーティングシステムであって、
    前記コンピュータシステムは複数のプロセッサにそれぞれ対応する複数のキャッシュメモリを備え、
    複数のキャッシュメモリの各々の使用率を監視するキャッシュ使用率監視ステップと、
    前記複数のキャッシュメモリの使用率に応じて、タスクの実行順序を制御するタスク制御ステップとをコンピュータに実行させる
    ことを特徴とするオペレーティングシステム。
  12. 前記タスク制御ステップにおいては、前記複数のキャッシュメモリの中から、最も使用率の小さいキャッシュメモリに対応するプロセッサに優先的にタスクを割り当てる
    ことを特徴とする請求項11に記載のオペレーティングシステム。
  13. さらに、複数のプロセッサの各々で実行中のタスクが、自身よりも優先度の高いタスクが存在するか否かを確認するための優先度確認ステップをコンピュータに実行させ、
    前記タスク制御ステップにおいては、前記複数のキャッシュメモリの使用率の各々が、すべて所定のしきい値よりも大きい場合には、それ以外の場合に比べ、優先度の高いタスクほど実行頻度を増加させる
    ことを特徴とする請求項12に記載のオペレーティングシステム。
  14. 高級言語で記述されたソースプログラムを実行形式コードに変換するためのコンパイル用プログラムであって、
    ソースプログラム中の所定の実行グループごとに、メインメモリからキャッシュメモリへプリフェッチする対象となる命令またはデータを抽出し、抽出された命令またはデータのアドレスリストを生成するプリフェッチ対象抽出ステップと、
    前記ソースプログラムの制御構造を前記実行グループごとに解析し、解析結果に従ってプリフェッチ対象の命令またはデータのアドレスを前記アドレスリストより選択し、当該アドレスに格納されている命令またはデータをプリフェッチするプリフェッチ用スレッドを生成するスレッド処理生成ステップとをコンピュータに実行させる
    ことを特徴とするコンパイル用プログラム。
  15. さらに、ソースプログラム上に前記スレッド処理生成ステップで生成されたプリフェッチ用スレッドの起動処理を挿入するスレッド起動処理挿入ステップをコンピュータに実行させる
    ことを特徴とする請求項14に記載のコンパイル用プログラム。
  16. 高級言語で記述されたソースプログラムを実行形式コードに変換するコンパイル方法であって、
    ソースプログラム中の所定の実行グループごとに、メインメモリからキャッシュメモリへプリフェッチする対象となる命令またはデータを抽出し、抽出された命令またはデータのアドレスリストを生成するプリフェッチ対象抽出ステップと、
    前記ソースプログラムの制御構造を前記実行グループごとに解析し、解析結果に従ってプリフェッチ対象の命令またはデータのアドレスを前記アドレスリストより選択し、当該アドレスに格納されている命令またはデータをプリフェッチするプリフェッチ用スレッドを生成するスレッド処理生成ステップとを含む
    ことを特徴とするコンパイル方法。
  17. さらに、ソースプログラム上に前記スレッド処理生成ステップで生成されたプリフェッチ用スレッドの起動処理を挿入するスレッド起動処理挿入ステップを含む
    ことを特徴とする請求項16に記載のコンパイル方法。
  18. 請求項8〜13のいずれか1項に記載のオペレーティングシステムを記録したコンピュータ読取可能な記録媒体。
  19. 請求項14または15に記載のコンパイル用プログラムを記録したコンピュータ読取可能な記録媒体。
JP2009170604A 2009-07-21 2009-07-21 コンパイラ装置およびオペレーティングシステム Pending JP2009277243A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2009170604A JP2009277243A (ja) 2009-07-21 2009-07-21 コンパイラ装置およびオペレーティングシステム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2009170604A JP2009277243A (ja) 2009-07-21 2009-07-21 コンパイラ装置およびオペレーティングシステム

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP2003306437A Division JP4374221B2 (ja) 2003-08-29 2003-08-29 コンピュータシステムおよび記録媒体

Publications (1)

Publication Number Publication Date
JP2009277243A true JP2009277243A (ja) 2009-11-26

Family

ID=41442555

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009170604A Pending JP2009277243A (ja) 2009-07-21 2009-07-21 コンパイラ装置およびオペレーティングシステム

Country Status (1)

Country Link
JP (1) JP2009277243A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11669458B2 (en) 2021-06-30 2023-06-06 Fujitsu Limited Computer-readable recording medium storing adjustment program and adjustment method

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0612395A (ja) * 1992-06-29 1994-01-21 Canon Inc マルチプロセサシステムにおけるタスク割り付け方法
JP2000148518A (ja) * 1998-06-17 2000-05-30 Internatl Business Mach Corp <Ibm> 正確なキャッシュ感応性を可能にするキャッシュ・ア―キテクチャ
JP2001167060A (ja) * 1999-12-07 2001-06-22 Hitachi Ltd タスク並列化方法
JP2004501410A (ja) * 1999-11-05 2004-01-15 サン・マイクロシステムズ・インコーポレイテッド 関数レベルでプリフェッチを行う方法および装置

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0612395A (ja) * 1992-06-29 1994-01-21 Canon Inc マルチプロセサシステムにおけるタスク割り付け方法
JP2000148518A (ja) * 1998-06-17 2000-05-30 Internatl Business Mach Corp <Ibm> 正確なキャッシュ感応性を可能にするキャッシュ・ア―キテクチャ
JP2004501410A (ja) * 1999-11-05 2004-01-15 サン・マイクロシステムズ・インコーポレイテッド 関数レベルでプリフェッチを行う方法および装置
JP2001167060A (ja) * 1999-12-07 2001-06-22 Hitachi Ltd タスク並列化方法

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11669458B2 (en) 2021-06-30 2023-06-06 Fujitsu Limited Computer-readable recording medium storing adjustment program and adjustment method

Similar Documents

Publication Publication Date Title
JP4374221B2 (ja) コンピュータシステムおよび記録媒体
US7350029B2 (en) Data stream prefetching in a microprocessor
US7380066B2 (en) Store stream prefetching in a microprocessor
US9652230B2 (en) Computer processor employing dedicated hardware mechanism controlling the initialization and invalidation of cache lines
JP5681473B2 (ja) プログラムの最適化装置、最適化方法および最適化プログラム
US8490065B2 (en) Method and apparatus for software-assisted data cache and prefetch control
JP6218833B2 (ja) 処理リソース割り当て
US8776034B2 (en) Dynamically maintaining coherency within live ranges of direct buffers
US9798528B2 (en) Software solution for cooperative memory-side and processor-side data prefetching
JP3739491B2 (ja) プリフェッチ命令を用いるハーバードアーキテクチャキャッシュメモリの調和したソフトウェア制御
US7784037B2 (en) Compiler implemented software cache method in which non-aliased explicitly fetched data are excluded
US7516276B2 (en) Runtime register allocator
US7243195B2 (en) Software managed cache optimization system and method for multi-processing systems
JP2009098934A (ja) プロセッサ及びキャッシュメモリ
US6892280B2 (en) Multiprocessor system having distributed shared memory and instruction scheduling method used in the same system
US6851010B1 (en) Cache management instructions
JP3973129B2 (ja) キャッシュメモリ装置及びそれを用いた中央演算処理装置
JP6119523B2 (ja) 演算処理装置、演算処理装置の制御方法及びプログラム
US8166252B2 (en) Processor and prefetch support program
JP2009277243A (ja) コンパイラ装置およびオペレーティングシステム
JP6011329B2 (ja) プログラム生成装置、プログラム生成方法、および、コンピュータ・プログラム
JP2006309430A (ja) コンパイラによる最適化方法

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20110926

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20111025

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20120306