(57)【要約】【課題】マルチスレッドプロセッサにおける複数のハードウェアスレッドを設計通りの割合で実行すると共に、マルチスレッドプロセッサの性能低下を防ぐ。【解決手段】スケジューラ２００は、複数のハードウェアスレッドのうちの第１のグループに含まれる各ハードウェアスレッドを、該ハードウェアスレッドに対して予め設定された回数分指定し、他のハードウェアスレッドが含まれる第２のグループに対して予め設定された回数分、該第２のグループ内のいずれか１つのハードウェアスレッドを指定する処理を繰り返すスレッドスケジューリングをする。また、スレッドスケジューリングにより指定された第１のグループ内のハードウェアスレッドが実行不可であるときに、スケジューラ２００は、該ハードウェアスレッドの代わりに、第２のグループ内のハードウェアスレッドを指定し直す再スケジューリングを行う。【選択図】図１
2014081847.tif 000002
【特許請求の範囲】
【請求項１】
互いに独立した複数の命令流を夫々生成する複数のハードウェアスレッドと、
前記複数のハードウェアスレッドのうちの次に実行するハードウェアスレッドを指定するスケジューラと、を有し、
前記スケジューラは、
前記複数のハードウェアスレッドのうちの第１のグループに含まれる各ハードウェアスレッドを、該ハードウェアスレッドに対して予め設定された回数分指定し、他のハードウェアスレッドが含まれる第２のグループに対して予め設定された回数分、該第２のグループ内のいずれか１つのハードウェアスレッドを指定する処理を繰り返すスレッドスケジューリングをし、
前記スレッドスケジューリングにより指定された前記第１のグループ内のハードウェアスレッドが実行不可であるときに、該ハードウェアスレッドの代わりに、前記第２のグループ内のハードウェアスレッドを指定し直す再スケジューリングを行う、マルチスレッドプロセッサ。
【請求項２】
前記第１のグループ内のハードウェアスレッド毎に設けられ、該ハードウェアスレッドが前記スレッドスケジューリングにより指定されたときに実行不可であることが生じる度にカウントアップするスレッド浪費カウンタをさらに備え、
前記スケジューラは、
前記スレッドスケジューリングにより前記第２のグループ内のハードウェアスレッドが指定されたときに、いずれかの前記スレッド浪費カウンタのカウント値が１以上であり、かつ、該スレッド浪費カウンタに対応する前記第１のグループ内のハードウェアスレッドが実行可能である場合に、該ハードウェアスレッドを、前記スレッドスケジューリングにより指定されたハードウェアスレッドの代わりに指定し直すスレッド復旧スケジューリングをさらに行い、
前記スレッド浪費カウンタは、対応する前記第１のグループ内のハードウェアスレッドが前記スレッド復旧スケジューリングにより指定される度にカウントダウンする、請求項１に記載のマルチスレッドプロセッサ。
【請求項３】
前記スケジューラは、
前記スレッドスケジューリングにより指定した前記第１のグループ内のハードウェアスレッドが実行不可であるときに、前記第１のグループ内の他のいずれか１つのハードウェアスレッドに対応する前記スレッド浪費カウンタのカウント値が１以上であり、かつ、該ハードウェアスレッドが実行可能である場合に、前記再スケジューリングを行わず、前記復旧スケジューリングを行う、請求項２に記載のマルチスレッドプロセッサ。
【請求項４】
前記スケジューラは、さらに、
いずれか１つの前記スレッド浪費カウンタのカウント値が閾値に到達したとき、または、全ての前記スレッド浪費カウンタのカウント値の総和が閾値に到達したときに、異常を通知する、請求項２に記載のマルチスレッドプロセッサ。
【請求項５】
前記スケジューラは、さらに、
いずれか１つの前記スレッド浪費カウンタのカウント値が閾値に到達したとき、または、全てのスレッド浪費カウンタのカウント値の総和が閾値に到達したときに、異常を通知する、請求項３に記載のマルチスレッドプロセッサ。
【請求項６】
各前記スレッド浪費カウンタは、カウント動作が禁止可能である、請求項２に記載のマルチスレッドプロセッサ。
【請求項７】
各前記スレッド浪費カウンタは、カウント動作が禁止可能である、請求項３に記載のマルチスレッドプロセッサ。
【請求項８】
前記第１のグループに対して設けられ、該第１のグループ内のいずれか１つのハードウェアスレッドが前記スレッドスケジューリングにより指定されたときに実行不可であることが生じる度にカウントアップするグループ浪費カウンタをさらに備え、
前記スケジューラは、
前記スレッドスケジューリングにより前記第２のグループ内のハードウェアスレッドが指定されたときに、前記グループ浪費カウンタのカウント値が１以上であり、かつ、前記第１のグループ内に実行可能なハードウェアスレッドがある場合に、該ハードウェアスレッドを、前記スレッドスケジューリングにより指定されたハードウェアスレッドの代わりに指定し直す復旧スケジューリングをさらに行い、
前記グループ浪費カウンタは、前記復旧スケジューリングがなされる度にカウントダウンする、請求項１に記載のマルチスレッドプロセッサ。
【請求項９】
前記スケジューラは、
前記スレッドスケジューリングにより指定した前記第１のグループ内のハードウェアスレッドが実行不可であるときに、前記グループ浪費カウンタのカウント値が１以上であり、かつ、前記第１のグループ内の他のいずれか１つのハードウェアスレッドが実行可能である場合に、前記再スケジューリングを行わず、前記復旧スケジューリングを行う、請求項８に記載のマルチスレッドプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はプロセッサ、例えば複数のハードウェアスレッドを有するマルチスレッドプロセッサにおける前記複数のハードウェアスレッドをスケジューリングする技術に関する。
【背景技術】
【０００２】
プロセッサの処理能力を向上させるためのハードウェアマルチスレッド技術が提案されている。ハードウェアマルチスレッドをサポートするプロセッサ（以下、マルチスレッドプロセッサという）は、互いに独立した命令流を夫々生成する複数のハードウェアスレッドを有し、パイプラインにより命令を実行する演算回路に対していずれのハードウェアスレッドにより生成された命令流を処理させるかを切り替えながら演算処理を実行する。
【０００３】
マルチスレッドプロセッサにおいて、複数のハードウェアスレッドのスケジューリングが必要である。スケジューリングの手法として、ラウンドロビン方式とプライオリティ方式が知られている。ラウンドロビン方式では、待ち行列に入っているハードウェアスレッドを一定時間毎に順番に選んで実行する。そのため、ラウンドロビン方式では、待ち行列にあるスレッドが一定時間ごとに公平にＣＰＵに割り当てられて実行される。また、プライオリティ方式は、ハードウェアスレッドの優先度の順にハードウェアスレッドを実行する。具体的には、プライオリティ方式では、優先度毎に設けられた待ち行列に各優先度のハードウェアスレッドがキューイングされ、優先度の高い待ち行列から順にハードウェアスレッドが選択されＣＰＵに割り当てられて実行される。
【０００４】
しかしながら、ラウンドロビン方式及びプライオリティ方式に共通する問題として、ハードウェアスレッドの最低実行時間を保証しながら、柔軟にハードウェアスレッドの実行時間を設定できない問題がある。例えば、ラウンドロビン方式では、ハードウェアスレッド数が多い場合に、各スレッドの実行時間が均等に減少し、優先度の高いハードウェアスレッドに十分な実行時間が割り当てられない問題がある。また、プライオリティ方式では、優先度の高いハードウェアスレッドの処理が続いた場合、優先度の低いハードウェアスレッドが処理できない問題がある。
【０００５】
特許文献１には、この問題を解決するための手法が開示されている。この手法は、スケジューリングの１循環周期を第１の期間と第２の期間を分け、第１の期間において、マルチスレッドプロセッサの複数のハードウェアスレッドのうちから固定的に選択された１つ以上のハードウェアスレッドの実行を指定し、第２の実行期間において任意のハードウェアスレッドの実行を指定する。マルチスレッドプロセッサにおけるスケジューラは、このような循環周期を繰り返すことによりスケジューリングする。
【０００６】
該手法を適用したマルチスレッドプロセッサに対して、例えば、第１の実行期間には最低実行時間を保証したいハードウェアスレッドを定義し、第２の実行期間にはそのときの処理状況に応じた任意のハードウェアスレッドを定義する。こうすることにより、第１の実行期間において実行されるハードウェアスレッドは、他のハードウェアスレッドの優先度にかかわらず実行される。また、第２の実行期間には、任意のハードウェアスレッドを実行することができる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１０−８６１２８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
自動車制御などの分野において、複数のハードウェアスレッドのうちの一部のハードウェアスレッド（以下「第１のグループ」という）の実行時間と、他のハードウェアスレッド（以下「第２のグループ」という）の実行時間との比が一定であり、かつ、上記第１のグループに含まれる夫々のハードウェアスレッド間における実行時間の比も一定であるようにスケジューリングする必要がある。
【０００９】
例えば、Ａ１、Ａ２、Ｂ１、Ｂ２、Ｂ３の５つのハードウェアスレッドがあり、Ａ１とＡ２がグループＡに属し、Ｂ１、Ｂ２、Ｂ３がグループＢに属するとする。また、グループＡとグループＢの実行時間の比が「１：１」であり、グループＡ内の夫々のハードウェアスレッド（Ａ１、Ａ２）間における実行時間の比が「１：１」となるようにスケジューリングする場合を考える。すなわち、Ａ１の実行時間と、Ａ２の実行時間と、グループＢ（Ｂ１、Ｂ２、Ｂ３）のうちのいずれか１つが実行される時間との比は、「１：１：２」である。
【００１０】
このようなスケジューリングを実現するために、特許文献１に開示された手法の適用が考えられる。例えば、第１の実行期間に対してＡ１とＡ２を定義し、第２の実行期間に対してＢ１、Ｂ２、Ｂ３を定義する。その結果、「Ａ１の指定、Ａ２の指定、グループＢのいずれか１つのハードウェアスレッドの指定」となるスケジュールが繰り返され、設計者の設計通りの割合でハードウェアスレッドの実行がなされる。
【００１１】
ところが、ハードウェアスレッドは、ＣＰＵより低速なＩ／Ｏの読出待ち（以下単に「Ｉ／Ｏ待ち」という）など種々のハザードにより、常に実行可能な状態にあるとは限らない。その一方、上述した手法では、第１の実行期間において、該第１の実行期間に定義されたハードウェアスレッドは、必ず指定される。従って、第１の実行時間に定義されているハードウェアは、実行不可であるときに指定されてしまう可能性がある。例えば、Ａ１が実行不可であるときにＡ１が指定される可能性がある。
【００１２】
これでは、パイプライン上に何も処理しないステップが生じ、ＣＰＵの処理効率が低下してしまうという問題がある。なお、パイプライン上の１ステップが１実行スロットとも呼ばれ、パイプライン上に何も処理しないステップが生じた状況を、以下、実行スロットに空きが生じるともいう。
【００１３】
また、このようなことの累積により、設計通りの割合でこれらのハードウェアスレッドを実行することができなくなるという問題もある。
【００１４】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１５】
一実施の形態によれば、マルチスレッドプロセッサは、互いに独立した複数の命令流を夫々生成する複数のハードウェアスレッドと、前記複数のハードウェアスレッドのうちの次に実行するハードウェアスレッドを指定するスケジューラと、を有する。
【００１６】
前記スケジューラは、スレッドスケジューリングと再スケジューリングを行う。
スレッドスケジューリングでは、前記スケジューラは、前記複数のハードウェアスレッドのうちの第１のグループに含まれる各ハードウェアスレッドを、該ハードウェアスレッドに対して予め設定された回数分指定し、他のハードウェアスレッドが含まれる第２のグループに対して予め設定された回数分、該第２のグループ内のいずれか１つのハードウェアスレッドを指定する処理を繰り返す。
【００１７】
前記スケジューラは、前記スレッドスケジューリングにより指定された前記第１のグループ内のハードウェアスレッドが実行不可であるときに再スケジューリングを行う。この再スケジューリングは、上記実行不可であるハードウェアスレッドの代わりに、前記第２のグループ内のハードウェアスレッドを指定する処理である。
【００１８】
なお、上記実施の形態の装置を方法やシステムなどに置き換えて表現したものも、本発明の態様としては有効である。
【発明の効果】
【００１９】
前記一実施の形態によれば、マルチスレッドプロセッサにおける複数のハードウェアスレッドを設計通りの割合で実行すると共に、マルチスレッドプロセッサの性能低下を防ぐことができる。
【図面の簡単な説明】
【００２０】
【図１】第１の実施の形態にかかるプロセッサシステムを示す図である。
【図２】図１に示すプロセッサシステムにおけるマルチスレッドプロセッサのスケジューラの回路構成の一例を示す図である。
【図３】図２に示すスケジューラにおけるスレッド制御レジスタのスロットの構成の一例を示す図である。
【図４】図２に示すスケジューラにおける再スケジューラの回路構成の一例を示す図である。
【図５】再スケジューラが無いと仮定した場合に、図２に示すスケジューラの回路構成の一例を示す図である。
【図６】図５に示すスケジューラによるスケジューリングの一例を示す図である。
【図７】図２に示すスケジューラによるスケジューリングの一例を示す図である。
【図８】第２の実施の形態にかかるプロセッサシステムにおけるスケジューラを示す図である。
【図９】図８に示すスケジューラにおける第１の復旧スケジューラの回路構成の一例を示す図である。
【図１０】図８に示すスケジューラによるスケジューリングの一例を示す図である。
【図１１】第３の実施の形態にかかるプロセッサシステムにおけるスケジューラを示す図である。
【図１２】図１１に示すスケジューラにおける第２の復旧スケジューラの回路構成の一例を示す図である。
【図１３】図１１に示すスケジューラによるスケジューリングの一例を示す図である。
【図１４】第４の実施の形態を説明するために、図８に示すスケジューラによるスケジューリングの別の一例を示す図である。
【図１５】第４の実施の形態のスケジューラによるスケジューリングの一例を示す図である。
【発明を実施するための形態】
【００２１】
説明の明確化のため、以下の記載及び図面は、適宜、省略、及び簡略化がなされている。また、様々な処理を行う機能ブロックとして図面に記載される各要素は、ハードウェア的には、ＣＰＵ、メモリ、その他の回路で構成することができ、ソフトウェア的には、メモリにロードされたプログラムなどによって実現される。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組合せによっていろいろな形で実現できることは当業者には理解されるところであり、特別な説明が無い限り、いずれかに限定されるものではない。なお、各図面において、同一の要素には同一の符号が付されており、必要に応じて重複説明は省略されている。
【００２２】
また、上述したプログラムは、様々なタイプの非一時的なコンピュータ可読媒体（ｎｏｎ−ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（ｔａｎｇｉｂｌｅ  ｓｔｏｒａｇｅ  ｍｅｄｉｕｍ）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Ｐｒｏｇｒａｍｍａｂｌｅ  ＲＯＭ）、ＥＰＲＯＭ（Ｅｒａｓａｂｌｅ  ＰＲＯＭ）、フラッシュＲＯＭ、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００２３】
＜第１の実施の形態＞
図１は、第１の実施の形態にかかるプロセッサシステム１００を示す図である。プロセッサシステム１００は、システムバス１２０を介して接続されたメモリ１１０とマルチスレッドプロセッサ１３０を有する。なお、図示していないが、システムバス１２０には、入出力インタフェースなどの他の回路も接続される。
【００２４】
マルチスレッドプロセッサ１３０は、複数のハードウェアスレッドを備える。ハードウェアスレッドは、マルチスレッドプロセッサ１３０に内蔵されるスレッドプログラムカウンタにより出力される命令フェッチアドレスに従って命令メモリから読み出される一連の命令群により構成される命令流を生成する系のことであり、スレッドプログラムカウンタ、命令メモリ、汎用レジスタ、制御レジスタ（本実施の形態ではパイプライン制御回路１６０に内蔵されるものとする）等の回路群により構成される。本実施の形態では、マルチスレッドプロセッサ１３０は、複数のスレッドプログラムカウンタを備え、スレッドプログラムカウンタの数と同数のハードウェアスレッドが実装されている。
【００２５】
図示のように、マルチスレッドプロセッサ１３０は、演算回路１４０、割込コントローラ１５０、ＰＣ生成回路１５２、スレッドプログラムカウンタＴＰＣ０〜ＴＰＣ４、セレクタ１５４、命令メモリ１５６、命令バッファ１５８、パイプライン制御回路１６０、命令フェッチコントローラ１６２、セレクタ１６４、スケジューラ２００を備える。
【００２６】
演算回路１４０は、セレクタ１６４によって選択されたハードウェアスレッドが生成する命令に基づき演算処理を実行する。より具体的には、演算回路１４０は、命令デコーダ１４２、実行ユニット１４４、データレジスタ１４６を有する。
【００２７】
命令デコーダ１４２は、受信した命令をデコードして、実行ユニット１４４に対して演算制御信号ＳＣを出力する。また、命令デコーダ１４２は、命令のデコード結果に基づきデータの格納位置を示すデータレジスタアドレスＲａｄｄとデータレジスタアドレスＷａｄｄの出力を行う。
【００２８】
実行ユニット１４４は、演算制御信号ＳＣに応じて各種の演算を実行する。なお、実行ユニット１４４は、複数の実行ステージを有し、パイプライン処理により演算を行う。また、実行ユニット１４４において実行された演算結果は、その演算結果の種類に応じてＰＣ生成回路１５２、メモリ１１０、データレジスタ１４６に送信される。
【００２９】
データレジスタ１４６は、実行ユニット１４４において用いられるデータが格納されており、データレジスタアドレスＲａｄｄにより指定されるアドレスのデータを出力する。図１に示す例では、データレジスタ１４６は、データレジスタアドレスＲａｄｄに応じてデータａとデータｂを出力する。また、データレジスタ１４６は、実行ユニット１４４が出力する演算結果をデータレジスタアドレスＷａｄｄにより指定されるアドレスに格納する。
【００３０】
割込コントローラ１５０は、割込要求信号を受けて、マルチスレッドプロセッサ１３０内に割込処理の実行を指示する割込指示信号を出力する。より具体的には、割込コントローラ１５０は、割込要求信号を受信すると、割込要因や割込処理の優先度等を判定し、当該割込要因に関連した処理を行うようにＰＣ生成回路１５２及びパイプライン制御回路１６０に割込処理の実行を指示する。この割込要求は、マルチスレッドプロセッサ１３０が出力するものの他に、マルチスレッドプロセッサ１３０以外の回路からも出力される。
【００３１】
ＰＣ生成回路１５２は、プログラムカウンタの更新値（以下「プログラムカウント更新値」という）を生成するものであり、システムバス１２０を介して入力される新たなプログラム命令信号、割込コントローラ１５０が出力する割込指示信号及び実行ユニット１４４における処理に基づき出力される分岐指示信号を受けて、プログラムカウント更新値を生成する。ＰＣ生成回路１５２は、生成したプログラムカウント更新値をスレッドプログラムカウンタＴＰＣ０〜ＴＰＣ４のいずれかに与える。なお、ＰＣ生成回路１５２は、生成したプログラムカウント更新値をいずれのスレッドプログラムカウンタに与えるかを判断する機能も有する。
【００３２】
スレッドプログラムカウンタＴＰＣ０〜ＴＰＣ４は、処理すべき命令が格納される命令メモリ１５６のアドレス（「命令フェッチアドレスＩＭａｄｄ」という）を生成するものである。具体的には、スレッドプログラムカウンタＴＰＣ０〜ＴＰＣ４は、ＰＣ生成回路１５２からプログラムカウント更新値が与えられた場合には、命令フェッチアドレスＩＭａｄｄを該プログラムカウント更新値に応じて更新する。一方、プログラムカウント更新値の入力がない場合には、スレッドプログラムカウンタＴＰＣ０〜ＴＰＣ４は、アドレスを昇順に計算し、連続する次の命令フェッチアドレスＩＭａｄｄを算出する。
【００３３】
なお、例として、図１において、スレッドプログラムカウンタの数をＴＰＣ０〜ＴＰＣ４の５つとしており、マルチスレッドプロセッサ１３０におけるハードウェアスレッドの数も５つとなる。スレッドプログラムカウンタ乃至ハードウェアスレッドの数は、５に限られることがない。
【００３４】
セレクタ１５４は、命令フェッチコントローラ１６２が出力するスレッド指定信号に応じてスレッドプログラムカウンタＴＰＣ０〜ＴＰＣ４のうちいずれか１つを選択し、選択したスレッドプログラムカウンタが出力する命令フェッチアドレスＩＭａｄｄを出力する。なお、図１において、セレクタ１５４の入力端子に付した数字０〜４は、ハードウェアスレッドの番号を示すものである。
【００３５】
なお、ハードウェアスレッドＡ１、Ａ２、Ｂ１〜Ｂ３は、０、１、２、３、４の番号が夫々付与されているとする。
【００３６】
命令メモリ１５６は、マルチスレッドプロセッサ１３０の全て（本実施の形態では５つ）のハードウェアスレッドにより共用されるメモリ領域であり、マルチスレッドプロセッサ１３０において実行される演算で用いられる各種命令が格納される。
【００３７】
命令フェッチコントローラ１６２が出力するスレッド指定信号は、命令メモリ１５６にも入力される。命令メモリ１５６は、命令フェッチコントローラ１６２が出力するスレッド指定信号に従って、セレクタ１５４を介して入力される命令フェッチアドレスＩＭａｄｄにより指定された命令の出力先を振り分ける。
【００３８】
本実施の形態では、命令バッファ１５８は、スレッドプログラムカウンタＴＰＣ０〜ＴＰＣ４に対応した命令バッファ領域ＢＵＦ０〜ＢＵＦ４を有する。命令メモリ１５６は、命令バッファ領域ＢＵＦ０〜ＢＵＦ４のうちの、命令フェッチコントローラ１６２が出力するスレッド指定信号に対応する領域に命令を出力する。なお、命令メモリ１５６は、メモリ１１０に含まれる所定のメモリ領域であってもよい。
【００３９】
命令バッファ領域ＢＵＦ０〜ＢＵＦ４は、ＦＩＦＯ（Ｆｉｒｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）形式のバッファ回路である。また、命令バッファ領域ＢＵＦ０〜ＢＵＦ４は、１つのバッファ内において領域分割されたものであってもよいし、異なるバッファ内に夫々形成されたものであっても良い。
【００４０】
パイプライン制御回路１６０は、命令バッファ１５８の先頭に格納された命令と実行ユニット１４４において実行されている命令とをモニタする。そして、パイプライン制御回路１６０は、割込コントローラ１５０から割込指示信号が入力された場合には、割込処理に関係するハードウェアスレッドに属する命令を廃棄する指示を命令バッファ１５８及び実行ユニット１４４に対して行う。
【００４１】
命令フェッチコントローラ１６２は、命令バッファ１５８に格納されている命令の個数に応じていずれのハードウェアスレッドに属する命令をフェッチすべきかを判断し、その判断結果に基づきセレクタ１５４にスレッド指定信号を出力する。例えば、命令フェッチコントローラ１６２は、命令バッファ領域ＢＵＦ０に格納される命令キューの数が他の命令バッファ領域に格納される命令キューの数よりも少なければ、０番のハードウェアスレッドに属する命令をフェッチすべきと判断し、０番のハードウェアスレッドを示すスレッド指定信号を出力する。これにより、セレクタ１５４は、スレッドプログラムカウンタＴＰＣ０を選択する。なお、命令フェッチコントローラ１６２は、ラウンドロビン方式など従来知られているいかなる方式による手順で選択するハードウェアスレッドを決定してもよい。
【００４２】
セレクタ１６４は、スケジューラ２００が出力するスレッド選択信号ＴＳＥＬに応じて命令バッファ領域ＢＵＦ０〜ＢＵＦ４のいずれか１つを選択し、選択した命令バッファ領域から読み出した命令を演算回路１４０に出力する。つまり、セレクタ１６４は、スレッド選択信号ＴＳＥＬに従って複数のハードウェアスレッドから１つのハードウェアスレッドを選択し、選択したハードウェアスレッドが出力する命令を演算回路１４０に出力する。なお、セレクタ１６４の入力端子に付した数字０〜４は、ハードウェアスレッドの番号を示す。
【００４３】
スケジューラ２００は、予め設定されたスケジュールを基に、５つのハードウェアスレッドのうち次の実行サイクルにおいて実行される１つのハードウェアスレッドを指定するスレッド選択信号ＴＳＥＬを出力する。マルチスレッドプロセッサ１３０では、このスケジュールは、マルチスレッドプロセッサ１３０の利用者、すなわちマルチスレッドプロセッサ１３０上で動作するプログラムの設計者により設計され、例えば、マルチスレッドプロセッサ１３０の起動の直後に実行される管理プログラムにより設定される。
【００４４】
以下において説明しやすいように、マルチスレッドプロセッサ１３０における５つのハードウェアスレッド（番号：０〜４）を夫々Ａ１、Ａ２、Ｂ１、Ｂ２、Ｂ３とする。Ａ１とＡ２は、例えば実時間スレッドであり、第１のグループを構成する。Ｂ１−Ｂ３は、実時間スレッド以外のスレッド（非実時間スレッド）であり、第２のグループを構成する。
【００４５】
なお、以下の説明及び各図面において、「Ａ１」や「Ｂ２」のように、ＡまたはＢの後に数字が付されている表記は、該当するハードウェアスレッドを表し、「Ａ」や「Ｂ」のように数字が付されていない表記は、該当するグループ内のいずれか１つのハードウェアスレッドを表す。例えば、「Ａ１」と「Ｂ２」は、ハードウェアスレッドＡ１とハードウェアスレッドＢ２を夫々表し、「Ａ」と「Ｂ」は、第１のグループ内のいずれか１つのハードウェアスレッド（ハードウェアスレッドＡ１またはハードウェアスレッドＡ２）と、第２のグループ内のいずれか１つのハードウェアスレッド（ハードウェアスレッドＢ１またはハードウェアスレッドＢ２）を夫々表す。
【００４６】
上記スケジュールは、Ａ１の実行時間と、Ａ２の実行時間と、Ｂの実行時間の比が一定となるように設定されている。例として、この比は、「１：１：２」に設定されているとする。
【００４７】
本実施の形態において、スケジューラ２００が行うスケジューリングは、スレッドスケジューリングと、再スケジューリングからなる。ここで、スレッドスケジューリングと再スケジューリングを具体的に説明する。
【００４８】
＜スレッドスケジューリング＞
スレッドスケジューリングは、予め設定されたスケジュールを繰り返し実行するスケジューリングである。スレッドスケジューリングでは、スケジューラ２００は、各循環周期において、「Ａ１の指定が１回、Ａ２の指定が１回、Ｂ（Ｂ１、Ｂ２、Ｂ３のいずれか１つ）の指定が２回」となるようにハードウェアスレッドの指定を行う。
【００４９】
＜再スケジューリング＞
再スケジューリングは、上記スレッドスケジューリングにより次に実行するハードウェアスレッドとしてＡ（Ａ１またはＡ２）が指定されるものの、指定されたハードウェアスレッドが実行不可であるときに行われる。ハードウェアスレッドが実行不可となる要因は、例えばＩ／Ｏ待ちなどがある。
【００５０】
再スケジューリングでは、スケジューラ２００は、スレッドスケジューリングにより指定されたハードウェアスレッドＡの代わりに、第２のグループ内のいずれか１つのハードウェアスレッド（ハードウェアスレッドＢ）を指定し直す。
【００５１】
すなわち、スケジューラ２００は、原則として、予め設定されたスケジュールを繰り返すスケジューリング（スレッドスケジューリング）を行う。そして、スレッドスケジューリングによりハードウェアスレッドＡを指定するものの、該ハードウェアスレッドＡが実行不能であるときに、ハードウェアスレッドＡの代わりに、ハードウェアスレッドＢを指定する。そのため、スレッドスケジューリングにより指定されたハードウェアスレッドＡが実行不能である場合においても、実行スロットに空きが生じることを回避できる。
【００５２】
すなわち、スケジューラ２００は、予め設定したスケジュール通りのスケジューリングによる各スレッドの実行時間の確保と、マルチスレッドプロセッサ１３０の性能低下の回避との両方において、ベストエフォートを実現する。
【００５３】
ここで、再スケジューリングの際に、ハードウェアスレッドＡ（例えばＡ１）の代わりに指定するハードウェアスレッドが、他のハードウェアスレッドＡ（例えばＡ２）ではなく、ハードウェアスレッドＢであることを注目されたい。
【００５４】
ハードウェアスレッドＡ１、Ａ２、Ｂの実行回数に関して、マルチスレッドプロセッサ１３０の設計者が実現したい割合は、「１：１：２」である。すなわち、４回のうちに、Ａ１が１回指定され、Ａ２が１回指定され、Ｂが２回指定される。
【００５５】
スレッドスケジューリングにより指定されたハードウェアスレッドＡ１が実行不能であるときに、ハードウェアスレッドＡ１の代わりにハードウェアスレッドＡ２を指定し直すのでは、該循環周期において、Ａ１が０回指定され、Ａ２が２回指定され、Ｂが２回指定されるようになる。これでは、ハードウェアスレッドＡ２の割合が変わってしまう。
【００５６】
一方、本実施の形態におけるスケジューラ２００によれば、スレッドスケジューリングにより指定されたハードウェアスレッドＡ１が実行不能であるときに、ハードウェアスレッドＡ１の代わりにハードウェアスレッドＢを指定し直すため、該循環周期において、Ａ１が０回指定され、Ａ２が１回指定され、Ｂが３回指定されるようになる。
【００５７】
第１のグループに含まれるハードウェアスレッドＡ１とハードウェアスレッドＡ２は、第２のグループの各ハードウェアスレッドより、実行の割合を保証したいハードウェアスレッドである。なお、「実行の割合を保証する」ことは、「実行時間を減らさない」のみならず、「実行時間を無闇に増やさない」ことも含む。従って、スレッドスケジューリングにより指定されたハードウェアスレッドＡ１が実行不能であるときに、ハードウェアスレッドＡ１の代わりにハードウェアスレッドＢを指定し直すスケジューラ２００は、実行の割合を特に保証したいハードウェアスレッドについて、設計者が当初意図して設計したハードウェアスレッドの実行割合により近い割合で実行することができる。
【００５８】
図２を参照して、スケジューラ２００の具体的な回路構成の一例を説明する。図２に示す例では、スケジューラ２００は、第１のスケジューラ２１０、再スケジューラ２２０、セレクタ２２２、スレッド状態管理ユニット２３０、第２のスケジューラ２４０、セレクタ２５０を有する。第１のスケジューラ２１０、第２のスケジューラ２４０、セレクタ２５０は、前述したスレッドスケジューリングを担い、再スケジューラ２２０、スレッド状態管理ユニット２３０は、前述した再スケジューリングを担う。
【００５９】
第１のスケジューラ２１０は、第１のグループと第２のグループとを切り替える選択信号ＲＥＡＬ０を出力すると共に、ハードウェアスレッドの番号を出力する。以下、第１のスケジューラ２１０が出力する番号を「第１の番号ＳＮ１」という。
【００６０】
前述したように、例として、第１のグループの各ハードウェアスレッドが実時間スレッドであり、第２のグループ内の各ハードウェアスレッドが非実時間スレッドである。そのため、以下、選択信号ＲＥＡＬ０を「実時間ビット信号」ともいう。また、実時間ビット信号ＲＥＡＬ０は、「１」と「０」により第１のグループと第２のグループを夫々示すとする。
【００６１】
図示のように、第１のスケジューラ２１０は、スレッド制御レジスタ２１１、カウンタ２１２、カウンタ最大値格納部２１３、比較回路２１４、セレクタ２１５を有する。
【００６２】
スレッド制御レジスタ２１１は、１循環周期において指定されるハードウェアスレッドの総数（ここでは４）以上の数のスロット（図示の例では、スロットＳＬＴ０〜ＳＬＴ７の８つ）を備える。夫々のスロットは、図３に示すように、ハードウェアスレッド番号が格納される番号格納部と、当該スロットが選択された場合における実時間ビット信号の論理レベルを示すフラグ（すなわち実時間ビット信号ＲＥＡＬ０の値）が格納される実時間ビット格納部とを有する。
【００６３】
本実施の形態において、スロットＳＬＴ０とスロットＳＬＴ２に、実時間ビット信号ＲＥＡＬ０の論理レベルを示すフラグとして、「１」が夫々格納され、ハードウェアスレッドの番号として、「０」（Ａ１）、「１」（Ａ２）が夫々格納される。
【００６４】
また、スロットＳＬＴ１とスロットＳＬＴ３には、実時間ビット信号ＲＥＡＬ０の論理レベルを示すフラグとして、「０」が夫々格納されている。後の説明で分かるように、フラグとして「０」を格納するスロットが選択された場合、該スロットに格納されるハードウェアスレッドの番号も第１の番号ＳＮ１として出力されるが、このときの第１の番号ＳＮ１が使用されない。そのため、スロットＳＬＴ１とスロットＳＬＴ３には、ハードウェアスレッドの番号として、任意の値を格納してもよい。
【００６５】
また、この例の場合には、スロットＳＬＴ４〜スロットＳＴ７は、使用されないため、任意の値が格納される。
【００６６】
カウンタ２１２は、所定の間隔でカウント値ＣＮＴを更新する。具体的には、本実施の形態におけるカウンタ２１２は、マルチスレッドプロセッサ１３０の動作クロック（図示せず）に同期してカウント値ＣＮＴをカウントアップする。
【００６７】
カウント最大値格納部２１３は、カウンタ２１２のカウント値ＣＮＴの上限値を定めるカウント最大値ＣＮＴＭを格納する。このカウント最大値ＣＮＴＭは、スケジューラ２００が１循環周期において指定するハードウェアスレッドの数であり、ここでは「４」となる。
【００６８】
比較回路２１４は、カウント値ＣＮＴとカウント最大値ＣＮＴＭとを比較し、カウント値ＣＮＴとカウント最大値ＣＮＴＭが一致した場合に、カウンタ２１２のカウント値をリセットするリセット信号ＲＳＴを出力する。つまり、カウンタ２１２は、所定の周期でカウント値ＣＮＴを初期化しながら、カウントアップ動作を繰り返すことで、循環的に値が更新されるカウント値ＣＮＴを出力する。
【００６９】
セレクタ２１５は、カウント値ＣＮＴに応じてスレッド制御レジスタ２１１内のスロットの１つを選択し、選択したスロットに格納される値に基づき実時間ビット信号ＲＥＡＬ０と第１の番号ＳＮ１を出力する。具体的には、セレクタ２１５は、カウント値ＣＮＴが０であればスロットＳＬＴ０を選択し、スロットＳＬＴ０の番号格納部に格納されたハードウェアスレッド番号を第１の番号ＳＮ１とし、スロットＳＬＴ０の実時間ビット格納部に格納されるフラグの値を実時間ビット信号ＲＥＡＬ０の論理レベルとする。
【００７０】
なお、スレッド制御レジスタ２１１のスロットに格納される値、カウンタ２１２のカウント値ＣＮＴの初期値、カウント最大値格納部２１３に格納されるカウント最大値ＣＮＴＭは、マルチスレッドプロセッサ１３０の起動時に実行される管理プログラムにより設定される。また、管理プログラムは、メモリ１１０からこれら設定値を読み込むものとする。
【００７１】
再スケジューラ２２０は、第１のスケジューラ２１０からの実時間ビット信号ＲＥＡＬ０と、セレクタ２２２からの信号（後述する状態信号ＳＴＡ）とが入力され、実時間ビット信号ＲＥＡＬ１を出力する。
【００７２】
スレッド状態管理ユニット２３０は、マルチスレッドプロセッサ１３０の各ハードウェアスレッドが実行可能と実行不可のいずれの状態にあるかを監視し、監視結果をセレクタ２２２に出力する。例えば、ハードウェアスレッドＡ１、Ａ２、Ｂ１−Ｂ３は、夫々、「実行可能」、「実行不可」、「実行可能」、「実行可能」、「実行可能」であるときに、スレッド状態管理ユニット２３０は、信号「１０１１１」をセレクタ２２２に出力する。
【００７３】
スレッド状態管理ユニット２３０からの信号と、第１のスケジューラ２１０からの第１の番号ＳＮ１は、セレクタ２２２に入力される。セレクタ２２２は、スレッド状態管理ユニット２３０からの信号の各ビットのうちに、第１の番号ＳＮ１が示すハードウェアスレッドの状態を示すビットを選択して状態信号ＳＴＡとして再スケジューラ２２０に出力する。
【００７４】
再スケジューラ２２０は、第１のスケジューラ２１０からの実時間ビット信号ＲＥＡＬ０が「０」であるときに、実時間ビット信号ＲＥＡＬ１として「０」を出力する。
【００７５】
一方、実時間ビット信号ＲＥＡＬ０が「１」であるときに、セレクタ２２２からの状態信号ＳＴＡに応じて、実時間ビット信号ＲＥＡＬ１として「０」と「１」のいずれか一方を出力する。具体的には、状態信号ＳＴＡが「１」であるときには「１」を、状態信号ＳＴＡが「０」であるときには「０」を実時間ビット信号ＲＥＡＬ１として出力する。
【００７６】
例えば、第１のスケジューラ２１０から、「１」である実時間ビット信号ＲＥＡＬ０と、「０」である第１の番号ＳＮ１が出力されたとする。この場合、第１の番号ＳＮ１が示すハードウェアスレッドＡ１が実行可能であるときには、セレクタ２２２から状態信号ＳＴＡとして「１」が出力されるため、再スケジューラ２２０は、実時間ビット信号ＲＥＡＬ１として「１」を出力する。一方、ハードウェアスレッドＡ１が実行不可であるときには、セレクタ２２２から状態信号ＳＴＡとして「０」が出力されるため、再スケジューラ２２０は、実時間ビット信号ＲＥＡＬ１として「０」を出力する。
【００７７】
図４は、再スケジューラ２２０の回路構成の１例を示す。該例では、再スケジューラ２２０は、ＡＮＤ回路で構成されている。すなわち、再スケジューラ２２０は、セレクタ２２２からの状態信号ＳＴＡと、第１のスケジューラ２１０からの実時間ビット信号ＲＥＡＬ０が入力され、それらの論理積を実時間ビット信号ＲＥＡＬ１として出力する。
【００７８】
図２に戻って説明する。
再スケジューラ２２０は、上述した通りに、第１のスケジューラ２１０からの実時間ビット信号ＲＥＡＬ０と、セレクタ２２２からの状態信号ＳＴＡとに基づいて実時間ビット信号ＲＥＡＬ１を生成してセレクタ２５０に出力する。この実時間ビット信号ＲＥＡＬ１は、セレクタ２５０の制御信号となる。
【００７９】
セレクタ２５０には、再スケジューラ２２０からの実時間ビット信号ＲＥＡＬ１に基づいて、第１のスケジューラ２１０が出力した第１の番号ＳＮ１と、第２のスケジューラ２４０が出力した第２の番号ＳＮ２のいずれか一方を選択する。
【００８０】
第２のスケジューラ２４０は、マルチスレッドプロセッサ１３０の５つのハードウェアスレッドのうちの第２のグループの各ハードウェアスレッド（Ｂ１−Ｂ３）をスケジューリングするものである。具体的には、第２のスケジューラ２４０は、ハードウェアスレッドＢ１−Ｂ３から任意の１つを選択すると共に、選択したハードウェアスレッドの番号をセレクタ２５０に出力する。第２のスケジューラ２４０からセレクタ２５０に出力される番号は、第２の番号ＳＮ２である。
【００８１】
なお、第２のスケジューラ２４０によるスケジューリング手法は、従来知られているラウンドロビン方式やプライオリティ方式など任意の手法とすることができる。
【００８２】
セレクタ２５０は、実時間ビット信号ＲＥＡＬ１が「１」であるときに第１の番号ＳＮ１を選択し、実時間ビット信号ＲＥＡＬ１が「０」であるときに第２の番号ＳＮ２を選択する。セレクタ２５０が選択した番号は、スレッド選択信号ＴＳＥＬとして、マルチスレッドプロセッサ１３０のセレクタ１６４に出力される。
【００８３】
前述したように、セレクタ１６４は、５つのハードウェアスレッドのうちの、次に実行するハードウェアスレッドが生成した命令を選択して演算回路１４０に出力するものである。すなわち、スレッド選択信号ＴＳＥＬにより、マルチスレッドプロセッサ１３０が次に実行するハードウェアスレッドが決まる。
【００８４】
第１のスケジューラ２１０、再スケジューラ２２０、第２のスケジューラ２４０の動作をまとめる。
【００８５】
第１のスケジューラ２１０は、循環周期毎に（すなわち、ハードウェアスレッドの４回の指定毎に）、第１のグループと第２のグループのいずれかを示す実時間ビット信号ＲＥＡＬ０と第１の番号ＳＮ１として、「１」及び「０」（ハードウェアスレッドＡ１）、「１」及び「１」（ハードウェアスレッドＡ２）、「０」及び任意の番号を順次出力する。
【００８６】
再スケジューラ２２０は、第１のスケジューラ２１０からの実時間ビット信号ＲＥＡＬ０が「０」であるときに、実時間ビット信号ＲＥＡＬ０と同値すなわち「０」である実時間ビット信号ＲＥＡＬ１をセレクタ２５０に出力する。一方、実時間ビット信号ＲＥＡＬ０が「１」であるときに、再スケジューラ２２０は、第１の番号ＳＮ１が示すハードウェアスレッドが実行可能である場合には実時間ビット信号ＲＥＡＬ１と同値すなわち「１」である実時間ビット信号ＲＥＡＬ１を出力するが、第１の番号ＳＮ１が示すハードウェアスレッドが実行不可である場合には「０」である実時間ビット信号ＲＥＡＬ１を出力する。
【００８７】
第２のスケジューラ２４０は、第２の番号ＳＮ２として、第２のグループ内のハードウェアスレッド（Ｂ１〜Ｂ３）のうちの任意のハードウェアスレッドの番号をセレクタ２５０に出力する。
【００８８】
セレクタ２５０は、スレッド選択信号ＴＳＥＬとして、再スケジューラ２２０からの実時間ビット信号ＲＥＡＬ１が「１」であるときに第１のスケジューラ２１０からの第１の番号ＳＮ１を、再スケジューラ２２０からの実時間ビット信号ＲＥＡＬ１が「０」であるときに第２のスケジューラ２４０からの第２の番号ＳＮ２を選択して、セレクタ１６４に出力する。
【００８９】
ここで、スケジューラ２００において再スケジューラ２２０が無いと仮定した場合に、スケジューラ２００によるスケジューリングの一例を考える。図５は、この仮定の場合におけるスケジューラ２００の回路構成例を示す。
【００９０】
図５において、ドットにより塗り潰されたものは、存在しないと仮定されたき機能ブロックを示す。図示のように、この場合、再スケジューラ２２０、セレクタ２２２、スレッド状態管理ユニット２３０が無い。そのため、第１のスケジューラ２１０からの実時間ビット信号ＲＥＡＬ０は、直接セレクタ２５０に入力される。
【００９１】
図６は、図５に示す回路構成の場合におけるスケジューラ２００のスケジューリングの一例を示す。図６及び以降の各図面において、「可」と「不可」は、当該ハードウェアスレッドが「実行可能」、「実行不可」を夫々示し、「空」は、何も実行されないことを示す。また、「Ｂ」は、第２のグループ（Ｂ１〜Ｂ３）内のいずれか１つを示す。
【００９２】
また、「ＩＤ」、「ＥＸ」、「ＷＢ」、「ＭＥＭ」、「ＭＥＭ  ＷＢ」は、パイプライン処理のステージ「命令デコード」、「命令実行」、「レジスタライトバック」、「メモリアクセス」、「メモリライトバック」を夫々示す。なお、これらのステージは、例示であり、プロセッサの仕様によっては、パイプラインのステージが異なる。
【００９３】
図６に示すように、クロックの第１のサイクル（Ｔ１）において、スロットＳＬＴ０が選択されるため、実時間ビット信号ＲＥＡＬ０と第１の番号ＳＮ１として、「１」、「０」（Ａ１）がセレクタ２５０に出力される。そのため、セレクタ２５０から、次に実行するハードウェアスレッドとして、Ａ１の番号「０」が出力される。その結果、ハードウェアスレッドＡ１が生成した命令が実行される。具体的には、ハードウェアスレッドＡ１が生成した命令の「ＩＤ」ステージの処理が開始される。
【００９４】
クロックの第２サイクル（Ｔ２）において、スロットＳＬＴ１が選択されるため、実時間ビット信号ＲＥＡＬ０と第１の番号ＳＮ１として、「０」と「＊」（任意の番号）が、第２の番号ＳＮ２として、３〜５のいずれか（ハードウェアスレッドＢ）がセレクタ２５０に出力される。そのため、セレクタ２５０から、次に実行するハードウェアスレッドとして、ハードウェアスレッドＢの番号（３〜５のいずれか１つ）が出力される。その結果、ハードウェアスレッドＢが生成した命令が実行される。
【００９５】
同様に、クロックの第３のサイクル（Ｔ３）において、ハードウェアスレッドＡ２の番号（１）が選択され、ハードウェアスレッドＡ２が生成した命令が実行される。次いで、第４のサイクル（Ｔ４）において、ハードウェアスレッドＢの番号が選択され、ハードウェアスレッドＢが生成した命令が実行される。
【００９６】
なお、サイクルＴ３では、ハードウェアスレッドＡ１の「ＭＥＭ」ステージの処理が実行されるが、Ｉ／Ｏ待ちにより、次のステージへ進むことができず、「実行不可」となっている。図６の例では、ハードウェアスレッドＡ１の「実行不可」状態は、サイクルＴ９まで続く。
【００９７】
サイクルＴ１〜Ｔ４は、スケジューリングの１循環周期である。図示のように、該循環周期において、Ａ１、Ａ２、Ｂに割り得てられた実行時間の比は、予め設定されたスケジュール通りの「１：１：２」である。
【００９８】
次いで、次の循環周期（サイクルＴ５〜Ｔ８）のスケジューリングが行われる。サイクルＴ１〜Ｔ４の循環周期のときと同様に、セレクタ２５０から、Ａ１、Ｂ、Ａ２、Ｂの番号が順次出力される。
【００９９】
ところが、サイクルＴ５において、次に実行するハードウェアスレッドとしてハードウェアスレッドＡ１が指定されているが、ハードウェアスレッドＡ１は、「実行不可」である。そのため、サイクルＴ５において、「ＩＤ」ステージでは、何も実行されないこととなる。その結果、サイクルＴ６における「ＥＸ」ステージと、サイクルＴ７における「ＷＢ」ステージでも、何も実行されない。
【０１００】
同様のことは、サイクルＴ９〜サイクルＴ１２の循環周期においても発生する。
なお、サイクルＴ１０において、ハードウェアスレッドＡ１は、Ｉ／０アクセスが完了し、「実行可能」状態に復帰する。そのため、サイクルＴ１２の次のサイクルから始まる循環周期（図示せず）においては、パイプライン処理は、サイクルＴ１〜サイクルＴ４の循環周期と同様になる。
【０１０１】
図６から明らかなように、ハードウェアスレッドＡ１が「実行不可」状態になることにより、実行スロットに空きが生じ、プロセッサの性能が低下してしまう。
【０１０２】
図６を参照して、再スケジューラ２２０が無いと仮定した場合にスケジューラ２００によるスケジューリングの一例を説明した。
【０１０３】
図７は、上記仮定が無い場合、すなわち本実施の形態におけるスケジューラ２００によるスケジューリングの例を示す図である。
【０１０４】
図７に示すように、サイクルＴ１〜Ｔ４の循環周期において、図６に示す例と同様に、ハードウェアスレッドＡ１、ハードウェアスレッドＢ、ハードウェアスレッドＡ２、ハードウェアスレッドＢの順に夫々のハードウェアスレッドが指定され、実行される。
【０１０５】
サイクルＴ５では、スロットＳＬＴ０が選択され、第１のスケジューラ２１０から実時間ビット信号ＲＥＡＬ０と第１の番号ＳＮ１として、「１」と「０」（Ａ１）が出力される。しかし、ハードウェアスレッドＡ１が実行不可であるため、再スケジューラ２２０は、実時間ビット信号ＲＥＡＬ１に「０」を出力する。その結果、該サイクルでは、セレクタ２５０から、スレッド選択信号ＴＳＥＬとして、ハードウェアスレッドＢを示す第２の番号ＳＮ２が出力される。
【０１０６】
すなわち、スレッドスケジューリングにより一旦ハードウェアスレッドＡ１が指定されるものの、再スケジューリングにより、ハードウェアスレッドＡ１の代わりに、ハードウェアスレッドＢが指定される。
【０１０７】
図７及び以降の図面において、スレッド選択信号ＴＳＥＬについて、細線枠はスレッドスケジューリングの結果を示し、実線の太線枠は、再スケジューリングの結果を示す。
【０１０８】
図７に示すように、サイクルＴ９においても、再スケジューリングが行われ、スレッドスケジューリングにより指定されたハードウェアスレッドＡ１の代わりに、ハードウェアスレッドＢが指定されている。
【０１０９】
その結果、ハードウェアスレッドＡ１が「実行不可」状態に入ったとしても、実行スロットに空きが生じていない。その結果、プロセッサの性能低下は、回避される。
【０１１０】
＜第２の実施の形態＞
第２の実施の形態も、プロセッサシステムである。なお、第２の実施の形態にかかるプロセッサシステムは、第１の実施の形態のプロセッサシステム１００に対して、スケジューラ２００の代わりにスケジューラ３００を設けた点を除き、プロセッサシステム１００と同様である。そのため、該第２の実施の形態にプロセッサシステムについては、スケジューラ３００のみを説明する。また、説明に際して、プロセッサシステム１００における複数のハードウェアスレッドと同様の例を用いる。
【０１１１】
スケジューラ３００は、前述したスレッドスケジューリングと、再スケジューリングに加え、さらに、後述する浪費回数のカウント及び復旧スケジューリングを行う。
【０１１２】
スケジューラ３００は、第１のグループのそれぞれのハードウェアスレッド（Ａ１、Ａ２）が再スケジューリングされる毎に、それぞれの浪費回数をカウントアップする。
【０１１３】
前記したように、再スケジューリングは、スレッドスケジューリングにより第１のグループのハードウェアスレッドが指定されるものの、該ハードウェアスレッドが実行不可であるときに、該ハードウェアスレッドの代わりに第２のグループのハードウェアスレッド（Ｂ）を指定し直す処理である。すなわち、ハードウェアスレッドＡ１またはハードウェアスレッドＡ２に対してカウントアップされる浪費回数とは、該ハードウェアスレッドが実行不可であるときにスレッドスケジューリングにより指定され、再スケジューリングにより第２グループのハードウェアスレッド（Ｂ）が代わりに指定される回数になる。
【０１１４】
スケジューラ３００は、第１のグループの夫々のハードウェアスレッドの浪費回数に基づいて、復旧スケジューリングを行う。具体的には、スレッドスケジューリングにより第２のグループのハードウェアスレッドが指定されたときに、スケジューラ３００は、第１のグループのうちに、浪費回数が「１」以上のハードウェアスレッドの有無を確認する。
【０１１５】
第１のグループ内に該当するハードウェアスレッドがあり、かつ、該ハードウェアスレッドが実行可能である場合には、スケジューラ３００は、スレッドスケジューリングにより指定されたハードウェアスレッドＢの代わりに、第１のグループ内の該当するハードウェアスレッドを指定し直す（復旧スケジューリング）。同時に、該ハードウェアスレッドの浪費回数をカウントダウンする。
【０１１６】
一方、第１のグループ内に該当するハードウェアスレッドが無い場合、または、該当するハードウェアスレッドがあるものの、該ハードウェアスレッドが実行不可である場合には、スケジューラ３００は、復旧スケジューリングをしない。すなわち、この場合、スケジューラ３００は、スレッドスケジューリングにより指定されたハードウェアスレッドＢを指定する。
【０１１７】
つまり、スケジューラ３００は、原則として、予め設定されたスケジュールを繰り返すスレッドスケジューリングを行う。そして、スレッドスケジューリングによりハードウェアスレッドＡを指定するものの、該ハードウェアスレッドＡが実行不能であるときに、該ハードウェアスレッドＡの代わりに、ハードウェアスレッドＢを指定し直す再スケジューリングを行うと共に、該ハードウェアスレッドＡの浪費回数をカウントアップする。
【０１１８】
また、スレッドスケジューリングによりハードウェアスレッドＢが指定されたときに、浪費回数が１以上であるハードウェアスレッドＡがあり、かつ、該ハードウェアスレッドＡが実行可能であれば、スケジューラ３００は、該ハードウェアスレッドＡを、スレッドスケジューリングにより指定されたハードウェアスレッドＢの代わりに指定し直す復旧スケジューリングを行うと共に、該ハードウェアスレッドＡの浪費回数をカウントダウンする。
【０１１９】
このように、スケジューラ３００は、第１の実施の形態のスケジューラ２００と同様に、予め設定したスケジュール通りのスケジューリングと、マルチスレッドプロセッサ１３０の性能低下の回避との両方において、ベストエフォートを実現する。
【０１２０】
さらに、スケジューラ３００は、第１のグループのハードウェアスレッド毎に浪費回数をカウントし、浪費回数に基づいて復旧スケジューリングを行うことにより、個々の循環周期で第１のグループのハードウェアスレッドについて設計者が設計した通りの割合で実行させることができなくても、複数の循環周期を通してみれば、第１のグループのハードウェアスレッドの実行の割合を設計者の設定に近付けることができる。
【０１２１】
図８は、スケジューラ３００の回路構成の一例を示す。図８に示すように、スケジューラ３００は、図２に示すスケジューラ２００に対して、さらに、第１の復旧スケジューラ３２０を設けた点を除き、スケジューラ２００と同様である。ここで、第１の復旧スケジューラ３２０に重点をおいて説明する。なお、スケジューラ３００では、図２に示すスケジューラ２００における第１のスケジューラ２１０が出力する第１の番号ＳＮ１と、再スケジューラ２２０が出力する実時間ビット信号ＲＥＡＬ０の代わりに、セレクタ２５０には、第１の復旧スケジューラ３２０が出力する第３の番号ＳＮ３と実時間ビット信号ＲＥＡＬ３が入力される。
【０１２２】
図９は、第１の復旧スケジューラ３２０の回路構成の一例を示す。図示のように、該例では、第１の復旧スケジューラ３２０は、インバータ３２１、ＡＮＤ回路３２２、カウンタ更新部３２３、スレッド浪費カウンタＷＣＮ１、スレッド浪費カウンタＷＣＮ２、復旧スケジューラコア３２４、ＯＲ回路３２５を備える。
【０１２３】
セレクタ２２２が出力した状態信号ＳＴＡは、第１の復旧スケジューラ３２０のインバータ３２１にも入力され、インバータ３２１により反転されてＡＮＤ回路３２２に出力される。また、ＡＮＤ回路３２２には、第１のスケジューラ２１０からの実時間ビット信号ＲＥＡＬ０も入力される。
【０１２４】
ＡＮＤ回路３２２は、状態信号ＳＴＡの反転信号と、実時間ビット信号ＲＥＡＬ０の論理積（信号ＵＰ）をカウンタ更新部３２３に出力する。
【０１２５】
従って、信号ＵＰは、実時間ビット信号ＲＥＡＬ０が「１」であり、かつ、状態信号ＳＴＡが「実行不可」であるときにおいてのみ、「１」となる。言い換えれば、信号ＵＰは、スケジューラ３００により再スケジューリングが行われるときにおいてのみ「１」となる。
【０１２６】
カウンタ更新部３２３は、スレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２のカウント動作を制御するものである。スレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２は、第１のグループ内の２つのハードウェアスレッド（Ａ１、Ａ２）に夫々対応し、カウンタ更新部３２３の制御に従って当該ハードウェアスレッドの浪費回数をカウントする。
【０１２７】
カウンタ更新部３２３は、スレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２に夫々制御信号を出力することによりこの２つのスレッド浪費カウンタのカウント動作を制御する。
【０１２８】
カウントアップの制御に関して、カウンタ更新部３２３は、ＡＮＤ回路３２２からの信号ＵＰと、第１のスケジューラ２１０からの第１の番号ＳＮ１とに基づいて、信号ＵＰが「１」であるときにのみ、第１の番号ＳＮ１が示すハードウェアスレッドＡに対応するスレッド浪費カウンタをカウントアップさせる。
【０１２９】
具体的には、例えば、信号ＵＰが「１」であり、第１の番号ＳＮ１がハードウェアスレッドＡ１を示す「０」であるときに、カウンタ更新部３２３は、スレッド浪費カウンタＷＣＮ１をカウントアップさせ、スレッド浪費カウンタＷＣＮ２をカウントアップさせないようにスレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２に夫々制御信号を出力する。
【０１３０】
同様に、信号ＵＰが「１」であり、第１の番号ＳＮ１がハードウェアスレッドＡ２を示す「１」であるときに、カウンタ更新部３２３は、スレッド浪費カウンタＷＣＮ１をカウントアップさせず、スレッド浪費カウンタＷＣＮ２をカウントアップさせるようにスレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２に夫々制御信号を出力する。
【０１３１】
なお、信号ＵＰが「０」であるときには、カウンタ更新部３２３は、スレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２の両方に対してカウントアップさせない制御信号を出力する。
カウントダウンの制御に関しては、後述する。
【０１３２】
復旧スケジューラコア３２４は、スレッド浪費カウンタＷＣＮ１のカウント値、スレッド浪費カウンタＷＣＮ２のカウント値、第１のスケジューラ２１０からの実時間ビット信号ＲＥＡＬ０と第１の番号ＳＮ１、スレッド状態管理ユニット２３０からの各スレッドの状態を示す信号が入力され、実時間ビット信号ＲＥＡＬ２と第３の番号ＳＮ３を出力する。
【０１３３】
具体的には、復旧スケジューラコア３２４は、実時間ビット信号ＲＥＡＬ０が「０」であり、かつ、スレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２の少なくとも一方のカウント値（浪費回数）が１以上であり、かつ、該一方の浪費カウンタに対応するハードウェアスレッドＡが実行可能であるときにのみ、第１の番号ＳＮ１を、上記一方の浪費カウンタに対応するハードウェアスレッドＡを示す番号に変更して第３の番号ＳＮ３として出力すると共に、実時間ビット信号ＲＥＡＬ２に「１」を出力する。それ以外の場合には、復旧スケジューラコア３２４は、第１のスケジューラ２１０からの第１の番号ＳＮ１をそのまま出力し、実時間ビット信号ＲＥＡＬ２に「０」を出力する。
【０１３４】
なお、スレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２の両方のカウント値とも１以上であり、かつ両方とも実行可能である場合には、復旧スケジューラコア３２４は、第３の番号ＳＮ３として、例えば、カウント値が大きい方のスレッド浪費カウンタに対応するハードウェアスレッドＡを示す番号を出力したり、この場合に対して予め設定された片方のスレッド浪費カウンタに対応するハードウェアスレッドＡを示す番号を出力したりするなどすればよい。
【０１３５】
復旧スケジューラコア３２４から出力された実時間ビット信号ＲＥＡＬ２は、カウンタ更新部３２３とＯＲ回路３２５に入力される。また、第３の番号ＳＮ３は、セレクタ２５０とカウンタ更新部３２３に入力される。
【０１３６】
カウンタ更新部３２３は、実時間ビット信号ＲＥＡＬ２をカウントダウンの制御に用いる。そのため、実時間ビット信号ＲＥＡＬ２は、信号ＤＯＷＮともいう。
【０１３７】
カウンタ更新部３２３は、カウントダウンの制御に関して、具体的には、実時間ビット信号ＲＥＡＬ２すなわち信号ＤＯＷＮが「１」であるときにのみ、第３の番号ＳＮ３が示すハードウェアスレッドＡに対応するスレッド浪費カウンタをカウントダウンさせる。
【０１３８】
具体的には、例えば、信号ＤＯＷＮが「１」であり、第３の番号ＳＮ３がハードウェアスレッドＡ１を示す「０」であるときに、カウンタ更新部３２３は、スレッド浪費カウンタＷＣＮ１をカウントダウンさせ、スレッド浪費カウンタＷＣＮ２をカウントダウンさせないようにスレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２に夫々制御信号を出力する。
【０１３９】
同様に、信号ＤＯＷＮが「１」であり、第３の番号ＳＮ３がハードウェアスレッドＡ２を示す「１」であるときに、カウンタ更新部３２３は、スレッド浪費カウンタＷＣＮ１をカウントダウンさせず、スレッド浪費カウンタＷＣＮ２をカウントダウンさせるようにスレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２に夫々制御信号を出力する。
【０１４０】
なお、信号ＤＯＷＮが「０」であるときには、カウンタ更新部３２３は、スレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２の両方に対してカウントＤＯＷＮさせない制御信号を出力する。
【０１４１】
ＯＲ回路３２５は、再スケジューラ２２０からの実時間ビット信号ＲＥＡＬ１と、復旧スケジューラコア３２４からの実時間ビット信号ＲＥＡＬ２の論理和（実時間ビット信号ＲＥＡＬ３）をセレクタ２５０に出力する。
【０１４２】
セレクタ２５０は、スレッド選択信号ＴＳＥＬとして、実時間ビット信号ＲＥＡＬ３が「１」であるときに第３の番号ＳＮ３を、実時間ビット信号ＲＥＡＬ３が「０」であるときに第２のスケジューラ２４０からの第２の番号ＳＮ２を選択する。
【０１４３】
図１０を参照して、本実施の形態におけるスケジューラ３００によるスケジューリングの例を説明する。なお、図１０において、図７と同様に、スレッド選択信号ＴＳＥＬについて、細線枠はスレッドスケジューリングの結果を示し、実線の太線枠は、再スケジューリングの結果を示す。さらに、点線の太線枠は、復旧スケジューリングの結果を示す。
【０１４４】
図１０に示すように、第１の循環周期（サイクルＴ１〜Ｔ４）において、スレッドスケジューリングにより、ハードウェアスレッドＡ１、ハードウェアスレッドＢ、ハードウェアスレッドＡ２、ハードウェアスレッドＢの順に夫々のハードウェアスレッドが指定され、実行される。
【０１４５】
サイクルＴ５では、スロットＳＬＴ０が選択され、第１のスケジューラ２１０から実時間ビット信号ＲＥＡＬ０と第１の番号ＳＮ１として、「１」と「０」（Ａ１）が出力される。しかし、ハードウェアスレッドＡ１が実行不可であるため、再スケジューリングが行われ、セレクタ２５０から、スレッド選択信号ＴＳＥＬとして、ハードウェアスレッドＢを示す第２の番号ＳＮ２が出力される。
【０１４６】
また、該サイクルにおいて、ハードウェアスレッドＡ１について再スケジューリングがなされたため、信号ＵＰが「１」となり、ハードウェアスレッドＡ１に対応するスレッド浪費カウンタＷＣＮ１のカウント値は、カウントアップにより０から１になる。
【０１４７】
第２の循環周期のサイクルＴ６〜Ｔ８までは、スレッドスケジューリングにより、ハードウェアスレッドＢ、ハードウェアスレッドＡ２、ハードウェアスレッドＢが順次指定される。
【０１４８】
なお、サイクルＴ６とＴ８において、スレッドスケジューリングによりハードウェアスレッドＢが指定され、スレッド浪費カウンタＷＣＮ１のカウント値が１である。しかし、ハードウェアスレッドＡ１が相変わらず実行不可であるため、復旧スケジューリングはなされない。
【０１４９】
第３の循環周期に入り、サイクルＴ９において、スレッドスケジューリングによりハードウェアスレッドＡ１が指定される。しかし、ハードウェアスレッドＡ１が相変わらず実行不可であるため、再スケジューリングがなされ、ハードウェアスレッドＡ１からハードウェアスレッドＢへの指定の変更が行われ、信号ＵＰが再び「１」になり、スレッド浪費カウンタＷＣＮ１のカウント値は、カウントアップにより１から２になる。
【０１５０】
サイクルＴ１０において、スレッドスケジューリングによりハードウェアスレッドＢが指定される。しかし、スレッド浪費カウンタＷＣＮ１のカウント値が「２」であり、かつ、ハードウェアスレッドＡ１が実行可能になったため、復旧スケジューリングがなされ、ハードウェアスレッドＢからハードウェアスレッドＡ１への指定の変更がなされる。同時に、実時間ビット信号ＲＥＡＬ２（ＤＯＷＮ）が「１」となり、スレッド浪費カウンタＷＣＮ１のカウント値は、カウントダウンにより２から１になる。
【０１５１】
同様に、サイクルＴ１２においても、復旧スケジューリングがなされ、ハードウェアスレッドＢからハードウェアスレッドＡ１への指定の変更がなされる。同時に、実時間ビット信号ＲＥＡＬ２（ＤＯＷＮ）が再び「１」になり、スレッド浪費カウンタＷＣＮ１のカウント値は、カウントダウンにより１から０になる。
【０１５２】
図１０から分かるように、再スケジューリングまたは復旧スケジューリングが発生した循環周期では、ハードウェアスレッドＡ１、Ａ２、Ｂの実行回数の比が「１：１：２」ではない。しかし、サイクルＴ１〜Ｔ１２からなる３つの循環周期を通してみれば、ハードウェアスレッドＡ１、Ａ２、Ｂの実行回数の比は、設計通りの「１：１：２」になっている。
【０１５３】
＜第３の実施の形態＞
第３の実施の形態も、プロセッサシステムである。なお、第３の実施の形態にかかるプロセッサシステムは、第１の実施の形態のプロセッサシステム１００に対して、スケジューラ２００の代わりにスケジューラ４００を設けた点を除き、プロセッサシステム１００と同様である。そのため、該第３の実施の形態にプロセッサシステムについては、スケジューラ４００のみを説明する。また、説明に際して、プロセッサシステム１００における複数のハードウェアスレッドと同様の例を用いる。
【０１５４】
スケジューラ４００は、第２の実施の形態のスケジューラ３００と同様に、スレッドスケジューリングと、再スケジューリングに加え、さらに、浪費回数のカウント及び復旧スケジューリングを行う。但し、スケジューラ３００がハードウェアスレッドＡ毎に浪費回数をカウントするに対して、スケジューラ４００は、第１のグループ全体に対して浪費回数のカウントを行う。従って、スケジューラ４００が行う復旧スケジューリングも、スケジューラ３００が行う復旧スケジューリングと異なる。以下において、スケジューラ４００がカウントする浪費回数を「グループ浪費回数」という。
【０１５５】
スケジューラ４００は、第１のグループ内のいずれか１つのハードウェアスレッドについて再スケジューリングがなされると、グループ浪費回数をカウントアップする。
【０１５６】
前記したように、再スケジューリングは、スレッドスケジューリングにより第１のグループのハードウェアスレッドが指定されるものの、該ハードウェアスレッドが実行不可であるときに、該ハードウェアスレッドの代わりに第２のグループのハードウェアスレッド（Ｂ）を指定し直す処理である。すなわち、グループ浪費回数は、第１のグループのいずれか１つのハードウェアスレッドが実行不可であるときにスレッドスケジューリングにより該ハードウェアスレッドが指定される回数になる。
【０１５７】
スケジューラ４００は、グループ浪費回数に基づいて、復旧スケジューリングを行う。具体的には、スレッドスケジューリングにより第２のグループのハードウェアスレッドが指定されたときに、スケジューラ４００は、グループ浪費回数が「１」以上であるか否かを確認する。
【０１５８】
グループ浪費回数が１以上であり、かつ、第１のグループ内に実行可能なハードウェアスレッドがある場合に、スケジューラ４００は、スレッドスケジューリングにより指定されたハードウェアスレッドＢの代わりに、第１のグループ内の、実行可能なハードウェアスレッドを指定し直す。同時に、グループ浪費回数をカウントダウンする。
【０１５９】
一方、グループ浪費回数が０であり、または、グループ浪費回数が１以上であるものの、実行可能なハードウェアスレッドＡが無い場合には、スケジューラ４００は、復旧スケジューリングをしない。すなわち、この場合、スケジューラ４００は、スレッドスケジューリングにより指定されたハードウェアスレッドＢを指定する。
【０１６０】
つまり、スケジューラ４００は、原則として、予め設定されたスケジュールを繰り返すスレッドスケジューリングを行う。そして、スレッドスケジューリングによりハードウェアスレッドＡを指定するものの、該ハードウェアスレッドＡが実行不能であるときに、該ハードウェアスレッドＡの代わりに、ハードウェアスレッドＢを指定し直す再スケジューリングを行うと共に、グループ浪費回数をカウントアップする。
【０１６１】
また、スレッドスケジューリングによりハードウェアスレッドＢが指定されたときに、グループ浪費回数が１以上であり、かつ、実行可能なハードウェアスレッドＡがある場合に、スケジューラ４００は、実行可能な該ハードウェアスレッドＡを、スレッドスケジューリングにより指定されたハードウェアスレッドＢの代わりに指定し直す復旧スケジューリングを行うと共に、グループ浪費回数をカウントダウンする。
【０１６２】
このように、スケジューラ４００は、第１の実施の形態のスケジューラ２００と同様に、予め設定したスケジュール通りのスケジューリングと、マルチスレッドプロセッサ１３０の性能低下の回避との両方において、ベストエフォートを実現する。
【０１６３】
さらに、スケジューラ４００は、第１のグループに対してグループ浪費回数をカウントし、グループ浪費回数に基づいて復旧スケジューリングを行うことにより、複数の循環周期を通してみた際に、第１のグループと第２のグループ間でのハードウェアスレッドの実行の割合を、設計者の設定に近付けることができる。
【０１６４】
図１１は、スケジューラ４００の回路構成の一例を示す。スケジューラ４００は、図２に示すスケジューラ２００に対して、さらに、第２の復旧スケジューラ４２０を設けた点を除き、スケジューラ２００と同様である。ここで、第２の復旧スケジューラ４２０に重点をおいて説明する。なお、スケジューラ４００では、図２に示すスケジューラ２００における第１のスケジューラ２１０が出力する第１の番号ＳＮ１と、再スケジューラ２２０が出力する実時間ビット信号ＲＥＡＬ０の代わりに、セレクタ２５０には、第２の復旧スケジューラ４２０が出力する第４の番号ＳＮ４と実時間ビット信号ＲＥＡＬ４が入力される。
【０１６５】
図１２は、第２の復旧スケジューラ４２０の回路構成の一例を示す。図示のように、該例では、第２の復旧スケジューラ４２０は、インバータ３２１、ＡＮＤ回路３２２、ＯＲ回路３２５、カウンタ更新部４２１、グループ浪費カウンタ４２２、復旧スケジューラコア４２４を備える。
【０１６６】
インバータ３２１、ＡＮＤ回路３２２、ＯＲ回路３２５は、第１の復旧スケジューラ３２０に含まれる同一の符号のものと夫々同様である。
【０１６７】
カウンタ更新部４２１は、グループ浪費カウンタ４２２のカウント動作を制御するものである。グループ浪費カウンタ４２２は、カウンタ更新部４２１の制御に従って第１のグループに対して、グループ浪費回数をカウントする。
【０１６８】
カウントアップの制御に関して、ＡＮＤ回路３２２からの信号ＵＰが「１」であれば、カウンタ更新部４２１は、グループ浪費カウンタ４２２にカウントアップさせる制御信号を出力する。一方、信号ＵＰが「０」であれば、カウンタ更新部４２１は、グループ浪費カウンタ４２２にカウントアップさせない。
カウントダウンの制御に関しては、後述する。
【０１６９】
復旧スケジューラコア４２４は、グループ浪費カウンタ４２２のカウント値、第１のスケジューラ２１０からの実時間ビット信号ＲＥＡＬ０と第１の番号ＳＮ１、スレッド状態管理ユニット２３０からの各スレッドの状態を示す信号が入力され、実時間ビット信号ＲＥＡＬ２と第４の番号ＳＮ４を出力する。
【０１７０】
具体的には、復旧スケジューラコア４２４は、実時間ビット信号ＲＥＡＬ０が「０」であり、かつ、グループ浪費カウンタ４２２のカウント値（グループ浪費回数）が１以上であり、かつ、第１のグループ内に実行可能なハードウェアスレッドがあるときにのみ、第１のグループ内の実行可能な該ハードウェアスレッドの番号を第４の番号ＳＮ４として出力すると共に、実時間ビット信号ＲＥＡＬ２に「１」を出力する。それ以外の場合には、復旧スケジューラコア４２４は、第１の番号ＳＮ１をそのまま第４の番号ＳＮ４として出力し、実時間ビット信号ＲＥＡＬ２に「０」を出力する。
【０１７１】
なお、第１のグループ内に実行可能なハードウェアスレッドが複数ある場合には、復旧スケジューラコア４２４は、例えば、第１のグループ内のハードウェアスレッドに対して予め設定された優先順位で、第４の番号ＳＮ４に対応するハードウェアスレッドを選択すればよい。勿論、この場合におけるハードウェアスレッドの選択手法は、この例に限られることが無い。
【０１７２】
復旧スケジューラコア４２４から出力された実時間ビット信号ＲＥＡＬ２は、カウンタ更新部４２１とＯＲ回路３２５に入力される。また、第４の番号ＳＮ４は、セレクタ２５０とカウンタ更新部４２１に入力される。
【０１７３】
カウンタ更新部４２１は、実時間ビット信号ＲＥＡＬ２をカウントダウンの制御に用いる。カウントダウンの制御に関して、カウンタ更新部４２１は、実時間ビット信号ＲＥＡＬ２すなわち信号ＤＯＷＮが「１」であるときにのみ、グループ浪費カウンタ４２２をカウントダウンさせる。
【０１７４】
ＯＲ回路３２５は、再スケジューラ２２０からの実時間ビット信号ＲＥＡＬ１と、復旧スケジューラコア４２４からの実時間ビット信号ＲＥＡＬ２の論理和（実時間ビット信号ＲＥＡＬ４）をセレクタ２５０に出力する。
【０１７５】
セレクタ２５０は、スレッド選択信号ＴＳＥＬとして、実時間ビット信号ＲＥＡＬ４が「１」であるときに第４の番号ＳＮ４を、実時間ビット信号ＲＥＡＬ４が「０」であるときに第２のスケジューラ２４０からの第２の番号ＳＮ２を選択する。
【０１７６】
図１３を参照して、本実施の形態におけるスケジューラ４００によるスケジューリングの例を説明する。なお、図１３において、図７と同様に、スレッド選択信号ＴＳＥＬについて、細線枠はスレッドスケジューリングの結果を示し、実線の太線枠は、再スケジューリングの結果を示す。さらに、点線の太線枠は、復旧スケジューリングの結果を示す。なお、スケジューラ４００では、ハードウェアスレッドＡ毎の浪費回数がカウントされないが、スケジューラ４００がカウントするグループ浪費回数と比較するために、図１３において、点線の細線枠によりハードウェアスレッドＡ毎の浪費回数を示している。
【０１７７】
図１３に示すように、第１の循環周期（サイクルＴ１〜Ｔ４）において、スレッドスケジューリングにより、ハードウェアスレッドＡ１、ハードウェアスレッドＢ、ハードウェアスレッドＡ２、ハードウェアスレッドＢの順に夫々のハードウェアスレッドが指定され、実行される。
【０１７８】
サイクルＴ５では、スロットＳＬＴ０が選択され、第１のスケジューラ２１０から実時間ビット信号ＲＥＡＬ０と第１の番号ＳＮ１として、「１」と「０」（Ａ１）が出力される。しかし、ハードウェアスレッドＡ１が実行不可であるため、再スケジューリングが行われ、セレクタ２５０から、スレッド選択信号ＴＳＥＬとして、ハードウェアスレッドＢを示す第２の番号ＳＮ２が出力される。
【０１７９】
また、該サイクルにおいて、再スケジューリングがなされたため、信号ＵＰが「１」となり、グループ浪費カウンタ４２２のカウント値（グループ浪費回数）は、カウントアップにより０から１になる。
【０１８０】
第２の循環周期のサイクルＴ６〜Ｔ８までは、スレッドスケジューリングにより、ハードウェアスレッドＢ、ハードウェアスレッドＡ２、ハードウェアスレッドＢが順次指定される。
【０１８１】
サイクルＴ６において、スレッドスケジューリングによりハードウェアスレッドＢが指定され、グループ浪費回数が１である。しかし、ハードウェアスレッドＡ１とハードウェアスレッドＡ２のいずれも実行不可であるため、復旧スケジューリングはなされない。
【０１８２】
サイクルＴ７において、スロットＳＬＴ２が選択され、第１の番号ＳＮ１がハードウェらスレッドＡ２を示すが、ハードウェアスレッドＡ２が実行不可であるため、再スケジューリングが行われる。その結果、セレクタ２５０から、スレッド選択信号ＴＳＥＬとして、ハードウェアスレッドＢを示す第２の番号ＳＮ２が出力され、信号ＵＰが再び「１」になり、グループ浪費回数は、１から２になる。
【０１８３】
なお、サイクルＴ８において、スレッドスケジューリングによりハードウェアスレッドＢが指定され、グループ浪費回数が２である。しかし、ハードウェアスレッドＡ１とハードウェアスレッドＡ２のいずれも実行不可であるため、復旧スケジューリングはなされない。
【０１８４】
第３の循環周期に入り、サイクルＴ９において、スレッドスケジューリングによりハードウェアスレッドＡ１が指定される。しかし、ハードウェアスレッドＡ１が相変わらず実行不可であるため、再スケジューリングがなされ、ハードウェアスレッドＡ１からハードウェアスレッドＢへの指定の変更が行われ、信号ＵＰが再び「１」になり、グループ浪費回数は、２から３になる。
【０１８５】
サイクルＴ１０において、スレッドスケジューリングによりハードウェアスレッドＢが指定される。しかし、グループ浪費回数が「３」であり、かつ、ハードウェアスレッドＡ１が実行可能になったため、復旧スケジューリングがなされ、ハードウェアスレッドＢからハードウェアスレッドＡ１への指定の変更がなされる。同時に、実時間ビット信号ＲＥＡＬ２（ＤＯＷＮ）が「１」となり、グループ浪費回数は、３から２になる。
【０１８６】
サイクルＴ１１において、スレッドスケジューリングによりハードウェアスレッドＡ２が指定される。しかし、ハードウェアスレッドＡ２が相変わらず実行不可であるため、再スケジューリングがなされ、ハードウェアスレッドＡ２からハードウェアスレッドＢへの指定の変更が行われ、信号ＵＰが再び「１」になり、グループ浪費回数は、２から３になる。
【０１８７】
サイクルＴ１２において、スレッドスケジューリングによりハードウェアスレッドＢが指定される。しかし、グループ浪費回数が「３」であり、かつ、ハードウェアスレッドＡ１が実行可能になったため、復旧スケジューリングがなされ、ハードウェアスレッドＢからハードウェアスレッドＡ１への指定の変更がなされる。同時に、実時間ビット信号ＲＥＡＬ２（ＤＯＷＮ）が再び「１」になり、グループ浪費回数は、３から２になる。
【０１８８】
このようにして、スケジューラ４００によれば、再スケジューリングまたは復旧スケジューリングが発生した循環周期では、ハードウェアスレッドＡ、Ｂの実行回数の比が設計通りの「２：２」ではない。しかし、複数の循環周期を通してみれば、ハードウェアスレッドＡ、Ｂの実行回数の比は、設計通りの「２：２」になる。
【０１８９】
＜第４の実施の形態＞
第４の実施の形態の前に、まず、図１４を参照して、図８に示すスケジューラ３００によるスケジューリングの別の一例を示す。
【０１９０】
図１４に示す例は、サイクルＴ９〜Ｔ１２において、ハードウェアスレッドＡ２が実行不可になり、サイクルＴ１１〜Ｔ１２において、実行可能なハードウェアスレッドＢがない点において、図１０が示す例と異なる。
【０１９１】
サイクルＴ１〜Ｔ９までは、図８に示すスケジューラ３００により、図１０に示す例と同様なスケジューリングがなされる。
【０１９２】
サイクルＴ１０において、スレットスケジューリングによりハードウェアスレッドＢが指定されるが、ハードウェアスレッドＡ１の浪費回数が２であり、かつ、ハードウェアスレッドＡ１が実行可能であるため、復旧スケジューリングにより、ハードウェアスレッドＢの代わりにハードウェアスレッドＡ１が指定される。同時に、ハードウェアスレッドＡ１の浪費回数は、２から１になる。
【０１９３】
サイクルＴ１１において、スレッドスケジューリングによりハードウェアスレッドＡ２が指定されるものの、ハードウェアスレッドＡ２が実行不可であるため、再スケジューリングによりハードウェアスレッドＢが指定される。同時に、ハードウェアスレッドＡ２の浪費回数は、０から１になる。
【０１９４】
しかし、該サイクルでは、実行可能なハードウェアスレッドＢがない。従って、「ＩＤ」ステージの実行スロットが空になってしまう。
【０１９５】
サイクルＴ１２において、スレッドスケジューリングによりハードウェアスレッドＢが指定されるが、実行可能なハードウェアスレッドＡ１の浪費回数が１であるため、復旧スケジューリングにより、ハードウェアスレッドＡ１が指定される。同時に、ハードウェアスレッドＡ１の浪費回数は、１から０になる。
【０１９６】
図１４から分かるように、実行可能なハードウェアスレッドＢが無いときに再スケジューリングをしたことに起因して、実行スロットに空が生じる。
【０１９７】
第４の実施の形態のスケジューラは、図８に示すスケジューラ３００に対して、復旧スケジューリングとして、第２のグループ内のハードウェアスレッドの実行時間を第１のグループ内のハードウェアスレッドに融通すると共に、第１のグループ内のハードウェアスレッド同士間でも、実行時間を融通するように変更したものである。
【０１９８】
つまり、第４の実施の形態のスケジューラは、原則として、予め設定されたスケジュールを繰り返すスレッドスケジューリングを行う。そして、スレッドスケジューリングによりハードウェアスレッドＡを指定するものの、該ハードウェアスレッドＡが実行不能であるときに、他のハードウェアスレッドＡの浪費回数と状態に応じて、再スケジューリングと復旧スケジューリングのいずれか一方を行う。
【０１９９】
例えば、スレッドスケジューリングにより、実行不可であるハードウェアスレッドＡ１が指定されたとする。この場合、第４の実施の形態のスケジューラは、ハードウェアスレッドＡ２の浪費回数が０であるときには、再スケジューリングを行い、ハードウェアスレッドＢを指定する。一方、ハードウェアスレッドＡ２の浪費回数が１以上であり、かつ、ハードウェアスレッドＡ２が実行可能であるときには、第４の実施の形態のスケジューラは、ハードウェアスレッドＡ２に対して復旧スケジューリングを行い、ハードウェアスレッドＡ２を指定する。
【０２００】
なお、スレッドスケジューリングによりハードウェアスレッドＢが指定されたときは、スケジューラ３００と同様に、浪費回数が１以上であるハードウェアスレッドＡがあり、かつ、該ハードウェアスレッドＡが実行可能であれば、復旧スケジューリングを行い、該ハードウェアスレッドＡを、スレッドスケジューリングにより指定されたハードウェアスレッドＢの代わりに指定する。
【０２０１】
なお、第４の実施の形態のスケジューラは、スケジューラ３００の回路構成を変更することで容易に実現することができるため、ここで、第４の実施の形態のスケジューラの具体的な回路構成の例の説明を省略する。
【０２０２】
図１５は、スケジューラ３００によるスケジューリングの例と比較するための、第４の実施の形態のスケジューラによるスケジューリングの例を示す。
【０２０３】
図１５に示すように、サイクルＴ１０までは、本第４の実施の形態のスケジューラによるスケジューリングの結果と、スケジューラ３００によるスケジューリングの結果が同様である。
【０２０４】
サイクルＴ１１において、スケジューラ３００は、再スケジューリングを行い、ハードウェアスレッドＡ２の代わりにハードウェアスレッドＢを指定する。対して、第４の実施の形態のスケジューラは、ハードウェアスレッドＡ１の浪費回数が１であり、かつ、ハードウェアスレッドＡ１が実行可能であるため、再スケジューリングの代わりに復旧スケジューリングを行い、ハードウェアスレッドＡ２の代わりにハードウェアスレッドＡ１を指定する。
【０２０５】
その結果、スケジューラ３００より、浪費回数が１以上のハードウェアスレッドＡに対して、早めに復旧スケジューリングを行うことができる。
【０２０６】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は既に述べた実施の形態に限定されるものではなく、その要旨を逸脱しない範囲において種々の増減、変更が可能であることはいうまでもない。
【０２０７】
スレッドスケジューリングは、設計者が設計した通りのスケジューリングである。そのため、再スケジューリングの回数が多いことは、スケジューリングが設計から頻繁に外れることを意味する。そのため、例えば、図８に示すスケジューラ３００に対して、いずれか１つのハードウェアスレッドＡの浪費回数（スレッド浪費カウンタＷＣＮ１のカウント値とスレッド浪費カウンタＷＣＮ２のカウント値のいずれか一方）、または、全てのハードウェアスレッドＡの浪費回数の総和が閾値に到達したときに、外部に警告を出す機能を追加することが好ましい。このような警告がなされることにより、設計者は、異常に気付き、設計の見直しなどが可能になる。なお、警告に関しては、例えばＣＰＵに対して割込みを発生させるなどの手法が考えられる。
【０２０８】
勿論、図１１に示すスケジューラ４００に対しても同様に、グループ浪費回数（グループ浪費カウンタ４２２のカウント値）が閾値に到達したときに、外部に警告を出す機能を追加してもよい。
【０２０９】
また、再スケジューリングが必要な状況、すなわちスレッドスケジューリングにより指定された第１のグループのハードウェアスレッドが実行不可である状況は、該ハードウェアスレッドがＩ／Ｏ待ちなどで予期した時間内でそのステージの処理を完了しない場合に発生する。マルチスレッドプロセッサにおけるハードウェアスレッドの数が少ないなどのときに、このような状況をある程度予想することができる。そのため、スレッドスケジューリングの元となるスケジュールを設計する際に、このような状況の発生を予想し、Ｉ／Ｏ待ちの時間などを考慮したスケジュールを設計することも可能である。このような場合にも対応可能になるように、例えば、スケジューラ３００のスレッド浪費カウンタＷＣＮ１とスレッド浪費カウンタＷＣＮ２や、スケジューラ４００のグループ浪費カウンタ４２２を、カウント動作の許可と禁止を、対象プログラムの動作前に動的に変更可能であるように構成することが好ましい。
【０２１０】
こうすることにより、動作する回路を減らすことができ、ひいては処理速度を速め、消費電力を削減することができる。
【０２１１】
なお、上記警告機能のための閾値の設定や、浪費カウンタまたはグループ浪費カウンタの動作を禁止するか否かの設定を可能にするためには、例えば、それらの用途に応じたレジスタを設ければよい。
【０２１２】
また、上述した各実施の形態において、例として、スレッドのグループ分けが、実時間スレッドであるか否かに応じてなされているが、スレッドのグループ分けの手法がこの例に限定されないことは、言うまでも無い。
【符号の説明】
【０２１３】
１００  プロセッサシステム
１１０  メモリ
１２０  システムバス
１３０  マルチスレッドプロセッサ
１４０  演算回路
１４２  命令デコーダ
１４４  実行ユニット
１４６  データレジスタ
１５０  割込コントローラ
１５２  ＰＣ生成回路
１５４  セレクタ
１５６  命令メモリ
１５８  命令バッファ
１６０  パイプライン制御回路
１６２  命令フェッチコントローラ
１６４  セレクタ
２００  スケジューラ
２１０  第１のスケジューラ
２１１  スレッド制御レジスタ
２１２  カウンタ
２１３  カウンタ最大値格納部
２１４  比較回路
２１５  セレクタ
２２０  再スケジューラ
２２２  セレクタ
２３０  スレッド状態管理ユニット
２４０  第２のスケジューラ
２５０  セレクタ
３００  スケジューラ
３２０  第１の復旧スケジューラ
３２１  インバータ
３２２  ＡＮＤ回路
３２３  カウンタ更新部
３２４  復旧スケジューラコア
３２５  ＯＲ回路
４００  スケジューラ
４２０  第２の復旧スケジューラ
４２１  カウンタ更新部
４２２  グループ浪費カウンタ
４２４  復旧スケジューラコア
ａ、ｂ  データ
ＢＦＦ０〜ＢＦＦ４  命令バッファ領域
ＣＮＴ  カウント値
ＣＮＴＭ  カウント最大値
ＩＭａｄｄ  命令フェッチアドレス
Ｒａｄｄ  データレジスタアドレス
Ｗａｄｄ  データレジスタアドレス
ＲＥＡＬ０〜ＲＥＡＬ４  実時間ビット信号
ＲＳＴ  リセット信号
ＳＣ  演算制御信号
ＳＬＴ０〜ＳＬＴ７  スロット
ＳＮ１  第１の番号
ＳＮ２  第２の番号
ＳＮ３  第３の番号
ＳＮ４  第４の番号
ＳＴＡ  状態信号
ＴＰＣ０〜ＴＰＣ４  スレッドプログラムカウンタ
ＴＳＥＬ  スレッド選択信号
ＷＣＮ１  スレッド浪費カウンタ
ＷＣＮ２  スレッド浪費カウンタ
【図１】
2014081847.tif 000003
【図２】
2014081847.tif 000004
【図３】
2014081847.tif 000005
【図４】
2014081847.tif 000006
【図５】
2014081847.tif 000007
【図６】
2014081847.tif 000008
【図７】
2014081847.tif 000009
【図８】
2014081847.tif 000010
【図９】
2014081847.tif 000011
【図１０】
2014081847.tif 000012
【図１１】
2014081847.tif 000013
【図１２】
2014081847.tif 000014
【図１３】
2014081847.tif 000015
【図１４】
2014081847.tif 000016
【図１５】
2014081847.tif 000017