(57)【要約】  複数の命令を有するスレッドを実行するスレッド実行処理部と、複数のレジスタを備えたレジスタウィンドウを有するレジスタファイルと、レジスタウィンドウが入出力可能なレジスタの位置を示すカレントウィンドウポインタと、カレントウィンドウポインタにより指定されるレジスタウィンドウが保持するデータを読み出して保持するカレントレジスタと、レジスタファイルからカレントレジスタに転送されるデータを保持する置換バッファと、レジスタファイル内のデータを置換バッファに転送する第１のデータ転送路と、置換バッファ内のデータをカレントレジスタに転送する第２のデータ転送路と、レジスタウィンドウの切替命令を実行する演算手段と、演算手段が切替命令を実行した場合には、切替命令を有するスレッドに対応して、第１のデータ転送路と第２のデータ転送路を制御する制御手段を備えた。
2008155838.tif 000002
【特許請求の範囲】
【請求項１】
複数の命令を有するスレッドを実行するスレッド実行処理部と、
複数のレジスタを備えたレジスタウィンドウを有する、前記スレッド毎に備えられたレジスタファイルと、
前記スレッド毎に備えられ、前記レジスタウィンドウが入出力可能なレジスタの位置を示すカレントウィンドウポインタと、
前記スレッド毎に備えられ、前記カレントウィンドウポインタにより指定されるレジスタウィンドウが保持するデータを、前記レジスタファイルから読み出して保持するカレントレジスタと、
前記スレッド毎に備えられ、前記レジスタファイルから前記カレントレジスタに転送されるデータを保持する置換バッファと、
前記複数のレジスタファイルのいずれかから選択されたレジスタファイル内のデータを、前記複数の置換バッファのいずれかに転送する第１のデータ転送路と、
前記複数の置換バッファのいずれかから選択された置換バッファ内のデータを、前記複数のカレントレジスタのいずれかに転送する第２のデータ転送路と、
前記スレッド毎に備えられ、前記レジスタウィンドウの切替命令を実行する演算手段と、
前記演算手段が前記いずれかのスレッドに含まれる切替命令を実行した場合には、前記切替命令を有するスレッドに対応して、前記第１のデータ転送路と前記第２のデータ転送路を制御する制御手段を備えることを特徴とする演算処理装置。
【請求項２】
前記演算手段が、前記切替命令が属するスレッドを他のスレッドから識別する情報を得て、その情報によって識別されるスレッドに対応したレジスタウィンドウを切り替えるものであることを特徴とする請求項１記載の命令処理装置。
【請求項３】
前記命令を解読する解読部と、
前記解読部で解読された命令のうち、前記演算手段が実行する切替命令以外の命令を実行する、複数の命令を同時に実行可能な実行部とを備え、
前記演算手段が、前記解読部によって前記切替命令が解読された場合に前記データを前記置換バッファへと転送させ、該切替命令よりも前に完了するべき全ての命令が完了した場合に該データを前記カレントレジスタへと転送させるものであることを特徴とする請求項１または２記載の命令処理装置。
【請求項４】
前記解読部が、複数のスレッドそれぞれの命令を、一時にはいずれか１つのスレッドについて解読するものであり、
前記実行部が、互いに異なるスレッドに属する複数の命令を同時に実行可能なものであることを特徴とする請求項３記載の命令処理装置。
【請求項５】
前記演算手段が、前記解読部によって解読済の切替命令を受け取って前記データを前記置換バッファへと転送させるものであり、
前記解読部によって前記切替命令が解読され、該切替命令よりも前に完了するべき未了の命令が存在する場合に、前記演算手段に送られる前の切替命令を該解読部から受け取って保持する切替命令スタックを備えたことを特徴とする請求項３または４記載の命令処理装置。
【請求項６】
前記切替命令スタックが、複数の前記切替命令を保持可能なものであり、
前記制御手段が、前記切替命令スタックに保持された切替命令を１つずつ前記演算手段へ送ることで前記第１のデータ転送路および前記第２のデータ転送路を制御するものであることを特徴とする請求項５記載の命令処理装置。
【請求項７】
前記制御手段が、前記切替命令スタックに保持された切替命令のうち、該切替命令よりも前に完了するべき全ての命令が先に完了した切替命令を先に前記演算手段へ送るものであることを特徴とする請求項６記載の命令処理装置。
【請求項８】
前記制御手段が、前記切替命令スタックに保持された複数の切替命令について、該切替命令よりも前に完了するべき全ての命令が同時に完了した場合には、それら複数の切替命令のうち該切替命令スタックに先に保持された切替命令を先に前記演算手段へ送るものであることを特徴とする請求項６または７記載の命令処理装置。
【請求項９】
前記切替命令スタックが、前記切替命令に対応付けて、該切替命令が属するスレッドを他のスレッドから識別するスレッド識別子、および該切替命令をこの命令処理装置内で実行中の他の命令から識別する命令識別子も保持するものであることを特徴とする請求項５から８のうちいずれか１項記載の命令処理装置。
【請求項１０】
複数の前記スレッドのそれぞれから命令を入手して前記解読部に投入する、前記切替命令スタックに前記切替命令が保持されている場合には、該切替命令が属するスレッドと同じスレッドについては命令の投入を中断して他のスレッドに属する命令を投入する命令投入部を備えたことを特徴とする請求項５から９のうちいずれか１項記載の命令処理装置。
【請求項１１】
前記解読部が、複数の命令を同時に保持し、その保持している命令を解読するものであり、
前記解読部よりも前に、該解読部による命令の解読よりも簡易な解読によって該命令が前記切替命令であるか否かを確認する前解読部と、
複数の前記スレッドのそれぞれから命令を入手して前記解読部に投入する、前記前解読部によって前記切替命令であると確認された命令については、一時には高々１つが前記解読部に保持されるように投入タイミングを調整する命令投入部とを備えたことを特徴とする請求項３から１０のうちいずれか１項記載の命令処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のスレッドを同時に実行するマルチスレッディング機能を備えた命令処理装置に関する。
【背景技術】
【０００２】
プログラムを構成する各命令は、ＣＰＵに代表される命令処理装置の内部において、命令の取り込み（フェッチ）、命令の解読（デコード）、命令の実行、実行結果の確定（コミット）といった一連の段階を経て処理される。従来、複数の命令それぞれにＣＰＵ資源を時分割に割り当てて処理を実行するパイプラインという技術が知られている。パイプラインを適用することによって、ある命令の実行が行われている間に、次の命令のデコードや、さらに次の命令のフェッチを行うといった並列処理が可能となり、また、命令の実行自体もパイプライン化することによって、命令処理装置における処理速度を高速化することができる。【０００３】
また、近年では、上述したパイプラインを複数本備えることによって、さらなる処理の高速化が図られたスーパースカラ方式が広く用いられてきており、さらには、命令の実行に必要な条件が揃えば、命令のプログラム順序を守らずに、プログラム順序を追い抜いて実行可能なアウト・オブ・オーダも適用されてきている。【０００４】
図１は、スーパースカラ方式におけるアウト・オブ・オーダの概念を説明するための図である。【０００５】
図１では、プログラムを構成している４つの命令がアオウトオブオーダで処理されている例が示されており、各命令は、フェッチ（ステップＳ５０１）、デコード（ステップＳ５０２）、実行（ステップＳ５０３）、およびコミット（ステップＳ５０４）という４段階を経て処理されている。フェッチ（ステップＳ５０１）、デコード（ステップＳ５０２）、およびコミット（ステップＳ５０４）は、４つの命令に対して予め決められたプログラム順序で行われ（イン・オーダ）、命令の実行（ステップＳ５０３）は、プログラム順序に関わらず、条件が揃ったものから先に行われる（アウト・オブ・オーダ）。【０００６】
図１に示すアウト・オブ・オーダを実現するためには、複数の命令が並列に実行される実行過程（ステップＳ５０３）において、それらの命令で使用されるデータを上書きせずに保持しておく必要がある。スーパースカラ方式のアウト・オブ・オーダが適用された命令処理装置では、リング状に連結された複数のデータ格納場所（以下では、各格納場所をレジスタウィンドウと称する）を切り替えて使用することが行われている場合がある。【０００７】
図２は、複数のレジスタウィンドウで構成されたレジスタファイルの概念図である。【０００８】
このレジスタファイルＡは、全８つのレジスタウィンドウＷ０〜Ｗ７で構成されており、現在使用中のレジスタウィンドウ（図２では、１番目のレジスタウィンドウＷ１）がＣＷＰ（Ｃｕｒｒｅｎｔ  Ｗｉｎｄｏｗ  Ｐｏｉｎｔｅｒ）によって指し示されている。図２の例では、各レジスタウィンドウＷ０〜Ｗ７は、３２本のレジスタで構成されており、それらのうち８本のレジスタは全てのレジスタウィンドウＷ０〜Ｗ７に共通のｇｌｏｂａｌ領域として利用され、それ以外の２４本のレジスタは、８本ずつ、ｉｎ領域，ｌｏｃａｌ領域，ｏｕｔ領域の計３つの領域に分けられている。【０００９】
例えば、太枠で囲んだレジスタウィンドウＷ１では、左端側のｉｎ１領域が１つ前のレジスタウィンドウＷ０のｏｕｔ０領域とオーバーラップしており、ｉｎ１領域がｏｕｔ０領域としても機能している。また、中央のｌｏｃａｌ１領域は、他のウィンドウとは重複しておらず、レジスタウィンドウＷ１が占有している。右端側のｏｕｔ１領域は、１つ先のレジスタウィンドウＷ２のｉｎ２領域とオーバーラップしており、レジスタウィンドウＷ１，Ｗ２で共通に利用される。【００１０】
ＣＷＰをインクリメントするＳＡＶＥ命令、ＣＷＰをデクリメントするＲＥＳＴＯＲＥ命令、任意の位置にＣＷＰを移動させるＣＷＰ更新命令やトラップが発せられると、それに従ってＣＷＰが移動することによりレジスタウィンドウが切り替えられる。【００１１】
ここで、レジスタファイルＡは多数のレジスタを有しているため、命令を受けるたびにＣＷＰが指し示しているレジスタウィンドウを探索すると、多大な処理時間がかってしまう。このため、全てのレジスタを有するマスタのレジスタファイルＡとは別に、レジスタファイルＡの一部がコピーされたワークレジスタを設けることによって、レジスタ探索にかかる処理時間を軽減することが行われている。特許文献１には、データの原本を格納するマスタレジスタファイル（ＭＲＦ：Ｍａｓｔｅｒ  Ｒｅｓｉｓｔｅｒ  Ｆｉｌｅ）と、ＣＷＰが指し示す現在のレジスタウィンドウのコピーを格納するカレントレジスタ（ＣＷＲ：Ｃｕｒｒｅｎｔ  Ｗｉｎｄｏｗ  Ｒｅｇｉｓｔｅｒ）とに加えて、現在のレジスタウィンドウの隣のレジスタウィンドウのコピーを格納する置換バッファ（ＣＲＢ：Ｃｕｒｒｅｎｔ  ｗｉｎｄｏｗ  Ｒｅｐｌａｃｅ  Ｂｕｆｆｅｒ）とを備えた汎用レジスタ（ＧＰＲ：Ｇｅｎｅｒａｌ  Ｐｕｒｐｏｓｅ  Ｒｅｇｉｓｔｅｒ）を搭載した命令処理装置について記載されている。【００１２】
図３は、マスタレジスタファイル、カレントレジスタ、および置換バッファを備えた汎用レジスタの概念図であり、図４はＳＡＶＥ命令が発せられた場合のデータ転送タイミングを示す図である。【００１３】
図３に示すように、汎用レジスタ（ＧＰＲ）１には、マスタレジスタファイル（ＭＲＦ）２、置換バッファ（ＣＲＢ）３、およびカレントレジスタ（ＣＷＲ）４が含まれており、マスタレジスタファイル（ＭＲＦ）２と置換バッファ（ＣＲＢ）３との間、および置換バッファ（ＣＲＢ）３とカレントレジスタ（ＣＷＲ）４との間は、データの転送路となるデータバス５，６で接続されている。マスタレジスタファイル（ＭＲＦ）２は、データの原本となるファイルであり、カレントレジスタ（ＣＷＲ）４には、カレントポインタ（ＣＷＰ）７で指し示されたレジスタウィンドウのデータがコピーされており、置換バッファ（ＣＲＢ）３には、レジスタウィンドウのデータがコピーされている。【００１４】
図４に示すように、カレントポインタ（ＣＷＰ）をインクリメントするＳＡＶＥ命令が発せられると、そのＳＡＶＥ命令がデコードされて、現在のカレントポインタ（ＣＷＰ）７が指し示すｎ番目のレジスタウィンドウの１つ先の（ｎ＋１）番目のレジスタウィンドウに格納されたデータが置換バッファ（ＣＲＢ）３にコピーされる。置換バッファ（ＣＲＢ）３にコピーされたデータは、先行命令が全て処理されると、カレントレジスタ（ＣＷＲ）４へと転送される。【００１５】
カレントレジスタ（ＣＷＲ）４への転送の前に、さらに続けて、例えばＳＡＶＥ命令が発せられた場合、置換バッファ（ＣＲＢ）３が１つめのＳＡＶＥ命令によって利用中であるため、２つめのＳＡＶＥ命令におけるマスタレジスタファイル（ＭＲＦ）２から置換バッファ（ＣＲＢ）３へのデータの転送が禁止（ストール）される。【００１６】
命令処理装置では、カレントレジスタ（ＣＷＲ）４に格納されたデータを使ってＳＡＶＥ命令の先行命令における処理が実行されており、置換バッファ（ＣＲＢ）３に格納されたデータは、ＳＡＶＥ命令の後続命令をアウト・オブ・オーダで処理するために用いられる。先行命令における処理が終了してその先行命令がコミットされると、カレントレジスタ（ＣＷＲ）４が開放され、１つめのＳＡＶＥ命令に従ってカレントポインタ（ＣＷＰ）７が１つ先に進められ、置換バッファ（ＣＲＢ）３に格納されているデータがカレントレジスタ（ＣＷＲ）４に転送されることによって、（ｎ＋１）番目のレジスタウィンドウのデータが利用可能となる。【００１７】
また、置換バッファ（ＣＲＢ）３からカレントレジスタ（ＣＷＲ）４へのデータの転送が終了すると、置換バッファ（ＣＲＢ）３が開放され、２つめのＳＡＶＥ命令がデコードされて、現在のカレントポインタが指し示す（ｎ＋１）番目のレジスタウィンドウの１つ先の（ｎ＋２）番目のレジスタウィンドウに格納されたデータが置換バッファ（ＣＲＢ）３にコピーされる。【００１８】
このように、ＳＡＶＥ命令やＲＥＳＴＯＲＥ命令がデコードされたら置換バッファ（ＣＲＢ）３を更新し、それらの命令がコミットしたらカレントレジスタ（ＣＷＲ）４を更新することによって、実行中の処理で利用されているデータを上書きすることなく、ＳＡＶＥ命令等に対する後続の命令で利用されるデータを用意してアウト・オブ・オーダ処理を行うことができ、処理時間を高速化することができる。【００１９】
ところで、従来から、ワープロ用アプリケーションを利用しながら、表計算用アプリケーションを利用するというように、複数のアプリケーションそれぞれに時分割にＣＰＵ資源を割り当てて、複数のアプリケーションを並列して実行するマルチタスクが一般的に利用されている。
また、命令処理装置には、複数種類の演算器が備えられており、命令実行の際には、実行対象の命令の内容に応じた演算器が使用されるが、同時に全種類の演算器が使用されることは少なく、不使用状態となっている演算器が存在するため、演算器の稼働率にはかなりの余裕がある。【００２０】
そこで、演算器の稼働率を向上させる技術として、各サイクルにおいて、あるスレッドについては不使用となった演算器を別のスレッドに割り当てて複数のスレッドの命令を同時並列に処理する同時マルチスレッディング（ＳＭＴ：Ｓｉｍｕｌｔａｎｅｏｕｓ  Ｍｕｌｔｉ  Ｔｈｒｅａｄｉｎｇ）機能が提案されている。【００２１】
図５は、ＳＭＴ機能の一例を概念的に示す図である。【００２２】
この図５では、スレッドＡおよびスレッドＢという２種類のスレッドに属する命令がＳＭＴ機能で実行される様子が示されている。図５における縦軸方向に並ぶ４つの升それぞれは、命令処理装置において命令の実行を行う演算器を表わしており、各升に記載されている「Ａ」「Ｂ」の文字は、それぞれ、その升に対応する演算器で実行される命令が属するスレッドの種類を示している。【００２３】
また、横軸には、命令処理装置におけるクロックサイクルが示されている。図５の例では、第１サイクル（ステップＳ５１１）では、上段の２個の演算器でスレッドＡの命令が実行され、下段の２個の演算器でスレッドＢの命令が実行されている。第２サイクル（ステップＳ５１２）では、最上段と最下段の２個の演算器でスレッドＡの命令が実行され、中段の２個の演算器でスレッドＢの命令が実行されている。また、第３サイクル（ステップＳ５１３）では、上側の３個の演算器でスレッドＡの命令が実行され、最下段の１個の演算器でスレッドＢの命令が実行されている。【００２４】
このように、ＳＭＴ機能では、複数のスレッドの命令を各サイクルに同時並行で実行することができ、スレッドが異なる複数の命令においても、命令の実行に必要な条件が揃えば、プログラム順序を追い抜いて実行することができることとなる（アウト・オブ・オーダ）。【００２５】
図６は、ＳＭＴ機能によるアウト・オブ・オーダの概念を示す図である。【００２６】
同じスレッドに属する複数の命令では、命令フェッチ、命令デコード、およびコミットはプログラム順序に従って行う必要があるのに対し、スレッドが異なる複数の命令においては、どのステージにおいても、命令が発せられた順序に関係なく、条件が揃った命令から順に実行することができる。また、ＳＭＴ機能によると、同じスレッドに属する命令に関しては、他の命令の処理の実行が終了までコミットが待機されるストールが生じる場合があるが、異なるスレッドに属する命令に関しては、コミットの順番などを待つ必要がないので、アプリケーション全体としての処理時間をさらに短縮させることができる。
【特許文献１】特開２００７−８７１０８号公報
【００２７】
ここで、図６に示すようなＳＭＴ機能によるアウト・オブ・オーダを実現するためには、図１に示すデコーダや、図３に示す汎用レジスタ（ＧＰＲ）１やバス５，６などといったＣＰＵ資源をスレッド数分用意することが考えられる。しかし、近年ではスレッド数が増加してきており、今後さらにＣＰＵ資源を増設していくことは、命令処理装置の大型化やコストの増加を招いてしまうという問題がある。【００２８】
本発明は、上記事情に鑑み、コストの増加や装置の大型化を抑えて同時マルチスレッディングを実現することができる命令処理装置を提供することを目的とする。
【発明の開示】
【００２９】
上記目的を達成する本発明の命令処理装置は、複数の命令を有するスレッドを実行するスレッド実行処理部と、
複数のレジスタを備えたレジスタウィンドウを有する、スレッド毎に備えられたレジスタファイルと、
スレッド毎に備えられ、レジスタウィンドウが入出力可能なレジスタの位置を示すカレントウィンドウポインタと、
スレッド毎に備えられ、カレントウィンドウポインタにより指定されるレジスタウィンドウが保持するデータを、レジスタファイルから読み出して保持するカレントレジスタと、
スレッド毎に備えられ、レジスタファイルからカレントレジスタに転送されるデータを保持する置換バッファと、
複数のレジスタファイルのいずれかから選択されたレジスタファイル内のデータを、複数の置換バッファのいずれかに転送する第１のデータ転送路と、
複数の置換バッファのいずれかから選択された置換バッファ内のデータを、複数のカレントレジスタのいずれかに転送する第２のデータ転送路と、
スレッド毎に備えられ、レジスタウィンドウの切替命令を実行する演算手段と、
演算手段がいずれかのスレッドに含まれる切替命令を実行した場合には、切替命令を有するスレッドに対応して、第１のデータ転送路と第２のデータ転送路を制御する制御手段を備えることを特徴とする。
【００３０】
本発明の命令処理装置では、スレッド毎にレジスタファイル、置換バッファ、およびカレントレジスタが用意されているが、レジスタファイルと置換バッファとを繋ぐ第１のデータ転送路、および置換バッファとカレントレジスタとを繋ぐ第２のデータ転送路は、複数のスレッドで共通に利用される。互いに異なるスレッドに属する複数の切替命令それぞれに応じてデータが転送される場合には、第１のデータ転送路および第２のデータ転送路の競合が調停されるため、各スレッドごとにデータ転送路を用意することなく、複数のスレッドにおけるレジスタウィンドウの切り替えを行うことができ、装置の大型化とコストの上昇を抑えて同時マルチスレッディング機能を実現することができる。
【００３１】
また、レジスタファイルに格納されたデータのうち、次の切替命令によって使用されるデータを置換バッファに格納しておき、カレントレジスタを更新する際には、置換バッファに格納されたデータをコピーすることによって、大量のデータが格納されているレジスタファイルから対象データを探索する処理時間を省くことができる。
【００３２】
また、本発明の命令処理装置において、上記演算手段が、切替命令が属するスレッドを他のスレッドから識別する情報を得て、その情報によって識別されるスレッドに対応したレジスタウィンドウを切り替えるものであることが好適である。
【００３３】
本発明の好適な命令処理装置によると、複数のスレッドそれぞれに対応したレジスタファイル、置換バッファ、およびカレントレジスタ間におけるデータの転送を容易に区別して実行することができる。
【００３４】
また、本発明の命令処理装置において、
「命令を解読する解読部と、
解読部で解読された命令のうち、演算手段が実行する切替命令以外の命令を実行する、複数の命令を同時に実行可能な実行部とを備え、
上記演算手段が、解読部によって切替命令が解読された場合にデータを置換バッファへと転送させ、切替命令よりも前に完了するべき全ての命令が完了した場合にデータをカレントレジスタへと転送させるものである」
という形態は好ましい。
【００３５】
切替命令が解読された場合にデータが置換バッファへと転送され、その切替命令よりも前に完了するべき全ての命令が完了した場合にデータがカレントレジスタへと転送されることによって、アウト・オブ・オーダ処理を実行して、処理速度を短縮化することができる。
【００３６】
また、本発明の命令処理装置において、上記解読部が、複数のスレッドそれぞれの命令を、一時にはいずれか１つのスレッドについて解読するものであり、
上記実行部が、互いに異なるスレッドに属する複数の命令を同時に実行可能なものであることが好適である。
【００３７】
本発明の好適な命令処理装置によると、一般に複雑で大きい解読部を共用して回路規模を抑えるとともに、複数のスレッドに属する複数の命令を同時に実行することができる。
【００３８】
また、本発明の命令処理装置において、上記演算手段が、解読部によって解読済の切替命令を受け取ってデータを置換バッファへと転送させるものであり、
上記解読部によって切替命令が解読され、切替命令よりも前に完了するべき未了の命令が存在する場合に、演算手段に送られる前の切替命令を解読部から受け取って保持する切替命令スタックを備えたことが好ましい。
【００３９】
切替命令スタックが備えられることによって、ストールによって解読部が占有されてしまう不具合を確実に回避することができる。
【００４０】
また、本発明の命令処理装置において、上記切替命令スタックが、複数の前記切替命令を保持可能なものであり、
上記制御手段が、切替命令スタックに保持された切替命令を１つずつ演算手段へ送ることで第１のデータ転送路および第２のデータ転送路を制御するものであることが好ましい。
【００４１】
切替命令スタックに保持された切替命令が１つずつ演算手段へ送られることによって、容易に第１のデータ転送路および第２のデータ転送路の競合を調停することができる。
【００４２】
また、本発明の命令処理装置において、上記制御手段が、切替命令スタックに保持された切替命令のうち、切替命令よりも前に完了するべき全ての命令が先に完了した切替命令を先に演算手段へ送るものであることが好ましい。
【００４３】
複数の切替命令を、切替命令スタックに保持された順序ではなく、転送可能な状態になったものから先に演算手段に送ることによって、第１のデータ転送路や第２のデータ転送路などを効率よく利用することができ、処理時間を短縮させることができる。
【００４４】
また、本発明の命令処理装置において、前記制御手段が、切替命令スタックに保持された複数の切替命令について、切替命令よりも前に完了するべき全ての命令が同時に完了した場合には、それら複数の切替命令のうち切替命令スタックに先に保持された切替命令を先に演算手段へ送るものであることが好適である。
【００４５】
この好適な命令処理装置によると、第１のデータ転送路および第２のデータ転送路の競合を容易に調停することができる。
【００４６】
また、本発明の命令処理装置において、上記切替命令スタックが、切替命令に対応付けて、その切替命令が属するスレッドを他のスレッドから識別するスレッド識別子、および切替命令をこの命令処理装置内で実行中の他の命令から識別する命令識別子も保持するものであることが好ましい。
【００４７】
切替命令に対応付けてスレッド識別子と命令識別子とを保持することによって、その切替命令がどのスレッドに属し、スレッド内のいずれの切替命令なのかを容易に識別することができる。
【００４８】
また、本発明の命令処理装置において、複数の前記スレッドのそれぞれから命令を入手して解読部に投入する、切替命令スタックに切替命令が保持されている場合には、その切替命令が属するスレッドと同じスレッドについては命令の投入を中断して他のスレッドに属する命令を投入する命令投入部を備えたことが好ましい。
【００４９】
通常、同じスレッドに属する複数の命令においては、それらの命令がプログラム順序に従って実行される必要があるが、相互に異なるスレッドそれぞれに属する複数の命令においては、それらの命令はどのような順序で実行されてもよい。切替命令スタックに切替命令が保持されている場合に、切替命令が属するスレッドと同じスレッドについては命令の投入を中断して他のスレッドに属する命令を投入することによって、先に実行することができる命令のデータを先に転送することができ、処理時間を短縮させることができる。
【００５０】
また、本発明の命令処理装置において、上記解読部が、複数の命令を同時に保持し、その保持している命令を解読するものであり、
解読部よりも前に、解読部による命令の解読よりも簡易な解読によって命令が切替命令であるか否かを確認する前解読部と、
複数のスレッドのそれぞれから命令を入手して解読部に投入する、前解読部によって切替命令であると確認された命令については、一時には高々１つが解読部に保持されるように投入タイミングを調整する命令投入部とを備えたことが好ましい。
【００５１】
切替命令であると確認された命令については、一時には高々１つが解読部に保持されるように投入タイミングが調整されることによって、解読部内におけるストールを確実に回避することができる。
【図面の簡単な説明】
【００５２】
【図１】プログラムを構成している４つの命令がアオウトオブオーダで処理されている例を示す図である。
【図２】複数のレジスタウィンドウで構成されたレジスタファイルの概念図である。
【図３】マスタレジスタファイル、カレントレジスタ、および置換バッファを備えた汎用レジスタの概念図である。
【図４】ＳＡＶＥ命令が発せられた場合のデータ転送タイミングを示す図である。
【図５】ＳＭＴ機能の一例を概念的に示す図である。
【図６】ＳＭＴ機能によるアウト・オブ・オーダの概念を示す図である。
【図７】本命令処理装置の一実施形態であるＣＰＵ１０のハードウェア構成図である。
【図８】ＣＰＵの機能ブロック図である。
【図９】図８に示すＧＰＲの構成を示すブロック図である。
【図１０】切替命令の実行タイミングを制御する要素の機能ブロック図である。
【図１１】Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫおよびＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴに登録される情報を示す図である。
【図１２】ＣＳＥに登録される情報を示す図である。
【図１３】デコード制御部における処理の流れを示す図である。
【図１４】スタック部のブロック図である。
【図１５】ＳＡＶＥ命令およびＲＥＳＴＯＲＥ命令によるＤ＿ＭＯＶＥ処理の実行タイミングを示す図である。
【図１６】コミット制御部における処理の流れを示す図である。
【図１７】Ｗ＿ＭＯＶＥ処理の流れを示す図である。
【図１８】ＭＯＶＥ＿ＡＬＬ処理の流れを示す図である。
【図１９】切替処理におけるデータ転送のタイミングを示す図である。
【発明を実施するための最良の形態】
【００５３】
以下、図面を参照して実施の形態を説明する。【００５４】
図７は、命令処理装置の一実施形態であるＣＰＵ１０のハードウェア構成図である。【００５５】
このＣＰＵ１０は、パーソナルコンピュータなどの内部に搭載されて各種処理を実行するものである。また、このＣＰＵ１０では、複数の命令の連なりからなるスレッドを複数同時に実行する同時マルチスレッディング（ＳＭＴ：Ｓｉｍｕｌｔａｎｅｏｕｓ  Ｍｕｌｔｉ  Ｔｈｒｅａｄｉｎｇ）が適用されており、さらに、それら複数のスレッド間においては、命令が発せられた順序に関わらず、条件が揃った命令から先に実行可能なアウト・オブ・オーダ機構も適用されている。【００５６】
この図７に示すＣＰＵ１０は、２種類のスレッドの命令を同時に処理するものであり、次に示す７つのステージの処理が順次に行われる。即ち、２種類のスレッドの命令を交互にイン・オーダ実行でフェッチするフェッチステージ（ステップＳ１０１）、フェッチされた命令が表わしている処理をイン・オーダ実行でデコードするデコードステージ（ステップＳ１０２）、デコードされた命令を、その命令の処理の実行に要する演算器に接続されている後述のリザベーションステーションにイン・オーダ実行で格納し、その格納した命令を演算器にアウト・オブ・オーダ実行で引き渡すディスパッチステージ（ステップＳ１０３）、リザベーションステーションに格納された命令の実行に必要なオペランドをレジスタからアオウトオブオーダ実行で読み出すレジスタ読出しステージ（ステップ）Ｓ１０４、リザベーションステーションに格納された命令をレジスタから読み出されたオペランドを使ってアウト・オブ・オーダ実行で実行する実行ステージ（ステップＳ１０５）、実行結果のＣＰＵ１０外のメモリ等への記録などをアオウトオブオーダ実行で行うメモリステージ（ステップＳ１０６）、および、実行結果に従ってオペランド格納用のレジスタ等を更新してその実行結果を確定するコミットをイン・オーダ実行で行うコミットステージ（ステップＳ１０７）という７つのステージの処理が順次に行われる。【００５７】
以下、各ステージについ詳しく説明する。【００５８】
フェッチステージ（ステップＳ１０１）では、２種類のスレッド（スレッド０，スレッド１）それぞれについて用意されている２つのプログラムカウンタ１０１によって命令の取込み（フェッチ）が指示され、命令フェッチ部１０２が、入力側１次キャッシュ１０３から命令バッファ１０４に命令を取り込む。２つのプログラムカウンタ１０１は交互に動作し、１度のフェッチでは、いずれか一方のプログラムカウンタ１０１が、対応するスレッドの命令の取込みを指示する。また、本実施形態では、１回のフェッチで、８個の命令の取込みがイン・オーダ実行によりスレッド中の処理順で行われる。【００５９】
ＣＰＵ１０は、記載順とは異なる順序で取り込まれる命令の有無、および、スレッド中におけるその命令の記載位置を、先行する命令の実行に先立って予測する分岐予測部１０５を備えている。そして、命令フェッチ部１０２は、その分岐予測部１０５の予測結果を参照してフェッチを行う。【００６０】
ここで、本実施形態のＣＰＵ１０で実行されるプログラムは、不図示の外部メモリに格納されている。そして、ＣＰＵ１０は、このＣＰＵ１０に内蔵され２次キャッシュ１０６に接続されたシステムバスインタフェース１０７を介してその外部メモリ等と接続されている。プログラムカウンタ１０１が命令のフェッチを指示すると、命令フェッチ部１０２が、分岐予測部１０５の予測結果を参照して入力側１次キャッシュ１０３に８個の命令を要求する。すると、要求された８個の命令が、外部メモリから、システムバスインタフェース１０７と２次キャッシュ１０６とを経由して入力側１次キャッシュ１０３に入力され、入力側１次キャッシュ１０３がそれらの命令を命令バッファ１０４に引き渡す。このとき、本実施形態では、その引渡しに当たって、プリデコード部１０８が各命令に対して簡易的なデコード（プリデコード）を施す。そして、プリデコード部１０８は、命令バッファ１０４に引き渡される各命令に、そのプリデコードによる後述する結果を表すフラグを付す。【００６１】
デコードステージ（ステップＳ１０２）では、命令バッファ１０４が、命令フェッチ部１０２によって取り込まれ保持している８個の命令のうち４個の命令をデコード部１０９にイン・オーダ実行で投入する。デコード部１０９は、投入された４個の命令それぞれをイン・オーダ実行でデコードする。また、デコードの際には、各命令に対して、命令識別子（ＩＩＤ：Ｉｎｓｔｒｕｃｔｉｏｎ  ＩＤｅｎｔｉｆｉｃａｔｉｏｎ）として「０」から「６３」の番号が、各スレッドについてデコード順に割り振られる。ここで、本実施形態では、スレッド０の命令がデコードされる際には、「０」から「３１」のＩＩＤが割り振られ、スレッド１の命令がデコードされる際には、「３２」から「６３」のＩＩＤが割り振られる。このとき、デコード部１０９は、スレッド０用に３２個、スレッド１用に３２個の合計６４個のエントリを有する後述のコミットスタックエントリ（ＣＳＥ）１２７の、デコード対象の命令が属するエントリ群における空きエントリに、デコード対象の命令に割り振ったＩＩＤをセットする。【００６２】
デコード部１０９が、各々ＩＩＤが割り振られたデコード済みの４個の命令それぞれについて、各命令の処理の実行に要する演算器を決定する。そして、デコード済みの各命令を、その命令の処理の実行に要する演算器に接続されているリザベーションステーションにイン・オーダ実行で格納する。【００６３】
リザベーションステーションは、複数のデコード済みの命令を保持し、ディスパッチステージ（ステップＳ１０３）では、各命令をアウト・オブ・オーダ実行で演算器に引き渡す。即ち、リザベーションステーションは、スレッド中の処理順に係わり無く、処理の実行に必要なオペランドと演算器とが確保された命令から演算器に引き渡す。このとき、引渡し可能な命令が複数存在する場合には、それら複数の命令のうち先にデコードされた命令から演算器に引き渡す。本実施形態のＣＰＵ１０には、次の４種類のリザベーションステーションが備えられている。即ち、アドレス生成用リザベーションステーション（ＲＳＡ：Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  Ａｄｄｒｅｓｓ  ｇｅｎｅｒａｔｉｏｎ）１１０、整数演算用リザベーションステーション（ＲＳＥ：Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  Ｅｘｅｃｕｔｉｏｎ）１１１、浮動小数点演算用リザベーションステーション（ＲＳＬ：Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  Ｆｌｏａｔｉｎｇ  ｐｏｉｎｔ）１１２、および、分岐用リザベーションステーション（ＲＳＢＲ：Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ  ｆｏｒ  ＢＲａｎｃｈ）１１３の４種類のリザベーションステーションが備えられている。ここで、ＲＳＡ１１０とＲＳＥ１１１とＲＳＦ１１２とは、それぞれ対応する演算器に、オペランド格納用のレジスタを介して接続されている。これに対し、ＲＳＢＲ１１３は、上記の分岐予測部１０５に接続されており、分岐予測部１０５での予測結果の確定待ちや、予測失敗の場合の命令の再フェッチ指示等を行う役割を担っている。【００６４】
レジスタ読出しステージ（ステップＳ１０４）では、レジスタ内のオペランドがアウト・オブ・オーダ実行で読み出される。即ち、スレッド中の処理順に係わり無く、命令を演算器に引き渡したリザベーションステーションに接続されているレジスタ内のオペランドが読み出され、対応する演算器に渡される。ＣＰＵ１０には、整数系レジスタ（ＧＰＲ：Ｇｅｎｅｒａｌ  Ｐｕｒｐｏｓｅ  Ｒｅｇｉｓｔｅｒ）１１４と浮動小数点系レジスタ（ＦＰＲ：Ｆｌｏａｔｉｎｇ  Ｐｏｉｎｔ  Ｒｅｇｉｓｔｅｒ）１１６との２種類のレジスタが備えられている。ここで、ＧＰＲ１１４およびＦＰＲ１１６は、両方ともプログラム可視のレジスタであり、スレッド０とスレッド１とのそれぞれについて備えられている。また、ＧＰＲ１１４およびＦＰＲ１１６それぞれには、命令の実行結果を各レジスタの更新のときまで保持するバッファが接続されている。ＧＰＲ１１４には、整数系レジスタ更新バッファ（ＧＵＢ：ＧＰＲ  Ｕｐｄａｔｅ  Ｂｕｆｆｅｒ）１１５が接続され、ＦＰＲ１１６には、浮動小数点系レジスタ更新バッファ（ＦＰＲ：ＦＰＲ  Ｕｐｄａｔｅ  Ｂｕｆｆｅｒ）１１６が接続されている。【００６５】
アドレス生成および整数演算は、整数のオペランドを使って行われるので、ＧＰＲ１１４は上記のＲＳＡ１１０とＲＳＥ１１１とに接続されている。また、本実施形態では、ＧＰＲ１１４の更新前の段階のＧＵＢ１１５に保持されているオペランドを使った整数演算も許可されているので、このＧＵＢ１１５もＲＳＡ１１０とＲＳＥ１１１とに接続されている。また、浮動小数点演算は、浮動小数点形式のオペランドを使って行われるので、ＦＰＲ１１６は上記のＲＳＦ１１２に接続されている。また、本実施形態では、ＦＵＢ１１７に保持されているオペランドを使った浮動小数点演算も許可されているので、ＦＵＢ１１７もＲＳＦ１１２に接続されている。【００６６】
また、本実施形態のＣＰＵ１０には、２つのアドレス生成演算器（ＥＡＧＡとＥＡＧＢ：Ｅｆｆｅｃｔｉｖｅ  Ａｄｄｒｅｓｓ  Ｇｅｎｅｒａｔｉｏｎ  ｕｎｉｔｓ  Ａ  ａｎｄ  Ｂ）１１８，１１９、２つの整数演算器（ＥＸＡとＥＸＢ）１２０，１２１、および、２つの浮動小数点演算器（ＦＬＡとＦＬＢ）１２２，１２３が備えられている。そして、ＧＰＲ１１４とＧＵＢ１１５は、整数のオペランドを使うＥＡＧＡ１１８とＥＡＧＢ１１９とＥＸＡ１２０とＥＸＢ１２１とに接続されており、ＦＰＲ１１６とＦＵＢ１１７は、浮動小数点形式のオペランドを使うＦＬＡ１２２とＦＬＢ１２３とに接続されている。【００６７】
実行ステージ（ステップＳ１０５）では、演算器によって命令の実行がアウト・オブ・オーダ実行で行われる。即ち、スレッド中の処理順に係わり無く、上記の複数種類の演算器のうち、リザベーションステーションから命令が渡され、レジスタから演算に必要なオペランドが渡された演算器が、その渡された命令の処理を、その渡されたオペランドを使って実行する。また、実行ステージ（ステップＳ１０５）では、ある演算器の実行中に、別の演算器に命令とオペランドの引渡しが行われたときには、それらの演算器が同時並行に処理を実行する。【００６８】
この実行ステージ（ステップＳ１０５）では、ＥＡＧＡ１１８に、ＲＳＡ１１０からアドレス生成処理の命令が渡され、ＧＰＲ１１４から整数のオペランドが渡されると、ＥＡＧＡ１１８は、その整数のオペランドを使ってアドレス生成処理を実行する。また、ＥＸＡ１２０に、ＲＳＥ１１１から整数演算処理の命令が渡され、ＧＰＲ１１４から整数のオペランドが渡されると、ＥＸＡ１２０は、その整数のオペランドを使って整数演算処理を実行し、ＦＬＡ１２２に、ＲＳＦ１１２から浮動小数点演算処理の命令が渡され、ＦＰＲ１１６から浮動小数点形式のオペランドが渡されると、ＦＬＡ１２２は、その浮動小数点形式のオペランドを使って浮動小数点演算処理を実行する。【００６９】
ＥＡＧＡ１１８およびＥＡＧＢ１１９の実行結果は、キャッシュ部もしくはシステムバスインタフェース１０７を介した外部メモリへのアクセスに使われるので、これらの演算器は、メモリからのデータの読出し口であるフェッチポート１２４と、書込み口であるストアポート１２５とに接続されている。ＥＸＡ１２０とＥＸＢ１２１の実行結果は、ＧＰＲ１１４を更新するための中間バッファのＧＵＢ１１５に接続され、さらにメモリの更新のための中間バッファの役割を果たす上記のストアポート１２５に接続される。また、ＦＬＡ１２２とＦＬＢ１２３の実行結果は、ＦＰＲ１１６を更新するための中間バッファのＦＵＢ１１７に接続され、さらにメモリの更新のための上記のストアポート１２５に接続されている。ている。また、ＥＸＡ１２０、ＥＸＢ１２１、ＦＬＡ１２２、およびＦＬＢ１２３は、煩雑さを避けるために図示が省略された接続線でＣＳＥ１２７に接続されている。そして、各演算器で実行される処理が、外部メモリへのアクセスを必要とせず各演算器での実行の終了をもって完了する処理である場合には、実行の終了時に各演算器からＣＳＥ１２７に実行完了通知が送られる。【００７０】
メモリステージ（ステップＳ１０６）では、実行結果の外部メモリへの記録等といった外部メモリへのアクセスがアウト・オブ・オーダ実行で行われる。即ち、そのようなアクセスを要する処理の命令が複数あった場合、スレッド中の処理順に係わり無く実行結果が得られた順でアクセスが行われる。このメモリステージ（ステップＳ１０６）では、アクセスは、１次キャッシュ１２６、２次キャッシュ１０６、およびシステムバスインタフェース１０７を介して、フェッチポート１２４やストアポート１２５によって行われる。また、外部メモリへのアクセスが終了すると、フェッチポート１２４やストアポート１２５からＣＳＥ１２７に不図示の接続線を介して実行完了通知が送られる。【００７１】
コミットステージ（ステップＳ１０７）では、ＣＳＥ１２７が、ＧＰＲ１１４、ＦＰＲ１１６、プログラムカウンタ１０１、および、ＣＰＵ１０において上述した処理以外の他の処理に使われるオペランドを保持するコントロールレジスタ１２８を、イン・オーダ実行で次のように更新する。上記の演算器等からＣＳＥ１２７に送られてくる実行完了通知には、その実行完了通知に対応する命令のＩＩＤと、その命令の終了後の更新対象のレジスタ等といった実行結果の確定（コミット）に必要な情報（コミット情報）とが記載されている。ＣＳＥ１２７は、実行完了通知が送られてくると、ＣＳＥ１２７が有する６４個のエントリのうち、実行完了通知に記載のＩＩＤと同じＩＩＤがセットされているエントリに、その実行完了通知に記載のコミット情報を格納する。そして、既に格納されている各命令に対応するコミット情報に従ったレジスタの更新を、イン・オーダ実行により、スレッド中の処理順に従って行う。【００７２】
ＣＰＵ１０は、概略、このように構成され、以上に説明した７つのステージに沿って動作する。【００７３】
以下では、図７に示すＧＰＲ１１４におけるデータの転送制御や、データの転送制御に関連する要素の詳細な構成について詳しく説明する。尚、説明の簡略化のため、以下では２つのスレッドを同時に実行する例について説明し、それら２つのスレッドを符号の末尾に付したアルファベット「Ａ」，「Ｂ」で区別する。【００７４】
図８は、ＣＰＵ１０の機能ブロック図である。【００７５】
本実施形態においては、ＣＰＵ１０に２つのスレッドそれぞれに対応したＧＰＲ１１４Ａ，１１４Ｂが用意されている。図２で説明したように、ＧＰＲ１１４Ａ，１１４Ｂは、複数のレジスタウィンドウに分割されており、ＣＷＰが指し示しているレジスタウィンドウのデータが図７の演算ステージ（ステップＳ１０５）において使用されている。以下では、ＣＷＰを１つずつ移動させて、ステップＳ１０５で使用されるレジスタウィンドウを切り替える命令を切替命令と称して説明する。【００７６】
ＣＰＵ１０には、２つのスレッドそれぞれに含まれる複数の命令をキャッシュする命令キャッシュ部２１０、命令キャッシュ部２１０にキャッシュされた命令を命令デコード部２３０に投入する命令投入部２２０、投入された命令を解読する命令デコード部２３０、命令デコード部２０で解読された命令が切替命令であった場合に、その切替命令が格納されるＤ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１、切替命令の処理を実行する指示が発せられるＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２、図７にも示すＧＰＲ１１４Ａ，１１４Ｂ、デコードされた複数の命令を並列に処理する演算器２５０、各スレッドごとに命令の実行状態（実行中／終了）を管理するテーブルであるＣＳＥ２６１Ａ，２６１Ｂ、および各スレッドを構成している一連の命令が終了した段階でスレッドの終了を確定する命令コミット部２６２が備えられている。同じスレッドに属する複数の命令においては、命令デコード部２３０では決められた順序で命令が解読され（イン・オーダ）、演算器２５０では順序を超えて並列に処理が実行され（アウト・オブ・オーダ）、命令コミット部２６２では、同じスレッドに属する先行命令の終了を待って決められた順序でコミットが行われる（イン・オーダ）。また、スレッドが異なる複数の命令においては、命令デコード部２３０において片方ずつ命令がデコードされ、演算器２５０では両方同時に処理が実行され、および命令コミット部２６２では片方ずつ命令がコミットされ、アウト・オブ・オーダで複数の命令を実行することができる。【００７７】
図９は、図８に示すＧＰＲ１１４Ａ，１１４Ｂの構成を示すブロック図である。【００７８】
図２および図３で説明したように、データの原本を記憶するＭＲＦ２７１Ａ，２７１Ｂは複数のレジスタウィンドウに区切られており、ＣＷＲ２７３Ａ，２７３Ｂには、現在、ＣＷＰが指し示しているレジスタウィンドウのデータが格納されている。また、ＣＲＢ２７２Ａ，２７２Ｂは、ＭＲＦ２７１Ａ，２７１ＢとＣＷＲ２７３Ａ，２７３Ｂとの間に設けられ、切替命令に対して後続の命令において使用されるデータが格納されている。
演算器２５０において使用されるレジスタウィンドウを隣のレジスタウィンドウに切り替える切替命令としては、ＣＷＰをインクリメントして参照対象のレジスタウィンドウを１つ先のレジスタウィンドウに進めるＳＡＶＥ命令、ＣＷＰをデクリメントして参照対象のレジスタウィンドウを１つ前のレジスタウィンドウに戻すＲＥＳＴＯＲＥ命令が存在し、切替命令以外でレジスタウィンドウを変更する命令としては、ＣＷＰが指し示すレジスタウィンドウを直接指定して参照対象のレジスタウィンドウを任意のレジスタウィンドウに切り替えるＣＷＰ更新命令やトラップなどが存在する。切替命令がデコードされると、その切替命令が属するスレッドに対応するＭＲＦ２７１Ａ，２７１ＢからＣＲＢ２７２Ａ，２７２Ｂに、その切替命令に応じたレジスタウィンドウのデータが転送される。また、演算器２５０において切替命令と同じスレッドに属する先行命令の処理が終了すると、そのスレッドに対応するＣＷＲ２７３Ａ，２７３Ｂが開放され、ＣＲＢ２７２Ａ，２７２Ｂから開放されたＣＷＲ１３０Ａ，１３０にデータが転送される。以下では、ＳＡＶＥ命令およびＲＥＳＴＯＲＥ命令による、ＭＲＦ２７１Ａ，２７１ＢからＣＲＢ２７２Ａ，２７２Ｂへのデータの転送をＤ＿ＭＯＶＥと称し、ＳＡＶＥ命令およびＲＥＳＴＯＲＥ命令による、ＣＲＢ２７２Ａ，２７２ＢからＣＷＲ２７３Ａ，２７３Ｂへのデータの転送をＷ＿ＭＯＶＥと称する。【００７９】
また、ＣＷＰ更新命令やトラップによるデータの転送をＭＯＶＥ＿ＡＬＬと称する。ＭＯＶＥ＿ＡＬＬでは、ＣＷＰ更新命令がコミットしたとき、トラップ処理を行うことが決定したときに、ＭＲＦ２７１Ａ，２７１ＢからＣＲＢ２７２Ａ，２７２Ｂを経由してＣＷＲ２７３Ａ，２７３ＢにＣＷＰの示すデータをすべて転送する。このとき、ＣＲＢ２７２Ａ，２７２Ｂは中継バッファとなる。【００８０】
各ＭＲＦ２７１Ａ，２７１Ｂと各ＣＲＢ２７２Ａ，２７２Ｂとは、データの転送路であるＤ＿ＭＯＶＥバス２８１によって接続されており、各ＣＲＢ２７２Ａ，２７２Ｂと各ＣＷＲ２７３Ａ，２７３Ｂも、データの転送路であるＷ＿ＭＯＶＥバス２８２によって接続されている。本実施形態においては、Ｄ＿ＭＯＶＥバス２８１およびＷ＿ＭＯＶＥバス２８２は２つのスレッドで共有されている。これによって、ＣＰＵ１０全体の大型化やコストの増加が抑えられている。【００８１】
ここで、本実施形態においては、データを格納するＧＰＲ１１４Ａ，１１４Ｂや、コミット処理用のテーブルであるＣＳＥ２６１Ａ，２６１Ｂなどはスレッド数分用意されており、演算器２５０は複数のスレッドそれぞれに属する複数の命令を並列して行うことが可能であるが、命令デコード部２３０、命令コミット部２６２、Ｄ＿ＭＯＶＥバス２８１やＷ＿ＭＯＶＥバス２８２などは複数のスレッドで共有されている。このため、それぞれのスレッドに属する複数の命令によって共有要素の競合が発生しないように、各種処理の実行順序を制御する必要がある。特に、切替命令においては、スレッドが異なる複数の命令におけるＤ＿ＭＯＶＥバス２８１やＷ＿ＭＯＶＥバス２８２の競合の調停に加えて、実行中の処理で使用されているデータの上書きを回避するために、同じスレッドに属する複数の命令の実行順序を制御する必要がある。【００８２】
図１０は、切替命令の実行タイミングを制御する要素の機能ブロック図である。【００８３】
図１０には、命令のデコードのタイミングを制御するデコード制御部３１０と、切替命令に従ったデータ転送処理のタイミングを制御するＭＯＶＥ起動制御部３２０と、ＭＯＶＥ起動制御部３２０からデータ転送処理の指示を受けて、Ｄ＿ＭＯＶＥ、Ｗ＿ＭＯＶＥ、およびＭＯＶＥ＿ＡＬＬを実行するレジスタファイルＭＯＶＥ処理制御部３３０、および図９にも示すＧＰＲ１１４Ａ，１１４Ｂが示されている。【００８４】
まずは、図１０に示す各種要素における実行タイミングの制御で利用される情報について説明する。【００８５】
図１１は、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１およびＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２に登録される情報を示す図であり、図１２は、ＣＳＥ２６１Ａ，２６１Ｂに登録される情報を示す図である。【００８６】
Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１は、Ｄ＿ＭＯＶＥ処理が開始できない場合に、待機中の切替命令が格納されるスタックであり、２つのスレッドそれぞれに１つずつ用意されている。Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２はＤ＿ＭＯＶＥ処理制御部３３１に接続され、Ｄ＿ＭＯＶＥ処理を開始するときに１サイクルだけ中継するバッファである。Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１およびＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２には、命令デコード部２３０においてデコードされたＳＡＶＥ命令やＲＥＳＴＯＲＥ命令が登録される。ＳＡＶＥ命令およびＲＥＳＴＯＲＥ命令は、命令内容（ＶＡＬ）、ＳＡＶＥ命令の場合に「１」が設定されるＳＡＶＥフラグ（Ｄ＿ＳＡＶＥ）、ＲＥＳＴＯＲＥ命令の場合に「１」が設定されるＲＥＳＴＯＲＥフラグ（Ｄ＿ＲＥＳＴＯＲＥ）、命令が属するスレッドを識別するスレッド識別子（Ｄ＿ＴＨＲＥＡＤ＿ＩＤ）、および個々の命令を他の命令に対し識別する命令識別子（ＩＩＤ）で構成されている。【００８７】
また、図１２に示すＣＳＥ２６１Ａ，２６１Ｂは、各スレッドごとに１つずつテーブルが用意されており、各テーブルには、各スレッドを識別するスレッド番号が対応付けられている。また、各テーブルには、各スレッドに属する複数の命令それぞれのエントリが登録されている。ＣＳＥ２６１Ａ，２６１Ｂの各エントリには、処理の実行が終了すると「１」が設定される処理フラグ（ＶＡＬ）、命令オペコード（ＯＰＣＯＤＥ）、ＳＡＶＥ命令およびＲＥＳＴＯＲＥ命令の場合に「１」が設定されるバス利用フラグ（ＭＯＶＥ＿ＢＵＳ＿ＵＳＥ）、およびＤ＿ＭＯＶＥ処理が開始すると「１」が設定されるＤ＿ＭＯＶＥフラグ（Ｄ＿ＭＯＶＥ＿ＣＯＭＰ）が含まれている。【００８８】
これらＤ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１、Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２、およびＣＳＥ２６１Ａ，２６１Ｂに登録される各種情報は、その一部が図１０に示すデコード制御部３１０において登録される。【００８９】
図１０に示すデコード制御部３１０には、図８に示す命令キャッシュ部２１０、命令投入部２２０、および命令デコード部２３０が含まれている。【００９０】
図１３は、デコード制御部３１０における処理の流れを示す図である。【００９１】
各スレッドに属する命令が発せられると、その命令は命令キャッシュ部２１０にキャッシュされ、図１０に示す命令投入部２２０において命令がプリデコードされて、その命令がＳＡＶＥ命令あるいはＲＥＳＴＯＲＥ命令であるか否かと、命令が属するスレッドとが識別される。さらに、命令投入部２２０は、命令を命令バッファ２２０´に格納するとともに、その命令がＳＡＶＥ命令あるいはＲＥＳＴＯＲＥ命令である場合に、予め用意されているフラグに「１（ＳＡＶＥ命令あるいはＲＥＳＴＯＲＥ命令である）」をセットする。【００９２】
さらに、命令投入部２２０は、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１に切替命令が登録されていない場合には、命令バッファ２２０´に格納した命令を命令デコード部２３０に投入する。【００９３】
また、すでにＤ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１に切替命令が登録されている場合には、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１から図１１に示すスレッド識別子（Ｄ＿ＴＨＲＥＡＤ＿ＩＤ）を取得する。命令投入部２２０は、取得したスレッド識別子が表わすスレッドと同じスレッドに属する命令が命令バッファ２２０´に格納されている場合は、その命令の、命令デコード部２３０への投入を禁止し（ストール）、取得したスレッド識別子（Ｄ＿ＴＨＲＥＡＤ＿ＩＤ）が表わすスレッドとは異なるスレッドに属する命令が命令バッファ２２０´に格納されている場合は、その命令を先に命令デコード部２３０へ投入する。ストールされている命令は、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１に登録されている切替命令がレジスタファイルＭＯＶＥ処理制御部３３０に送られて、ストールが解除されてから命令デコード部２３０に投入される。【００９４】
Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１にスタックされる切替命令は、他の切替命令によるＤ＿ＭＯＶＥバス２８１の使用が終了し、Ｄ＿ＭＯＶＥバス２８１の使用許可が得られるまでは待機されるため、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１で待機中の切替命令と同じスレッドに属する命令が命令デコード部２３０に投入されると、その後続の命令も先行の切替命令が実行されるまでは実行が禁止（ストール）される。このため、その後続の命令によって命令デコード部２３０が占有されてしまい、別のスレッドに属する命令を実行できなくなってしまう。Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１にスタックされた命令と同じスレッドに属する命令が命令バッファ２２０´に格納されている場合は、その命令の、命令デコード部２３０への投入を禁止し（ストール）、別のスレッドに属する命令を先に命令デコード部２３０へ投入することによって、実行可能な状態の命令を先に行うことができ、処理を高速化することができる。【００９５】
命令デコード部２３０では、投入された命令がデコードされて、命令が属するスレッドのスレッド番号や、命令の種別などが識別される。また、命令デコード部２３０では、各命令に命令識別子（ＩＩＤ）が付与されるとともに、識別されたスレッド番号が対応付けられたＣＳＥ２６１Ａ，２６１Ｂの、その命令のエントリにおける処理フラグに「０：処理中」（ＶＡＬ）がセットされ、命令オペコード（ＯＰＣＯＤＥ）が設定され、命令が切替命令（ＳＡＶＥ命令あるいはＲＥＴＵＲＮ命令）である場合には、バス利用フラグ（ＭＯＶＥ＿ＢＵＳ＿ＵＳＥ）に「１」がセットされる。【００９６】
命令のデコードが終了すると、その命令が切替命令を除く通常の演算命令である場合には、その演算命令が図７に示す演算器２５０に投入され、演算器２５０において演算命令に従った処理が実行される。デコードされた命令が切替命令である場合、それらの命令は、Ｄ＿ＭＯＶＥ起動制御部３２０に投入される。【００９７】
ＭＯＶＥ起動制御部３２０には、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１、およびＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２で構成されるスタック部２４０と、図１１に示すＣＳＥ２６１Ａ、２６１Ｂと命令コミット部２６２で構成されるコミット制御部２６０、およびＣＲＢおよびＣＷＲを切り替えるＭＯＶＥ＿ＡＬＬ指示を発するトラップ・ＣＷＰ更新命令検出部２８０が備えられている。【００９８】
また、命令デコード部２３０でデコードされた命令がＳＡＶＥを実行するＳＡＶＥ命令、あるいはＲＥＳＴＯＲＥを実行するＲＥＳＴＯＲＥ命令である場合、それらＳＡＶＥ命令やＲＥＳＴＯＲＥ命令は、スタック部２４０に伝えられる。【００９９】
図１４は、スタック部２４０のブロック図である。【０１００】
図１４に示すように、スタック部２４０は、２つのＤ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２と、Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２と、それらを接続する接続線と、命令デコード部２３０から投入された切替命令を各スタックに切り替えて格納する切替回路とで構成されている。【０１０１】
先行する、コミットしていないＳＡＶＥ命令、もしくはＲＥＳＴＯＲＥ命令がない状態では、図１０に示すＭＲＦ２７１Ａ，２７１ＢからＣＲＢ２７２Ａ，２７２Ｂへのデータの転送の順番を待っている切替命令が存在せず、ＣＲＢ２７２Ａ，２７２Ｂが開放されていて上書きが生じない。さらにＤ＿ＭＯＶＥバス２８１が開放されている状態でストール要件がない場合は、スタック部２４０に投入されてきた命令はＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２に格納される。Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２では、Ｄ＿ＭＯＶＥ処理を実行する指示が図１０に示すレジスタファイルＭＯＶＥ処理制御部３３０に向けて発行される。【０１０２】
また、先行する、コミットしていないＳＡＶＥ命令，もしくはＲＥＳＴＯＲＥ命令がある場合は、その格納されている命令は、ＣＲＢ２７２Ａ，２７２Ｂの開放を待っていることを示し、ＣＲＢ２７２Ａ，２７２Ｂが使用中でありデータを上書きしてしまう可能性がある。またはＤ＿ＭＯＶＥバス２８１が使用されている状態でストール要件がある場合、スタック部２４０に投入されてきた切替命令は、一旦、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２に格納される。尚、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２に命令が格納されている間は、その命令と同じスレッドに属する命令は命令投入がストールされているため、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２には格納されない。すなわち、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２には、最大でも、スレッドが異なる命令が１つずつ格納されることとなる。【０１０３】
Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２に格納された切替命令は、Ｄ＿ＭＯＶＥバス２８１が開放されているとき、ＣＲＢ２７２Ａ，２７２Ｂの上書きが先に可能になった（ストールが解除された）スレッドの命令から先にＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２に転送される。また、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２それぞれに格納された切替命令のストールが同時に解除された場合は、先にＤ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２に格納された命令から順にＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２に転送される。【０１０４】
Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２に切替命令が格納されると、図１０に示すレジスタファイルＭＯＶＥ処理制御部３３０に向けてＤ＿ＭＯＶＥの実行指示が発行される。また、Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２からＭＯＶＥ処理制御部３３０にＤ＿ＭＯＶＥの実行指示が発行されると、ＣＳＥ２６１Ａ，２６１Ｂの、切替命令に対応するエントリのＤ＿ＭＯＶＥ＿ＣＯＭＰフラグに「１：Ｄ＿ＭＯＶＥ開始」が設定される。【０１０５】
レジスタファイルＭＯＶＥ処理制御部３３０は、Ｄ＿ＭＯＶＥ処理制御部３３１と、Ｗ＿ＭＯＶＥ処理制御部３３２とで構成されている。【０１０６】
Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２から発行されたＤ＿ＭＯＶＥ処理の実行指示、およびトラップ・ＣＷＰ更新命令検出部２８０から発行されたＭＯＶＥ＿ＡＬＬ処理の実行指示は、Ｄ＿ＭＯＶＥ処理制御部３３１に伝えられる。Ｄ＿ＭＯＶＥ処理制御部３３１は、各切替命令に対してＤ＿ＭＯＶＥバス２８１を使用して、その切替命令が属するスレッドに対応するＭＲＦ２７１Ａ，２７１ＢからＣＲＢ２７２Ａ，２７２Ｂにデータを転送させる。【０１０７】
図１５は、ＳＡＶＥ命令およびＲＥＳＴＯＲＥ命令によるＤ＿ＭＯＶＥ処理の実行タイミングを示す図である。Ｄ＿ＭＯＶＥで１６ワードのレジスタを２サイクル（１サイクル当り８ワードのレジスタ）かけて、ＭＲＦ２７１Ａ，２７１ＢからＣＲＢ２７２Ａ，２７２Ｂへ転送する場合について示している。【０１０８】
図１５に示すように、スタック部２４０に投入された切替命令は、直接、あるいは一旦Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２に格納された後で、Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２にセットされる（サイクルｔ１）。【０１０９】
その先行の切替命令は、次のサイクルｔ２にＤ＿ＭＯＶＥ処理制御部３３１に投入され、さらに次のサイクルｔ３にＤ＿ＭＯＶＥバス２８１を使用して、先行の切替命令に従ったＤ＿ＭＯＶＥ処理が実行される。【０１１０】
先行の命令とは異なるスレッドに属する命令は、先行の命令がＤ＿ＭＯＶＥ処理制御部３３１に投入されてＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２が開放され、かつＤ＿ＭＯＶＥバスが開放されるまで（サイクルｔ２）はＤ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２で待機される。サイクルｔ３でＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２にセットされ、Ｄ＿ＭＯＶＥ処理制御部３３１に投入される（サイクルｔ４）。先行の命令によるＤ＿ＭＯＶＥバス２８１の使用がサイクルｔ５でちょうど終わっているはずなので、競合せずに隙間なく次のＤ＿ＭＯＶＥ処理が開始される（サイクルｔ５）。【０１１１】
このように、デコードされた命令を、一旦、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２に格納して、Ｄ＿ＭＯＶＥ処理制御部３３１への投入順番を制御することによって、Ｄ＿ＭＯＶＥバス２８１の競合を容易に調停することができる。【０１１２】
切替命令に対してＤ＿ＭＯＶＥバス２８１の使用が許可されると、Ｄ＿ＭＯＶＥバス２８１を通って、切替命令が属するスレッドに対応するＭＲＦ２７１Ａ，２７１ＢからＣＲＢ２７２Ａ，２７２Ｂに対象のレジスタウィンドウのデータが転送される。このように、命令がデコードされたら、その命令によって使用されるデータをＣＲＢ２７２Ａ，２７２Ｂに転送しておき、切替命令後の命令処理に必要なデータをＣＲＢ２７２Ａ，２７２Ｂから読み出すことによって、切替命令の前後の命令をアウト・オブ・オーダで実行し，処理時間を短縮させることができる。【０１１３】
以上のようにして、Ｄ＿ＭＯＶＥ処理が実行される。【０１１４】
続いて、Ｗ＿ＭＯＶＥ処理とコミット処理について説明する。【０１１５】
まずは、通常の演算処理におけるコミット処理について説明する。【０１１６】
図８の命令デコード部２３０において、演算処理を実行する演算命令がデコードされると、図１２に示すＣＳＥ２６１Ａ，２６１Ｂのうちの、演算命令が属するスレッドに対応するＣＳＥ２６１Ａ，２６１Ｂに、その演算命令のエントリが生成される。また、命令デコード部２３０においてデコードされた演算命令は演算器２５０に伝えられ、演算器２５０において演算処理が実行される。演算命令に従った演算処理が終了すると、ＣＳＥ２６１Ａ，２６１Ｂの、その演算命令に対応するエントリの処理フラグ（ＶＡＬ）に「１：処理済」が設定される。【０１１７】
図１０のコミット制御部２６０は、ＣＳＥ２６１Ａ，２６１Ｂの処理フラグ（ＶＡＬ）を監視し、同じスレッドに属する複数の命令の処理フラグ（ＶＡＬ）が全て「１：処理済」となったら、命令コミット部２６２にそれらの命令を伝える。【０１１８】
命令コミット部２６２では、ＣＳＥ２６１Ａ，２６１Ｂから伝えられた複数の命令が、決められたプログラム順序でコミットされ、ＣＳＥ２６１Ａ，２６１Ｂの、コミットされた命令に相当するエントリが開放される。【０１１９】
続いて、ＳＡＶＥ命令およびＲＥＳＴＯＲＥ命令によるＷ＿ＭＯＶＥ処理とコミット処理について説明する。【０１２０】
図８の命令デコード部２３０において切替命令（ＳＡＶＥ命令、ＲＥＳＴＯＲＥ命令）がデコードされると、図１２に示すＣＳＥ２６１Ａ，２６１Ｂのうちの、その命令が属するスレッドに対応するＣＳＥ２６１Ａ，２６１Ｂに命令のエントリが生成される。また、デコードされた切替命令はＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２に格納されて、上述したＤ＿ＭＯＶＥ処理が実行される。Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２では、格納された切替命令がＤ＿ＭＯＶＥ処理制御部３３１に投入されると、ＣＳＥ２６１Ａ，２６１Ｂの、切替命令に対応するエントリのＤ＿ＭＯＶＥ＿ＣＯＭＰフラグに「１：Ｄ＿ＭＯＶＥ開始」が設定される。【０１２１】
コミット制御部２６０は、ＣＳＥ２６１Ａ，２６１ＢのＤ＿ＭＯＶＥ＿ＣＯＭＰフラグを確認することにより、コミット処理の実行タイミングを監視する。【０１２２】
図１６は、コミット制御部２６０における処理の流れを示す図である。【０１２３】
コミット制御部２６０は、各クロックサイクル毎にＣＳＥ２６１Ａ，２６１ＢのＤ＿ＭＯＶＥ＿ＣＯＭＰフラグを交互に監視し、Ｄ＿ＭＯＶＥ＿ＣＯＭＰフラグに「１：Ｄ＿ＭＯＶＥ開始」が設定されると、そのエントリが属するＣＳＥ２６１Ａ，２６１Ｂと対応付けられたスレッド番号を取得し、そのスレッドをコミット候補に設定する。【０１２４】
続いて、コミット候補が設定されてから所定サイクル（本実施形態においては、２サイクル）後に、ＣＳＥ２６１Ａ，２６１Ｂの、同じスレッドに属する先行命令に対応するエントリの処理フラグ（ＶＡＬ）に「１：処理済」が設定されているかと、Ｗ＿ＭＯＶＥバス２８２の利用状況を確認する。全ての先行命令が処理済で、Ｗ＿ＭＯＶＥバス２８２が利用されていない場合、コミット制御部２６０は、図１０に示すレジスタファイルＭＯＶＥ処理制御部３３０のＷ＿ＭＯＶＥ処理制御部３３２に向けてＷ＿ＭＯＶＥ処理を実行する指示を発行して、ＳＡＶＥ命令およびＲＥＳＴＯＲＥ命令のコミット（Ｗ＿ＭＯＶＥ処理）を行う。【０１２５】
処理が終了していない先行命令が存在したり、他のＭＯＶＥ処理によってＷ＿ＭＯＶＥバス２８２が利用されている場合、ＣＷＲ２７３Ａ，２７３ＢとＷ＿ＭＯＶＥバス２８２が開放されるのを待って、コミット制御部２６０からＷ＿ＭＯＶＥ処理制御部３３２に向けてＷ＿ＭＯＶＥ処理の実行指示が発行され、ＳＡＶＥ命令およびＲＥＳＴＯＲＥ命令のコミット（Ｗ＿ＭＯＶＥ処理）が行われる。【０１２６】
Ｗ＿ＭＯＶＥ処理制御部３３２は、Ｗ＿ＭＯＶＥ処理の実行指示が伝えられると、ＣＲＢ２７２Ａ，２７２Ｂに格納されているデータをＣＷＲ２７３Ａ，２７３Ｂに転送させる。【０１２７】
図１６の下に示すように、本実施形態においては、Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４０からＤ＿ＭＯＶＥ処理の実行指示が発せられると、コミット制御部２６０において、Ｄ＿ＭＯＶＥ処理制御部３３１でＤ＿ＭＯＶＥ処理が実行される間（２サイクル）コミット待ち状態となり、その後、Ｗ＿ＭＯＶＥバス２８２が開放されている場合は、コミット制御部２６０においてコミットが実行され、Ｗ＿ＭＯＶＥ処理制御部３３２でＷ＿ＭＯＶＥ処理が実行される。【０１２８】
図１７は、Ｗ＿ＭＯＶＥ処理の流れを示す図である。Ｗ＿ＭＯＶＥで１６ワードのレジスタを２サイクル（２サイクル当り８ワードのレジスタ）かけて、ＣＲＢ２７２Ａ，２７２ＢからＣＷＲ２７３Ａ，２７３Ｂへ転送する場合について示している。【０１２９】
図１７に示すように、コミット制御部２６０からレジスタファイルＭＯＶＥ処理制御部３３０のＷ＿ＭＯＶＥ処理制御部３３２に向けてＷ＿ＭＯＶＥ処理の実行指示が発行されると、Ｗ＿ＭＯＶＥ処理制御部３３２においてＷ＿ＭＯＶＥが実行されるとともに、Ｗ＿ＭＯＶＥ処理の実行指示が発行されてから２サイクルの間（Ｗ＿ＭＯＶＥが発行されたサイクルも含む）は、コミット制御部２６０によって他のスレッドにおける切替命令のコミットが禁止され、Ｗ＿ＭＯＶＥ処理の実行指示の発行が禁止される。先行のＷ＿ＭＯＶＥ処理の実行指示が発行されてから３サイクル目以降に達すると、コミット制御部２６９によって次の切替命令のコミットが許可され、その切替命令におけるＷ＿ＭＯＶＥ処理の実行指示を発行するのに１サイクルかかり、実際に後続のＷ＿ＭＯＶＥ処理が実行される４サイクル目以降では先行のＷ＿ＭＯＶＥ処理が終了しているため、Ｗ＿ＭＯＶＥバス２８２の競合を回避することができる。【０１３０】
続いて、ＣＷＰ更新命令やトラップによるＭＯＶＥ＿ＡＬＬ処理について説明する。【０１３１】
ＣＷＰ更新命令がコミットしたとき、またはトラップが発生したとき、トラップ・ＣＷＰ更新命令検出部２８０にこれが伝えられ、トラップ・ＣＷＰ更新命令検出部２８０からレジスタファイルＭＯＶＥ処理制御部３３０に向けてＭＯＶＥ＿ＡＬＬ実行指示（Ｄ＿ＭＯＶＥ実行指示＋Ｗ＿ＭＯＶＥ実行指示）が発行される。Ｄ＿ＭＯＶＥ処理制御部３３１およびＷ＿ＭＯＶＥ処理制御部３３２は、上述したＤ＿ＭＯＶＥ処理およびＷ＿ＭＯＶＥ処理を実行する。なおＣＷＰ更新命令の場合は、命令コミット後のＭＯＶＥ＿ＡＬＬ処理が完了するまで、後続の命令デコードを停止し、またトラップが発生した場合は後続の命令はすべてパイプラインからキャンセルしてしまい、さらにＭＯＶＥ＿ＡＬＬ処理が完了するまで後続の命令デコードを停止するようにする。【０１３２】
図１８は、ＣＷＰ更新命令またはトラップによるＭＯＶＥ＿ＡＬＬ処理の流れを示す図である。【０１３３】
トラップ・ＣＷＰ更新命令検出部２８０からレジスタファイルＭＯＶＥ処理制御部３３０に向けてＭＯＶＥ＿ＡＬＬ実行指示が発行されると、Ｄ＿ＭＯＶＥ処理およびＷ＿ＭＯＶＥ処理が実行される。この例では、１つのレジスタウィンドウを構成する３２のワード（図２にいうレジスタ）が８つずつ４回に分けて転送されている。まず、１回目の転送では、１サイクル目でＭＲＦ２７１Ａ，２７１ＢからＣＲＢ２７２Ａ，２７２Ｂに向けてデータが転送され、２サイクル目でＣＲＢ２７２Ａ，２７２ＢからＣＷＲ２７３Ａ，２７３Ｂへ向けてデータが転送される。２回目の転送では、１回目の転送における２サイクル目にＤ＿ＭＯＶＥが実行され、１回目の転送における３サイクル目でＷ＿ＭＯＶＥされており、以下、同様に、先行のＷ＿ＭＯＶＥと後続のＤ＿ＭＯＶＥとがパイプラインによって並列に実行される。【０１３４】
また、ＭＯＶＥ＿ＡＬＬ実行指示が発行されてから最後の転送が開始されるまでの間、他の切替命令によるＤ＿ＭＯＶＥ実行指示の発行を禁止し、この間Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫで待ち合わせることになる。ＭＯＶＥ＿ＡＬＬ実行指示が発行されてから最後の転送におけるＷ＿ＭＯＶＥが開始されるまでの間、他の切替命令によるＷ＿ＭＯＶＥ実行指示の発行を禁止する。これはこの間コミット制御部でコミットを抑止することで制御する。このようにしてＤ＿ＭＯＶＥバス２８１およびＷ＿ＭＯＶＥバス２８２を調停することができる。【０１３５】
最後に、具体的な切替処理の例を使って、処理の全体的な流れを説明する。【０１３６】
図１９は、切替処理におけるデータ転送のタイミングを示す図である。【０１３７】
この図１９には、１番目のスレッド０に属する１つ目のＳＡＶＥ命令、１番目のスレッド０に属する２つ目のＳＡＶＥ命令、および２番目のスレッド１に属する３つ目のＳＡＶＥ命令が順に発せられた場合における各切替命令の実行タイミングが示されている。【０１３８】
１番目のスレッド０に属する１つ目のＳＡＶＥ命令が発せられると、その１つ目のＳＡＶＥ命令がデコードされた後で、Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２に格納され、Ｄ＿ＭＯＶＥバス２８１を使ってＭＲＦ２７１Ａ（ＧＰＲマスタ）からＣＲＢ２７２Ａにデータが転送される（Ｄ＿ＭＯＶＥ）。これにより、ＣＲＢ２７２Ａは、１つ目のＳＡＶＥ命令によって使用中となる。具体的には、この１つ目のＳＡＶＥ命令の後続命令をアウトオブオーダで実行するためにＣＲＢ２７２Ａのデータが演算に使用される。【０１３９】
１番目のスレッド０に属する２つ目のＳＡＶＥ命令は、デコードされた後、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１に格納される。２つ目のＳＡＶＥ命令は、同じスレッドに属する１つ目のＳＡＶＥ命令によってＣＲＢ２７２Ａが開放されるまでＤ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２でストール状態となる。【０１４０】
一方、２番目のスレッド１に属する３つ目のＳＡＶＥ命令は、１つ目のＳＡＶＥ命令によるＣＲＢ２７２Ａの開放を待つ必要がなく、かつＤ＿ＭＯＶＥバス２８１の利用が許可されると、２つ目のＳＡＶＥ命令よりも先にＤ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２に格納される。そして、Ｄ＿ＭＯＶＥバス２８１を使ってＭＲＦ２７１ＢからＣＲＢ２７２Ｂにデータが転送される（Ｄ＿ＭＯＶＥ）。【０１４１】
１番目のスレッド０に属する演算命令の処理が終了し、ＣＷＲ２７３Ａの使用が終了してＣＷＲ２７３Ａが開放されると、１番目のスレッド０に属する１つ目のＳＡＶＥ命令によって、ＣＲＢ２７２ＡからＣＷＲ２７３Ａにデータが転送されて（Ｗ＿ＭＯＶＥ）、ＣＲＢ２７２Ａが開放される。その結果、２つ目のＳＡＶＥ命令におけるストールが解除される。【０１４２】
ストールが解除されると、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫ２４１＿１，２４１＿２において、３つ目のＳＡＶＥ命令とＤ＿ＭＯＶＥバス２８１の競合を調停して２つ目のＳＡＶＥ命令は、Ｄ＿ＭＯＶＥ＿ＩＳＳＵＥ＿ＳＬＯＴ２４２に格納され、Ｄ＿ＭＯＶＥが実行される。【０１４３】
Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫへの同じスレッドに属する複数の切替命令の格納を禁止することによって、それら複数の切替命令が同時に実行されて、使用中のＣＲＢ２７２Ａ，２７２ＢやＣＷＰ２７３Ａ，２７３Ｂのデータが上書きされてしまう不具合を回避することができ、Ｄ＿ＭＯＶＥ＿ＳＴＡＣＫにスタックされた命令のＤ＿ＭＯＶＥ処理制御部３３１への投入順序を制御することによって、Ｄ＿ＭＯＶＥバス２８１および第２バスの調停を容易に行うことができる。【０１４４】
このように、本実施形態においては、コストの増加や装置の大型化を抑えて同時マルチスレッディングを実現することができる。【０１４５】
ここで、上記では、２つのスレッドを同時に実行する命令処理装置の例について説明したが、本命令処理装置は、３つ以上のスレッドを同時に実行するものであってもよい。【０１４６】
また、上記では、本発明の命令処理装置をパーソナルコンピュータのＣＰＵに適用する例について説明したが、本発明の命令処理装置は、例えば、サーバ装置のＣＰＵなどであってもよい。
【図１】
2008155838.tif 000003
【図２】
2008155838.tif 000004
【図３】
2008155838.tif 000005
【図４】
2008155838.tif 000006
【図５】
2008155838.tif 000007
【図６】
2008155838.tif 000008
【図７】
2008155838.tif 000009
【図８】
2008155838.tif 000010
【図９】
2008155838.tif 000011
【図１０】
2008155838.tif 000012
【図１１】
2008155838.tif 000013
【図１２】
2008155838.tif 000014
【図１３】
2008155838.tif 000015
【図１４】
2008155838.tif 000016
【図１５】
2008155838.tif 000017
【図１６】
2008155838.tif 000018
【図１７】
2008155838.tif 000019
【図１８】
2008155838.tif 000020
【図１９】
2008155838.tif 000021
【国際調査報告】
2008155838.tif 000022
2008155838.tif 000023
2008155838.tif 000024