(57)【要約】  同時に複数スレッドを走らせプログラムを実行するシステムにおいて、ＣＳＥ１７の内部のエントリを、スレッドの数のグループに分割する。各グループは連続した記憶領域を割り当てるようにする。そして、各グループのエントリの最初の位置をポインタとしてポインタレジスタ選択回路３５において保持する。ポインタは各スレッドに対応させる。スレッド選択回路３６は、命令の実行完了判定を行なうスレッドを１つ選択し、エントリ選択回路３７に、ＣＳＥ１７からそのスレッドのエントリのコピーを完了対象エントリ３８に格納させ、完了判定部３９で完了判定させ、プログラマブルな資源の更新をさせる。スレッドの選択は、１つのスレッドに偏らないように行なう。
2008155804.tif 000002
【特許請求の範囲】
【請求項１】
命令の実行をパイプラインでアウト・オブ・オーダーで行い、イン・オーダーで命令の実行を完了する情報処理装置において、
命令の完了処理と、完了した命令のプログラマブルな資源の更新を行なうために命令の実行完了に伴う資源更新までの制御を行うためのデータを格納するエントリの記憶領域を備え、各エントリを、同時に実行されるスレッドの数分の、各スレッドに対応する連続領域に分けて格納するコミットスタックエントリ（ＣＳＥ）手段と、
該ＣＳＥ手段のエントリの中から、完了判別の対象となるエントリのスレッドを１つ選択するスレッド選択手段と、
該スレッド選択手段によって選択されたスレッドに対応するＣＳＥ手段のエントリの中から、未解放のエントリであり、かつ、最も古いエントリを先頭にして、完了判別の対象となるエントリを取得する完了対象エントリ手段と、
該完了対象エントリ手段のエントリに対して、完了判別を行い、該エントリの命令のプログラマブルな資源の更新を行なう完了判別手段と、
を備えることを特徴とする情報処理装置。
【請求項２】
前記ＣＳＥ手段は、スレッドの未解放のエントリで最も古いエントリの番号を示すポインタレジスタを、同時に実行されるスレッドの数分備える請求項１に記載の情報処理装置。
【請求項３】
前記完了判別の対象として取得されるエントリの数は、１マシンサイクルで同時に完了判別可能な最大数であることを特徴とする請求項１に記載の情報処理装置。
【請求項４】
前記ＣＳＥ手段は、単一のスレッドのみで前記情報処理装置が動作している場合には、動作中のスレッドに対し、全てのエントリを割り当てて格納することを特徴とする請求項１に記載の情報処理装置。
【請求項５】
パイプラインにクリア信号が発行された場合に、クリア信号が発行されたパイプラインに対応するスレッドの、前記ＣＳＥ手段のエントリをリセットするリセット手段と、
クリア信号が発行されたスレッドと、前記完了対象エントリ手段に格納されているエントリのスレッドとが一致する場合に、該完了対象エントリ手段のエントリを無効化するエントリ無効化手段と、
該完了対象エントリ手段のエントリが無効化された際に、完了判別処理を無効化する完了判別処理無効化手段と、
クリア信号が発行されたスレッドに対し、前記スレッド選択手段に、スレッドごとに割り当てられている該ＣＳＥ手段の記憶領域の先頭位置を選択させる初期化手段と、
を更に備えることを特徴とする請求項１に記載の情報処理装置。
【請求項６】
クリア信号が発行されたスレッドと、前記完了対象エントリ手段にＣＳＥのエントリのコピーを格納しようとしているスレッドが一致する場合に、該完了対象エントリ手段のエントリにＣＳＥのエントリのコピーを格納することを無効化する手段、
を更に備えることを特徴とする請求項５に記載の情報処置装置。
【請求項７】
前記スレッド選択手段は、動作していないスレッドを選択しないことを特徴とする請求項１に記載の情報処理装置。
【請求項８】
前記スレッド選択手段は、クリア信号が発行されたパイプラインに対応するスレッドは選択しないことを特徴とする請求項１に記載の情報処理装置。
【請求項９】
前記スレッド選択手段は、対応するエントリが全て無効化されているスレッドは選択しないことを特徴とする請求項１に記載の情報処理装置。
【請求項１０】
実行待ち状態であるために完了判別が完了できないエントリについて、実行待ちである要因を格納し、実行が完了するまで保持する、スレッドごとに設けられたレジスタ手段を更に備えることを特徴とする請求項１に記載の情報処理装置。
【請求項１１】
対応するパイプラインにクリア信号が発行されたスレッドの該レジスタ手段をクリアする第１のクリア手段と、
一定間隔のサイクルで、全ての該レジスタ手段をクリアする第２のクリア手段と、
を更に備えることを特徴とする請求項１０に記載の情報処理装置。
【請求項１２】
前記スレッド選択手段は、実行待ち状態が有効なスレッドは選択しないことを特徴とする請求項１０に記載の情報処理装置。
【請求項１３】
前記スレッド選択手段は、最も長く選択されていないスレッドから選択することを特徴とする請求項１に記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のスレッドを同時に処理するＣＰＵにおける命令完了制御装置に関する。
【背景技術】
【０００２】
ＣＰＵの処理を高速に行う手段として、従来から様々な技術が使用されてきた。その手段として用いられてきた方法としてパイプライン処理、さらに、並列に処理を行うスーパースカラ方式ある。また、プログラム命令の順番通りに実行を行わず、入力データが揃った命令から実行を行う、アウト・オブ・オーダー実行方式がある。【０００３】
しかし、これらの方式を用いたとしても、走行しているプログラムの種類などにもよるが、キャッシュミスが発生したときには、データが来るまでＣＰＵは何も処理できない時間が存在している。また、ＣＰＵが動作している場合でも、さまざまな場所で動作していない回路が多く存在している。【０００４】
例えば、プログラムの順番通りに命令を完了してプログラマブルな資源（アーキテクチャレジスタやメモリなど、ソフトから見えるハードウェア資源）の更新（解放等）を行う場合に、最も古い命令の実行が完了していない状態であれば、命令の実行が完了するのを待つことになり、その間は、資源の更新はできない状態となる。また、使用されていないリソースが存在している状況や、使用しているリソースであっても十分にリソースを使用しきれてはいない状況が存在する。【０００５】
このＣＰＵが動作していない状況を少しでも減らすために、単一のプログラムを走行するのではなくて複数のプログラムを走行することで改善するマルチスレッド方式がとられている。複数のプログラムを走行するマルチスレッド方式は、ＣＰＵのプログラマブルな資源を複数組用意しておくことでソフトウェアから見ると見掛け上は複数のＣＰＵに見えるために、複数のプログラムを実行することが可能となる構造である。【０００６】
このマルチスレッドの方法の１つとしてＶＭＴ(Vertical Multi Threading)方式がある。この方式は、ＣＰＵの実行スピードに比べてメモリのアクセス時間が大幅に遅いことに着目している。ＣＰＵは、１つのプログラムしか走行することはできないが、走行しているプログラムがキャッシュミスして長時間待つことが明らかな場合には、別のプログラムに切り替えて走行させることが可能となる。キャッシュミスしたときにＣＰＵは別のプログラムに切り替えて走行するために、ＣＰＵが何もしない状態を減らすことが可能である。また、ＶＭＴ方式での回路量については、プログラマブルな資源はスレッド数分を用意しなければならないが１つのプログラムが基本的に動作する回路についての変更はないので、追加する回路量も少なくて実現可能である。【０００７】
しかし、キャッシュミスなどによって長時間待つ場合は、この方式でも解決できるが、通常状態で動作しているときには、さまざまな場所で動作していない回路やすべてのリソースを使用するのは難しい状態には変わらない。これらの回路やリソースを少しでも動作させるために、同時にプログラムを走行することで、ＣＰＵの動作率を向上することが可能となる。この複数のプログラムを同時に走行する方式を同時マルチスレッド方式(ＳＭＴ(Simultaneous Multi Threading)方式）と呼ぶ。【０００８】
同時マルチスレッド方式の場合は、複数のスレッドが同時に動作するために、あるスレッドが停止していても、他のスレッドが動作することが可能となるためにＣＰＵ全体でみたときの動作率は向上し、リソースの使用率についても向上する。しかし、複数のスレッドに対応するために、各機能の回路を単純にスレッド分追加したりすると回路量が膨大に増加してしまい、動作周波数の向上も難しくなり、また、回路量が増加するということは制御方法も複雑になることが予想される。【０００９】
複数のスレッドが同時マルチスレッド方式で動作したときに、命令の完了判別と資源の更新の制御を行うＣＳＥの同時マルチスレッドに対応した構成と制御を実現するに際し、単一スレッドのみで動作していたときから比べて、増加する回路量をなるべく少なくすることと、動作周波数を維持もしくは向上できるようなＣＳＥの構成と命令の完了判別と資源の更新の制御を行う必要がある。【００１０】
特許文献１には、ＣＳＥ（Commit Stack Entryの動作が記載されている。特許文献２には、マルチスレッドプロセッサにおけるサスペンド命令の実行の処理の技術が開示されている。特許文献３においては、ＳＭＴシステムにおいて、出来る限り高速に新しい命令グループをディスパッチするための技術が開示されている。
【特許文献１】特開２０００−２０３０６号公報（特許第３４６９４６９号）
【特許文献２】特表２００５−５１４６９８号公報
【特許文献３】特開２００４−３２６７３８号公報
【発明の開示】
【００１１】
本発明の課題は、同時マルチスレッド方式を採用したシステム用に構成されたＣＳＥを提供することである。
本発明の情報処理装置は、命令の実行をパイプラインでアウト・オブ・オーダーで行い、イン・オーダーで命令の実行を完了する情報処理装置において、完了処理と、完了した命令のプログラマブルな資源の更新の制御を行なうために、命令の実行完了に伴う資源更新までの制御を行うためのデータを格納するエントリの記憶領域を備え、各エントリを、同時に実行されるスレッドの数分の、各スレッドに対応する連続領域に分けて格納するコミットスタックエントリ（ＣＳＥ）手段と、該ＣＳＥ手段のエントリの中から、完了判別の対象となるエントリのスレッドを１つ選択するスレッド選択手段と、該スレッド選択手段によって選択されたスレッドに対応するＣＳＥ手段のエントリの中から、未解放のエントリであり、かつ、最も古いエントリを先頭にして、完了判別の対象となるエントリのコピーを取得する完了対象エントリ手段と、該完了対象エントリ手段のエントリに対して、完了判別を行い、該エントリの命令のプログラマブルな資源の更新を行なう完了判別手段と資源の更新手段を備えることを特徴とする。
【図面の簡単な説明】
【００１２】
【図１】本発明の実施形態で考える情報処理装置の全体構成を示すブロック図である。
【図２】本発明の実施形態の概略を説明する図である。
【図３】本発明の実施形態のより詳しいブロック図である。
【図４】ＣＳＥのエントリの構成を示す図である。
【図５】命令デコーダから資源の更新までのパイプラインを示す図である。
【図６】ＣＳＥのエントリの選択からエントリ解放までの動作を説明する図（その１）である。
【図７】ポインタレジスタの構成例を示す図である。
【図８】ＣＳＥのエントリの選択からエントリ解放までの動作を説明する図（その２）である。
【図９】パイプラインをクリアする信号が発行されたときの処理のフロー図である。
【図１０】スレッド選択回路の選択方法の処理フローを示す図である。
【図１１】スレッド選択回路の回路図である。
【図１２】クリア信号発生時とエントリが空の場合のスレッドの選択方法を説明する図である。
【図１３】クリア信号発生時とエントリが空のスレッドの場合のスレッドの選択回路である。
【図１４】実行待ち状態レジスタの構成図である。
【図１５】実行待ち状態レジスタのセット方法を説明する図である。
【図１６】実行待ち状態レジスタセット・リセット回路の回路図である。
【図１７】実行待ち状態レジスタを用いたスレッド選択方法を示す図である。
【図１８】実行待ち状態レジスタのスレッド選択回路の回路図である。
【図１９】ＣＳＥのエントリの割り当て方を示す図（その１）である。
【図２０】ＣＳＥのエントリの割り当て方を示す図（その２）である。
【図２１】動作しているスレッドが３スレッド以上のときのスレッド選択方法の構成を示す図（その１）である。
【図２２】動作しているスレッドが３スレッド以上のときのスレッド選択方法の構成を示す図（その２）である。
【図２３】選択スレッド番号管理レジスタの動作を示す図（その１）である。
【図２４】選択スレッド番号管理レジスタの動作を示す図（その２）である。
【図２５】３スレッド以上のスレッド選択回路でのスレッド選択方法を示す図である。
【図２６】選択スレッド番号管理レジスタのエントリ０と１のスレッド選択方法を示す図（その１）である。
【図２７】選択スレッド番号管理レジスタのエントリ０と１のスレッド選択方法を示す図（その２）である。
【発明を実施するための最良の形態】
【００１３】
単一スレッドのみでしか動作しないときのＣＳＥの構成は、イン・オーダーでデコードされた命令について、デコード時に割り当てられた命令識別子に従ってＣＳＥのエントリに格納していく。ＣＳＥのエントリから未解放の最も古いエントリの番号を示すポインタの番号と、完了判別で完了することが決定したエントリ数から、未解放の最も古いエントリを先頭にして、１サイクルで完了できる最大数分のエントリを完了対象エントリにコピーして、完了対象エントリのみに対して完了判別を行い、完了したエントリのみプログラマブルな資源の更新を行う制御を行っていた。【００１４】
本発明の実施形態に従えば、複数のスレッドが同時マルチスレッドで動作するときには、ＣＳＥのエントリは外部から送られてくる、動作しているスレッドを示す信号から、動作しているスレッド数を得、動作しているスレッド数分にＣＳＥのエントリを分割してエントリを構成することで、ＣＳＥのエントリに複数のスレッドが同時に有効となることを可能とする。ＣＳＥのエントリを分割してエントリを構成するときには、１つのスレッドに対して連続したＣＳＥのエントリの番号で構成するようにエントリを割り当て、割り当てられた全てのスレッドに対して、スレッドの未解放のエントリで最も古いエントリの番号を示すポインタレジスタを備える。【００１５】
ＣＳＥのエントリには、複数のスレッドが同時に有効となるが、完了対象エントリの命令の完了判別とプログラマブルな資源の更新の制御については、１サイクルで同時に１つのスレッドのみが可能であることとする。命令の完了判別とプログラマブルな資源の更新は、異なるパイプラインにあたるので、同じタイミングで見たときには、それぞれ異なるスレッドを処理することが可能である。完了判別の次の処理が資源の更新の制御にあたるので、完了判別を行ったスレッドが次サイクルのプログラマブルな資源の更新のスレッドになる。【００１６】
完了対象エントリに格納されるエントリのスレッドを１つのスレッドにするためには、ＣＳＥのエントリから選択されるエントリを１つのスレッドのエントリとすることで可能となる。このために、動作しているスレッド分、あるポインタレジスタから１つのスレッドのポインタを毎サイクル選択するスレッド選択回路を備え、選択されたスレッドのポインタを用いて、ＣＳＥのエントリからスレッドを選択することで、１つのスレッドのみのエントリを選択することが可能となる。さらに、選択されたＣＳＥのエントリは、完了判別で完了したエントリ数とスレッドの番号から、さらにエントリの選択を行い、選択されたエントリが完了対象エントリに格納される。毎サイクル完了対象エントリに格納するスレッドを選択することで、１つのスレッドが完了対象エントリに留まることがないために、毎サイクル異なったスレッドに対して、完了判別を行うことが可能となる。【００１７】
スレッド選択回路は、外部から送られてくる動作しているスレッドを示す信号から、動作していないスレッドの情報を得ることで、スレッド選択回路では動作していないスレッドが完了対象のスレッドに選択されることがないことを保証して動作する。【００１８】
毎サイクル完了対象エントリのスレッドを選択するスレッド選択回路は、完了対象エントリに格納しても完了することができない原因があるスレッドに対しては、スレッド選択回路で選択しないようにする。このようにすることで、完了対象エントリに格納されることがなくなるために、完了対象エントリの完了判別で完了することができないサイクルを少なくすることが可能となる。【００１９】
スレッド別に分かれているパイプラインをクリアする信号が発行されたときに、スレッド選択回路は、クリア信号を発行したスレッドには、完了対象エントリのスレッドに選択しないようにする。また、動作しているスレッドについて、ＣＳＥのエントリが１つも有効でない状態であるスレッドが存在するときは、動作している他のスレッドのどれか１つでもＣＳＥのエントリが１つでも有効である場合には、スレッド選択回路は、ＣＳＥのエントリが１つも有効でないスレッドには、完了対象エントリのスレッドに選択しないようにする。さらに、動作しているスレッドごとに未解放の最も古いエントリの実行待ち状態を監視する機能を備え、実行待ち状態のスレッドが存在する場合には、スレッド選択回路は、実行待ち状態のスレッドには、完了対象エントリのスレッドに選択しないようにする。そして、スレッド選択回路で、スレッドを選択する要因が１つもない場合には、スレッド選択回路で選択されていない時間が最も長いスレッドを選択するように完了対象エントリのスレッドを選択する。【００２０】
図１は、本発明の実施形態による情報処理装置の全体構成を示すブロック図である。
１次命令キャッシュ１０からフェッチされた命令は、命令バッファ１１に入力される。命令バッファ１１に格納された命令は、命令デコーダ１２でデコードされる。そして、命令デコーダ１２でによる命令のデコードの結果にしたがって、アドレス演算用リザベーションステーション１３、固定小数点演算用リザベーションステーション１４、浮動小数点演算用リザベーションステーション１５、分岐命令用リザベーションステーション１６に命令が送られる。また、デコードされた全ての命令は、ＣＳＥ１７に送られてＣＳＥ１７にエントリを生成する。【００２１】
アドレス演算用リザベーションステーション１３にしたがって命令が実行される場合には、オペランドアドレス生成器１８において、命令のオペランドのアドレス演算が行なわれる。実行された命令がロード命令の場合には、１次データキャッシュ１９からデータの読み出しが行なわれる。読み出されたデータは、その種類によって、固定小数点更新バッファ２１あるいは、浮動小数点更新バッファ２４に格納される。命令が完了したときに、固定少数点バッファ２１から固定小数点レジスタ２２に、浮動小数点更新バッファ２４から浮動小数点レジスタ２５にデータの書き込みを行う。【００２２】
固定小数点演算用リザベーションステーション１４に従って命令が実行される場合には、演算器２０に演算対象のデータが与えられ、演算結果が固定小数点更新バッファ２１に書き込まれ、また命令が完了したときに固定小数点バッファ２１からのデータが固定小数点レジスタ２２に書き込まれる。【００２３】
浮動小数点演算用リザベーションステーション１５に従って命令が実行される場合には、演算器２３に演算対象のデータが与えられ、演算結果が浮動小数点更新バッファ２４に書き込まれ、命令が完了したときに浮動小数点バッファ２４からのデータが浮動小数点レジスタ２５に書き込まれる。【００２４】
分岐命令用リザベーションステーション１６によって命令が実行される場合には、命令の分岐先の情報が出力され、ネクストプログラムカウンタ２６と、命令フェッチアドレス生成器２９と、分岐予測機構２８に命令分岐先情報が与えられる。【００２５】
ＣＳＥ１７において、命令完了処理がすんだ場合には、その命令の情報がネクストプログラムカウンタ２６とプログラムカウンタ２７に与えられて、各カウンタの内容が更新される。また、固定小数点レジスタ２２や浮動小数点レジスタなどのプログラマブルな資源の更新も行う。【００２６】
プログラムカウンタ２７の値は、命令フェッチアドレス生成器２９に与えられる。命令フェッチアドレス生成器２９は、１次命令キャッシュ１０にフェッチすべき命令のアドレスを与える。【００２７】
図２は、本実施形態の概略を説明する図である。
エントリ選択回路３７は、ＣＳＥ１７から、命令完了を判定すべきエントリを選択する。エントリの選択に当たっては、スレッド選択回路３６、ポインタレジスタ選択回路３５からの信号及び完了対象のスレッドを示す完了対象スレッドＩＤと、完了判定部３９からの信号を用いる。スレッド選択回路３６は、完了を判定する命令のスレッドを選択する回路であり、選択結果は、ポインタレジスタ選択回路３５、エントリ選択回路３７、完了対象エントリ３８に与えられる。完了対象エントリ３８は、エントリ選択回路３７で選択されたＣＳＥ１７のエントリのコピーを格納する。また、完了対象エントリのみではなく、完了対象スレッドＩＤも完了対象エントリ３８に格納される。完了対象エントリ３８に格納された命令は、完了判定部３９において、完了判定される。完了判定部３９で完了したと判定された命令のスレッドのプログラマブルな資源については、更新が行なわれる。プログラマブルな資源の特定は、完了対象スレッドＩＤから得られる資源の更新スレッドＩＤによってなされる。また、完了判定部３９の完了判定終了情報は、エントリ選択回路３７に入力され、別のエントリの選択の契機とされる。図１について更に説明すると、命令フェッチを行うために、命令フェッチアドレス生成器２９で選択された命令アドレスに対して命令フェッチリクエストを発行して、1次命令キャッシュ１０からフェッチしてきた命令を命令バッファ１１に格納する。命令バッファ１１からプログラムの順番通りに命令デコーダ１２に命令の供給を行い、命令デコーダ１２はプログラムの順番通りに命令のデコードを行う。命令デコーダ１２は、デコードする命令の種類に従って、命令の実行を制御する主記憶オペランドアドレス生成用リザベーションステーション（ＲＳＡ:Reservation Station for Address generate）１３、固定小数点演算用リザベーションステーション（ＲＳＥ:Reservation Station for Execute）１４、浮動小数点演算用リザベーションステーション（ＲＳＦ:Reservation Station for Floating）１５、分岐命令用リザベーションステーション（ＲＳＢＲ:Reservation Station for BRanch）１６に必要なエントリを作成する。また、全てのデコードされた命令に対して、命令の完了を制御するコミットスタックエントリ（ＣＳＥ:Commit Stack Entry）１７にエントリを作成する。【００２８】
デコードされた命令がＲＳＡ１３、ＲＳＥ１４、ＲＳＦ１５にエントリを作成する場合には、固定小数点更新バッファ（ＧＵＢ:General Update Buffer）２１と浮動小数点更新バッファ（ＦＵＢ:Floating Update Buffer）２４に対応するレジスタリネームを行うことで、命令のアウト・オブ・オーダー実行を行うことが可能となり、実行結果はＧＵＢ２１、ＦＵＢ２４に格納される。リザベーションステーションから、アウト・オブ・オーダーで実行された命令は、ＣＳＥ１７の制御によりプログラムの順番通りに命令の完了を行い、完了した命令に対してのみ、固定小数点レジスタ２２や浮動小数点レジスタ２５やプログラムカウンタ（ＰＣ２７、ＮＥＸＴ＿ＰＣ２６）などのプログラマブルな資源の更新を行う。【００２９】
図３は、本実施形態のより詳しいブロック図である。
命令デコーダ１２でデコードされた命令は、アドレス演算用リザベーションステーション１３、固定小数点演算用リザベーションステーション１４、浮動小数点演算用リザベーションステーション１５、分岐命令用リザベーションステーション１６において実行される。命令の実行によって、実行完了した命令の識別子と共に、実行完了報告が生成され、実行完了エントリ選択回路４７、完了対象エントリ選択回路４６に与えられる。また、命令デコーダ１２から命令識別子選択回路４０に命令識別子が与えられ、命令識別子選択回路４０で選択された命令識別子が生成エントリ選択回路４１と、アドレス演算用リザベーションステーション１３、固定小数点演算用リザベーションステーション１４、浮動小数点演算用リザベーションステーション１５、分岐命令用リザベーションステーション１６それぞれに与えられる。【００３０】
生成エントリ選択回路４１は、命令デコーダ１２でデコードされた命令の実行の完了を待つため、ＣＳＥ１７にエントリを作るためのエントリの選択を行なう。実行完了エントリ選択回路４７は、実行完了報告の命令識別子から、実行完了したＣＳＥ１７のエントリを選択する。解放エントリ選択回路４２は、完了判別部３９において命令の実行が完了したと判断され、ＣＳＥ１７から解放するエントリを選択する。完了対象エントリ選択回路４６は、スレッド選択回路３６とポインタ選択回路Ａ４４の信号から、完了判別を行なう対象命令が格納されているＣＳＥ１７のエントリを選択する。完了対象エントリ選択回路４６によって読み出されたエントリのコピーは、完了対象エントリ４５に格納され、完了判別部３９において、完了判別される。完了判別結果は、完了対象エントリ選択回路４６、解放エントリ選択回路４２に入力される。また、完了対象エントリ４５の情報は、ポインタ選択回路Ｂ４３に入力し、ポインタ選択回路Ｂ４３によるポインタ選択結果が解放エントリ選択回路４２のエントリ選択に使用される。また、完了対象エントリ４５に格納されたエントリに対応する完了対象スレッドＩＤは、資源の更新スレッドＩＤとなり、完了判別部３９において完了したと判別された命令に対応するスレッドのプログラマブルな資源の特定に使われる。完了判別部３９で完了したと判別された命令については、対応するプログラマブルな資源が更新される。【００３１】
以下、２つのスレッド（スレッド０と１）が動作していて、ＣＳＥのエントリは全部でＮエントリ（実施例では、Ｎは奇数）の場合について説明する。スレッド数については、２つ以上のスレッドでも可能であるし、ＣＳＥのエントリについてもスレッド数以上のエントリを備えていれば実現可能である。【００３２】
図４は、ＣＳＥのエントリの構成を示す図である。
ＣＳＥのエントリは、外部から送られてくる動作しているスレッドを示す信号から単一スレッドで動作しているか否かを判断し、動作しているスレッド数の情報を得ることで、動作しているスレッド数分にＣＳＥのエントリを分割して構成される。このときに、ＣＳＥのエントリを動作しているスレッド数分に分割するときには、１つのスレッドに対して連続したＣＳＥのエントリの番号で構成するようにエントリを割り当て、割り当てられた全てのスレッドに対して、スレッドの未解放のエントリで最も古いエントリの番号を示すポインタレジスタに、初期値となる番号を格納する。【００３３】
２つのスレッド（スレッド０と１）が動作する場合は、ＣＳＥのエントリは図４の右下の図のように分割して構成される。スレッド０のＣＳＥのエントリ領域は、０番〜（Ｎ−１）／２番、スレッド１のＣＳＥのエントリ領域は、（Ｎ＋１）／２番〜Ｎ番に割り当てられる。そして、ポインタレジスタの初期値として、スレッド０には０が格納され、スレッド１には、（Ｎ＋１）／２が格納される。ポインタレジスタの値は、割り当てられた領域内の番号のみを示すように制御される。すなわち、スレッド０の（Ｎ−１）／２番の次のポインタレジスタは０番となり、スレッド１のＮ番の次のポインタレジスタは（Ｎ＋１）／２番となる。単一のスレッドで動作するときには、ＣＳＥのエントリすべてを、動作しているスレッドに割り当てる。単一スレッドで動作するときには、スレッド０と１の両方ともポインタレジスタの初期値として０が格納される。【００３４】
通常走行中に動作するスレッド数を変更する場合には、動作している全てのスレッドからクリア信号を発行して、全てのスレッドのパイプラインとＣＳＥなどのワークレジスタとして使用しているリソースをクリアしてから、スレッド数が変更される。スレッド数が変更された場合には、ＣＳＥのエントリは、外部から送られてくる、動作しているスレッドを示す信号に従って構成を変更する。【００３５】
図５は、命令デコーダから資源の更新までのパイプラインを示す図である。
命令をデコードするステージを命令デコードステージ、次のサイクルでＣＳＥのエントリに格納するステージをエントリ格納ステージ、ＣＳＥのエントリからエントリを選択して完了対象エントリに選択されたＣＳＥのエントリのコピーを格納するステージをエントリ選択ステージ、完了対象エントリに対して完了判別を行うステージを完了判別ステージ、プログラマブルな資源の更新を行うステージを資源の更新ステージとする。そして、エントリ選択ステージの１サイクルの前で、完了対象エントリに格納するスレッドを選択するので、エントリ選択ステージの１サイクル前のステージをスレッド選択ステージとする。スレッド選択ステージで選択されたスレッドＩＤが、次サイクルではエントリ選択ステージ、その次サイクルでは完了判別ステージ、その次サイクルでは資源の更新ステージのスレッドＩＤを指すことになる。命令デコードから最短で命令を完了して資源の更新を行うときには、エントリ格納ステージとスレッド選択ステージは同じサイクルとなる。【００３６】
命令デコーダは、１サイクルで同時に１つのスレッドのみをデコードする。命令デコーダは、デコードする命令に対して、ＣＳＥのエントリの番号を示す命令識別子を割り当てる。命令識別子は、外部から送られてくる動作しているスレッドを示す信号から、動作しているスレッド数の情報を得ることで、動作しているスレッド分の命令識別子を備えている。このスレッド分の命令識別子では、ＣＳＥのエントリの分割に合わせた領域となり、スレッドごとに割り当てられる命令識別子の領域とポインタレジスタの領域は、同じ領域になるように制御される。デコードされた命令は、命令識別子の値が示す番号のＣＳＥのエントリに、デコードした命令の実行完了に伴う資源更新までの制御を行うためのデータを格納する。格納されたエントリは、エントリが有効であることを示すＶＡＬＩＤ信号がオンとなる。【００３７】
図６〜図８は、ＣＳＥのエントリの選択からエントリ解放までの動作を説明する図である。
図６において、図３と同じ構成要素には、同じ参照符号を付す。【００３８】
１サイクルで同時に完了判別を行うスレッドは、１つのスレッドのみである。完了対象エントリ４５に、１つのスレッドのみのＣＳＥのエントリから選択されたエントリのコピーを格納することで、１サイクルで同時に完了可能な最大数のエントリを完了することが可能となる。【００３９】
完了対象エントリ４５に１サイクルで同時に完了可能な最大数のエントリを１つのスレッドにして格納するためには、ＣＳＥのエントリから選択するときに必要なポインタレジスタ（図７参照）を１つのスレッドに対して選択しておくことで、ＣＳＥのエントリから１つのスレッドのエントリのみを選択することが可能となる。ＣＳＥのエントリは１つのスレッドに割り当てられている領域が連続した番号で構成されているために、スレッドのポインタレジスタを使用することで、連続したエントリを選択することが可能となる。【００４０】
ＣＳＥのエントリから１つのスレッドを選択するためのスレッド選択回路３６を備えることで、スレッド選択回路３６で選択されたＮＥＸＴ完了対象エントリスレッドＩＤ５０から、ポインタ選択回路Ａ４４でポインタレジスタを選択することが可能となる。ポインタ選択回路Ａ４４で選択されたポインタは、ＣＳＥのエントリ選択回路１７＋４６で、完了対象エントリ４５の最大数分のエントリと、１サイクルで同時に完了可能な最大数分とを加算したエントリ数が選択されたポインタが指すエントリを先頭にして、連続したエントリを選択することが可能である。【００４１】
図７は、ポインタレジスタの構成例を示す図である。
図７では、ポインタレジスタを陽に示している。ポインタ選択回路Ａ４４、Ｂ４３に与えられるポインタ値は、ポインタレジスタスレッド０（８０）と、ポインタレジスタスレッド１（８１）に格納されたポインタ値を使う。ポインタレジスタスレッド０（８０）とポインタレジスタスレッド１（８１）には、ポインタ更新回路５１からのポインタ値が格納される。ポインタレジスタスレッド０（８０）には、スレッド０に対するポインタ値、ポインタレジスタスレッド１（８１）には、スレッド１に対するポインタ値が格納される。ポインタ選択回路Ａ４４とポインタ選択回路Ｂ４３は、スレッド０とスレッド１のいずれかのポインタ値を選択する。ポインタ選択回路Ｂ４３は、解放エントリのポインタを選択するが、これは、完了対象エントリスレッドＩＤを取得することによって行なう。完了対象エントリスレッドＩＤは、ポインタレジスタスレッド０（８０）、ポインタレジスタスレッド１（８１）に与えられ、新たなポインタ値をポインタ更新回路５１から読み込ませる。また、完了対象エントリスレッドＩＤは、完了判別部３９に与えられ、そのＩＤのスレッドの命令の完了判別を行なうと共に、完了判別が終わった時点で、ポインタ更新回路５１に、完了判別が終わった命令のポインタを与える。ポインタ更新回路５１には、更に、ポインタ選択回路Ｂ４３からの解放エントリポインタが与えられ、次の解放エントリポインタの演算に使用される。ポインタ選択回路Ａ４４は、命令完了判別を行なうエントリをＣＳＥから取得するためのポインタの選択を行なうが、これは、ＮＥＸＴ完了対象エントリスレッドＩＤ（次に、命令完了対象となるエントリのスレッドＩＤ）を取得して、スレッドの選択を行なう。【００４２】
図８に、完了対象エントリ選択回路の動作フローを示す。完了対象エントリ選択回路４６では、完了対象エントリ４５のスレッドＩＤとＮＥＸＴ完了対象エントリスレッドＩＤ５０が一致する場合には（ステップＳ１０）、そのサイクルで完了したエントリ数をＣＳＥのエントリ選択回路１７＋４６で選択されたエントリの先頭から加算したエントリを先頭にして（ステップＳ１１）、完了対象エントリ４５の最大数分のエントリを選択する（ステップＳ１３）。完了対象エントリ４５のスレッドＩＤとＮＥＸＴ完了対象エントリスレッドＩＤ５０が一致しない場合には（ステップＳ１０）、ＣＳＥのエントリ選択回路１７＋４６で選択されたエントリの先頭（ステップＳ１２）から完了対象エントリ４５の最大数分のエントリを選択する。Ｓ１１あるいはＳ１２の処理に続き、完了対象エントリ選択回路４６で、選択されたエントリのコピーが完了対象エントリ４５に格納される（ステップＳ１３）。【００４３】
完了対象エントリ４５で完了判別を行い、完了したと判別されたエントリについては、完了対象エントリ４５のスレッドＩＤを用いてポインタレジスタをポインタ選択回路Ｂ４３で選択する。そして、ポインタ更新回路５１で、選択されたポインタレジスタに完了したエントリ数分の加算を行って、ポインタレジスタを更新する。【００４４】
完了対象エントリ４５のスレッドＩＤは、次サイクルでは資源の更新スレッドＩＤとなり、完了したエントリは、資源の更新スレッドＩＤのスレッドのプログラマブルな資源の更新を行う。【００４５】
プログラマブルな資源の更新と同じサイクルで、完了したＣＳＥのエントリの解放を行う。完了判別のサイクルで完了したと判別されたエントリの数をエントリ完了数とすると、完了対象エントリのスレッドＩＤによりポインタ選択回路Ｂ４３で選択されたポインタに対し、資源の更新のサイクルでエントリ完了数が指定される。解放エントリポインタから解放エントリ選択回路４２で選択されたＣＳＥのエントリについて、ＶＡＬＩＤ信号をリセットすることでエントリは無効となる。このとき、ポインタレジスタが更新される前の値を解放エントリポインタとしてとっておく。【００４６】
図９に、パイプラインをクリアする信号が発行されたときの処理のフロー図を示す。
スレッド別に分かれているパイプラインをクリアする信号がパイプライン機構から発行されたとき、クリアする信号を発生したスレッドのＣＳＥのエントリをリセットすることで（ステップＳ１５）、パイプラインをクリアする信号を発行したスレッドのＣＳＥのエントリは全て無効となる。パイプラインをクリアする信号を発生したスレッドのスレッドＩＤがＮＥＸＴ完了対象エントリのスレッドＩＤのときには（ステップＳ１６）、完了対象エントリにＶＡＬＩＤを格納しないことで、パイプラインをクリアする信号を発生したスレッドの完了判別を行わない。一方、スレッドがパイプラインをクリアする信号を発生したスレッドではない場合には、完了対象エントリにスレッドを格納して次サイクルで完了判別を行う。【００４７】
クリアする信号を発生したスレッドが完了対象エントリのスレッドのときには（ステップＳ１７ＹＥＳ）、そのスレッドの完了判別を行わない。一方、スレッドがクリアする信号を発生したスレッドではない場合には（ステップＳ１７ＮＯ）、スレッドの完了判別を行う。続いて、パイプラインをクリアする信号を発生したスレッドのポインタレジスタをポインタ更新回路によって、初期値にして更新する（ステップＳ１８）。【００４８】
図１０に、スレッド選択回路の選択方法の処理フローを示す。
スレッド選択回路の選択には、大きく分けて３段階の選択がある。この選択のいずれかに当てはまると、次サイクルのＮＥＸＴ完了対象エントリスレッドＩＤとなるＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤが決定する。３段階の選択に全て当てはまらない場合には、ＮＥＸＴ完了対象エントリスレッドＩＤによって示されるスレッドに対する反対スレッドのスレッドＩＤを、ＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤにする。【００４９】
スレッド選択回路は、まず、ステップＳ２０において、単一スレッドで処理しているか、マルチスレッドで処理しているかを判断する。ステップＳ２０の判断がＹｅｓの場合には、単一スレッドで動作しているスレッドを選択し、ＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤを決定する。【００５０】
ステップＳ２０の判断がＮｏの場合には、ステップＳ２１において、現在のスレッドについて、クリア信号が発せられているか、あるいは、ＣＳＥのエントリが空か否かを判断する。ステップＳ２１の判断がＹｅｓの場合には、クリア信号、あるいは、エントリ空状態のスレッドとは異なる（スレッドが２つの場合には、反対側の）スレッドを選択し、ＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤを決定する。ステップＳ２１の判断がＮｏの場合には、ステップＳ２２において、現在のスレッドが実行待ち状態のスレッドであるか否かを判断する。【００５１】
ステップＳ２２の判断がＹｅｓの場合には、実行待ち状態であるスレッドと異なる（２スレッドの場合には、反対側）のスレッドを選択し、ＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤを決定する。ステップＳ２２の判断がＮｏの場合には、ＮＥＸＴ完了対象エントリスレッドＩＤと異なる（２スレッドの場合反対の）スレッドを選択し、ＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤを決定する。【００５２】
図１１に、スレッド選択回路の回路図を示す。
最も優先度が高い選択は、動作しているスレッドが単一のスレッド動作している場合に、ＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤを単一で動作しているスレッドＩＤにすることである。【００５３】
図１１の＋THREAD_0_ONLY_ACTIVEと+THREAD_1_ONLY_ACTIVEは、それぞれ単一スレッドで動作していることを示す信号である。図１１に示される回路は、＋THREAD_0_ONLY_ACTIVEあるいは+THREAD_1_ONLY_ACTIVEがオンになっていると、オンになっているスレッドを選択する。なお、＋THREAD_0_ONLY_ACTIVEと+THREAD_1_ONLY_ACTIVEとの２つの信号が同時にオンになることはない。【００５４】
+WINDOW_SET_THREAD_IDは、２つのスレッドを０と１で判別する信号である。この信号は、現在のスレッドとは反対のスレッドを選択するように、論理が反転されてＯＲ回路６０に入力されている。+CLEAR_PIPLINE_OR_CSE_EMPTY_THREAD_0は、スレッド０のパイプラインをクリアする信号が発生している場合、あるいは、ＣＳＥのエントリが空の場合にオンとなる信号である。+TOQ_COMP_WAIT_THREAD_0は、スレッド０のＣＳＥの未解放エントリで最も古いエントリが実行待ち状態になっている場合にオンになる信号である。これらの信号は、ＯＲ回路６０に入力され、これらの信号がオンの場合には、スレッド１を選択する信号のトリガとなる。【００５５】
+CLEAR_PIPELINE_OR_CSE_EMPTY_THREAD_1は、スレッド１のパイプラインをクリアする信号が発生している場合、あるいは、ＣＳＥのエントリが空の場合にオンとなる信号である。+TOQ_COMP_WAIT_THREAD_1は、スレッド１のＣＳＥの未解放エントリで最も古い命令が実行待ち状態になっている場合にオンになる信号である。これらの信号は、ＯＲ回路６１に入力され、これらの信号がオンの場合には、スレッド０を選択する信号のトリガとなる。【００５６】
ＯＲ回路６０、６１の出力は、ＡＮＤ回路６２、６３に入力し、ＡＮＤ回路６３の出力が反転されて、ＡＮＤ回路６４に入力する。ＡＮＤ回路６４の、０または１の出力が、次に処理すべきスレッドのスレッド番号（０あるいは１）である、+NEXT_WINDOW_SET_THREAD_IDとなる。【００５７】
図１２は、クリア信号発生時とエントリが空の場合の、スレッドの選択方法を説明する図である。
命令処理動作が単一のスレッドでない場合、すなわち、２つのスレッドが動作している場合には、２段階目の選択として、次の２つの事象が発生した場合が優先して選択される。【００５８】
１つ目の事象は、スレッド別に分かれているパイプラインをクリアする信号が発行されたときである（スレッド０、１のクリア信号が発生）。この場合には、クリア信号を発行したスレッドと反対のスレッドにＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤを選択する（スレッド０でクリア信号発生ならスレッド１を選択、スレッド１でクリア信号発生ならスレッド０を選択する）。２つのスレッドのクリア信号が同時に発行された場合、ＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤはスレッド０を選択する。【００５９】
２つ目の事象は、動作している２つのスレッドの１つのスレッドのＣＳＥのエントリが１つも有効でない状態である。この場合、もう１つのスレッドのＣＳＥのエントリに１つでも有効であるエントリが存在する場合には、ＣＳＥのエントリが１つも有効でないスレッドと反対のスレッドにＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤを選択する。両スレッドのＣＳＥのエントリに１つも有効なエントリがない場合には、この回路では、スレッドを選択することができないようにする。１つ目の事象と２つ目の事象で異なるスレッドが同時に発生した場合、ＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤはスレッド０を選択する。【００６０】
図１３に、クリア信号発生時とエントリが空のスレッドの場合の、スレッドの選択回路を示す。
クリア信号を示すのが、+CLEAR_PIPELINE_THREAD_0と1であり、ＣＳＥのエントリが１つも有効でない状態を示すのが、+CSE_EMPTY_THREAD_0と1である。エントリが１つも有効でない状態の場合には、反対側のスレッドのエントリが１つも有効でない信号がオフのときに+CLEAR_PIPLINE_OR_CSE_EMPTY_THREAD_0, あるいは、_1がオンとなる。。クリア信号とエントリが１つも有効でない状態のＯＲ信号出力が図１１の回路につながり、スレッドを選択する。図１３の出力は、それぞれ、スレッド０と、１について、パイプラインクリア信号が発行されているか、ＣＳＥのトンリが無効となっている場合を示す信号である。【００６１】
図１４は、実行待ち状態レジスタの構成図である。
３段階目の選択（図１０における３段階目）については、次の事象が発生しているか否かでＮＥＸＴ完了対象エントリのスレッドが選択される。未解放の最も古いエントリの実行待ち状態を監視する機能をスレッド選択回路が備え、実行待ち状態のスレッドが存在する場合には、実行待ち状態のスレッドと反対のスレッドにＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤをスレッド選択回路が選択する。【００６２】
スレッド０と１それぞれに実行待ち状態レジスタセット回路が設けられる。スレッド０と１の実行待ち状態レジスタセット回路は、それぞれの実行待ち状態レジスタリセット回路からのリセット信号を受け、実行待ち状態レジスタをリセットする。スレッド０と１の実行待ち状態レジスタは、完了判別部からの信号に従って、それぞれのスレッドの実行待ち状態レジスタセット回路によって実行待ち命令に関する情報が設定される。実行待ち状態レジスタには、命令の実行待ちになっている場合に、レジスタに実行待ち命令に関する情報がセットされ、命令の実行待ち状態が解除されると、リセットされる。スレッド選択回路は、各スレッドの実行待ち状態レジスタの内容を読んで、スレッド選択を行なう。【００６３】
図１５は、実行待ち状態レジスタのセット方法を説明する図である。
完了対象エントリに対して完了判別を行ったときに、完了対象エントリの先頭のエントリが有効であるが完了判別で完了出来る場合には、プログラマブルな資源の更新をする。完了判別で完了出来ないが、命令が実行待ちではない場合には、次サイクルに移り、新しい完了対象エントリの先頭エントリの完了判別を行う。完了判別で完了できない場合の要因が命令の実行待ち状態であるときには、どの実行待ちであるかを示す情報が実行待ち状態レジスタセット回路から実行待ち状態レジスタに格納される。この実行待ち状態レジスタは、スレッドごとに備えられる。一度実行待ち状態レジスタに実行待ち命令の情報が格納された場合には、実行待ち状態レジスタリセット回路からのリセット信号が発行されるまで、実行待ち状態レジスタが実行待ち命令の情報を保持し続ける。【００６４】
実行待ち状態レジスタリセット回路からは、３つの事象が発生した場合にリセット信号が発行される。
１つ目の事象は、実行待ち状態レジスタに格納された実行待ち要因の実行が完了した場合であり、この場合にリセット信号が出力され、実行待ち状態レジスタをリセットすることが可能となる。命令の実行が完了した場合には、実行完了報告と命令識別子をＣＳＥに送り、命令識別子が示すエントリの番号に従って実行完了報告をＣＳＥのエントリに格納する。このときに、スレッドごとにあるポインタレジスタの番号と実行完了したときに送られてくる命令識別子が一致した場合には、実行が完了した命令が、スレッドの未解放で最も古いエントリを示すことになるので、実行待ち状態レジスタリセット回路からリセット信号を発行して、実行待ち状態レジスタに格納しないようにする。２つ目の事象は、パイプラインをクリアする信号が発行された場合である。このときにも、クリア信号を発行したスレッドの実行待ち状態レジスタリセット回路からリセット信号を発行する。３つ目の事象は、一定間隔のサイクルで、すべてのスレッドの実行待ち状態レジスタリセット回路から同時にリセット信号を発行する場合である。【００６５】
実行待ち状態レジスタリセット回路からリセット信号を発行したタイミングで、実行待ち状態レジスタセット回路からセット信号も発行された場合には、リセット信号を優先して実行待ち状態レジスタをリセットする。【００６６】
図１６は、実行待ち状態レジスタセット・リセット回路の回路図である。
図１６の回路図は、スレッド０の演算実行待ち状態を表す回路である。この回路は、回路図の下側のセット回路と上側のリセット回路に分かれている。セット側の回路は、完了対象エントリの先頭のエントリが有効であることを示す信号+TOQ_WINDOW_VALID、完了対象エントリのスレッドＩＤがスレッド０を示している+TOQ_WINDOW_THREAD_ID_0、完了対象エントリの先頭のエントリが演算命令であることを示す信号+TOQ_WINDOW_EU_USEが全てオンの状態であり、完了対象エントリの先頭のエントリの演算実行が完了したことを示す信号+TOQ_WINDOW_EU_COMPがオフのときに、完了対象エントリの先頭のエントリが演算実行待ちであることを示す信号を出力する。また、実行待ち状態レジスタに実行待ち命令の情報がセットされていることを示す信号+TOQ_EU_COMP_WAIT_THREAD_0は実行待ち状態レジスタを再セットするために、完了対象エントリが実行待ちであることを示している信号とＯＲされ、両信号がＯＲされた信号がセット信号となる。【００６７】
リセット側の回路は、出力がオンとなる要因の種類が３つある。１つ目は、ポインタレジスタを示す信号+OUT_PTR_THREAD_0と、命令の実行が完了したエントリの命令識別子を示す信号+EU_COMP_IIDの一致がとれ、命令の実行が完了したことを示す命令完了報告を示す信号+EU_COMPがオンになっているときである。２つ目は、クリア信号を示す信号+CLEAR_PIPELINE_TREAD_0がオンになったときである。３つ目は、一定間隔のサイクルで、すべてのスレッドの実行待ち状態レジスタリセット回路から同時にリセット信号を発行することを示す信号+RESET_COMP_WAIT_BY_TIMERがオンになったときである。この３つの条件のどれか１つでも成立した場合には、実行待ちレジスタの命令の演算待ちには、その命令の演算待ちスレッドを命令完了判別対象スレッドにセットしないように信号+SET_TOQ_EU_COMP_WAIT_THREAD_0が生成される。これと同様の回路が、スレッド１にもあり、さらに、分岐命令待ち状態、ロード／ストア命令待ち状態についても同様の回路を備えている。【００６８】
図１７は、実行待ち状態レジスタを用いたスレッド選択方法を示す図である。
実行待ち状態レジスタが有効な状態であるときに、反対スレッドの実行待ち状態レジスタが有効でない状態であるか、反対スレッドのＣＳＥのエントリが１つでも有効な場合であり、パイプラインをクリアする信号がスレッドに関係なく、発行されていない場合に、実行待ち状態レジスタが有効な状態であるスレッドと反対のスレッドに、ＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤを選択する。両スレッドの実行待ち状態レジスタが有効な状態であるときには、この回路では、スレッドを選択することができないようにする。【００６９】
すなわち、一方のスレッドの実行待ち状態レジスタを例に取ると、スレッド０の実行待ち状態レジスタが有効か否かを判断し、有効でない場合には、スレッド選択を行なわず、有効な場合には、スレッド１の実行待ち状態レジスタが有効か否かを判断する。有効な場合には、スレッド選択を行なわず、無効な場合には、スレッド１のＣＳＥのエントリが有効か否かを判断する。無効な場合には、スレッド選択を行なわない。有効な場合には、スレッド０と１からのクリア信号が発行されているか否かを判断する。発行されている場合には、スレッド選択を行なわない。発行されていないばあには、スレッド１を選択し、新しいＮＥＸＴ完了対象エントリのスレッドＩＤを発行する。スレッド１の実行待ち状態レジスタについても同様である。【００７０】
図１８は、実行待ち状態レジスタのスレッド選択回路の回路図である。
実行待ち状態レジスタの信号で演算の実行待ちを示している信号+TOQ_EU_COMP_WAIT_THREAD_0と1（スレッド０と１それぞれについて）、分岐命令の実行待ちを示している信号+TOQ_BR_COMP_WAIT_THREAD_0と1（スレッド０と１それぞれについて）、ロード／ストア命令の実行待ちを示している信号+TOQ_FCH_COMP_WAIT_THREAD_0と1（スレッド０と１それぞれについて）の一方のスレッドについて、どれか１つでもオン状態であり、反対スレッド（スレッド０に対するスレッド１、スレッド１に対するスレッド０）の実行待ち状態レジスタの信号（上記、+TOQ_EU_COMP_WAIT_THREAD_0と1、+TOQ_BR_COMP_WAIT_THREAD_0と1、+TOQ_FCH_COMP_WAIT_THREAD_0と1）が１つもオンでなくて、反対スレッドのＣＳＥのエントリが空状態であることを示す信号+CSE_EMPTY_THREAD_0と1がオフであり、さらに、クリアする信号を示す信号+CLEAR_PIPELILE_THREAD_0と1の両方ともオフであるときに成立した信号+TOQ_COMP_WAIT_THREAD_0と1が、命令実行待ちとなっているか否かを示す信号であり、図１１の回路につながり、スレッドを選択する。【００７１】
図１０、図１１に戻って説明をすると、ＮＥＸＴ完了対象エントリスレッドＩＤを選択するための事象のどれにも該当しない場合には、ＮＥＸＴ完了対象エントリスレッドＩＤによって示されるスレッドとは反対のスレッドを示すＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤを選択する。図１１の回路では、ＮＥＸＴ完了対象エントリスレッドＩＤを示す信号+WINDOW_SET_THREAD_IDの極性を反対にした信号をスレッド０側のＯＲ信号（ＯＲ回路６０の入力）に加えることで、全ての条件が成立しない場合には、ＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤは、ＮＥＸＴ完了対象エントリスレッドＩＤの反対スレッドに選択される。【００７２】
次に、動作するスレッドが３スレッド以上の場合の、ＣＳＥのエントリの構成とスレッド選択方法を示す。
図１９、及び、図２０に、ＣＳＥのエントリの割り当て方を示す。【００７３】
ＣＳＥの全エントリ数をＮエントリ、動作しているスレッド数をＭスレッドとする。スレッド番号は０番からＳ番（Ｍ−１）とすると、図１９の表のような式で各スレッド番号に対応するＣＳＥエントリの領域が割り当てられることが可能となる。また、スレッド番号ごとに備えられたポインタレジスタの初期値を表の1番右側に示す。例として、図１９に、ＣＳＥの全エントリ数を１００エントリ、動作しているスレッド数を５スレッドにした場合のＣＳＥの構成を示す。このような方法をとることで、動作しているスレッド数がいくつであっても、スレッド数に対応するエントリ割り当てを行なえ、いずれのスレッド数にも対応することが可能となる。【００７４】
図２１及び図２２に、動作しているスレッドが３スレッド以上のときのスレッド選択方法の構成を示す。
スレッド選択回路７０で選択されたスレッドの、順番を管理する、選択スレッド番号管理レジスタ７１を備える。このレジスタの構成を図２１に示す。ＣＳＥの各スレッドのエントリ数は、動作しているスレッド数で決められ、各スレッドのエントリには、それぞれスレッド番号を格納している。選択スレッド番号管理レジスタ７１のエントリ０に格納されているスレッド番号が、最も長い時間スレッド選択回路で選択されていないスレッドになり、その次に選択されていないスレッド番号がエントリ１に格納されている。このように、エントリ番号が小さいほど、スレッド選択回路で選択されていない時間が長いスレッド番号が格納されている。1番大きいエントリ番号の選択スレッド番号管理レジスタ７１のエントリには、最後にスレッド選択回路で選択されたスレッド番号が格納されていることになる。【００７５】
図２３及び図２４に、選択スレッド番号管理レジスタの動作を示す。
例として、動作するスレッド数が５スレッドのときを用いて説明する。
このときに、選択スレッド番号管理レジスタは、エントリ０からエントリ４で構成される。ある時点で、選択スレッド番号管理レジスタのエントリ０にスレッド３、エントリ１にスレッド０、エントリ２にスレッド２、エントリ３にスレッド４、エントリ４にスレッド５が格納されている。図２３では、スレッド選択回路で、スレッド３が選択されたときを示している。このときに、選択スレッド番号管理レジスタでは、選択されたスレッド３が、最新に選択されたスレッドを格納するエントリ４に格納され、エントリ１から４まで格納されていたスレッド番号が、１つずつ小さいエントリ番号にシフトして格納される。すなわち、スレッド選択回路でスレッド３を選択した後のサイクルでの、選択スレッド番号管理レジスタは、エントリ０にスレッド０、エントリ１にスレッド２、エントリ２にスレッド４、エントリ３にスレッド１、エントリ４にスレッド０が格納されることになる。また、図２４では、スレッド選択回路で、スレッド２が選択されたときに、選択スレッド番号管理レジスタは、選択されたスレッド２がエントリ４に格納される。選択されたスレッド２はエントリ２に格納されていたために、エントリ０と１に格納しているスレッド番号については、このサイクルでは移動することはない。エントリ３と４に格納されていたスレッド番号が、１つずつ小さいエントリ番号に格納される。【００７６】
すなわち、スレッド選択回路でスレッド２を選択した後のサイクルでの選択スレッド番号管理レジスタは、エントリ０にスレッド３、エントリ１にスレッド０、エントリ２にスレッド４、エントリ３にスレッド１、エントリ４にスレッド２が格納されることになる。【００７７】
図２５に、３スレッド以上のスレッド選択回路でのスレッド選択方法を示す。
スレッド選択方法は、スレッド選択回路で選択されていない時間が最も長いスレッド番号を優先して選択することが可能となるようにする。選択スレッド番号管理レジスタのエントリ０には、スレッド選択回路で選択されていない時間が最も長いスレッド番号が格納されている。選択スレッド番号管理レジスタのエントリ０のスレッド番号から順番に見ていくことでスレッドを選択することになる。【００７８】
ステップＳ３０で、エントリ０のスレッドＩＤのスレッドを選択したか否かを判断する。ステップＳ３０の判断がＹｅｓの場合には、エントリ０のスレッドＩＤを選択し、ステップＳ３４に進む。ステップＳ３０の判断がＮｏの場合には、ステップＳ３１において、エントリ１のスレッドＩＤのスレッド選択か否かを判断する。ステップＳ３１の判断がＹｅｓの場合には、エントリ１のスレッドＩＤを選択し、ステップＳ３４に進む。ステップＳ３１以降、エントリの数だけ、そのエントリが選択されたか否かを判断し、ステップＳ３２において、エントリ（Ｓ−１）のスレッドＩＤのスレッド選択か否かを判断する。ステップＳ３２の判断がＹｅｓの場合には、エントリ（Ｓ−１）のスレッドＩＤを選択し、ステップＳ３４に進む。ステップＳ３２の判断がＮｏの場合には、ステップＳ３３で、エントリＳｎｏスレッドＩＤを選択し、ステップＳ３４において、選択したスレッドのＩＤをＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤとする。【００７９】
図２６及び図２７に、選択スレッド番号管理レジスタのエントリ０と１のスレッド選択方法を示す。
エントリ０のスレッド番号のＣＳＥのエントリが空でなく、エントリ０のスレッド番号のクリア信号が発生していない状態であり、エントリ０のスレッド番号の実行待ち状態レジスタが有効でなければ、エントリ０のスレッド番号をＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤとする。エントリ０のスレッド番号のＣＳＥのエントリが空、もしくは、エントリ０のスレッド番号のクリア信号が発生した場合には、エントリ０以外のスレッド番号のＣＳＥのエントリが全て空の場合、もしくは、エントリ０以外のスレッド番号のクリア信号が全て発生している状態である場合にも、エントリ０のスレッド番号をＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤとする。エントリ０のスレッド番号のＣＳＥのエントリが空、もしくは、エントリ０のスレッド番号のクリア信号が発生した場合に、エントリ０以外のスレッド番号のＣＳＥのエントリが有効、もしくは、エントリ０以外のスレッド番号のクリア信号が発生していない状態の場合には、エントリ１のスレッド番号の状態を見ることになる。【００８０】
また、エントリ０のスレッド番号の実行待ち状態レジスタが有効な場合、エントリ０のスレッド番号以外のスレッドの実行待ち状態レジスタが全て有効な場合には、エントリ０のスレッド番号をＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤとする。エントリ０のスレッド番号の実行待ち状態レジスタが有効な場合で、エントリ０のスレッド番号以外のスレッドの実行待ち状態レジスタが有効でないスレッドがある場合には、実行待ち状態レジスタが有効でないスレッドのＣＳＥのエントリが全て空、もしくは、クリア信号が全て発生している場合には、エントリ０のスレッド番号をＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤとし、そうでない場合には、エントリ１のスレッド番号の状態を見ることになる。【００８１】
図２６において、ステップＳ４０において、エントリ０のスレッドＩＤのＣＳＥのエントリが空、若しくは、クリア信号が発生しているか否かを判断する。ステップＳ４０の判断がＮｏの場合には、ステップＳ４３において、エントリ０のスレッドＩＤの実行待ちレジスタが有効か否かを判断する。ステップＳ４３の判断がＮｏの場合には、ステップＳ４６に進む。ステップＳ４３の判断がＹｅｓの場合には、ステップＳ４４において、エントリ０のスレッドＩＤ以外の実行待ちレジスタが全て有効か否かを判断する。ステップＳ４４の判断がＹｅｓの場合には、ステップＳ４６に進む。ステップＳ４４の判断がＮｏの場合には、ステップＳ４５に進む。ステップＳ４５では、有効でないスレッドのＣＳＥのエントリが全て空、若しくは、クリア信号が全て発生しているか否かを判断する。ステップＳ４５の判断がＹｅｓの場合には、ステップＳ４６に進む。ステップＳ４５の判断がＮｏの場合には、ステップＳ４２に進み、エントリ１のスレッドＩＤを対象にして選択するかを判断する。ステップＳ４０の判断がＹｅｓの場合には、ステップＳ４１において、エントリ０のスレッドＩＤ以外のＣＳＥのエントリが空、若しくは、クリア信号が全て発生しているか否かを判断する。ステップＳ４１の判断がＹｅｓの場合には、ステップＳ４６に進む。ステップＳ４１の判断がＮｏの場合には、ステップＳ４２に進む。ステップＳ４６では、エントリ０のスレッドＩＤを選択し、ステップＳ４７において、選択したスレッドＩＤをＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤとして出力する。  図２７は、図２６のステップＳ４２以降の処理を示す。ステップＳ５１において、エントリ１のスレッドＩＤのＣＳＥのエントリが空、若しくは、クリア信号が発生しているか否かを判断する。ステップＳ５１の判断がＮｏの場合には、ステップＳ５４において、エントリ１のスレッドＩＤの実行待ちレジスタが有効か否かを判断する。ステップＳ５４の判断がＮｏの場合には、ステップＳ５７に進む。ステップＳ５４の判断がＹｅｓの場合には、ステップＳ５５において、エントリ０、１のスレッドＩＤ以外の実行待ちレジスタが全て有効か否かを判断する。ステップＳ５５の判断がＹｅｓの場合には、ステップＳ５７に進む。ステップＳ５５の判断がＮｏの場合には、ステップＳ５６に進む。ステップＳ５６では、有効でないスレッドのＣＳＥのエントリが全て空、若しくは、クリア信号が全て発生しているか否かを判断する。ステップＳ５６の判断がＹｅｓの場合には、ステップＳ５７に進む。ステップＳ５６の判断がＮｏの場合には、ステップＳ５３に進み、エントリ２のスレッドＩＤを対象にして選択するかを判断する。ステップＳ５１の判断がＹｅｓの場合には、ステップＳ５２において、エントリ０、１のスレッドＩＤ以外のＣＳＥのエントリが空、若しくは、クリア信号が全て発生しているか否かを判断する。ステップＳ５２の判断がＹｅｓの場合には、ステップＳ５７に進む。ステップＳ５２の判断がＮｏの場合には、ステップＳ５３に進む。ステップＳ５７では、エントリ１のスレッドＩＤを選択し、ステップＳ５８において、選択したスレッドＩＤをＮＥＷ＿ＮＥＸＴ完了対象エントリスレッドＩＤとして出力する���【００８２】
以下、スレッド数がもっと多くなっても、同様の処理をステップＳ５３の部分に継ぎ足していくのみである。
【図１】
2008155804.tif 000003
【図２】
2008155804.tif 000004
【図３】
2008155804.tif 000005
【図４】
2008155804.tif 000006
【図５】
2008155804.tif 000007
【図６】
2008155804.tif 000008
【図７】
2008155804.tif 000009
【図８】
2008155804.tif 000010
【図９】
2008155804.tif 000011
【図１０】
2008155804.tif 000012
【図１１】
2008155804.tif 000013
【図１２】
2008155804.tif 000014
【図１３】
2008155804.tif 000015
【図１４】
2008155804.tif 000016
【図１５】
2008155804.tif 000017
【図１６】
2008155804.tif 000018
【図１７】
2008155804.tif 000019
【図１８】
2008155804.tif 000020
【図１９】
2008155804.tif 000021
【図２０】
2008155804.tif 000022
【図２１】
2008155804.tif 000023
【図２２】
2008155804.tif 000024
【図２３】
2008155804.tif 000025
【図２４】
2008155804.tif 000026
【図２５】
2008155804.tif 000027
【図２６】
2008155804.tif 000028
【図２７】
2008155804.tif 000029
【手続補正書】
【提出日】平成21年8月12日(2009.8.12)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
命令の実行をパイプラインでアウト・オブ・オーダーで行い、イン・オーダーで命令の実行を完了する情報処理装置において、
命令の完了処理と、完了した命令のプログラマブルな資源の更新を行なうために命令の実行完了に伴う資源更新までの制御を行うためのデータを格納するエントリの記憶領域を備え、各エントリを、同時に実行されるスレッドの数分の、各スレッドに対応する連続領域に分けて格納するコミットスタックエントリ（ＣＳＥ）手段と、
該ＣＳＥ手段のエントリの中から、完了判別の対象となるエントリのスレッドを１つ選択するスレッド選択手段と、
該スレッド選択手段によって選択されたスレッドに対応するＣＳＥ手段のエントリの中から、未解放のエントリであり、かつ、最も古いエントリを先頭にして、完了判別の対象となるエントリを取得する完了対象エントリ手段と、
該完了対象エントリ手段のエントリに対して、完了判別を行い、該エントリの命令のプログラマブルな資源の更新を行なう完了判別手段と、
を備えることを特徴とする情報処理装置。
【請求項２】
前記ＣＳＥ手段は、スレッドの未解放のエントリで最も古いエントリの番号を示すポインタレジスタを、同時に実行されるスレッドの数分備える請求項１に記載の情報処理装置。
【請求項３】
前記完了判別の対象として取得されるエントリの数は、１マシンサイクルで同時に完了判別可能な最大数であることを特徴とする請求項１に記載の情報処理装置。
【請求項４】
前記ＣＳＥ手段は、単一のスレッドのみで前記情報処理装置が動作している場合には、動作中のスレッドに対し、全てのエントリを割り当てて格納することを特徴とする請求項１に記載の情報処理装置。
【請求項５】
パイプラインにクリア信号が発行された場合に、クリア信号が発行されたパイプラインに対応するスレッドの、前記ＣＳＥ手段のエントリをリセットするリセット手段と、
クリア信号が発行されたスレッドと、前記完了対象エントリ手段に格納されているエントリのスレッドとが一致する場合に、該完了対象エントリ手段のエントリを無効化するエントリ無効化手段と、
該完了対象エントリ手段のエントリが無効化された際に、完了判別処理を無効化する完了判別処理無効化手段と、
クリア信号が発行されたスレッドに対し、前記スレッド選択手段に、スレッドごとに割り当てられている該ＣＳＥ手段の記憶領域の先頭位置を選択させる初期化手段と、
を更に備えることを特徴とする請求項１に記載の情報処理装置。
【請求項６】
クリア信号が発行されたスレッドと、前記完了対象エントリ手段にＣＳＥのエントリのコピーを格納しようとしているスレッドが一致する場合に、該完了対象エントリ手段のエントリにＣＳＥのエントリのコピーを格納することを無効化する手段、
を更に備えることを特徴とする請求項５に記載の情報処置装置。
【請求項７】
前記スレッド選択手段は、動作していないスレッドを選択しないことを特徴とする請求項１に記載の情報処理装置。
【請求項８】
実行待ち状態であるために完了判別が完了できないエントリについて、実行待ちである要因を格納し、実行が完了するまで保持する、スレッドごとに設けられたレジスタ手段を更に備えることを特徴とする請求項１に記載の情報処理装置。
【請求項９】
対応するパイプラインにクリア信号が発行されたスレッドの該レジスタ手段をクリアする第１のクリア手段と、
一定間隔のサイクルで、全ての該レジスタ手段をクリアする第２のクリア手段と、
を更に備えることを特徴とする請求項８に記載の情報処理装置。
【請求項１０】
前記スレッド選択手段は、実行待ち状態が有効なスレッドは選択しないことを特徴とする請求項８に記載の情報処理装置。
【国際調査報告】
2008155804.tif 000030
2008155804.tif 000031