(57)【要約】【課題】同時マルチスレッディングプロセッサにおいて、スレッドの実行時間を削減する。【解決手段】同時マルチスレッディングプロセッサは、デコード後に複数のスレッドで実行されるように、該複数のスレッドのうち、該命令が実行されるスレッドを識別するためのスレッド識別子が付加された、単一のスレッドに属する複数の命令をフェッチするフェッチ手段と、前記フェッチ手段によりフェッチされた前記複数の命令をデコードし、前記複数のスレッドを生成し、それぞれの該命令に付加された前記スレッド識別子の示すスレッドに、該命令を割り当てるデコード手段と、前記デコード手段により生成された前記複数のスレッドを並列に動作させることにより、前記複数の命令を実行する実行手段と、を有する。【選択図】図１
2011113457.tif 000002
【特許請求の範囲】
【請求項１】
デコード後に複数のスレッドで実行されるように、該複数のスレッドのうち、該命令が実行されるスレッドを識別するためのスレッド識別子が付加された、単一のスレッドに属する複数の命令をフェッチするフェッチ手段と、
前記フェッチ手段によりフェッチされた前記複数の命令をデコードし、前記複数のスレッドを生成し、それぞれの該命令に付加された前記スレッド識別子の示すスレッドに、該命令を割り当てるデコード手段と、
前記デコード手段により生成された前記複数のスレッドを並列に動作させることにより、前記複数の命令を実行する実行手段と、
を有する同時マルチスレッディングプロセッサ。
【請求項２】
前記デコード手段は、スレッドで実行される命令を保持する複数の待ち行列のうち、前記命令に付加された前記スレッド識別子の示すスレッドに対応する待ち行列に該命令を追加する、請求項１に記載の同時マルチスレッディングプロセッサ。
【請求項３】
前記デコード手段は、該命令に付加されたスレッド識別子に基づいて、複数のアーキテクチャ・ユニットのうち、該命令の実行結果の出力先のアーキテクチャ・ユニットを識別するための出力先識別子を該命令に付加し、
前記実行手段は、前記複数のアーキテクチャ・ユニットが共有する実行リソースを使用することにより前記複数のスレッドを並列に動作させ、それぞれのスレッドに属する前記命令を実行し、該命令の実行結果を、該命令に付加された前記出力先識別子の示す前記アーキテクチャ・ユニットへ出力する、請求項１又は２に記載の同時マルチスレッディングプロセッサ。
【請求項４】
前記デコード手段により前記命令に付加された前記出力先識別子の示す前記アーキテクチャ・ユニットを該命令の出力先として指定する制御手段を更に有し、
前記実行手段は、前記命令の実行結果を、前記制御手段により指定された前記アーキテクチャ・ユニットへ出力する、請求項３に記載の同時マルチスレッディングプロセッサ。
【請求項５】
前記出力先識別子は、前記複数のアーキテクチャ・ステートの全てを出力先とする識別子である、請求項３又は４に記載の同時マルチスレッディングプロセッサ。
【請求項６】
デコード後に複数のスレッドで実行されるように、該複数のスレッドのうち、該命令が実行されるスレッドを識別するためのスレッド識別子が付加された、単一のスレッドに属する複数の命令をフェッチし、
フェッチした前記複数の命令をデコードし、
前記複数のスレッドを生成し、
それぞれの該命令に付加された前記スレッド識別子の示すスレッドに、該命令を割り当て、
生成した前記複数のスレッドを並列に動作させることにより、前記複数の命令を実行する、同時マルチスレッディングプロセッサの制御方法。
【請求項７】
コンパイルを行うためのプログラムであって、
コンピュータに、
デコード後に複数のスレッドで実行されるように、ソースコードを単一のスレッドに属する複数の命令に変換する変換手順、及び
前記複数のスレッドのうち、命令が実行されるスレッドを識別するためのスレッド識別子を、それぞれの前記命令に付加する付加手順、
を実行させるためのプログラム。
【請求項８】
前記ソースコードは、繰り返し処理が記述されたソースコードである、請求項７に記載のプログラム。
【請求項９】
デコード後に複数のスレッドで実行されるように、ソースコードを単一のスレッドに属する複数の命令に変換し、
前記複数のスレッドのうち、命令が実行されるスレッドを識別するためのスレッド識別子を、それぞれの前記命令に付加する、コンパイル方法。
【請求項１０】
デコード後に複数のスレッドで実行されるように、ソースコードを単一のスレッドに属する複数の命令に変換し、該複数のスレッドのうち、命令が実行されるスレッドを識別するためのスレッド識別子を、それぞれの該命令に付加する、コンパイラと、
前記コンパイラによりスレッド識別子が付加された前記複数の命令をフェッチし、フェッチした該複数の命令をデコードし、前記複数のスレッドを生成し、それぞれの該命令に付加された前記スレッド識別子の示すスレッドに、該命令を割り当て、生成した該複数のスレッドを並列に動作させることにより、該複数の命令を実行する、同時マルチスレッディングプロセッサと、
を有する情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、同時マルチスレッディング方式で複数のスレッドを実行する技術に関する。
【背景技術】
【０００２】
近年、物理的に単一のプロセッサ上で、複数のスレッドを実行するマルチスレッド方式がいくつかのプロセッサに採用されている。特許文献１および特許文献２に開示されたプロセッサは、このマルチスレッド方式を採用しており、複数のスレッドを切り替えることで演算器の利用率を向上させたり、メモリアクセスレイテンシなどを隠蔽したりすることができる。
【０００３】
マルチスレッド方式には、スレッド切り替えのタイミングをどのように制御するかに関して複数の方式がある。
【０００４】
例えば、一定時間ごとにスレッドを切り替える時分割型マルチスレッディング方式、キャッシュミスなどによってプロセッサが待機状態になるときに別スレッドに切り替える方式、複数スレッドの命令列に対して個々の命令ごとに実行の可否を判断する同時マルチスレッディング方式などがある。
【０００５】
ここでは、同時マルチスレッディング方式について説明する。非特許文献１には、同時マルチスレッディングを導入したハイパースレッディング（登録商標）技術が記載されている。
【０００６】
図１７は、非特許文献１に記載された同時マルチスレッディングプロセッサ８０１の構成を示すブロック図である。同図を参照すると、同時マルチスレッディングプロセッサ８０１において、実行リソース８０４は単一であるが、プロセスの状態を保持するレジスタ等のアーキテクチャ・ステート（８０２および８０３）は、スレッドの数だけ多重化されている。一般的には、アーキテクチャ・ステートは二重化される。
【０００７】
図１８は、非特許文献１に記載されたプロセッサのパイプライン構造を説明するための図である。同図では、説明の簡略化のために、キャッシュヒットした場合における、命令フェッチからアウト・オブ・オーダー実行のレジスタ書き込みまでの部分のみを抜き出し、その他の部分を省略している。
【０００８】
命令ポインタ９０１は、各スレッドの命令実行状況を追跡するために用いられる。キャッシュメモリ９０２には、実行対象の命令列がキャッシュされる。
【０００９】
プロセッサは、キャッシュメモリ９０２にキャッシュされた命令列のうち、命令ポインタ９０１で指定された命令をフェッチする。命令フェッチキュー９０３は、フェッチされた命令を保持する。
【００１０】
デコード部９０４は、命令フェッチキュー９０３から取り出された命令を解釈し、マイクロオペコードにより記述された命令に変換する。
【００１１】
オペコードキュー９０５は、変換後の命令列を保持する。レジスタ・リネーム及び割り当て制御ステージ９０６では、アウト・オブ・オーダー実行を行っても誤動作しないように、レジスタ・リネーミングと、命令へのリソースの割り当てとが行われる。リソースが割り当てられた命令は、キュー９０７に格納され、スケジューラ９０８によりアウト・オブ・オーダーで実行判定が行われる。
【００１２】
レジスタ読み出しステージ９０９で、ソースレジスタからデータが読み出され、実行ステージ９１０で、読み出されたデータが、命令に対応する回路で処理される。処理結果は、レジスタ書き込みステージ９１１で、デスティネーションレジスタに書き込まれる。
【００１３】
なお、ここで、非特許文献１に記載されたプロセッサは、実際には、デコード済みの命令を格納するトレースキャッシュを有し、プログラム内の命令は、ほとんどの場合、このトレースキャッシュからフェッチされる。しかし、図１８では、簡略化のため、トレースキャッシュを省略し、プロセッサは、キャッシュメモリ９０２から直接、命令ポインタ９０１の示す命令を読み出し、デコード後にオペコードキュー９０５に入力する構成としている。
【００１４】
また、実行ステージ９１０の後には、実際には、レジスタ書き込みステージの前にストアバッファおよびＬ１Ｄキャッシュへの書き込みステージがあるが、これらも、説明の簡略化のため、図１８では省略されている。
【００１５】
このような、命令のフェッチ、デコード、および実行の手順は、同時マルチスレッディング方式を導入するか否かに関わらず、プロセッサの一般的な動作である。
【００１６】
次に、同時マルチスレッディング方式を採用する場合の動作の特徴について説明する。この場合、命令ポインタ９０１は多重化され、プロセッサは、それらの命令ポインタを参照することにより、複数スレッドの命令列を命令フェッチキュー９０３にフェッチし、それぞれをデコードしてオペコードキュー９０５に追加する。
【００１７】
そして、図１８に示すように、命令ポインタ９０１、命令フェッチキュー９０３、およびオペコードキュー９０５は、それぞれ二重化されている。
【００１８】
レジスタ・リネーム及び割り当て制御ステージ９０６では、プロセッサは、スレッドごとにレジスタを管理する。つまり、プロセッサは、スレッド１の命令では、そのスレッド１に属するレジスタを使用し、スレッド２の命令では、そのスレッド２に属するレジスタを使用する。
【００１９】
但し、レジスタ・リネーム後の物理レジスタ番号は、スレッドごとに区別して管理されない。このため、レジスタ・リネーム及び割り当て制御ステージ９０６においては、命令はスレッドごとに管理される必要がなく、スレッド１の命令と、スレッド２の命令とが混在することになる。
【００２０】
また、スケジューラ９０８以降のステージでは、レジスタは、物理レジスタ番号によって区別されているため、プロセッサは、実行対象の命令がスレッド１、２いずれの命令であるかを意識する必要はない。プロセッサは、物理レジスタ番号で指定されたレジスタを使用して、処理を実行する。
【００２１】
同時マルチスレッディング方式を導入したプロセッサは、上述の手順で、複数の命令列より供給された命令から、スケジューラが実行可能なものを選択して実行ステージに送り込む。
【００２２】
単一の命令列から命令が供給された場合、スケジューラが実行可能な命令を選択できず、実行ステージで空き時間が生じることがある。この場合であっても、同時マルチスレッディング方式のプロセッサでは、この空き時間に別スレッドの命令を実行できる可能性がある。この結果、実行リソースの利用率が向上する。これにより、データ待ち時間が隠蔽され、全体の処理時間、すなわち複数スレッドの処理時間の総計を小さくできるという効果が得られる。
【先行技術文献】
【特許文献】
【００２３】
【特許文献１】特開２００１−２３６２２１号公報
【特許文献２】特開２００６−３９８１５号公報
【非特許文献】
【００２４】
【非特許文献１】Deborah T.Marr, Frank Ninns, David L.Hill, Glenn Hinton, David A Koufaty, J Alan Miller, Michel Upton、「ハイパー・スレッディング・テクノロジのアーキテクチャとマイクロアーキテクチャ」、インテル・テクノロジー・ジャーナル Q1, 2002, Vol.6, Issue 1
【発明の概要】
【発明が解決しようとする課題】
【００２５】
しかし、非特許文献１に記載されたプロセッサでは、スレッドの実行時間の削減が困難であるというという問題があった。
【００２６】
上述したように、非特許文献１に記載された、同時マルチスレッディング方式の採用により、演算器等のリソースの利用効率は向上する。このため、プロセッサの処理能力を有効に活用できる。
【００２７】
ところが、同時マルチスレッディングプロセッサでは、複数のスレッドが物理的に単一のリソースをシェアするので、単一のスレッドのみに着目すれば、実行時間が増加してしまうという問題があった。
【００２８】
この実行時間の増加について、図１５を参照して説明する。同図（ａ）に示すように、スレッド１を単独で実行した場合の実行時間がＴ１であるとする。このうち、実際に演算器が使用された時間は、ｔ１であるとすると、データの到着待ちなどの理由で「Ｔ１−ｔ１」の間、その演算器は使用されていないことになる。
【００２９】
そして、図１５（ｂ）に示すように、スレッド１に続いて、スレッド２を単独で実行した場合の実行時間がＴ２であり、演算器が使用された時間がｔ２であるとすると、「Ｔ２−ｔ２」の間、その演算器は使用されていないことになる。
【００３０】
シングルスレッドのみしか実行できないプロセッサでは、スレッド１およびスレッド２の処理を完了するには、「Ｔ１＋Ｔ２」の実行時間を要する。
【００３１】
これに対し、同時マルチスレッディング方式のプロセッサであれば、スレッド１で演算器が使用されていない時間に、スレッド２の命令を実行できる。時間Ａ、Ｂに対して、時間ｔ１、ｔ２が十分に小さければ、プロセッサは、処理時間の長い方のスレッド、例えばスレッド１の待ち時間「Ｔ１−ｔ１」の時間だけで、もう一方のスレッド２の処理を完了できる可能性がある。
【００３２】
このため、時間Ｔ１、Ｔ２に対して、時間ｔ１、ｔ２が十分に小さければ、同時マルチスレッディングにより性能は十分に改善しうる。
【００３３】
しかしながら、時間Ｔ１、Ｔ２に対して、時間ｔ１、ｔ２があまり小さくない場合、処理時間が、処理時間の長い方のスレッドの待ち時間内に、もう一方のスレッドの処理を完了できないことがある。この場合、データ待ちの時間を隠蔽できたとしても、性能改善は、ごく僅かにとどまる。２スレッド分の命令を供給するために生じるオーバーヘッドや、キャッシュメモリ上でのスレッド同士の競合により、シングルスレッドのプロセッサより性能が低下するケースもある。
【００３４】
このように、データ待ち時間に対して、演算器の使用時間が長いと、同時マルチスレッディング方式を適用しても、実行時間が増えて、性能が向上しないことがある。
【００３５】
単一のスレッドの実行時間を短縮するには、データ待ち時間を削減することが有効である。データ待ち時間を削減するための方法には、データをレジスタに供給するロード命令を、プロセッサがなるべく早く発行するという方法や、プロセッサがロード命令を同時に多数発行できるように制御するという方法がある。
【００３６】
しかしながら、データ待ち時間を削減するための、これらの方法は、プログラムが利用可能なレジスタであるソフト見えレジスタの数によって、その効果が制限されてしまう。例えば、各命令が利用可能な空きレジスタがなければ、プロセッサは、そもそもロード命令を先行して発行することができない。このため、データ待ち時間を削減するには、十分な数のソフト見えレジスタが必要となる。
【００３７】
ロード命令の発行に関して、例えば、論理的なソフト見えレジスタ数に対して多数の物理レジスタを用意して、レジスタ名をハードウェアがリネーム（すなわち、レジスタ・リネーム）することで、ロード命令を先行して発行する技術がある。
【００３８】
しかし、このレジスタ・リネーミングを行っても、ロード・ストア命令そのものは削除されない。このため、レジスタ上のデータを明示的に入れ替えるレジスタスピルが起こるようなケースにおいては、データ待ち時間を削減する効果は限定的なものになってしまう。
【００３９】
このため、同時マルチスレッディングプロセッサにおいて、スレッドの実行時間、特にデータ待ち時間を削減することが困難であった。
【００４０】
本発明は、同時マルチスレッディングプロセッサで実行する、スレッドの実行時間を削減する技術を提供することを目的とする。
【課題を解決するための手段】
【００４１】
上記目的を達成するために、本発明の同時マルチスレッディングプロセッサは、デコード後に複数のスレッドで実行されるように、該複数のスレッドのうち、該命令が実行されるスレッドを識別するためのスレッド識別子が付加された、単一のスレッドに属する複数の命令をフェッチするフェッチ手段と、前記フェッチ手段によりフェッチされた前記複数の命令をデコードし、前記複数のスレッドを生成し、それぞれの該命令に付加された前記スレッド識別子の示すスレッドに、該命令を割り当てるデコード手段と、前記デコード手段により生成された前記複数のスレッドを並列に動作させることにより、前記複数の命令を実行する実行手段と、を有する。
【００４２】
本発明の同時マルチスレッディングプロセッサの制御方法は、デコード後に複数のスレッドで実行されるように、該複数のスレッドのうち、該命令が実行されるスレッドを識別するためのスレッド識別子が付加された、単一のスレッドに属する複数の命令をフェッチし、フェッチした前記複数の命令をデコードし、前記複数のスレッドを生成し、それぞれの該命令に付加された前記スレッド識別子の示すスレッドに、該命令を割り当て、生成した前記複数のスレッドを並列に動作させることにより、前記複数の命令を実行する、同時マルチスレッディングプロセッサの制御方法である。
【００４３】
本発明のプログラムは、コンパイルを行うためのプログラムであって、コンピュータに、デコード後に複数のスレッドで実行されるように、ソースコードを単一のスレッドに属する複数の命令に変換する変換手順、及び前記複数のスレッドのうち、命令が実行されるスレッドを識別するためのスレッド識別子を、それぞれの前記命令に付加する付加手順、を実行させるためのプログラムである。
【００４４】
本発明のコンパイル方法は、デコード後に複数のスレッドで実行されるように、ソースコードを単一のスレッドに属する複数の命令に変換し、前記複数のスレッドのうち、命令が実行されるスレッドを識別するためのスレッド識別子を、それぞれの前記命令に付加する、コンパイル方法である。
【００４５】
本発明の情報処理装置は、デコード後に複数のスレッドで実行されるように、ソースコードを単一のスレッドに属する複数の命令に変換し、該複数のスレッドのうち、命令が実行されるスレッドを識別するためのスレッド識別子を、それぞれの該命令に付加する、コンパイラと、前記コンパイラによりスレッド識別子が付加された前記複数の命令をフェッチし、フェッチした該複数の命令をデコードし、前記複数のスレッドを生成し、それぞれの該命令に付加された前記スレッド識別子の示すスレッドに、該命令を割り当て、生成した該複数のスレッドを並列に動作させることにより、該複数の命令を実行する、同時マルチスレッディングプロセッサと、を有する。
【発明の効果】
【００４６】
本発明によれば、同時マルチスレッディングプロセッサは、単一のスレッドに属する複数の命令をフェッチし、複数のスレッドを生成して、スレッド識別子の示すスレッドに命令を割り当てるので、デコード前に単一のスレッドに属する複数の命令を、デコード後に複数のスレッドで処理することができる。このため、単一のスレッドが、複数のスレッド分のリソースを使用することができ、スレッドの実行時間が削減される。
【図面の簡単な説明】
【００４７】
【図１】本発明の第１の実施形態の情報処理装置の一構成例を示すブロック図である。
【図２】本発明の第１の実施形態のコンパイラ方法を示すフローチャートである。
【図３】本発明の第１の実施形態の命令語のフォーマットの一例を示す図である。
【図４】本発明の第１の実施形態のプロセッサの一構成例を示すブロック図である。
【図５】本発明の第１の実施形態の命令語のフォーマットの一例を示す図である。
【図６】本発明の第１の実施形態の実行部の一構成例を示すブロック図である。
【図７】本発明の第１の実施形態のパイプラインの一例を示す図である。
【図８】（ａ）本発明の第１の実施形態のデコード部の動作を説明するための図である。（ｂ）本発明の第１の実施形態のデコード部の動作を説明するための図である。
【図９】（ａ）本発明の第１の実施形態のデコード部の動作を説明するための図である。（ｂ）本発明の第１の実施形態のデコード部の動作を説明するための図である。
【図１０】本発明の第１の実施形態のデコード部の動作を説明するための図である。
【図１１】（ａ）本発明の第１の実施形態の制御部及び実行部の動作結果の一例を示す図である。（ｂ）本発明の第１の実施形態の制御部及び実行部の動作結果の一例を示す図である。
【図１２】（ａ）本発明の第１の実施形態の制御部及び実行部の動作結果の一例を示す図である。（ｂ）本発明の第１の実施形態の制御部及び実行部の動作結果の一例を示す図である。
【図１３】本発明の第１の実施形態のソースコードの一例である。
【図１４】本発明の第１の実施形態の命令フェッチキューに保持された命令列の一例である。
【図１５】（ａ）本発明の第１の実施形態のオペコードキューに保持された命令列の一例である。（ｂ）本発明の第１の実施形態のオペコードキューに保持された命令列の一例である。
【図１６】本発明の第２の実施形態の制御部及び実行部の動作結果の一例を示す図である。
【図１７】一般的なプロセッサの構成を示すブロック図である。
【図１８】一般的なパイプラインを示す図である。
【図１９】（ａ）一般的な、単一スレッドの実行時間を示す図である。（ｂ）一般的な、単一スレッドの実行時間を示す図である。（ｃ）一般的な、単一スレッドの実行時間を示す図である。（ｄ）一般的な、単一スレッドの実行時間を示す図である。（ｅ）一般的な、単一スレッドの実行時間を示す図である。（ｆ）一般的な、単一スレッドの実行時間を示す図である。
【発明を実施するための形態】
【００４８】
（第１の実施形態）
本発明を実施するための第１の実施形態について図面を参照して詳細に説明する。図１は、本実施形態の情報処理装置１の一構成例を示すブロック図である。同図を参照すると、情報処理装置１は、プロセッサ１０、メインメモリ２０、および記憶部３０を有する。
【００４９】
プロセッサ１０は、複数のスレッドを同時マルチスレッディング方式で実行可能なマイクロプロセッサである。本発明の特徴となる処理メインメモリ２０は、データやプログラムを一時的に蓄えておく主記憶装置である。記憶部３０には、コンパイラ３０１が格納される。
【００５０】
図２を参照して、コンパイラ３０１について説明する。同図は、本実施形態の婚コンパイル方法を示すフローチャートである。このフローチャートは、コンパイラ３０１をプロセッサ１０が実行することにより実現される。
【００５１】
プロセッサ１０は、ソースコードを、プロセッサ１０で実行可能な命令列を含むオブジェクトコードに変換する（ステップＳ１）。本実施形態では、コンパイラ１０は、変換において、デコード後に複数のスレッドで実行することを前提として、単一のスレッドに属する命令列を生成する。
【００５２】
そして、プロセッサ１０は、各命令に、スレッド識別子を付加する（ステップＳ２）。ここで、スレッド識別子とは、命令が実行されるスレッドを識別するための識別子である。
【００５３】
各命令にスレッド識別子の付加する方法の一例について説明する。例えば、ＤＯループ文を、デコード後に２つのスレッドで実行することを想定する。この場合、プロセッサ１０は、ループ変数が奇数番号の処理は一方のスレッドで実行され、ループ変数が偶数番号の処理は他方のスレッドで実行されるように、それぞれの処理に対応する命令にスレッド識別子を付加する。
【００５４】
次に、各命令について、その内容を記述するための命令語のフォーマットについて説明する。図３は、本実施形態で使用される命令語４０１のフォーマットの一例を示す図である。同図を参照すると、命令語４０１は、固定長のビット列であり、命令コード４０２、デスティネーションレジスタ指定フィールド４０３、ソースレジスタ指定フィールド４０４、およびスレッド識別子４０５を有する。
【００５５】
命令コード４０２には、プロセッサ１０に実行させる命令を指定するための番号が格納される。デスティネーションレジスタ指定フィールド４０３には、命令の実行結果の書き込み先のレジスタの番号が格納される。ソースレジスタ指定フィールド４０４には、命令実行時に利用されるデータの読み出し先のレジスタの番号が格納される。スレッド識別子４０５は、命令コード４０２に対応するスレッド識別子である。
【００５６】
ここで、ソースレジスタ指定フィールド４０４では通常、１つまたは複数のレジスタ番号が指定されるが、その数は命令コードごとに異なる。命令セットアーキテクチャによっては、暗黙的に使用用途が限定されたレジスタが、デスティネーションレジスタやソースレジスタとして使用され、命令語中の明示的な指定が省略されることもある。いずれの場合もデスティネーションレジスタ、またはソースレジスタとして指定可能なレジスタは、単一スレッドのアーキテクチャ・ステート内のレジスタに限られる。
【００５７】
本実施形態では、スレッド識別子４０５は、図３に示すように、命令語４０１のフィールド内に格納され、プロセッサ１０により、命令コード４０２と合わせてデコードされる。
【００５８】
プロセッサ１０は、コンパイラ３０１を実行することにより、スレッド識別子が付加された命令列を含むオブジェクトコードを生成し、実行する。
【００５９】
図４は、本実施形態のプロセッサ１０の一構成例を示すブロック図である。同図を参照すると、プロセッサ１０は、命令フェッチ部１０１、デコード部１０２、制御部１０３、および実行部１０４を有する。
【００６０】
デコード部１０２は、スレッド識別子判定部１０２１を有し、制御部１０３は、出力先識別子判定部１０３１を有する。
【００６１】
命令フェッチ部１０１は、コンパイラ３０１から出力されたオブジェクトコードの中から、命令ポインタで指定される命令をフェッチする。
【００６２】
デコード部１０２は、フェッチされた複数の命令をデコードする。スレッド識別子判定部１０２１は、複数のスレッドを生成し、各命令に付加されたスレッド識別子を参照して、そのスレッド識別子に対応するスレッドに、その命令を割り当てる。
【００６３】
また、スレッド識別子判定部１０２１は、命令語に付加されたスレッド識別子に応じて、各命令語に出力先識別子を付加する。出力先識別子は、命令の実行結果の出力先とするレジスタを識別するための識別子である。より具体的には、出力先識別子は、複数のスレッドのうち、出力先のレジスタの属するスレッドを特定するための識別子である。
【００６４】
制御部１０３は、出力先識別子に従って、レジスタ・リネーミング、および割り当て制御を行う。
【００６５】
図５は、出力先識別子が付加された、命令語４０１を示す図である。同図に示すように、命令語４０１には、スレッド識別子４０５の代わりに出力先識別子４０６が付加される。
【００６６】
実行部１０４について説明する。図６は、実行部１０４の一構成例を示すブロック図である。同図に示すように、実行部１０４は、レジスタ群１０４１、および１０４２と、演算器１０４３とを有する。
【００６７】
レジスタ群１０４１、および１０４２は、それぞれ異なるスレッドに属し、演算器１０４３を共有する。
【００６８】
図６のレジスタ群１０４１、および１０４２は、図１７のアーキテクチャ・ステートに相当する。図６の演算器１０４３は、図１７の実行リソースの一例である。
【００６９】
実際には、レジスタファイル自体にスレッドの区別はなく、その都度、物理番号でスレッドに対応するレジスタが指定されるのだが、図６では、説明を容易にするため、論理的にスレッドごとに区分された状態のレジスタ群を表記している。
【００７０】
また、実行リソースには、通常、複数の演算器が含まれるが、図６では、説明を容易にするため、演算器１０４３以外の演算器を省略している。
【００７１】
実行部１０４は、アウト・オブ・オーダー実行で、スケジューリングを行う。実行部１０４は、命令に対応する演算器で、ソースレジスタから読み出したデータを処理し、処理結果をデスティネーションレジスタに格納する。
【００７２】
続いて、プロセッサ１０のパイプライン構造について詳細に説明する。図７は、プロセッサ１０のパイプライン構造の一例を示す図である。
【００７３】
キャッシュメモリ１０１２には、オブジェクトコード内の命令列が供給される。プロセッサ１０は、その命令列の中から、命令ポインタ１０１１で指定された命令をフェッチし、命令フェッチキューＣ１に追加する。命令フェッチキューＣ１は、フェッチされた命令を保持する。
【００７４】
デコード部１０２は、命令フェッチキューＣ１から取り出された命令を解釈し、マイクロオペコードで記述された命令に変換する。
【００７５】
スレッド識別子判定部１０２１は、スレッド識別子に応じて、どのオペコードキューに命令を追加するかを判定する。本実施形態では、オペコードキューは、Ｃ２、およびＣ３に多重化されており、オペコードキューＣ１、およびＣ２のうち、いずれか一方、または、両方に命令が追加される。
【００７６】
また、スレッド識別子判定部１０２１は、命令に付加されたスレッド識別子に応じて、命令に出力先識別子を付加する。
【００７７】
オペコードキューＣ１、およびＣ２は、追加された命令を、付加された出力識別子とともに保持する。
【００７８】
出力先識別子判定部１０３１は、命令に付加された出力識別子に基づいて、出力先のレジスタを、いずれのスレッドに属するレジスタにするかを決定する。言い換えれば、出力先識別子判定部１０３１は、出力先識別子に応じて、デスティネーションレジスタの属するスレッドを切り替える。
【００７９】
制御部１０３は、出力先識別子判定部１０３１の決定に従って、各命令について、レジスタ・リネーミング、およびレジスタの割り当てを行う。制御部１０３は、レジスタが割り当てられた命令をキューＣ４に追加する。キューＣ４は、追加された命令を保持する。
【００８０】
実行部１０４内のスケジューラは、キューＣ４から取り出した命令について、アウト・オブ・オーダーで実行判定を行う（Ｓ１１）。
【００８１】
実行部１０４は、ソースレジスタからデータを読み出す（Ｓ１２）。実行部１０４は、読み出したデータを命令に対応する回路で処理することにより、命令を実行する（Ｓ１３）。実行部１０４は、命令の実行結果をデスティネーションレジスタに書き込む（Ｓ１３）。
【００８２】
図７で説明した本実施形態のパイプライン構造と、図１８で説明した、一般的なパイプライン構造との間の相違について整理して説明する。
【００８３】
まず、上述したように、本実施形態のデコード部１０２は、図７に示すようにスレッド識別子判定部１０２１を有しているのに対し、図１８のデコード部９０４は有していない。
【００８４】
次に、本実施形態のオペコードキューＣ２、Ｃ３は、図７に示すように、命令のみならず、デコード前に命令に付加された出力先識別子を保持する。これに対して、図１８のオペコードキュー９０５には、出力先識別子が保持されない。
【００８５】
更に、本実施形態の制御部１０３は、図７に示すように出力先識別子判定部１０３１を有し、出力先識別子に従って、出力先のレジスタを指定するが、図１８のレジスタ・リネーム及び割り当て制御ステージ９０６では、出力先識別子に従ってレジスタの指定が行われることはない。
【００８６】
ここで、本実施形態の命令ポインタ１０１１、および命令フェッチキューＣ１は、図７では多重化されていないように記載されているが、実際には、図１８の命令ポインタおよび命令フェッチキューのように物理的または論理的に多重化されている。本実施形態のプロセッサ１０は、単一スレッドの性能を向上させることを目的としており、以後の説明に不要であるため、図７では、命令ポインタ１０１１、および命令フェッチキューＣ１の多重化に関する記載を省略している。
【００８７】
命令ポインタ１０１１、および命令フェッチキューＣ１が多重化されている場合、多重化されたもののうち、少なくとも１つが有効に動作していれば、本発明を適用可能である。
【００８８】
まとめると、本実施形態のパイプライン構造は、スレッド識別子判定部１０２１、および出力先識別子判定部１０３１を有し、オペコードキューが出力先識別子を更に保持する点で、図１８のパイプライン構造と異なる。
【００８９】
図８〜図１０を参照して、スレッド識別子判定部１０２１の動作について説明する。図８〜図１０は、スレッド識別子判定部１０２１の動作を説明するための図である。
【００９０】
本実施形態において、スレッド識別子は３ビットで定義される。最上位のビットは、命令が割り当てられるスレッドの個数を示すビットとする。２ビット目は、１つのスレッドに命令を割り当てる場合に、２つのスレッドのうち、いずれのスレッドに割り当てるのかを示すビットとする。最下位のビットは、付加する出力先識別子を示すビットとする。
【００９１】
例えば、最上位のビットが「０」である場合、１つのスレッドに命令が割り当てられ、「１」である場合、２つのスレッドに割り当てられる。２ビット目が「０」である場合、ＯＣ２１が属するスレッドに命令が割り当てられ、「１」である場合、ＯＣ２２が属するスレッドに割り当てられる。最下位のビットが「０」である場合、出力先識別子「０」が付加され、「１」である場合、出力先識別子「１」が付加される。
【００９２】
出力先識別子「０」は、デスティネーションレジスタを、ソースレジスタの属するスレッドと同じスレッドに属するレジスタにするための識別子とする。出力先識別子「１」は、デスティネーションレジスタを、ソースレジスタの属するスレッドと異なるスレッドに属するレジスタにするための識別子とする。
【００９３】
出力先識別子は、命令列の示す処理内容や、スレッドの分割の仕方などに応じて、コンパイラ３０１が決定する。
【００９４】
例えば、処理を複数スレッドに分割した後、それらのスレッドの結果を集約する場合、出力識別子「１」が付加される。
【００９５】
具体的には、ループ変数を１〜２５６の「I」として、A＝A＋B（I）の計算を行う場合を考える。コンパイラ３０１は、スレッド１で「I」が奇数のときのBの総和を求め、スレッド２で「I」が奇数のときのBの総和を求め、ループ外で両スレッドの実行結果を加算することを前提として、命令列を生成する。この場合、両スレッドの実行結果を加算する命令に出力先識別子「１」が付加される。
【００９６】
図８（ａ）は、スレッド識別子「０００」が付加された命令をデコードする場合の、スレッド識別子判定部１０２１の動作を説明するための図である。最上位のビットが「０」なので、スレッド識別子判定部１０２１は、１つのスレッドに命令を割り当て、２ビット目が「０」なので、命令が割り当てられるスレッドは、ＯＣ２１が属するスレッドである。また、最下位のビットが「０」なので、スレッド識別子判定部１０２１は、出力先識別子「０」を付加する。
【００９７】
図８（ｂ）は、スレッド識別子「００１」が付加された命令をデコードする場合の、スレッド識別子判定部１０２１の動作を説明するための図である。最上位のビットが「０」、２ビット目が「０」なので、スレッド識別子判定部１０２１は、ＯＣ２１が属するスレッドに命令を割り当てる。また、最下位のビットが「１」なので、スレッド識別子判定部１０２１は、出力先識別子「１」を付加する。
【００９８】
図９（ａ）は、スレッド識別子「０１０」が付加された命令をデコードする場合の、スレッド識別子判定部１０２１の動作を説明するための図である。最上位のビットが「０」、２ビット目が「１」なので、スレッド識別子判定部１０２１は、ＯＣ２２が属するスレッドに命令を割り当てる。また、最下位のビットが「０」なので、スレッド識別子判定部１０２１は、出力先識別子「０」を付加する。
【００９９】
図９（ｂ）は、スレッド識別子「０１１」が付加された命令をデコードする場合の、スレッド識別子判定部１０２１の動作を説明するための図である。最上位のビットが「０」、２ビット目が「１」なので、スレッド識別子判定部１０２１は、ＯＣ２２が属するスレッドに命令を割り当てる。また、最下位のビットが「１」なので、スレッド識別子判定部１０２１は、出力先識別子「１」を付加する。
【０１００】
図１０は、スレッド識別子「１００」が付加された命令をデコードする場合の、スレッド識別子判定部１０２１の動作を説明するための図である。最上位のビットが「１」なので、スレッド識別子判定部１０２１は、２つのスレッドに命令を割り当てる。また、最下位のビットが「０」なので、スレッド識別子判定部１０２１は、出力先識別子「０」を付加する。
【０１０１】
図１１および図１２を参照して、出力先識別子判定部１０３１の動作結果について説明する。図１１および図１２は、出力先識別子判定部１０３１の制御による、実行部１０４の動作を説明するための図である。
【０１０２】
出力先識別子判定部１０３１は、命令に付加された出力先識別子に基づいて、レジスタ・リネーミングと、リソースの割り当てとを行う。
【０１０３】
具体的には、出力先識別子が「０」の場合、出力先識別子判定部１０３１は、ソースレジスタの属するスレッドと、デスティネーションレジスタの属するスレッドが、同じスレッドとなるように、レジスタ・リネーミング、および割り当て制御を行う。
【０１０４】
出力先識別子が「１」の場合、出力先識別子判定部１０３１は、ソースレジスタの属するスレッドと、デスティネーションレジスタの属するスレッドが、異なるスレッドとなるように、レジスタ・リネーミング、および割り当て制御を行う。
【０１０５】
出力先識別子が「０」で、ソースレジスタがレジスタ群１０４１に属するレジスタであった場合、図１１（ａ）に示すように、演算器１０４３は、実行結果を、同一のレジスタ群１０４１に属するレジスタへ出力する。
【０１０６】
出力先識別子が「０」で、ソースレジスタがレジスタ群１０４２に属するレジスタであった場合、図１１（ｂ）に示すように、演算器１０４３は、実行結果を、同一のレジスタ群１０４２に属するレジスタへ出力する。
【０１０７】
出力先識別子が「１」で、ソースレジスタがレジスタ群１０４１に属するレジスタであった場合、図１２（ａ）に示すように、演算器１０４３は、実行結果を、異なるレジスタ群１０４２に属するレジスタへ出力する。
【０１０８】
出力先識別子が「１」で、ソースレジスタがレジスタ群１０４２に属するレジスタであった場合、図１２（ｂ）に示すように、演算器１０４３は、実行結果を、異なるレジスタ群１０４１に属するレジスタへ出力する。
【０１０９】
図１１、図１２において、レジスタ群から演算器への矢印は、処理対象の入力データを示している。また、演算器からレジスタ群への矢印は、実行結果のデータを示している。演算器１０４３は、例えば、加算器である。この場合、レジスタ群から演算器への２本の矢印は、被加算値、加算値のデータであり、演算器からレジスタ群への矢印は、加算結果のデータである。
【０１１０】
続いて、図１３〜図１５を参照して、本実施形態のソースコード、オブジェクトコードの一例について説明する。
【０１１１】
図１３は、プロセッサ１０で所定の処理を実行するためのソースコードの一例である。このソースコードには、ループ変数「Ｉ」の値を変えながら、同じ処理を繰り返し実行するためのＤＯループ文が、記述されている。このソースコードは、単一のスレッドで処理を実行することを前提として記載されている。
【０１１２】
プロセッサ１０は、コンパイラ３０１の実行により、単一のスレッドに命令列を、デコード後に複数のスレッドで実行できるように、図１３のソースコードをオブジェクトコードの命令列に変換し、各命令にスレッド先識別子を付加する。
【０１１３】
図１４は、図１３のソースコードから変換され、命令フェッチキューＣ１に入力される命令列の一例である。図１４の命令列は、前述したように、複数スレッドに割り当てることを前提として生成されている。例えば、ポインタを設定するための命令として、スレッド１用の命令ＯＣ１およびＯＣ２のほか、スレッド２用の命令ＯＣ３およびＯＣ４が生成される。
【０１１４】
また、命令列内の命令コード４０２のそれぞれには、命令が実行されるスレッドに対応するスレッド識別子４０５が付加されている。
【０１１５】
図１４において、デスティネーションレジスタ指定フィールド４０３、およびソースレジスタ指定フィールド４０４は省略されている。また、命令コード４０２の欄には、命令コード自体でなく、命令コードの定義が記述されている。
【０１１６】
命令ＯＣ１および命令ＯＣ２は、スレッド１の使用する変数のポインタを初期設定するための命令である。これらポインタは、スレッド１のみで使用するため、上述したスレッド識別子の定義に従って、これらの命令にはスレッド識別子「０００」が付加される。
【０１１７】
命令ＯＣ３およびＯＣ４は、スレッド２の使用する変数のポインタのポインタを初期設定するための命令である。これらのポインタは、スレッド２のみで使用するため、これらの命令にはスレッド識別子「０１０」が付加される。
【０１１８】
命令ＯＣ５は、ループ変数「Ｉ」の初期設定をするための命令である。この命令は、スレッド１のみで実行すればよいので、この命令にはスレッド識別子「０００」が付加される。
【０１１９】
命令ＯＣ６およびＯＣ７は、変数Ａ、Ｂをロードするための命令、命令ＯＣ８は、加算を実行するための命令、そして、命令ＯＣ９は、計算結果Ａのストアを実行するための命令である。これらの命令は、ポインタを変えて、スレッド１、２のそれぞれで実行される。具体的には、ループ変数「Ｉ」が奇数の場合の処理は、スレッド１で実行され、ループ変数「Ｉ」が偶数の場合の処理は、スレッド２で実行される。両スレッドで実行する必要があるので、これらの命令にはスレッド識別子「１００」が付加される。
【０１２０】
命令ＯＣ１１およびＯＣ１２は、各スレッドが使用する変数Ａ，Ｂのポインタを更新するための命令である。この命令は、両スレッドで実行する必要があるので、これらの命令にはスレッド識別子「１００」が付加される。
【０１２１】
命令ＯＣ１３は、分岐命令であり、スレッド１のみで実行されるので、スレッド識別子「０００」が付加される。
【０１２２】
デコード部１０２は、命令フェッチキューＣ１から取り出された命令を解釈し、マイクロオペコードで記述された命令に変換する。
【０１２３】
スレッド識別子判定部１０２１は、スレッド識別子に応じて、オペコードキューＣ２、Ｃ３のうち、どのオペコードキューに命令を追加するかを判定する。また、スレッド識別子判定部１０２１は、命令に付加されたスレッド識別子に応じて、命令に出力先識別子を付加する。
【０１２４】
図１５（ａ）は、オペコードキューＣ２に追加された命令列の一例である。図１５（ｂ）は、オペコードＣ３に追加された命令列の一例である。同図（ａ）、（ｂ）に示すように、命令列内の命令コード４０２のそれぞれに、出力先識別子４０６が付加されている。図１４において、デスティネーションレジスタ指定フィールド４０３、およびソースレジスタ指定フィールド４０４は省略されている。また、命令コード４０２の欄には、命令コード自体でなく、命令コードの定義が記述されている。
【０１２５】
図１５（ａ）に示すように、スレッド１に対応するオペコードキューＣ２には、スレッド識別子「０００」または「１００」が付加されていた命令ＯＣ１、ＯＣ２、およびＯＣ５〜ＯＣ１３が入力される。図１５（ｂ）に示すように、スレッド２に対応するオペコードキューＣ３には、スレッド識別子「０１０」が付加されていた命令ＯＣ３、ＯＣ４が入力され、スレッド識別子「１００」が付加されていたＯＣ６〜ＯＣ１２が、複製して入力される。また、全ての命令に、出力先識別子「０」が付加されている。
【０１２６】
図１５に示したように、プロセッサ１０は、単一のスレッドに属する命令列を分解または複製し、複数スレッドのそれぞれに割り当てる。そして、プロセッサ１０は、各命令に、スレッドに対応するレジスタを割り当てる。例えば、オペコードキューＣ１、およびＣ２には、ＯＣ８など、同じ命令が入力されている。しかし、これらの命令は、別々のスレッドに属する命令なので、別々のスレッドに属するレジスタが割り当てられる。従って、ＯＣ８等についても、別々の演算が実行される。
【０１２７】
図７で説明したキューＣ７以降は、単一のスレッドに属する命令列と同様に、本実施形態の命令列が処理される。しかし、図１８で示した方式と比較すると、本実施形態では、ソースコードにおける単一のスレッドに、レジスタ群１０４１、１０４２などの多重化されたアーキテクチャ・ステートを割り当てることができる。このため、利用できるソフト見えレジスタ数が増加し、データ待ち時間の隠蔽によって、ソースコードにおける単一のスレッドの実行時間を短縮することができる。
【０１２８】
なお、図３では、命令コード４０２からソースレジスタ指定フィールド４０４までと、スレッド識別子４０５とを１つの命令語として定義する例を示したが、命令コード４０２からソースレジスタ指定フィールド４０４までと、スレッド識別子４０５とを別々の命令語として定義してもよい。その場合、スレッド識別子４０５を含む命令語は、後続の命令語のスレッド指定を変更する特殊命令として解釈される。
【０１２９】
本実施形態では、出力先識別子は、１ビットで定義されるが、２ビット以上で定義してもよいのは勿論である。単一のスレッドを、３つ以上のスレッドで処理する場合、出力先のレジスタが属するスレッドを指定するために、２ビット以上の出力先識別子が定義される。
【０１３０】
本実施形態では、制御部１０３に、出力先識別子判定部１０３１を設ける構成としているが、出力先のレジスタに対応するスレッドを切り替える必要がなければ、出力先識別子判定部１０３１を設けない構成としてもよい。
【０１３１】
図１３に例示したソースコードには、繰り返し処理が記述されているが、繰り返し処理以外の処理が記述されたソースコードをコンパイラ３０１が、複数スレッドで実行するために変換する構成であってもよいのは、勿論である。
【０１３２】
以上、説明したように、本実施形態によれば、同時マルチスレッディングプロセッサは、単一のスレッドに属する複数の命令をフェッチし、複数のスレッドを生成して、スレッド識別子の示すスレッドに命令を割り当てるので、デコード前に単一のスレッドに属する複数の命令を、デコード後に複数のスレッドで処理することができる。このため、単一のスレッドが、複数のスレッド分のリソースを使用することができ、単一のスレッドの実行時間が削減される。
【０１３３】
そして、本発明を適用する場合、スケジューラ、レジスタファイル、および、演算器などの実行リソースへの改造は不要であり、デコード部、および制御部以外は、通常の同時マルチスレッディングプロセッサの機構をそのまま流用できる。
【０１３４】
また、同時マルチスレッディングプロセッサは、出力先識別子に基づいて、出力先のレジスタが属するスレッドを切り替えるので、多様な処理内容の命令列を処理できる。
【０１３５】
繰り返し処理は、複数のスレッドに分割しやすいので、コンパイラ３０１が対象とする処理を、単一のスレッドに属する繰り返し処理とすれば、コンパイラの負荷が軽減される。
【０１３６】
（第２の実施形態）
本発明の第２の実施形態について図１６を参照して説明する。本実施形態のプロセッサは、あるスレッドに属する命令の実行結果を、多重化された全てのスレッドの、それぞれに属するレジスタへ書き込む点で、第１の実施形態のプロセッサと異なる。
【０１３７】
図１６は、図４に示した出力先識別子判定部１０３１の制御による、実行部１０４の本実施形態における動作を説明するための図である。他の構成については、第１の実施形態と同様であるため、本実施形態では、その詳細な説明を省略する。
【０１３８】
図１６に示すように、演算器１０４３は、レジスタ群１０４１、および１０４２の両方に、命令の実行結果を出力する。
【０１３９】
なお、全てのスレッドに対応するレジスタでなく、３つ以上のスレッドのうち、いずれか２つ以上のスレッドに属するレジスタへ、演算器が実行結果を出力する構成としてもよいのは、勿論である。
【０１４０】
以上説明したように、本実施形態によれば、第１の実施形態の構成と比較して、単一のスレッドの命令の実行結果を、複数のスレッドの命令で使用する場合に、より効率的に命令列を処理することが可能となる。
【符号の説明】
【０１４１】
１    情報処理装置
１０    プロセッサ
２０    メインメモリ
３０    記憶部
１０１    命令フェッチ部
１０２    デコード部
１０３    制御部
１０４    実行部
３０１    コンパイラ
４０１    命令コード
４０２    デスティネーションレジスタ指定フィールド
４０３    ソースレジスタ指定フィールド
４０４    スレッド識別子
４０５    出力先識別子
８０１    プロセッサ
８０２、８０３    アーキテクチャ・ステート
８０４    実行リソース
９０１    命令ポインタ
９０２    キャッシュメモリ
９０３    命令フェッチキュー
９０４    デコード部
９０５    オペコードキュー
９０６    制御部
９０７    キュー
９０８    スケジューラ
９０９    レジスタ読み出しステージ
９１０    実行ステージ
９１１    レジスタ書き込みステージ
１０１１    命令ポインタ
１０１２    キャッシュメモリ
１０２１    スレッド識別子判定部
１０３１    出力先識別子判定部
１０４１、１０４２    レジスタ群
１０４３    演算器
３０１１    変換部
３０１２    スレッド識別子付加部
Ｃ１    命令フェッチキュー
Ｃ２、Ｃ３    オペコードキュー
Ｃ４    キュー
Ｓ１    スケジューラ
Ｓ２    レジスタ読み出しステージ
Ｓ３    実行ステージ
Ｓ４    レジスタ書き込みステージ
【図１】
2011113457.tif 000003
【図２】
2011113457.tif 000004
【図３】
2011113457.tif 000005
【図４】
2011113457.tif 000006
【図５】
2011113457.tif 000007
【図６】
2011113457.tif 000008
【図７】
2011113457.tif 000009
【図８】
2011113457.tif 000010
【図９】
2011113457.tif 000011
【図１０】
2011113457.tif 000012
【図１１】
2011113457.tif 000013
【図１２】
2011113457.tif 000014
【図１３】
2011113457.tif 000015
【図１４】
2011113457.tif 000016
【図１５】
2011113457.tif 000017
【図１６】
2011113457.tif 000018
【図１７】
2011113457.tif 000019
【図１８】
2011113457.tif 000020
【図１９】
2011113457.tif 000021