(57)【要約】  本発明は、一時には１つのスレッドについて複数の命令を同時に保持してその保持している命令を解読するデコード部１０９と、デコード部１０９で解読された命令の処理を実行する、互いに異なるスレッドに属する複数の命令それぞれが表す処理を同時に実行可能な実行パイプライン２２０と、デコード部１０９によって解読済の命令を受け取り実行パイプライン２２０に渡す、その解読済の命令が、シンク属性の命令である場合には、その命令が実行可能な条件が整うまで保持した後で実行パイプライン２２０に渡すリザベーションステーション２１０と、デコード部１０９よりも前に簡易な解読によってその命令がシンク属性の命令であるか否かを確認するプリデコード部１０８と、シンク属性の命令よりも後続の命令についてはデコード部１０９への投入を中断して保持する命令バッファ１０４とを備えた。
2008155839.tif 000002
【特許請求の範囲】
【請求項１】
複数の命令列を有するスレッドのうち、所定数の命令を同時にデコードするデコード部と、
前記デコード部が解読した命令を実行する命令実行部と、
前記デコード部が解読する命令が、所定の禁止条件により前記スレッドにおいて先行する他の命令との同時実行が禁止されるか否かを判定するプリデコード部と、
前記デコード部が解読した命令が、前記判定により同時実行が禁止される場合には、前記禁止が解除されるまで当該命令を保持する命令保持部と、
前記デコード部が解読した命令が、前記判定により同時実行が禁止される場合には、前記解読した命令の後続命令を前記デコード部に投入せずに保持する命令投入部とを有することを特徴とする命令処理装置。
【請求項２】
前記命令投入部が、前記デコード部に命令を投入せずに保持した場合には、その命令が属するスレッドとは別のスレッドから入手した命令を前記デコード部に投入するものであることを特徴とする請求項１記載の命令処理装置。
【請求項３】
前記命令投入部が、前記同時実行が禁止される命令よりも前記スレッド中で後続の命令について前記デコード部に投入せずに保持している場合に、該同時実行が禁止される命令が実行可能な条件が整ったことを表す情報を入手してその保持している命令について前記デコード部への投入を再開するものであることを特徴とする請求項１または２記載の命令処理装置。
【請求項４】
前記プリデコード部が、命令に、前記同時実行が禁止される命令であるか否かを表すフラグを付すものであり、
前記命令投入部が、前記フラグが付された命令を前記デコード部への投入用に、スレッド毎に、スレッド中の順序と同じ順序で積んでおく命令バッファ部分を備え、該命令バッファ部分に積まれている命令を、積まれている順に前記デコード部へ投入する、前記フラグが前記同時実行が禁止される命令であることを示している命令の後の命令については投入せずに保持するものであることを特徴とする請求項１から３のうちいずれか１項記載の命令処理装置。
【請求項５】
前記命令保持部が、前記同時実行が禁止される命令を複数保持していてそれら複数の命令について実行可能な条件が同時に整った場合には、それら複数の命令のうち先に保持した命令を先に前記実行部に渡すものであることを特徴とする請求項１から４のうちいずれか１項記載の命令処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、処理を表す命令の連なりからなるスレッドを複数同時に実行する同時マルチスレッディング機能を備えた命令処理装置に関する。
【背景技術】
【０００２】
処理を表す命令は、ＣＰＵに代表される命令処理装置の内部において、命令の取込み（フェッチ）、命令の解読（デコード）、命令の実行、実行結果の確定（コミット）等といった一連の段階を経て処理される。従来、命令処理装置におけるこのような各段階の処理を高速化するために、パイプラインと呼ばれる処理機構がある。パイプラインでは、フェッチやデコード等といった各段階の処理が、各々独立の小機構で行われる。これにより、例えばある命令の実行と同時並行に別の命令を実行すること等が可能となり、命令処理装置における処理が高速化される。【０００３】
近年では、このようなパイプラインを複数備え、一層の処理の高速化が図られたスーパースカラと呼ばれる処理機構が一般化しつつある。そして、このスーパースカラにおける処理のさらなる高速化を実現する機能として、アウト・オブ・オーダ実行と呼ばれる機能がある。【０００４】
図１は、スーパースカラにおけるアウト・オブ・オーダ実行を示す概念図である。【０００５】
この図１には、スーパースカラにおけるアウト・オブ・オーダ実行の一例が示されている。【０００６】
図１の例では、４つの命令が処理されている。各命令は、フェッチ（ステップＳ５０１）、デコード（ステップＳ５０２）、実行（ステップＳ５０３）、およびコミット（ステップＳ５０４）という４段階を経て処理される。ここで、フェッチ（ステップＳ５０１）、デコード（ステップＳ５０２）、およびコミット（ステップＳ５０４）は、４つの命令に対して、プログラム上での処理順で処理を実行するイン・オーダ実行によって行われる。そして、命令の実行（ステップＳ５０３）が、プログラム上での処理順によらずに実行するアウト・オブ・オーダ実行によって行われる。【０００７】
４つの命令は、プログラム上での処理順でフェッチ（ステップＳ５０１）されてデコード（ステップＳ５０２）された後、その処理順にはよらず、実行（ステップＳ５０１）に必要な計算データ等（オペランド）が得られたものから実行（ステップＳ５０３）にうつされる。図１の例では、４つの命令についてオペランドが同時に得られ、各命令が互いに同時にスタートしている。【０００８】
このように、アウト・オブ・オーダ実行によれば、複数の命令をプログラム上での処理順によらず同時並行に処理することができるので、命令処理装置における処理が高速化される。【０００９】
実行（ステップＳ５０３）後には、４つの命令についてのコミット（ステップＳ５０４）がイン・オーダ実行によってプログラム上での処理順で行われる。この処理順での先行命令よりも先に実行（ステップＳ５０３）が終了した後続命令は、先行命令の実行（ステップＳ５０３）が終了するまでコミット待ちの状態となる。図１の例では、４つの命令に対する実行（ステップＳ５０３）が、４段に分けて図示されており、図中で上段のもの程プログラム上での処理順が早い。この図１の例では、最上段に図示され処理順が最も早い命令の実行（ステップＳ５０３）に最も時間がかかっているため、他の３つの命令についてはコミット待ちとなっている。【００１０】
ところで、近年、命令処理装置で処理されるプログラムの多くは、一連の複数の命令からなり互いに同時並行に実行することが可能な処理単位（スレッド）を複数組み合わせて構成されている。【００１１】
命令処理装置の多くは、命令を実行するために複数の演算器を備えている。そして、命令実行の際には、多くの場合、各サイクルにおいてそれら複数の演算器のうちの一部しか使用されないため、演算器の稼働率にはかなりの余裕がある。【００１２】
そこで、演算器の稼働率を向上させる技術として、各サイクルにおいて、あるスレッドについては不使用となった演算器を別のスレッドに割り当てて複数のスレッドの命令を同時並行に処理する同時マルチスレッディング（ＳＭＴ：Ｓｉｍｕｌｔａｎｅｏｕｓ  Ｍｕｌｔｉ  Ｔｈｒｅａｄｉｎｇ）機能という技術が提案されている。【００１３】
図２は、ＳＭＴ機能の一例を概念的に示す図である。【００１４】
この図２では、スレッドＡおよびスレッドＢという２種類のスレッドに属する命令がＳＭＴ機能で実行される様子が示されている。図２における縦軸方向に並ぶ４つの升それぞれは、命令処理装置において命令の実行を行う演算器を表わしており、各升に記載されている「Ａ」および「Ｂ」の文字は、それぞれ、その升に対応する演算器で実行される命令が属するスレッド種類を示している。【００１５】
また、横軸には命令処理装置におけるクロックサイクルが示されている。図２の例では、第１サイクル（ステップＳ５１１）では、上段の２個の演算器でスレッドＡの命令が実行され下段の２個の演算器でスレッドＢの命令が実行されている。第２サイクル（ステップＳ５１２）では、最上段と最下段の２個の演算器でスレッドＡの命令が実行され中段の２個の演算器でスレッドＢの命令が実行されている。また、第３サイクル（ステップＳ５１３）では、上側の３個の演算器でスレッドＡの命令が実行され最下段の１個の演算器でスレッドＢの命令が実行されている。【００１６】
このように、ＳＭＴ機能では、複数のスレッドの命令が各サイクルに同時並行で実行される。【００１７】
図３は、ＳＭＴ機能の一例を示す図２とは別の概念図である。【００１８】
この図３の例では、スレッドＡおよびスレッドＢという２種類のスレッドに属する命令が交互にフェッチされデコードされた後、実行については、各命令の実行に必要なオペランドや演算器が得られた場合に、図２に示したように２種類のスレッド間で、命令の実行が同時並行で行われる。図３の例では、図中で斜線で示したタイミングＴ１において、２種類のスレッド間で、命令の実行が同時並行で行われている。【００１９】
さらに、コミットについては、同一種類のスレッド間では、先行命令のコミットが全て終了するまで後続命令のコミットを行うことができないが、異なる種類のスレッド間では、先行命令のコミットの終了を待たずに後続命令のコミットが行われる。図３の例では、スレッドＡについてフェッチされた命令のコミットの終了を待たずに、スレッドＢについてフェッチされた命令のコミットが行われている。【００２０】
以上、図２および図３を参照して説明したように、ＳＭＴ機能によれば、複数種類のスレッド間で命令の実行が互いに同時並行で実行でき、異なる種類のスレッド間では、先行命令のコミットの終了を待たずに後続命令のコミットを行うことができるので、命令処理装置の処理効率の向上が図られる。【００２１】
このようなＳＭＴ機能を備えた命令処理装置では、複数種類のスレッド間における命令の同時並行での実行を可能とするために、プログラム上でアクセスが指示されるいわゆるプログラム可視の構成要素がスレッド数分備えられている。一方で、演算器やデコード部については複数種類のスレッド間で共通に使用されることが多い。上述したように演算器については、複数の演算器を複数種類のスレッド間で振り分けて使用されるので、各演算器をスレッド数分備えなくても複数種類のスレッド間における命令の同時並行での実行が可能である。しかし、デコード部については、回路構成が複雑で回路規模が大きいために、上記の演算器とは異なり１つしか備えられないことが多い。この場合、デコード部は、複数種類のスレッド間で共通に使用されることとなり、一度には１つのスレッドの命令がデコードできるだけである。ここで、命令の中には、同一スレッド中での先行命令との同時実行が禁止されたものがある。従来、デコードされた命令が、そのような同時実行禁止の命令であった場合、その命令は、実行可能になるまでデコード部に留め置かれる。その結果、デコード部が、同時実行禁止の命令が属するスレッドに占有されてしまい、他のスレッドについてのデコードが実行出来なくなってしまう。【００２２】
ここで、単一スレッドのプログラムを処理するシングルスレッディングタイプの命令処理装置についてであるが、同時実行禁止の命令を、デコード後に、所定のメモリ内に移してデコード部を後続命令に明け渡し、その同時実行禁止の命令については先行命令の実行結果が得られた後に実行するという技術が提案されている（例えば、特許文献１参照。）。この技術によれば、上記のアウト・オブ・オーダ実行が滞りなく行われる。しかし、この技術をＳＭＴ機能を有する命令処理装置に適用しても、同時実行禁止の命令と同じスレッドの後続の命令は、その命令についてコミットが終了するまでコミット待ちとなってしまうので、一時的にデコード部の占有が回避されても、いずれ、そのスレッドの命令によるデコード部の占有が起きてしまう。【００２３】
また、１つのスレッドの命令が同時実行禁止の命令であった場合に、デコード後の同時実行禁止の命令を無効化してデコード部を他のスレッドに明け渡し、その同時実行禁止の命令についてはフェッチからやり直すという技術も提案されている（例えば、特許文献２参照。）。
【特許文献１】特開平７−２７１５８２号公報
【特許文献２】特開２００１−３５６９０３号公報
【００２４】
しかしながら、上記の特許文献２に記載の技術では、同時実行禁止の命令については改めてフェッチからやり直すことになるので、その命令について一旦行われたフェッチやデコードが無駄になっていしまい、命令処理装置における処理の効率が低下してしまうという問題がある。【００２５】
本発明は、上記事情に鑑み、命令を効率良く処理することができる命令処理装置を提供することを目的とする。
【発明の開示】
【００２６】
上記目的を達成する本発明の命令処理装置は、
複数の命令列を有するスレッドのうち、所定数の命令を同時にデコードするデコード部と、
上記デコード部が解読した命令を実行する命令実行部と、
上記デコード部が解読する命令が、所定の禁止条件により上記スレッドにおいて先行する他の命令との同時実行が禁止されるか否かを判定するプリデコード部と、
上記デコード部が解読した命令が、上記判定により同時実行が禁止される場合には、上記禁止が解除されるまで当その命令を保持する命令保持部と、
上記デコード部が解読した命令が、上記判定により同時実行が禁止される場合には、上記解読した命令の後続命令を上記デコード部に投入せずに保持する命令投入部とを有することを特徴とする。
【００２７】
ここで、本発明の命令処理装置において、
「上記命令投入部が、上記デコード部に命令を投入せずに保持した場合には、その命令が属するスレッドとは別のスレッドから入手した命令を上記デコード部に投入するものである」という形態は典型的な形態である。
【００２８】
この本発明の命令処理装置によれば、解読済の命令が同一スレッド中で先行する他の命令との同時実行が禁止される命令である場合には、その命令が上記命令保持部で保持され、同一スレッド中での後続命令については上記デコード部に投入されずに保持される。これにより、例えば、その同時実行が禁止される命令によって上記デコード部が占有されて、他のスレッドの命令の解読が阻害されるといった事態が回避される。また、上記後続命令については、上記命令投入部で保持されるので、その後続の命令に対する入手処理が無駄にならず効率的である。つまり、この本発明の命令処理装置によれば、命令を効率良く処理することができる。
【００２９】
また、本発明の命令処理装置において、
「上記命令投入部が、上記同時実行が禁止される命令よりも上記スレッド中で後続の命令について上記デコード部に投入せずに保持している場合に、その同時実行が禁止される命令が実行可能な条件が整ったことを表す情報を入手してその保持している命令について上記デコード部への投入を再開するものである」という形態は好ましい形態である。
【００３０】
この好ましい形態の命令処理装置によれば、上記後続命令についての投入の再開を、上記情報を手掛かりにすることで一層確実に行うことができる。
【００３１】
また、本発明の命令処理装置において、
「上記プリデコード部が、命令に、上記同時実行が禁止される命令であるか否かを表すフラグを付すものであり、
上記命令投入部が、上記フラグが付された命令を上記デコード部への投入用に、スレッド毎に、スレッド中の順序と同じ順序で積んでおく命令バッファ部分を備え、その命令バッファ部分に積まれている命令を、積まれている順に上記デコード部へ投入する、上記フラグが上記同時実行が禁止される命令であることを示している命令の後の命令については投入せずに保持するものである」という形態も好ましい形態である。
【００３２】
この好ましい形態の命令処理装置によれば、上記前解読部によって命令に付されるフラグを手掛かりにすることで、上記所定タイプの命令の後続の命令についての投入を一層確実に中断することができる。
【００３３】
また、本発明の命令処理装置において、
「上記命令保持部が、上記同時実行が禁止される命令を複数保持していてそれら複数の命令について実行可能な条件が同時に整った場合には、それら複数の命令のうち先に保持した命令を先に上記実行部に渡すものである」という形態も好ましい。
【００３４】
上述したように、本発明の命令処理装置では、あるスレッドについて、上記命令保持部に同時に保持される、上記同時実行が禁止される命令の数は１つである。しかし、複数のスレッドについて、この上記同時実行が禁止される命令が命令保持部に保持される可能性はある。この好ましい形態の命令処理装置によれば、このような場合、上記複数の命令について実行可能な条件が同時に整ったときには、先に保持した命令から優先的に上記実行部に渡される。これにより、あるスレッドにおける上記所定タイプの命令が命令保持部にいつまでも残されるといった不具合が確実に回避されることになる。
【００３５】
本発明によれば、命令を効率良く処理することができる命令処理装置を得ることができる。
【図面の簡単な説明】
【００３６】
【図１】スーパースカラにおけるアウト・オブ・オーダ実行を示す概念図である。
【図２】ＳＭＴ機能の一例を概念的に示す図である。
【図３】ＳＭＴ機能の一例を示す図２とは別の概念図である。
【図４】命令処理装置の一実施形態であるＣＰＵを示すハードウェア構成図である。
【図５】図４のＣＰＵ１０におけるシンク属性の命令に係わる処理を示す概念図である。
【図６】図４のＣＰＵ１０を、シンク属性の命令に係わる処理について説明するために一部を簡略化し、一部を機能ブロックで示した図である。
【図７】命令バッファ１０４が、シンク属性の命令までデコード部１０９へ投入し、後続の命令については投入を中断し保持する様子を示す図である。
【図８】リザベーションステーションが有するエントリの詳細を示す図である。
【図９】ＣＳＥ１２７において、レジスタの更新が、イン・オーダ実行により行われる仕組みを示す概念図である。
【図１０】非オールデストタイプの命令について、シンクフラグのリセットが可能か否かをチェックするためのチェック回路を示す図である。
【図１１】調停回路を示す図である。
【図１２】リードポートが２個備えられた例を示す図である。
【図１３】本実施形態において、リードポートが１個備えられている様子を示す図である。
【図１４】オールデストタイプの命令について、シンクフラグのリセットが可能か否かをチェックするためのチェック回路を示す図である。
【発明を実施するための最良の形態】
【００３７】
以下図面を参照して命令処理装置の一実施形態について説明する。【００３８】
図４は、命令処理装置の一実施形態であるＣＰＵを示すハードウェア構成図である。【００３９】
この図４に示すＣＰＵ１０は、２種類のスレッドの命令を同時に処理するＳＭＴ機能を有する命令処理装置であり、このＣＰＵ１０では、次の７つのステージの処理が順次に行われる。即ち、２種類のスレッドの命令を交互にイン・オーダ実行でフェッチするフェッチステージ（ステップＳ１０１）、フェッチされた命令が表している処理をイン・オーダ実行でデコードするデコードステージ（ステップＳ１０２）、デコードされた命令を、その命令の処理の実行に要する演算器に接続されている後述のリザベーションステーションにイン・オーダ実行で格納し、その格納した命令を演算器にアウト・オブ・オーダ実行で引き渡すディスパッチステージ（ステップＳ１０３）、リザベーションステーションに格納された命令の実行に必要なオペランドをレジスタからアウト・オブ・オーダ実行で読み出すレジスタ読出しステージ（ステップＳ１０４）、リザベーションステーションに格納された命令をレジスタから読み出されたオペランドを使ってアウト・オブ・オーダ実行で実行する実行ステージ（ステップＳ１０５）、ＣＰＵ１０外のメモリへの実行結果の記録等をアウト・オブ・オーダ実行で行うメモリステージ（ステップＳ１０６）、および、実行結果に従ってオペランド格納用のレジスタ等を更新してその実行結果をプログラムから可視の状態にするコミットをイン・オーダ実行で行うコミットステージ（ステップＳ１０７）という７つのステージの処理が順次に行われる。【００４０】
以下、各ステージについて詳しく説明する。【００４１】
フェッチステージ（ステップＳ１０１）では、２種類のスレッド（スレッド０，スレッド１）それぞれについて用意されている２つのプログラムカウンタ１０１が、各スレッドの記載順で何番目の命令を取り込むかを指示する。そして、各プログラムカウンタ１０１が命令の取込み（フェッチ）を指示するタイミングで、命令フェッチ部１０２が、命令１次キャッシュ１０３からその指示された命令を命令バッファ１０４に取り込む。２つのプログラムカウンタ１０１は交互に動作し、１度のフェッチでは、いずれか一方のプログラムカウンタ１０１が、対応するスレッドの命令の取込みを指示する。また、本実施形態では、１回のフェッチで、８個の命令の取込みがイン・オーダ実行によりスレッド中の処理順で行われる。ここで、イン・オーダ実行による処理順がスレッド中での命令の記載順から分岐する場合がある。このＣＰＵ１０は、このような分岐の有無、および、スレッド中における分岐先を予測する分岐予測部１０５を備えている。そして、命令フェッチ部１０２は、その分岐予測部１０５の予測結果を参照してフェッチを行う。【００４２】
ここで、本実施形態のＣＰＵ１０で実行されるプログラムは、不図示の外部メモリに格納されている。そして、ＣＰＵ１０は、このＣＰＵ１０に内蔵され２次キャッシュ１０６に接続されたシステムバスインタフェース１０７を介してその外部メモリ等と接続されている。プログラムカウンタ１０１が命令のフェッチを指示すると、命令フェッチ部１０２が、分岐予測部１０５の予測結果を参照して命令１次キャッシュ１０３に８個の命令を要求する。すると、要求された８個の命令が、外部メモリから、システムバスインタフェース１０７と２次キャッシュ１０６とを経由して命令１次キャッシュ１０３に入力され、命令１次キャッシュ１０３がそれらの命令を命令バッファ１０４に引き渡す。このとき、本実施形態では、その引渡しに当たって、プリデコード部１０８が各命令に対して簡易的なデコード（プリデコード）を施す。そして、プリデコード部１０８は、命令バッファ１０４に引き渡される各命令に、そのプリデコードによる後述する結果を表すフラグを付す。【００４３】
デコードステージ（ステップＳ１０２）では、命令バッファ１０４が、命令フェッチ部１０２によって取り込まれ保持している８個の命令のうち４個の命令をデコード部１０９にイン・オーダ実行で投入する。デコード部１０９は、投入された４個の命令それぞれをイン・オーダ実行でデコードする。また、デコードの際には、各命令に対して、命令識別子（ＩＩＤ：Ｉｎｓｔｒｕｃｔｉｏｎ  ＩＤｅｎｔｉｆｉｃａｔｉｏｎ）として「０」から「６３」の番号が、各スレッドについてデコード順に割り振られる。ここで、本実施形態では、スレッド０の命令がデコードされる際には、「０」から「３１」のＩＩＤが割り振られ、スレッド１の命令がデコードされる際には、「３２」から「６３」のＩＩＤが割り振られる。このとき、デコード部１０９は、スレッド０用に３２個、スレッド１用に３２個の合計６４個のエントリを有する後述のコミットスタックエントリ（ＣＳＥ）１２７の、デコード対象の命令が属するエントリ群における空きエントリに、デコード対象の命令に割り振ったＩＩＤをセットする。【００４４】
デコード部１０９が、各々ＩＩＤが割り振られたデコード済みの４個の命令それぞれについて、各命令の処理の実行に要する演算器を決定する。そして、デコード済みの各命令を、その命令の処理の実行に要する演算器に接続されているリザベーションステーションにイン・オーダ実行で格納する。【００４５】
リザベーションステーションは、複数のデコード済みの命令を保持し、ディスパッチステージ（ステップＳ１０３）では、各命令をアウト・オブ・オーダ実行で演算器に引き渡す。即ち、リザベーションステーションは、スレッド中の処理順に係わり無く、処理の実行に必要なオペランドと演算器とが確保された命令から演算器に引き渡す。このとき、引渡し可能な命令が複数存在する場合には、それら複数の命令のうち先にデコードされた命令から演算器に引き渡す。本実施形態のＣＰＵ１０には、次の４種類のリザベーションステーションが備えられている。即ち、アドレス生成用リザベーションステーション（ＲＳＡ：Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  Ａｄｄｒｅｓｓ  ｇｅｎｅｒａｔｉｏｎ）１１０、整数演算用リザベーションステーション（ＲＳＥ：Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  ｆｉｘ  ｐｏｉｎｔ  Ｅｘｅｃｕｔｉｏｎ）１１１、浮動小数点演算用リザベーションステーション（ＲＳＦ：Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  Ｆｌｏａｔｉｎｇ  ｐｏｉｎｔ）１１２、および、分岐用リザベーションステーション（ＲＳＢＲ：Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  ＢＲａｎｃｈ）１１３の４種類のリザベーションステーションが備えられている。ここで、ＲＳＡ１１０とＲＳＥ１１１とＲＳＦ１１２とは、それぞれ対応する演算器に、オペランド格納用のレジスタを介して接続されている。これに対し、ＲＳＢＲ１１３は、上記の分岐予測部１０５に接続されており、分岐予測部１０５での予測結果の確定待ちや、予測失敗の場合の命令の再フェッチ指示等を行う役割を担っている。【００４６】
レジスタ読出しステージ（ステップＳ１０４）では、レジスタ内のオペランドがアウト・オブ・オーダ実行で読み出される。即ち、スレッド中の処理順に係わり無く、命令を演算器に引き渡したリザベーションステーションに接続されているレジスタ内のオペランドが読み出され、対応する演算器に渡される。ＣＰＵ１０には、整数系レジスタ（ＧＰＲ：Ｇｅｎｅｒａｌ  Ｐｕｒｐｏｓｅ  Ｒｅｇｉｓｔｅｒ）１１４と浮動小数点系レジスタ（ＦＰＲ：Ｆｌｏａｔｉｎｇ  Ｐｏｉｎｔ  Ｒｅｇｉｓｔｅｒ）１１６との２種類のレジスタが備えられている。ここで、ＧＰＲ１１４およびＦＰＲ１１６は、両方ともプログラム可視のレジスタであり、スレッド０とスレッド１とのそれぞれについて備えられている。また、ＧＰＲ１１４およびＦＰＲ１１６それぞれには、命令の実行結果を各レジスタの更新のときまで保持するバッファが接続されている。ＧＰＲ１１４には、整数系レジスタ更新バッファ（ＧＵＢ：ＧＰＲ  Ｕｐｄａｔｅ  Ｂｕｆｆｅｒ）１１５が接続され、ＦＰＲ１１６には、浮動小数点系レジスタ更新バッファ（ＦＰＲ：ＦＰＲ  Ｕｐｄａｔｅ  Ｂｕｆｆｅｒ）１１６が接続されている。【００４７】
アドレス生成および整数演算は、整数のオペランドを使って行われるので、ＧＰＲ１１４は上記のＲＳＡ１１０とＲＳＥ１１１とに接続されている。また、本実施形態では、ＧＰＲ１１４の更新前の段階のＧＵＢ１１５に保持されているオペランドを使った整数演算も許可されているので、このＧＵＢ１１５もＲＳＡ１１０とＲＳＥ１１１とに接続されている。また、浮動小数点演算は、浮動小数点形式のオペランドを使って行われるので、ＦＰＲ１１６は上記のＲＳＦ１１２に接続されている。また、本実施形態では、ＦＵＢ１１７に保持されているオペランドを使った浮動小数点演算も許可されているので、ＦＵＢ１１７もＲＳＦ１１２に接続されている。【００４８】
また、本実施形態のＣＰＵ１０には、２つのアドレス生成演算器（ＥＡＧＡとＥＡＧＢ：Ｅｆｆｅｃｔｉｖｅ  Ａｄｄｒｅｓｓ  Ｇｅｎｅｒａｔｉｏｎ  ｕｎｉｔｓ  Ａ  ａｎｄ  Ｂ）１１８，１１９、２つの整数演算器（ＥＸＡとＥＸＢ）１２０，１２１、および、２つの浮動小数点演算器（ＦＬＡとＦＬＢ）１２２，１２３が備えられている。そして、ＧＰＲ１１４とＧＵＢ１１５は、整数のオペランドを使うＥＡＧＡ１１８とＥＡＧＢ１１９とＥＸＡ１２０とＥＸＢ１２１とに接続されており、ＦＰＲ１１６とＦＵＢ１１７は、浮動小数点形式のオペランドを使うＦＬＡ１２２とＦＬＢ１２３とに接続されている。【００４９】
実行ステージ（ステップＳ１０５）では、演算器によって命令の実行がアウト・オブ・オーダ実行で行われる。即ち、スレッド中の処理順に係わり無く、上記の複数種類の演算器のうち、リザベーションステーションから命令が渡され、レジスタから演算に必要なオペランドが渡された演算器が、その渡された命令の処理を、その渡されたオペランドを使って実行する。また、実行ステージ（ステップＳ１０５）では、ある演算器の実行中に、別の演算器に命令とオペランドの引渡しが行われたときには、それらの演算器が同時並行に処理を実行する。【００５０】
この実行ステージ（ステップＳ１０５）では、ＥＡＧＡ１１８に、ＲＳＡ１１０からアドレス生成処理の命令が渡され、ＧＰＲ１１４から整数のオペランドが渡されると、ＥＡＧＡ１１８は、その整数のオペランドを使ってアドレス生成処理を実行する。また、ＥＸＡ１２０に、ＲＳＥ１１１から整数演算処理の命令が渡され、ＧＰＲ１１４から整数のオペランドが渡されると、ＥＸＡ１２０は、その整数のオペランドを使って整数演算処理を実行し、ＦＬＡ１２２に、ＲＳＦ１１２から浮動小数点演算処理の命令が渡され、ＦＰＲ１１６から浮動小数点形式のオペランドが渡されると、ＦＬＡ１２２は、その浮動小数点形式のオペランドを使って浮動小数点演算処理を実行する。【００５１】
ＥＡＧＡ１１８およびＥＡＧＢ１１９の実行結果は、システムバスインタフェース１０７を介した外部メモリへのアクセスに使われるので、これらの演算器は、外部メモリからのデータの読出し口であるフェッチポート１２４と、書込み口であるストアポート１２５とに接続されている。ＥＸＡ１２０とＥＸＢ１２１の実行結果は、ＧＰＲ１１４を更新するための中継バッファＧＵＢ１１５に接続され、さらにメモリの更新のための中間バッファの役割を果たす上記のストアポート１２５に接続される。また、ＦＬＡ１２２とＦＬＢ１２３の実行結果は、ＦＰＲ１１６を更新するための中間バッファＦＵＢ１１７に接続され、さらにメモリの更新のための中間バッファの役割を果たす上記のストアポート１２５に接続される。【００５２】
メモリステージ（ステップＳ１０６）では、実行結果の外部メモリへの記録等といった外部メモリへのアクセスがアウト・オブ・オーダ実行で行われる。即ち、そのようなアクセスを要する処理の命令が複数あった場合、スレッド中の処理順に係わり無く実行結果が得られた順でアクセスが行われる。このメモリステージ（ステップＳ１０６）では、アクセスは、データ１次キャッシュ１２６、２次キャッシュ１０６、およびシステムバスインタフェース１０７を介して、フェッチポート１２４やストアポート１２５によって行われる。また、外部メモリへのアクセスが終了すると、フェッチポート１２４やストアポート１２５からＣＳＥ１２７に不図示の接続線を介して実行完了通知が送られる。【００５３】
また、ＥＸＡ１２０、ＥＸＢ１２１、ＦＬＡ１２２、およびＦＬＢ１２３は、煩雑さを避けるために図示が省略された接続線でＣＳＥ１２７に接続されている。そして、各演算器で実行される処理が、外部メモリへのアクセスを必要とせず各演算器での実行の終了をもって完了する処理である場合には、実行の終了時に各演算器からＣＳＥ１２７に実行完了通知が送られる。【００５４】
コミットステージ（ステップＳ１０７）では、ＣＳＥ１２７が、ＧＰＲ１１４、ＦＰＲ１１６、プログラムカウンタ１０１、および、ＣＰＵ１０において上述した処理以外の他の処理に使われるオペランドを保持するコントロールレジスタ１２８を、イン・オーダ実行で次のように更新する。上記の演算器等からＣＳＥ１２７に送られてくる実行完了通知には、その実行完了通知に対応する命令のＩＩＤと、その命令の終了後の更新対象のレジスタ等といった実行結果の確定（コミット）に必要な情報（コミット情報）とが記載されている。ＣＳＥ１２７は、実行完了通知が送られてくると、ＣＳＥ１２７が有する６４個のエントリのうち、実行完了通知に記載のＩＩＤと同じＩＩＤがセットされているエントリに、その実行完了通知に記載のコミット情報を格納する。そして、既に格納されている各命令に対応するコミット情報に従ったレジスタの更新を、イン・オーダ実行により、スレッド中の処理順に従って行う。また、このコミットが終了すると、上記のリザベーションステーションに保持されていた、そのコミットに対応する命令が消去される。【００５５】
ＣＰＵ１０は、概略、このように構成され、以上に説明した７つのステージに沿って動作する。【００５６】
ところで、ＣＰＵ１０で実行される命令の中には、スレッド中で先行する命令の処理の実行結果をオペランドとして使用するために、同一スレッド中で先行する他の命令との同時実行が禁止された命令（シンク属性の命令）がある。ＣＰＵ１０における本実施形態としての特徴は、このシンク属性の命令に係わる処理にある。以下、この点に注目して説明を続ける。【００５７】
図５は、図４のＣＰＵ１０におけるシンク属性の命令に係わる処理を示す概念図である。【００５８】
この図５には、ステップＳ２０１からステップＳ２０６までの間に、スレッド０に属する３つの命令とスレッド１に属する３つの命令とが交互にフェッチされ、各ステップでフェッチされた命令が処理される様子が示されている。ここで、この図５の例では、ステップＳ２０３でフェッチされるスレッド０の２つ目の命令がシンク属性の命令となっている。本実施形態のＣＰＵ１０では、このシンク属性の命令は、図５に示すように、デコード後に、上記のリザベーションステーションにおいて、ステップＳ２０１で処理される先行の命令のコミットが終了して必要なオペランドが得られるまで保持される。【００５９】
さらに、本実施形態のＣＰＵ１０では、上記のフェッチステージ（ステップＳ１０１）において、プリデコード部１０８が、命令バッファ１０４に引き渡される各命令に対してプリデコードを施すことにより、その命令がシンク属性の命令であるか否かを判定しその命令にその判定結果を表すフラグ（シンクフラグ）を付す。そして、命令バッファ１０４は、渡された命令に付されたシンクフラグがシンク属性であることを示していた場合に、同一スレッド中でのそのシンク属性の命令に後続する命令のデコード部１０９への投入を中断してそれら後続の命令を保持する。この図５の例では、ステップＳ２０５以降に処理されるスレッド０の命令が命令バッファ１０４で保持されることとなる。【００６０】
ここで、本実施形態のＣＰＵ１０では、回路構成が複雑で回路規模が大きいデコード部１０９は、図４に示すように１つだけしか備えられておらず、ＣＰＵ１０は、２種類のスレッド間でこのデコード部１０９が共通に使用される構成になっている。【００６１】
しかしながら、本実施形態では、一方のスレッドの命令がシンク属性の命令であっても、そのシンク属性の命令がリザベーションステーションで保持され、後続の命令が命令バッファ１０４で保持されるので、デコード部１０９がそのシンク属性の命令が属するスレッドから開放され、もう一方のスレッドに明け渡される。これにより、図５に示すように、スレッド０での処理が滞っても、スレッド１での命令が滞りなく処理される。【００６２】
以下、このシンク属性の命令に係わる処理について、図４の説明と一部重複する部分があるが詳細に説明する。【００６３】
図６は、図４のＣＰＵ１０を、シンク属性の命令に係わる処理について説明するために一部を簡略化し、一部を機能ブロックで示した図である。【００６４】
尚、この図６では、図４のブロックと一対一に対応する構成要素については図４と同じ番号を付して示している。【００６５】
ＣＰＵ１０は、スレッド０用プログラムカウンタ１０１＿０とスレッド１用プログラムカウンタ１０１＿１との２つのプログラムカウンタを備えており、これら２つのプログラムカウンタから、命令のフェッチを実行する旨の指示が交互に出される。【００６６】
命令フェッチ１０２は、２つのプログラムカウンタからの指示に応じて、図４の命令１次キャッシュ１０３を介して命令を、命令バッファ１０９に取り込む。このとき、プリデコード部１０８が、各命令がシンク属性の命令であるか否かを判定し、各命令にその判定結果を示すシンクフラグを添付する。【００６７】
命令バッファ１０４は、この取り込まれた命令のデコード部１０９への投入を制御する役割も兼ねており、同一スレッドの命令について、シンク属性の命令まではデコード部１０９へ投入するが、そのシンク属性の命令に後続する命令については投入を中断し保持する。【００６８】
図７は、命令バッファ１０４が、シンク属性の命令までデコード部１０９へ投入し、後続の命令については投入を中断し保持する様子を示す図である。【００６９】
この図７に示すように、命令バッファ１０４は、デコード前の命令が８個、スレッド中の処理順と同じ順序で保持されるエントリ１０４ａを複数段有している。【００７０】
上述したように、命令フェッチ部１０２による１回のフェッチで８個の命令が取り込まれる。そして、それらの命令が取り込まれる際には、プリデコード部１０８によって上記のプリデコードが実行され、各命令にシンク属性か否かを示すフラグが付される。各命令のフラグは、命令バッファ１０４が各エントリ毎に有するフラグ格納部１０４ｂに、８個の命令とフラグとが一対一に対応付けられて格納される。【００７１】
命令バッファ１０４は、エントリ１０４ａに格納されている命令を、順次に４個、デコード部１０９に投入する。このとき、投入対象の命令の中に、シンク属性を示すフラグが付されたものがあった場合には、そのスレッドについてはその命令までで投入を中断し、後続する命令をエントリ１０４ａ中に保持する。図７の例では、あるスレッドについて、４個の命令をデコード部１０９に投入する際に、２番目の命令にシンク属性を示すフラグが付されており、３番目以降の命令の投入が中断されている。デコード部１０９は、１回のデコードで４個の命令のデコードが可能であるが、図７の例のように、命令の投入が途中で中断された場合には、投入された分だけデコードを行う。【００７２】
図６に戻って、説明を続ける。【００７３】
デコード部１０９は、デコード済みの命令を、その命令がシンク属性であるか否かに関わらずリザベーションステーション２１０に渡す。【００７４】
ここで、デコード部１０９は、上述したように、デコード済みの命令に対して、「０」から「６３」のＩＩＤを、各スレッドでのデコード順に割り振る。そして、デコード済みの命令をＩＩＤと共にリザベーションステーション２１０に渡す。また、本実施形態では、ＣＳＥ１２は、上述したように、スレッド０用の３２個のエントリ群１２７＿０と、スレッド１用の３２個のエントリ群１２７＿１とを有している。そして、デコード部１０９は、デコード済みの命令をリザベーションステーション２１０に渡す際には、ＣＳＥ１２７における、デコード対象の命令が属するスレッド用のエントリ群における空きエントリに、デコード対象の命令に割り振ったＩＩＤをセットする。【００７５】
ここで、この図６では、図４に示す４種類のリザベーションステーションが簡略化されて１つのボックスで示されている。リザベーションステーションは、デコード済みの命令が１個ずつ格納されるエントリを複数備えている。【００７６】
図８は、リザベーションステーションが有するエントリの詳細を示す図である。【００７７】
リザベーションステーションのエントリの構造は、図４に示す４種類のリザベーションステーションの間で共通であり、この図８では、図４に示すＲＳＥ１１１とＲＳＡ１１０とを代表例としてエントリの構造が示されている。【００７８】
図８に示すように、各エントリは、そのエントリに記載されている情報が有効な情報であるか否かを示すバリッドタグ１１０ａ，１１１ａと、デコード済みの命令が格納される命令タグ１１０ｂ，１１１ｂと、その命令タグに格納されている命令が後述のオールデストタイプの命令であるか否かを示すオールデストタグ１１０ｃ，１１１ｃと、命令タグに格納されている命令がシンク属性の命令であって同一スレッド中の先行命令のコミット待ちというシンク状態にあるか否かを示す上記のシンクフラグが格納されているシンクタグ１１０ｄ，１１１ｄと、命令タグに格納されている命令に割り振られたＩＩＤを示すＩＩＤタグ１１０ｅ，１１１ｅと、命令タグに格納されている命令が属するスレッドの種類を示すスレッドタグ１１０ｆ，１１１ｆとを有している。【００７９】
また、各エントリの内容は、そのエントリに対応する命令のコミットが終了した時点で消去される。【００８０】
図８の例では、シンク属性の命令の一例として、ＳＰＡＲＣ−Ｖ９アーキテクチャで定義されるｒｄ命令とｍｅｍｂａｒ命令とが示されている。ｒｄ命令は、プロセッサの状態を示す情報を格納するレジスタであるＰＳＴＡＴ（Ｐｒｏｃｅｓｓｏｒ  ＳＴＡＴｅ）レジスタの内容を読み出す命令であって、先行する命令のコミットが終了してＰＳＴＡＴの内容が確定してから実行が可能となる命令である。ｒｄ命令は、実行にあたっては整数演算器が使用されるので、デコード後は、図８に示すように、整数演算器に接続されているＲＳＥ１１１に格納される。【００８１】
また、ｍｅｍｂａｒ命令は、このｍｅｍｂａｒ命令に先行するメモリアクセスする全ての命令を、ｍｅｍｂａｒ命令に続く後続命令が追い抜いて処理を行わないように順序性を守るための命令である。このｍｅｍｂａｒ命令は、アドレス生成用リザベーションステーションＲＳＡ１１０内で最も古い命令（オールデスト）となってから実行されるオールデストタイプの命令である。ｍｅｍｂａｒ命令は、実行にあたってはアドレス生成演算器が使用されるので、デコード後は、図８に示すように、アドレス生成演算器に接続されているＲＳＡ１１０に格納される。【００８２】
再び、図６に戻って説明を続ける。【００８３】
リザベーションステーション２１０は、シンクタグ１１０ｃ，１１１ｄ内のシンクフラグを確認し、シンクフラグがシンク状態が解消されていることを示している場合には、その命令は、シンク属性ではないか、あるいは、シンク属性であってもシンク状態が解消されて実行可能となっていることを意味するので、その命令が、そのリザベーションステーションに対応する実行パイプライン２２０に投入される。【００８４】
また、その命令が、オールデストタイプの命令である場合には、シンクフラグがシンク状態を示している命令で、オールデストタイプであれば先行命令が存在しているとき、リザベーションステーション２１０に保持され、上述したように、同一スレッド中で後続する命令については命令バッファ１０４に保持される。同一スレッド中で先行する命令がリザベーションステーション２１０内に存在しない場合に限り、そのリザベーションステーションに対応する実行パイプライン２２０に投入される。【００８５】
また、その命令が、オールデストタイプの命令である場合には、同一スレッド中で先行する命令がリザベーションステーション２１０内に存在しない場合に限り、そのリザベーションステーションに対応する実行パイプライン２２０に投入される。シンクフラグがシンク状態を示している命令、および、シンクフラグがシンク状態が解消されていることを示していてもオールデストタイプであって先行命令が存在している命令は、リザベーションステーション２１０に保持され、上述したように、同一スレッド中で後続する命令については命令バッファ１０４に保持される。【００８６】
図６の実行パイプライン２２０それぞれは、図４に示す６種類の演算器それぞれに相当する。そして、実行パイプライン２２０での実行が終了すると、実行結果がレジスタ更新バッファ２３０に格納される。このレジスタ更新バッファ２３０は、図４に示すＧＵＢ１１５およびＦＵＢ１１７に相当する。また、実行パイプライン２２０での実行終了時には、ＣＳＥ１２７に向けて実行完了通知が送られる。上述したように実行完了通知には、その実行完了通知に対応する命令のＩＩＤと、その命令のコミットに必要なコミット情報とが記載されている。ＣＳＥ１２７は、実行完了通知が送られてくると、ＣＳＥ１２７が有する６４個のエントリのうち、実行完了通知に記載のＩＩＤと同じＩＩＤがセットされているエントリに、その実行完了通知に記載のコミット情報を格納する。【００８７】
また、ＣＳＥ１２７は、各エントリ群１２７＿０，１２７＿１に格納されている各命令に対応するコミット情報に従ったレジスタの更新を、イン・オーダ実行により、スレッド中の処理順に従って行う命令コミット部１２７＿３を有している。【００８８】
図９は、ＣＳＥ１２７において、レジスタの更新が、イン・オーダ実行により行われる仕組みを示す概念図である。【００８９】
ＣＳＥ１２７が有する上記の命令コミット部１２７＿３は、スレッド０において次にコミットするべき命令のＩＩＤが記載されるスレッド０用アウトポインタ１２７＿３ａと、スレッド１において次にコミットするべき命令のＩＩＤが記載されるスレッド１用アウトポインタ１２７＿３ｂと、実際にコミットする命令を決定するＣＳＥ−ウィンドウ１２７＿３ｃとを有している。【００９０】
ＣＳＥ−ウィンドウ１２７＿３ｃは、スレッド０用アウトポインタ１２７＿３ａのＩＩＤがセットされているエントリと、スレッド１用アウトポインタ１２７＿３ｂのＩＩＤがセットされているエントリとのうちいずれかを選んで、上記のコミット情報が格納されているエントリに対応する命令をコミット対象に決定する。両方のエントリにコミット情報が格納されている場合には、基本的にコミット対象のスレッドを交互に切り替える。【００９１】
このようにコミット対象の命令が決定されると、命令コミット部１２７＿３は、図６に示すように、その命令が属するスレッドに対応するプログラムカウンタおよびコントロールレジスタを更新する。さらに、命令コミット部１２７＿３は、図４のＧＰＲ１１４やＦＰＲ１１６に相当する、スレッド毎に設けられているレジスタ２４０＿０，２４０＿１のうち、コミット対象の命令が属するスレッドに対応するレジスタを更新するようにレジスタ更新バッファ２３０に指示を出す。さらに、ＣＳＥ１２７の各エントリ群１２７＿０，１２７＿１に保持されているそのコミット対象の命令が消去される。【００９２】
ＣＳＥ−ウィンドウ１２７＿３ｃは、スレッド０用アウトポインタ１２７＿３ａのＩＩＤがセットされているエントリと、スレッド１用アウトポインタ１２７＿３ｂのＩＩＤがセットされているエントリとのうち、上記のコミット情報が格納されているエントリに対応する命令をコミット対象に決定する。また、両方のエントリにコミット情報が格納されている場合には、ＩＩＤが古い方の命令をコミット対象に決定する。【００９３】
このようにコミット対象の命令が決定されると、命令コミット部１２７＿３は、図６に示すように、その命令が属するスレッドに対応するプログラムカウンタおよびコントロールレジスタを更新する。さらに、命令コミット部１２７＿３は、図４のＧＰＲ１１４やＦＰＲ１１６に相当する、スレッド毎に設けられているレジスタ２４０＿０，２４０＿１のうち、コミット対象の命令が属するスレッドに対応するレジスタを更新するようにレジスタ更新バッファ２３０に指示を出す。さらに、上記のリザベーションステーション２１０に保持されているそのコミット対象の命令が消去される。【００９４】
本実施形態では、シンク状態のシンクフラグを有する命令について、そのシンクフラグのリセットが可能かどうか、ＣＳＥ１２７によるこのようなコミットが終了する度にチェックされる。このチェックは、スレッド０とスレッド１それぞれについて行われ、シンクフラグのリセットが可能であれば、そのシンクフラグがリセットされる。【００９５】
ここで、本実施形態では、シンクフラグのリセットが可能か否かのチェックするためのチェック回路が設けられているが、そのチェック回路が、例えば上記のｍｅｍｂａｒ命令のようなオールデストタイプの命令と、ｒｄ命令のような非オールデストタイプ命令とで異なっている。【００９６】
以下では、まず、非オールデストタイプの命令についてのチェック回路を、リザベーションステーション２１０のうち、図４のＲＳＥ１１１を代表例に挙げて、ＲＳＥ１１１に保持されている非オールデストタイプの命令についてのチェック回路について説明する。【００９７】
図１０は、非オールデストタイプの命令について、シンクフラグのリセットが可能か否かをチェックするためのチェック回路を示す図である。【００９８】
本実施形態では、あるスレッドにおいてシンク属性の命令がリザベーションステーションに投入された場合、そのスレッド中の後続の命令についてはリザベーションステーションへの投入が中断される。従って、リザベーションステーションには、シンク属性の命令は必ず１個しか投入されないこととなる。そこで、この図１０に示すチェック回路１１１＿１では、まず、チェック対象のスレッドについて、現在シンクフラグがシンク状態を示している１つの命令のＩＩＤが選択される。チェック回路１１１＿１は、この１つの命令のＩＩＤを選択するＩＩＤ選択回路１１１＿１ａを備えている。【００９９】
ＩＩＤ選択回路１１１＿１ａは、各エントリについて、図８に示すバリッドタグ１１１ａの内容と、シンクタグ１１１ｄの内容と、ＩＩＤタグ１１１ｅの内容と、スレッドタグ１１１ｆが示すスレッドがチェック対象のスレッドであるか否かとのＡＮＤを求めるＡＮＤ演算子と、各エントリのＡＮＤ演算子の結果のＯＲを求めるＯＲ演算子とで構成されている。このＩＩＤ選択回路１１１＿１ａによって、チェック対象のスレッドに属し、エントリの内容が有効で、現在シンクフラグがシンク状態にあることを示している１つの命令のＩＩＤが求められる。【０１００】
そして、この図１０に示すチェック回路１１１＿１では、ＩＩＤ選択回路１１１＿１ａで得られたＩＩＤが、ＣＳＥ１２７におけるそのスレッド用のアウトポインタに記載されている、次にコミットするべき命令のＩＩＤとマッチしているか否かが、マッチ確認回路１１１＿１ｂにおいて確認される。マッチ確認回路１１１＿１ｂからは、両者がマッチした場合、即ち、そのＩＩＤの命令に同一スレッド中で先行する命令のコミットが終了しており、そのＩＩＤの命令の実行が可能となっている場合に「１」が出力される。【０１０１】
ここで、上記のＩＩＤ選択回路１１１＿１ａでは、「０」のＩＩＤに対応するエントリが無効であるにも係わらず、シンク状態にある命令のＩＩＤとして「０」のＩＩＤが選択されてしまう可能性がある。このとき、アウトポインタに記載されているＩＩＤが「０」であったとすると、無効なＩＩＤが次にコミットするべき命令のＩＩＤとマッチしていると確認されてしまう。【０１０２】
そこで、この図１０に示すチェック回路１１１＿１には、このような事態を避けるため、シンク状態にある命令に対応するエントリが有効であることを確認するエントリ有効性確認回路１１１＿１ｃが備えられている。このエントリ有効性確認回路１１１＿１ｃは、各エントリについて、図８に示すバリッドタグ１１１ａの内容と、シンクタグ１１１ｄの内容と、スレッドタグ１１１ｆが示すスレッドがチェック対象のスレッドであるか否かとのＡＮＤを求めるＡＮＤ演算子と、各エントリのＡＮＤ演算子の結果のＯＲを求めるＯＲ演算子とで構成されている。このエントリ有効性確認回路１１１＿１ｃによって、チェック対象のスレッドに、エントリの内容が有効で、現在シンクフラグがシンク状態にある１つの命令が確かに存在することが確認される。エントリ有効性確認回路１１１＿１ｃからは、そのような命令が確かに存在する場合に「１」が出力される。【０１０３】
そして、この図１０に示すチェック回路１１１＿１には、マッチ確認回路１１１＿１ｂの確認結果と、エントリ有効性確認回路１１１＿１ｃの確認結果のＡＮＤを求める、リセット決定用ＡＮＤ演算子１１１＿１ｄが備えられている。そして、両者の確認結果がともに「１」であった場合に、リセット決定用ＡＮＤ演算子１１１＿１ｄから「１」が出力される。【０１０４】
本実施形態では、このリセット決定用ＡＮＤ演算子１１１＿１ｄから「１」が出力された場合に、ＲＳＥ１１１内の、チェック対象のスレッドに係る全エントリのシンクフラグのリセットが可能であると決定される。【０１０５】
ここで、本実施形態では、シンクフラグのリセットが可能であるか否かが、スレッド０とスレッド１それぞれについてチェックされる。そのため、これら２種類のスレッドについて同時にシンクフラグのリセットが可能であると決定される場合がある。そこで、本実施形態では、このような場合に、どちらのスレッドのシンクフラグからリセットするかを決定する調停回路が設けられている。【０１０６】
図１１は、調停回路を示す図である。【０１０７】
この図１１に示す調停回路１１１＿２には、スレッド０についてシンクフラグのリセットが可能であり、かつ、スレッド１についてシンクフラグのリセットが可能である場合に、調停を要することを表す値「１」を出力する第１の演算子１１１＿２ａと、調停を要しスレッド１に対応するエントリがＲＳＥ１１１内で最も古い場合に「１」を出力する第２の演算子１１１＿２ｂと、調停を要しスレッド０に対応するエントリがＲＳＥ１１１内で最も古い場合に「１」を出力する第３の演算子１１１＿２ｃと、スレッド０のシンクフラグがリセット可能となっており第３の演算子１１１＿２ｃが「１」を出力した場合にスレッド０のシンクフラグのリセットを決定する第４の演算子１１１＿２ｄと、スレッド１のシンクフラグがリセット可能となっており第２の演算子１１１＿２ｂが「１」を出力した場合にスレッド１のシンクフラグのリセットを決定する第５の演算子１１１＿２ｅとを備えている。この調停回路１１１＿２により、調停を要する場合には、ＲＳＥ１１１内で古い方のスレッドからシンクフラグのリセットが決定されることとなる。また、この調停回路１１１＿２では、調停を要しない場合には、必ずリセット対象となっているスレッドについてシンクフラグのリセットが決定されることとなる。【０１０８】
このように、調停回路１１１＿２でリセット対象のスレッドが決定されると、同時に、命令バッファ１０４に対して、そのスレッドについてのデコード部１０９への命令の投入の再開が指示される。【０１０９】
ところで、ここに説明したＲＳＥ１１１におけシンクフラグのリセットと命令の投入の再開のプロセスは、上記のｒｄ命令に適用される。上述したようにｒｄ命令では、プロセッサの状態を示す情報を格納するレジスタであるＰＳＴＡＴレジスタの内容が読み出される。ここで、ＣＰＵ１０では、ＰＳＴＡＴレジスタは、２種類のスレッドそれぞれについて設けられている。【０１１０】
ここで、本実施形態とは異なり、図１１に示す調停回路１１１＿２が備えられていない場合、上記のように２種類のスレッドが同時にシンクフラグのリセット対象となったときの２つのｒｄ命令の実行に対応する最も単純な方法は、ＰＳＴＡＴレジスタからデータを読み出すリードポートをスレッド数分すなわち２個備えることである。【０１１１】
図１２は、リードポートが２個備えられた例を示す図である。【０１１２】
この図１２の例では、スレッド０用のＰＳＴＡＴレジスタ５０１とスレッド１用のＰＳＴＡＴレジスタ５０２との２つのＰＳＴＡＴレジスタが設けられており、それぞれのＰＳＴＡＴレジスタについて、スレッド０用のリードポート５０３とスレッド１用のリードポート５０４とが設けられている。ＰＳＴＡＴレジスタは、複数のレジスタ部分で構成されており、各リードポートは、各スレッドのｒｄ命令の実行時には、ｒｄ命令中で指定されているリードアドレスに対応するレジスタ部分のデータの読出しを、図１２に示すように各々独立に実行する。ここで、このようなリードポートは回路規模が大きく、この図１２に示すようにリードポートをスレッド数分設けてしまうとＣＰＵ全体における回路規模の増大を招いてしまう。【０１１３】
しかしながら、本実施形態では、図１１に示す調停回路１１１＿２が備えられており、１回に実行されるｒｄ命令は、２種類のスレッドのうちのいずれか一方のみである。そこで、本実施形態では、リードポートの数を１つに抑えて、その１つのリードポートが２種類のスレッドについて共通に使用されるようになっている。【０１１４】
図１３は、本実施形態において、リードポートが１個備えられている様子を示す図である。【０１１５】
この図１３に示すように、本実施形態では、まず、ＰＳＴＡＴレジスタ２５０における複数のレジスタ部分２５１それぞれが、スレッド０用のレジスタ部分２５１＿０とスレッド１用のレジスタ部分２５１＿１とで構成されている。そして、このＰＳＴＡＴレジスタ２５０に対して、１個のリードポート２６０が備えられている。【０１１６】
本実施形態では、ＲＳＥ１１１においてスレッド０のｒｄ命令とスレッド１のｒｄ命令とが同時にシンクフラグのリセット対象となった場合、図１１に示す調停回路１１１＿２において、いずれか一方のスレッドのｒｄ命令について、シンクフラグのリセットが決定される。その後このｒｄ命令では、図４に示す整数演算器で上記のリードアドレスが求められ、そのリードアドレスがリードポート２６０に入力される。また、ＰＳＴＡＴレジスタ２５０では、各レジスタ部分２５１＿１において、アクセス可能なレジスタ部分として、図１１に示す調停回路１１１＿２において決定されたスレッドに対応するレジスタ部分が選択される。そして、リードポート２６０が、入力されたリードアドレスのデータを要求すると、そのリードアドレスに対応し、調停回路１１１＿２で決定されたスレッドに対応するレジスタ部分のデータが送られる。本実施形態では、このような構成により、リードポート２６０が１個で済み、ＣＰＵ１０全体の回路規模の増大が抑えられている。【０１１７】
次に、オールデストタイプの命令についてのチェック回路を、リザベーションステーション２１０のうち、図４のＲＳＡ１１０に保持されているオールデストタイプの命令をチェックするための回路を代表例に挙げて説明する。【０１１８】
図１４は、オールデストタイプの命令について、シンクフラグのリセットが可能か否かをチェックするためのチェック回路を示す図である。【０１１９】
オールデストタイプの命令は、同一スレッドの中でその命令が、リザベーションステーション内で最も古い命令（オールデスト）となってから実行されるものである。【０１２０】
そこで、図１４に示すチェック回路１１０＿１では、オールデストタイプの命令が、ＲＳＡ１１０内に格納されている命令のうち、同一スレッド中でのオールデストになっているか否かが確認され、オールデストになっている場合に、その命令のシンクフラグをリセット対象に決定する。【０１２１】
この図１４に示すチェック回路１１０＿１は、まず、チェック対象のスレッドについて、リザベーションステーション内でのオールデストのエントリを求めるオールデストエントリ取得回路１１０＿１ａを有している。そして、このチェック回路１１０＿１は、各エントリについて、そのエントリがオールデストであるか否かと、図８に示すオールデストタグ１１０ｃの内容と、シンクタグ１１０ｄの内容と、バリッドタグ１１１ａの内容とのＡＮＤを求めるＡＮＤ演算子１１０＿１ｂと、各エントリのＡＮＤ演算子の結果のＯＲを求めるＯＲ演算子１１０＿１ｃとをさらに備えている。このチェック回路１１０＿１によって、チェック対象のスレッドに、シンク状態のオールデストタイプの命令があって、現在、その命令がＲＳＡ１１０内でオールデストになっており、シンクフラグがリセット可能な状態にあることが確認される。本実施形態では、このような確認がなされた場合に、ＲＳＡ１１０内の、チェック対象のスレッドに係る全エントリのシンクフラグのリセットが可能であると決定される。【０１２２】
このようにＲＳＡ１１０についてシンクフラグのリセット対象のスレッドが決定されると、シンクフラグのリセット後に、そのスレッドに属するシンク状態にあった命令が演算器に投入され実行にうつされることとなる。同時に、命令バッファ１０４に対して、そのスレッドについてのデコード部１０９への命令の投入の再開が指示される。【０１２３】
以上、説明したように、本実施形態のＣＰＵ１０によれば、シンク属性の命令についてはリザベーションステーション２１０で保持され、同一スレッド中での後続の命令についてはデコード部１０９への投入が中断される。これにより、例えば、デコード部１０９が占有されて、他のスレッドの命令のデコードが阻害されるといった事態が回避される。また、あるスレッドについて、シンク属性の命令に後続する命令のデコード部１０９への投入が中断されるので、それら後続の命令がコミット待ちとなることでそれら後続の命令にデコード部１０９が占有されて、他のスレッドの命令のデコードが阻害されるといった事態も回避される。また、それら後続の命令については、デコード部１０９への投入が中断された後、命令バッファ１０４で保持されるので、その後続の命令に対するフェッチが無駄にならず効率的である。つまり、この本実施形態のＣＰＵ１０によれば、命令を効率良く処理することができる。【０１２４】
尚、上記では、ＳＭＴ機能を有するＣＰＵとして、２種類のスレッドの命令を同時に処理するＣＰＵ１０を例示したが、ＳＭＴ機能を有するＣＰＵは、例えば３種類のスレッドの命令を同時に処理するもの等であっても良い。
【図１】
2008155839.tif 000003
【図２】
2008155839.tif 000004
【図３】
2008155839.tif 000005
【図４】
2008155839.tif 000006
【図５】
2008155839.tif 000007
【図６】
2008155839.tif 000008
【図７】
2008155839.tif 000009
【図８】
2008155839.tif 000010
【図９】
2008155839.tif 000011
【図１０】
2008155839.tif 000012
【図１１】
2008155839.tif 000013
【図１２】
2008155839.tif 000014
【図１３】
2008155839.tif 000015
【図１４】
2008155839.tif 000016
【国際調査報告】
2008155839.tif 000017
2008155839.tif 000018
2008155839.tif 000019