(57)【特許請求の範囲】
【請求項１】
中央演算装置が複数のスレッドの命令を実行するマルチスレッドプロセッサにおける命令発行装置であって、
各スレッドに対応して優先度を設定するためのスレッド制御ユニットと、
演算処理及び／又はメモリアクセス処理において実行すべきスレッドの命令及びオペランドが記憶されたレジスタファイルと、
スレッド識別子（スレッドＩＤ）に対応して、優先度情報と、命令と、該命令の実行に用いる各オペランドを示すデータとを含むエントリを記憶し、前記レジスタファイルからデータを受け取り、命令及びオペランドを発行するリザベーションステーションと、
前記リザベーションステーションから発行された命令及びオペランドを受け取り、該命令に従い各種演算を行い、演算結果を前記レジスタファイルに書き戻す演算器と、
を備え、
前記リザベーションステーションは、
前記演算器からの出力を監視し、前記レジスタファイルで未解決のオペランドである必要なデータが前記演算器から演算結果として出力された場合、その演算結果をオペランドとして取り込む手段と、
スレッドＩＤに対応した優先度情報を前記スレッド制御ユニットから求める手段と、
命令実行に必要な全てのオペランドがそろった命令であって、且つ、優先度情報に従い優先度の高いスレッドの命令を前記演算器へ送る手段と
を有することにより、前記リザベーションステーションから前記演算器への命令発行を高い優先度のスレッドの命令が低い優先度の命令を追い越すようにした前記命令発行装置。
【請求項２】
前記リザベーションステーションは、デコードされた命令を基に前記レジスタファイルから読み出されたオペランドを格納し、各オペランドに対してデータが有効であることを示す有効ビットをさらに含む、エントリを作成する手段と、
前記リザベーションステーションは、該リザベーションステーションに記憶された各エントリに対して、命令実行に必要なオペランドが全てそろうまで前記演算器の演算結果から必要なデータをオペランドとして取り込み、そのデータに対応する有効ビットをセットし、各エントリに対するスレッドＩＤに従い前記スレッド制御ユニットを参照して優先度を得てセットすることにより、各エントリを更新する手段と、
前記リザベーションステーションは、全ての有効ビットがセットされているエントリをオペランドがそろった演算可能なエントリを判断する手段と、
前記リザベーションステーションは、オペランドがそろったエントリが複数の演算可能である場合、各エントリの優先度を比較して、より高い優先度を持つエントリを選択して、前記演算器に該エントリの命令及びオペランド送る手段と
を含む請求項１に記載の命令発行装置。
【請求項３】
前記リザベーションステーションは、スレッドの命令の優先度を、エントリ更新又は命令発行の処理クロック毎に更新制御することを特徴とする請求項１に記載の命令発行装置。
【請求項４】
前記リザベーションステーションは、命令がエントリに入力又は作成されたときにカウンタをリセットし、以後エントリを更新する処理クロック毎に又は命令を発行する処理クロック毎に該カウンタをカウントアップする手段と、
前記リザベーションステーションは、優先度の高いエントリが複数ある場合に、カウンタに従いその値の大きいエントリを選択して、その命令及びオペランドを前記演算器に発行する手段と、
をさらに含むことを特徴とする請求項1に記載の命令発行装置。
【請求項５】
前記リザベーションステーションからの命令及びオペランドを受け取り、前記レジスタファイル又はデータキャッシュへのロード又はストアを実行するメモリアクセスユニットをさらに備えた請求項1に記載の命令発行装置。
【請求項６】
前記リザベーションステーション及び前記演算器の組は複数設けられ、
各々の前記演算器によりアウトオブオーダに演算された命令の順番を元の順番に戻し、元の順番にもどした演算結果を前記レジスタファイルへ書き込むリオーダバッファと、
各々の前記演算器の出力を、前記リザベーションステーション及び前記レジスタファイル及び前記リオーダバッファに供給するためのコモンデータバスと
をさらに備えた請求項1に記載の命令発行装置。
【請求項７】
前記リザベーションステーション及び／又は前記スレッド制御ユニットは、スレッドＩＤに対応して優先度情報を記憶したメモリを含む請求項１に記載の命令発行装置。
【請求項８】
前記請求項１乃至７のいずれかに記載の命令発行装置と、
命令及びデータをそれぞれキャッシュする命令キャッシュ及びデータキャッシュと、
前記命令キャッシュから命令をフェッチ及びデコードし、デコードされた命令を基に前記レジスタファイルをアクセスする命令フェッチユニットと、
外部の記憶装置及び／又は入出力装置とデータの入出力を行うためのインターフェースユニットと、
を備えた中央演算装置。
【請求項９】
スレッド識別子（スレッドＩＤ）に対応して、優先度情報と、命令と、該命令の実行に用いる各オペランドを示すデータとを含むエントリを記憶し、実行すべきスレッドのオペランドが記憶されたレジスタファイルからデータを受け取り、命令及びオペランドを発行するリザベーションステーションと；  前記リザベーションステーションから発行された命令及びオペランドを受け取り、該命令に従い各種演算を行い、演算結果を前記レジスタファイルに書き戻す演算器と；  を備え、マルチスレッドプロセッサにおける命令発行装置を用いた命令発行方法であって、
前記リザベーションステーションは、前記演算器からの出力を監視し、前記レジスタファイルで未解決のオペランドである必要なデータが前記演算器から演算結果として出力された場合、その演算結果をオペランドとして取り込むステップと、
前記リザベーションステーションは、スレッドＩＤに対応した優先度情報を、各スレッドに対応して優先度を設定するためのスレッド制御ユニットから求めるステップと、
前記リザベーションステーションは、命令実行に必要な全てのオペランドがそろった命令であって、且つ、優先度情報に従い優先度の高いスレッドの命令を前記演算器へ送るステップと
を含むことにより、前記リザベーションステーションから前記演算器への命令発行を高い優先度のスレッドの命令が低い優先度の命令を追い越すようにした前記命令発行方法。
【請求項１０】
前記リザベーションステーションは、デコードされた命令を基に前記レジスタファイルから読み出されたデータを格納し、各オペランドに対してデータが有効であることを示す有効ビットをさらに含む、エントリを作成するステップと、
前記リザベーションステーションは、該リザベーションステーションに記憶された各エントリに対して、命令実行に必要なオペランドが全てそろうまで前記演算器の演算結果をオペランドとして取り込み、そのデータに対応する有効ビットをセットし、各エントリに対するスレッドＩＤに従い前記スレッド制御ユニットを参照して優先度を得てセットすることにより、各エントリを更新するステップと、
前記リザベーションステーションは、全ての有効ビットがセットされているエントリをオペランドがそろった演算可能なエントリと判断するステップと、
前記リザベーションステーションは、オペランドがそろったエントリが複数の演算可能である場合、各エントリの優先度を比較して、より高い優先度を持つエントリを選択して、前記演算器に該エントリの命令及びオペランド送るステップと
を含む請求項９に記載の命令発行方法。
【請求項１１】
前記リザベーションステーションは、命令がエントリに入力又は作成されたときにカウンタをリセットし、以後エントリを更新する処理クロック毎に又は命令を発行する処理クロック毎に該カウンタをカウントアップするステップと、
前記リザベーションステーションは、優先度の高いエントリが複数ある場合に、カウンタに従いその値の大きいエントリを選択して、その命令及びオペランドを前記演算器に発行するステップと、
をさらに含むことを特徴とする請求項９に記載の命令発行方法。
【請求項１２】
スレッド識別子（スレッドＩＤ）に対応して、優先度情報と、命令と、該命令の実行に用いる各オペランドを示すデータとを含むエントリを記憶し、実行すべきスレッドの命令及びオペランドが記憶されたレジスタファイルからデータを受け取り、命令及びオペランドを発行するリザベーションステーションと；  前記リザベーションステーションから発行された命令及びオペランドを受け取り、該命令に従い各種演算を行い、演算結果を前記レジスタファイルに書き戻す演算器と；  を備え、マルチスレッドプロセッサにおける命令発行装置を用い、コンピュータに次の各ステップを実行させるための命令発行プログラムであって、
前記リザベーションステーションは、前記演算器からの出力を監視し、前記レジスタファイルで未解決のオペランドである必要なデータが前記演算器から演算結果として出力された場合、その演算結果をオペランドとして取り込むステップと、
前記リザベーションステーションは、スレッドＩＤに対応した優先度情報を、各スレッドに対応して優先度を設定するためのスレッド制御ユニットから求めるステップと、
前記リザベーションステーションは、命令実行に必要な全てのオペランドがそろった命令であって、且つ、優先度情報に従い優先度の高いスレッドの命令を前記演算器へ送るステップと
を、コンピュータに実行させるための命令発行プログラム。
【請求項１３】
スレッド識別子（スレッドＩＤ）に対応して、優先度情報と、命令と、該命令の実行に用いる各オペランドを示すデータとを含むエントリを記憶し、実行すべきスレッドのオペランドが記憶されたレジスタファイルからデータを受け取り、命令及びオペランドを発行するリザベーションステーションと；  前記リザベーションステーションから発行された命令及びオペランドを受け取り、該命令に従い各種演算を行い、演算結果を前記レジスタファイルに書き戻す演算器と；  を備え、マルチスレッドプロセッサにおける命令発行装置を用い、コンピュータに次の各ステップを実行させるための命令発行プログラムを記憶したコンピュータ読み取り可能な記憶媒体であって、
前記リザベーションステーションは、前記演算器からの出力を監視し、前記レジスタファイルで未解決のオペランドである必要なデータが前記演算器から演算結果として出力された場合、その演算結果をオペランドとして取り込むステップと、
前記リザベーションステーションは、スレッドＩＤに対応した優先度情報を、各スレッドに対応して優先度を設定するためのスレッド制御ユニットから求めるステップと、
前記リザベーションステーションは、命令実行に必要な全てのオペランドがそろった命令であって、且つ、優先度情報に従い優先度の高いスレッドの命令を前記演算器へ送るステップと
を、コンピュータに実行させるための命令発行プログラムを記憶したコンピュータ読み取り可能な記憶媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、命令発行方法及び装置、中央演算装置、命令発行プログラム及びそれを記憶したコンピュータ読み取り可能な記憶媒体に係り、特に、各種ロボット、自動車、プラント、ホームオートメーション等の種々の分散実時間制御を実現するために必要な実時間処理をハードウェアで支援する命令発行方法及び装置、中央演算装置、命令発行プログラム及びそれを記憶したコンピュータ読み取り可能な記憶媒体に関する。
【０００２】
【従来の技術】
従来、マルチスレッドプロセッサを用いた技術として、特許文献１には、複数の命令フローを独立に処理し、命令フロー単位で処理性能を柔軟に制御するものが記載されている。このマルチスレッドプロセッサでは、命令フロー中の命令によって命令フロー毎の優先順位を制御し、一つの機能ユニットに対して複数同時に命令発行要求が出力された場合、機能ユニットに発行すべき命令を優先度によって決定することで命令フロー単位に必要とされる処理性能を動的に実現する。なお、スレッドとは、一般に、ＯＳがあるプロセス又はタスクを並列処理するため、プロセス又はタスクを分割した処理単位又は最小単位のことをいう。この際、プロセス又はタスクが分割されることなく、１プロセス又は１タスクが１スレッドとなる場合もある。
【特許文献１】
特開平１０−１２４３１６号公報
【０００３】
【発明が解決しようとする課題】
従来のマルチスレッドプロセッサのリザベーションステーションでは、命令がどのスレッドのものかということに関係なく処理が行われる。そのため、複数のスレッドが同時に実行されていると、あるスレッドの実行時間が他のスレッドの実行に影響を受け、実行時間を予測することが難しくなる。そのためリアルタイム処理のように時間制約に厳しいシステムにおいては、この点が課題となる。
【０００４】
本発明は、以上の点に鑑み、マルチスレッドプロセッサにおいて実時間処理を、
（１）命令の優先度による追い越し、及び／又は、
（２）クロック毎の優先度の付け替え、
という手法を用いて実現することにより、他のスレッドに影響されることなく、スレッドの実時間処理の実行を可能とすることを目的とする。
【０００５】
【課題を解決するための手段】
本発明では、特に、
１．実行する命令に優先度を付け、リザベーションステーションにおいて高い優先度の命令が低い優先度の命令を追い越すこと、及び／又は、
２．命令の優先度をクロック毎に付け替えること、
により、他のスレッドの影響を受けずにスレッドがリアルタイム処理を行うことを実現する。
【０００６】
本発明の第１の解決手段によると、
中央演算装置が複数のスレッドの命令を実行するマルチスレッドプロセッサにおける命令発行装置であって、
各スレッドに対応して優先度を設定するためのスレッド制御ユニットと、
演算処理及び／又はメモリアクセス処理において実行すべきスレッドの命令及びオペランドが記憶されたレジスタファイルと、
スレッド識別子（スレッドＩＤ）に対応して、優先度情報と、命令と、該命令の実行に用いる各オペランドを示すデータとを含むエントリを記憶し、前記レジスタファイルからデータを受け取り、命令及びオペランドを発行するリザベーションステーションと、
前記リザベーションステーションから発行された命令及びオペランドを受け取り、該命令に従い各種演算を行い、演算結果を前記レジスタファイルに書き戻す演算器と、
を備え、
前記リザベーションステーションは、
前記演算器からの出力を監視し、前記レジスタファイルで未解決のオペランドである必要なデータが前記演算器から演算結果として出力された場合、その演算結果をオペランドとして取り込む手段と、
スレッドＩＤに対応した優先度情報を前記スレッド制御ユニットから求める手段と、
命令実行に必要な全てのオペランドがそろった命令であって、且つ、優先度情報に従い優先度の高いスレッドの命令を前記演算器へ送る手段と
を有することにより、前記リザベーションステーションから前記演算器への命令発行を高い優先度のスレッドの命令が低い優先度の命令を追い越すようにした前記命令発行装置が提供される。
【０００７】
本発明の第２の解決手段によると、
上述のような命令発行装置と、
命令及びデータをそれぞれキャッシュする命令キャッシュ及びデータキャッシュと、
前記命令キャッシュから命令をフェッチ及びデコードし、デコードされた命令を基に前記レジスタファイルをアクセスする命令フェッチユニットと、
外部の記憶装置及び／又は入出力装置とデータの入出力を行うためのインターフェースユニットと、
を備えた中央演算装置が提供される。
【０００８】
本発明の第３の解決手段によると、
スレッド識別子（スレッドＩＤ）に対応して、優先度情報と、命令と、該命令の実行に用いる各オペランドを示すデータとを含むエントリを記憶し、実行すべきスレッドのオペランドが記憶されたレジスタファイルからデータを受け取り、命令及びオペランドを発行するリザベーションステーションと；  前記リザベーションステーションから発行された命令及びオペランドを受け取り、該命令に従い各種演算を行い、演算結果を前記レジスタファイルに書き戻す演算器と；  を備え、マルチスレッドプロセッサにおける命令発行装置を用いた命令発行方法であって、
前記リザベーションステーションは、前記演算器からの出力を監視し、前記レジスタファイルで未解決のオペランドである必要なデータが前記演算器から演算結果として出力された場合、その演算結果をオペランドとして取り込むステップと、
前記リザベーションステーションは、スレッドＩＤに対応した優先度情報を、各スレッドに対応して優先度を設定するためのスレッド制御ユニットから求めるステップと、
前記リザベーションステーションは、命令実行に必要な全てのオペランドがそろった命令であって、且つ、優先度情報に従い優先度の高いスレッドの命令を前記演算器へ送るステップと
を含むことにより、前記リザベーションステーションから前記演算器への命令発行を高い優先度のスレッドの命令が低い優先度の命令を追い越すようにした前記命令発行方法が提供される。さらに、第３の解決手段に記載された各ステップを、コンピュータに実行させるための命令発行プログラム及びその命令発行プログラムを記憶したコンピュータ読み取り可能な記憶媒体が提供される。
【０００９】
【発明の実施の形態】
１．関連技術
本実施の形態は、一例として、レスポンシブ・マルチスレッドプロセッサ（Responsive Multi-Threaded（ＲＭＴ）Processor）等のマルチスレッドプロセッサの中央演算装置（ＣＰＵ）上で利用されている。そこで、まず、本実施の形態に関連するＣＰＵを有するマルチスレッドプロセッサについて説明する。
【００１０】
図１に、本実施の形態に関連するアウトオブオーダ実行を行うマルチスレッドプロセッサの構成図を示す。ここで、アウトオブオーダ実行とは、プログラムで記述されている順番と異なる順番でも命令の演算を行うことをいう。そのために、アウトオブオーダ実行では、以下に説明するように、リオーダバッファとリザベーションステーションを用いて、実行可能な命令から順に演算器に送り、リオーダバッファで順番を元に戻すことが行われる。
【００１１】
このプロセッサは、ＣＰＵ１０１、メモリ２００、Ｉ／Ｏ３００、バス４００を有する。ＣＰＵ１０１は、バス４００を介して、メモリ２００、Ｉ／Ｏ３００等と接続されている。ＣＰＵ１０１は、レジスタ群１、命令フェッチユニット２、命令キャッシュ３、演算器４、メモリアクセスユニット５、データキャッシュ６、バスインターフェースユニット７、リオーダバッファ８、命令デコードユニット９、リザベーションステーション１０、演算バス１１、コモンデータバス１２を備える。レジスタ群１は、レジスタファイル１−１、リネームレジスタ１−２を有する。
【００１２】
命令キャッシュ３及びデータキャッシュ６は、例えば、ＳＲＡＭ、フリップフロップ（ＦＦ）等の素子が用いられ、アクセス、読み出し、書き込み等の処理速度が速いものの記憶容量が小さい。一方、ＣＰＵ１０１外部のメモリ２００は、ＳＤＲＡＭ、ＤＲＡＭ等の素子が用いられ、アクセス、読み出し、書き込み等の処理速度がキャッシュより遅いものの記憶容量が大きい。
【００１３】
命令フェッチユニット２は、命令キャッシュ３へアドレス（Ａｄｄｒｅｓｓ）を出力し、命令キャッシュ３から命令（ｉｎｓｔｒｕｃｔｉｏｎ）をフェッチし、フェッチした命令を命令デコードユニット９に送る。命令デコードユニット９は、命令フェッチユニット２でフェッチされた命令をデコードし、それを基にレジスタ群１のレジスタファイル１−１から演算に必要なデータを読み出す。
【００１４】
レジスタ群１のレジスタファイル１−１は、汎用レジスタ（ＧＰＲ）、浮動小数点レジスタ（ＦＰＲ）、プログラムカウンタ（ＰＣ）、ステータスレジスタ（ＳＲ）等の各種レジスタを含む。レジスタファイル１−１は、現在実行中の命令に必要なオペランド又はデータ等を記憶する。マルチスレッドプロセッサの場合は、レジスタファイル１−１が並列に複数存在することになる。レジスタ群１のリネームレジスタ１−２は、オペランドの依存関係を解決するためにオペランド名を変更する。リネームレジスタ１−２は、必要なオペランドがまだ演算中で結果が出ていない場合、データの代わりにリネームされたレジスタＩＤを出力する。レジスタファイル１−１又はリネームレジスタ１−２から出力された、オペランド又はデータは、デコードされた命令と共に演算バス１１を介してリザベーションステーション１０へ送られる。
【００１５】
演算バス１１は、レジスタ群１のレジスタファイル１−１又はリネームレジスタ１−２、リオーダバッファ８とリザベーションステーション１０を並列に接続する。
【００１６】
リザベーションステーション１０は、レジスタファイル１−１及び／又はリネームレジスタ１−２から、デコードされた命令に従ってレジスタ群１から読み出された、演算に必要なオペランド又はデータを格納する。また、リザベーションステーション１０は、各演算器４及びメモリアクセスユニット５からの出力をコモンデータバス１２を介して監視し、レジスタファイル１−１で未解決のオペランドについては必要なデータが演算器４から出力されると、その結果をオペランドとして取り込む。リザベーションステーション１０は、全てのオペランドがそろった命令から順に接続されている演算器４又はメモリアクセスユニット５へ送る。なお、ロード（Ｌｏａｄ）又はストア（Ｓｔｏｒｅ）等のメモリアクセス命令の場合、メモリアクセスユニット５に接続されたリザベーションステーション１０にその命令及びオペランドが格納される。
【００１７】
演算器４は、局所性原理に従い、命令キャッシュ３、データキャッシュ６又はメモリ２００から必要なデータ及び命令をリザベーションステーション１０又はレジスタ群１を介して利用する。演算器４は、リザベーションステーション１０から受け取った命令に従い演算を実行し、計算した結果をコモンデータバス１２に出力する。
【００１８】
また、メモリアクセスユニット５は、データキャッシュ６にアクセスしロード又はストアを実行し、コモンデータバス１２に出力する。ストア命令の場合、メモリアクセスユニット５は、アドレスとデータをデータキャッシュ６に送り、データをデータキャッシュ６に格納する。ロード命令の場合、メモリアクセスユニット５は、アドレスをデータキャッシュ６に送りデータキャッシュ６からデータを読み出す。読み出したデータは、コモンデータバス１２を介してレジスタファイル１−１に書き戻される。このとき、データキャッシュ６に求めるデータがなければ、バスインターフェースユニット７を介してメモリ２００からそれを読み出す。バスインターフェースユニット７は、命令キャッシュ３、データキャッシュ６とＣＰＵ外部のメモリ２００、Ｉ／Ｏ３００等をバス４００を介して接続し、ＣＰＵ内部と外部の間でデータの入出力行うユニットである。
【００１９】
コモンデータバス１２は、演算器４の演算結果、メモリアクセスユニット５のロード又はストアの実行結果をレジスタファイル１−１又はリネームレジスタ１−２、リオーダバッファ８、リザベーションステーション１０に受け渡す。
【００２０】
リオーダバッファ８は、各演算器４によりアウトオブオーダで実行された命令の順番を元の順番にもどしてから、演算結果を実際のレジスタファイル１−１へ書き込む。
【００２１】
図２に、リザベーションステーション１０のエントリのフォーマットを示す。
リザベーションステーション１０のエントリは、ビジービット（ｂｕｓｙ  ｂｉｔ）、命令（ｏｐｅｒａｔｉｏｎ）、ひとつ又は複数の有効ビット及びデータの組、（ｖａｌｉｄ０及びｄａｔａ０、ｖａｌｉｄ１及びｄａｔａ１、・・・）を含む。
【００２２】
「ビジービット」は、エントリが有効であるか無効であるか、即ちエントリに命令があるかないかを示し、「命令」は、演算器４で演算するための命令又はメモリアクセスユニット５で実行するための命令を示す。また、「データ」は、命令実行に必要なオペランドを示し、「有効ビット」は、演算に用いる対応するオペランドに対して値が有効であるか否かを示す。リザベーションステーション１０は、命令に応じて有効ビットとデータの組の数を設定することができる。リザベーションステーション１０は、有効ビットを用いて、全てのオペランドがそろったことを判断することができる。
【００２３】
図３及び図４に、リザベーションステーション１０における演算器４への命令発行処理のフローチャート（１）及び（２）を示す。図３は、ステップＳ１０１からステップＳ１０９までのステップを、図４は、ステップＳ１１１からステップＳ１１７までのステップを示す。命令発行処理は、ステップＳ１０１からステップＳ１０９までのステップを処理した後、ステップＳ１１１からステップＳ１１７までのステップを処理する。
【００２４】
リザベーションステーション１０は、レジスタファイル１−１から読み出されたデータを受け取り、その命令実行に必要なデータを記憶するためのエントリを作成して記憶している。リザベーションステーション１０は、このようなエントリをひとつ又は複数内部に記憶する。
【００２５】
命令発行処理が開始されると、リザベーションステーション１０の全てのエントリに対して、ステップＳ１０１からステップＳ１０９の繰り返しループ処理を行う。繰り返しループ処理では、まず、リザベーションステーション１０は、各エントリについて、そのエントリが示す命令を実行するために必要なオペランドが全てそろっているか否か判断する（Ｓ１０３）。リザベーションステーション１０は、必要なオペランドの数を命令に従って判別してもよいし、予め命令毎に必要な数又は領域をエントリに定めてもよい。リザベーションステーション１０は、例えば、各エントリの有効ビットが全て有効であるか否かを判断する。ステップＳ１０３で、命令の実行に必要な全てのデータがオペランドとして得られた場合、例えば、該当する命令実行に必要な全てのオペランドに対する全ての有効ビットがセットされている場合、ステップＳ１０９に移る。一方、必要なオペランドがそろっていない場合、例えば、全ての有効ビットがセットされていない場合（Ｓ１０３）、リザベーションステーション１０は、必要なデータをまだ得ていないことになり、ステップＳ１０５に移る。この場合、リザベーションステーション１０は、コモンデータバス１２から流れてくる演算結果を監視し、必要なデータが来れば（Ｓ１０５）、それをエントリのデータにオペランドとして取り込み、該当する有効ビットをセットする（Ｓ１０７）。一方、必要なデータが来なければ（Ｓ１０５）、ステップＳ１０９に移る。
【００２６】
リザベーションステーション１０の全てのエントリに対して、ステップＳ１０１からステップＳ１０９の処理を繰り返し行った後、ステップＳ１１１に進んで処理を継続する。
【００２７】
つぎに、図４を用いて、ステップＳ１１１からステップＳ１１７の処理について説明する。
ステップＳ１１１では、リザベーションステーション１０は、命令実行に必要な全てのオペランドがそろったエントリがあるか否か判断する（Ｓ１１１）。例えば、上述のように、リザベーションステーション１０は全ての有効ビットが有効かどうかでこれを判断することができる。全てのオペランドがそろったエントリが無い場合は、命令発行を終了する。一方、全てのオペランドがそろったエントリがある場合は、リザベーションステーション１０は、そのようなエントリがひとつか複数か判断する（Ｓ１１３）。例えば、全ての有効ビットがセットされると、命令実行に必要な全てのオペランドがそろったことになる。
【００２８】
リザベーションステーション１０は、全てのオペランドがそろったエントリが１つの場合、該当エントリの命令及びオペランドを演算器４に送る（Ｓ１１５）。一方、複数のエントリが全てのエントリがそろい演算可能である場合、リザベーションステーション１０は、より古いエントリから演算器４に送る（Ｓ１１７）。選択されなかったエントリは次の命令発行の処理クロック以降まで発行を待たされる。
【００２９】
２．優先度による複数スレッドの命令発行装置を備えたＣＰＵ
上述の「１．関連技術」では、リザベーションステーション１０の動作は、主に、オペランドがそろい、演算が可能になった命令から演算器４に送り、複数の命令が同時に演算可能になっている場合は最も古い命令から実行することについて説明した。以下では、複数の命令が同時に演算可能になった場合、優先度の最も高いスレッドの命令から先に実行するための命令発行について説明する。
【００３０】
図５に、優先度を用いたアウトオブオーダ実行を行うマルチスレッドプロセッサの構成図を示す。
このプロセッサは、ＣＰＵ１０２、メモリ２００、Ｉ／Ｏ３００、バス４００を有する。ＣＰＵ１０２は、バス４００を介して、メモリ２００、Ｉ／Ｏ３００等と接続されている。ＣＰＵ１０２は、レジスタ群１、命令フェッチユニット２、命令キャッシュ３、演算器４、メモリアクセスユニット５、データキャッシュ６、バスインターフェースユニット７、リオーダバッファ８、命令デコードユニット９、演算バス１１、コモンデータバス１２、リザベーションステーション２０、スレッド制御ユニット２１を備える。レジスタ群１は、レジスタファイル１−１、リネームレジスタ１−２を含む。
【００３１】
命令フェッチユニット２は、命令キャッシュ３へアドレス（Ａｄｄｒｅｓｓ）を出力し、命令キャッシュ３から命令（ｉｎｓｔｒｕｃｔｉｏｎ）をフェッチし、命令デコードユニット９で命令をデコードする。
【００３２】
スレッド制御ユニット２１は、各スレッドの優先度を設定する。また、スレッド制御ユニット２１は、設定した優先度を全てのリザベーションステーション２０に送る。スレッド制御ユニット２１内部には、各スレッドの優先度を識別するためのデータを所定数保持する。スレッド制御ユニット２１は、そのために、例えば、各スレッドに対応した優先度の情報を記憶したメモリを備えることができる。また、スレッド制御ユニット２１は、他に、スレッドの実行、停止、コンテキストをキャッシュするコンテキストキャッシュとの入れ替え制御等を行うことができる。ここで、コンテキストとは、例えば、汎用レジスタ、浮動小数点レジスタ、プログラムカウンタ、ステータスレジスタ等、記憶部（例、レジスタファイル１−１）に記憶されている各スレッドの実行のための情報又は現在実行中の状態のことをいう。
【００３３】
リザベーションステーション２０は、上述したように、デコードされた命令に従ってレジスタファイル１−１及び／又はリネームレジスタ１−２から読み出された、演算に必要なオペランド又はデータを格納する。
【００３４】
また、リザベーションステーション２０は、各演算器４及びメモリアクセスユニット５からの出力をコモンデータバス１２を介して監視し、レジスタファイル１−１で未解決のオペランドについては必要なデータが演算器４から出力されると、その結果をオペランドとして取り込む。さらに、リザベーションステーション２０は、スレッド制御ユニット２１から設定された優先度情報を受け取る、又は、スレッド制御ユニット２１をアクセスし、所定のスレッドの優先度情報を得る。また、リザベーションステーション２０は、スレッド毎に優先度情報を記憶したテーブルを内部のレジスタに記憶してもよい。リザベーションステーション２０は、全てのオペランドがそろった命令のうち優先度が高い命令から順に接続されている演算器４又はメモリアクセスユニット５へ送る。なお、ロード又はストア等のメモリアクセス命令の場合、メモリアクセスユニット５に接続されたリザベーションステーション２０にその命令及びオペランドが送られる。
【００３５】
他の各部の構成及び動作は、上述したように、図１のＣＰＵ１０１の同符号で示される各部の構成及び動作と同様である。
【００３６】
図６に、リザベーションステーション２０のエントリのフォーマットを示す。このエントリは、リザベーションステーション１０のエントリに、命令の優先度情報（ｐｒｉｏｒｉｔｙ）が付加されている。
【００３７】
リザベーションステーション２０のエントリは、ビジービット（ｂｕｓｙ  ｂｉｔ）、スレッドＩＤ（ｔｈｒｅａｄ  ＩＤ）、優先度情報（ｐｒｉｏｒｉｔｙ）、命令（ｏｐｅｒａｔｉｏｎ）、ひとつ又は複数の有効ビット及びデータの組、（ｖａｌｉｄ０及びｄａｔａ０、ｖａｌｉｄ１及びｄａｔａ１、・・・）を含む。
【００３８】
ビジービット、命令、有効ビット、データは、図２で説明したものと同様である。「スレッドＩＤ」は、エントリの命令がどのスレッドのものかを示す。なお、スレッドＩＤを省略し、スレッドＩＤ毎に各エントリを識別する情報を記憶したテーブルを用いること等により、リザベーションステーション２０は、各スレッドＩＤを適宜把握することもできる。「優先度情報」は、命令の優先度を示し、リザベーションステーション２０に命令が入れられるとき、オペランドを得たとき、処理クロック毎、及び／又は全てのオペランドがそろったとき等にスレッド制御ユニット２１からセットされる。リザベーションステーション２０は、スレッド毎に別途指定されたレジスタやスレッド制御ユニット２１の設定に基づき、スレッド毎に優先度の値を調べ、優先度情報を変更する。本実施の形態ではスレッド制御ユニット２１は、例えば、スレッド毎に８ｂｉｔのレジスタを用意し、優先度情報を２５６レベルの値として指定する。この値は、例えば、高い（大きい）ほど優先度が高く、低い（小さい）ほど優先度が低いとすることができる。
【００３９】
図７及び図８に、優先度を用いた、リザベーションステーション２０における演算器４への命令発行処理のフローチャート（１）及び（２）を示す。図７は、ステップＳ２０１からステップＳ２０９までのステップを、図８は、ステップＳ２１１からステップＳ２１７までのステップを示す。命令発行処理は、ステップＳ２０１からステップＳ２０９までのステップを処理した後、ステップＳ２１１からステップＳ２１７までのステップを処理する。
【００４０】
リザベーションステーション２０は、レジスタファイル１−１から送られてくるデータを及び命令を格納し、その命令実行に必要なデータを記憶するためのエントリを作成して記憶している。リザベーションステーション２０は、このようなエントリをひとつ又は複数内部に記憶する。
【００４１】
命令発行処理が開始されると、リザベーションステーション２０の全てのエントリに対して、ステップＳ２０１からステップＳ２０９の繰り返しループ処理を行う。繰り返しループ処理では、まず、リザベーションステーション２０は、各エントリについて、そのエントリが示す命令を実行するために必要なオペランドが全てそろっているか否か判断する（Ｓ２０３）。リザベーションステーション２０は、必要なオペランドの数を命令に従って判別してもよいし、予め命令毎に必要な数又は領域をエントリに定めてもよい。リザベーションステーション２０は、例えば、各エントリの有効ビットが全て有効であるか否かを判断する。ステップＳ２０３で命令の実行に必要な全てのオペランドがそろっている場合、例えば、該当する命令実行に必要な全てのオペランドに対する全ての有効ビットがセットされている場合、ステップＳ２０８に移る。一方、必要なオペランドがそろっていない場合、例えば、全ての有効ビットがセットされていない場合（Ｓ２０３）、リザベーションステーション２０は、当該エントリの命令の実行のために必要なデータをまだ得ていないことになり、ステップＳ２０５に移る。ここで、リザベーションステーション２０は、コモンデータバス１２を監視し必要なデータが来れば（Ｓ２０５）、それをエントリにオペランドとして取り込み該当する有効ビットをセットする（Ｓ２０７）。一方、必要なデータが来なければ（Ｓ２０５）、ステップＳ２０８に移る。
【００４２】
つぎに、リザベーションステーション２０は、各エントリのスレッドＩＤから優先度情報を更新する（Ｓ２０８）。例えば、リザベーションステーション２０は、各エントリにはどのスレッドのものかを示すフィールド、即ちスレッドＩＤがあるため、それを参照することによりそのエントリがどのスレッドのものかを判断することができる。また、スレッド制御ユニット２１では、メモリ等によりスレッドＩＤ毎に優先度情報が指定されているため、リザベーションステーション２０は、スレッド制御ユニット２１のメモリをアクセスする等により設定された優先度を得て、該当するエントリの優先度情報を更新することができる。逆に、スレッド制御ユニット２１が、各リザベーションステーション２０のエントリのスレッドＩＤを得て、そのスレッドＩＤに該当する優先度情報を与えることで、リザベーションステーション２０が優先度情報を得るようにしてもよい。また、リザベーションステーション２０は、この優先度のデータを適当なタイミングでスレッド制御ユニット２１から得て、スレッドＩＤに対応して優先度情報を内部メモリに記憶しておくようにして、それを参照することでスレッドＩＤに従い優先度情報を得てもよい。
【００４３】
リザベーションステーション２０は、全てのエントリに対して、ステップＳ２０１からステップＳ２０９の処理を繰り返し行った後、ステップＳ２１１に進む。
【００４４】
つぎに、図８を用いて、ステップＳ２１１からステップＳ２１７の処理について説明する。
ステップＳ２１１では、リザベーションステーション２０は、命令実行に必要な全てのオペランドがそろったエントリがあるか否か判断する（Ｓ２１１）。例えば、上述のように、リザベーションステーション２０は全ての有効ビットが有効かどうかでこれを判断することができる。全てのオペランドがそろったエントリが無い場合は、命令発行を終了する。一方、全てのオペランドがそろったエントリがある場合は、リザベーションステーション２０は、そのようなエントリがひとつか複数か判断する（Ｓ２１３）。例えば、上述のように、全ての有効ビットがセットされると、命令実行に必要なオペランドがそろったことになる。
【００４５】
リザベーションステーション２０は、全てのオペランドがそろったエントリが１つの場合、該当エントリの命令及びオペランドを演算器４に送る（Ｓ２１５）。一方、複数のエントリが全てのオペランドがそろい演算可能である場合、リザベーションステーション２０は、命令の実行可能な各エントリの優先度情報を比較して、より高い優先度を持つエントリを選択する（Ｓ２１７）。なお、ここで、リザベーションステーション２０は、優先度が等しい又は略等しいエントリが複数あれば、その中でより古いエントリを選択して、又は、予め定められた順序によりエントリを選択して演算器４に送る。なお、選択されなかったエントリは次の命令発行の処理クロック以降まで発行を待たされる。
【００４６】
このように、リザベーションステーション２０は、優先度の値が高いエントリを優先的に演算器４に送ることができ、これにより優先度の高い命令が先に演算される。なお、ステップＳ２０８の処理をステップＳ２０３の前に実行してもよい。
【００４７】
３．優先度とカウンタを用いた複数スレッドの命令発行装置及びＣＰＵ
この実施の形態では、優先度とカウンタに基づき、先に実行すべき命令を発行するための命令発行について説明する。この実施の形態の命令発行装置及びＣＰＵの構成及び動作は、上述の図５及びその説明箇所の通りであり、リザベーションステーション２０で用いるエントリが異なる。
【００４８】
図９に、リザベーションステーション２０のカウンタ（ｃｏｕｎｔｅｒ）を付加したエントリのフォーマットを示す。
【００４９】
このエントリは、ビジービット（ｂｕｓｙ  ｂｉｔ）、スレッドＩＤ（ｔｈｒｅａｄ  ＩＤ）、優先度情報（ｐｒｉｏｒｉｔｙ）、命令（ｏｐｅｒａｔｉｏｎ）、ひとつ又は複数の有効ビット及びデータの組、（ｖａｌｉｄ０及びｄａｔａ０、ｖａｌｉｄ１及びｄａｔａ１、・・・）、カウンタ（ｃｏｕｎｔｅｒ）を含む。ビジービット、スレッドＩＤ、優先度情報、命令、有効ビット、データは、図２又は図５で説明したものと同様である。
カウンタは、例えば、リザベーションステーション２０により命令がエントリに入れられた時にリセットされ、命令発行の処理クロック毎にカウントアップされるカウンタ値である。
【００５０】
図１０及び図１１に、カウンタを用いた、リザベーションステーション２０における演算器４への命令発行のフローチャート（１）及び（２）を示す。図１０は、ステップＳ２０１からステップＳ２０９までのステップを、図１１は、ステップＳ２１１からステップＳ３０７までのステップを示す。命令発行処理は、ステップＳ２０１からステップＳ２０９までのステップを処理した後、ステップＳ２１１からステップＳ３０７までのステップを処理する。
【００５１】
図１０及び図１１のフローチャートは、上述した図７及び図８のフローチャートと同じステップ番号の各ステップにおける処理は、上述した通りである。以下の説明では、主に、図１０及び図１１のステップＳ３０１からステップＳ３０７の処理、図１０及び図１１の処理の順序と図７及び図８の順序で異なる部分について説明する。
【００５２】
リザベーションステーション２０は、上述のように、レジスタファイル１−１から送られてくるデータ及び命令を格納し、その命令実行に必要なデータを記憶するためのエントリを作成して記憶している。リザベーションステーション２０は、このようなエントリをひとつ又は複数内部に記憶する。
【００５３】
命令発行処理が開始されると、リザベーションステーション２０の全てのエントリに対して、ステップＳ２０１からステップＳ２０９の繰り返しループ処理を行う。繰り返しループ処理では、まず、リザベーションステーション２０は、各エントリについて、エントリが有効か無効か、（例えば、命令が記憶されているか否か）を判断する（Ｓ３０１）。リザベーションステーション２０は、例えば、各エントリのビジービットにより、エントリが有効か無効かを判断する。ステップＳ３０１でエントリが無効の場合、ステップＳ２０９に移る。一方、エントリが有効である場合、リザベーションステーション２０は、そのエントリのカウンタ値を１つ増やす（Ｓ３０３）。カウンタは、例えば、命令がエントリに入れられた時にリセットされ、以後命令発行の処理クロック毎にカウントアップされる。
【００５４】
つぎに、上述のように、リザベーションステーション２０は、各エントリのスレッドＩＤから優先度情報を更新する（Ｓ２０８）。そして、上述のように、リザベーションステーション２０は、各エントリが示す命令を実行するために必要なオペランドが全てそろっているか否か判断し（Ｓ２０３）、命令の実行に必要な全てのオペランドがそろっている場合、ステップＳ２０９に移り、ステップＳ２０１から繰り返しループ処理を実行する。一方、必要なオペランドがそろっていない場合（Ｓ２０３）、リザベーションステーション２０は、コモンデータバス１２を監視して必要なデータが来れば（Ｓ２０５）、それをエントリのデータにオペランドとして取り込み該当する有効ビットをセットする（Ｓ２０７）。一方、必要なデータが来なければ（Ｓ２０５）、ステップＳ２０９に移り、ステップＳ２０１から繰り返しループ処理を実行する。
【００５５】
つぎに、図１１を用いて、ステップＳ２１１からステップＳ３０７の処理について説明する。
ステップＳ２１１では、上述のように、リザベーションステーション２０は、命令実行に必要な全てのオペランドがそろったエントリがあるか否か判断する（Ｓ２１１）。全てのオペランドがそろったエントリが無い場合は、命令発行を終了する。一方、全てのオペランドがそろったエントリがある場合は、リザベーションステーション２０は、そのようなエントリがひとつか複数か判断する（Ｓ２１３）。
【００５６】
リザベーションステーション２０は、全てのオペランドがそろったエントリが１つの場合、該当エントリの命令及びオペランドを演算器４に送る（Ｓ２１５）。一方、複数のエントリが全てのオペランドがそろい演算可能である場合、リザベーションステーション２０は、命令の実行可能な各エントリの優先度情報を比較して、より高い優先度を持つエントリを選択する（Ｓ３０５）。さらに、リザベーションステーション２０は、最も高い優先度のエントリが複数ある場合は、その中で最もカウンタ値の大きいエントリの命令を演算器４に送る（Ｓ３０５）。なお、複数のエントリが演算可能だった場合、リザベーションステーション２０は、例えば、上位ｂｉｔに優先度情報、下位ｂｉｔにカウンタの連結値を用いて比較し、より数値の大きい命令を選択するようにしてもよい。選択されなかったエントリは、次の命令発行の処理クロック以降まで発行を待たされる。ステップＳ２１５又はＳ３０５の処理を終了すると、リザベーションステーション２０は、演算器４に命令を送ったエントリのカウンタ値をクリアし、ビジービットを変更してエントリを無効とする（Ｓ３０７）。なお、ステップＳ２０８の処理をステップＳ２０７の後に実行してもよい。
これにより優先度の高い命令が選択され、優先度が等しい場合はより古い命令が選択される。
【００５７】
４．その他
本発明の命令発行方法又は命令発行装置・システムは、その各手順をコンピュータに実行させるための命令発行プログラム、命令発行プログラムを記録したコンピュータ読み取り可能な記録媒体、命令発行プログラムを含みコンピュータの内部メモリにロード可能なプログラム製品、そのプログラムを含むサーバ等のコンピュータ、等により提供されることもできる。
【００５８】
【発明の効果】
本発明によれば、マルチスレッドプロセッサにおいて実時間処理を、
（１）命令の優先度による追い越し、及び／又は、
（２）クロック毎の優先度の付け替え、
という手法を用いて実現することにより、他のスレッドに影響されることなく、スレッドの実時間処理の実行を可能とすることができる。
【図面の簡単な説明】
【図１】本実施の形態に関連するアウトオブオーダ実行を行うマルチスレッドプロセッサの構成図。
【図２】リザベーションステーション１０のエントリのフォーマット。
【図３】リザベーションステーション１０における演算器４への命令発行のフローチャート（１）。
【図４】リザベーションステーション１０における演算器４への命令発行のフローチャート（２）。
【図５】優先度を用いたアウトオブオーダ実行を行うマルチスレッドプロセッサの構成図。
【図６】リザベーションステーション２０のエントリのフォーマット。
【図７】優先度を用いた、リザベーションステーション２０における演算器４への命令発行のフローチャート（１）。
【図８】優先度を用いた、リザベーションステーション２０における演算器４への命令発行のフローチャート（２）。
【図９】リザベーションステーション２０のカウンタ（ｃｏｕｎｔｅｒ）を付加したエントリのフォーマット。
【図１０】カウンタを用いた、リザベーションステーション２０における演算器４への命令発行のフローチャート（１）。
【図１１】カウンタを用いた、リザベーションステーション２０における演算器４への命令発行のフローチャート（２）。
【符号の説明】
１  レジスタ群
１−１  レジスタファイル
１−２  リネームレジスタ
２  命令フェッチユニット
３  命令キャッシュ
４  演算器
５  メモリアクセスユニット
６  データキャッシュ
７  バスインターフェースユニット
８  リオーダバッファ
９  命令デコードユニット
１０  リザベーションステーション
１１  演算バス
１２  コモンデータバス
２０  リザベーションステーション
２１  スレッド制御ユニット
１０１、１０２  ＣＰＵ
２００  メモリ
３００  Ｉ／Ｏ
４００  バス
【図１】
0003646137.tif 000002
【図２】
0003646137.tif 000003
【図３】
0003646137.tif 000004
【図４】
0003646137.tif 000005
【図５】
0003646137.tif 000006
【図６】
0003646137.tif 000007
【図７】
0003646137.tif 000008
【図８】
0003646137.tif 000009
【図９】
0003646137.tif 000010
【図１０】
0003646137.tif 000011
【図１１】
0003646137.tif 000012