(57)【要約】【課題】従来のマルチスレッドプロセッサでは、ハードウェアスレッドの最低実行時間を保証しながら、柔軟なハードウェアスレッドの選択ができない問題があった。【解決手段】本発明のマルチスレッドプロセッサは、それぞれが独立した命令流を生成する複数のハードウェアスレッドと、次実行サイクルにおいて実行するハードウェアスレッドを指定する第１のスレッド選択信号ＴＳＥＬを出力する第１のスレッドスケジューラ１９と、第１のスレッド選択信号ＴＳＥＬに応じて選択したハードウェアスレッドにより生成された命令を出力する第１のセレクタと、第１のセレクタから出力される命令を実行する演算回路と、を有し、第１のスレッドスケジューラ１９は、演算回路においてハードウェアスレッドが実行される度に、実行されたハードウェアスレッドに対する優先順位を更新し、更新後の優先順位に従って第１のスレッド選択信号ＴＳＥＬを出力するものである。【選択図】図２
2010086130.tif 000002
【特許請求の範囲】
【請求項１】
それぞれが独立した命令流を生成する複数のハードウェアスレッドと、
予め前記複数のハードウェアスレッドのそれぞれに対して設定された優先順位に応じて、前記複数のハードウェアスレッドのうち次実行サイクルにおいて実行するハードウェアスレッドを指定する第１のスレッド選択信号を出力する第１のスレッドスケジューラと、
前記第１のスレッド選択信号に応じて前記複数のハードウェアスレッドのいずれか１つを選択して、選択したハードウェアスレッドにより生成された命令を出力する第１のセレクタと、
前記第１のセレクタから出力される命令を実行する演算回路と、を有し、
前記第１のスレッドスケジューラは、前記演算回路において前記ハードウェアスレッドが実行される度に、実行された前記ハードウェアスレッドに対する前記優先順位を更新し、更新後の前記優先順位に従って前記第１のスレッド選択信号を出力するマルチスレッドプロセッサ。
【請求項２】
前記第１のスレッドスケジューラは、前記優先順位が高い前記ハードウェアスレッドを優先的に選択して前記第１のスレッド選択信号を出力し、前記第１のスレッド選択信号により指定された前記ハードウェアスレッドが前記演算回路において実行される度に当該ハードウェアスレッドの前記優先順位を低下させる請求項１に記載のマルチスレッドプロセッサ。
【請求項３】
前記第１のスレッドスケジューラは、同一の前記優先順位を有する前記ハードウェアスレッドが複数存在する場合、予め設定されたルールに従っていずれか１つの前記ハードウェアスレッドを選択し、選択した前記ハードウェアスレッドを指定する前記第１のスレッド選択信号を出力する請求項１又は２に記載のマルチスレッドプロセッサ。
【請求項４】
前記第１のスレッドスケジューラは、前記演算回路において実行されている前記命令と前記複数のハードウェアスレッドにおいて準備されている前記命令との依存関係が高い場合、依存関係の高い命令を含む前記ハードウェアスレッドの優先順位を最低順位とする請求項１乃至３のいずれか１項に記載のマルチスレッドプロセッサ。
【請求項５】
予め決められた第１の実行期間において前記複数のハードウェアスレッドのうちから固定的に選択された少なくとも１つの前記ハードウェアスレッドの実行を指定し、前記第１の実行期間以外の第２の実行期間において任意の前記ハードウェアスレッドの実行を指定する第２のスレッド選択信号と、前記第１の実行期間と前記第２の実行期間とのいずれの期間かを示す実時間ビット信号と、を出力する第２のスレッドスケジューラと、
前記実時間ビット信号を受けて、前記実時間ビット信号が前記第１の実行期間を示すときには前記第２のスレッド選択信号を前記第１のセレクタに与え、前記実時間ビット信号が前記第２の実行期間を示すときには前記第１のスレッド選択信号を前記第１のセレクタに与える第２のセレクタと、を有する請求項１乃至４のいずれか１項に記載のマルチスレッドプロセッサ。
【請求項６】
前記第１のスレッドスケジューラは、
それぞれが対応する前記ハードウェアスレッドに対する優先順位に相当するディスパッチカウント値を保持する複数のディスパッチカウンタと、
前記複数のディスパッチカウンタで保持されるディスパッチカウント値を参照し、最も優先順位の高い前記ハードウェアスレッドを判定する優先順位判定部と、
前記優先順位判定部において最も優先順位が高いと判定されたハードウェアスレッドを指定する前記第１のスレッド選択信号を出力するスレッド番号選択部と、を備え、
前記複数のディスパッチカウンタは、前記演算回路が前記ハードウェアスレッドを実行する度に出力し、実行された前記ハードウェアスレッドを通知するディスパッチ信号を受け、前記ディスパッチ信号が自ディスパッチカウンタに対応する前記ハードウェアスレッドを示す場合に自ディスパッチカウンタが出力する前記ディスパッチカウント値を更新する請求項１乃至５のいずれか１項に記載のマルチスレッドプロセッサ。
【請求項７】
前記複数のディスパッチカウンタにおいて保持されるディスパッチカウント値が予め定められた初期化条件を満たす場合、前記ディスパッチカウント値を初期設定値にリセットする初期化判定部を有する請求項６に記載のマルチスレッドプロセッサ。
【請求項８】
前記複数のディスパッチカウンタは、それぞれ、対応する前記ハードウェアスレッドの優先順位に対応するカウンタ初期設定値を格納するカウンタ初期設定値格納部と、
前記カウンタ初期設定値をカウント値の初期値として格納するカウント値格納部と、
前記ディスパッチ信号を受けて、前記カウント値格納部に格納される前記カウント値を更新するデクリメンタと、
前記演算回路において実行されている前記命令と前記複数のハードウェアスレッドにおいて準備されている前記命令との依存関係をモニタするパイプライ制御回路が依存関係の高い命令を含む前記ハードウェアスレッドに対して出力するマスク信号を受けて、前記マスク信号に応じて前記カウンタ値と最低優先順位の前記カウント値に対応するマスク値とのいずれかを選択し、選択した値を前記ディスパッチカウント値として出力する第３のセレクタと、
を有する請求項６又は７に記載のマルチスレッドプロセッサ。
【請求項９】
前記複数のハードウェアスレッドの優先順位の初期値は、前記マルチスレッドプロセッサの起動時に実行される管理プログラムにより設定される請求項１乃至８のいずれか１項に記載のマルチスレッドプロセッサ。
【請求項１０】
複数のハードウェアスレッドを有し、前記ハードウェアスレッドを所定のスケジュールに従って切り替えながら、前記ハードウェアスレッドにより生成される命令流を実行するマルチスレッドプロセッサにおけるハードウェアスレッドのスケジュール方法であって、
前記複数のハードウェアスレッドのうちもっと高い優先順位のハードウェアスレッドを選択し、選択された前記ハードウェアスレッドにより生成される命令を実行し、
実行された前記命令を生成した前記ハードウェアスレッドの前記優先順位を更新し、
更新後の前記優先順位のうち最も高い前記優先順位を有する前記ハードウェアスレッドを次に命令を生成する前記ハードウェアスレッドとして選択するマルチスレッドプロセッサにおけるハードウェアスレッドのスケジュール方法。
【請求項１１】
前記優先順位の更新処理は、実行された前記命令を生成した前記ハードウェアスレッドの優先順位を低下させるものである請求項１０に記載のマルチスレッドプロセッサにおけるハードウェアスレッドのスケジュール方法。
【請求項１２】
前記複数のハードウェアスレッドが生成する命令と実行中の命令との依存関係が高い場合、依存関係の高い命令を含む前記ハードウェアスレッドの優先順位は最低順位とされる請求項１０又は１１に記載のマルチスレッドプロセッサにおけるハードウェアスレッドのスケジュール方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明にかかるマルチスレッドプロセッサ及びそのハードウェアスレッドのスケジュール方法に関し、特に複数のハードウェアスレッドの実行順序をスケジュールするスレッドスケジューラを有するマルチスレッドプロセッサ及びそのハードウェアスレッドのスケジュール方法に関する。
【背景技術】
【０００２】
近年、プロセッサの処理能力を向上させるためにマルチスレッドプロセッサが提案されている。マルチスレッドプロセッサは、それぞれが独立した命令流を生成するスレッドを有する。そして、マルチスレッドプロセッサは、パイプライン処理により命令を処理する演算回路に対していずれのスレッドにより生成された命令流を処理させるかを切り替えながら演算処理を実行する。このとき、マルチスレッドプロセッサは、１つのスレッドにより生成された命令をパイプライン中の１つの実行ステージで実行しながら、他の実行ステージにおいて他のスレッドにより生成された命令を処理することができる。つまり、マルチスレッドプロセッサの演算回路では、互いに独立関係にある命令がそれぞれ異なる実行ステージで実行されることになる。これにより、マルチスレッドプロセッサは、それぞれの命令流を円滑に処理しながら、パイプラインの実行ステージが何も処理しない時間を削減し、プロセッサの処理能力を向上させる。
【０００３】
このようなマルチスレッドプロセッサの一例が特許文献１に開示されている。特許文献１に記載のマルチスレッドプロセッサでは、複数のプロセッサエレメントと、各プロセッサエレメントのスレッドを切り替える並列プロセッサ制御部とを備える。そして、並列プロセッサ制御部は、プロセッサエレメントにおいて実行されているスレッドの実行時間をカウントし、カウントした時間がスレッドの割り当て時間に達したときにタイムアウト信号を出力し、タイムアウト信号と実行順序レジスタに保持された実行順序情報とに基づきプロセッサエレメントが実行すべきスレッドを切り替える。
【０００４】
このようにマルチスレッドプロセッサでは、演算回路においていずれのスレッドが生成する命令流を処理させるかをスケジュールに従って切り替える。このレッドのスケジュール方法の一例が特許文献２において開示されている。特許文献２に記載のマルチスレッドプロセッサでは、複数のスレッドを巡回的に、そのスレッドに割り当てられた時間ずつ実行する。つまり、特許文献２では、固定的に定められたスケジュールを巡回的に実行することで所定の実行時間比で各スレッドが実行される。
【０００５】
また、スレッドの別のスケジュール方法が特許文献３に開示されている。特許文献３では、スレッドのスケジューリングの方法としてラウンドロビン方式とプライオリティ方式とが記載されている。ラウンドロビン方式では、待ち行列に入っているスレッドを一定時間毎に順番に選んで実行する。そのため、ラウンドロビン方式では、待ち行列にあるスレッドが一定時間毎に公平にＣＰＵに割り当てられて実行される。また、プライオリティ方式は、スレッドの優先度の順にスレッドを実行する。より具体的には、プライオリティ方式では、優先度毎に設けられた待ち行列に各優先度のスレッドがキューイングされ、優先度の高い待ち行列から順にスレッドが選択されＣＰＵに割り当てられて実行される。
【特許文献１】特開２００７−３１７１７１号公報
【特許文献２】特開２００８−５２７５０号公報
【特許文献３】特開２００６−１５５４８０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、ラウンドロビン方式及びプライオリティ方式に共通する問題として、スレッドの最低実行時間を保証しながら、柔軟にスレッドの実行時間を設定できない問題がある。例えば、ラウンドロビン方式では、スレッド数が増加した場合、各スレッドの実行時間が均等に減少し、優先度の高いスレッドに十分な実行時間が割り当てられない問題がある。また、プライオリティ方式では、優先度の高いスレッドの処理が続いた場合、優先度の低いスレッドが処理できない問題がある。
【課題を解決するための手段】
【０００７】
本発明にかかるマルチスレッドプロセッサの一態様は、それぞれが独立した命令流を生成する複数のハードウェアスレッドと、予め前記複数のハードウェアスレッドのそれぞれに対して設定された優先順位に応じて、前記複数のハードウェアスレッドのうち次実行サイクルにおいて実行するハードウェアスレッドを指定する第１のスレッド選択信号を出力する第１のスレッドスケジューラと、前記第１のスレッド選択信号に応じて前記複数のハードウェアスレッドのいずれか１つを選択して、選択したハードウェアスレッドにより生成された命令を出力する第１のセレクタと、前記第１のセレクタから出力される命令を実行する演算回路と、を有し、前記第１のスレッドスケジューラは、前記演算回路において前記ハードウェアスレッドが実行される度に、実行された前記ハードウェアスレッドに対する前記優先順位を更新し、更新後の前記優先順位に従って前記第１のスレッド選択信号を出力するものである。
【０００８】
また、本発明にかかるマルチスレッドプロセッサにおけるハードウェアスレッドのスケジュール方法の一態様は、複数のハードウェアスレッドを有し、前記ハードウェアスレッドを所定のスケジュールに従って切り替えながら、前記ハードウェアスレッドにより生成される命令流を実行するマルチスレッドプロセッサにおけるハードウェアスレッドのスケジュール方法であって、前記複数のハードウェアスレッドのうちもっと高い優先順位のハードウェアスレッドを選択し、選択された前記ハードウェアスレッドにより生成される命令を実行し、実行された前記命令を生成した前記ハードウェアスレッドの前記優先順位を更新し、更新後の前記優先順位のうち最も高い前記優先順位を有する前記ハードウェアスレッドを次に命令を生成する前記ハードウェアスレッドとして選択するものである。
【０００９】
本発明にかかるマルチスレッドプロセッサ及びそのハードウェアスレッドのスケジュール方法によれば、実行されたハードウェアスレッドの優先順位を更新し、更新後の優先順位に従って次に選択するハードウェアスレッドを決定する。これにより、所定のハードウェアスレッドが固定的に選択されることを防止することができる。
【発明の効果】
【００１０】
本発明にかかるマルチスレッドプロセッサ及びそのハードウェアスレッドのスケジュール方法によれば、ハードウェアスレッドの最低実行時間を保証しながら、柔軟にハードウェアスレッドの実行時間を設定できる。
【発明を実施するための最良の形態】
【００１１】
実施の形態１
以下、図面を参照して本発明の実施の形態について説明する。図１に本実施の形態にかかるマルチスレッドプロセッサ１を含むプロセッサシステムのブロック図を示す。本実施の形態にかかるプロセッサシステムでは、システムバスを介してマルチスレッドプロセッサ１とメモリ２が接続される。なお、図示はしていないが、システムバスには、入出力インタフェースなどの他の回路も接続されるものとする。
【００１２】
まず、本実施の形態にかかるマルチスレッドプロセッサ１について説明する。マルチスレッドプロセッサ１は、複数のハードウェアスレッドを備える。ハードウェアスレッドは、スレッドプログラムカウンタ、命令メモリ、汎用レジスタ、及び制御レジスタ（本実施の形態ではパイプライン制御回路１６に内蔵されるものとする）等の回路群により構成される。そして、ハードウェアスレッドとは、マルチスレッドプロセッサ１に内蔵されるスレッドプログラムカウンタにより出力される命令フェッチアドレスに従って命令メモリから読み出される一連の命令群により構成される命令流を生成する系のことをいう。つまり、１つのハードウェアスレッドにより生成される命令流に含まれる命令は、互いに関連性の高い命令である。本実施の形態では、マルチスレッドプロセッサ１が複数のスレッドプログラムカウンタを備えることでその数に応じた数のハードウェアスレッドが実装される。以下では、マルチスレッドプロセッサ１についてさらに詳細に説明する。
【００１３】
図１に示すようにマルチスレッドプロセッサ１は、演算回路１０、割り込みコントローラ１１、ＰＣ生成回路１２、スレッドプログラムカウンタＴＰＣ０〜ＴＰＣ３、セレクタ１３、１８、命令メモリ１４、命令バッファ１５、パイプライン制御回路１６、命令フェッチコントローラ１７、スレッドスケジューラ１９を有する。
【００１４】
演算回路１０は、セレクタ１８によって選択されたハードウェアスレッドが生成する命令に基づき演算処理を実行する。より具体的には、演算回路１０は、命令デコーダ２１、実行ユニット２２、データレジスタ２３を有する。命令デコーダ２１は受信した命令をデコードして、実行ユニット２２に対して演算制御信号ＳＣを出力する。また、命令デコーダ２１は、命令のデコード結果に基づきデータの格納位置を示すデータレジスタアドレスＲａｄｄの出力を行う。実行ユニット２２は、演算制御信号ＳＣに応じて各種の演算を実行する。なお、実行ユニット２２は、複数の実行ステージを有し、パイプライン処理により演算を行う。また、実行ユニット２２において実行された演算結果は、その演算結果の種類に応じてＰＣ生成回路１２、メモリ２、データレジスタ２３に送信される。データレジスタ２３は、実行ユニット２２において用いられるデータが格納される。そして、データレジスタ２３は、データレジスタアドレスＲａｄｄにより指定したアドレスのデータを出力する。図１に示す例では、データレジスタ２３は、データレジスタアドレスＲａｄｄに応じてデータａとデータｂとを出力する形態となる。また、データレジスタ２３は、データレジスタアドレスＲａｄｄにより指定されるアドレスに実行ユニット２２が出力する演算結果を格納する。
【００１５】
割り込みコントローラ１１は、割り込み要求信号を受けて、マルチスレッドプロセッサ１内に割り込み処理の実行を指示する割り込み指示信号を出力する。より具体的には、割り込みコントローラ１１は、割り込み要求信号を受信すると、割り込み要因や割り込み処理の優先度等を判定し、当該割り込み要因に関連した処理を行うようにＰＣ生成回路１２及びパイプライン制御回路１６に割り込み処理の実行を指示する。この割り込み要求は、マルチスレッドプロセッサ１が出力するものの他に、マルチスレッドプロセッサ１以外の回路からも出力される。
【００１６】
ＰＣ生成回路１２は、システムバスを介して入力される新たなプログラム命令信号、割り込みコントローラ１１が出力する割り込み指示信号及び実行ユニット２２における処理に基づき出力される分岐指示信号を受けて、プログラムカウント更新値を生成する。そして、ＰＣ生成回路１２は、プログラムカウント更新値をスレッドプログラムカウンタＴＰＣ０〜ＴＰＣ３のいずれかに与える。なお、ＰＣ生成回路１２は、生成したプログラムカウント更新値をいずれのスレッドプログラムカウンタに与えるかを判断する機能も有する。
【００１７】
スレッドプログラムカウンタＴＰＣ０〜ＴＰＣ３は、処理すべき命令が格納される命令メモリ１４のアドレス（このアドレスを命令フェッチアドレスＩＭａｄｄと称す）を生成する。また、スレッドプログラムカウンタＴＰＣ０〜ＴＰＣ３は、ＰＣ生成回路１２からプログラムカウント更新値が与えられた場合は、命令フェッチアドレスＩＭａｄｄをプログラムカウント更新値に応じて更新する。一方、スレッドプログラムカウンタＴＰＣ０〜ＴＰＣ３は、プログラムカウント更新値の入力がない場合は、アドレスを昇順に計算し、連続する次の命令フェッチアドレスを算出する。なお、図１においては、スレッドプログラムカウンタの数を４つとしたが、プログラムスレッドカウンタの数は、マルチスレッドプロセッサの仕様に応じて任意に設定することができる。
【００１８】
セレクタ１３は、命令フェッチコントローラが出力するスレッド指定信号に応じてスレッドプログラムカウンタＴＰＣ０〜ＴＰＣ３のうちいずれか１つを選択し、選択したスレッドプログラムカウンタが出力する命令フェッチアドレスＩＭａｄｄを出力する。なお、図１のセレクタ１３において入力端子に０〜４の数字を付したが、この数字は、ハードウェアスレッドの番号を示すものである。
【００１９】
命令メモリ１４は、複数のハードウェアスレッドにより共通して用いられるメモリ領域である。命令メモリ１４は、マルチスレッドプロセッサ１において実行される演算で用いられる各種命令が格納される。そして、命令メモリ１４は、セレクタ１３を介して入力される命令フェッチアドレスＩＭａｄｄにより指定された命令を出力する。このとき、命令メモリ１４は、セレクタ１３がスレッドプログラムカウンタＴＰＣ０〜ＴＰＣ３のいずれが出力した命令フェッチアドレスＩＭａｄｄであるかを判別し、判別結果に応じて命令の出力先を振り分ける。本実施の形態では、命令バッファ１５は、スレッドプログラムカウンタＴＰＣ０〜ＴＰＣ３に対応した命令バッファ領域ＢＵＦ０〜ＢＵＦ３を有する。そこで、命令メモリ１４は、命令フェッチアドレスＩＭａｄｄの出力元に応じて命令バッファ領域ＢＵＦ０〜ＢＵＦ３のいずれかに読み出された命令を振り分ける。なお、命令メモリ１４は、メモリ２に含まれる所定のメモリ領域であっても良い。また、命令バッファ領域ＢＵＦ０〜ＢＵＦ３は、ＦＩＦＯ（First In First Out）形式のバッファ回路である。また、命令バッファ領域ＢＵＦ０〜ＢＵＦ３は、１つのバッファ内において領域分割されたものでも良く、分離された領域に形成されたものであっても良い。
【００２０】
パイプライン制御回路１６は、命令バッファ１５の先頭に格納された命令と実行ユニット２２において実行されている命令とをモニタする。そして、パイプライン制御回路１６は、割り込みコントローラ１１から割り込み指示信号が入力された場合には、割り込み処理に関係するハードウェアスレッドに属する命令を廃棄する指示を命令バッファ１５及び実行ユニット２２に対して行う。また、パイプライン制御回路１６は、命令バッファ１５の先頭に格納された命令と実行ユニット２２において実行されている命令との依存関係を確認する。そして、命令間の依存関係が高いと判断した場合は、その命令が属するハードウェアスレッドのハードウェアスレッド番号を通知するマスク信号ＭＳＫを出力する。
【００２１】
命令フェッチコントローラ１７は、命令バッファ１５に格納されている命令の個数に応じていずれのハードウェアスレッドに属する命令をフェッチすべきかを判断し、その判断結果に基づきスレッド指定信号を出力する。例えば、命令フェッチコントローラ１７は、命令バッファ領域ＢＵＦ０に格納される命令キューの数が他の命令バッファ領域に格納される命令キューの数よりも少なければ、０番のハードウェアスレッドに属する命令をフェッチすべきと判断し、０番のハードウェアスレッドを示すスレッド指定信号を出力する。これにより、セレクタ１３は、スレッドプログラムカウンタＴＰＣ０を選択する。なお、命令フェッチコントローラ１７は、ラウンドロビン方式による手順で選択するハードウェアスレッドを決定しても良い。
【００２２】
セレクタ１８は、第１のセレクタとして機能するセレクタである。セレクタ１８は、スレッドスケジューラ１９が出力するスレッド選択信号ＴＳＥＬに応じて命令バッファ領域ＢＵＦ０〜ＢＵＦ３のいずれか１つを選択し、選択した命令バッファ領域から読み出した命令を演算回路１０に出力する。つまり、セレクタ１８は、スレッド選択信号ＴＳＥＬに応じて複数のハードウェアスレッドから１つのハードウェアスレッドを選択し、選択したハードウェアスレッドが出力する命令を演算回路１０に出力する。なお、セレクタ１８においても、入力端子に０〜４の数字を付したが、この数字は、ハードウェアスレッドの番号を示すものである。
【００２３】
スレッドスケジューラ１９は、予め設定されたスケジュールに従って、複数のハードウェアスレッドのうち次の実行サイクルにおいて実行される１つのハードウェアスレッドを指定するスレッド選択信号ＴＳＥＬを出力する。つまり、スレッドスケジューラ１９は、複数のハードウェアスレッドのどのような順序で処理するかをスケジュールにより管理し、そのスケジュールに沿った順序でハードウェアスレッドにより生成される命令が実行されるようにスレッド選択信号ＴＳＥＬを出力する。なお、本実施の形態にかかるマルチスレッドプロセッサ１では、このスケジュールをマルチスレッドプロセッサ１の起動の直後に実行される管理プログラムにより設定する。また、スレッドスケジューラ１９は、パイプライン制御回路１６からマスク信号ＭＳＫを受信した場合、受信したマスク信号ＭＳＫにより示されるハードウェアスレッド番号に該当するハードウェアスレッド以外のハードウェアスレッドを選択する。さらに、スレッドスケジューラ１９は、命令デコーダ２１からディスパッチ信号ＤＰＴを受信する。ディスパッチ信号ＤＰＴは、命令デコーダ２１が処理（ディスパッチ）した命令が属するハードウェアスレッドの番号を通知するものである。
【００２４】
本実施の形態にかかるマルチスレッドプロセッサ１では、特にスレッドスケジューラ１９において行われるハードウェアスレッドのスケジューリング方法に特徴を有する。以下では、スレッドスケジューラ１９及びそのスケジューリングの方法について説明を行う。
【００２５】
図２にスレッドスケジューラ１９のブロック図を示す。図２に示すように、スレッドスケジューラ１９は、ディスパッチカウンタ３０ａ〜３０ｄ、優先順位判定部３１、スレッド番号選択部３２、初期化判定部３３を有する。なお、本実施の形態では、マルチスレッドプロセッサ１が４つのハードウェアスレッドを有すため、スレッドスケジューラ１９は、４つのハードウェアスレッドの順序決定を行うための構成とするが、ハードウェアスレッドの個数を変更する場合は、ディスパッチカウンタの個数をハードウェアスレッドの個数に合わせれば良い。また、他の回路ブロックについてもディスパッチカウンタの個数に合わせてその構成を変更すれば良い。
【００２６】
ディスパッチカウンタ３０ａ〜３０ｄは、複数のハードウェアスレッドのうちのいずれか１つに対応して設けられる。ディスパッチカウンタ３０ａ〜３０ｄは、それぞれ、対応するハードウェアスレッドに対する優先順位に相当するディスパッチカウント値ＤＣＮＴ（図２におけるディスパッチカウント値ＤＣＮＴ０〜ＤＣＮＴ３を含む）を保持する。そして、ディスパッチカウンタ３０ａ〜３０ｄは、それぞれ、ディスパッチ信号ＤＰＴを受け、自ディスパッチカウンタに対応するハードウェアスレッドに属する命令の実行回数（ディスパッチ回数）をカウントする。より具体的には、ディスパッチカウンタ３０ａ〜３０ｄは、ディスパッチ信号ＤＰＴにより通知されるハードウェアスレッド番号を通知が対応するハードウェアスレッドを示すものである場合、ディスパッチカウント値ＤＣＮＴをデクリメントする。このディスパッチカウント値ＤＣＮＴの初期値は、マルチスレッドプロセッサ１の起動時に実行される管理プログラムにより設定される。また、ディスパッチカウント値ＤＣＮＴの初期値は、管理プログラムによりメモリから読み出され、その読み出された値が設定されるものとする。
【００２７】
また、ディスパッチカウンタ３０ａ〜３０ｄには、マスク信号ＭＳＫ（マスク信号ＭＳＫ０〜ＭＳＫ３を含む）と初期化信号ＣＮＴｉｎｔが入力され、カウント現在値Ｖｎｏｗ（カウント現在値Ｖｎｏｗ０〜Ｖｎｏｗ３を含む）を出力する。ディスパッチカウンタ３０ａ〜３０ｄは、対応するハードウェアスレッドに対応するマスク信号ＭＳＫが入力されるとディスパッチカウント値ＤＣＮＴを最低優先順位（例えば０）とする。ディスパッチカウンタ３０ａ〜３０ｄは、初期化信号ＣＮＴｉｎｔが入力されるとディスパッチカウント値ＤＣＮＴを初期値にリセットする。なお、初期化信号ＣＮＴｉｎｔは、初期化判定部３３から出力される。ディスパッチカウンタ３０ａ〜３０ｄは、内部で保持するカウント値ＣＮＴに基づきディスパッチカウント値ＤＣＮＴを出力するが、このカウント値ＣＮＴそのものの値をカウント現在値Ｖｎｏｗとして出力する。このディスパッチカウンタ３０ａ〜３０ｄの詳細な構成については後述する。
【００２８】
優先順位判定部３１は、ディスパッチカウンタ３０ａ〜３０ｄが出力するディスパッチカウント値ＤＣＮＴを参照し、最も高い優先順位を示すディスパッチカウント値ＤＣＮＴを判定することで、最も高い優先順位のハードウェアスレッドを判定する。より具体的には、優先順位判定部３１は、比較器３４〜３６を有する。比較器３４〜３６は、それぞれ、２つの値が入力され、２つの値のうち大きな値を選択して出力する。このとき比較器３４〜３６は、選択した値を出力したディスパッチカウンタの情報も合わせて出力する。また、比較器３４〜３６は、入力される２つの値が同じ値である場合、予め決められたルールに従いいずれか一方の値を選択して出力する。
【００２９】
より具体的には、比較器３４は、ディスパッチカウンタ３０ａが出力するディスパッチカウント値ＤＣＮＴ０とディスパッチカウンタ３０ｂが出力するディスパッチカウント値ＤＣＮＴ１とが入力され、２つのディスパッチカウント値のうち大きな値のディスパッチカウント値を高優先ハードウェアスレッド値Ｍ１として出力する。比較器３５は、ディスパッチカウンタ３０ｃが出力するディスパッチカウント値ＤＣＮＴ２とディスパッチカウンタ３０ｄが出力するディスパッチカウント値ＤＣＮＴ３とが入力され、２つのディスパッチカウント値のうち大きな値のディスパッチカウント値を高優先ハードウェアスレッド値Ｍ２として出力する。比較器３６は、比較器３４が出力する高優先ハードウェアスレッド値Ｍ１と比較器３５が出力する高優先ハードウェアスレッド値Ｍ２とが入力され、２つの高優先ハードウェアスレッド値のうち大きな値の高優先ハードウェアスレッド値を高優先ハードウェアスレッド値ＭＡＸとして出力する。なお、高優先ハードウェアスレッド値Ｍ１、Ｍ２、ＭＡＸには、その値を出力したディスパッカウンタを示す値が付加される。
【００３０】
スレッド番号選択部３２は、優先順位判定部３１が出力する高優先ハードウェアスレッド値ＭＡＸを出力したディスパッチカウンタに対応付けられたハードウェアスレッドを選択し、選択したハードウェアスレッドを示すハードウェアスレッド番号をスレッド選択信号ＴＳＥＬとして出力する。
【００３１】
初期化判定部３３は、カウント現在値Ｖｎｏｗ０〜Ｖｎｏｗ３（ディスパッチカウント値ＤＣＮＴを出力するためにディスパッチカウンタ内で保持されるカウント値ＣＮＴ）を受けて、カウント現在値Ｖｎｏｗ０〜Ｖｎｏｗ３の組み合わせが予め設定された所定の条件を満たしたときに初期化信号ＣＮＴｉｎｔを出力する。本実施の形態における所定の条件は、カウント現在値Ｖｎｏｗ０〜Ｖｎｏｗ３がすべて０となる条件であるものとする。
【００３２】
次に、ディスパッチカウンタ３０ａ〜３０ｄの構成について詳細に説明する。なお、ディスパッチカウンタ３０ａ〜３０ｄは同一の構成であるため、ディスパッチカウンタ３０ａを例にディスパッチカウンタの構成について説明する。ディスパッチカウンタ３０ａのブロック図を図３に示す。図３に示すように、ディスパッチカウンタ３０ａは、カウンタ初期設定値格納部４０、カウント値格納部４１、デクリメンタ４２、第２のセレクタ（例えば、セレクタ４３）を有する。
【００３３】
カウンタ初期設定値格納部４０は、ディスパッチカウンタ３０ａが出力するディスパッチカウント値ＤＣＮＴのカウンタ初期設定値ＩＮＩＴ０を格納する。このカウンタ初期設定値ＩＮＩＴ０は、管理プログラムによりメモリ２から読み出される値である。カウント値格納部４１は、カウント値ＣＮＴ０を格納する。また、カウント値格納部４１は、初期化信号ＣＮＴｉｎｔに応じてカウンタ初期設定値ＩＮＩＴ０を読み出し、カウント値ＣＮＴ０の初期値とする。このカウント値ＣＮＴ０は、セレクタ４３に対して出力される他、カウント現在値Ｖｎｏｗ０として初期化判定部３３に出力され、さらに、デクリメンタ４２にも出力される。デクリメンタ４２は、ディスパッチ信号ＤＰＴ０が入力される度にカウント値ＣＮＴ０をデクリメントする。そして、デクリメンタ４２は、デクリメント後のカウント値を書き戻し値ＤＣＲ０として出力し、書き戻し値ＤＣＲ０によりカウント値ＣＮＴ０を更新する。セレクタ４３は、マスク信号ＭＳＫに応じて最低優先順位を示すマスク値（例えば０）とカウント値ＣＮＴ０のいずれか一方を選択し、選択した値をディスパッチ信号ＤＰＴ０として出力する。
【００３４】
ここで、マスク信号ＭＳＫについて説明する。マスク信号ＭＳＫは、パイプライン制御回路１６が命令バッファ１５の先頭に格納された命令と実行ユニット２２において実行されている命令との依存関係を確認し、この命令間の依存関係が高いと判断した場合に出力される。そして、パイプライン制御回路１６は、このマスク信号ＭＳＫにより、実行ユニット２２において実行される命令の処理が十分に完了される前に実行ユニット２２において実行されている命令と依存関係の高い命令が読み出されることを防止する。
【００３５】
このマスク信号ＭＳＫが出力される状態を説明するために、１つのハードウェアスレッドにおいて生成される命令群の一例を図４に示す。図４に示す命令群は、命令１〜命令３により構成され、このうち命令２と命令３の依存関係が高い例を示すものである。命令１は、レジスタａ１の値とレジスタｂ１の値とを加算し、加算した結果得られた値をレジスタｃ１に格納する加算命令である。命令２は、メモリ２の０ｘ０（ａ１）番地のアドレスのデータをレジスタｄ１にロードするロード命令である。命令３は、レジスタｅ１の値からレジスタｄ１の値を減算し、減算した結果をレジスタｂ１に格納する加算命令である。
【００３６】
そして、マスク信号ＭＳＫが出力されることなく、図４に示した命令群が続けて発行された場合に生じる問題を図５を用いて説明する。図５は、命令１〜３が続けて発行された場合における命令処理フローを示すタイミングチャートである。命令１〜３は、デコードステージＩＤ、実行ステージＥＸ、書き戻しステージＷＢにより処理される。さらに、命令２には、メモリ２へのアクセスを実行するメモリアクセス待ちステージＭＭを有する。図５に示す例では、まず、命令１は、時刻Ｐ１においてデコードされ、時刻Ｐ２において処理され、時刻Ｐ３において演算の結果値をレジスタｃ１に書き戻す。続いて、命令２は、命令１よりも一時刻遅れた時刻Ｐ２においてデコードされ、時刻Ｐ３において処理され、時刻Ｐ４〜Ｐ６の期間にメモリアクセス待ちを行い、時刻Ｐ７において演算の結果値をレジスタｄ１に書き戻す。
【００３７】
また、命令３は、命令２よりも一時刻遅れた時刻Ｐ３においてデコードされ、時刻Ｐ４において処理され、時刻Ｐ５において演算の結果値をレジスタｅ１に書き戻す。ここで、この命令３の処理において参照されるレジスタｄ１の値は時刻Ｐ７まで待たなければ確定しない。そのため、時刻Ｐ５において命令３が読み出したレジスタｄ１の値は本来意図したものとは異なる値となり、命令３の演算が正しく行われない結果を招く。
【００３８】
このように、実行ユニット２２で実行された命令の結果を後続の命令が利用する場合、パイプライン制御回路１６は、命令間の依存関係が高いと判断し、マスク信号ＭＳＫを出力する。そして、パイプライン制御回路１６は、先に実行ユニット２２で実行されている命令の処理が完了し、後続の命令を実行できる十分な準備ができるまで、マスク信号ＭＳＫにより後続の命令の発行を防止する。
【００３９】
そこで、図５に示したタイミングチャートの処理においてマスク信号ＭＳＫが出力される場合の処理のタイミングチャートを図６に示す。図６に示すように、マスク信号ＭＳＫが出力される（マスク信号ＭＳＫ＝１となる）ことによって、命令３の実行ステージＥＸは、時刻Ｐ４〜Ｐ６の間待機の状態となり、時刻Ｐ７で実行される。これにより、命令２の書き戻しステージＷＢが行われる時刻Ｐ７を待って、命令３の実行ステージＥＸが行われる。これにより、命令３は、実行ステージＥＸにおいて本来意図した値をレジスタｄ１から読み出すことができる。
【００４０】
このように、パイプライン制御回路１６は、マスク信号ＭＳＫを用いることで、実行ユニット２２において各演算が正しく行われるように、１つのハードウェアスレッド内の命令発行タイミングを制御する。なお、命令間の依存関係は、メモリ２へのロード／ストア命令以外の命令においても存在する場合がある。
【００４１】
続いて、スレッドスケジューラ１９を用いたマルチスレッドプロセッサ１の動作について説明する。図７に、マルチスレッドプロセッサ１の電源投入時から通常処理の開始までの動作の手順を示すフローチャートを示す。図７に示すように、マルチスレッドプロセッサ１は、電源が投入されるとまずハードウェアリセットにより回路の状態を初期化する（ステップＳ１）。続いて、マルチスレッドプロセッサ１は、シングルスレッドモードにおいて動作を開始する（ステップＳ２）。このシングルスレッドモードでは、例えば、スレッドプログラムカウンタＴＰＣ０、命令メモリ１４、命令バッファ領域ＢＵＦ０が活性化され、他のスレッドプログラムカウンタＴＰＣ１〜ＴＰＣ３及び命令バッファ領域ＢＵＦ１〜ＢＵＦ３はスタンバイ状態のまま待機する。
【００４２】
そして、マルチスレッドプロセッサ１は、管理プログラムをメモリ２又は図示しない他の記憶装置から読み出し、管理プログラムを実行する（ステップＳ３）。その後、管理プログラムに従って、マルチスレッドプロセッサ１は、カウンタ初期設定値格納部４０にカウンタ初期設定値ＩＮＩＴを設定（ステップＳ４）する。そして、ディスパッチカウンタ３０ａ〜３０ｄは、カウント値格納部４１に格納されるカウント値ＣＮＴをカウンタ初期設定値ＩＮＩＴにより初期化（ステップＳ５）する。これらの各種レジスタの設定が完了すると、マルチスレッドプロセッサ１はマルチスレッドモードにて動作を開始する（ステップＳ６）。このシングルスレッドモードでは、例えば、スレッドプログラムカウンタＴＰＣ０〜ＴＣＰ３、命令メモリ１４、命令バッファ領域ＢＵＦ０〜ＢＵＦ３が活性化される。そして、マルチスレッドプロセッサ１は、マルチスレッドモードにて通常動作を開始する。
【００４３】
続いて、マルチスレッドプロセッサ１の通常動作時のスレッドスケジューラ１９の動作について説明する。図８にスレッドスケジューラ１９の通常動作時の動作を示すフローチャートを示す。なお、図８に示すフローチャートはディスパッチカウンタ３０ａの動作を中心に説明するものであるが、ディスパッチカウンタ３０ｂ〜３０ｄも同様の動作となる。
【００４４】
図８に示すように、スレッドスケジューラ１９は、まず、初期化判定部３３において、カウント現在値Ｖｎｏｗ０〜Ｖｎｏｗ３が初期化条件を満たすか否かを判断する（ステップＳ１０）。そして、ステップＳ１０においてカウント現在値Ｖｎｏｗ０〜Ｖｎｏｗ３が初期か条件を満たすと判断された場合（ステップＳ１０のＹｅｓの枝）、カウンタ初期設定値ＩＮＩＴ０をカウント値ＣＮＴ０とし、カウント値ＣＮＴ０を初期化する（ステップＳ１１）。一方、ステップＳ１０においてカウント現在値Ｖｎｏｗ０〜Ｖｎｏｗ３が初期か条件を満たさないと判断された場合（ステップＳ１０のＮｏの枝）、ステップＳ１１の処理は行わずに次の処理に進む。
【００４５】
次のステップでは、対応するマスク信号ＭＳＫ０の値が０か否かを判断する（ステップＳ１２）。このとき、マスク信号ＭＳＫ０が０であった場合（ステップＳ１２のＹｅｓの枝）、ディスパッチカウンタ３０ａは、ディスパッチカウント値ＤＣＮＴとしてカウント値ＣＮＴ０の値を出力する（ステップＳ１３）。一方、ステップＳ１２においてマスク信号ＭＳＫ０が１であった場合（ステップＳ１２のＮｏの枝）、ディスパッチカウンタ３０ａは、ディスパッチカウント値ＤＣＮＴとしてマスク値の値を出力する（ステップＳ１４）。
【００４６】
次いで、スレッドスケジューラ１９は、優先順位判定部３１において、最も高い優先順位のディスパッチカウント値ＤＣＮＴを出力しているディスパッチカウンタを判定し、高優先ハードウェアスレッド値ＭＡＸを出力する（ステップＳ１５）。次いで、スレッドスケジューラ１９は、スレッド番号選択部３２において、高優先ハードウェアスレッド値ＭＡＸを出力するディスパッチカウンタに対応するハードウェアスレッドを選択し、選択したハードウェアスレッドを指定するスレッド選択信号ＴＳＥＬを出力する（ステップＳ１６）。
【００４７】
次いで、マルチスレッドプロセッサ１は、スレッド選択信号ＴＳＥＬにより指定されたハードウェアスレッドに属する命令を実行し、実行された命令が属するハードウェアスレッドをディスパッチ信号ＤＰＴによりスレッドスケジューラ１９に通知する。そして、ディスパッチカウンタ３０ａがディスパッチ信号ＤＰＴ０を受け取った場合（ステップＳ１７のＹｅｓの枝）には、ディスパッチカウンタ３０ａはカウント値ＣＮＴ０をデクリメントする（ステップＳ１８）。その後、スレッドスケジューラ１９は、処理をステップＳ１０に戻す。一方、ディスパッチカウンタ３０ａがディスパッチ信号ＤＰＴ０を受け取らなかった場合（ステップＳ１７のＮｏの枝）には、ディスパッチカウンタ３０ａはカウント値ＣＮＴ０を更新しない。その後、スレッドスケジューラ１９は、処理をステップＳ１０に戻す。
【００４８】
続いて、スレッドスケジューラ１９が選択するスレッド番号がどのように切り替わるかを説明する表を図９に示す。図９に示す例では、スレッドの切り替わりタイミングを一時刻としている。また、ディスパッチカウンタ３０ａ〜３０ｄのカウンタ初期設定値をそれぞれ３、４、２、１とした。また、図９に示す例では、マスク信号ＭＳＫが常に０を示すものとする。図９に示す例では、時刻ｔ１を初期状態とし、この時刻ｔ１を処理の開始時刻とする。
【００４９】
時刻ｔ１では、ディスパッチカウント値ＤＣＮＴ０〜ＤＣＮＴ３はカウント値ＣＮＴ０〜ＣＮＴ３の値と同じ値となる。このとき、最大のディスパッチカウント値は、ディスパッチカウント値ＤＣＮＴ１が示す４である。そのため、スレッド番号選択部３２は、ディスパッチカウント値ＤＣＮＴ１を出力するディスパッチカウンタ３０ｂに対応する１番のハードウェアスレッドを示すスレッド選択信号ＴＳＥＬを出力する。そして、マルチスレッドプロセッサ１は、１番のハードウェアスレッドに属する命令を実行し、１番のハードウェアスレッドがディスパッチされたことを通知するディスパッチ信号ＤＰＴ１を出力する。そのため、時刻ｔ２では１番のハードウェアスレッドに対応するカウント値ＣＮＴ１及びディスパッチカウント値ＤＣＮＴ１の値が１つデクリメントされる。
【００５０】
時刻ｔ２では、ディスパッチカウント値ＤＣＮＴ０〜ＤＣＮＴ３はカウント値ＣＮＴ０〜ＣＮＴ３の値と同じ値となる。このとき、最大のディスパッチカウント値は、ディスパッチカウント値ＤＣＮＴ０及びディスパッチカウント値ＤＣＮＴ１が示す３である。このような場合、優先順位判定部３１の比較器３４は、より番号の小さなハードウェアスレッドに対応したディスパッチカウンタが出力するディスパッチカウント値を出力する。そのため、スレッド番号選択部３２は、ディスパッチカウント値ＤＣＮＴ０を出力するディスパッチカウンタ３０ａに対応する０番のハードウェアスレッドを示すスレッド選択信号ＴＳＥＬを出力する。そして、マルチスレッドプロセッサ１は、０番のハードウェアスレッドに属する命令を実行し、０番のハードウェアスレッドがディスパッチされたことを通知するディスパッチ信号ＤＰＴ０を出力する。そのため、時刻ｔ３では０番のハードウェアスレッドに対応するカウント値ＣＮＴ０及びディスパッチカウント値ＤＣＮＴ０の値が１つデクリメントされる。
【００５１】
以降、時刻ｔ３〜ｔ１０においては、カウント値ＣＮＴ及びディスパッチカウント値ＤＣＮＴに応じて上記のような動作を繰り返す。そして、時刻ｔ１０の処理が行われることで、カウント値ＣＮＴ０〜ＣＮＴ３の値がすべて０になる。そのため、時刻ｔ１０の経過後に初期化判定部３３による初期化処理が行われ、時刻ｔ１１のスレッドスケジューラ１９の状態は時刻ｔ１の状態にリセットされる。
【００５２】
続いて、スレッドスケジューラ１９が選択するスレッド番号がどのように切り替わるかを説明する別の例を示す表を図１０に示す。図１０に示す例は、図９に示す例においてマスク信号ＭＳＫが１になる期間がある場合である。図１０に示す例では時刻ｔ１で選択された１番のハードウェアスレッドが実行されることで時刻ｔ２〜ｔ４において１番のハードウェアスレッドに対応するマスク信号ＭＳＫ１が１となる。そのため、時刻ｔ２〜ｔ４の期間は１番のハードウェアスレッドの優先順位を示すディスパッチカウント値ＤＣＮＴ１が０（最低優先順位）となる。そのため、時刻ｔ２〜ｔ４の期間におけるスレッドスケジューラ１９は、１番のハードウェアスレッド以外のハードウェアスレッドをそのときのディスパッチカウント値ＤＣＮＴに応じて選択する。
【００５３】
また、図１０に示す例では、時刻ｔ１２で選択された０番のハードウェアスレッドが実行されることで時刻ｔ１３〜ｔ１４において０番のハードウェアスレッドに対応するマスク信号ＭＳＫ０が１となる。そのため、時刻ｔ１２〜ｔ１３の期間は０番のハードウェアスレッドの優先順位を示すディスパッチカウント値ＤＣＮＴ０が０（最低優先順位）となる。そのため、時刻ｔ１３〜ｔ１４の期間におけるスレッドスケジューラ１９は、０番のハードウェアスレッド以外のハードウェアスレッドをそのときのディスパッチカウント値ＤＣＮＴに応じて選択する。
【００５４】
また、図１０に示す例では、時刻ｔ１３で選択された１番のハードウェアスレッドが実行されることで時刻ｔ１４〜ｔ１５において１番のハードウェアスレッドに対応するマスク信号ＭＳＫ１が１となる。そのため、時刻ｔ１３〜ｔ１３の期間は１番のハードウェアスレッドの優先順位を示すディスパッチカウント値ＤＣＮＴ１が０（最低優先順位）となる。そのため、時刻ｔ１４〜ｔ１５の期間におけるスレッドスケジューラ１９は、１番のハードウェアスレッド以外のハードウェアスレッドをそのときのディスパッチカウント値ＤＣＮＴに応じて選択する。つまり、時刻ｔ１４の期間は０番のハードウェアスレッド及び１番のハードウェアスレッドが選択肢から除外される。
【００５５】
上記説明より、本実施の形態にかかるマルチスレッドプロセッサ１において用いられるスレッドスケジューラ１９は、各ハードウェアスレッドに対応した優先順位をディスパッチカウント値ＤＣＮＴとして有する。そして、スレッドスケジューラ１９は、ハードウェアスレッドの優先順位に応じていずれか１つのハードウェアスレッドを選択し、選択したハードウェアスレッドを示すスレッド選択信号ＴＳＥＬを出力する。さらに、スレッドスケジューラ１９は、選択したハードウェアスレッドが実行されたことをディスパッチ信号ＤＰＴにより認識し、ディスパッチ信号ＤＰＴに応じてハードウェアスレッドの優先順位を更新する。より具体的には、スレッドスケジューラ１９は、最も高い優先順位のハードウェアスレッドを選択し、選択したハードウェアスレッドを示すスレッド選択信号ＴＳＥＬを出力する。そして、スレッドスケジューラ１９は、選択したハードウェアスレッドが実行されたことをディスパッチ信号ＤＰＴにより認識し、ディスパッチ信号ＤＰＴに応じてハードウェアスレッドの優先順位を下げる。
【００５６】
これにより、本実施の形態にかかるスレッドスケジューラ１９は、初期状態において高い優先順位のハードウェアスレッドを優先的に選択しながら、その後も高い優先順位を維持させることがない。そのため、スレッドスケジューラ１９は、初期状態において優先順位の高いハードウェアスレッドを実行しながら他のハードウェアスレッドの実行期間も確保することができる。つまり、本実施の形態にかかるスレッドスケジューラ１９を用いたマルチスレッドプロセッサ１は、複数の優先順位を有するハードウェアスレッドを交互に実行しながら、優先順位の高いハードウェアスレッドに対してはより多くの処理時間を割り当てることができる。言い換えると、本実施の形態にかかるマルチスレッドプロセッサ１は、ハードウェアスレッドの優先順位の初期状態に関わりなく複数のハードウェアスレッドを滞りなく実行することができる。
【００５７】
図９において示した例について説明すると、初期状態において高い優先度を有する１番のハードウェアスレッドは、時刻ｔ１〜ｔ１０の期間のうち４０％の処理時間を有し、他のハードウェアスレッドよりも多くの処理時間を確保する。このとき、本実施の形態にかかるマルチスレッドプロセッサ１では、１番のハードウェアスレッドの実行時間が続くことなく、１番のハードウェアスレッドと他のハードウェアスレッドが交互に実行される。つまり、本実施の形態にかかるマルチスレッドプロセッサ１では、処理時間がいずれか１つのハードウェアスレッドの時間に偏ることなく、複数のハードウェアスレッドが滞りなく実行される。
【００５８】
また、本実施の形態にかかるマルチスレッドプロセッサ１では、実行ユニット２２の実行ステージの利用効率（又は、パイプラインの利用効率）を高めることができる。より具体的には、本実施の形態にかかるスレッドスケジューラ１９は、パイプラインの状態に起因して本来予定していたハードウェアスレッドを選択できない場合、パイプラインの状態をマスク信号ＭＳＫにより認識する。そして、スレッドスケジューラ１９は、マスク信号ＭＳＫにより通知されたハードウェアスレッドとは異なるハードウェアスレッドを選択する。これにより、パイプラインに空きステージが生じる可能性がある箇所に他のハードウェアスレッドに属する命令を与えることができるため、本実施の形態にかかるマルチスレッドプロセッサ１ではパイプラインの利用効率を高めることができる。
【００５９】
実施の形態２
実施の形態２にかかるマルチスレッドプロセッサ１ａのブロック図を図１１に示す。図１１に示すようにマルチスレッドプロセッサ１ａは、実施の形態１におけるスレッドスケジューラ１９をスレッドスケジューラ１９の変形例となるスレッドスケジューラ１９ａに置き換えたものである。そのため、以下の説明では、スレッドスケジューラ１９ａを中心に説明し、他の構成要素の説明は省略する。
【００６０】
図１２にスレッドスケジューラ１９ａのブロック図を示す。図１２に示すように、スレッドスケジューラ１９ａは、第３のセレクタ（例えば、セレクタ５０）、第１のスレッドスケジューラ１９、第２のスレッドスケジューラ５１を有する。セレクタ５０は、実時間ビット信号の信号レベルに応じて第１のスレッドスケジューラ１９が出力する第１のスレッド選択信号ＴＳＥＬａと第２のスレッドスケジューラ５１が出力する第１のスレッド選択信号ＴＳＥＬｂとのいずれか一方を選択して、選択したスレッド選択信号を第１のセレクタ１８に与えるスレッド選択信号ＴＳＥＬとして出力する。なお、第１のスレッド選択信号ＴＳＥＬａは、実施の形態１において説明したスレッド選択信号ＴＳＥＬと同じものである。ここでは、スレッド選択信号を区別するために、便宜的に第１のスレッドスケジューラ１９が出力するスレッド選択信号を第１のスレッド選択信号ＴＳＥＬａと称す。第１のスレッドスケジューラは、実施の形態１におけるスレッドスケジューラ１９と同じものであるため、ここでは説明を省略する。
【００６１】
第２のスレッドスケジューラ５１は、第１の実行期間と第２の実行期間とを切り替える選択信号（例えば、実時間ビット信号）を出力すると共に、実時間ビット信号が第１の実行期間を指定している期間において予め設定された実行順序で実行されるハードウェアスレッドを指定する第１のハードウェアスレッド番号（例えば第２のスレッド選択信号ＴＳＥＬｂ）を出力する。ここで、第１の実行期間とは、後述する実時間ビット信号が１である期間であり、第２の実行期間とは、後述する実時間ビット信号が０である期間をいう。また、第１の実行期間においては、選択されるハードウェアスレッド番号が予め設定されており、第２の実行期間においては、選択されるハードウェアスレッド番号が例えば、第１のスレッドスケジューラ１９により任意に設定される。この第２のスレッドスケジューラ５１は、スレッド制御レジスタ５２、カウンタ５３、カウント最大値格納部５４、一致比較回路５５、セレクタ５６を有する。
【００６２】
スレッド制御レジスタ５２は、複数のスロット（例えば、スロットＳＬＴ０〜ＳＬＴ７）を備える。このスロットの構成を図１３に示す。図１３に示すように、スロットＳＬＴ０〜ＳＬＴ７は、それぞれハードウェアスレッド番号ＨＷＴが格納される番号格納部と、当該スロットが選択された場合における実時間ビット信号の論理レベルを決定する期間属性設定フラグ（例えば実時間ビットＲＴ）が格納される実時間ビット格納部とを有する。
【００６３】
カウンタ５３は、所定の間隔でカウント値ＣＮＴを更新する。より具体的には、本実施の形態におけるカウンタ５３は、図示しないマルチスレッドプロセッサ１の動作クロックに同期してカウント値ＣＮＴａをカウントアップする。カウント最大値格納部５４は、カウンタ５３のカウント値ＣＮＴａの上限値を定めるカウント最大値ＣＮＴＭを格納する。一致比較回路５５は、カウント値ＣＮＴａとカウント最大値ＣＮＴＭとを比較し、カウント値ＣＮＴとカウント最大値ＣＮＴＭが一致した場合に、カウンタ５３のカウント値ＣＮＴａをリセットするリセット信号ＲＳＴを出力する。つまり、カウンタ５３は、所定の周期でカウント値ＣＮＴａを初期化しながら、カウントアップ動作を繰り返すことで、循環的に値が更新されるカウント値ＣＮＴａを出力する。
【００６４】
セレクタ５６は、カウント値ＣＮＴａに応じてスレッド制御レジスタ５２内のスロットの１つを選択し、選択したスロットに格納される値に基づき実時間ビット信号と第２のスレッド選択信号ＴＳＥＬｂを出力する。より具体的には、セレクタ５６は、カウント値ＣＮＴａが０であればスロットＳＬＴ０を選択し、スロットＳＬＴ０の番号格納部に格納されたハードウェアスレッド番号を第２のスレッド選択信号ＴＳＥＬｂとし、スロットＳＬＴ０の実時間ビット格納部に格納される実時間ビットＲＴの値を実時間ビット信号の論理レベルとする。
【００６５】
なお、第２のスレッドスケジューラ５１のスレッド制御レジスタ５２のスロットに格納される値、カウンタ５３のカウント値ＣＮＴａの初期値、カウント最大値格納部５４のカウント最大値ＣＮＴＭは、マルチスレッドプロセッサ１の起動時に実行される管理プログラムにより設定される。また、管理プログラムは、メモリ２からこれら設定値を読み込むものとする。
【００６６】
次に、通常動作開始後のスレッドスケジューラ１９ａの動作について説明する。まず、第２のスレッドスケジューラ５１のみの動作について説明する。なお、以下の説明では、設定の一例として、カウンタ５３のカウント値ＣＮＴの初期値を０、カウント最大値ＣＮＴＭを４とする。また、スレッド制御レジスタ５２のスロットの各値は、スロットＳＬＴ０〜ＳＬＴ２、ＳＬＴ４、ＳＬＴ５、ＳＬＴ７の実時間ビットを１とし、スロットＳＬＴ３、ＳＬＴ６の実時間ビットを０とする。さらに、スロットＳＬＴ０、ＳＬＴ２、ＳＬＴ５、ＳＬＴ７のハードウェアスレッド番号を０、スロットＳＬＴ１、ＳＬＴ４のハードウェアスレッド番号を１、スロットＳＬＴ３のハードウェアスレッド番号を２とする。
【００６７】
上記条件において第２のスレッドスケジューラ５１が出力する第２のスレッド選択信号ＴＳＥＬｂが選択するハードウェアスレッド番号を図１４の表に示す。図１４の表では、第２のスレッドスケジューラ５１が選択するハードウェアスレッドを切り替える一タイミングを一時刻とし、時刻の経過と共に第２のスレッド選択信号ＴＳＥＬｂがどのように切り替わるかを示した。
【００６８】
図１５に示すように、まず時刻ｔ１におけるカウント値ＣＮＴが０とすると、セレクタ５６は、スロットＳＬＴ０を選択する。従って、セレクタ５６は、実時間ビット信号の論理レベルを１とし、第２のスレッド選択信号ＴＳＥＬｂを０番とする。続いて、時刻ｔ２ではカウント値ＣＮＴが１にカウントアップされる。そのため、セレクタ５６は、スロットＳＬＴ１を選択する。従って、セレクタ５６は、実時間ビット信号の論理レベルを１とし、第２のスレッド選択信号ＴＳＥＬｂを１番とする。次いで、時刻ｔ３ではカウント値ＣＮＴが２にカウントアップされる。そのため、セレクタ５６は、スロットＳＬＴ２を選択する。従って、セレクタ５６は、実時間ビット信号の論理レベルを０とし、第２のスレッド選択信号ＴＳＥＬｂを１番とする。次いで、時刻ｔ４ではカウント値ＣＮＴが３にカウントアップされる。そのため、セレクタ５６は、スロットＳＬＴ３を選択する。従って、セレクタ５６は、実時間ビット信号の論理レベルを１とし、第２のスレッド選択信号ＴＳＥＬｂを２番とする。次いで、時刻ｔ５ではカウント値ＣＮＴが４にカウントアップされる。そのため、セレクタ５６は、スロットＳＬＴ４を選択する。従って、セレクタ５６は、実時間ビット信号の論理レベルを１とし、第２のスレッド選択信号ＴＳＥＬｂを１番とする。そして、時刻ｔ５では、カウント値ＣＮＴａがカウント最大値ＣＮＴＭに達するため、時刻ｔ６の経過後にカウント値ＣＮＴａはリセットされる。これにより、時刻ｔ６〜ｔ１０の期間の第２のスレッドスケジューラ５１は、時刻ｔ１〜ｔ５の動作を繰り返すことになる。
【００６９】
実施の形態２では、第１のスレッドスケジューラ１９は、第２のスレッドスケジューラ５１により指定される第２の実行期間において実行するハードウェアスレッドの選択を行う。そこで、実施の形態２にかかるスレッドスケジューラ１９ａの動作を示す表を図１５に示す。なお、図１５に示した例は、第２のスレッドスケジューラ５１の設定値として図１４において示した条件を用いる。また、第１のスレッドスケジューラ１９のカウンタ初期設定値は、０番のハードウェアスレッドから３番のハードウェアスレッドの順に２、１、３、４とする。つまり、この例における第１のスレッドスケジューラでは、第２のスレッドスケジューラ５１において実行が予定されていないハードウェアスレッドの優先順位を他のハードウェアスレッドよりも高くする。
【００７０】
図１５に示すように、第２のスレッドスケジューラ５１は、時刻ｔ３、ｔ９、ｔ１３、ｔ１８において実時間ビット信号（図中のＲＴ）を０とする。そのため、スレッドスケジューラ１９ａは、時刻ｔ３、ｔ９、ｔ１３、ｔ１８において第１のスレッドスケジューラ１９が出力する第１のスレッド選択信号ＴＳＥＬａを用いる。このとき、時刻ｔ３、ｔ９、ｔ１３、ｔ１８のいずれのタイミングにおいても３番目のハードウェアスレッドに対応するディスパッチカウント値が最も大きくなるため、第１のスレッド選択信号ＴＳＥＬａは、時刻ｔ３、ｔ９、ｔ１３、ｔ１８のいずれ他のタイミングにおいても３番のハードウェアスレッドを指定する。
【００７１】
なお、第１のスレッドスケジューラ１９には、第２のスレッドスケジューラ５１が出力する第２のスレッド選択信号ＴＳＥＬｂに基づき実行されたハードウェアスレッドがディスパッチ信号ＤＰＴにより通知される。そのため、時刻ｔ１〜ｔ１８の期間においてカウント値ＣＮＴ０〜ＣＮＴ３が減少する。このときカウント値ＣＮＴ０〜ＣＮＴ３は０を下限としてそれ以上減少しないものとする。
【００７２】
上記説明より、実施の形態２にかかるスレッドスケジューラ１９ａでは、第１のスレッドスケジューラ１９を、第２のスレッドスケジューラ５１において第２の実行期間が指定された場合のスレッド選択信号を生成するために用いる。このとき、第１のスレッドスケジューラでは、第２のスレッドスケジューラ５１の動作に基づき実行されたハードウェアスレッドの回数を反映してハードウェアスレッドの優先順位が変動する。そのため、第２のスレッドスケジューラ５１に第１のスレッドスケジューラ１９を組み合わせることで、第２のスレッドスケジューラ５１において実行回数の少ないハードウェアスレッドを第１のスレッドスケジューラ１９により指定することができる。
【００７３】
また、第２のスレッドスケジューラ１９では、第１の実行期間において実行されるハードウェアスレッドが固定されているため、ハードウェアスレッドの優先順位にかかわらずハードウェアスレッドの最低実行時間を保証することができる。つまり、実施の形態２にかかるマルチスレッドプロセッサ１ａによれば、第２のスレッドスケジューラ５１により第１の実行期間を指定することでハードウェアスレッドの最低実行時間を保証する。そして、第２の実行期間において第１のスレッドスケジューラ１９によるハードウェアスレッドの選択を行うことで、第２の実行期間に実行頻度の低いハードウェアスレッドを優先的に選択することができる。つまり、実施の形態２にかかるマルチスレッドプロセッサ１ａによれば、ハードウェアスレッドの最低実行時間を保証しながら、処理が滞るハードウェアスレッドの発生を防止することができる。
【００７４】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。例えば、第２のスケジューラにおけるスレッドのスケジューリング方法は、マルチスレッドプロセッサの仕様に応じて適宜変更することが可能である。
【図面の簡単な説明】
【００７５】
【図１】実施の形態１にかかるマルチスレッドプロセッサのブロック図である。
【図２】実施の形態１にかかるスレッドスケジューラのブロック図である。
【図３】実施の形態１にかかるディスパッチカウンタのブロック図である。
【図４】実施の形態１にかかるマルチスレッドプロセッサにおいて実行される命令群の一例を示す図である。
【図５】実施の形態１にかかるマルチスレッドプロセッサにおいてマスク信号を用いない場合の命令の処理フローを示す図である。
【図６】実施の形態１にかかるマルチスレッドプロセッサにおいてマスク信号を用いた場合の命令の処理フローを示す図である。
【図７】実施の形態１にかかるマルチスレッドプロセッサの起動時の動作手順を示すフローチャートである。
【図８】実施の形態１にかかるスレッドスケジューラの動作手順を示すフローチャートである。
【図９】実施の形態１にかかるスレッドスケジューラの動作を示す表である。
【図１０】実施の形態１にかかるスレッドスケジューラの動作を示す表である。
【図１１】実施の形態２にかかるマルチスレッドプロセッサのブロック図である。
【図１２】実施の形態２にかかるスレッドスケジューラのブロック図である。
【図１３】実施の形態２にかかる第２のスレッドスケジューラ内のスロットの構成を示す模式図である。
【図１４】実施の形態２にかかる第２のスレッドスケジューラの動作を示す表である。
【図１５】実施の形態２にかかるスレッドスケジューラの動作を示す表である。
【符号の説明】
【００７６】
１、１ａ    マルチスレッドプロセッサ
２    メモリ
１０    演算回路
１１    コントローラ
１２    ＰＣ生成回路
１３、１８、４３、５０、５６    セレクタ
１４    命令メモリ
１５    命令バッファ
１６    パイプライン制御回路
１７    命令フェッチコントローラ
１９、１９ａ、５１    スレッドスケジューラ
２１    命令デコーダ
２２    実行ユニット
２３    データレジスタ
３０ａ〜３０ｄ    ディスパッチカウンタ
３１    優先順位判定部
３２    スレッド番号選択部
３３    初期化判定部
３４〜３６    比較器
４０    カウンタ初期設定値格納部
４１    カウント値格納部
４２    デクリメンタ
５２    スレッド制御レジスタ
５３    カウンタ
５４    カウント最大値格納部
５５    一致比較回路
ＴＰＣ０〜ＴＣＰ３    スレッドプログラムカウンタ
ＢＵＦ０〜ＢＵＦ３    命令バッファ領域
ＩＭａｄｄ    命令フェッチアドレス
Ｒａｄｄ    データレジスタアドレス
ＳＣ    演算制御信号
ＴＳＥＬ、ＴＳＥＬａ、ＴＳＥＬｂ    スレッド選択信号
ＤＰＴ、ＤＰＴ０〜ＤＰＴ３    ディスパッチ信号
ＭＳＫ、ＭＳＫ０〜ＭＳＫ３    マスク信号
Ｍ１、Ｍ２、ＭＡＸ    高優先ハードウェアスレッド値
ＣＮＴｉｎｔ    初期化信号
Ｖｎｏｗ０〜Ｖｎｏｗ３    カウント現在値
ＣＮＴ、ＣＮＴ０〜ＣＮＴ３、ＣＮＴａ    カウント値
ＤＣＮＴ、ＤＣＮＴ０〜ＤＣＮＴ３    ディスパッチカウント値
ＩＮＩＴ０    カウンタ初期設定値
ＤＣＲ０    書き戻し値
ＣＮＴＭ    カウント最大値
ＲＳＴ    リセット信号
ＨＷＴ    ハードウェアスレッド番号
ＲＴ    実時間ビット
ＳＬＴ０〜ＳＬＴ７    スロット
【図１】
2010086130.tif 000003
【図２】
2010086130.tif 000004
【図３】
2010086130.tif 000005
【図４】
2010086130.tif 000006
【図５】
2010086130.tif 000007
【図６】
2010086130.tif 000008
【図７】
2010086130.tif 000009
【図８】
2010086130.tif 000010
【図９】
2010086130.tif 000011
【図１０】
2010086130.tif 000012
【図１１】
2010086130.tif 000013
【図１２】
2010086130.tif 000014
【図１３】
2010086130.tif 000015
【図１４】
2010086130.tif 000016
【図１５】
2010086130.tif 000017