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