(57)【要約】複数のスレッドを実行可能な処理装置において、命令を実行する実行部と、実行部に命令を供給する供給部と、供給部から供給される命令を保持するバッファ部と、バッファ部を管理する制御部とを備える。そして、バッファ部は、複数のバッファ要素の集合を含み、バッファ要素は、命令を格納するデータ部と、バッファ要素間の接続関係を定義するポインタ部とを含む。制御部は、ポインタ部で接続関係が定義された複数のバッファ要素の系列を処理装置で実行されるそれぞれのスレッドに割り当てるスレッド割り当て部を有する。
2008155834.tif 000002
【特許請求の範囲】
【請求項１】
複数の命令を有するスレッドに含まれる前記命令を実行する実行部と、
前記実行部に命令を供給する供給部と、
複数のエントリに命令を格納するデータ部と前記エントリに格納されている命令の次に実行すべき命令を指定するポインタ部を有し、前記供給部から供給される命令を保持するバッファ部と、
前記ポインタ部を制御して、前記命令の次に実行すべき命令を有するバッファ部に前記次に実行すべき命令が属するスレッドを割り当てるスレッド割り当て部により、前記バッファ部を制御する制御部とを有することを特徴とする処理装置。
【請求項２】
前記命令を格納する記憶部と、
前記記憶部の読み出しアドレスからの命令の読み出しと読み出された命令の前記バッファ部への格納を制御する命令フェッチ部と、
次に読み出すべき命令の読み出しアドレスを前記スレッドごとに保持するアドレス保持部と、
前記スレッドごとに設けられたアドレス保持部のうち選択されるべきスレッドを決定するフェッチスレッド決定部と、をさらに備える請求項１に記載の処理装置。
【請求項３】
前記アドレス保持部は、
分岐なしに後続命令を読み出す場合に後続命令の読み出しアドレスを保持する非分岐アドレス保持部と、
分岐命令の実行が予測された分岐先アドレスから後続命令を読み出す場合の読み出しアドレスを保持する分岐先アドレス保持部と、
分岐予測がはずれた場合に後続命令を読み出す場合の読み出しアドレスを保持する再読み出しアドレス保持部と、を有する請求項１または２に記載の処理装置。
【請求項４】
前記ポインタ部は、分岐なしに後続命令を実行する場合に後続命令を格納するバッファ部を示す非分岐方向ポインタ部と、分岐命令によって後続命令を実行する場合の分岐先後続命令を格納するバッファ要素を示す分岐方向ポインタ部とを有する請求項１から３のいずれかに記載の処理装置。
【請求項５】
前記フェッチスレッド決定部は、使用バッファ要素数の少ないスレッドを優先して選択する請求項２から４のいずれかに記載の処理装置。
【請求項６】
前記命令フェッチ部によってスレッドに含まれる命令が読み出された後の経過時間順に、複数のスレッド間の順序を管理するフェッチ順序管理部をさらに備え、
フェッチスレッド決定部は、前記経過時間の長いスレッドを選択されるべきスレッドに決定する請求項２から５のいずれかに記載の処理装置。
【請求項７】
前記フェッチ順序管理部は、実行中の複数のスレッドのスレッド識別情報を前記経過時間順に保持するスレッドレジスタと、
フェッチスレッド決定部によって決定されたスレッドのスレッド識別情報と前記それぞれのスレッドレジスタ内のスレッド識別情報との一致を判定する比較部と、
前記比較部によって、前記一致が判定されたスレッド識別情報を前記経過時間順の最後尾のスレッドレジスタに移動するとともに、前記最後尾に移動されたスレッド識別情報が移動前に保持されていたスレッドレジスタより後方のスレッドレジスタに保持されたスレッド識別情報をそれぞれ１つずつ前方に移動するシフト制御部と、を有する請求項６に記載の処理装置。
【請求項８】
前記処理装置において同時に処理可能なスレッド数が２に限定されており、
前記フェッチ順序管理部は、
２つのスレッドの使用バッファ数が同数か否かを判定する同数判定部と、
前回命令フェッチがされたスレッドの識別情報を保持する２値保持部と、
前記２つのスレッドの使用バッファ要素数が同数の場合に、前記２値保持部の情報を反転する反転部と、を有する請求項６に記載の処理装置。
【請求項９】
前記フェッチスレッド決定部は、分岐予測が失敗したことにより実行停止中にあって命令フェッチができないスレッドと、スレッドに対応する処理においてキャッシュへのアクセスが停滞中のスレッドとを除外する除外部を有する請求項２から８のいずれかに記載の処理装置。
【請求項１０】
前記複数のバッファ要素の系列のうち、前記供給部によって実行部に命令が供給されるべき系列に該当する供給スレッドを決定する供給スレッド決定部をさらに備える請求項１から９のいずれかに記載の処理装置。
【請求項１１】
前記供給スレッド決定部は、使用バッファ要素数の多いスレッドを優先して供給スレッドに決定する請求項１０に記載の処理装置。
【請求項１２】
前記供給部によって実行部に命令が供給された後の経過時間順に、複数のスレッド間の順序を管理する供給順序管理部をさらに備え、
供給スレッド決定部は、前記経過時間の長いスレッドを前記供給スレッドに決定する請求項１０または１１に記載の処理装置。
【請求項１３】
前記供給順序管理部は、実行中の複数のスレッドのスレッド識別情報を前記経過時間順に保持するスレッドレジスタと、
前記供給スレッド決定部によって決定されたスレッドのスレッド識別情報と前記それぞれのスレッドレジスタ内のスレッド識別情報との一致を判定する比較部と、
前記比較回路によって、前記一致が判定されたスレッド識別情報を前記経過時間順の最後尾のスレッドレジスタに移動するとともに、前記最後尾に移動されたスレッド識別情報が移動前に保持されていたスレッドレジスタより後方のスレッドレジスタに保持されたスレッド識別情報をそれぞれ１つずつ前方に移動するシフト制御部と、を有する請求項１２に記載の処理装置。
【請求項１４】
前記処理装置において同時に処理可能なスレッド数が２に限定されており、
前記供給順序管理部は、
２つのスレッドの使用バッファ数が同数か否かを判定する同数判定部と、
命令が供給されたスレッドの識別情報を保持する２値保持部と、
前記２つのスレッドの使用バッファ要素数が同数の場合に、前記２値保持部の情報を反転する反転部と、を有する請求項１２に記載の処理装置。
【請求項１５】
命令供給中のスレッドの識別情報を保持するトレースレジスタと、
命令供給が待ち状態にあるスレッドの識別情報を保持するトレース待ちレジスタと、
前記トレースレジスタの保持する情報と前記トレース待ちレジスタの保持する情報とを入れ替える入れ替え部と、をさらに有する請求項１２から１４のいずれかに記載の処理装置。
【請求項１６】
前記トレース待ちレジスタは複数設けられ、
前記供給スレッド決定部によって決定されたスレッドの識別情報にしたがって、前記トレース待ちレジスタの１つが決定され、
前記入れ替え部は、前記トレースレジスタが保持する情報と前記決定されたトレース待ちレジスタが保持する情報とを入れ替える請求項１５に記載の処理装置。
【請求項１７】
前記制御部は、命令の保持が不要となったバッファ要素を解放する解放部を有する請求項１から１６のいずれかに記載の処理装置。
【請求項１８】
前記バッファ要素またはバッファ要素の系列に割り当てられているスレッドの識別情報を保持する識別情報保持をさらに備え、
前記解放部は、いずれかのスレッドに割り当てられたバッファ要素の系列に含まれるバッファ要素で未供給の命令を格納したバッファ要素を解放するキャンセル信号が発せられたときに、前記スレッドを識別する識別情報から解放すべきバッファ要素の選択信号を生成する選択部を有する、請求項１７に記載の処理装置。
【請求項１９】
前記バッファ要素の系列がループを形成しているときに、その系列のいずれかのバッファ要素を保持する起点レジスタをさらに備え、
前記解放部は、いずれかのスレッドに割り当てられたバッファ要素の系列に含まれるバッファ要素で未供給の命令を格納したバッファ要素を解放するキャンセル信号が発せられたときに、前記そのスレッドに対応する起点レジスタによって示されるバッファ要素を選択して解放する第１の解放処理部と、
前記解放されたバッファ要素と接続関係を定義されたバッファ要素を前記ポインタ部の指定にしたがって、順次解放する第２の解放処理部と、を有する請求項１７または１８に記載の処理装置。
【請求項２０】
前記バッファ要素の系列がループを形成しているときに、その系列のいずれかのバッファ要素を前記スレッドごとに保持する起点レジスタと、
分岐予測がなされた分岐先アドレス、または分岐予測がはずれて分岐予測の結果読み出された命令が無効とされた後に命令の読み出しを開始すべき読み出し開始先アドレスをスレッドごとに前記起点レジスタに設定する起点設定部と、
分岐予測部で分岐前のアドレスに対して予測された分岐予測先アドレスが前記起点レジスタで保持するアドレスと一致したときに、前記分岐前のアドレスにて読み出された命令を格納するバッファ要素の分岐方向ポインタ部に前記起点レジスタで保持するバッファ要素の識別情報を設定する分岐方向ポインタ設定部とをさらに備える請求項４から１９のいずれかに記載の処理装置。
【請求項２１】
複数の命令によって処理が構成され、互いに独立に実行可能な複数の処理のそれぞれがスレッドとして識別される処理装置であって、
前記命令を実行する実行部と、
前記命令の優先順を管理する順序管理部とを備え、
前順序管理部は、実行中の複数のスレッドのスレッド識別情報を優先順に保持するスレッドレジスタと、
前記所定の制御がなされたスレッドのスレッド識別情報と前記それぞれのスレッドレジスタ内のスレッド識別情報との一致を判定する比較部と、
前記比較部によって、前記一致が判定されたスレッド識別情報を前記優先順の最後尾のスレッドレジスタに移動するとともに、前記最後尾に移動されたスレッド識別情報が移動前に保持されていたスレッドレジスタより後方のスレッドレジスタに保持されたスレッド識別情報をそれぞれ１つずつ前方に移動するシフト制御部と、を有する処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置の制御技術、特に、命令処理技術に関するものである。
【背景技術】
【０００２】
パイプライン処理方式以降の高度な命令処理方式を採用した情報処理装置は、１つの命令実行の終了を待たずに、投機的に後続の命令の処理を行うことで性能の向上を図ってきた。もちろん、その命令実行に先立ち、命令供給(命令フェッチ)も投機的に行うことで性能向上を果たしてきた。ここで、投機的とは、例えば、後続の命令のフェッチアドレスが確定する前に所定の予測結果にしたがった分岐先アドレスから後続の命令をフェッチし、処理すること等をいう。【０００３】
命令バッファ方式では、投機的にフェッチされた命令はいったん命令バッファに保持される。そして、命令バッファは、命令を解釈実行する実行制御部に向けて命令を供給する。このような命令バッファを複数持つことで投機的フェッチを先まで進めることができる。しかし、情報処理装置の資源は無限ではないため、例えば、特許文献１に記載のような方式によって効率的に命令バッファを使用するよう努めてきた。
【特許文献１】日本国特許第３８４５０４３号公報
【特許文献２】日本国特許第３６８３９６８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
プロセッサの命令処理において、マルチスレッドという手法がある。マルチスレッドとは、１つのプロセッサを用いて、あたかも複数のプロセッサが処理を行っているかのように見せる手法である。スレッドとはその複数の論理的なプロセッサのうちの１つの論理的なプロセッサの処理を指す。あるいは、プロセッサから見ると、プロセッサが実行すべき複数の命令からなる処理のうち、それぞれ独立に実行可能な処理としてプロセッサに引き渡される命令の系統をスレッドとすることができる。【０００５】
例えば、あるスレッドの処理を行っているときにキャッシュミスが発生したとする。キャッシュミスが発生したプロセッサではメモリリード要求を送出し、他プロセッサあるいはメモリからデータを取り寄せることとなる。その期間、そのスレッドにおいては演算器が不要となるので、代わりに別のスレッドの処理を行わせて演算器を有効活用することができる。またキャッシュミスがない状態でも通常、複数種類用意される演算器は、それらすべてが常時稼働している訳ではない。そのため、全く依存関係のないスレッドを走行させ、使用されていない演算器を有効活用することもできる。【０００６】
そのようなマルチスレッド技術のうち、Ｓｉｍｕｌｔａｎｅｏｕｓ  ＭｕｌｔｉＴｈｒｅａｄ（ＳＭＴ）と呼ばれる方法では、命令処理のパイプラインを単数もしくは複数持って、複数スレッドの命令列を交互もしくは同時に投入し、演算器を共有して処理を行う。よって、ある時間に演算器で実行されているスレッドが複数あり、演算器に命令供給するための装置内でも、複数のスレッドが存在することになる。この技術では、いかに効率よく資源を複数のスレッドに対して分配するかが、コストを抑えつつ性能向上を図るための鍵となる。【０００７】
命令を解釈実行する実行制御部に命令を供給する命令バッファについても、当然この間題、すなわち、いかに効率よく複数のスレッドに命令バッファを分配するかという問題が存在することになる。これまでの命令バッファは、ある時間においては１つのスレッドの命令のみを保持していればよかった。しかし、ＳＭＴに対応するためには同時に複数のスレッドの命令列を命令バッファに保持し、演算器に供給していく必要がある。【０００８】
これを解決するにあたり、上記日本国特許３８４５０４３号で提案されたような装置をスレッドの数の分だけ並べるということがまず考えられる。例えば、スレッド数が２である場合に、各スレッドの命令バッファを４個として、合計８の命令バッファを有する装置を作ればよい。【０００９】
この場合、命令バッファの数としては合計８個となる。しかし、例えば、一方のスレッドにおいてキャッシュミスが発生した場合、データが取得されるまでの間は命令フェッチ要求を出すことは無意味である。なぜなら、そのキャッシュミスが命令キャッシュミスであったならば、それ以降の命令フェッチを要求してももちろん命令列は得られない。またデータキャッシュミスであったならば、やはりそのデータが取得されるまで以降の命令処理は進まないため、命令フェッチで命令列を取得していたとしても、ただ命令バッファ上で長時間待たせるだけとなる。そこで、そのような間は当該スレッドの命令フェッチ要求を止めて、もう一方のスレッドで命令フェッチを優先させるのがよい。しかし、キャッシュミスの発生したスレッドでは、命令フェッチを止めているので命令バッファが余っている。一方、別の優先させたいスレッドでは命令バッファ資源をすでに使いきっていて、フェッチを行うことができない、というような事態も大いに発生しうる。【００１０】
効率よく資源を使用して性能向上を図ることが目的のＳＭＴにおいて、このような無駄な資源の使用方法を採用することは得策とはいえない。さらに、命令バッファは実装上、非常に大きな面積を必要とするものである。性能を向上するためには各スレッドの命令バッファの数を増やすことが有効である。しかし、物量を増やすことによって、チップ面積が大きくなり、消費電力が増大し、故障率が上昇し、コストが増加する、など、たくさんのデメリットが発生する。したがって、効率よく資源を使用して命令バッファの数を抑え、実装面積を少なくする方向の努力をすべきである。【００１１】
以上をまとめると、
（１）従来例では、マルチスレッド時の命令バッファの割り当てを解決する手段が提示されていない。
（２）単純な拡張方法は、命令バッファのセットをスレッド数の分だけも持つことである。
（３）しかしそのような、システムの一部だけを考慮した手法によれば、ある時間において命令バッファが余剰となっているスレッドと、命令バッファが不足しているスレッドとが生じる可能性があり、効率の悪い結果となる。
（４）効率の悪い使い方で性能を出そうとすると、現在のコンピュータ業界において緊急の課題である、低消費電力化の実現とは逆の方向に向かうことになる。【００１２】
そこで、本発明の課題は、マルチスレッドを実現するシステムにおいて、それぞれのスレッドに無駄なく効率的に命令バッファを割り当てることができる技術を提供することにある。
【課題を解決するための手段】
【００１３】
本発明は前記課題を解決するために、以下の手段を採用した。本発明の一態様は、複数の命令によって処理が構成され、互いに独立に実行可能な複数の処理のそれぞれがスレッドとして識別される処理装置として構成される。本処理装置は、命令を実行する実行部と、実行部に命令を供給する供給部と、供給部から供給される命令を保持するバッファ部と、バッファ部を管理する制御部とを備える。そして、バッファ部は、複数のバッファ要素の集合を含み、バッファ要素は、命令を格納するデータ部と、バッファ要素間の接続関係を定義するポインタ部とを含む。このような構成において、制御部は、ポインタ部で接続関係が定義された複数のバッファ要素の系列を前記処理装置で実行されるそれぞれのスレッドに割り当てるスレッド割り当て部を有する。【００１４】
本処理装置によれば、命令を保持するバッファ要素は、ポインタ部で接続関係が定義され複数の系列を構成する。これらのバッファ要素の系列は、互いに独立に実行可能な複数の処理であるスレッドに割り当てられる。したがって、複数のスレッドを実行する処理装置において、重要な資源の１つであるバッファ要素が必要とされるスレッドに効果的、かつ、簡易に配分することができる。バッファ要素の系列は、ポインタで接続されているため、その割り当て、および解放を極めて柔軟に実現できる。その結果、複数のスレッドを実行する処理装置において、物理的に過剰にバッファ部を大きくすることなく、効率よくバッファ要素をそれぞれのスレッドに割り当てられる。
【発明の効果】
【００１５】
本発明では、命令バッファのセットはスレッドごとに持つのではなく、複数のスレッドで共用できる。これにより、命令バッファ資源のある限り、それらを有効にそれぞれのスレッドに使用することができる。
【図面の簡単な説明】
【００１６】
【図１】図１は命令バッファのセットをスレッド数の分だけも持つシステムの構成を示す図である。
【図２】図２は一実施形態によるシステムの構成図である。
【図３】図３は命令バッファのポインタチェーンの一例を示す図である。
【図４】図４は予め個々の命令バッファに振られた識別番号をポインタとして用いた場合のさらなるポインタについて示す図である。
【図５】図５は本処理装置の構成図である。
【図６】命令フェッチにおける制御の全体図である。
【図７】図７は命令フェッチ制御ユニットの詳細構造と命令フェッチ制御ユニット５に関連する回路の構成を示す図である。
【図８】図８は命令バッファの構造を示す図である。
【図９】図９は命令フェッチアドレス要求部の詳細を示す図である。
【図１０Ａ】図１０Ａは有効スレッド識別信号（ＴＨｊ＿ＶＡＬＩＤ）の生成回路を示す図である。
【図１０Ｂ】図１０Ｂは使用中の命令バッファの数にしたがってスレッドを選択する場合の概念を示す図である。
【図１０Ｃ】図１０Ｃはスレッド選択後の経過時間によるスレッド優先度決定するレジスタ列の概念を示す図である。
【図１０Ｄ】図１０Ｄはスレッド選択によってスレッドの優先順位を変更する処理例を示す図である。
【図１０Ｅ】図１０Ｅはスレッド選択後の経過時間によるスレッド優先度決定回路を示す図である。
【図１０Ｆ】図１０Ｆは最優先される第１プライオリティのスレッドが決定されたときにオンになる回路を示す図である。
【図１０Ｇ】図１０Ｇは第２プライオリティのスレッドが決定されたときにオンになる回路を示す図である。
【図１０Ｈ】図１０Ｈはラストプライオリティのスレッドが決定されたときにオンになる回路を示す図である。
【図１０Ｉ】図１０Ｉは図１０Ｆから図１０Ｈで示した回路の出力信号によって、決定される最も高い優先度のスレッドが決定されたときに、そのスレッド番号を出力する回路を示す図である。
【図１０Ｊ】図１０Ｊはスレッド数が２つの場合に利用なスレッド選択回路の例を示す図である。
【図１１Ａ】図１１Ａはスレッド用命令フェッチアドレス保持部およびスレッド２用命令フェッチアドレス保持部からセレクタおよびデコーダを介して親の命令バッファを選択する回路を示す図である。
【図１１Ｂ】図１１Ｂはシーケンシャル方向のポインタを設定する回路の例を示す図である。
【図１１Ｃ】図１１Ｃは分岐先方向のポインタを設定する回路の例を示す図である。
【図１２Ａ】図１２Ａはスレッド選択後の経過時間によるスレッド優先度決定回路を示す図である。
【図１２Ｂ】図１２Ｂは最優先される第１プライオリティのスレッドが決定されたときにオンになる回路を示す図である。
【図１２Ｃ】図１２は第２プライオリティのスレッドが決定されたときにオンになる回路を示す図である。
【図１２Ｄ】図１２Ｄはラストプライオリティのスレッドが決定されたときにオンになる回路を示す図である。
【図１２Ｅ】図１２Ｅは図１２Ａから図１２Ｄで示した回路の出力信号によって、決定される最も高い優先度のスレッドが決定されたときに、そのスレッド番号を出力する回路である。
【図１２Ｆ】図１２Ｆはスレッド数が２つの場合に利用なスレッド選択回路の例である。
【図１３】図１３は使用中の命令バッファ１の先頭のバッファエントリを指し示すさらなるポインタを生成する回路である。
【図１４】図１４は図１３のセレクタ６１への入力となるシーケンシャル方向のポインタおよび分岐先方向のポインタの選択回路である。
【図１５】図１５はスレッドごとに個別にさらなるポインタを生成し、セレクタで選択する回路を示す図である。
【図１６】図１６は命令供給されるスレッドに対するさらなるポインタを格納するレジスタを１つ専用で設け、スレッド間でさらなるポインタを入れ替える回路の構成例を示す図である。
【図１７Ａ】図１７Ａは命令バッファの投入から解放までのサイクルを示す図である。
【図１７Ｂ】図１７ＢはレジスタＲ＿ＳＴＲＥＡＭ＿ＩＤに保持されている命令バッファのバッファ番号をデコードする回路である。
【図１７Ｃ】図１７Ｃは特定のスレッド（例えば、スレッド番号ｊ）で使用される命令バッファ１を一括して解放するための信号を生成する回路の例を示す図である。
【図１７Ｄ】図１７Ｄはバッファのバリッドビットを生成する回路の例を示す図である。
【図１８Ａ】図１８Ａはキャンセルが発生したときからの処理を示すタイムチャートである。
【図１８Ｂ】図１８ＢはＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＴＨｊを起点にして命令バッファ１のチェーンを順次解放する回路を示す図（その１）である。
【図１８Ｃ】図１８ＣはＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＴＨｊを起点にして命令バッファ１のチェーンを順次解放する回路を示す図（その２）である。
【図１９】図１９は起点レジスタを適用させた命令フェッチ制御ユニットの構成を示す図である。
【図２０Ａ】図２０Ａはスレッド０用起点レジスタの構成を示す図である。
【図２０Ｂ】図２０Ｂはスレッド１用起点レジスタの構成を示す図である。
【図２１】図２１は起点レジスタのバリッドフラグＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＶＡＬＩＤを生成する回路を示す図である。
【図２２】図２２は起点レジスタのバッファ番号を保持するレジスタＳＴＡＲＴ＿ＩＢＲ＿ＩＤにバッファ番号を設定する回路を示す図である。
【図２３】図２２はショートループの概念図である。
【図２４】図２３はショートループを構成した例を示す図である。
【図２５】図２５は起点レジスタによる命令バッファの処理を示すタイムチャートである。
【図２６】図２６は命令バッファのループを示す概念図である。
【符号の説明】
【００１７】
１    命令バッファ
２    命令フェッチ要求部
３    分岐予測部
４    命令キャッシュ制御ユニット
５    命令フェッチ制御ユニット
６    命令供給制御部
７    命令デコーダ
８    命令バッファ制御部
９    命令フェッチアドレス選択部
１１    命令フェッチアドレス保持部
６１    セレクタ
６２    レジスタ
１２２    プログラムカウンタ
１２６    分岐リザベーションユニット
１３０    プロセス管理ユニット
【発明を実施するための最良の形態】
【００１８】
《実施形態の骨子》
以下、マルチスレッド方式のシステムにおいて、それぞれのスレッドに無駄なく効率的に命令バッファを割り当てることができる計算機システム（以下、単に処理装置という）の概要を示す。図１に、単純に、命令バッファのセットをスレッド数の分だけも持つシステムの構成を示す。以下、スレッド数が２である場合のマルチスレッドのシステムを例に説明する。【００１９】
図１において点線で囲まれた部分は、システムが有する命令バッファの全体を示している。この例では、スレッド１用の命令バッファ群と、スレッド２用の命令バッファ群とが設けられている。さらに、それぞれの命令バッファ群には、命令バッファ＃１から＃４が設けられている。なお、各命令バッファ群における命令バッファの数は、４個に限定される訳ではない。【００２０】
またさらに、各命令バッファ群内で、各命令バッファにポインタが設けられている。ポインタは、それぞれの命令バッファの命令が、命令実行部へ供給されたときに、次に供給すべき命令が格納されている命令バッファを示すために使用される。例えば、特許第３８４５０４３号公報に記載された命令フェッチ制御装置では、複数の命令バッファをポインタで動的に接続することによって、命令バッファの命令を効率的に命令実行部に供給する。それとともに、命令フェッチされ（命令フェッチは命令読出と同義；以下、読出のことをフェッチとして説明する場合がある）、命令実行部に供給される命令の系列として、複数の系列が存在した場合にも、命令バッファの使用効率低下を抑制している。ここで、複数の系列は、例えば、分岐命令によって分岐が発生した後に続く系列と、分岐することなく命令が実行された後に続く系列とによって形成される。【００２１】
しかしながら、図１の構成では、基本的には、マルチスレッドでの効率的な命令バッファの使用とはならないことがある。すなわち、スレッド１において多数の命令バッファが使用され、命令バッファ数が不足し、一方、スレッド２においては、命令バッファの使用が少なくなるような場合である。【００２２】
図２に、本実施形態によるシステムの構成を示す。この構成では、予めスレッドが固定された命令バッファ群という概念はない。すなわち、命令バッファが割り当てられるスレッドは、事前に固定されておらず、命令フェッチに際して、それぞれの命令バッファが割り当てられるスレッドが決定される。【００２３】
本実施形態の構成では、各命令バッファは、複数のエントリに命令語を保持するデータ部と、当該複数のエントリを有する命令バッファの次に供給使用されるべきエントリを有する命令バッファを指示するためのポインタ部から構成される。また、命令フェッチされたデータを格納するための命令バッファを指示する命令バッファ割り当て部（命令バッファ制御部ともいう）がスレッド間に共通で１つ設けられる。【００２４】
命令バッファ割り当て部は、どのスレッドの命令フェッチ要求かを気にすることなく、現在使用されていない命令バッファの中から単に１つの命令バッファを選択する。この場合の命令バッファの選択は、スレッドが１つのときと同様の手段を用いればよい。【００２５】
本実施形態のシステムでは、その命令バッファが選択されたときに、所属するスレッドが決まる。つまり、その命令バッファを使用するときの命令フェッチが、どのスレッドのものであるかによって、その命令バッファの所属するスレッドが決まる。システム内で、命令フェッチを起動する命令フェッチ要求部はスレッドごとに命令フェッチ要求を出す。【００２６】
命令バッファの割り当てルールは例えば、命令バッファに予め個別の番号を振っておき、現在空きの命令バッファの番号が小さい順番から割り当てるなどでもよい。空いているものを自由に使えばよい。また、例えば、現在空いている命令バッファをポインタで結合して空きリスト構造を形成しておいてもよい。空きリストの先頭から、命令バッファを使用するようにすればよい。【００２７】
各命令バッファのポインタ部は、同じスレッド内で、次に投入されるべき命令列を格納する命令バッファを指示するようにして次の命令バッファへの関連付けを行う。その関連付けは、例えば、命令バッファに予め個別の番号を振っておき、次の命令バッファの番号を指示する方法で実現することもできる。【００２８】
さらに、本処理装置は、分岐予測部を備える。そのため、当該命令バッファに格納される命令列に、分岐する分岐命令が存在するならば、ポインタ部は、同じスレッド内の予測分岐先命令列を格納する命令バッファを指示して命令列の命令バッファを関連付ける。【００２９】
つまり、命令フェッチ単位内に分岐命令がなく、シーケンシャルに命令が続いていくならば、同一スレッドでシーケンシャル方向に続く命令列を格納する命令バッファが指示される。なお、ここでは、分岐命令がない場合の命令の系列をシーケンシャル方向の系列と呼ぶことにする。【００３０】
分岐命令があれば、同一スレッドで分岐先命令フェッチの命令列を格納する命令バッファが指示される。ポインタ部は、当該命令バッファからシーケンシャル方向に続く命令バッファの指示と分岐方向で続く命令バッファの指示のために、一つのレジスタをもって、これらのどちらかの情報が格納されているようにしてもよいし、また、シーケンシャル専用のポインタを格納するレジスタ、分岐専用のポインタを格納するレジスタを別々に設けてもよい。【００３１】
このように、スレッドごとに命令バッファのポインタを関連付けていくことで、スレッドが混在することなく、ポインタチェーンを作ることができる。【００３２】
図３にその一例を示す。この例では、スレッド１とスレッド２の２つのポインタチェーンが構成されている。また、それぞれのスレッドにおいて、シーケンシャル方向を示す実線のポインタと、分岐方向を示す波線のポインタとが存在する。【００３３】
本処理装置では、命令バッファ間の関連付けはポインタによって行われる。また、命令フェッチの都度、命令バッファが割り当てられる。したがって、あるタイミングでの命令フェッチは、どのスレッドのものでも構わない。命令フェッチやその他の要素の都合で自由に命令フェッチを行うスレッドを選択することができる。【００３４】
また、命令フェッチ要求のアドレスは、特許第３８４５０４３号に示されるようなシーケンシャル方向の命令フェッチアドレスを保持するレジスタと、分岐予測先アドレスを保持するレジスタと、命令バッファのすべてが無効化された場合に命令フェッチを再開するための再命令フェッチアドレスを保持するレジスタとを用いて、それらから予め定められた優先度に応じて選択するようなことが考えられる。【００３５】
これらをマルチスレッドに対応させるために、それぞれのアドレス保持用のレジスタをスレッドごとに１セット用意する。再命令フェッチのアドレスは、同じスレッドに所属し、使用中のすべての命令バッファが無効化された場合に、命令フェッチを再開するためのアドレス、ということになる。【００３６】
以上のような命令フェッチするアドレスの選択指針としては、種々のものを考えることができる。例えば、予め定められた優先度によって、すべてのレジスタの中から１つのレジスタを選んで、その選択されたレジスタに格納されたアドレスで命令フェッチ要求を送出してもよい。また、例えば、スレッドごとに優先度を予め決めて、スレッドごとにレジスタを１つ選び、さらに別の手段を持ってどのスレッドの命令フェッチ要求を送出するかを決めて、命令フェッチ要求を送出することもできる。【００３７】
後者の場合、命令フェッチするスレッドの選択手法は、単純にラウンドロビンで、選択するスレッドを巡回させることがまず考えられる。命令バッファを少しでも効率よく使うため、別の要因でのスレッドごとの命令フェッチ制限がなければ、現在使用中の命令バッファの個数がより少ないスレッドを選択してもよい。そのような選択により、常にどのスレッドも平均的に使用されているようにする、ということが考えられる。別のレジスタの設定値によって、それらを選択してもよい。優先すべきスレッドをレジスタに設定しておけばよい。それらは、性能測定を行った結果で静的に設定してもよいし、動的に設定してもよい。例えば、例えば、命令フェッチ後の経過時間順（長く命令フェッチされていないスレッドを優先し、最近命令フェッチされたスレッドの優先度を低くする順）にフェッチするスレッドを決定してもよい。【００３８】
本実施形態では、このような命令フェッチための手段を提案する。そして、命令フェッチで得たデータを命令解釈実行する実行制御部に供給する際には、スレッドごとに前述の各命令バッファのポインタチェーンをトレースしていけばよい。ただし、命令フェッチ手段は、本実施形態の構成に限定される訳ではない。【００３９】
ポインタをトレースするための手段として、現在、命令供給のために使用しようとしている、または使用中の命令バッファを指し示す、さらなるポインタを準備することができる。該さらなるポインタによって、各命令バッファ自身が持つポインタをトレースしていく。該さらなるポインタの出力信号を用いて、命令バッファを選択し、実行制御部に命令を供給する。該さらなるポインタは、スレッドごとに準備してもよい。その際には、どちらのスレッドのポインタで選ばれたものを実際に投入するかは、別の機構によって選択する。図４に、予め個々の命令バッファに振られた識別番号をポインタとして用いた場合のさらなるポインタについて示す。【００４０】
この例では、スレッド１のさらなるポインタには、トレースされる命令バッファのポインタ（バッファ番号）が設定される。すると、さらなるポインタは、セレクト信号を出力し、スレッド１のセレクタを切り換え、読み出すべき命令バッファから、命令を出力させる。出力された命令は、命令実行部に引き渡される。【００４１】
また、該さらなるポインタは、投入することが決定されたスレッドの命令バッファを指し示すようにしてもよい。どのスレッドを投入するかは、別の機構によって予め選択しておく。【００４２】
その別の機構での命令実行部へ命令供給すべきスレッドの選択方法は、単純にラウンドロビンで順番にスレッド番号（スレッドを識別する情報であり、スレッド識別情報ともいう）を巡回することがまず考えられる。命令バッファを少しでも効率よく使うため、別の要因でのスレッドごとの命令供給制限がなければ、現在使用中の命令バッファの個数がより多いスレッドを選択して、常にどのスレッドも平均的に使用されているようにする、ということが考えられる。別のレジスタの設定値によって、それらを選択してもよい。それらは、性能測定を行った結果で静的に設定してもよいし、動的に設定してもよい。例えば、スレッドに属する命令実行後の経過時間順（長く命令が実行されていないスレッドを優先し、最近命令が実行されたスレッドの優先度を低くする順）に、命令供給するスレッドを決定してもよい。【００４３】
このように、別の機構で命令供給すべきスレッドを決定した場合は、その他のスレッドが現在どこまで投入されたかの情報を保持するレジスタを別途持つようにする。その保持するレジスタは、スレッドごとに固定で持ってもよいし、スレッドごとに固定せず、レジスタそのものにスレッド番号を持たせてもよい。次に投入することが決定したスレッドはこのレジスタにある現在までの投入情報を用いて、次に投入すべき命令バッファを確定し、該さらなるポインタにセットする。このようにして、スレッドごとにポインタチェーンをトレースしていくことができる。【００４４】
さらに、これらの命令バッファの付属タグとして、スレッドの番号を保持しておくことができる。分岐予測の失敗、あるいは、何らかの初期化要求、例えば、エラー処理等で、特定スレッドの使用中の命令バッファすべてが不要となったときには、このスレッド番号によって命令バッファを見分け、バッファを解放することができる。解放されたバッファは、どのスレッドが使用してもよい。【００４５】
さらに、特定スレッドの命令バッファの解放では、それぞれの命令バッファの間の関連付けを利用して、順番に行っていくという手順も考えられる。複数の命令バッファを同時に使用開始するようなことでもない限り、ポインタにしたがってトレースしつつ順番に解放していっても問題はない。解放されたバッファは、どのスレッドが使用してもよい。以上に述べたような構成をとることで数限りある命令バッファを効率よく使うことができる。【００４６】
また、特許第３８０４９４１号のようなショートループを構成したい場合には、ショートループの起点を保持する起点保持レジスタをスレッドごとに持つことで命令バッファでのショートループの構成と利用が可能となる。【００４７】
本起点レジスタを持つことで、起点となる命令バッファをスレッドごとに場所を限定することなく設定することができる。空きがあればどのスレッドでも使用することができる。かつ、ショートループの構成も可能となる。このようにして、限りある資源を存分に生かしたマルチスレッドの処理が可能となる。【００４８】
以上をまとめると以下の通りである。
（１）命令バッファ割り当て部はこれまで通り、１つでよい。割り当て部は、次に使用可能な命令バッファを１つ選択するだけでよい。
（２）命令バッファをどちらのスレッドに割り当てるかは、命令フェッチがどのスレッドのものであるかに依存する。
（３）命令フェッチ要求部も、マルチスレッド対応が必要となる。それは、すべての要求の中から、ある優先度によって１つの命令フェッチ要求を選択する方法と、従来の手順にしたがった優先度を決定してスレッドごとに１つを選択した後、別の機構によってスレッドの選択を行って最終的に１つの命令フェッチ要求に絞る方法と、が考えられる。
（４）命令フェッチのスレッドの選択手法は、単純なラウンドロビンによる方法、命令バッファ使用個数の大小比較(命令バッファ使用個数の少ないスレッドを選択)による方法、命令フェッチ後の経過時間順（長く命令フェッチされていないスレッドを優先し、最近命令フェッチされたスレッドの優先度を低くする）、または、優先して選択すべきスレッドをレジスタで設定してもよい。
（５）命令実行部への命令供給対象のスレッドの選択方法は、単純なラウンドロビンによる方法、または、命令バッファ使用個数の大小比較(命令バッファ使用個数の多いスレッドを優先して選択)による方法、命令供給後の経過時間順（長く命令実行部に命令供給されていないスレッドを優先し、最近命令供給されたスレッドの優先度を低くする）または、優先して選択すべきスレッドをレジスタで設定してもよい。
（６）それぞれのスレッドの命令バッファをトレースしていけるように各命令バッファのポインタを設定する。つまり、自分のスレッドの次の命令フェッチ（いつ発行されるか予測困難）でポインタを設定する。それだけで、スレッドごとのポインタチェーンができ上がる。    
（７）命令供給は、スレッドごとにポインタチェーンをトレースしていけばよい。ポインタチェーンをトレースしていくための手段は以下に例示できる。【００４９】
手段１：トレーサとなるレジスタをスレッドごとに持って、ポインタチェーンをトレースしていく。実行部での命令投入時にどのスレッドにするかを選択する。【００５０】
手段２：実行部に命令投入する命令バッファを示すポインタのレジスタは専用で持つ。投入待機中のスレッドについては、現在どこまで投入されたかを保持しておく。【００５１】
《第１実施形態》
＜システムの構成と概要＞
図５に、本処理装置の構成図を示す。図６に命令フェッチにおける制御の全体図を示す。本処理装置は、例えば、主記憶装置１２１に格納された命令を読み出して実行する、いわゆるプログラム内蔵方式のコンピュータである。【００５２】
図５、図６のように、この処理装置は、命令を実行する演算ユニット１２０と、演算ユニット１２０で実行される命令および演算ユニット１２０が処理するデータ等を格納する主記憶装置１２１と、演算ユニット１２０が実行すべき命令の主記憶装置１２１上のアドレスを指定するプログラムカウンタ１２２とを有している。【００５３】
図６では、さらに具体的に、プログラムカウンタ１２２の生成するアドレス、分岐リザベーションステーション１２６からの再命令フェッチ指示、あるいは分岐予測部３の予測結果に基づいて命令のフェッチを制御する命令フェッチ制御ユニット５（命令フェッチ部に相当）と、命令キャッシュ１０２を管理し命令フェッチ制御ユニット５からの命令フェッチ要求にしたがって命令をフェッチする命令キャッシュ制御ユニット４と、命令キャッシュ１０２からフェッチされた命令を保持する命令バッファ１（命令バッファ１がバッファ要素に相当し、命令バッファ１の集合がバッファ部に相当する）と、命令バッファ１の命令をデコードする命令デコーダ７と、デコードされた命令の実行タイミングを制御するリザベーションユニット（分岐命令の実行を制御する分岐リザベーションユニット１２６およびレジスタ演算命令、アドレス演算命令の実行を制御するその他リザベーションユニット１２７）と、命令の実行完了を監視する命令完了管理ユニット１２８と、演算ユニット１２０で実行される命令のオペランドを高速に演算ユニット１２０に供給するオペランドキャッシュ１２９と、主記憶装置１２１とオペランドキャッシュ１２９との間でデータの授受を管理するデータキャッシュ制御ユニット１３１とを有している。【００５４】
ここで、命令デコーダ７と演算ユニット１２０とが実行部に相当する。また、主記憶装置１２１と命令キャッシュ１０２とが記憶部に相当する。さらに、命令フェッチ制御ユニット５とプロセス管理ユニット１４０とリザベーションユニット（分岐リザベーションユニット１２６を含む）と分岐予測部３と命令完了ユニット１２８とが制御部に相当する。【００５５】
＜命令フェッチ制御ユニットの構成＞
図７に、命令フェッチ制御ユニット５の詳細構造と命令フェッチ制御ユニット５に関連する回路の構成を示す。【００５６】
プロセス管理ユニット１４０は、スレッドごとにプログラムカウンタ１２２をもつ。プログラムカウンタ１２２は、スレッドごとに、命令実行完了にともなって値の更新を行う。【００５７】
分岐リザベーションステーション１２６は、分岐命令の実行を制御する。そして、分岐命令の実行によって分岐するか否か、また分岐する場合には分岐先アドレスが確定したときに、完了報告が分岐リザベーションステーション１２６から、命令完了ユニット１２８に送出される。また、分岐リザベーションステーション１２６は分岐予測が正しかったか否かを判定し、その結果を分岐予測部３に通知する。さらに分岐予測が失敗した場合には、その旨を示すキャンセル信号を命令フェッチアドレス選択部９に送出する。【００５８】
命令フェッチアドレス選択部９は、割り込み、あるいは、トラップ等が発生したときにプログラムカウンタ１２２から供給されるアドレス、分岐予測失敗時に分岐リザベーションステーション１２６から出力される再命令フェッチ要求信号および再命令フェッチ要求アドレス、分岐予測部３から出力された分岐予測先命令フェッチ要求信号および分岐予測先命令フェッチ要求アドレス、またはシーケンシャル方向のアドレス（命令語長単位、例えば、３２バイトずつ順次、加算することで生成される命令アドレス）等に基づいて、命令データが格納されている命令キャッシュ１０２を索引するための命令フェッチ要求アドレス（ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳ）を生成する。【００５９】
命令フェッチ要求部２は、命令バッファ１において、現在無効化されている命令バッファ（単体の場合も命令バッファと呼ぶ）の中から、命令バッファ制御部８によって確保された命令バッファを指示するためのバッファ識別情報（ＩＦ＿ＲＥＱ＿ＩＤ）を受け取る。命令フェッチ要求部２は、無効化されている命令バッファ１が存在する限り命令フェッチ要求を出すように構成されている。【００６０】
そして、命令フェッチ要求部２は、生成された命令フェッチ要求アドレス（ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳ）とともに、命令フェッチ要求信号（ＩＦ＿ＲＥＱ＿ＶＡＬＩＤ）、および１つの無効化されている命令バッファ１を指示するためのバッファ識別情報（ＩＦ＿ＲＥＱ＿ＩＤ）を出力する、等の処理を行う。これにより、命令キャッシュ１０２に格納されている命令データの中からＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳに対応する命令列が読み出される。読み出された命令列は、ＩＦ＿ＲＥＱ＿ＩＤに対応する命令バッファ１に格納される。なお、図７では、省略されているが、ＩＦ＿ＲＥＱ＿ＩＤとＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳとを組み合わせた命令フェッチ要求の生成は、命令フェッチアドレス選択部９で行ってもよい。【００６１】
分岐予測部３は、ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳに対応する命令列に分岐が成立する分岐命令が含まれているか否かを予測し、それが含まれていると予測した場合には、その分岐先の命令アドレスを予測し、その予測した分岐先命令アドレス（分岐予測先命令アドレス）と共に分岐予測先命令フェッチ要求信号を、アドレス選択部９へ出力する。また、その場合には、分岐予測部３は、ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳに対応する命令列に分岐成立が予測された命令が含まれることを示す情報、およびその予測された命令の命令列上の位置を示す情報を、命令バッファ制御部８へ出力する等の処理を行う。命令バッファ制御部８では、これらの情報を命令バッファに付属のタグとして、管理する。【００６２】
命令バッファ制御部８は、無効化された命令バッファ１のいずれかを選択し、その命令バッファ１を指示するためのスレッド識別情報（ＩＦ＿ＲＥＱ＿ＩＤ）を命令フェッチ要求部２に供給する。さらに、命令バッファ制御部８は、ポインタによって継続してデコードされるべき命令バッファ１を結合する。すなわち、命令バッファ制御部８は、ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳに対応する命令列が保持されている命令バッファ１のポインタ部１Ｂに、当該命令バッファ１に保持されている命令列の次に供給されるべき後続命令列が保持されている命令バッファ１を指示する情報を格納する。本実施形態では、後続命令列を格納する後続の命令バッファ１が確保されたときに、その後続の命令バッファ１の識別ＩＤを先行する命令の命令バッファ１のポインタ部１Ｂに設定する。【００６３】
命令供給制御部６（供給スレッド決定部に相当）は、次に命令デコード部７へ供給する命令列を保持している命令バッファ１の識別ＩＤを示すＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤと、ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤが示す命令バッファ１に保持されている命令列のオフセット位置を示すＮＳＩ＿ＣＯＵＮＴＥＲ（オフセット値）を設定する、等の処理を行う。ＮＳＩ＿ＣＯＵＮＴＥＲは、命令バッファ１の各命令バッファに含まれる複数の命令列（例えば８命令）のうち、何番目の命令から命令を供給するかを示す。ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤによって命令バッファを選択し、ＮＳＩカウンタの示す命令から供給を行う、というようにして、命令デコード部７への命令供給を実現する。またさらに、現在供給中のスレッド番号をしめすＣＵＲＲＥＮＴ＿ＴＨＲＥＡＤ＿ＩＤを備える。【００６４】
＜命令バッファの構成＞
本処理装置においては、各命令バッファ１は個別に識別番号ｉを持つ。本実施形態では、識別番号ｉ=０〜７までの合計８つの命令バッファ１があるものとする。また、マルチスレッドのスレッド数はＮ＋１とし、スレッド番号ｊ＝０〜Ｎとする。【００６５】
図８に、命令バッファ１の構造を示す。各命令バッファ１は、命令フェッチ単位ごとに命令語を保持するデータ部１Ａと、当該命令バッファ１の次に供給使用される命令バッファ１の番号を指示するためのポインタ部１Ｂから構成される。【００６６】
図８のように、データ部１Ａは、複数の命令を保持するレジスタ列を含む。また、ポインタ部１Ｂは、シーケンシャル方向に続く命令バッファ１の番号を示すＩＢＲｉ＿ＳＥＱ＿ＩＢＲ＿ＩＤおよびその有効性フラグＩＢＲｉ＿ＳＥＱ＿ＩＤ＿Ｖと、分岐する場合に、分岐先命令列を保持する命令バッファ１の番号を示すＩＢＲｉ＿ＴＧＴ＿ＩＢＲ＿ＩＤおよびその有効性フラグＩＢＲｉ＿ＴＧＴ＿ＩＤ＿Ｖという、２系統のレジスタを備える。【００６７】
ここで、レジスタをＩＢＲｉ＿ＳＥＱ＿ＩＢＲ＿ＩＤ等にて表した場合、先頭の”ＩＢＲｉ＿”は、第ｉ番目の命令バッファ１ （ＩＢＲｉ）に所属するレジスタであることを示している。図８では、命令バッファ１を総称しているので、”ＩＢＲｉ＿”が省略されている。以下、命令バッファ１を総称する場合、それぞれのレジスタの先頭の”ＩＢＲｉ＿”を省略する。また、ＩＢＲｉ＿ＳＥＱ＿ＩＢＲ＿ＩＤ等は、レジスタを示すとともに、各レジスタに格納された信号の種類を表している。【００６８】
さらに、命令バッファ１は、バリッドビット（ＩＢＲｉ＿ＶＡＬＩＤ）、および当該命令バッファ１を使用しているスレッド番号（ＩＢＲｉ＿ＴＨＲＥＡＤ＿ＩＤ）の保持部を備える。バリッドビットは、１に設定することで、当該命令バッファ１が使用中であることを示す。命令バッファ１が不要となった際には、このバリッドビットを０に設定する。このことを命令バッファ１の解放または無効化と呼ぶ。【００６９】
＜命令フェッチ要求アドレス選択部の機能概要＞
（１スレッド内で命令フェッチ要求アドレスの選択）
図９に、命令フェッチアドレス選択部９の詳細を示す。命令フェッチアドレス選択部９は、複数の命令フェッチアドレス保持部１１をスレッドごとにそれぞれ個別に有する。そのため、スレッド１、２等を識別する場合には、命令フェッチアドレス保持部（本実施形態のアドレス保持部に相当）１１−１、１１−２のように示す。また、スレッドを識別することなく、総称する場合には、命令フェッチアドレス保持部１１という。【００７０】
命令フェッチアドレス選択部９の命令フェッチアドレス保持部１１は、スレッドごとに、以下の複数の命令フェッチ要求アドレスを保持するレジスタを持つ。
（１）シーケンシャル命令フェッチ要求用レジスタ（非分岐アドレス保持部に相当）：
シーケンシャル命令フェッチ要求のアドレスは、現在出力されたある命令フェッチ要求にシーケンシャルに続くアドレスである。そのアドレスは，出力された命令フェッチ要求のアドレス（ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳ）に対して、該命令フェッチで取得され命令バッファ１内に保持される命令列の合計命令長を加算したものとなる。【００７１】
つまり、一命令を４バイトとして、命令バッファ１が８命令を格納する（３２バイト）のであれば、次の命令アドレスは、ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳ＋３２とする。
（２）分岐先命令フェッチ要求用レジスタ（分岐先アドレス保持部に相当）：
分岐先命令フェッチ要求のアドレスは、分岐予測部３を備える場合に生成される。分岐先命令フェッチ要求のアドレスは、現在出力されたある命令フェッチ要求で得られる命令列の中に、分岐する分岐命令が予測されときの、その予測分岐先アドレス（ＩＦ＿ＴＧＴ＿ＡＤＤＲＥＳＳ）である。
（３）再命令フェッチ要求用レジスタ（再読み出しアドレス保持部に相当）：
再命令フェッチ要求のアドレスは、分岐予測失敗、エラー処理などの理由により、あるスレッドの命令バッファ１がすべて無効になった場合に、新たに命令フェッチを開始するときの再命令フェッチアドレス（ＲＥＩＦＣＨ＿ＡＤＤＲＥＳＳ）である。ただし、割り込み、あるいは、トラップ等が発生した場合は、プログラムカウンタ１２２から、再命令フェッチ要求用レジスタに次にフェッチすべきアドレスが供給される。【００７２】
これらのアドレスは、それぞれのレジスタに格納される。これらのレジスタは各々バリッドビットを備える。バリッドビットは、レジスタに保持されるアドレスの有効性を示すと同時に、要求の有効性を示す。【００７３】
命令フェッチ要求は、予め定められた優先順位によって、上記（１）から（３）のレジスタの中から、１つのアドレスを選択する。これを本実施形態では、第一の選択と呼ぶ。第１の選択は、１つのスレッド内での命令フェッチ要求用レジスタ（１）から（３）の選択である。【００７４】
（スレッド選択）
さらに、本処理装置は、これらのレジスタをスレッド数分もつ。そして、スレッド間で１つの命令キャッシュ１０２を共有していて、入力受付は１つだけであるなど、同時には１つのフェッチ要求のみ受け付けることができる構成の場合には、複数のスレッドの中から、次の命令フェッチで出力すべきスレッド（ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤ）を選択する必要がある（第二の選択）。もちろん、本実施形態は、そのような構成のみではなく、同時に複数のフェッチ要求を受け付ける処理装置にも適用できる。スレッドの選択を行う場合の選択の条件を以下のように設定する。
Ａ．現在、命令処理実行状態（ＥＮＡＢＬＥ＿ＰＲＯＣＥＳＳ＿ＴＨｊ）にある。
Ｂ．分岐予測失敗などによる全キャンセルが発せられていない〜ＣＡＮＣＥＬ＿ＴＨｊ）。なお、本実施形態で、”〜”は、否定を表す記号である。
Ｃ．命令キャッシュ制御ユニット４が命令フェッチ要求を受け付けることができる〜Ｉ＄＿ＢＵＳＹ＿ＴＨｊ）。すなわち、命令キャッシュ１０２がビジーでない。
Ｄ．他のスレッドに比べて、命令バッファ１の使用数が少ない。【００７５】
スレッドごとの命令バッファ１の使用数は、命令バッファ１のバリッドをスレッドごとに、例えば、加算回路によって数えることで調べることができる。また、命令バッファ１が特定のスレッドに使用されているか否かの判定は、図８に示したレジスタであるＴＨＲＥＡＤ＿ＩＤを参照すればよい。【００７６】
これらの条件を満たし、かつスレッドごとの命令バッファ１の使用数（ＩＢＵＦＦ＿ＮＵＭ＿ＴＨｊ）が同じであるスレッドが複数あってそれらの優先順位がつけがたい状態にあれば、本処理装置は、さらにそれらの中で、前回の命令フェッチから最も時間の経過したスレッドを選択するようにする。【００７７】
＜命令フェッチアドレスの第二の選択回路の選択信号＞
選択回路を図８Ａ−８Ｊに示す。このようにして第一の選択で選択された各スレッドの命令フェッチ要求アドレスに対して、さらに第二の選択を行う。そして最終的に、命令フェッチで使用するアドレス（ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳ）を得る。【００７８】
図１０Ａに、有効スレッド識別信号（ＴＨｊ＿ＶＡＬＩＤ）の生成回路を示す。図１０Ａのように、有効スレッド識別信号（ＴＨｊ＿ＶＡＬＩＤ）は、イネーブルプロセススレッド信号（ＥＮＡＢＬＥ＿ＰＲＯＣＥＳＳ＿ＴＨｊ）、キャンセルスレッド信号の否定（〜ＣＡＮＣＥＬ＿ＴＨｊ）、およびキャッシュビジースレッド信号の否定（〜Ｉ＄＿ＢＵＳＹ＿ＴＨｊ）のＡＮＤ信号によって形成される。図１０Ａの生成回路の構成は、上記スレッドの選択で説明したＡ、Ｂ、およびＣの３つの条件に対応している。【００７９】
イネーブルプロセススレッド信号（ＥＮＡＢＬＥ＿ＰＲＯＣＥＳＳ＿ＴＨｊ）は、プロセス管理ユニット１４０（図７参照）から出力され、現在命令実行状態にあるスレッドを示す信号である。【００８０】
キャンセルスレッド信号（ＣＡＮＣＥＬ＿ＴＨｊ）は、分岐リザベーションステーション１２６から出力され、スレッドｊに対して処理のキャンセルを要求する信号である。処理がキャンセルされる場合とは、例えば、分岐予測失敗等によって命令バッファ１に読み出された未実行の命令が無効になる場合である。      【００８１】
キャッシュビジースレッド信号（Ｉ＄＿ＢＵＳＹ＿ＴＨｊ）は、命令キャッシュ制御ユニット４から出力され、命令キャッシュに対する新規命令フェッチ要求が受け付けられないことを示す信号である。【００８２】
以上のように、現在実行可能であり、現在キャンセル信号がでておらず、かつ、命令キャッシュ１０２に空きがあるとき、有効スレッド識別信号（ＴＨｊ＿ＶＡＬＩＤ）はオンとなる。【００８３】
図１０Ｂに、使用中の命令バッファ１の数にしたがって、スレッドを選択する場合の概念を示す。図１０Ｂでは、各スレッドｊが使用中の命令バッファ１の数（ＩＢＵＦＦ＿ＮＵＭ＿ＴＨｊ）を簡略化してＴＨｊで示している。【００８４】
例えば、ｎ番目のスレッドが選択されるのは、
ＴＨｎ＿ＶＡＬＩＤ  
＆  （  ＴＨｎ  ＜＝  ＴＨ１  ｜  〜ＴＨ１＿ＶＡＬＩＤ  ）  
＆  （  ＴＨｎ  ＜＝  ＴＨ２  ｜  〜ＴＨ２＿ＶＡＬＩＤ  ）  
＆・・・（中略）・・・
＆  （  ＴＨｎ  ＜＝ＴＨ０  ｜  〜ＴＨ０＿ＶＡＬＩＤ  ）  
が真の場合である。【００８５】
すなわち、ｎ番目のスレッドが選択されるのは、図１０Ａに示した有効スレッド識別信号（ＴＨｎ＿ＶＡＬＩＤ）がオンであり、かつ、スレッドｎで使用中の命令バッファ１の数（ＴＨｎ）が、他の有効なスレッドで使用中の命令バッファ１の数（ＴＨｊ、ｊはｎ以外）よりも少ないことが条件である。ここで”｜”は、ＯＲ条件を示している。したがって、〜ＴＨ１＿ＶＡＬＩＤ等がオンの場合、すなわち、スレッド１等が有効でない場合には、そのスレッドについては、使用中の命令バッファ１の数は比較されないことになる。図１０Ｂの構成をそのまま論理ゲートで構成することで、使用中の命令バッファ１の数が少ないスレッドを選択できる。【００８６】
図１０Ｃに、スレッド選択後の経過時間によるスレッド優先度決定するレジスタ列の概念を示す。図１０Ｃで、レジスタ列に格納されているデータＡからデータＨは、スレッドの識別情報（スレッド番号）である。このレジスタ列は、図面上で上方に位置するものほど、最近命令フェッチされたスレッドの識別情報を格納する。また、このレジスタ列は、図面上で上方に位置するものほど、優先順位が低いスレッドの識別情報を格納する。逆に、このレジスタ列は、図面上で下方に位置するものほど、優先順位が高いスレッドの識別情報を格納する。【００８７】
図１０Ｄに、スレッド選択によってスレッドの優先順位を変更する処理例を示す。この例では、上から第ｍ番目に位置するレジスタにデータＥが格納されている。今、データＥに相当するスレッドが選択され、命令フェッチされた場合を考える。この場合に、まず、第ｍ番目に位置するレジスタのエントリが空きとなる（実際には、上書き可能な状態となる）。このとき、第ｍ番目に位置するレジスタの内容（データＥ）は、外部のレジスタに保持されている。【００８８】
そして、第ｍ＋１番目のレジスタより上側のレジスタ（データＡ〜データＤが格納されている）が１つずつ下方向にシフトされる。これによって、データＡ〜データＤに対応するスレッドの優先順位が１ずつ高められることになる。そして、最後に、外部のレジスタに保持されていたデータＥが、最上段のレジスタに格納される。その結果、データＥに相当するスレッドの優先順位が最後尾となる。【００８９】
図１０Ｅに、スレッド選択後の経過時間によるスレッド優先度決定回路（スレッド順序管理部、および順序管理部に相当）を示す。このスレッド優先度決定回路は、図１０Ｂの使用中の命令バッファ１の数（ＴＨｊ）によって、優劣がつかないスレッド間で、さらに優先度を決定する。図１０Ｅの回路では、”ＬＡＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤ”、”ｎＴＨ＿ＰＲＩＯ＿ＴＨＲＥＡＤ”、・・・、”１ＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤ”の各エントリには、いずれかのスレッド番号（ＴＨ０からＴＨｎ）が保持されている。【００９０】
これらの初期値は、例えば、スレッド番号順に、下からセットしておく。この場合、１ＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤには、ＴＨ０が設定され、ＬＡＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤには、ＴＨｎが設定される。そして、以後、命令フェッチでのスレッドの選択にしたがって、最近命令フェッチされたスレッドのスレッド番号が最も優先度の低い最上段のエントリ（ＬＡＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤ）に移動し、それ以外のスレッドが、上から２番目のエントリ以下に順送りで移動される。このスレッド優先度決定回路のエントリがスレッドレジスタに相当する。【００９１】
以下、図１０Ｅの回路の動作を説明する。図１０Ｅの上部左側の端子であるＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤおよびＩＦ＿ＲＥＱ＿ＶＡＬＩＤには、前回の処理で命令フェッチ要求部２から命令フェッチ要求がされた送出されたスレッドのスレッド番号（ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤ）およびその有効性を示す信号（ＩＦ＿ＲＥＱ＿ＶＡＬＩＤ）が入力される。なお、ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤを生成する回路は、図１０Ｉに示す。【００９２】
ＡＮＤゲート１１１は、ＩＦ＿ＲＥＱ＿ＶＡＬＩＤがオンの場合に、前回の処理で命令フェッチ要求部２から命令フェッチ要求がされた送出されたスレッドのスレッド番号（ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤ）をマッチ回路（ＭＣＨ、比較部に相当する）に出力する。【００９３】
各マッチ回路（ＭＣＨ）には、”ＬＡＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤ”、”ｎＴＨ＿ＰＲＩＯ＿ＴＨＲＥＡＤ”、・・・、”１ＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤ”の各エントリが入力されている。したがって、ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤのスレッド番号とそれぞれのエントリとの比較結果が一致したとき、マッチ回路（ＭＣＨ）の出力がオンになる。すなわち、ＵＳＥＤ＿ＬＡＳＴからＵＳＥＤ＿１ＳＴのいずれかがオンとなる。【００９４】
今、ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤが１ＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤの値（上記のように初期値は、スレッド番号０（ＴＨ０））であったする。すると、ＵＳＥＤ＿１ＳＴがオンとなる。その結果、まず、最下段のＡＮＤゲート１１３−１が開き、１ＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤのエントリに、１つ上段である２ＮＤ＿ＰＲＩＯ＿ＴＨＲＥＡＤのエントリのスレッド番号が書き込まれる。【００９５】
このとき、ＵＳＥＤ＿１ＳＴが入力されるＯＲゲート１１２−ｎ、１１２−（ｎ−１）、・・・のすべてがオンになっている。その結果、ＯＲゲート１１２−ｎ、１１２−（ｎ−１）、・・・の次段のＡＮＤゲート１１３−ｎ、１１３−（ｎ−１）、・・・１１３−１がオンとなる。【００９６】
すると、ＬＡＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤのエントリから２ＮＤ＿ＰＲＩＯ＿ＴＨＲＥＡＤのエントリまで、エントリ内のスレッド番号が順送りされる。最後に、スレッド番号０（ＴＨ０）がＬＡＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤにセットされる。以上のＯＲゲート１１２−ｉ（ｉ＝１〜ｎ）、ＡＮＤゲート１１３−ｋ（ｋ＝２〜ｎ）、およびデコーダがシフト制御部に相当する。【００９７】
同様に、ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤがスレッド番号ｊ（０＜ｊ＜Ｎ）であった場合も同様に、ｊ番目のエントリの１つ上段のエントリから最上段ＬＡＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤのエントリが、それぞれ１つずつ順送りされるとともに、最上段ＬＡＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤのエントリには、スレッド番号ｊが書き込まれる。このようにして、命令フェッチされたスレッドの番号が、常に最上段ＬＡＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤのエントリに保持されるとともに、命令フェッチされなかったスレッドのスレッド番号が、下段のエントリに順送りされることになる。【００９８】
図１０Ｅでデコーダ（ＤＥＣ）は、スレッド番号に対応するビット線をオンにする回路である。したがって、”ＬＡＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤ”、”ｎＴＨ＿ＰＲＩＯ＿ＴＨＲＥＡＤ”、・・・、”１ＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤ”の各エントリの値に対応するビットがそれぞれオンになってデコードされることになる。すなわち、最近使用された順に、スレッドが識別されることになる。【００９９】
以上の構成によれば、最近処理がなされたスレッドの優先順位を低くし、処理がなされてから最も長い期間処理がなされていないスレッドの優先順位を高くし、スレッドを管理できる。管理は、図１０Ｅのように、管理対象分のスレッドを識別するエントリと、このエントリのそれぞれと現在時点で処理がなされたスレッドとを比較するマッチ回路と、マッチ結果にしたがって各エントリを移動するシフト回路があればよい。したがって、極めて簡易かつ柔軟に、スレッドの優先順位を管理できる。【０１００】
図１０Ｆは、最優先される第１プライオリティのスレッドが決定されたときにオンになる回路である。すなわち、図１０Ｆで各ＡＮＤゲートに入力されるＴＨ０＿ＳＥＬからＴＨｎ＿ＳＥＬは、図１０Ｂに示した各スレッドで使用中の命令バッファ１の数に基づく、スレッドの選択信号である。また、１ＳＴ＿ＰＲＩＯ＿ＴＨ０から１ＳＴ＿ＰＲＩＯ＿ＴＨｎは、図１０Ｅに示した第１優先度スレッドのデコード信号である。したがって、スレッドで使用中の命令バッファ１の数が最も少なく、かつ、第１優先度のスレッドが存在した場合に、図１０Ｆの回路の出力であるＳＥＬ＿１ＳＴ＿ＰＲＩＯはオンになる。【０１０１】
図１０Ｇは、同様に、第２プライオリティのスレッドが決定されたときにオンになる回路である。ただし、１ＳＴ＿ＰＲＩＯ＿ＯＲ信号が反転されてＡＮＤゲートに入力されていることから、第１プライオリティのスレッドが決定されなかったことを条件とする。【０１０２】
図１０Ｈは、同様に、ラストプライオリティのスレッドが決定されたときにオンになる回路である。ただし、１ＳＴ＿ＰＲＩＯ＿ＯＲ信号からｎＳＴ＿ＰＲＩＯ＿ＯＲ信号が反転されてＡＮＤゲートに入力されていることから、第ｎプライオリティ以上の優先度のスレッドが決定されなかったことを条件とする。【０１０３】
図１０Ｉは、図１０Ｆから図１０Ｈで示した回路の出力信号によって、決定される最も高い優先度のスレッドが決定されたときに、そのスレッド番号を出力する回路である。すなわち、ＳＥＬ＿１ＳＴ＿ＰＲＩＯ等がオンのときに、１ＳＴ＿ＰＲＩＯ＿ＴＨＲＥＡＤ等がそれぞれスイッチから出力され、ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤが生成されることになる。このＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤは、図９に示した第２の選択回路において、スレッドを選択するための制御信号として使用される。また、ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤは、図１０Ｅの左上方に示された端子から入力される信号であり、前回の命令フェッチで選択されたスレッドを示す。【０１０４】
図１０Ｊは、スレッド数が２つの場合に利用可能なスレッド選択回路の例である。すなわち、スレッド数が２つの場合には、使用中の命令バッファ１の数が同数の場合、優先度を交互に変更してもよい。二つのスレッド番号は各々０、１とする。ここで、フリップフロップＦＦ（２値保持部に相当）には、前回命令フェッチされたスレッドのスレッド番号が保持されている。例えば、前回命令フェッチされたスレッドがスレッド０であれば、フリップフロップをリセット状態にすればよい（＝０をセット）。また、前回命令フェッチされたスレッドがスレッド１であれば、フリップフロップをセット状態（＝１をセット）にすればよい。【０１０５】
また、ＢＯＴＨ＿ＶＡＬＩＤは、ＡＮＤゲートＧ１の２つの入力が真、すなわち、現在使用中の命令バッファ１の数が２つのスレッドについて同数の場合に、オンになる。ＡＮＤゲートＧ１が同数判定部に相当する。インバータＩＶ（反転部に相当）は、前回命令フェッチされた信号を示す信号（ＬＡＳＴ＿ＴＨＲＥＡＤ＿ＩＤ）を反転する。【０１０６】
一方、図１０Ｊにおいて、ＢＯＴＨ＿ＶＡＬＩＤがオフ、すなわち、現在使用中の命令バッファ１の数が２つのスレッドについて同数でない場合、一方の入力が反転されたＡＮＤゲートＧ２によって使用中の命令バッファ１の数でスレッドが決定される。例えば、スレッド０の使用中の命令バッファ１の数が多い場合、ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤは０となる。また、スレッド１が選択された場合、ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤは１なる。このようにして、スレッド数を２に限定した場合には、図１０Ｂ−１０Ｇと比較して簡略な回路でスレッドを選択できる。【０１０７】
なお、第二の選択信号の生成は、命令バッファ制御部８において行われる。【０１０８】
＜命令フェッチの処理手順＞
図７、図９を用いて処理手順を説明する。図９のスレッド１用命令フェッチアドレス保持部１１−１、およびスレッド２用命令フェッチアドレス保持部１１−２において、ＩＦ＿ＳＥＱ＿ＡＤＤＲＥＳＳおよびＳＥＱ＿ＰＡＲＥＮＴ＿ＩＤとあるのは、シーケンシャル命令フェッチ要求用レジスタＳＥＱ１（スレッド１用）、ＳＥＱ２（スレッド２用）である（非分岐アドレス保持部に相当する）。また、ＩＦ＿ＴＧＴ＿ＡＤＤＲＥＳＳおよびＴＧＴ＿ＰＡＲＥＮＴ＿ＩＤとあるのは、分岐命令フェッチ要求用レジスタＴＧＴ１（スレッド１用）、ＴＧＴ２（スレッド２用）である（分岐アドレス保持部に相当する）。また、ＲＥＩＦＣＨ＿ＡＤＤＲＥＳＳ（再命令読み出しアドレス保持部に相当）とあるのは、再命令フェッチ要求時の命令フェッチ先アドレスを保持する。【０１０９】
そして、先に述べたとおり、保持されたアドレスの中から第一および第二の選択によって一つの命令フェッチ要求アドレスが選択される。なお、再命令フェッチ要求が発せられるときは、演算器で実行中の同一スレッド内の命令はすべてキャンセルされた状態であるため、最も優先されなければならない。一スレッド内での選択は再命令フェッチの優先順位を一番高くして行うが、第二の選択においては、Ｄの条件により、必然的にこれが選ばれることになる。なぜなら、使用中のバッファ数が０だからである。【０１１０】
命令フェッチ要求部２は、このようにして選択された命令フェッチ要求アドレスを送出する。命令フェッチ要求送出のバリッド信号をＩＦ＿ＲＥＱ＿ＶＡＬＩＤとする。このとき、命令バッファ制御部８は、命令フェッチの度に、新たな命令フェッチデータを格納するための命令バッファ１を現在使用されていない（＝バリッドが立っていない）命令バッファ１の中から１つ選択する（ＩＦ＿ＲＥＱ＿ＩＤ）。このときのスレッドの識別子ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤで示されるスレッドに、選択された命令バッファ１は所属することになる。命令フェッチ要求部２は、ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤを命令バッファ１のＴＨＲＥＡＤ＿ＩＤ（図８参照）に設定する（したがって、命令フェッチ要求部２がスレッド割り当て部に相当する）。【０１１１】
そして、命令バッファ制御部８は、命令フェッチ要求送出時に、選択された命令バッファ１のバリッドフラグを立てるよう指示を出す。さらに、命令バッファ制御部８は、該命令フェッチ要求を出したスレッドの番号を当該命令バッファ１のスレッド番号保持部（ＴＨＲＥＡＤ＿ＩＤ）に登録する（図８参照）。【０１１２】
さらに、命令フェッチ要求のアドレスによって、分岐命令の検索を並行して行う。分岐予測部３については、例えば特開平９−２１８７８６のようなブランチ・ヒストリが利用できる。【０１１３】
さらに、シーケンシャル用と分岐用の命令フェッチ要求保持レジスタ（図９のシーケンシャル命令フェッチ要求用レジスタＳＥＱ１、ＳＥＱ２、分岐先命令フェッチ要求用レジスタＴＧＴ１、ＴＧＴ２）は、該レジスタに保持される命令フェッチ要求の親にあたる命令フェッチのデータが格納される命令バッファ１の番号保持部（ＳＥＱ＿ＰＡＲＥＮＴ＿ＩＤ、ＴＧＴ＿ＰＡＲＥＮＴ＿ＩＤ）を備える。親とはつまり、シーケンシャル命令フェッチ要求用レジスタＳＥＱ１、ＳＥＱ２であれば、合計命令長を足す元となるアドレスによる命令フェッチ要求である（格納内容は、親命令バッファ番号：ＳＥＱ＿ＰＡＲＥＮＴ＿ＩＤ＿ＴＨｊ，ｊはスレッド番号）。また、分岐先命令フェッチ要求用レジスタＴＧＴ１、ＴＧＴ２であれば、親は分岐する分岐命令が予測された命令フェッチ要求のことである（格納内容は親命令バッファ番号：ＴＧＴ＿ＰＡＲＥＮＴ＿ＩＤ＿ＴＨｊ）（図９参照）。【０１１４】
そして、命令バッファ１と次の命令バッファ１との関連付け（ポインタの設定）は、同じスレッドの次の命令フェッチの際に行う。図９に示すように命令フェッチアドレス選択部は、親の命令バッファ番号を持っている。そこで、命令バッファ制御部８は、命令フェッチ要求が送出された際に、親の命令バッファ番号（ＳＥＱ＿ＰＡＲＥＮＴ＿ＩＤ  または  ＴＧＴ＿ＰＡＲＥＮＴ＿ＩＤ）を用いて、命令バッファ１内の親の命令バッファのポインタを選択し、現在処理中の命令フェッチで使用する命令バッファ番号（ＩＦ＿ＲＥＱ＿ＩＤ）を設定する。また、ＩＦ＿ＲＥＱ＿ＩＤは新たに親の命令バッファ番号となる。命令フェッチ要求がシーケンシャル方向のものであれば、命令フェッチアドレス選択部９は、親の命令バッファ１（ＳＥＱ＿ＰＡＲＥＮＴ＿ＩＤ＿ＴＨｎ）のＳＥＱ＿ＩＢＲ＿ＩＤに対して、現在処理中の命令バッファ番号（そのときのＩＦ＿ＲＥＱ＿ＩＤ）を設定する。また、命令フェッチ要求が予測分岐先のものであれば、命令フェッチ選択部９は、親の命令バッファ１（ＴＧＴ＿ＰＡＲＥＮＴ＿ＩＤ＿ＴＨｊ）のＴＧＴ＿ＩＢＲ＿ＩＤに対して処理中の命令バッファ番号（そのときのＩＦ＿ＲＥＱ＿ＩＤ）を設定する。また、各々、ポインタが有効であることを示すフラグを設定する（図９のＳＥＱ＿ＩＢＲ＿Ｖ、ＴＧＴ＿ＩＢＲ＿Ｖ）。【０１１５】
図１１Ａ−１１Ｃに、親の命令バッファに対してポインタ設定を実行する回路構成を示す。図１１Ａは、スレッド１用命令フェッチアドレス保持部１１−１およびスレッド２用命令フェッチアドレス保持部１１−２から、セレクタおよびデコーダを介して、親の命令バッファ１を選択する回路を示している。デコードされた結果、シーケンシャル方向に対して、ＳＥＱ＿ＰＡＲＥＮＴ＿０からＳＥＱ＿ＰＡＲＥＮＴ＿ｎのいずれかがオンになり、親の命令バッファ１が選択される。また、予測分岐先に対して、ＴＧＴ＿ＰＡＲＥＮＴ＿０からＴＧＴ＿ＰＡＲＥＮＴ＿ｎのいずれかがオンになり、親の命令バッファ１を選択する。【０１１６】
図１１Ｂは、シーケンシャル方向のポインタを設定する回路の例である。例えば、ＳＥＱ＿ＰＡＲＥＮＴ＿ｎがオンであるときに、さらに、シーケンシャルの命令フェッチ要求であることが判明したときに、親の命令バッファ１（ＳＥＱ＿ＰＡＲＥＮＴ＿ＩＤ＿ＴＨｎ）のＳＥＱ＿ＩＢＲ＿ＩＤに対して設定信号（ＳＥＴ＿ＩＢＲｎ＿ＳＥＱ＿ＩＤ＿ＰＯＩＮＴＥＲ）が発生する。そして、その設定信号によって、現在処理中の命令バッファ１を識別するＩＦ＿ＲＥＱ＿ＩＤが、ＳＥＱ＿ＩＢＲ＿ＩＤに設定される。【０１１７】
図１１Ｃは、分岐先方向のポインタを設定する回路の例である。分岐先の命令フェッチ要求が発生したときに、ポインタを設定する回路の動作も図１１Ｂと同様である。すなわち、例えば、ＴＧＴ＿ＰＡＲＥＮＴ＿ｎがオンであるときに、さらに、分岐先方向の命令フェッチ要求であることが判明したときに、親の命令バッファ１（ＴＧＴ＿ＰＡＲＥＮＴ＿ＩＤ＿ＴＨｎ）のＳＥＱ＿ＩＢＲ＿ＩＤに対して設定信号（ＳＥＴ＿ＩＢＲｎ＿ＴＧＴ＿ＩＤ＿ＰＯＩＮＴＥＲ）が発生する。そして、その設定信号によって、現在処理中の命令バッファ１を識別するＩＦ＿ＲＥＱ＿ＩＤが、ＴＧＴ＿ＩＢＲ＿ＩＤに設定される。【０１１８】
これを続けていくことで、命令バッファ１のポインタチェーンが形成される。命令の供給は、スレッドごとにこのポインタチェーンをたどりつつ行う。このようにして、命令バッファ１を自由に割り当てつつ、スレッドごとにポインタのチェーンを構成して、資源を有効に活用することができる。【０１１９】
＜命令供給処理＞
（スレッドの選択）
以下、命令供給に際して、どのスレッドを選択するかを決定する選択機構の処理を例示する。各々のスレッドで次に投入する命令バッファ１として選ばれているＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＴＨｊのバリッドをＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＶＡＬＩＤ＿ＴＨｊとする。【０１２０】
本実施形態では、ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＶＡＬＩＤ＿ＴＨｊがオンとなっているスレッドの中で、前回の命令投入から最も時間の経過したスレッドを選択するようにする。図１２Ａ、図１２Ｂ、図１２Ｃ、図１２Ｄ、図１２Ｅおよび図１２Ｆに命令供給時のスレッド選択回路を示す。【０１２１】
図１２Ａは、命令供給制御部６に含まれる、スレッド選択後の経過時間によるスレッド優先度決定回路（供給順序管理部、順序管理部に相当）を示す。この回路は、最近命令供給されたスレッドの優先順位を最後尾に移動し、命令供給されなかったスレッドの優先順位を１つずつ上げる回路である。【０１２２】
図１２Ｂは、最優先される第１プライオリティのスレッドが決定されたときにオンになる回路である。【０１２３】
図１２Ｃは、同様に、第２プライオリティのスレッドが決定されたときにオンになる回路である。【０１２４】
図１２Ｄは、同様に、ラストプライオリティのスレッドが決定されたときにオンになる回路である。【０１２５】
図１２Ｅは、図１２Ａから図１２Ｄで示した回路の出力信号によって、決定される最も高い優先度のスレッドが決定されたときに、そのスレッド番号を出力する回路である。【０１２６】
図１２Ｆは、スレッド数が２つの場合に利用なスレッド選択回路の例である。すなわち、スレッド数が２つの場合には、使用中の命令バッファ１の数が同数の場合、優先度を交互に変更してもよい。【０１２７】
以上の回路は、命令フェッチでのスレッド選択で示したスレッドの優先度を決定する回路（図１０Ｅ、図１０Ｆ、図１０Ｇ、図１０Ｈ、図１０Ｉおよび図１０Ｊ）と同様であるので、その説明を省略する。【０１２８】
この他には、命令実行リソースの状態を監視しながら、例えば、リザベーションステーション、キャッシュ等のリソースに空きがない場合に、ＶＡＬＩＤをオフにするなどして、ＰＲＩＯＲＩＴＹ回路はそのまま流用して、選択するスレッドを決定することもできる。【０１２９】
（命令供給処理例１）
以下、選択されたスレッドにおいて、命令バッファ１から命令実行部へ命令供給する第一の方法を示す。本実施形態では、命令バッファ１において、各々の命令バッファは８命令分を格納できる。現在、命令供給のために使用しようとしている、または使用中の命令バッファ１を指し示すさらなるポインタをスレッドごとに用意する（ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＴＨｊ）。また、投入を始める命令が命令バッファ１の先頭から何番目の命令であるかを示すオフセット（ＮＳＩ＿ＣＯＵＮＴＥＲ＿ＴＨｊ）も同時に持つ。このオフセットは、８個のバッファエントリのいずれかを指すことになる。【０１３０】
ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＩＤ＿ＴＨｊの更新は、命令供給ごとに行う。命令実行部に供給を供給した結果、命令バッファ１の８個のバッファエントリをまだ使いきっていなければ、現在と同じ命令バッファ１の番号で更新を行う（ＮＳＩ＿ＣＯＵＮＴＥＲ＿ＴＨｊ＋命令供給数＜８）
８個のバッファエントリを使いきって次の８個のバッファエントリからなる命令バッファ１の設定が必要であれば、該命令バッファ１のＳＥＱ＿ＩＢＲ＿ＩＤの値によって更新を行う（ＮＳＩ＿ＣＯＵＮＴＥＲ＿ＴＨｊ＋命令供給数＞＝８）。【０１３１】
また、該命令バッファ１が分岐する分岐命令を含んでいて、次には分岐先の命令バッファ１を設定することが必要であれば、ＴＧＴ＿ＩＢＲ＿ＩＤの値によって更新を行う。【０１３２】
ＮＳＩ＿ＣＯＵＮＴＥＲ＿ＴＨｊは、供給した命令の個数で更新する。ＮＳＩ＿ＣＯＵＮＴＥＲ＿ＴＨｊ＝ＮＳＩ＿ＣＯＵＮＴＥＲ＿ＴＨｊ＋命令供給数である（ただし、オフセットなので、繰り上がりから上限値を減算し、剰余を計算する）。【０１３３】
命令供給が２つの命令バッファ１にまたがる場合は、命令バッファ１のポインタを利用して次の命令バッファ１を選択して命令を得ることもできるし、次の命令バッファ１を示すためのさらなるポインタＮＥＸＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＴＨｊを別途用意してもよい。さらなるポインタＮＥＸＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＴＨｊを用いることで、事前に次のバッファ番号を用意することができる。もちろんこの  ＮＥＸＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＴＨｊと同等のデータは、ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＴＨｊから導くことはできるが、実際の実装において、ディレイの問題を解決するためには、このような方策をとることで、論理段数を削減し、高速動作に対応できるようにすることが可能である。このようにして、命令バッファ１のポインタチェーンのトレースを行っていく。【０１３４】
命令デコーダ７は、同時に複数の命令を受けつけることができるが、同一スレッドに限られるものである場合、さらに、どのスレッドのＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤを用いるかは別の選択機構を持って選択する（選択されたスレッドは、ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＴＨＲＥＡＤ＿ＩＤで示される）。これにより、最終的に投入される命令バッファ１が決定され、命令投入が実行される。【０１３５】
もし、命令デコーダ７をスレッドごとに持つのであれば，こちらの選択は不要となり、並列に命令デコーダ７への投入を行う。【０１３６】
以下、選択されたスレッドにおいて、命令バッファ１のポインタをトレースして命令供給する回路構成を説明する。【０１３７】
図１３は、１つのスレッド（スレッド番号ｊ）における、使用中の命令バッファ１の先頭のバッファエントリを指し示すさらなるポインタ（ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＴＨｊ）を生成する回路である。この回路は、命令供給制御部６（図７参照）に含まれる。【０１３８】
図１３のように、さらなるポインタは、セレクタ６１と、レジスタ６２によって形成される。セレクタ６１は、ＡＮＤゲート、ＯＲゲートを組み合わせて構成される。そして、現在の命令バッファ１の供給が完了し、分岐が予測されていない場合、シーケンシャル方向のポインタＳＥＱ＿ＩＢＲ＿ＩＤがレジスタ６２に格納される。ここで、現在の命令バッファ１の供給が完了した場合とは、オフセット（ＮＳＩ＿ＣＯＵＮＴＥＲ＿ＴＨｊ）がバッファエントリ数による上限値（例えば、バッファエントリ数が８の場合の上限値７）を越えた場合である。【０１３９】
また、供給した命令列の中に分岐する分岐命令が予測されている場合には、命令列を使い切っていなくても、次には分岐先方向のポインタＴＧＴ＿ＩＢＲ＿ＩＤがレジスタ６２に格納される。【０１４０】
以上のいずれの条件にも該当しない場合、すなわち、分岐が予測されず、かつ、まだ現在の命令バッファ１の供給が完了していない場合には、レジスタ６２の値がそのままレジスタ６２に戻される。【０１４１】
図１４は、図１３のセレクタ６１への入力となるシーケンシャル方向のポインタＳＥＱ＿ＩＢＲ＿ＩＤおよび分岐先方向のポインタＴＧＴ＿ＩＢＲ＿ＩＤの選択回路である。【０１４２】
この選択回路は、まず、さらなるポインタ（ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＴＨｊ）をデコードする。さらなるポインタには、現在命令供給中のバッファ番号が格納されている。したがって、デコードされた結果、いずれかのバッファ番号に該当する信号線ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＤＥＣ＿ｉ＿ＴＨｊ（例えば、ｉ＝０〜７）がオンになる。したがって、この信号によって、ＳＥＱ＿ＩＢＲ＿ＩＤ＿ＩＢＲｉ（ｉ＝０〜７）のいずれかが選択され、ＳＥＱ＿ＩＢＲ＿ＩＤとして抽出される。また、この信号によって、ＴＧＴ＿ＩＢＲ＿ＩＤ＿ＩＢＲｉ（ｉ＝０〜７）のいずれかが選択され、ＴＧＴ＿ＩＢＲ＿ＩＤとして抽出される。このようにして、ＳＥＱ＿ＩＢＲ＿ＩＤとＴＧＴ＿ＩＢＲ＿ＩＤが選択され、図１３のセレクタ６１に入力される。【０１４３】
図１５は、スレッドごとに個別にさらなるポインタＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＴＨｊを生成し、セレクタで選択する回路を示している。ただし、図１５では、ｊ＝０および１の場合だけを簡略して示した。しかし、本実施形態の実施は、このような構成に限定される訳ではない。さらなるポインタＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＴＨｊを生成する回路の構成および動作は、図１３で説明した通りである。【０１４４】
ここでは、現在命令供給されているスレッドのスレッド番号を示すＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＴＨＲＥＡＤ＿ＩＤによって、複数のＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＴＨｊの中から、スレッド番号に対応するさらなるポインタを選択する。【０１４５】
以上の構成によって、スレッドごとにポインタチェーンをトレースしていくこ
とができる。【０１４６】
（命令供給処理例２）
命令バッファ１から命令実行部の命令供給についての第２の方法を示す。
命令デコーダ７は、同時に複数の命令を受けつけることができるが、同一スレッドに限られるものとする。【０１４７】
現在、命令供給のために使用しようとしている、または使用中の命令バッファ１を指し示すさらなるポインタを格納するレジスタをスレッドに共通で１つ用意する（ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ）。また、投入を始める命令が命令バッファ１の先頭から何番目かを示すオフセット（ＮＳＩ＿ＣＯＵＮＴＥＲ）も設ける。【０１４８】
どのスレッドを投入するかは別の選択機構によって、予め選択しておく。選択されないスレッドが、現在どこまで投入されたかという情報を保持する保持レジスタを用意する。レジスタは、命令バッファ１の番号と、次に投入を始める命令が命令バッファ１の先頭から何番目かを示すオフセットを持つ。【０１４９】
ＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ、ＮＳＩ＿ＣＯＵＮＴＥＲの更新は、命令供給ごとに行う。更新は、処理例１の手順と同様に行う。ただし、次の投入も同じスレッドが選択される場合は、更新先がＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤとなるが、別のスレッドが選択された場合は、情報の入れ替えを行う。つまり、新たに選択されたスレッドについて、保持レジスタに保持されていた情報をＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤおよびＮＳＩ＿ＣＯＵＮＴＥＲに設定し、それによって空いた保持レジスタに、それまでＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤおよびＮＳＩ＿ＣＯＵＮＴＥＲに設定されていたスレッドの更新情報を登録する。【０１５０】
図１６に、命令供給されるスレッドに対するさらなるポインタを格納するレジスタを１つ専用で設け、スレッド間でさらなるポインタを入れ替える回路の構成例を示す。図１６でも、説明を簡略化するため、スレッドは、ｊ＝０および１としている。ただし、本実施形態の実施は、このような構成に限定される訳ではなく、さらに多くのスレッドに対応する構成としてもよい。【０１５１】
この構成では、セレクタ６１−０、６１−１と、レジスタ６２−０、６２−１との間に切り換え回路６３が設けられている。切り換え回路６３は、スレッドの入れ替え指示信号によって、セレクタ６１−０、６１−１のいずれか一方をレジスタ６２−１（トレースレジスタに相当）に入力し、さらなるポインタＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤとして、出力する。【０１５２】
一方、さらなるポインタとして出力されなかった他方セレクタの出力は、レジスタ６２−０（トレース待ちレジスタに相当）に入力され、ダミーのポインタＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤ＿ＳＡＶＥＤとして、出力される。【０１５３】
なお、スレッド数に対応するセレクタ６１が３以上ある場合には、命令供給中のスレッドを示すスレッド番号をデコードし、対応するセレクタ６２−ｊ（Ｊ＝０，１，２，・・・）の出力のいずれかを選択すればよい。選択されたセレクタ６２−ｊの出力をＣＵＲＲＥＮＴ＿ＤＳＴＲＥＡＭ＿ＩＤとして、レジスタ６２−１に出力すればよい。一方、選択されなかったセレクタ６２−ｊの出力は、そのまま廃棄してよい。【０１５４】
このようにして、やはりスレッドごとにポインタチェーンをトレースしていくことができる。【０１５５】
＜命令バッファの解放処理＞
以下、命令バッファ１の解放（無効化ともいう）について説明する。命令バッファ１の解放は、命令バッファ１の使用後や分岐予測の失敗などで命令バッファ１が不要となったときに行う。【０１５６】
命令バッファ１の供給が終わった後には、供給が終わった命令バッファ１の番号をパイプラインで保持しておき、パイプライン処理上で命令バッファ１を解放してよい段階にくれば、その番号を持つ命令バッファ１のバリッドフラグを０に設定することで解放を行う。【０１５７】
分岐予測が失敗したときは、スレッドごとに分岐予測失敗を示す信号（ＣＡＮＣＥＬ＿ＴＨｊ）と、スレッド番号によって、命令バッファ１の無効化信号を生成し、解放を行う。解放された命令バッファ１は初期状態に戻るので、その後どのスレッドが用いてもよい。【０１５８】
図１７Ａは、命令バッファ１の投入から解放までのサイクルを示す図である。図１７Ａでは、命令バッファ投入ステージをＣ、命令デコードステージをＤ、命令バッファ解放ステージをＲで表している。命令バッファ投入ステージで投入されている命令バッファ１の番号は、さらなるポインタＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤに保持されている。この命令バッファ１の番号は、命令デコードステージでは、レジスタＤ＿ＳＴＲＥＡＭ＿ＩＤに保持されている。また、命令バッファ解放ステージでは、レジスタＲ＿ＳＴＲＥＡＭ＿ＩＤに保持されている。【０１５９】
図１７Ｂは、レジスタＲ＿ＳＴＲＥＡＭ＿ＩＤに保持されている命令バッファ１のバッファ番号をデコードする回路（選択回路に相当）である。このデコードの結果、ＲＥＬＥＡＳ＿ＩＢＲ０からＲＥＬＥＡＳ＿ＩＢＲｎのいずれかがオンになる。ＲＥＬＥＡＳ＿ＩＢＲ０等は、命令バッファ１がデコードされ、不要となった命令バッファ１を解放するために使用される信号である。【０１６０】
図１７Ｃは、命令フェッチ要求部２（解放部に相当）に含まれる、特定のスレッド（例えば、スレッド番号ｊ）で使用される命令バッファ１を一括して解放するための信号を生成する回路（選択部に相当）の例である。例えば、あるスレッドＴＨｊ（スレッド番号ｊ）にて、分岐予測部３による分岐予測が失敗した場合には、そのスレッドＴＨｊでは、命令フェッチがやり直しとなり、その時点で使用中のすべての命令バッファ１が不要となる。また、分岐予測が成功しシーケンシャルな方向の命令バッファ１が不要となることもある。【０１６１】
図１７Ｃにおいて、ＣＡＮＣＥＬ＿ＴＨｊは、例えば、分岐リザベーションステーション１２６から分岐予測失敗が報知されたときにオンになる。また、ＩＢＲ＿ＴＨＲＥＡＤ＿ＩＤ（識別情報保持部に相当）には、各命令バッファ１を使用中のスレッド番号が格納されている（図７のＴＨＲＥＡＤ＿ＩＤ）。したがって、図１７Ｃの回路によれば、出力信号ＣＡＮＣＥＬ＿ＩＢＲｉは、ＣＡＮＣＥＬ＿ＴＨｊがオンになったときに、キャンセルの対象となるスレッドｊをＩＢＲ＿ＴＨＲＥＡＤ＿ＩＤに持つ命令バッファ１を抽出することになる。【０１６２】
図１７Ｄは、バッファのバリッドビットＩＢＲｉ＿ＶＡＬＩＤ（図８のＶＡＬＩＤ）を生成する回路の例である。この回路では、まず、使用中の命令バッファ１１のバッファ番号を示すレジスタＩＦ＿ＲＥＱ＿ＩＤがデコードされ、そのバッファ番号に対応する信号ＩＦ＿ＲＥＱ＿ＩＤ＿ＥＱ＿０からＩＦ＿ＲＥＱ＿ＩＤ＿ＥＱ＿ｎのいずれかが選択される。そして、ＩＦ＿ＲＥＱ＿ＶＡＬＩＤによってＡＮＤゲートがオンになり、ＩＦ＿ＲＥＱ＿ＩＤに対応するフリップフロップがセットされ、バリッドビットＩＢＲｉ＿ＶＡＬＩＤが生成される。【０１６３】
一方、図１７Ｂの回路で生成したＲＥＬＥＡＳＥ＿ＩＢＲｉ（ｉ＝１〜ｎ）または図１７Ｃの回路で生成したＣＡＮＣＥＬ＿ＩＢＲｉ（ｉ＝１〜ｎ）のどちらかがオンになると、フリップフロップはリセットされ、バリッドビットＩＢＲｉ＿ＶＡＬＩＤがオフとなる。【０１６４】
＜逐次解放処理の例＞
特定スレッドの全命令バッファ１の解放は、それぞれの命令バッファ１の間の関連付けを利用して、順番に行っていく手段も考えられる。つまり、ポインタにしたがってトレースしつつ順番に解放していっても問題はない。解放されたバッファは、どのスレッドが使用してもよい。本出願人が取得済みの日本国特許３９０８０６０２９のような起点保持レジスタを利用してもよい。すなわち、この起点レジスタをスレッドごとに持っていれば、それを起点として解放を始めればよい。【０１６５】
図１８Ａから図１８Ｃに以上の処理を実行するタイムチャートおよび主要回路の構成を示す。ここでは、命令レジスタ１が、ＩＢＲ０＝＞ＩＢＲ４＝＞ＩＢＲ２という命令バッファ１のチェーンが構成されていた場合を例にして、ポインタをたどる解放処理の例を示す。【０１６６】
図１８Ａは、分岐リザベーションステーション１２６にて、キャンセルが発生したときからさらに４サイクルまで（ｃａｎｃｅｌ、１Ｔ〜４Ｔ）の処理が示されている。【０１６７】
図１８Ｂおよび図１８Ｃは、ＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＴＨｊを起点にして命令バッファ１のチェーンを順次解放する回路である。命令バッファ１のチェーンの先頭は、例えば、起点レジスタＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＴＨｊに保持することができる。本実施形態では、命令バッファ１のチェーンは、チェーンごとに異なるスレッドに対応する。したがって、起点レジスタＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＴＨｊは、スレッドごとに用意することになる。【０１６８】
今、分岐リザベーションステーション１２６で分岐予測失敗等によって、スレッドＴｈｊに対する命令バッファ１のキャンセルが指令された場合を考える。この場合、起点レジスタＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＴＨｊがデコードされ、例えば、ＩＦ＿ＲＥＱ＿ＩＤ＿ＥＱ＿ｉがオンになっている。さらに、ＩＦ＿ＲＥＱ＿ＩＤ＿ＥＱ＿ｉは、分岐リザベーションステーション１２６から発せられるＣＡＮＣＥＬ＿ＴＨｊとともにＡＮＤゲートに入力され、ＣＡＮＣＥＬ＿ＳＴＡＲＴ＿ＩＢＲｉがオンになる。これによって、命令バッファ１のうち、バッファ番号ｉのバッファがまず解放される（図１８Ｂのデコーダが第１の解放処理部に相当）。今、例ととして、ｉ＝０、すなわち、ＣＡＮＣＥＬ＿ＳＴＡＲＴ＿ＩＢＲ０がオンになっている場合と考える。【０１６９】
すると、図１８Ｃの回路（第２の解放処理部に相当）によってＯＲゲート８２を通じてＣＡＮＣＥＬ＿ＩＢＲ０がオンになる。これによって、まず、バッファ番号０の命令バッファ１が解放される。さらに、ＣＡＮＣＥＬ＿ＩＢＲ０のオンによって、スイッチＳＷ８３がオンとなる。また、バッファ番号０の命令バッファ１の後続ポインタのうち、シーケンシャル方向のポインタＩＢＲ０＿ＳＥＱ＿ＩＢＲ＿ＩＤまたは分岐先方向へのポインタＩＢＲ０＿ＴＧＴ＿ＩＢＲ＿ＩＤのどちらかによってチェーンが形成されている。そのどちらが有効であるかは、例えば、分岐方向へのポインタのバリッドフラグＩＢＲ０＿ＴＧＴ＿ＩＤ＿Ｖを見ればよい。図１８Ｃの回路では、バリッドフラグＩＢＲ０＿ＴＧＴ＿ＩＤ＿Ｖによって、スイッチＳＷ８４がオン・オフされる。すなわち、ＩＢＲ０＿ＴＧＴ＿ＩＤ＿Ｖがオフの場合は、シーケンシャル方向のポインタＩＢＲ０＿ＳＥＱ＿ＩＢＲ＿ＩＤがレジスタ８４に格納される。また、ＩＢＲ０＿ＴＧＴ＿ＩＤ＿Ｖがオンの場合は、分岐先方向のポインタＩＢＲ０＿ＴＧＴ＿ＩＢＲ＿ＩＤがレジスタ８４に格納される。そして、レジスタ８４のバッファ番号がデコードされてＣＡＮＣＥＬ＿ＦＯＬＬＯＷ＿ＩＢＲｋ（ｋは、１からｎのいずれか）がオンになる。【０１７０】
したがって、ＣＡＮＣＥＬ＿ＦＯＬＬＯＷ＿ＩＢＲｋによって、上記スイッチＳＷ８３と同等のスイッチがオンになり、ＣＡＮＣＥＬ＿ＩＢＲｋがオンになる。その結果、命令バッファ１のチェーンが１つたどられ、バッファ番号ｋの命令バッファ１が解放される。以下同様の信号の伝搬によって、命令バッファ１のチェーンがたどられることになる。【０１７１】
図１８Ａにその場合の処理の流れ（タイミングチャート）が示されている。すなわち、まず、ＣＡＮＣＥＬ＿ＳＴＡＲＴ＿ＩＢＲ０が参照され、ＣＡＮＣＥＬ＿ＩＢＲ０が生成される。そして、ＩＢＲ０＿ＶＡＬＩＤがオフされる。【０１７２】
次のサイクルで、ＣＡＮＣＥＬ＿ＦＯＬＬＯＷ＿ＩＢＲｋによる次のポインタの取り出しによってＣＡＮＣＥＬ＿ＩＢＲ４が生成され、ＩＢＲ４＿ＶＡＬＩＤがオフされる。さらに、次のサイクルで、ＣＡＮＣＥＬ＿ＩＢＲ２が生成され、ＩＢＲ２＿ＶＡＬＩＤがオフされる。【０１７３】
＜ショートループの処理＞
さらにショートループの構成について説明する。日本国特許第３８０４９４１号のようなショートループを構成したい場合には、ショートループの起点を保持する起点レジスタをスレッドごとに持つことでそれが実現可能となる。【０１７４】
図１９は、起点レジスタを適用させた命令フェッチ制御ユニット５の構成図である。図１９では、簡略化のため、スレッド番号ｊ＝１および２に対応する起点レジスタのみ示されている。しかし、本実施形態の態様は、このような構成に限定されるものではない。【０１７５】
図２０Ａは、スレッド０用起点レジスタの構成を示す図である。また、図２０Ｂは、スレッド１用起点レジスタの構成を示す図である。起点レジスタは、起点のバッファ番号を保持するレジスタＳＴＡＲＴ＿ＩＢＲ＿ＩＤ、およびバリッドフラグ（ＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＶＡＬＩＤ）を有する。【０１７６】
図２１は、起点レジスタのバリッドフラグＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＶＡＬＩＤを生成する回路である。この回路は、命令フェッチ要求が有効であり（ＩＦ＿ＲＥＱ＿ＶＡＬＩＤがオン）、かつ、再命令フェッチまたは分岐先フェッチがなされたときに、オンになる。一方、命令バッファ１に対するキャンセル信号が発せられると、オフになる。【０１７７】
図２２は、起点レジスタのバッファ番号を保持するレジスタＳＴＡＲＴ＿ＩＢＲ＿ＩＤにバッファ番号を設定する回路（起点設定部に相当）である。この回路は、起点レジスタのバリッドフラグが無効であり（ＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＶＡＬＩＤがオフ、つまりまだ有効な起点が設定されていない）、命令フェッチ要求が有効であり（ＩＦ＿ＲＥＱ＿ＶＡＬＩＤがオン）、かつ、再命令フェッチまたは分岐先フェッチがなされたときに、命令バッファ１の識別ＩＤであるＩＦ＿ＲＥＱ＿ＩＤを該当するスレッドの起点レジスタのＳＴＡＲＴ＿ＩＢＲ＿ＩＤに設定する。再命令フェッチ先アドレス、分岐先アドレスはともに、ループの起点となる可能性が大きいからである。【０１７８】
命令フェッチ要求部２から送出された命令フェッチ要求が、分岐予測部３のブランチ・ヒストリ・ユニットでなされた分岐予測による分岐先命令フェッチ要求の場合、あるいは、命令実行時に分岐予測が失敗していたことが分かって命令フェッチをやり直すための分岐先の再命令フェッチ要求であった場合を想定する。この場合には、その分岐先命令フェッチ要求あるいは再命令フェッチ要求によって確保された命令バッファ１の番号（つまり、ＩＦ＿ＲＥＱ＿ＩＤ）を起点レジスタ（ＳＴＡＲＴ＿ＩＢＲ＿ＩＤ）に登録し、レジスタのバリッドをオンにする。【０１７９】
分岐予測部３は、ブランチ・ヒストリ・ユニットを有する。ここで、ブランチ・ヒストリ・ユニットについて簡単に説明する。ブランチ・ヒストリ・ユニットは、分岐命令の存在とその分岐先アドレスを予測する。例えばその実装としては、次のようなものがある。処理装置により処理を行っている際にある分岐命令を実行した結果、その分岐が成立することが判明した場合、次もその分岐命令は分岐すると考え、ブランチ・ヒストリに、その分岐命令自身のアドレス（以下、分岐命令アドレスという）と分岐先命令のアドレス（以下、分岐先アドレスという）とを対で登録する。このようにして、ブランチ・ヒストリには、分岐の成立した分岐命令についての上記対データを蓄積してゆく。つまり、ブランチ・ヒストリには、分岐すると予測された分岐命令のデータのみが登録されている。【０１８０】
そして、ある分岐命令を主記憶装置から取り出して実行する際には、その実行に先立ってブランチ・ヒストリ・ユニットを索引し、ブランチ・ヒストリ・ユニットにその分岐命令のアドレスが登録されている場合には、その分岐命令アドレスと対になっている分岐先アドレスをブランチ・ヒストリ・ユニットから読み出す。そして、先行する命令の実行の終了を待つことなく、その分岐先アドレスに対応する命令を主記憶装置から取り出して実行させる。なお、その分岐先アドレスに対応する命令の写しが命令キャッシュ１０２に保持されている場合には、その命令は、命令キャッシュ１０２から取り出されて実行される。さらに、ブランチ・ヒストリでは、ある分岐命令の過去の複数回分の分岐結果（＝分岐履歴）をもって、次に該分岐命令が現れたときに分岐するか否かを予測することで分岐予測の精度を向上させることもできる。分岐すると予測した場合には同様にブランチ・ヒストリに登録を行う。【０１８１】
つまり、分岐命令の実行以前に、ブランチ・ヒストリ・ユニットによって、分岐成立が予想される場合（分岐命令アドレスに対応する分岐先アドレスがブランチ・ヒストリ・ユニットに登録されている場合）、予測された分岐先アドレスを用いて命令フェッチを行い、分岐命令に続いて、読み出された分岐先命令を命令実行ステージに投入する。【０１８２】
また、上述のように、本処理装置は、起点レジスタをスレッドごとに持つ。ある命令フェッチ要求が、ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳ  ＝  “Ａ”、ＩＦ＿ＲＥＱ＿ＩＤ＝“ｍ”で送出されたとする。命令バッファ１の番号がｍのとき、この命令バッファ１をＩＢＲｍと表す。以下、図２５のタイムチャートにしたがって説明する。【０１８３】
上記命令フェッチ要求は、番号ｍの命令バッファ１（ＩＢＲｍ）を確保しつつ送出された、ということになる。そこで、ＩＢＲｍのバリッドフラグであるＩＢＲｍ＿ＶＡＬＩＤをオンにする。さらに、ＩＢＲｍの命令フェッチアドレスは、レジスタＩＡＲｍに記憶しておく。なお、以下は、すべて、同一のスレッド内のフェッチである。【０１８４】
後続のシーケンシャル方向の命令フェッチは、ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳ  ＝  “Ａ＋３２”、ＩＦ＿ＲＥＱ＿ＩＤ＝“ｎ”、・・・と続いていく。【０１８５】
一方、その命令フェッチアドレスＡで分岐予測部３のブランチ・ヒストリ・ユニットを検索したところ、分岐する分岐命令が検出されたとする（分岐先アドレスＴＧＴ＿ＡＤＤＲＥＳＳ  ＝  “Ｔ”、話を簡単にするため、Ｔは３２バイト境界のアドレスとする）。【０１８６】
そこで、命令フェッチ要求部２は、この後、分岐先の命令フェッチ要求を送出する。また、命令フェッチ要求部２は、シーケンシャル方向の命令フェッチ要求をキャンセルする。分岐先命令フェッチ要求時のＩＦ＿ＲＥＱ＿ＩＤを“ｐ”とすると、このとき、ＩＢＲｐ＿ＶＡＬＩＤがオンになる。
“ｐ”は、  ＩＢＲｍに、次の命令バッファ１の分岐先方向のポインタ（ＩＢＲｍ＿ＴＧＴ＿ＩＢＲ＿ＩＤ）として登録される。さらに、この“ｐ”を、  ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤ（＝ｊ）の示すスレッドの起点レジスタ（ＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＴＨｊ）に対して、ループの起点として登録する。また、その命令フェッチアドレス“Ｔ”をレジスタＩＡＲｐに登録する。【０１８７】
その後、アドレスＴからシーケンシャル方向への命令フェッチ（ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳ＝“Ｔ＋３２”、ＩＦ＿ＲＥＱ＿ＩＤ＝“ｑ”）のさらに次の命令フェッチ（ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳ＝“Ｔ＋６４”、ＩＦ＿ＲＥＱ＿ＩＤ＝“ｒ”  ）で、分岐命令を検出したとする（ＴＧＴ＿ＡＤＤＲＥＳＳ  ＝  “ＴＴ”）。【０１８８】
ここで、分岐先アドレス“ＴＴ”とＴＴの属するスレッドｊの起点レジスタＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＴＨｊで指す命令バッファ１の命令フェッチアドレスＩＡＲ（ＳＴＡＲＴ＿ＩＢＲ＿ＩＤ）、つまりこの場合であればＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＝“ｐ”より、  ＩＡＲｐを参照する。そして、もし、ＩＡＲｐ  ＝  “Ｔ”＝“ＴＴ”となれば、ＩＢＲｒの分岐先は、ＩＢＲｐと同じということになる。そこで、ＩＢＲｒ＿ＴＧＴ＿ＩＢＲ＿ＩＤとして“ｐ”を登録する。これによって、ＩＢＲｒからＩＢＲｐへのループが構成される。図２６に、このときに形成される命令バッファのループを示す。以上の処理は、図１９の命令フェッチ制御ユニット５の起点レジスタを含む論理回路で実行される。この論理回路が、分岐方向ポインタ設定部に相当する。【０１８９】
図２３は、ＩＢＲ１、ＩＢＲ３およびＩＢＲ４によって、ＩＢＲ１（ｐ＝１の場合）を起点として、ショートループを構成する例である。また、図２４は、ＳＥＱ＿ＩＢＲ＿ＩＤ、およびＴＧＴ＿ＩＢＲ＿ＩＤを含む、複数の命令バッファ１（ＩＢＲ０−ＩＢＲ７）のうち、ＩＢＲ１、ＩＢＲ３およびＩＢＲ４によって、ショートループを示す図である。図２４では、ＩＢＲ４に含まれるＴＧ＿ＩＢＲ＿ＩＤの値がＩＢＲ１に設定され、ＩＢＲ１へのショートループが構成されている。【０１９０】
このように、起点レジスタＳＴＡＲＴ＿ＩＢＲ＿ＩＤ＿ＴＨｊを持つことで、起点となる命令バッファ１を、スレッドごとに、場所を限定することなく設定することができる。空きがあればどのスレッドでも使うことができ、かつショートループの構成も可能となる。【０１９１】
さらに、起点レジスタは、再命令フェッチ時には再命令フェッチで使用した命令バッファの番号が登録されているので、再命令フェッチ後のＣＵＲＲＥＮＴ＿ＳＴＲＥＡＭ＿ＩＤの初期値の設定にも、この値を用いることができる。【０１９２】
したがって、限りある資源を存分に生かしたマルチスレッドの処理が可能となる。【０１９３】
以上に述べたような構成をとることで、常に資源を無駄なく活用できる。したがって、命令バッファ１全体の個数を抑えることができる。その結果、チップ面積の増大を抑え、消費電力を抑えることができるなどの様々なメリットにつながる。【０１９４】
さらに、この構成によれば、例えばマルチスレッド処理からシングルスレッドでのプロセス処理に動的な変更が発生した場合にも、特別の対処をすることなく
すべての資源を使うことができる。【０１９５】
すなわち、固定的に命令バッファ１をスレッドに割り当てることがないので、マルチスレッドからシングルスレッドに切り換えるときに、命令バッファ１を解放しておけば、すべての命令バッファ１をそのシングルスレッドに使用できる。【０１９６】
スレッドごとに命令バッファ１のセットを持っている場合、シングルスレッドでの走行になったときには、
（１）他のスレッド用の命令バッファの使用をあきらめる
（２）別途、特別な手段を用いて命令バッファセットをすべて使えるようにする。
という、などの手段を選択することになる。【０１９７】
このように、本処理装置は、コストを抑えたマルチスレッド処理に様々の大きな効果を発挿する。
【図１】
2008155834.tif 000003
【図２】
2008155834.tif 000004
【図３】
2008155834.tif 000005
【図４】
2008155834.tif 000006
【図５】
2008155834.tif 000007
【図６】
2008155834.tif 000008
【図７】
2008155834.tif 000009
【図８】
2008155834.tif 000010
【図９】
2008155834.tif 000011
【図１０Ａ】
2008155834.tif 000012
【図１０Ｂ】
2008155834.tif 000013
【図１０Ｃ】
2008155834.tif 000014
【図１０Ｄ】
2008155834.tif 000015
【図１０Ｅ】
2008155834.tif 000016
【図１０Ｆ】
2008155834.tif 000017
【図１０Ｇ】
2008155834.tif 000018
【図１０Ｈ】
2008155834.tif 000019
【図１０Ｉ】
2008155834.tif 000020
【図１０Ｊ】
2008155834.tif 000021
【図１１Ａ】
2008155834.tif 000022
【図１１Ｂ】
2008155834.tif 000023
【図１１Ｃ】
2008155834.tif 000024
【図１２Ａ】
2008155834.tif 000025
【図１２Ｂ】
2008155834.tif 000026
【図１２Ｃ】
2008155834.tif 000027
【図１２Ｄ】
2008155834.tif 000028
【図１２Ｅ】
2008155834.tif 000029
【図１２Ｆ】
2008155834.tif 000030
【図１３】
2008155834.tif 000031
【図１４】
2008155834.tif 000032
【図１５】
2008155834.tif 000033
【図１６】
2008155834.tif 000034
【図１７Ａ】
2008155834.tif 000035
【図１７Ｂ】
2008155834.tif 000036
【図１７Ｃ】
2008155834.tif 000037
【図１７Ｄ】
2008155834.tif 000038
【図１８Ａ】
2008155834.tif 000039
【図１８Ｂ】
2008155834.tif 000040
【図１８Ｃ】
2008155834.tif 000041
【図１９】
2008155834.tif 000042
【図２０Ａ】
2008155834.tif 000043
【図２０Ｂ】
2008155834.tif 000044
【図２１】
2008155834.tif 000045
【図２２】
2008155834.tif 000046
【図２３】
2008155834.tif 000047
【図２４】
2008155834.tif 000048
【図２５】
2008155834.tif 000049
【図２６】
2008155834.tif 000050
【手続補正書】
【提出日】平成20年10月17日(2008.10.17)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
複数の命令を有するスレッドに含まれる前記命令を実行する実行部と、
前記実行部に命令を供給する供給部と、
複数のエントリに命令を格納するデータ部と前記エントリに格納されている命令の次に実行すべき命令を指定するポインタ部を有し、前記供給部から供給される命令を保持するバッファ部と、
前記ポインタ部を制御して、前記命令の次に実行すべき命令を有するバッファ部に前記次に実行すべき命令が属するスレッドを割り当てるスレッド割り当て部により、前記バッファ部を制御する制御部とを有することを特徴とする処理装置。
【請求項２】
前記命令を格納する記憶部と、
前記記憶部の読み出しアドレスからの命令の読み出しと読み出された命令の前記バッファ部への格納を制御する命令フェッチ部と、
次に読み出すべき命令の読み出しアドレスを前記スレッドごとに保持するアドレス保持部と、
前記スレッドごとに設けられたアドレス保持部のうち選択されるべきスレッドを決定するフェッチスレッド決定部と、をさらに備える請求項１に記載の処理装置。
【請求項３】
前記アドレス保持部は、
分岐なしに後続命令を読み出す場合に後続命令の読み出しアドレスを保持する非分岐アドレス保持部と、
分岐命令の実行が予測された分岐先アドレスから後続命令を読み出す場合の読み出しアドレスを保持する分岐先アドレス保持部と、
分岐予測がはずれた場合に後続命令を読み出す場合の読み出しアドレスを保持する再読み出しアドレス保持部と、を有する請求項１に記載の処理装置。
【請求項４】
前記ポインタ部は、分岐なしに後続命令を実行する場合に後続命令を格納するバッファ部を示す非分岐方向ポインタ部と、分岐命令によって後続命令を実行する場合の分岐先後続命令を格納するバッファ要素を示す分岐方向ポインタ部とを有する請求項１から３のいずれかに記載の処理装置。
【請求項５】
前記フェッチスレッド決定部は、使用バッファ要素数の少ないスレッドを優先して選択する請求項２から４のいずれかに記載の処理装置。
【請求項６】
前記命令フェッチ部によってスレッドに含まれる命令が読み出された後の経過時間順に、複数のスレッド間の順序を管理するフェッチ順序管理部をさらに備え、
フェッチスレッド決定部は、前記経過時間の長いスレッドを選択されるべきスレッドに決定する請求項２から５のいずれかに記載の処理装置。
【請求項７】
前記フェッチ順序管理部は、実行中の複数のスレッドのスレッド識別情報を前記経過時間順に保持するスレッドレジスタと、
フェッチスレッド決定部によって決定されたスレッドのスレッド識別情報と前記それぞれのスレッドレジスタ内のスレッド識別情報との一致を判定する比較部と、
前記比較部によって前記一致が判定されたスレッド識別情報を前記経過時間順の最後尾のスレッドレジスタに移動するとともに、前記最後尾のスレッドレジスタに移動されたスレッド識別情報を移動前に保持していたスレッドレジスタより後方のスレッドレジスタにそれぞれ保持されていたスレッド識別情報を１つずつ前方に移動するシフト制御部と、を有する請求項６に記載の処理装置。
【請求項８】
前記処理装置において同時に処理可能なスレッド数が２に限定されており、
前記フェッチ順序管理部は、
２つのスレッドの使用バッファ数が同数か否かを判定する同数判定部と、
前回命令フェッチがされたスレッドの識別情報を保持する２値保持部と、
前記２つのスレッドの使用バッファ要素数が同数の場合に、前記２値保持部の情報を反転する反転部と、を有する請求項６に記載の処理装置。
【請求項９】
前記フェッチスレッド決定部は、分岐予測が失敗したことにより実行停止中にあって命令フェッチができないスレッドと、スレッドに対応する処理においてキャッシュへのアクセスが停滞中のスレッドとを除外する除外部を有する請求項２から８のいずれかに記載の処理装置。
【請求項１０】
前記複数のバッファ要素の系列のうち、前記供給部によって実行部に命令が供給されるべき系列に該当する供給スレッドを決定する供給スレッド決定部をさらに備える請求項１から９のいずれかに記載の処理装置。
【請求項１１】
前記供給スレッド決定部は、使用バッファ要素数の多いスレッドを優先して供給スレッドに決定する請求項１０に記載の処理装置。
【請求項１２】
前記供給部によって実行部に命令が供給された後の経過時間順に、複数のスレッド間の順序を管理する供給順序管理部をさらに備え、
供給スレッド決定部は、前記経過時間の長いスレッドを前記供給スレッドに決定する請求項１０または１１に記載の処理装置。
【請求項１３】
前記供給順序管理部は、実行中の複数のスレッドのスレッド識別情報を前記経過時間順に保持するスレッドレジスタと、
前記供給スレッド決定部によって決定されたスレッドのスレッド識別情報と前記それぞれのスレッドレジスタ内のスレッド識別情報との一致を判定する比較部と、
前記比較回路によって、前記一致が判定されたスレッド識別情報を前記経過時間順の最後尾のスレッドレジスタに移動するとともに、前記最後尾に移動されたスレッド識別情報が移動前に保持されていたスレッドレジスタより後方のスレッドレジスタに保持されたスレッド識別情報をそれぞれ１つずつ前方に移動するシフト制御部と、を有する請求項１２に記載の処理装置。
【請求項１４】
前記処理装置において同時に処理可能なスレッド数が２に限定されており、
前記供給順序管理部は、
２つのスレッドの使用バッファ数が同数か否かを判定する同数判定部と、
命令が供給されたスレッドの識別情報を保持する２値保持部と、
前記２つのスレッドの使用バッファ要素数が同数の場合に、前記２値保持部の情報を反転する反転部と、を有する請求項１２に記載の処理装置。
【請求項１５】
命令供給中のスレッドの識別情報を保持するトレースレジスタと、
命令供給が待ち状態にあるスレッドの識別情報を保持するトレース待ちレジスタと、
前記トレースレジスタの保持する情報と前記トレース待ちレジスタの保持する情報とを入れ替える入れ替え部と、をさらに有する請求項１２から１４のいずれかに記載の処理装置。
【請求項１６】
前記トレース待ちレジスタは複数設けられ、
前記供給スレッド決定部によって決定されたスレッドの識別情報にしたがって、前記トレース待ちレジスタの１つが決定され、
前記入れ替え部は、前記トレースレジスタが保持する情報と前記決定されたトレース待ちレジスタが保持する情報とを入れ替える請求項１５に記載の処理装置。
【請求項１７】
前記制御部は、命令の保持が不要となったバッファ要素を解放する解放部を有する請求項１から１６のいずれかに記載の処理装置。
【請求項１８】
前記バッファ要素またはバッファ要素の系列に割り当てられているスレッドの識別情報を保持する識別情報保持をさらに備え、
前記解放部は、いずれかのスレッドに割り当てられたバッファ要素の系列に含まれるバッファ要素で未供給の命令を格納したバッファ要素を解放するキャンセル信号が発せられたときに、前記スレッドを識別する識別情報から解放すべきバッファ要素の選択信号を生成する選択部を有する、請求項１７に記載の処理装置。
【請求項１９】
前記バッファ要素の系列がループを形成しているときに、その系列のいずれかのバッファ要素を保持する起点レジスタをさらに備え、
前記解放部は、いずれかのスレッドに割り当てられたバッファ要素の系列に含まれるバッファ要素で未供給の命令を格納したバッファ要素を解放するキャンセル信号が発せられたときに、前記そのスレッドに対応する起点レジスタによって示されるバッファ要素を選択して解放する第１の解放処理部と、
前記解放されたバッファ要素と接続関係を定義されたバッファ要素を前記ポインタ部の指定にしたがって、順次解放する第２の解放処理部と、を有する請求項１７または１８に記載の処理装置。
【請求項２０】
前記バッファ要素の系列がループを形成しているときに、その系列のいずれかのバッファ要素を前記スレッドごとに保持する起点レジスタと、
分岐予測がなされた分岐先アドレス、または分岐予測がはずれて分岐予測の結果読み出された命令が無効とされた後に命令の読み出しを開始すべき読み出し開始先アドレスをスレッドごとに前記起点レジスタに設定する起点設定部と、
分岐予測部で分岐前のアドレスに対して予測された分岐予測先アドレスが前記起点レジスタで保持するアドレスと一致したときに、前記分岐前のアドレスにて読み出された命令を格納するバッファ要素の分岐方向ポインタ部に前記起点レジスタで保持するバッファ要素の識別情報を設定する分岐方向ポインタ設定部とをさらに備える請求項４から１９のいずれかに記載の処理装置。
【請求項２１】
複数の命令によって処理が構成され、互いに独立に実行可能な複数の処理のそれぞれがスレッドとして識別される処理装置であって、
前記命令を実行する実行部と、
前記命令の優先順を管理する順序管理部とを備え、
前順序管理部は、実行中の複数のスレッドのスレッド識別情報を優先順に保持するスレッドレジスタと、
前記所定の制御がなされたスレッドのスレッド識別情報と前記それぞれのスレッドレジスタ内のスレッド識別情報との一致を判定する比較部と、
前記比較部によって前記一致が判定されたスレッド識別情報を前記優先順の最後尾のスレッドレジスタに移動するとともに、前記最後尾のスレッドレジスタに移動されたスレッド識別情報を移動前に保持していたスレッドレジスタより後方のスレッドレジスタにそれぞれ保持されていたスレッド識別情報を１つずつ前方に移動するシフト制御部と、を有する処理装置。
【請求項２２】
複数の処理対象に対して処理が実行されるときに、その処理が実行される処理対象の優先順を管理する管理装置であり、
前記処理が実行される優先順に、前記処理対象を識別する識別情報を保持する保持部の列と、
前記いずれかの処理対象に対して前記処理が実行されたときに前記処理対象を識別する識別情報と前記保持部のそれぞれに保持された識別情報との一致を判定する比較部と、
前記比較部によって前記一致が判定された識別情報を前記優先順の最後尾の保持部に移動するとともに、前記最後尾の保持部に移動された識別情報を移動前に保持していた保持部より後方の保持部にそれぞれ保持されていた識別情報を１つずつ前方の保持部に移動するシフト制御部と、を有する管理装置。
【手続補正書】
【提出日】平成22年1月18日(2010.1.18)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
複数の命令を有するスレッドに含まれる前記命令を実行する実行部と、
前記実行部に命令を供給する供給部と、
複数のエントリに命令を格納するデータ部と前記エントリに格納されている命令の次に実行すべき命令を指定するポインタ部を有し、前記供給部から供給される命令を保持するバッファ部と、
前記ポインタ部を制御して、前記命令の次に実行すべき命令を有するバッファ部に前記次に実行すべき命令が属するスレッドを割り当てるスレッド割り当て部により、前記バッファ部を制御する制御部とを有することを特徴とする処理装置。
【請求項２】
前記命令を格納する記憶部と、
前記記憶部の読み出しアドレスからの命令の読み出しと読み出された命令の前記バッファ部への格納を制御する命令フェッチ部と、
次に読み出すべき命令の読み出しアドレスを前記スレッドごとに保持するアドレス保持部と、
前記スレッドごとに設けられたアドレス保持部のうち選択されるべきスレッドを決定するフェッチスレッド決定部と、をさらに備える請求項１に記載の処理装置。
【請求項３】
前記アドレス保持部は、
分岐なしに後続命令を読み出す場合に後続命令の読み出しアドレスを保持する非分岐アドレス保持部と、
分岐命令の実行が予測された分岐先アドレスから後続命令を読み出す場合の読み出しアドレスを保持する分岐先アドレス保持部と、
分岐予測がはずれた場合に後続命令を読み出す場合の読み出しアドレスを保持する再読み出しアドレス保持部と、を有する請求項２に記載の処理装置。
【請求項４】
前記ポインタ部は、分岐なしに後続命令を実行する場合に後続命令を格納するバッファ部を示す非分岐方向ポインタ部と、分岐命令によって後続命令を実行する場合の分岐先後続命令を格納するバッファ要素を示す分岐方向ポインタ部とを有する請求項１から３のいずれか１項に記載の処理装置。
【請求項５】
前記フェッチスレッド決定部は、使用バッファ要素数の少ないスレッドを優先して選択する請求項２から４のいずれか１項に記載の処理装置。
【請求項６】
前記命令フェッチ部によってスレッドに含まれる命令が読み出された後の経過時間順に、複数のスレッド間の順序を管理するフェッチ順序管理部をさらに備え、
フェッチスレッド決定部は、前記経過時間の長いスレッドを選択されるべきスレッドに決定する請求項２から５のいずれか１項に記載の処理装置。
【請求項７】
前記フェッチ順序管理部は、実行中の複数のスレッドのスレッド識別情報を前記経過時間順に保持するスレッドレジスタと、
フェッチスレッド決定部によって決定されたスレッドのスレッド識別情報と前記それぞれのスレッドレジスタ内のスレッド識別情報との一致を判定する比較部と、
前記比較部によって前記一致が判定されたスレッド識別情報を前記経過時間順の最後尾のスレッドレジスタに移動するとともに、前記最後尾のスレッドレジスタに移動されたスレッド識別情報を移動前に保持していたスレッドレジスタより後方のスレッドレジスタにそれぞれ保持されていたスレッド識別情報を１つずつ前方に移動するシフト制御部と、を有する請求項６に記載の処理装置。
【請求項８】
前記処理装置において同時に処理可能なスレッド数が２に限定されており、
前記フェッチ順序管理部は、
２つのスレッドの使用バッファ数が同数か否かを判定する同数判定部と、
前回命令フェッチがされたスレッドの識別情報を保持する２値保持部と、
前記２つのスレッドの使用バッファ要素数が同数の場合に、前記２値保持部の情報を反転する反転部と、を有する請求項６に記載の処理装置。
【請求項９】
前記フェッチスレッド決定部は、分岐予測が失敗したことにより実行停止中にあって命令フェッチができないスレッドと、スレッドに対応する処理においてキャッシュへのアクセスが停滞中のスレッドとを除外する除外部を有する請求項２から８のいずれか１項に記載の処理装置。
【請求項１０】
前記複数のバッファ要素の系列のうち、前記供給部によって実行部に命令が供給されるべき系列に該当する供給スレッドを決定する供給スレッド決定部をさらに備える請求項１から９のいずれか１項に記載の処理装置。
【請求項１１】
前記供給スレッド決定部は、使用バッファ要素数の多いスレッドを優先して供給スレッドに決定する請求項１０に記載の処理装置。
【請求項１２】
前記供給部によって実行部に命令が供給された後の経過時間順に、複数のスレッド間の順序を管理する供給順序管理部をさらに備え、
供給スレッド決定部は、前記経過時間の長いスレッドを前記供給スレッドに決定する請求項１０または１１に記載の処理装置。
【請求項１３】
前記供給順序管理部は、実行中の複数のスレッドのスレッド識別情報を前記経過時間順に保持するスレッドレジスタと、
前記供給スレッド決定部によって決定されたスレッドのスレッド識別情報と前記それぞれのスレッドレジスタ内のスレッド識別情報との一致を判定する比較部と、
前記比較回路によって、前記一致が判定されたスレッド識別情報を前記経過時間順の最後尾のスレッドレジスタに移動するとともに、前記最後尾に移動されたスレッド識別情報が移動前に保持されていたスレッドレジスタより後方のスレッドレジスタに保持されたスレッド識別情報をそれぞれ１つずつ前方に移動するシフト制御部と、を有する請求項１２
に記載の処理装置。
【請求項１４】
前記処理装置において同時に処理可能なスレッド数が２に限定されており、
前記供給順序管理部は、
２つのスレッドの使用バッファ数が同数か否かを判定する同数判定部と、
命令が供給されたスレッドの識別情報を保持する２値保持部と、
前記２つのスレッドの使用バッファ要素数が同数の場合に、前記２値保持部の情報を反転する反転部と、を有する請求項１２に記載の処理装置。
【請求項１５】
命令供給中のスレッドの識別情報を保持するトレースレジスタと、
命令供給が待ち状態にあるスレッドの識別情報を保持するトレース待ちレジスタと、
前記トレースレジスタの保持する情報と前記トレース待ちレジスタの保持する情報とを入れ替える入れ替え部と、をさらに有する請求項１２から１４のいずれか１項に記載の処理装置。
【請求項１６】
前記トレース待ちレジスタは複数設けられ、
前記供給スレッド決定部によって決定されたスレッドの識別情報にしたがって、前記トレース待ちレジスタの１つが決定され、
前記入れ替え部は、前記トレースレジスタが保持する情報と前記決定されたトレース待ちレジスタが保持する情報とを入れ替える請求項１５に記載の処理装置。
【請求項１７】
前記制御部は、命令の保持が不要となったバッファ要素を解放する解放部を有する請求項１から１６のいずれか１項に記載の処理装置。
【請求項１８】
前記バッファ要素またはバッファ要素の系列に割り当てられているスレッドの識別情報を保持する識別情報保持をさらに備え、
前記解放部は、いずれかのスレッドに割り当てられたバッファ要素の系列に含まれるバッファ要素で未供給の命令を格納したバッファ要素を解放するキャンセル信号が発せられたときに、前記スレッドを識別する識別情報から解放すべきバッファ要素の選択信号を生成する選択部を有する、請求項１７に記載の処理装置。
【請求項１９】
前記バッファ要素の系列がループを形成しているときに、その系列のいずれかのバッファ要素を保持する起点レジスタをさらに備え、
前記解放部は、いずれかのスレッドに割り当てられたバッファ要素の系列に含まれるバッファ要素で未供給の命令を格納したバッファ要素を解放するキャンセル信号が発せられたときに、前記そのスレッドに対応する起点レジスタによって示されるバッファ要素を選択して解放する第１の解放処理部と、
前記解放されたバッファ要素と接続関係を定義されたバッファ要素を前記ポインタ部の指定にしたがって、順次解放する第２の解放処理部と、を有する請求項１７または１８に記載の処理装置。
【請求項２０】
前記バッファ要素の系列がループを形成しているときに、その系列のいずれかのバッファ要素を前記スレッドごとに保持する起点レジスタと、
分岐予測がなされた分岐先アドレス、または分岐予測がはずれて分岐予測の結果読み出された命令が無効とされた後に命令の読み出しを開始すべき読み出し開始先アドレスをスレッドごとに前記起点レジスタに設定する起点設定部と、
分岐予測部で分岐前のアドレスに対して予測された分岐予測先アドレスが前記起点レジスタで保持するアドレスと一致したときに、前記分岐前のアドレスにて読み出された命令を格納するバッファ要素の分岐方向ポインタ部に前記起点レジスタで保持するバッファ要素の識別情報を設定する分岐方向ポインタ設定部とをさらに備える請求項４から１９のい
ずれか１項に記載の処理装置。
【請求項２１】
複数の命令によって処理が構成され、互いに独立に実行可能な複数の処理のそれぞれがスレッドとして識別される処理装置であって、
前記命令を実行する実行部と、
前記命令の優先順を管理する順序管理部とを備え、
前順序管理部は、実行中の複数のスレッドのスレッド識別情報を優先順に保持するスレッドレジスタと、
前記所定の制御がなされたスレッドのスレッド識別情報と前記それぞれのスレッドレジスタ内のスレッド識別情報との一致を判定する比較部と、
前記比較部によって前記一致が判定されたスレッド識別情報を前記優先順の最後尾のスレッドレジスタに移動するとともに、前記最後尾のスレッドレジスタに移動されたスレッド識別情報を移動前に保持していたスレッドレジスタより後方のスレッドレジスタにそれぞれ保持されていたスレッド識別情報を１つずつ前方に移動するシフト制御部と、を有する処理装置。
【請求項２２】
複数の処理対象に対して処理が実行されるときに、その処理が実行される処理対象の優先順を管理する管理装置であり、
前記処理が実行される優先順に、前記処理対象を識別する識別情報を保持する保持部の列と、
前記いずれかの処理対象に対して前記処理が実行されたときに前記処理対象を識別する識別情報と前記保持部のそれぞれに保持された識別情報との一致を判定する比較部と、
前記比較部によって前記一致が判定された識別情報を前記優先順の最後尾の保持部に移動するとともに、前記最後尾の保持部に移動された識別情報を移動前に保持していた保持部より後方の保持部にそれぞれ保持されていた識別情報を１つずつ前方の保持部に移動するシフト制御部と、を有する管理装置。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】００７７
【補正方法】変更
【補正の内容】
【００７７】
＜命令フェッチアドレスの第二の選択回路の選択信号＞
選択回路を図１０Ａ−１０Ｊに示す。このようにして第一の選択で選択された各スレッドの命令フェッチ要求アドレスに対して、さらに第二の選択を行う。そして最終的に、命令フェッチで使用するアドレス（ＩＦ＿ＲＥＱ＿ＡＤＤＲＥＳＳ）を得る。
【手続補正３】
【補正対象書類名】明細書
【補正対象項目名】０１０６
【補正方法】変更
【補正の内容】
【０１０６】
一方、図１０Ｊにおいて、ＢＯＴＨ＿ＶＡＬＩＤがオフ、すなわち、現在使用中の命令バッファ１の数が２つのスレッドについて同数でない場合、一方の入力が反転されたＡＮＤゲートＧ２によって使用中の命令バッファ１の数でスレッドが決定される。例えば、スレッド０の使用中の命令バッファ１の数が少ない場合、ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤは０となる。また、スレッド１が選択された場合、ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤは１なる。このようにして、スレッド数を２に限定した場合には、図１０Ｂ−１０Ｇと比
較して簡略な回路でスレッドを選択できる。
【手続補正４】
【補正対象書類名】明細書
【補正対象項目名】０１１０
【補正方法】変更
【補正の内容】
【０１１０】
命令フェッチ要求部２は、このようにして選択された命令フェッチ要求アドレスを送出する。命令フェッチ要求送出のバリッド信号をＩＦ＿ＲＥＱ＿ＶＡＬＩＤとする。このとき、命令バッファ制御部８は、命令フェッチの度に、新たな命令フェッチデータを格納するための命令バッファ１を現在使用されていない（＝バリッドが立っていない）命令バッファ１の中から１つ選択する（ＩＦ＿ＲＥＱ＿ＩＤ）。このときのスレッドの識別子ＩＦ＿ＲＥＱ＿ＴＨＲＥＡＤ＿ＩＤで示されるスレッドに、選択された命令バッファ１は所属することになる。
【手続補正５】
【補正対象書類名】図面
【補正対象項目名】図５
【補正方法】変更
【補正の内容】
【図５】
2008155834.tif 000051
【手続補正６】
【補正対象書類名】図面
【補正対象項目名】図７
【補正方法】変更
【補正の内容】
【図７】
2008155834.tif 000052
【手続補正７】
【補正対象書類名】図面
【補正対象項目名】図１２Ｂ
【補正方法】変更
【補正の内容】
【図１２Ｂ】
2008155834.tif 000053
【手続補正８】
【補正対象書類名】図面
【補正対象項目名】図１２Ｃ
【補正方法】変更
【補正の内容】
【図１２Ｃ】
2008155834.tif 000054
【手続補正９】
【補正対象書類名】図面
【補正対象項目名】図１２Ｄ
【補正方法】変更
【補正の内容】
【図１２Ｄ】
2008155834.tif 000055
【国際調査報告】
2008155834.tif 000056
2008155834.tif 000057
2008155834.tif 000058
2008155834.tif 000059
2008155834.tif 000060