(57)【要約】【課題】  スレッドの切り替えを効率良く行なうことにより、処理速度を短縮させる。【解決手段】複数のキャッシュのうち最下位層のキャッシュ２０において命令にかかる要求についてキャッシュミスが生じた際に、そのキャッシュミスにかかる要求に関して、キャッシュ制御部２５が、命令にかかる命令識別子およびスレッド識別子をマルチスレッド制御部１１に通知し、このマルチスレッド制御部１１が、キャッシュ制御部２５から通知された命令識別子およびスレッド識別子に基づいて、次に命令完了すべき命令に関してキャッシュミスが生じた場合に、スレッドを切り替える。【選択図】        図１
2006040141.tif 000002
【特許請求の範囲】
【請求項１】
１以上の命令をそれぞれそなえた複数のスレッドを、１以上の演算器により並列的に実行可能なマルチスレッドプロセッサであって、
該演算器により処理を実行する該スレッドを選択的に切り替えるとともに、該命令が前記複数のスレッドのうちいずれの該スレッドに属するものであるかを示すスレッド識別子を設定するマルチスレッド制御部と、
該スレッド上の該命令に対して当該命令を特定する命令識別子を設定する命令制御部と、
データを一時的に保持可能であり階層的にそなえられた複数のキャッシュと、
前記複数のキャッシュへの該データの書き込み・読み出しを管理するキャッシュ制御部とをそなえ、
前記複数のキャッシュのうち最下位階層の該キャッシュにおいて該命令にかかる要求についてキャッシュミスが生じた際に、当該キャッシュミスにかかる該要求に関して、該キャッシュ制御部が、当該命令にかかる該命令識別子および該スレッド識別子を該マルチスレッド制御部に通知し、
該マルチスレッド制御部が、該キャッシュ制御部から通知された該命令識別子および該スレッド識別子に基づいて、該演算器により実行中の該スレッドを他のスレッドに切り替えることを特徴とする、マルチスレッドプロセッサ。
【請求項２】
該キャッシュ制御部が、
前記複数のキャッシュのうちキャッシュミスが生じた上位階層の該キャッシュから下位階層の該キャッシュに対して当該キャッシュミスにかかる要求を出す際に、該要求に対する前記下位階層のキャッシュからのデータ応答を格納する格納領域を確保して、当該格納領域を特定するためのキャッシュ要求識別子を設定するとともに、
該命令が、前記スレッド上の命令であり、該演算器が演算処理を行なうために該データを格納するレジスタと当該マルチスレッドプロセッサ外部の外部記憶部との間において該データの授受を生じるデマンド要求である場合には、当該命令にかかる該スレッド識別子と該キャッシュ要求識別子と該命令識別子とを該マルチスレッド制御部に対して通知することを特徴とする、請求項１記載のマルチスレッドプロセッサ。
【請求項３】
該キャッシュ制御部が、
該命令が、予め該外部記憶部から取得した該データを該レジスタに格納するプリフェッチ要求である場合に、前記マルチスレッド制御部に対して当該命令にかかる該スレッド識別子，該キャッシュ要求識別子および該命令識別子の通知を行なわないことを特徴とする、請求項２記載のマルチスレッドプロセッサ。
【請求項４】
該キャッシュ制御部が、
該プリフェッチ要求が該外部記憶部に発行されてからの経過時間を監視し、該命令によってアクセスされる該データが、先行するプリフェッチ要求によって該外部記憶部から取得された該データと一致するとともに、該経過時間が所定時間以上経過した場合に、前記マルチスレッド制御部に対して当該命令にかかる該スレッド識別子，該キャッシュ要求識別子および該命令識別子の通知を行なわないことを特徴とする、請求項２又は請求項３記載のマルチスレッドプロセッサ。
【請求項５】
フェッチにかかる該命令の命令完了予定順序を管理するフェッチ順序管理部をそなえ、
該キャッシュ制御部が、
該フェッチ順序管理部における該命令完了予定順序が先頭の該デマンド要求に対して前記上位階層のキャッシュ上で割り当てられたキャッシュラインが、該スレッド上の順番は該デマンド要求よりも後続するものであって、該デマンド要求よりも先に該キャッシュミスが生じており該格納領域が確保されている該命令に対して前記上位階層のキャッシュ上で割り当てられたキャッシュラインと同一である場合に、
該デマンド要求にかかるスレッド識別子および命令識別子を該命令の該キャッシュ要求識別子とともに、該スレッド制御部に通知することを特徴とする、請求項２〜請求項４のいずれか１項に記載のマルチスレッドプロセッサ。
【請求項６】
少なくとも、該キャッシュミスが生じた旨を示す情報，当該キャッシュミスにかかる該キャッシュ要求識別子，当該要求にかかるスレッド識別子および該命令識別子を相互に関連付けて登録可能なキャッシュミス情報格納部をそなえ、
該マルチスレッド制御部が、該キャッシュミス情報格納部に格納された情報に基づいて、該キャッシュミスに関する情報を取得することを特徴とする、請求項５記載のマルチスレッドプロセッサ。
【請求項７】
該キャッシュ制御部が、
該キャッシュミス情報格納部に、少なくとも、該キャッシュミスが生じた旨を示す情報，該キャッシュ要求識別子，当該命令にかかるスレッド識別子および該命令識別子がそれぞれ格納された後に、該命令に対するデータ応答が該外部記憶部から行なわれる際に、該データ応答を示す情報と当該データ応答にかかる該キャッシュ要求識別子とを該マルチスレッド制御部に通知するとともに、該キャッシュミス情報格納部における該当する前記キャッシュミスが生じた旨を示す情報をリセットすることを特徴とする、請求項６記載のマルチスレッドプロセッサ。
【請求項８】
該マルチスレッド制御部が、
該キャッシュミス情報格納部において、前記キャッシュミスが生じた旨を示す情報が登録されるとともに、そのキャッシュ要求にかかる該命令識別子および該スレッド識別子が、該フェッチ順序管理部において管理される該命令完了予定順序が先頭の命令にかかる命令識別子およびスレッド識別子と一致した時に、該スレッドを切り替えることを特徴とする、請求項６又は請求項７記載のマルチスレッドプロセッサ。
【請求項９】
該キャッシュミス情報格納部が、該スレッドの切り替えの要因となった該キャッシュミスが生じた該要求に対して、該スレッドが休止状態に遷移する要因となったことを示す情報を格納するとともに、
該キャッシュ制御部が、該キャッシュミスにかかるデータ応答が行なわれた際に、当該データ応答を示す信号とそのキャッシュ要求識別子とをマルチスレッド制御部に報告し、
該マルチスレッド制御部が、該キャッシュミス情報格納部において、前記スレッドが休止状態に遷移する要因となったことを示す情報が格納されている場合に、該スレッドを切り替えて復帰させることを特徴とする、請求項６〜請求項８のいずれか１項に記載のマルチスレッドプロセッサ。
【請求項１０】
該命令がストア命令である場合に、そのストア対象のアドレスがキャッシュミスした場合には、
該命令制御部が、前記ストア対象のアドレスにかかるデータ応答を待たずにストア命令を完了したものとして扱う突き放し制御を行なうとともに、
該キャッシュ制御部が、該マルチスレッド制御部に対して、当該ストア命令についてのキャッシュミスにかかる通知を行なわないことを特徴とする、請求項１〜請求項８のいずれか１項に記載のマルチスレッドプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチスレッドプロセッサにおけるスレッドの切り替え制御に関する。
【背景技術】
【０００２】
近年、コンピュータアーキテクチャの代表的なものとしては、複雑な処理を一命令で行なうＣＩＳＣ（Complex Instruction Set Computer）アーキテクチャの他、一命令中に実行する処理を簡素化したＲＩＳＣ（Reduced Instruction Set Computer）アーキテクチャ，複数の同時処理可能な命令をソフトウェアで１つの長い命令にまとめたＶＬＩＷ（Very Long Instruction Word）アーキテクチャ等が知られている。
【０００３】
また、これらのアーキテクチャを実現するコンピュータの中央演算器装置（ＣＰＵ；Central Processing Unit）における処理手法は、インオーダ実行型とアウトオブオーダ実行型との２つに大別することができる。
図２３はインオーダ実行型の処理方法を説明するための図、図２４はアウトオブオーダ実行型の処理方法を説明するための図である。インオーダ実行型は、図２３に示すように、プログラム順に沿って命令処理を行なう手法であり、アウトオブオーダ実行型は、図２４に示すように、命令間の依存関係を見て、依存関係のない命令ならばプログラム順を追い越してでも処理を行なう手法である。
【０００４】
そして、近年においては、一のプロセッサにおいて一のプログラム（スレッド）を実行するシングルスレッド処理の他に、物理的に一のプロセッサにおいて複数のスレッドを並列的に実行するマルチスレッドプロセッサ方式が注目されている。
図２５（ａ），（ｂ）はマルチスレッドプロセッサ方式を説明するための図であり、図２５（ａ）はシングルスレッド処理を説明するための図、図２５（ｂ）はマルチスレッド処理を説明するための図である。なお、図２５（ｂ）においては、１つのＣＰＵでＡ，Ｂの２つのプログラムを並列的に処理するマルチスレッド処理の例を示している。
【０００５】
一般に、ＣＰＵは、ソフトウェアから可視なレジスタや状態レジスタ（ＣＰＵ状態レジスタ）に加え、加減算や乗算，除算、またメモリデータをレジスタに読み出すロード処理や、レジスタのデータをメモリに書き込むストア処理を実行する資源を有する。マルチスレッドプロセッサとは、１つのＣＰＵ内にソフトウェアから可視なレジスタを多重化し、別々なプログラムを実行するようにしながら、加減算などの命令実行資源を複数のプログラムで共有するものである。
【０００６】
上述の如きマルチスレッド処理を実現するための方式としては、複数のスレッドを同時に実行する、fine grained multithreading方式やSimultaneous multithreading（ＳＭＴ；同時マルチスレッディング）方式（図２６参照）の他、複数のスレッドを同時には実行せず、キャッシュミスのような事象が起きたときに別のスレッドに切り替えて実行する、coarse grained multithreading方式やVertical multithreading（ＶＭＴ；時分割型マルチスレッディング）方式（図２７参照）がある（特許文献１参照）。
【０００７】
図２６はＳＭＴ方式を説明するための図、図２７はＶＭＴ方式を説明するための図である。
ＶＭＴ方式は、処理に長時間かかるキャッシュミスした命令処理を隠蔽することを狙い、キャッシュミスを検出したときに、メモリからキャッシュまでデータを持ってくる処理をキャッシュ制御部（図示省略）が実行している間に、メモリアクセス以外の処理について、実行部や制御部（ともに図示省略）において他のスレッドに切り替え、実行するというものである。又、このＶＭＴ方式においては、キャッシュミスが発生しにくいスレッドに関しては、一定時間経過した時点で他のスレッドに切り替えるようになっている。
【０００８】
図２８はインオーダ方式におけるキャッシュミス時の処理を説明するための図、図２９はアウトオブオーダ方式におけるキャッシュミス時の処理を説明するための図、図３０はアウトオブオーダ方式における従来のスレッド切り替え手法を説明するための図である。
さて、従来、ＶＭＴ方式は、前述したインオーダ型プロセッサ上でのみ実装されている。インオーダ実行するプロセッサでは、キャッシュミスの事象はプログラム順に起こり、又、キャッシュミスしたデータがメモリから応答するのも、プログラム順に行なわれる（図２８参照）。一方、アウトオブオーダで実行をするプロセッサでは、メモリアクセスがプログラム内の命令順序に生じるわけではなく、図２９に示すように、キャッシュミスの事象は、必ずしもプログラム順では起こらない。
【０００９】
例えば、図３０に示すように、それぞれキャッシュミスが生じるスレッドＸ上の２つの命令Ａ，Ｂがあり、スレッドＸ上の順番では命令Ａ，命令Ｂの順であった場合において、命令Ｂの実行を命令Ａよりも先に実行できる場合には、命令Ａがキャッシュミスしたことを検出する前に、命令Ｂがキャッシュミスしたことを検出することになる。例えば、図３０に示す例において、命令Ｂのキャッシュミスを検出して、命令Ａがキャッシュミスをする前にスレッドXから別のスレッドYに切り替えてしまうと、スレッドXの実行を再開してから命令Ａのキャッシュミスが発生する。
【００１０】
なお、インオーダ実行型のプロセッサでは、命令Ｂの実行開始が命令Ａの実行開始を待って行なわれるので、キャッシュミスは命令Ａ，命令Ｂの順番で生じる。
【特許文献１】特開２００２−１６３１２１号公報
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかしながら、従来のＶＭＴ方式のマルチスレッドプロセッサにおいては、キャッシュミスが生じる毎にスレッドの切り替えを行なっているので、スレッドの切り替え回数が多くなり非効率的であるという課題があり、スレッドの切り替えを効率良く行なうことにより、処理速度を短縮させたいという要求もある。
本発明は、このような課題に鑑み創案されたもので、スレッドの切り替えを効率良く行なうことにより、処理速度を短縮させることを目的とする。
【課題を解決するための手段】
【００１２】
このため、本発明のマルチスレッドプロセッサ（請求項１）は、１以上の命令をそれぞれそなえた複数のスレッドを、１以上の演算器により並列的に実行可能なマルチスレッドプロセッサであって、該演算器により処理を実行する該スレッドを選択的に切り替えるとともに、該命令が前記複数のスレッドのうちいずれの該スレッドに属するものであるかを示すスレッド識別子を設定するマルチスレッド制御部と、該スレッド上の該命令に対して当該命令を特定する命令識別子を設定する命令制御部と、データを一時的に保持可能であり階層的にそなえられた複数のキャッシュと、前記複数のキャッシュへの該データの書き込み・読み出しを管理するキャッシュ制御部とをそなえ、前記複数のキャッシュのうち最下位階層の該キャッシュにおいて該命令にかかる要求についてキャッシュミスが生じた際に、当該キャッシュミスにかかる該要求に関して、該キャッシュ制御部が、当該命令にかかる該命令識別子および該スレッド識別子を該マルチスレッド制御部に通知し、該マルチスレッド制御部が、該キャッシュ制御部から通知された該命令識別子および該スレッド識別子に基づいて、該演算器により実行中の該スレッドを他のスレッドに切り替えることを特徴としている。
【００１３】
なお、該キャッシュ制御部が、前記複数のキャッシュのうちキャッシュミスが生じた上位階層の該キャッシュから下位階層の該キャッシュに対して当該キャッシュミスにかかる要求を出す際に、該要求に対する前記下位階層のキャッシュからのデータ応答を格納する格納領域を確保して、当該格納領域を特定するためのキャッシュ要求識別子を設定するとともに、該命令が、前記スレッド上の命令であり、該演算器が演算処理を行なうために該データを格納するレジスタと当該マルチスレッドプロセッサ外部の外部記憶部との間において該データの授受を生じるデマンド要求である場合には、当該命令にかかる該スレッド識別子と該キャッシュ要求識別子と該命令識別子とを該マルチスレッド制御部に対して通知してもよい（請求項２）。
【００１４】
また、該キャッシュ制御部が、該命令が、予め該外部記憶部から取得した該データを該レジスタに格納するプリフェッチ要求である場合に、前記マルチスレッド制御部に対して当該命令にかかる該スレッド識別子，該キャッシュ要求識別子および該命令識別子の通知を行なわないようにしてもよい（請求項３）。
さらに、該キャッシュ制御部が、該プリフェッチ要求が該外部記憶部に発行されてからの経過時間を監視し、該命令によってアクセスされる該データが、先行するプリフェッチ要求によって該外部記憶部から取得された該データと一致するとともに、該経過時間が所定時間以上経過した場合に、前記マルチスレッド制御部に対して当該命令にかかる該スレッド識別子，該キャッシュ要求識別子および該命令識別子の通知を行なわないようにしてもよい（請求項４）。
【００１５】
また、フェッチにかかる該命令の命令完了予定順序を管理するフェッチ順序管理部をそなえ、該キャッシュ制御部が、該フェッチ順序管理部における該命令完了予定順序が先頭の該デマンド要求に対して前記上位階層のキャッシュ上で割り当てられたキャッシュラインが、該スレッド上の順番は該デマンド要求よりも後続するものであって、該デマンド要求よりも先に該キャッシュミスが生じており該格納領域が確保されている該命令に対して前記上位階層のキャッシュ上で割り当てられたキャッシュラインと同一である場合に、該デマンド要求にかかるスレッド識別子および命令識別子を該命令の該キャッシュ要求識別子とともに、該スレッド制御部に通知してもよい（請求項５）。
【００１６】
さらに、少なくとも、該キャッシュミスが生じた旨を示す情報，当該キャッシュミスにかかる該キャッシュ要求識別子，当該要求にかかるスレッド識別子および該命令識別子を相互に関連付けて登録可能なキャッシュミス情報格納部をそなえ、該マルチスレッド制御部が、該キャッシュミス情報格納部に格納された情報に基づいて、該キャッシュミスに関する情報を取得してもよい（請求項６）。
【００１７】
また、該キャッシュ制御部が、該キャッシュミス情報格納部に、少なくとも、該キャッシュミスが生じた旨を示す情報，該キャッシュ要求識別子，当該命令にかかるスレッド識別子および該命令識別子がそれぞれ格納された後に、該命令に対するデータ応答が該外部記憶部から行なわれる際に、該データ応答を示す情報と当該データ応答にかかる該キャッシュ要求識別子とを該マルチスレッド制御部に通知するとともに、該キャッシュミス情報格納部における該当する前記キャッシュミスが生じた旨を示す情報をリセットしてもよい（請求項７）。
【００１８】
さらに、該マルチスレッド制御部が、該キャッシュミス情報格納部において、前記キャッシュミスが生じた旨を示す情報が登録されるとともに、そのキャッシュ要求にかかる該命令識別子および該スレッド識別子が、該フェッチ順序管理部において管理される該命令完了予定順序が先頭の命令にかかる命令識別子およびスレッド識別子と一致した時に、該スレッドを切り替えてもよい（請求項８）。
【００１９】
また、  該キャッシュミス情報格納部が、該スレッドの切り替えの要因となった該キャッシュミスが生じた該要求に対して、該スレッドが休止状態に遷移する要因となったことを示す情報を格納するとともに、該キャッシュ制御部が、該キャッシュミスにかかるデータ応答が行なわれた際に、当該データ応答を示す信号とそのキャッシュ要求識別子とをマルチスレッド制御部に報告し、該マルチスレッド制御部が、該キャッシュミス情報格納部において、前記スレッドが休止状態に遷移する要因となったことを示す情報が格納されている場合に、該スレッドを切り替えて復帰させてもよい（請求項９）。
【００２０】
さらに、該命令がストア命令である場合に、そのストア対象のアドレスがキャッシュミスした場合には、該命令制御部が、前記ストア対象のアドレスにかかるデータ応答を待たずにストア命令を完了したものとして扱う突き放し制御を行なうとともに、該キャッシュ制御部が、該マルチスレッド制御部に対して、当該ストア命令についてのキャッシュミスにかかる通知を行なわないようにしてもよい（請求項１０）。
【発明の効果】
【００２１】
本発明によれば、複数のスレッドを効率良く切り替えることにより処理時間を短縮することができるとともに、スレッドの切り替えによる外部記憶部へのデータ応答処理時間の隠蔽を効果的に行なうことができる利点がある。
【発明を実施するための最良の形態】
【００２２】
以下、図面を参照して本発明の実施の形態を説明する。
図１は本発明の一実施形態としてのマルチスレッドプロセッサの構成を示すブロック図である。
本発明の一実施形態としてのマルチスレッドプロセッサであるＣＰＵ（Central Processing Unit）１は、例えば複数のスレッド（プログラム）を１以上の演算器１５（図２参照）により並列的に実行可能なマルチスレッドプロセッサとして構成されている。
【００２３】
本ＣＰＵ１は、図１に示すように、マルチスレッド制御部１１，レジスタ１３，実行部１５０，命令制御部１６，ＴＬＢ（論理アドレス・物理アドレス変換部）１７，Ｌ１命令キャッシュ１８，Ｌ１データキャッシュ１９，Ｌ２キャッシュ２０，Ｌ１命令キャッシュ制御部２３，Ｌ１データキャッシュ制御部（キャッシュ制御部）２４およびＬ２キャッシュ制御部（キャッシュ制御部）２５をそなえて構成され、又、バス２２を介してメインメモリ２１と通信可能に接続されている。
【００２４】
命令制御部１６は、１次命令キャッシュ１８やＬ２キャッシュ２０，メインメモリ２１から命令を取得して実行部１５０により実行させるための制御を行なうものであり、スレッド上の各命令に対して、これらの命令を特定するための命令識別子（ＩＩＤ：Instruction Identifier）を設定（割り当て）するようになっている。
図２は本発明の一実施形態としてのマルチスレッドプロセッサ（ＣＰＵ１）におけるＩＩＤの設定手法を説明するための図である。この図２に示すように、本ＣＰＵ１においては、０〜６３までの６４個のＩＩＤを予め用意しておき、命令解読（デコード）時において、各命令に対して０から昇順に１，２，３，・・・とＩＩＤを割り当てる（設定する）ようになっており、６３まで割り当てを行なった後には、０に戻って再度昇順に割り当てを行なうようになっている。
【００２５】
また、完了（コミット）についても、同様に、０から昇順に行なうようになっている。例えば、ＩＩＤが１０番の命令が実行終了していない場合には、ＩＩＤが１１番の命令が実行終了していてもこの１１番の完了処理は行なわずに、その結果をレジスタ１３やメモリ２１に書き込むことに留めておくようになっている。
そして、命令が完了すると、その命令に設定されたＩＩＤは解放され他の命令に割り当てられるようになっている。これにより、命令の解読から実行、完了までを識別することができるようになっている。又、このＩＩＤは、プロセッサ上で実行しているスレッドを切り替えて命令がキャンセルされた場合や、分岐予測ミスやトラップが生じた場合には無効化され、次に解読される命令列は0番から割り当てられていくようになっている。
【００２６】
また、Ｌ１データキャッシュ制御部２４は、フェッチにかかる要求の命令完了予定順序を管理するフェッチキュー２８（フェッチ順序管理部；図４参照）をそなえている。このフェッチキュー２８は、複数（例えば１６個）のデータ格納領域によって実現され、命令解読時にキャッシュ（Ｌ１命令キャッシュ１８，Ｌ１データキャッシュ１９，Ｌ２キャッシュ２０）にアクセスする命令に対しプログラム順に従って順次確保されるようになっている。
【００２７】
さらに、命令制御部１６は、ストア命令に対して、ストア対象のアドレスにかかるデータ応答を待たずにストア命令を完了したものとして扱う突き放し制御を行なうようになっている（詳細は後述）。
ＴＬＢ（Translation Look-aside Buffer；論理アドレス・物理アドレス変換部）１７は、論理アドレスから物理アドレスへの変換で発生するページテーブル参照のペナルティを小さくするために設けられた一種のキャッシュであり、参照されたアドレスと変換情報の履歴を保存しておき、アドレス変換の高速化を実現するものである。
【００２８】
実行部（演算器）１５０は、レジスタウィンドウ１２等を用いて演算等の種々の処理（命令処理）を行なうものであり、例えば種々の演算処理を実行する演算器（実行演算器）として機能するようになっている。
メインメモリ２１は、ＣＰＵ１の外部にそなえられたメモリであって、種々の命令やデータを格納するものであり、バス２２を介してＣＰＵ１と通信可能に接続され、実行部１５０による処理・実行に必要とされる命令やデータがＬ１命令キャッシュ１８，Ｌ１データキャッシュ１９およびＬ２キャッシュ２０に格納されていない場合（キャッシュミス時）には、ＣＰＵ１はバス２２等を介してこのメインメモリ２１から命令やデータを読み出すようになっている。
【００２９】
Ｌ１命令キャッシュ１８は、実行部１５０が実行する命令を格納するための１次キャッシュであり、Ｌ１データキャッシュ１９は、実行部１５０が命令の実行に際して使用された各種データを格納するための１次キャッシュである。Ｌ２キャッシュ２０は、各種命令やデータを格納するための２次キャッシュである。すなわち、本ＣＰＵ１においては、複数のキャッシュ（Ｌ１命令キャッシュ１８，Ｌ１データキャッシュ１９，Ｌ２キャッシュ２０）が階層的にそなえられている。
【００３０】
そして、本実施形態においては、ＣＰＵ１にそなえられた複数のキャッシュのうち、ＣＰＵ１の外部にそなえられるメインメモリ２１に最も近い位置にそなえられたＬ２キャッシュ２０が最下位階層のキャッシュであり、このＬ２キャッシュ２０に対してＬ１命令キャッシュ１８やＬ１データキャッシュ１９が上位階層（上位側）のキャッシュである。
以下、本ＣＰＵ１におけるスレッド切り替え手法を、Ｌ１データキャッシュ１９およびＬ２キャッシュ２０におけるキャッシュミスに着目して説明する。
【００３１】
なお、以下、Ｌ１データキャッシュ１９を単にＬ１キャッシュという場合があり、又、Ｌ１データキャッシュ制御部２４を単にＬ１キャッシュ制御部という場合がある。
Ｌ１データキャッシュ制御部（キャッシュ制御部）２４は、Ｌ１データキャッシュ１９に対応してそなえられており、Ｌ１データキャッシュ１９へのデータの書き込み・読み出しを管理・制御するものである。又、Ｌ１命令キャッシュ制御部２３は、Ｌ１命令キャッシュ１８に対応してそなえられており、Ｌ１命令キャッシュ１８へのデータ（命令データ）の書き込み・読み出しを管理・制御するものである。Ｌ２キャッシュ制御部（キャッシュ制御部）２５は、Ｌ２キャッシュ２０に対応してそなえられており、Ｌ２キャッシュ２０へのデータ（命令データ，データ）の書き込み・読み出しを管理・制御するものである。
【００３２】
また、Ｌ１データキャッシュ制御部２４は、Ｌ２キャッシュ２０（Ｌ２キャッシュ制御部２５）に出した要求に対する応答データを一時的に格納するバッファ（Ｌ１ＭＩＢ；Ｌ１ ムーブ・イン・バッファ）２６をそれぞれ複数個そなえており（図４等参照）、同様に、L２キャッシュ制御部２５も、Ｌ２キャッシュミスによりメインメモリ２１に出した要求に対する応答データを一時的に格納するバッファ（L２ＭＩＢ；L２ ムーブ・イン・バッファ）２７を複数個そなえている（図４等参照）。
【００３３】
Ｌ２キャッシュ制御部２５は、Ｌ２キャッシュ２０においてキャッシュミスが生じた場合には、メインメモリ２１に出した要求に対する応答データを一旦格納するバッファ（Ｌ２ＭＩＢ；Ｌ２  ムーブ・イン・バッファ）を確保してからメインメモリへの要求を発行するようになっている。
なお、これらのＭＩＢについての詳細な説明は後述する。
【００３４】
図３はアウトオブオーダ方式のパイプラインを模式的に示す図である。ここで、アウトオブオーダ制御について、命令フェッチ，命令解読（デコード），実行および完了の４つのステージに分けて説明する。
まず、命令コードをプログラム順序に命令キャッシュからフェッチしてくる。次に、取得した命令コードを解読（デコード）ステージにおいて解読し、何を実行する命令か解読する。また自身の命令の入力データと前の命令の結果データと依存関係があるかを検出する。
【００３５】
命令コードの解読後は、実行ステージに移り、加減算等の演算やメモリアクセスを行なう。具体的には、解読済みの命令をフェッチキュー２８に入れて、未実行の命令の結果と入力データに依存関係がない場合に、実行部（演算器）１５０に投入してメモリアクセスを行なう。依存関係がある場合には、入力データが前命令から出力されるまでフェッチキュー２８に滞留させておく。
【００３６】
実行処理後の出力データに関しては、レジスタ１３、メインメモリ２１等のソフトから可視の資源の更新は、割り込み処理発生時などでのプログラム順序を保障しなければならないので、一時的なデータを格納するバッファに書き込んで保持する。レジスタ１３を更新する演算の結果はレジスタ更新バッファ（Register Update Buffer；図示省略）に格納し、メインメモリ２１を更新するデータはストアバッファ（図示省略）に格納する。
【００３７】
完了（コミット）ステージでは、プログラム順序（命令解読した順序）に従ってレジスタ１３やメインメモリ２１の更新を行なう。つまり、レジスタ更新バッファからレジスタ１３に書き込みを行なったり、ストアデータバッファからメインメモリ２１に書き込みを行なう。
次に、図４〜図１１を参照しながら、本ＣＰＵ１におけるL１キャッシュやＬ２キャッシュ２０，メインメモリ２１にアクセスするときの動作概要を説明する。なお、図４は本ＣＰＵ１における命令制御部１６，Ｌ１キャッシュ制御部およびＬ２キャッシュ制御部２５間において授受される制御信号を説明するための図、図５は本ＣＰＵ１においてロード命令に対してＬ１キャッシュヒットしたケースにかかるデータの流れを示す図、図６は本ＣＰＵ１においてロード命令に対してＬ１キャッシュミスが生じ且つＬ２キャッシュヒットしたケースにかかるデータの流れを示す図、図７は本ＣＰＵ１においてロード命令に対してＬ１キャッシュミスおよびＬ２キャッシュミスが生じたケースにかかるデータの流れを示す図、図８はＬ１プリフェッチ処理を説明するための図、図９はＬ２プリフェッチ処理を説明するための図、図１０は本ＣＰＵ１における命令制御部のキャンセル時のキャンセル範囲のイメージを示す図、図１１は本ＣＰＵ１におけるキャンセル時の処理を説明するための図である。
【００３８】
さて、Ｌ１キャッシュからのアクセスとして、プログラム上の命令によってメモリデータを必ずレジスタ１３に書き込むロード命令や、レジスタ１３内のデータを必ずメインメモリ２１上に書き込むストア命令がある。以下、本実施形態においては、これらのロード命令やストア命令をデマンド要求と呼ぶ場合がある。
また、キャッシュミスが生じた場合にメインメモリ２１から持って来るまでの時間を隠蔽するための手法として、レジスタ１３には書き込まないが、あらかじめＬ１キャッシュやＬ２キャッシュ２０上にデータを持ってきておくためのプログラムの命令であるプリフェッチ命令（ソフトウェアプリフェッチ）や、キャッシュミスするデータのアドレスの規則性をハードウェアによって検出し、プログラム上にプリフェッチ命令は指示されていない場合においてもメインメモリ２１からデータを先読みするハードウェアプリフェッチ機能がある。
【００３９】
以下、本実施形態においては、上述した、プログラムのプリフェッチ命令とハードウェアによるプリフェッチ（ハードウェアプリフェッチ機能）とをあわせてＬ２キャッシュ２０ではプリフェッチ要求と呼ぶ。又、このプリフェッチ要求には、Ｌ１キャッシュまでデータを持ってくるＬ１プリフェッチ（Ｌ１プリフェッチ処理；図８参照）と、Ｌ２キャッシュ２０までしかデータを持ってこないＬ２プリフェッチ（Ｌ２プリフェッチ処理；図９参照）とがある。なお、プリフェッチ要求はキャッシュ制御部２４で行なうため、このキャッシュミスの処理ペナルティは直接命令処理に影響しないようになっている。
【００４０】
Ｌ１データキャッシュ制御部２４は、図４に示すように、メモリアクセスのためのアドレスの他、ロード命令やストア命令，プリフェッチ命令等の命令コードやＩＩＤ等、実行に必要な種々の情報を命令制御部１６から受け取り、複数のキャッシュアクセス命令をフェッチキュー２８に入れる。又、同時にＬ１データキャッシュ１９にアクセスして、キャッシュヒットしてロード命令であれば（図５の矢印(1)参照）、データをレジスタ１３へ応答する（図５矢印(2)参照）。
【００４１】
フェッチキュー２８は、命令解読時にキャッシュにアクセスする命令に対し、プログラム順で確保される。アドレス計算などのキャッシュアクセスに必要な情報は、プログラム順とは無関係に行なわれ、またＬ１データキャッシュ１９からレジスタ１３へのデータ応答も、プログラム順とは無関係にアウトオブオーダで行なわれる。フェッチキュー２８は命令解読時に割り当てられた順で開放される。
【００４２】
Ｌ１キャッシュミス時には、図６〜図８に示すように、下位階層のＬ２キャッシュ２０に対してデータ要求が行なわれる。ここで、デマンド要求やプリフェッチ要求には、それぞれ必ず有限数のＭＩＢ（Ｌ１ＭＩＢ２６，Ｌ２ＭＩＢ２７；格納領域）の中から１つが確保されるようになっている（図６〜図８の矢印(1)参照）。そして、データ応答があった場合には（図６の矢印(3)参照）、Ｌ１キャッシュ制御部２４は、Ｌ１データキャッシュ１９に書き込みを行なうとともに（図６の矢印(4)参照）、Ｌ１ＭＩＢ２６を開放し、更に、レジスタ１３にデータ応答を行なう（図６の矢印(5)参照）。
【００４３】
Ｌ２キャッシュ制御部２５は、Ｌ２キャッシュミスしたリクエストの後に、Ｌ２キャッシュ２０にヒット（Ｌ２キャッシュヒット）する要求を受け付けた場合に、ヒットしたデータを先に返すような処理を行なうようになっている。つまり、Ｌ２キャッシュ制御部２５からの応答は、Ｌ１データキャッシュ制御部２４（Ｌ１データキャッシュ１９）から見てアウトオブオーダで行なわれる。
【００４４】
Ｌ２キャッシュ２０にヒットしたときには（図６の矢印(2)参照）、Ｌ２キャッシュ制御部２５は、Ｌ１ＭＩＢ２６を割り当てられた要求に関しては、対応するＬ１ＭＩＢ２６を特定するための識別子（Ｌ１ＭＩＢ−ＩＤ：キャッシュ要求識別子）とともにデータ応答する（図６の矢印(3)参照）。Ｌ２キャッシュミスした場合は（図７〜図９の矢印(2)参照）、メインメモリに出した要求に対する応答データを一旦格納するバッファ（Ｌ２ＭＩＢ２７）を確保してからメインメモリ２１への要求を発行する（図７〜図９の矢印(3)参照）。メインメモリ２１からのデータ応答（図７〜図９の矢印(4)参照）も、発行順序と別に図示しないメインメモリ制御部から返ってくる。
【００４５】
このようにして帰ってきたデータ応答はＬ２ＭＩＢ２７に格納された後に、Ｌ２キャッシュ制御部２５によってＬ２キャッシュ２０に書き込まれ、又、Ｌ２ＭＩＢ２７の解放が行なわれる。その後、データ応答は対応するＬ１ＭＩＢ２６に格納される（図７，図８の矢印(5)参照）。Ｌ１キャッシュ制御部２４は、Ｌ１データキャッシュ１９に書き込みを行なうとともに（図７，図８の矢印(6)参照）、Ｌ１ＭＩＢ２６を開放し、更に、レジスタ１３にデータ応答を行なう（図７の矢印(7)参照）。
【００４６】
次にＬ２プリフェッチ要求について説明する。
Ｌ２プリフェッチ要求に関しては、図９に示すように、L１キャッシュ１９への書き込みを行なわない。そのためＬ１ＭＩＢ２６を確保しない。そのため、Ｌ２プリフェッチ要求はＬ１ＭＩＢ２６がすべて占有された場合もＬ２キャッシュ２０に要求を発行することが可能である。Ｌ２キャッシュ２０にヒットしたときはＬ１データキャッシュ１９へのデータ応答も行なわず何もしない。Ｌ２キャッシュミスした場合は、Ｌ２ＭＩＢ２７を確保して、メインメモリ２１からデータを要求する。メインメモリ２１にデータ応答が返ってきて、Ｌ２キャッシュ２０に書き込みが完了してＬ２ＭＩＢ２７を開放する。
【００４７】
次にＬ１ＭＩＢ２６,Ｌ２ＭＩＢ２７の確保の仕方について述べる。
図９に示すように、Ｌ１キャッシュミスした要求がＬ２キャッシュ２０にアクセスしようとするときに、先行するＬ１ＭＩＢ２６を確保した要求がＬ１データキャッシュ１９の同一ラインであった場合は、後続のＬ１キャッシュミスした要求を一旦中止し、キャッシュラインが同一であったＬ１ＭＩＢ２６の開放をフェッチキュー２８内で待つ。これは、同一キャッシュラインに対し、複数のキャッシュミスが発生すると、データ応答の際にどのウェイに書き込むか選択する回路が複雑になることや、実際に同一キャッシュラインにぶつかるケースが稀であることからこのような制御を行なっている。L１キャッシュ１９にヒットした要求は、Ｌ１ＭＩＢ２６と同一キャッシュラインであっても通常のヒット時と同様に振舞う。
【００４８】
Ｌ２キャッシュミスした要求に関しても、メインメモリ２１にアクセスしようとして、先行するＬ２ＭＩＢ２７を確保した要求がＬ２キャッシュ２０の同一ラインであった場合は、後続のＬ２キャッシュミスした要求を一旦中止して、キャッシュラインが同一であったＬ２ＭＩＢ２７の開放をフェッチキュー２８内で待つ。Ｌ２キャッシュにヒットした要求は、Ｌ２ＭＩＢ２７と同一キャッシュラインかどうかに関わらず、データ応答など通常のヒット時と同様に振舞う。
【００４９】
命令制御部１６で、分岐予測ミスもしくはトラップ処理ルーチンに入るため命令実行をキャンセルした場合には、図１０に示すように、フェッチキュー２８にある情報を無効化する。つまり、レジスタへの書き込みは行なわないようになっている。しかし、キャンセル時にすでにＬ１ＭＩＢ２６を確保してあれば、Ｌ２キャッシュアクセスを起動したデマンド要求、及びＬ１プリフェッチ要求に関しては、Ｌ１キャッシュへの書き込みまで行なう。また、Ｌ２プリフェッチに関しては、Ｌ２キャッシュ２０への書き込みまで行なう
（図１１参照）。
【００５０】
マルチスレッド制御部１１は、実行部１５０による処理対象のスレッドを選択的に切り替えるものである。なお、このマルチスレッド制御部１１は、実行部１５０（演算器）により処理を実行するスレッドを識別するための識別子（実行スレッド識別子）に基づいて、レジスタ（レジスタウィンドウ）１３と実行部１５０との間におけるデータ転送を制御するようになっている。
【００５１】
また、マルチスレッド制御部１１は、本ＣＰＵ１において並列的に実行される複数のスレッドをそれぞれ識別するための識別子（スレッド識別子）を設定するようになっており、これらのスレッド上の各命令に対して、その命令がどのスレッドに属するものであるかを示す識別子（スレッド識別子）を設定するようになっている。
そして、マルチスレッド制御部１１は、Ｌ１命令キャッシュ制御部２３やＬ１データキャッシュ制御部２４から通知された命令識別子やスレッド識別子に基づいて、次に命令完了すべき命令にキャッシュミスが生じた場合に、スレッドを切り替えるよう制御するようになっている。
【００５２】
図１２は本ＣＰＵ１におけるマルチスレッド制御部１１からＬ１データキャッシュ制御部２４やＬ２キャッシュ制御部２５へのマルチスレッド制御用信号の流れを示す図、図１３は本ＣＰＵ１におけるＬ２キャッシュミス時のマルチスレッド制御部１１への報告手法を説明するための図である。
マルチスレッド制御部１１は、図１２に示すように、走行しているスレッドの識別子（スレッド識別子）をＬ１データキャッシュ制御部２４およびＬ２キャッシュ制御部２５に送るようになっている。そして、Ｌ１データキャッシュ制御部２４は、Ｌ２キャッシュ要求でＬ１ＭＩＢ２６を確保する際に、その命令（要求）のスレッド識別子をＬ１ＭＩＢ２６に登録するようになっている。更に、例えば、命令がデマンド要求であれば、その要求がデマンドであることを示すフラグやＩＩＤ（命令識別子）も登録する。
【００５３】
Ｌ２キャッシュ制御部２５は、図１３に示すように、Ｌ２キャッシュミスを検出すると、Ｌ１ＭＩＢ２６を確保しているデマンド要求やＬ１プリフェッチ要求に対して、キャッシュアクセス要求リクエスト識別子として、Ｌ１ＭＩＢ−ＩＤ（Ｌ１ＭＩＢ番号；キャッシュ要求識別子）と、Ｌ２キャッシュミスしたことを示すフラグとを、その命令にかかるスレッドＩＤとともにＬ１データキャッシュ制御部２４に送信する。
【００５４】
一方、Ｌ１データキャッシュ制御部２４では、図１３に示すように、Ｌ２キャッシュミスしたＬ１ＭＩＢ２６に対して、Ｌ２キャッシュしたことを示すフラグをセットする。更に、例えば、Ｌ１ＭＩＢ２６にかかる命令がデマンド要求であった場合には、マルチスレッド制御部１１に対して、スレッドＩＤ，ＩＩＤ，Ｌ１ＭＩＢ−ＩＤおよびＬ２キャッシュミスフラグを送信するようになっている。
【００５５】
すなわち、Ｌ１データキャッシュ制御部２４は、命令が、スレッド上の命令であり、演算部１５０が演算処理を行なうためにデータを格納するレジスタとそのマルチスレッドプロセッサ外部のメインメモリ（外部記憶部）２１との間においてデータの授受を生じるデマンド要求である場合に、その命令にかかるスレッド識別子とキャッシュ要求識別子と命令識別子とをマルチスレッド制御部１１に対して通知するようになっている。
【００５６】
なお、プリフェッチ要求に関しては、キャッシュミスするようなデマンドリクエストのペナルティを隠蔽する目的で発行されるものであり、又、キャッシュに書き込む操作はキャッシュ制御部で行ない、メインメモリ２１からのデータを待つ場合も命令制御部１６からはペナルティが見えない。そのためＬ２キャッシュミスの報告（スレッドＩＤ，ＩＩＤ，Ｌ１ＭＩＢ−ＩＤの通知）は命令制御部１６まで行なわないようにする。
【００５７】
また、ストア命令に対しては、ストア対象のアドレスがキャッシュミスした場合であっても、命令制御部１６は、Ｌ２データキャッシュ１９もしくはメインメモリ２１からの該当アドレスのデータ応答を待たずにストア命令を完了する突き放し制御を行なっている。
図１４は本ＣＰＵ１におけるストア命令の突き放し制御を説明するためのパイプライン図である。この突き放し制御は、命令制御部１６がストア命令を完了するときに、キャッシュ制御部２４がストアデータを専用のバッファ（図示省略）に格納し、データを書き込むべきアドレスのデータがＬ１データキャッシュ１９に返ってきたときに、Ｌ１データキャッシュ制御部２４がデータ更新を行なう処理である。
【００５８】
すなわち、バックグラウンドにおいて(1)ストアデータをバッファに一時的に格納し、キャッシュミスしたデータを待ち、(2)データ応答が行なわれると、(3)応答データにストアデータの変更を与え、キャッシュに書き込むのである。
ストア命令のキャッシュミスによるペナルティは命令制御部１６から直接見えず、最下位階層（本実施形態ではＬ２）でキャッシュミスを検出するときにはＩＩＤはすでに更新されている。
【００５９】
そして、デマンド要求であるストア命令に対しては、Ｌ２キャッシュミスの報告を抑止している。具体的には、Ｌ１データキャッシュ制御部２４が、Ｌ１ＭＩＢ２６を確保する時にその要求がストア命令であるかを示すフラグをＬ１ＭＩＢ２６にセットし、このフラグがセットされている場合はマルチスレッド制御部１１への報告を抑止するようになっている。
【００６０】
図１５は本ＣＰＵ１におけるＬ２キャッシュミス時における処理を説明するための図である。
Ｌ２プリフェッチで、Ｌ２ＭＩＢ２７を確保しているときに、同一キャッシュラインに後続のデマンド要求またはＬ１プリフェッチ要求がきて、Ｌ２キャッシュミスが生じた場合は、前述のとおり先行して発行されたプリフェッチがＬ２ＭＩＢ２７を開放するまで、メインメモリまで要求を発行することができないが、後続のＬ１ＭＩＢ２６を確保した命令にＬ２キャッシュミスが発生した旨をＬ１キャッシュに報告するようになっている。
【００６１】
さらに、プリフェッチで応答されるデータが後続の要求のデータとして用いられる場合には、図１５に示すように、先のプリフェッチがＬ２ＭＩＢ２７を確保してからの経過時間をタイマー（Ｌ２ＭＩＢｘ−Ｔｉｍｅｒ）等を用いて監視し、ある一定時間経過している場合は、もうすぐメインメモリからの応答があるとして、Ｌ２キャッシュミスを報告しない制御を可能としている。
【００６２】
すなわち、Ｌ２キャッシュ制御部２５は、プリフェッチ要求がメインメモリ２１に発行されてからの経過時間を監視し、その命令によってアクセスされるデータが、先行するプリフェッチ要求によってメインメモリ２１から取得されたデータと一致するとともに、経過時間が所定時間以上経過した場合に、マルチスレッド制御部１１に対して当該命令にかかるスレッドＩＤ，Ｌ１ＭＩＢ−ＩＤおよびＩＩＤにかかる通知を行なわないようになっている。
【００６３】
図１６は本ＣＰＵ１におけるマルチスレッド制御部１１への報告手法を説明するための図である。
フェッチキュー２８において先頭の（一番古い）デマンド要求（便宜上、デマンド要求Ａという）に対してＬ１データキャッシュ１９上で割り当てられたキャッシュラインが、プログラム順序上ではデマンド要求Ａよりも後続するデマンド要求もしくはＬ１プリフェッチ要求であって、デマンド要求Ａよりも先にＬ１キャッシュミスが生じＬ１ＭＩＢ２６が確保されてＬ２キャッシュ２０に発行されたもの（以下、要求Ｂとする）に割り当てられたキャッシュラインと同一（図１６の例ではキャッシュラインＸ）であり、その要求ＢにかかるＬ１ＭＩＢ２６にＬ２ミスフラグがセットされている状態を考える。
【００６４】
このような状態において、Ｌ１データキャッシュ制御部２４は、Ｌ１ＭＩＢ２６に登録されているスレッド識別子およびＩＩＤに代えて、デマンド要求Ａにかかるスレッド識別子およびＩＩＤを要求ＢのＬ１ＭＩＢ−ＩＤ とともに、スレッド制御部１１に通知するようになっている。
すなわち、先にＬ１ＭＩＢ２６を確保したものがデマンド要求の場合には、マルチスレッド制御部１１に対し、同じＬ１ＭＩＢ−ＩＤに対して異なるＩＩＤで２回Ｌ２キャッシュミスしたと報告することになる。後述するように、Ｌ２キャッシュミスによるスレッドの切り替えは、キャッシュミスした要求のうちプログラム順で一番古い命令が、次に完了するべき状態になったときに起こすので、フェッチキュー２８のなかで一番古い要求を優先させて報告するのである。
【００６５】
これらの方式により、先行して出したＬ１プリフェッチ、またはプログラム順序では後のデマンド要求が、アウトオブオーダ処理のために先に発行されてキャッシュラインがぶつかって、Ｌ２キャッシュ２０に発行されない場合も、一番古いフェッチキュー２８の要求が他のＬ２キャッシュミス処理を待つことになることを検出し、マルチスレッド制御部１１に報告する。
【００６６】
マルチスレッド制御部１１においては、フェッチキュー２８において先頭のデマンド要求ＡでＬ２キャッシュミスが生じたとみなして、スレッド切り替えを行なう。これにより、要求Ｂにかかるデータ応答待ちの時間を他のスレッドの処理に回すことができるのである。
すなわち、Ｌ１データキャッシュ制御部２４は、先行するデマンド要求、もしくはL1プリフェッチ要求のL1キャッシュミスでL１データキャッシュ１９までデータ応答を待つ間、後続のデマンド要求、もしくはL1プリフェッチ要求でL1データキャッシュ１９の同一キャッシュラインでキャッシュミスした場合に限り、L2キャッシュ２０への要求を出せないＬ１キャッシュ制御部２４において、後続のデマンド要求がプログラム順で最も古いキャッシュ要求である場合、且つ先行するL2キャッシュ要求がL2キャッシュミスを起こしている場合、後続のデマンド要求がL2キャッシュミス処理を待つと判断して、スレッド識別子と命令識別子に、先行する同一キャッシュラインの要求のキャッシュ要求識別子を、マルチスレッド制御部１１に報告するのである。
【００６７】
図１７は本ＣＰＵ１のマルチスレッド制御部１１におけるＬ２キャッシュミス情報バッファの例を示す図である。
本ＣＰＵ１においては、マルチスレッド制御部１１は、図１７に示すようなＬ２キャッシュミス情報バッファ２９をＬ１ＭＩＢ２６の数と同数（図１７に示す例においては、Ｌ１ＭＩＢ０〜Ｌ１ＭＩＢ３の４つ）そなえて構成されている。Ｌ２キャッシュミス情報バッファ２９は、Ｌ２キャッシュミスが生じたことを示すフラグ（Ｌ２ＭＩＳＳ）と、そのスレッドＩＤとＩＩＤとをＬ１ＭＩＢ２６に関連付けて登録することにより構成されている。すなわち、Ｌ２キャッシュミス情報バッファ２９は、Ｌ２キャッシュミスしたことを報告されたＩＩＤを保持するバッファであって、Ｌ１ＭＩＢの数だけそなえられたものである。
【００６８】
マルチスレッド制御部１１においては、Ｌ１データキャッシュ制御部２４からＩＩＤと同時に送られてくるＬ１ＭＩＢ−ＩＤを解読して、対応するＬ２キャッシュミス情報バッファにＩＩＤを書き込み、かつＬ２キャッシュミスのフラグをセットするようになっている。又、同じＬ１ＭＩＢに対して複数回報告があった場合は、常に上書きするようにしている。
【００６９】
なお、Ｌ２キャッシュミス情報バッファ２９は、以下の式（１），（２）で表わされる論理でセットされる。
SET - MIB(N) - L2MISS = L2MISS & MIB - ID - EQ - N  ・・・（１）
RESET - MIB(N) - L2MISS
= (L2MISS - DATA - RETURN & MIB - ID - EQ - N) or CANCEL  ・・・（２）
なお、ＮはＬ１ＭＩＢ−ＩＤ（Ｌ１ＭＩＢの番号）である。
【００７０】
図１８は本ＣＰＵ１におけるＬ２キャッシュへのデータ応答時の処理を示す図である。Ｌ２キャッシュミスした命令（要求）のデータが、メインメモリ２１から応答されたときには、Ｌ２キャッシュ制御部２５からＬ２キャッシュミスデータの応答を示すフラグ（Ｌ２ミスデータリターン）と、これに対応する要求識別子Ｌ１ＭＩＢ−ＩＤ（Ｌ１ＭＩＢ番号）とがＬ１データキャッシュ制御部２４に送信される。Ｌ１データキャッシュ制御部２４はその信号をそのままスルーでマルチスレッド制御部１１に送信する。
【００７１】
マルチスレッド制御部１１は、この信号を受け付けると、対応するＬ２キャッシュミス情報バッファ２９にあるＬ２キャッシュミスのフラグをリセットする。
また、分岐予測ミスやトラップ処理などに入って、Ｌ２キャッシュミスしたリクエストがキャンセルされる場合には、キャンセルされたリクエストでスレッドの切り替え処理を行なわない。そのためＬ２キャッシュミス情報バッファ（Ｌ１ＭＩＢスレッド切り替え制御バッファ）２９のＬ２キャッシュミスフラグがすでにオン状態の場合はこれをリセットする。またＬ１キャッシュ部では、キャンセルを受け付けた後、それまでに受け付けたキャッシュミスをキャッシュ要求のＬ２キャッシュミスをマルチスレッド制御部１１に報告しないようにしている。
【００７２】
図１９は本ＣＰＵ１におけるＬ２キャッシュミスによるスレッド切り替え手法を説明するための図である。
マルチスレッド制御部１１は、図１９に示すように、命令完了（コミット）の制御部の次にコミットするべき命令のＩＩＤを監視し、Ｌ２キャッシュミス情報バッファ２９のＬ２キャッシュミスフラグがオン、かつバッファ内に保持しているＩＩＤと一致したときに、走行中のスレッドから他のスレッドに切り替えるようになっている。
【００７３】
すなわち、マルチスレッド制御部１１は、次に命令完了すべき命令に関してキャッシュミスが生じた場合に、スレッドの切り替えを行なうのである。
また、このとき、スレッド切り替えトリガーとなったＬ１ＭＩＢ２６のキャッシュ要求であることを示すフラグをＭＩＢスレッド切り替え制御バッファにセットする。又、この切り替えトリガーとなったことを示すフラグは、スレッドが復帰したときにリセットする。
【００７４】
図２０は本ＣＰＵ１におけるマルチスレッド制御部１１によるスレッド切り替え手法を示す概念図である。この図２０に示すように、Ｌ２キャッシュ制御部２５からミスデータリターンかつＭＩＢ−ＩＤを受け付けたときに、切り替えトリガーフラグがオンであれば、キャッシュミスした命令の処理を再開できるものとしてスレッドを切り替え、Ｌ２キャッシュミス情報バッファ２９の持つスレッドＩＤのスレッドを復帰させる。
【００７５】
図２１は本ＣＰＵ１におけるスレッド切り替えのタイミングを示す図、図２２は本ＣＰＵ１におけるスレッド再開時の処理を示す図である。
図２１に示すように、本発明の一実施形態としてのＣＰＵ１によれば、ＶＭＴ方式において、命令Ａ，ＢがスレッドXの命令であったとして、命令Ｂのキャッシュミスが発生してもスレッドXを切り替えずに、その前の命令Ａがキャッシュミスしてメインメモリ２１へのメモリアクセスを開始するのを待って切り替えることにより、その後スレッドXを再開したときに命令Ａ，Ｂのデータをメモリから持ってくる処理に対して隠蔽効果が得られる。
【００７６】
なお、図２２に示すように、スレッドの復帰後は、Ｌ１データキャッシュ１９内に既にデータがある場合は、Ｌ１キャッシュヒットとして命令は処理される。
またＬ１データキャッシュ１９でのＬ１ＭＩＢ２６が確保できずに、フェッチキュー２８のプログラム順で一番古い要求となって切り替わっていた場合は、同一のキャッシュラインでＬ１ＭＩＢ２６を確保していた命令が完了したことの報告となっているので、スレッドの復帰後にＬ１ＭＩＢ２６を確保してＬ２キャッシュ２０に要求を出すことができることになる。
【００７７】
データ応答の報告は、スレッドがすでに復帰している場合は、切り替えトリガーフラグがリセットされており、データリターンを示す信号は無視されるようになっている。
さて、ＶＭＴ方式においては、並列的に実行するスレッドの組み合わせにより処理時間にばらつきが発生してしまう場合がある。例えば、２つのスレッドを走行させる場合に、組み合わせとして、両スレッドが同種（つまり、キャッシュミスするスレッド同士やキャッシュミスしないスレッド同士）のものである場合や、異なる性質のキャッシュミスするスレッドとキャッシュミスしないスレッド等のパターンが考えられる。
【００７８】
キャッシュミスするもの同士、もしくはしないもの同士の場合には、両スレッドが同じように切り替えを行なうのでスレッド処理のばらつきが生じにくいが、例えば、一方がキャッシュミスして他方がキャッシュミスしない組み合わせの場合には、キャッシュミスするスレッドはすぐ休止状態に移り、キャッシュミスしない方のスレッドは一定時間目一杯走行することになる。
【００７９】
また、キャッシュミスしたデータの応答があって、キャッシュミス後の処理を再開できる場合においても、キャッシュミスしないスレッドから切り替わるまでの間、処理を待つ必要があるので、キャッシュミスするスレッドの処理時間が大きく延びてしまう。
本発明の一実施形態としてのマルチスレッドプロセッサ（ＣＰＵ１）においては、スレッド切り替えの要因になったキャッシュ要求が、メインメモリ２１からの応答により処理を再開できるとしてスレッドを復帰させることで、キャッシュミスしないパターンのプログラムとのキャッシュミスするプログラムとの組み合わせであっても、キャッシュミスするプログラムの処理時間が大きく延びることを緩和できる。
【００８０】
本ＣＰＵ１においては、デマンド要求だけでなくプリフェッチ要求も扱うようになっているが、スレッドの切り替え要因となるキャッシュミスの報告を、必ずしもすべてのキャッシュミスを報告するのではなく、キャッシュミスの要因によって選択して報告することにより、効果的にスレッドの切り替えを行なうことができる。
そして、キャッシュミスが、必ずしもプログラム命令順に行なわれずに処理を行ない、プリフェッチ処理を備え、ストア命令の突き放し処理を行なうマルチスレッドプロセッサにおいて、メインメモリ２１へのデータ応答処理に起因する命令実行及び完了を阻害することの隠蔽を、スレッド切り替えによって効果的に行なうことができる。
【００８１】
そして、本発明は上述した実施形態に限定されるものではなく、本発明の趣旨を逸脱しない範囲で種々変形して実施することができる。
例えば、上述した実施形態においては、１次キャッシュ（Ｌ１命令キャッシュ１８，Ｌ１データキャッシュ１９）と２次キャッシュ（Ｌ２キャッシュ２０）とからなる２階層のキャッシュ（キャッシュ）をそなえたＣＰＵ１について説明しているが、これに限定されるものではなく、３次（３階層）以上のキャッシュをそなえてもよい。
【００８２】
また、上述した実施形態においては、メインメモリ２１とＣＰＵ１とは、ＣＰＵ１の内部バス（図示省略）に比較してデータ転送速度が遅いバス２２を介して接続されており、このバス２２の内側（ＣＰＵ１側）であって、このバス２２を介してメインメモリ２１に接続されているＬ２キャッシュ２０が最下位階層のキャッシュとして認定されている。従って、例えば、ＣＰＵ１の内部バスと遜色の無いデータ転送速度を有する通信手段を介して他の記憶装置（メモリ）が接続されている場合には、その記憶装置についても階層的にそなえられたキャッシュとして含めてもよい。
【００８３】
そして、ＣＰＵ１の内部バスと比較してデータ転送速度が大きく落ちる通信手段（バス等）を介して接続される記憶装置が外部記憶部として扱われるのである。
なお、本発明の各実施形態が開示されていれば、本発明を当業者によって実施・製造することが可能である。
そして、本発明は、以下に示すように要約することができる。
【００８４】
（付記１）  １以上の命令をそれぞれそなえた複数のスレッドを、１以上の演算器により並列的に実行可能なマルチスレッドプロセッサであって、
該演算器により処理を実行する該スレッドを選択的に切り替えるとともに、該命令が前記複数のスレッドのうちいずれの該スレッドに属するものであるかを示すスレッド識別子を設定するマルチスレッド制御部と、
該スレッド上の該命令に対して当該命令を特定する命令識別子を設定する命令制御部と、
データを一時的に保持可能であり階層的にそなえられた複数のキャッシュと、
前記複数のキャッシュへの該データの書き込み・読み出しを管理するキャッシュ制御部とをそなえ、
前記複数のキャッシュのうち最下位階層の該キャッシュにおいて該命令にかかる要求についてキャッシュミスが生じた際に、当該キャッシュミスにかかる該要求に関して、該キャッシュ制御部が、当該命令にかかる該命令識別子および該スレッド識別子を該マルチスレッド制御部に通知し、
該マルチスレッド制御部が、該キャッシュ制御部から通知された該命令識別子および該スレッド識別子に基づいて、該演算器により実行中の該スレッドを他のスレッドに切り替えることを特徴とする、マルチスレッドプロセッサ。
【００８５】
（付記２）  該キャッシュ制御部が、
前記複数のキャッシュのうちキャッシュミスが生じた上位階層の該キャッシュから下位階層の該キャッシュに対して当該キャッシュミスにかかる要求を出す際に、該要求に対する前記下位階層のキャッシュからのデータ応答を格納する格納領域を確保して、当該格納領域を特定するためのキャッシュ要求識別子を設定するとともに、
該命令が、前記スレッド上の命令であり、該演算器が演算処理を行なうために該データを格納するレジスタと当該マルチスレッドプロセッサ外部の外部記憶部との間において該データの授受を生じるデマンド要求である場合には、当該命令にかかる該スレッド識別子と該キャッシュ要求識別子と該命令識別子とを該マルチスレッド制御部に対して通知することを特徴とする、付記１記載のマルチスレッドプロセッサ。
【００８６】
（付記３）  該キャッシュ制御部が、
該命令が、予め該外部記憶部から取得した該データを該レジスタに格納するプリフェッチ要求である場合に、前記マルチスレッド制御部に対して当該命令にかかる該スレッド識別子，該キャッシュ要求識別子および該命令識別子の通知を行なわないことを特徴とする、付記２記載のマルチスレッドプロセッサ。
【００８７】
（付記４）  該キャッシュ制御部が、
該プリフェッチ要求が該外部記憶部に発行されてからの経過時間を監視し、該命令によってアクセスされる該データが、先行するプリフェッチ要求によって該外部記憶部から取得された該データと一致するとともに、該経過時間が所定時間以上経過した場合に、前記マルチスレッド制御部に対して当該命令にかかる該スレッド識別子，該キャッシュ要求識別子および該命令識別子の通知を行なわないことを特徴とする、付記２又は付記３記載のマルチスレッドプロセッサ。
【００８８】
（付記５）  フェッチにかかる該命令の命令完了予定順序を管理するフェッチ順序管理部をそなえ、
該キャッシュ制御部が、
該フェッチ順序管理部における該命令完了予定順序が先頭の該デマンド要求に対して前記上位階層のキャッシュ上で割り当てられたキャッシュラインが、該スレッド上の順番は該デマンド要求よりも後続するものであって、該デマンド要求よりも先に該キャッシュミスが生じており該格納領域が確保されている該命令に対して前記上位階層のキャッシュ上で割り当てられたキャッシュラインと同一である場合に、
該デマンド要求にかかるスレッド識別子および命令識別子を該命令の該キャッシュ要求識別子とともに、該スレッド制御部に通知することを特徴とする、付記２〜付記４のいずれか１項に記載のマルチスレッドプロセッサ。
【００８９】
（付記６）  少なくとも、該キャッシュミスが生じた旨を示す情報，当該キャッシュミスにかかる該キャッシュ要求識別子，当該要求にかかるスレッド識別子および該命令識別子を相互に関連付けて登録可能なキャッシュミス情報格納部をそなえ、
該マルチスレッド制御部が、該キャッシュミス情報格納部に格納された情報に基づいて、該キャッシュミスに関する情報を取得することを特徴とする、付記２〜付記４のいずれか１項に記載のマルチスレッドプロセッサ。
【００９０】
（付記７）  少なくとも、該キャッシュミスが生じた旨を示す情報，当該キャッシュミスにかかる該キャッシュ要求識別子，当該要求にかかるスレッド識別子および該命令識別子を相互に関連付けて登録可能なキャッシュミス情報格納部をそなえ、
該マルチスレッド制御部が、該キャッシュミス情報格納部に格納された情報に基づいて、該キャッシュミスに関する情報を取得することを特徴とする、付記５記載のマルチスレッドプロセッサ。
【００９１】
（付記８）  該キャッシュミスの発生に伴って下位階層の該キャッシュもしくは該外部記憶部に出した要求に対する応答データを一時的に格納可能なムーブ・イン・バッファを
特定するための情報を、該キャッシュ要求識別子として用いることを特徴とする、付記７記載のマルチスレッドプロセッサ。
（付記９）  該キャッシュ制御部が、
該キャッシュミス情報格納部に、少なくとも、該キャッシュミスが生じた旨を示す情報，該キャッシュ要求識別子，当該命令にかかるスレッド識別子および該命令識別子がそれぞれ格納された後に、該命令に対するデータ応答が該外部記憶部から行なわれる際に、該データ応答を示す情報と当該データ応答にかかる該キャッシュ要求識別子とを該マルチスレッド制御部に通知するとともに、該キャッシュミス情報格納部における該当する前記キャッシュミスが生じた旨を示す情報をリセットすることを特徴とする、付記７又は付記８記載のマルチスレッドプロセッサ。
【００９２】
（付記１０）  該キャッシュミス情報格納部が、少なくとも、該キャッシュミスが生じた旨を示す情報，当該要求にかかるスレッド識別子および該命令識別子を相互に関連付けて登録可能であり、該ムーブ・イン・バッファ毎にそれぞれそなえられたキャッシュミス情報バッファとして構成されることを特徴とする、付記８又は付記９記載のマルチスレッドプロセッサ。
【００９３】
（付記１１）  該マルチスレッド制御部が、
該キャッシュミス情報格納部において、前記キャッシュミスが生じた旨を示す情報が登録されるとともに、そのキャッシュ要求にかかる該命令識別子および該スレッド識別子が、該フェッチ順序管理部において管理される該命令完了予定順序が先頭の命令にかかる命令識別子およびスレッド識別子と一致した時に、該スレッドを切り替えることを特徴とする、付記７〜付記１０のいずれか１項に記載のマルチスレッドプロセッサ。
【００９４】
（付記１２）  該マルチスレッド制御部が、
実行中で未完了の該命令をキャンセルするときに該キャッシュミスが生じた場合に、該キャッシュミス情報格納部における該当するキャッシュ要求に対する前記キャッシュミスが生じた旨を示す情報をリセットすることを特徴とする、付記７〜付記１１のいずれか１項に記載のマルチスレッドプロセッサ。
【００９５】
（付記１３）  該キャッシュミス情報格納部が、該スレッドの切り替えの要因となった該キャッシュミスが生じた該要求に対して、該スレッドが休止状態に遷移する要因となったことを示す情報を格納することを特徴とする、付記７〜付記１２のいずれか１項に記載のマルチスレッドプロセッサ。
（付記１４）  該スレッドが切り替わって復帰したときに、該キャッシュミス情報格納部における前記スレッドが休止状態に遷移する要因となったことを示す情報をリセットすることを特徴とする、付記１３記載のマルチスレッドプロセッサ。
【００９６】
（付記１５）  該キャッシュ制御部が、該キャッシュミスにかかるデータ応答が行なわれた際に、当該データ応答を示す信号とそのキャッシュ要求識別子とをマルチスレッド制御部に報告し、
該マルチスレッド制御部が、該キャッシュミス情報格納部において、前記スレッドが休止状態に遷移する要因となったことを示す情報が格納されている場合に、該スレッドを切り替えて復帰させることを特徴とする、付記１３又は付記１４記載のマルチスレッドプロセッサ。
【００９７】
（付記１６）  該命令がストア命令である場合に、そのストア対象のアドレスがキャッシュミスした場合には、
該命令制御部が、前記ストア対象のアドレスにかかるデータ応答を待たずにストア命令を完了したものとして扱う突き放し制御を行なうとともに、
該キャッシュ制御部が、該マルチスレッド制御部に対して、当該ストア命令についてのキャッシュミスにかかる通知を行なわないことを特徴とする、付記１〜付記１５のいずれか１項に記載のマルチスレッドプロセッサ。
【００９８】
（付記１７）  該キャッシュ制御部が、
実行中で未完了の該命令をキャンセルするに際して、当該命令に関して該キャッシュミスが生じた場合においても、該キャッシュミスが生じたこと，該キャッシュ要求識別子，該スレッド識別子および該命令識別子のマルチスレッド制御部への通知を行なわないことを特徴とする、付記１〜付記１６のいずれか１項に記載のマルチスレッドプロセッサ。
【００９９】
（付記１８）  該キャッシュ制御部が、前記複数のキャッシュに対応してそれぞれそなえられることを特徴とする、付記１〜付記１７のいずれか１項に記載のマルチスレッドプロセッサ。
（付記１９）  複数のスレッドを１以上の演算器により並列的に実行可能なマルチスレッドプロセッサにおけるスレッド切り替え制御方法であって、
命令が前記複数のスレッドのうちいずれの該スレッドに属するものであるかを示すスレッド識別子を設定するスレッド識別子設定ステップと、
該スレッド上の該命令に対して当該命令を特定する命令識別子を設定する命令識別子設定ステップと、
データを一時的に保持可能であり階層的にそなえられた複数のキャッシュへの該データの書き込み・読み出しを管理するキャッシュ制御ステップと、
前記複数のキャッシュのうち最下位階層の該キャッシュにおいて該命令にかかる要求についてキャッシュミスが生じた際に、当該キャッシュミスにかかる該要求に関して、当該要求にかかる該命令識別子および該スレッド識別子に基づいて、該演算器により実行中の該スレッドを他のスレッドに切り替える切り替えステップとをそなえることを特徴とする、スレッド切り替え制御方法。
【図面の簡単な説明】
【０１００】
【図１】本発明の一実施形態としてのマルチスレッドプロセッサの構成を示すブロック図である。
【図２】本発明の一実施形態としてのマルチスレッドプロセッサにおけるＩＩＤの設定手法を説明するための図である。
【図３】アウトオブオーダ方式のパイプラインを模式的に示す図である。
【図４】本発明の一実施形態としてのマルチスレッドプロセッサにおける命令制御部，Ｌ１キャッシュ制御部およびＬ２キャッシュ制御部間において授受される制御信号を説明するための図である。
【図５】本発明の一実施形態としてのマルチスレッドプロセッサにおいてロード命令に対してＬ１キャッシュヒットしたケースにかかるデータの流れを示す図である。
【図６】本発明の一実施形態としてのマルチスレッドプロセッサにおいてロード命令に対してＬ１キャッシュミスが生じ且つＬ２キャッシュヒットしたケースにかかるデータの流れを示す図である。
【図７】本発明の一実施形態としてのマルチスレッドプロセッサにおいてロード命令に対してＬ１キャッシュミスおよびＬ２キャッシュミスが生じたケースにかかるデータの流れを示す図である。
【図８】Ｌ１プリフェッチ処理を説明するための図である。
【図９】Ｌ２プリフェッチ処理を説明するための図である。
【図１０】本ＣＰＵにおける命令制御部のキャンセル時のキャンセル範囲のイメージを示す図である。
【図１１】本発明の一実施形態としてのマルチスレッドプロセッサにおけるキャンセル時の処理を説明するための図である。
【図１２】本発明の一実施形態としてのマルチスレッドプロセッサにおけるマルチスレッド制御部からＬ１データキャッシュ制御部やＬ２キャッシュ制御部へのマルチスレッド制御用信号の流れを示す図である。
【図１３】本発明の一実施形態としてのマルチスレッドプロセッサにおけるＬ２キャッシュミス時のマルチスレッド制御部への報告手法を説明するための図である。
【図１４】本発明の一実施形態としてのマルチスレッドプロセッサにおけるストア命令の突き放し制御を説明するためのパイプライン図である。
【図１５】本発明の一実施形態としてのマルチスレッドプロセッサにおけるＬ２キャッシュミス時における処理を説明するための図である。
【図１６】本発明の一実施形態としてのマルチスレッドプロセッサにおけるマルチスレッド制御部への報告手法を説明するための図である。
【図１７】本発明の一実施形態としてのマルチスレッドプロセッサのマルチスレッド制御部１１におけるＬ２キャッシュミス情報バッファの例を示す図である。
【図１８】本発明の一実施形態としてのマルチスレッドプロセッサにおけるＬ２キャッシュへのデータ応答時の処理を示す図である。
【図１９】本発明の一実施形態としてのマルチスレッドプロセッサにおけるＬ２キャッシュミスによるスレッド切り替え手法を説明するための図である。
【図２０】本発明の一実施形態としてのマルチスレッドプロセッサにおけるマルチスレッド制御部によるスレッド切り替え手法を示す概念図である。
【図２１】本発明の一実施形態としてのマルチスレッドプロセッサにおけるスレッド切り替えのタイミングを示す図である。
【図２２】本発明の一実施形態としてのマルチスレッドプロセッサにおけるスレッド再開時の処理を示す図である。
【図２３】インオーダ実行型の処理方法を説明するための図である。
【図２４】アウトオブオーダ実行型の処理方法を説明するための図である。
【図２５】（ａ），（ｂ）はマルチスレッドプロセッサ方式を説明するための図である。
【図２６】ＳＭＴ方式を説明するための図である。
【図２７】ＶＭＴ方式を説明するための図である。
【図２８】インオーダ方式におけるキャッシュミス時の処理を説明するための図である。
【図２９】アウトオブオーダ方式におけるキャッシュミス時の処理を説明するための図である。
【図３０】アウトオブオーダ方式における従来のスレッド切り替え手法を説明するための図である。
【符号の説明】
【０１０１】
１    ＣＰＵ（マルチスレッドプロセッサ）
１１    マルチスレッド制御部
１３    レジスタ
１６    命令制御部
１７    ＴＬＢ
１８    Ｌ１命令キャッシュ
１９    Ｌ１データキャッシュ
２０    Ｌ２キャッシュ
２１    メインメモリ
２２    バス
２３    Ｌ１命令キャッシュ制御部（キャッシュ制御部）
２４    Ｌ１データキャッシュ制御部（キャッシュ制御部）
２５    Ｌ２キャッシュ制御部（キャッシュ制御部）
２６    Ｌ１ＭＩＢ（格納領域）
２７    Ｌ２ＭＩＢ（格納領域）
２８    フェッチキュー（フェッチ順序管理部）
２９    Ｌ２キャッシュミス情報バッファ
１５０    実行部（演算器）
【図１】
2006040141.tif 000003
【図２】
2006040141.tif 000004
【図３】
2006040141.tif 000005
【図４】
2006040141.tif 000006
【図５】
2006040141.tif 000007
【図６】
2006040141.tif 000008
【図７】
2006040141.tif 000009
【図８】
2006040141.tif 000010
【図９】
2006040141.tif 000011
【図１０】
2006040141.tif 000012
【図１１】
2006040141.tif 000013
【図１２】
2006040141.tif 000014
【図１３】
2006040141.tif 000015
【図１４】
2006040141.tif 000016
【図１５】
2006040141.tif 000017
【図１６】
2006040141.tif 000018
【図１７】
2006040141.tif 000019
【図１８】
2006040141.tif 000020
【図１９】
2006040141.tif 000021
【図２０】
2006040141.tif 000022
【図２１】
2006040141.tif 000023
【図２２】
2006040141.tif 000024
【図２３】
2006040141.tif 000025
【図２４】
2006040141.tif 000026
【図２５】
2006040141.tif 000027
【図２６】
2006040141.tif 000028
【図２７】
2006040141.tif 000029
【図２８】
2006040141.tif 000030
【図２９】
2006040141.tif 000031
【図３０】
2006040141.tif 000032