実施の形態1
以下、図面を参照して本発明の実施の形態について説明する。図1に本実施の形態にかかるマルチスレッドプロセッサ1を含むプロセッサシステムのブロック図を示す。本実施の形態にかかるプロセッサシステムでは、システムバスを介してマルチスレッドプロセッサ1とメモリ2が接続される。なお、図示はしていないが、システムバスには、入出力インタフェースなどの他の回路も接続されるものとする。
まず、本実施の形態にかかるマルチスレッドプロセッサ1について説明する。マルチスレッドプロセッサ1は、複数のハードウェアスレッドを備える。ハードウェアスレッドは、スレッドプログラムカウンタ、命令メモリ、汎用レジスタ、及び制御レジスタ(本実施の形態ではパイプライン制御回路16に内蔵されるものとする)等の回路群により構成される。そして、ハードウェアスレッドとは、マルチスレッドプロセッサ1に内蔵されるスレッドプログラムカウンタにより出力される命令フェッチアドレスに従って命令メモリから読み出される一連の命令群により構成される命令流を生成する系のことをいう。つまり、1つのハードウェアスレッドにより生成される命令流に含まれる命令は、互いに関連性の高い命令である。本実施の形態では、マルチスレッドプロセッサ1が複数のスレッドプログラムカウンタを備えることでその数に応じた数のハードウェアスレッドが実装される。以下では、マルチスレッドプロセッサ1についてさらに詳細に説明する。
図1に示すようにマルチスレッドプロセッサ1は、演算回路10、割り込みコントローラ11、PC生成回路12、スレッドプログラムカウンタTPC0〜TPC3、セレクタ13、18、命令メモリ14、命令バッファ15、パイプライン制御回路16、命令フェッチコントローラ17、スレッドスケジューラ19を有する。
演算回路10は、セレクタ18によって選択されたハードウェアスレッドが生成する命令に基づき演算処理を実行する。より具体的には、演算回路10は、命令デコーダ21、実行ユニット22、データレジスタ23を有する。命令デコーダ21は受信した命令をデコードして、実行ユニット22に対して演算制御信号SCを出力する。また、命令デコーダ21は、命令のデコード結果に基づきデータの格納位置を示すデータレジスタアドレスRaddの出力を行う。実行ユニット22は、演算制御信号SCに応じて各種の演算を実行する。なお、実行ユニット22は、複数の実行ステージを有し、パイプライン処理により演算を行う。また、実行ユニット22において実行された演算結果は、その演算結果の種類に応じてPC生成回路12、メモリ2、データレジスタ23に送信される。データレジスタ23は、実行ユニット22において用いられるデータが格納される。そして、データレジスタ23は、データレジスタアドレスRaddにより指定したアドレスのデータを出力する。図1に示す例では、データレジスタ23は、データレジスタアドレスRaddに応じてデータaとデータbとを出力する形態となる。また、データレジスタ23は、データレジスタアドレスRaddにより指定されるアドレスに実行ユニット22が出力する演算結果を格納する。
割り込みコントローラ11は、割り込み要求信号を受けて、マルチスレッドプロセッサ1内に割り込み処理の実行を指示する割り込み指示信号を出力する。より具体的には、割り込みコントローラ11は、割り込み要求信号を受信すると、割り込み要因や割り込み処理の優先度等を判定し、当該割り込み要因に関連した処理を行うようにPC生成回路12及びパイプライン制御回路16に割り込み処理の実行を指示する。この割り込み要求は、マルチスレッドプロセッサ1が出力するものの他に、マルチスレッドプロセッサ1以外の回路からも出力される。
PC生成回路12は、システムバスを介して入力される新たなプログラム命令信号、割り込みコントローラ11が出力する割り込み指示信号及び実行ユニット22における処理に基づき出力される分岐指示信号を受けて、プログラムカウント更新値を生成する。そして、PC生成回路12は、プログラムカウント更新値をスレッドプログラムカウンタTPC0〜TPC3のいずれかに与える。なお、PC生成回路12は、生成したプログラムカウント更新値をいずれのスレッドプログラムカウンタに与えるかを判断する機能も有する。
スレッドプログラムカウンタTPC0〜TPC3は、処理すべき命令が格納される命令メモリ14のアドレス(このアドレスを命令フェッチアドレスIMaddと称す)を生成する。また、スレッドプログラムカウンタTPC0〜TPC3は、PC生成回路12からプログラムカウント更新値が与えられた場合は、命令フェッチアドレスIMaddをプログラムカウント更新値に応じて更新する。一方、スレッドプログラムカウンタTPC0〜TPC3は、プログラムカウント更新値の入力がない場合は、アドレスを昇順に計算し、連続する次の命令フェッチアドレスを算出する。なお、図1においては、スレッドプログラムカウンタの数を4つとしたが、プログラムスレッドカウンタの数は、マルチスレッドプロセッサの仕様に応じて任意に設定することができる。
セレクタ13は、命令フェッチコントローラが出力するスレッド指定信号に応じてスレッドプログラムカウンタTPC0〜TPC3のうちいずれか1つを選択し、選択したスレッドプログラムカウンタが出力する命令フェッチアドレスIMaddを出力する。なお、図1のセレクタ13において入力端子に0〜4の数字を付したが、この数字は、ハードウェアスレッドの番号を示すものである。
命令メモリ14は、複数のハードウェアスレッドにより共通して用いられるメモリ領域である。命令メモリ14は、マルチスレッドプロセッサ1において実行される演算で用いられる各種命令が格納される。そして、命令メモリ14は、セレクタ13を介して入力される命令フェッチアドレスIMaddにより指定された命令を出力する。このとき、命令メモリ14は、セレクタ13がスレッドプログラムカウンタTPC0〜TPC3のいずれが出力した命令フェッチアドレスIMaddであるかを判別し、判別結果に応じて命令の出力先を振り分ける。本実施の形態では、命令バッファ15は、スレッドプログラムカウンタTPC0〜TPC3に対応した命令バッファ領域BUF0〜BUF3を有する。そこで、命令メモリ14は、命令フェッチアドレスIMaddの出力元に応じて命令バッファ領域BUF0〜BUF3のいずれかに読み出された命令を振り分ける。なお、命令メモリ14は、メモリ2に含まれる所定のメモリ領域であっても良い。また、命令バッファ領域BUF0〜BUF3は、FIFO(First In First Out)形式のバッファ回路である。また、命令バッファ領域BUF0〜BUF3は、1つのバッファ内において領域分割されたものでも良く、分離された領域に形成されたものであっても良い。
パイプライン制御回路16は、命令バッファ15の先頭に格納された命令と実行ユニット22において実行されている命令とをモニタする。そして、パイプライン制御回路16は、割り込みコントローラ11から割り込み指示信号が入力された場合には、割り込み処理に関係するハードウェアスレッドに属する命令を廃棄する指示を命令バッファ15及び実行ユニット22に対して行う。また、パイプライン制御回路16は、命令バッファ15の先頭に格納された命令と実行ユニット22において実行されている命令との依存関係を確認する。そして、命令間の依存関係が高いと判断した場合は、その命令が属するハードウェアスレッドのハードウェアスレッド番号を通知するマスク信号MSKを出力する。
命令フェッチコントローラ17は、命令バッファ15に格納されている命令の個数に応じていずれのハードウェアスレッドに属する命令をフェッチすべきかを判断し、その判断結果に基づきスレッド指定信号を出力する。例えば、命令フェッチコントローラ17は、命令バッファ領域BUF0に格納される命令キューの数が他の命令バッファ領域に格納される命令キューの数よりも少なければ、0番のハードウェアスレッドに属する命令をフェッチすべきと判断し、0番のハードウェアスレッドを示すスレッド指定信号を出力する。これにより、セレクタ13は、スレッドプログラムカウンタTPC0を選択する。なお、命令フェッチコントローラ17は、ラウンドロビン方式による手順で選択するハードウェアスレッドを決定しても良い。
セレクタ18は、第1のセレクタとして機能するセレクタである。セレクタ18は、スレッドスケジューラ19が出力するスレッド選択信号TSELに応じて命令バッファ領域BUF0〜BUF3のいずれか1つを選択し、選択した命令バッファ領域から読み出した命令を演算回路10に出力する。つまり、セレクタ18は、スレッド選択信号TSELに応じて複数のハードウェアスレッドから1つのハードウェアスレッドを選択し、選択したハードウェアスレッドが出力する命令を演算回路10に出力する。なお、セレクタ18においても、入力端子に0〜4の数字を付したが、この数字は、ハードウェアスレッドの番号を示すものである。
スレッドスケジューラ19は、予め設定されたスケジュールに従って、複数のハードウェアスレッドのうち次の実行サイクルにおいて実行される1つのハードウェアスレッドを指定するスレッド選択信号TSELを出力する。つまり、スレッドスケジューラ19は、複数のハードウェアスレッドのどのような順序で処理するかをスケジュールにより管理し、そのスケジュールに沿った順序でハードウェアスレッドにより生成される命令が実行されるようにスレッド選択信号TSELを出力する。なお、本実施の形態にかかるマルチスレッドプロセッサ1では、このスケジュールをマルチスレッドプロセッサ1の起動の直後に実行される管理プログラムにより設定する。また、スレッドスケジューラ19は、パイプライン制御回路16からマスク信号MSKを受信した場合、受信したマスク信号MSKにより示されるハードウェアスレッド番号に該当するハードウェアスレッド以外のハードウェアスレッドを選択する。さらに、スレッドスケジューラ19は、命令デコーダ21からディスパッチ信号DPTを受信する。ディスパッチ信号DPTは、命令デコーダ21が処理(ディスパッチ)した命令が属するハードウェアスレッドの番号を通知するものである。
本実施の形態にかかるマルチスレッドプロセッサ1では、特にスレッドスケジューラ19において行われるハードウェアスレッドのスケジューリング方法に特徴を有する。以下では、スレッドスケジューラ19及びそのスケジューリングの方法について説明を行う。
図2にスレッドスケジューラ19のブロック図を示す。図2に示すように、スレッドスケジューラ19は、ディスパッチカウンタ30a〜30d、優先順位判定部31、スレッド番号選択部32、初期化判定部33を有する。なお、本実施の形態では、マルチスレッドプロセッサ1が4つのハードウェアスレッドを有すため、スレッドスケジューラ19は、4つのハードウェアスレッドの順序決定を行うための構成とするが、ハードウェアスレッドの個数を変更する場合は、ディスパッチカウンタの個数をハードウェアスレッドの個数に合わせれば良い。また、他の回路ブロックについてもディスパッチカウンタの個数に合わせてその構成を変更すれば良い。
ディスパッチカウンタ30a〜30dは、複数のハードウェアスレッドのうちのいずれか1つに対応して設けられる。ディスパッチカウンタ30a〜30dは、それぞれ、対応するハードウェアスレッドに対する優先順位に相当するディスパッチカウント値DCNT(図2におけるディスパッチカウント値DCNT0〜DCNT3を含む)を保持する。そして、ディスパッチカウンタ30a〜30dは、それぞれ、ディスパッチ信号DPTを受け、自ディスパッチカウンタに対応するハードウェアスレッドに属する命令の実行回数(ディスパッチ回数)をカウントする。より具体的には、ディスパッチカウンタ30a〜30dは、ディスパッチ信号DPTにより通知されるハードウェアスレッド番号を通知が対応するハードウェアスレッドを示すものである場合、ディスパッチカウント値DCNTをデクリメントする。このディスパッチカウント値DCNTの初期値は、マルチスレッドプロセッサ1の起動時に実行される管理プログラムにより設定される。また、ディスパッチカウント値DCNTの初期値は、管理プログラムによりメモリから読み出され、その読み出された値が設定されるものとする。
また、ディスパッチカウンタ30a〜30dには、マスク信号MSK(マスク信号MSK0〜MSK3を含む)と初期化信号CNTintが入力され、カウント現在値Vnow(カウント現在値Vnow0〜Vnow3を含む)を出力する。ディスパッチカウンタ30a〜30dは、対応するハードウェアスレッドに対応するマスク信号MSKが入力されるとディスパッチカウント値DCNTを最低優先順位(例えば0)とする。ディスパッチカウンタ30a〜30dは、初期化信号CNTintが入力されるとディスパッチカウント値DCNTを初期値にリセットする。なお、初期化信号CNTintは、初期化判定部33から出力される。ディスパッチカウンタ30a〜30dは、内部で保持するカウント値CNTに基づきディスパッチカウント値DCNTを出力するが、このカウント値CNTそのものの値をカウント現在値Vnowとして出力する。このディスパッチカウンタ30a〜30dの詳細な構成については後述する。
優先順位判定部31は、ディスパッチカウンタ30a〜30dが出力するディスパッチカウント値DCNTを参照し、最も高い優先順位を示すディスパッチカウント値DCNTを判定することで、最も高い優先順位のハードウェアスレッドを判定する。より具体的には、優先順位判定部31は、比較器34〜36を有する。比較器34〜36は、それぞれ、2つの値が入力され、2つの値のうち大きな値を選択して出力する。このとき比較器34〜36は、選択した値を出力したディスパッチカウンタの情報も合わせて出力する。また、比較器34〜36は、入力される2つの値が同じ値である場合、予め決められたルールに従いいずれか一方の値を選択して出力する。
より具体的には、比較器34は、ディスパッチカウンタ30aが出力するディスパッチカウント値DCNT0とディスパッチカウンタ30bが出力するディスパッチカウント値DCNT1とが入力され、2つのディスパッチカウント値のうち大きな値のディスパッチカウント値を高優先ハードウェアスレッド値M1として出力する。比較器35は、ディスパッチカウンタ30cが出力するディスパッチカウント値DCNT2とディスパッチカウンタ30dが出力するディスパッチカウント値DCNT3とが入力され、2つのディスパッチカウント値のうち大きな値のディスパッチカウント値を高優先ハードウェアスレッド値M2として出力する。比較器36は、比較器34が出力する高優先ハードウェアスレッド値M1と比較器35が出力する高優先ハードウェアスレッド値M2とが入力され、2つの高優先ハードウェアスレッド値のうち大きな値の高優先ハードウェアスレッド値を高優先ハードウェアスレッド値MAXとして出力する。なお、高優先ハードウェアスレッド値M1、M2、MAXには、その値を出力したディスパッカウンタを示す値が付加される。
スレッド番号選択部32は、優先順位判定部31が出力する高優先ハードウェアスレッド値MAXを出力したディスパッチカウンタに対応付けられたハードウェアスレッドを選択し、選択したハードウェアスレッドを示すハードウェアスレッド番号をスレッド選択信号TSELとして出力する。
初期化判定部33は、カウント現在値Vnow0〜Vnow3(ディスパッチカウント値DCNTを出力するためにディスパッチカウンタ内で保持されるカウント値CNT)を受けて、カウント現在値Vnow0〜Vnow3の組み合わせが予め設定された所定の条件を満たしたときに初期化信号CNTintを出力する。本実施の形態における所定の条件は、カウント現在値Vnow0〜Vnow3がすべて0となる条件であるものとする。
次に、ディスパッチカウンタ30a〜30dの構成について詳細に説明する。なお、ディスパッチカウンタ30a〜30dは同一の構成であるため、ディスパッチカウンタ30aを例にディスパッチカウンタの構成について説明する。ディスパッチカウンタ30aのブロック図を図3に示す。図3に示すように、ディスパッチカウンタ30aは、カウンタ初期設定値格納部40、カウント値格納部41、デクリメンタ42、第2のセレクタ(例えば、セレクタ43)を有する。
カウンタ初期設定値格納部40は、ディスパッチカウンタ30aが出力するディスパッチカウント値DCNTのカウンタ初期設定値INIT0を格納する。このカウンタ初期設定値INIT0は、管理プログラムによりメモリ2から読み出される値である。カウント値格納部41は、カウント値CNT0を格納する。また、カウント値格納部41は、初期化信号CNTintに応じてカウンタ初期設定値INIT0を読み出し、カウント値CNT0の初期値とする。このカウント値CNT0は、セレクタ43に対して出力される他、カウント現在値Vnow0として初期化判定部33に出力され、さらに、デクリメンタ42にも出力される。デクリメンタ42は、ディスパッチ信号DPT0が入力される度にカウント値CNT0をデクリメントする。そして、デクリメンタ42は、デクリメント後のカウント値を書き戻し値DCR0として出力し、書き戻し値DCR0によりカウント値CNT0を更新する。セレクタ43は、マスク信号MSKに応じて最低優先順位を示すマスク値(例えば0)とカウント値CNT0のいずれか一方を選択し、選択した値をディスパッチ信号DPT0として出力する。
ここで、マスク信号MSKについて説明する。マスク信号MSKは、パイプライン制御回路16が命令バッファ15の先頭に格納された命令と実行ユニット22において実行されている命令との依存関係を確認し、この命令間の依存関係が高いと判断した場合に出力される。そして、パイプライン制御回路16は、このマスク信号MSKにより、実行ユニット22において実行される命令の処理が十分に完了される前に実行ユニット22において実行されている命令と依存関係の高い命令が読み出されることを防止する。
このマスク信号MSKが出力される状態を説明するために、1つのハードウェアスレッドにおいて生成される命令群の一例を図4に示す。図4に示す命令群は、命令1〜命令3により構成され、このうち命令2と命令3の依存関係が高い例を示すものである。命令1は、レジスタa1の値とレジスタb1の値とを加算し、加算した結果得られた値をレジスタc1に格納する加算命令である。命令2は、メモリ2の0x0(a1)番地のアドレスのデータをレジスタd1にロードするロード命令である。命令3は、レジスタe1の値からレジスタd1の値を減算し、減算した結果をレジスタb1に格納する加算命令である。
そして、マスク信号MSKが出力されることなく、図4に示した命令群が続けて発行された場合に生じる問題を図5を用いて説明する。図5は、命令1〜3が続けて発行された場合における命令処理フローを示すタイミングチャートである。命令1〜3は、デコードステージID、実行ステージEX、書き戻しステージWBにより処理される。さらに、命令2には、メモリ2へのアクセスを実行するメモリアクセス待ちステージMMを有する。図5に示す例では、まず、命令1は、時刻P1においてデコードされ、時刻P2において処理され、時刻P3において演算の結果値をレジスタc1に書き戻す。続いて、命令2は、命令1よりも一時刻遅れた時刻P2においてデコードされ、時刻P3において処理され、時刻P4〜P6の期間にメモリアクセス待ちを行い、時刻P7において演算の結果値をレジスタd1に書き戻す。
また、命令3は、命令2よりも一時刻遅れた時刻P3においてデコードされ、時刻P4において処理され、時刻P5において演算の結果値をレジスタe1に書き戻す。ここで、この命令3の処理において参照されるレジスタd1の値は時刻P7まで待たなければ確定しない。そのため、時刻P5において命令3が読み出したレジスタd1の値は本来意図したものとは異なる値となり、命令3の演算が正しく行われない結果を招く。
このように、実行ユニット22で実行された命令の結果を後続の命令が利用する場合、パイプライン制御回路16は、命令間の依存関係が高いと判断し、マスク信号MSKを出力する。そして、パイプライン制御回路16は、先に実行ユニット22で実行されている命令の処理が完了し、後続の命令を実行できる十分な準備ができるまで、マスク信号MSKにより後続の命令の発行を防止する。
そこで、図5に示したタイミングチャートの処理においてマスク信号MSKが出力される場合の処理のタイミングチャートを図6に示す。図6に示すように、マスク信号MSKが出力される(マスク信号MSK=1となる)ことによって、命令3の実行ステージEXは、時刻P4〜P6の間待機の状態となり、時刻P7で実行される。これにより、命令2の書き戻しステージWBが行われる時刻P7を待って、命令3の実行ステージEXが行われる。これにより、命令3は、実行ステージEXにおいて本来意図した値をレジスタd1から読み出すことができる。
このように、パイプライン制御回路16は、マスク信号MSKを用いることで、実行ユニット22において各演算が正しく行われるように、1つのハードウェアスレッド内の命令発行タイミングを制御する。なお、命令間の依存関係は、メモリ2へのロード/ストア命令以外の命令においても存在する場合がある。
続いて、スレッドスケジューラ19を用いたマルチスレッドプロセッサ1の動作について説明する。図7に、マルチスレッドプロセッサ1の電源投入時から通常処理の開始までの動作の手順を示すフローチャートを示す。図7に示すように、マルチスレッドプロセッサ1は、電源が投入されるとまずハードウェアリセットにより回路の状態を初期化する(ステップS1)。続いて、マルチスレッドプロセッサ1は、シングルスレッドモードにおいて動作を開始する(ステップS2)。このシングルスレッドモードでは、例えば、スレッドプログラムカウンタTPC0、命令メモリ14、命令バッファ領域BUF0が活性化され、他のスレッドプログラムカウンタTPC1〜TPC3及び命令バッファ領域BUF1〜BUF3はスタンバイ状態のまま待機する。
そして、マルチスレッドプロセッサ1は、管理プログラムをメモリ2又は図示しない他の記憶装置から読み出し、管理プログラムを実行する(ステップS3)。その後、管理プログラムに従って、マルチスレッドプロセッサ1は、カウンタ初期設定値格納部40にカウンタ初期設定値INITを設定(ステップS4)する。そして、ディスパッチカウンタ30a〜30dは、カウント値格納部41に格納されるカウント値CNTをカウンタ初期設定値INITにより初期化(ステップS5)する。これらの各種レジスタの設定が完了すると、マルチスレッドプロセッサ1はマルチスレッドモードにて動作を開始する(ステップS6)。このシングルスレッドモードでは、例えば、スレッドプログラムカウンタTPC0〜TCP3、命令メモリ14、命令バッファ領域BUF0〜BUF3が活性化される。そして、マルチスレッドプロセッサ1は、マルチスレッドモードにて通常動作を開始する。
続いて、マルチスレッドプロセッサ1の通常動作時のスレッドスケジューラ19の動作について説明する。図8にスレッドスケジューラ19の通常動作時の動作を示すフローチャートを示す。なお、図8に示すフローチャートはディスパッチカウンタ30aの動作を中心に説明するものであるが、ディスパッチカウンタ30b〜30dも同様の動作となる。
図8に示すように、スレッドスケジューラ19は、まず、初期化判定部33において、カウント現在値Vnow0〜Vnow3が初期化条件を満たすか否かを判断する(ステップS10)。そして、ステップS10においてカウント現在値Vnow0〜Vnow3が初期か条件を満たすと判断された場合(ステップS10のYesの枝)、カウンタ初期設定値INIT0をカウント値CNT0とし、カウント値CNT0を初期化する(ステップS11)。一方、ステップS10においてカウント現在値Vnow0〜Vnow3が初期か条件を満たさないと判断された場合(ステップS10のNoの枝)、ステップS11の処理は行わずに次の処理に進む。
次のステップでは、対応するマスク信号MSK0の値が0か否かを判断する(ステップS12)。このとき、マスク信号MSK0が0であった場合(ステップS12のYesの枝)、ディスパッチカウンタ30aは、ディスパッチカウント値DCNTとしてカウント値CNT0の値を出力する(ステップS13)。一方、ステップS12においてマスク信号MSK0が1であった場合(ステップS12のNoの枝)、ディスパッチカウンタ30aは、ディスパッチカウント値DCNTとしてマスク値の値を出力する(ステップS14)。
次いで、スレッドスケジューラ19は、優先順位判定部31において、最も高い優先順位のディスパッチカウント値DCNTを出力しているディスパッチカウンタを判定し、高優先ハードウェアスレッド値MAXを出力する(ステップS15)。次いで、スレッドスケジューラ19は、スレッド番号選択部32において、高優先ハードウェアスレッド値MAXを出力するディスパッチカウンタに対応するハードウェアスレッドを選択し、選択したハードウェアスレッドを指定するスレッド選択信号TSELを出力する(ステップS16)。
次いで、マルチスレッドプロセッサ1は、スレッド選択信号TSELにより指定されたハードウェアスレッドに属する命令を実行し、実行された命令が属するハードウェアスレッドをディスパッチ信号DPTによりスレッドスケジューラ19に通知する。そして、ディスパッチカウンタ30aがディスパッチ信号DPT0を受け取った場合(ステップS17のYesの枝)には、ディスパッチカウンタ30aはカウント値CNT0をデクリメントする(ステップS18)。その後、スレッドスケジューラ19は、処理をステップS10に戻す。一方、ディスパッチカウンタ30aがディスパッチ信号DPT0を受け取らなかった場合(ステップS17のNoの枝)には、ディスパッチカウンタ30aはカウント値CNT0を更新しない。その後、スレッドスケジューラ19は、処理をステップS10に戻す。
続いて、スレッドスケジューラ19が選択するスレッド番号がどのように切り替わるかを説明する表を図9に示す。図9に示す例では、スレッドの切り替わりタイミングを一時刻としている。また、ディスパッチカウンタ30a〜30dのカウンタ初期設定値をそれぞれ3、4、2、1とした。また、図9に示す例では、マスク信号MSKが常に0を示すものとする。図9に示す例では、時刻t1を初期状態とし、この時刻t1を処理の開始時刻とする。
時刻t1では、ディスパッチカウント値DCNT0〜DCNT3はカウント値CNT0〜CNT3の値と同じ値となる。このとき、最大のディスパッチカウント値は、ディスパッチカウント値DCNT1が示す4である。そのため、スレッド番号選択部32は、ディスパッチカウント値DCNT1を出力するディスパッチカウンタ30bに対応する1番のハードウェアスレッドを示すスレッド選択信号TSELを出力する。そして、マルチスレッドプロセッサ1は、1番のハードウェアスレッドに属する命令を実行し、1番のハードウェアスレッドがディスパッチされたことを通知するディスパッチ信号DPT1を出力する。そのため、時刻t2では1番のハードウェアスレッドに対応するカウント値CNT1及びディスパッチカウント値DCNT1の値が1つデクリメントされる。
時刻t2では、ディスパッチカウント値DCNT0〜DCNT3はカウント値CNT0〜CNT3の値と同じ値となる。このとき、最大のディスパッチカウント値は、ディスパッチカウント値DCNT0及びディスパッチカウント値DCNT1が示す3である。このような場合、優先順位判定部31の比較器34は、より番号の小さなハードウェアスレッドに対応したディスパッチカウンタが出力するディスパッチカウント値を出力する。そのため、スレッド番号選択部32は、ディスパッチカウント値DCNT0を出力するディスパッチカウンタ30aに対応する0番のハードウェアスレッドを示すスレッド選択信号TSELを出力する。そして、マルチスレッドプロセッサ1は、0番のハードウェアスレッドに属する命令を実行し、0番のハードウェアスレッドがディスパッチされたことを通知するディスパッチ信号DPT0を出力する。そのため、時刻t3では0番のハードウェアスレッドに対応するカウント値CNT0及びディスパッチカウント値DCNT0の値が1つデクリメントされる。
以降、時刻t3〜t10においては、カウント値CNT及びディスパッチカウント値DCNTに応じて上記のような動作を繰り返す。そして、時刻t10の処理が行われることで、カウント値CNT0〜CNT3の値がすべて0になる。そのため、時刻t10の経過後に初期化判定部33による初期化処理が行われ、時刻t11のスレッドスケジューラ19の状態は時刻t1の状態にリセットされる。
続いて、スレッドスケジューラ19が選択するスレッド番号がどのように切り替わるかを説明する別の例を示す表を図10に示す。図10に示す例は、図9に示す例においてマスク信号MSKが1になる期間がある場合である。図10に示す例では時刻t1で選択された1番のハードウェアスレッドが実行されることで時刻t2〜t4において1番のハードウェアスレッドに対応するマスク信号MSK1が1となる。そのため、時刻t2〜t4の期間は1番のハードウェアスレッドの優先順位を示すディスパッチカウント値DCNT1が0(最低優先順位)となる。そのため、時刻t2〜t4の期間におけるスレッドスケジューラ19は、1番のハードウェアスレッド以外のハードウェアスレッドをそのときのディスパッチカウント値DCNTに応じて選択する。
また、図10に示す例では、時刻t12で選択された0番のハードウェアスレッドが実行されることで時刻t13〜t14において0番のハードウェアスレッドに対応するマスク信号MSK0が1となる。そのため、時刻t12〜t13の期間は0番のハードウェアスレッドの優先順位を示すディスパッチカウント値DCNT0が0(最低優先順位)となる。そのため、時刻t13〜t14の期間におけるスレッドスケジューラ19は、0番のハードウェアスレッド以外のハードウェアスレッドをそのときのディスパッチカウント値DCNTに応じて選択する。
また、図10に示す例では、時刻t13で選択された1番のハードウェアスレッドが実行されることで時刻t14〜t15において1番のハードウェアスレッドに対応するマスク信号MSK1が1となる。そのため、時刻t13〜t13の期間は1番のハードウェアスレッドの優先順位を示すディスパッチカウント値DCNT1が0(最低優先順位)となる。そのため、時刻t14〜t15の期間におけるスレッドスケジューラ19は、1番のハードウェアスレッド以外のハードウェアスレッドをそのときのディスパッチカウント値DCNTに応じて選択する。つまり、時刻t14の期間は0番のハードウェアスレッド及び1番のハードウェアスレッドが選択肢から除外される。
上記説明より、本実施の形態にかかるマルチスレッドプロセッサ1において用いられるスレッドスケジューラ19は、各ハードウェアスレッドに対応した優先順位をディスパッチカウント値DCNTとして有する。そして、スレッドスケジューラ19は、ハードウェアスレッドの優先順位に応じていずれか1つのハードウェアスレッドを選択し、選択したハードウェアスレッドを示すスレッド選択信号TSELを出力する。さらに、スレッドスケジューラ19は、選択したハードウェアスレッドが実行されたことをディスパッチ信号DPTにより認識し、ディスパッチ信号DPTに応じてハードウェアスレッドの優先順位を更新する。より具体的には、スレッドスケジューラ19は、最も高い優先順位のハードウェアスレッドを選択し、選択したハードウェアスレッドを示すスレッド選択信号TSELを出力する。そして、スレッドスケジューラ19は、選択したハードウェアスレッドが実行されたことをディスパッチ信号DPTにより認識し、ディスパッチ信号DPTに応じてハードウェアスレッドの優先順位を下げる。
これにより、本実施の形態にかかるスレッドスケジューラ19は、初期状態において高い優先順位のハードウェアスレッドを優先的に選択しながら、その後も高い優先順位を維持させることがない。そのため、スレッドスケジューラ19は、初期状態において優先順位の高いハードウェアスレッドを実行しながら他のハードウェアスレッドの実行期間も確保することができる。つまり、本実施の形態にかかるスレッドスケジューラ19を用いたマルチスレッドプロセッサ1は、複数の優先順位を有するハードウェアスレッドを交互に実行しながら、優先順位の高いハードウェアスレッドに対してはより多くの処理時間を割り当てることができる。言い換えると、本実施の形態にかかるマルチスレッドプロセッサ1は、ハードウェアスレッドの優先順位の初期状態に関わりなく複数のハードウェアスレッドを滞りなく実行することができる。
図9において示した例について説明すると、初期状態において高い優先度を有する1番のハードウェアスレッドは、時刻t1〜t10の期間のうち40%の処理時間を有し、他のハードウェアスレッドよりも多くの処理時間を確保する。このとき、本実施の形態にかかるマルチスレッドプロセッサ1では、1番のハードウェアスレッドの実行時間が続くことなく、1番のハードウェアスレッドと他のハードウェアスレッドが交互に実行される。つまり、本実施の形態にかかるマルチスレッドプロセッサ1では、処理時間がいずれか1つのハードウェアスレッドの時間に偏ることなく、複数のハードウェアスレッドが滞りなく実行される。
また、本実施の形態にかかるマルチスレッドプロセッサ1では、実行ユニット22の実行ステージの利用効率(又は、パイプラインの利用効率)を高めることができる。より具体的には、本実施の形態にかかるスレッドスケジューラ19は、パイプラインの状態に起因して本来予定していたハードウェアスレッドを選択できない場合、パイプラインの状態をマスク信号MSKにより認識する。そして、スレッドスケジューラ19は、マスク信号MSKにより通知されたハードウェアスレッドとは異なるハードウェアスレッドを選択する。これにより、パイプラインに空きステージが生じる可能性がある箇所に他のハードウェアスレッドに属する命令を与えることができるため、本実施の形態にかかるマルチスレッドプロセッサ1ではパイプラインの利用効率を高めることができる。
実施の形態2
実施の形態2にかかるマルチスレッドプロセッサ1aのブロック図を図11に示す。図11に示すようにマルチスレッドプロセッサ1aは、実施の形態1におけるスレッドスケジューラ19をスレッドスケジューラ19の変形例となるスレッドスケジューラ19aに置き換えたものである。そのため、以下の説明では、スレッドスケジューラ19aを中心に説明し、他の構成要素の説明は省略する。
図12にスレッドスケジューラ19aのブロック図を示す。図12に示すように、スレッドスケジューラ19aは、第3のセレクタ(例えば、セレクタ50)、第1のスレッドスケジューラ19、第2のスレッドスケジューラ51を有する。セレクタ50は、実時間ビット信号の信号レベルに応じて第1のスレッドスケジューラ19が出力する第1のスレッド選択信号TSELaと第2のスレッドスケジューラ51が出力する第1のスレッド選択信号TSELbとのいずれか一方を選択して、選択したスレッド選択信号を第1のセレクタ18に与えるスレッド選択信号TSELとして出力する。なお、第1のスレッド選択信号TSELaは、実施の形態1において説明したスレッド選択信号TSELと同じものである。ここでは、スレッド選択信号を区別するために、便宜的に第1のスレッドスケジューラ19が出力するスレッド選択信号を第1のスレッド選択信号TSELaと称す。第1のスレッドスケジューラは、実施の形態1におけるスレッドスケジューラ19と同じものであるため、ここでは説明を省略する。
第2のスレッドスケジューラ51は、第1の実行期間と第2の実行期間とを切り替える選択信号(例えば、実時間ビット信号)を出力すると共に、実時間ビット信号が第1の実行期間を指定している期間において予め設定された実行順序で実行されるハードウェアスレッドを指定する第1のハードウェアスレッド番号(例えば第2のスレッド選択信号TSELb)を出力する。ここで、第1の実行期間とは、後述する実時間ビット信号が1である期間であり、第2の実行期間とは、後述する実時間ビット信号が0である期間をいう。また、第1の実行期間においては、選択されるハードウェアスレッド番号が予め設定されており、第2の実行期間においては、選択されるハードウェアスレッド番号が例えば、第1のスレッドスケジューラ19により任意に設定される。この第2のスレッドスケジューラ51は、スレッド制御レジスタ52、カウンタ53、カウント最大値格納部54、一致比較回路55、セレクタ56を有する。
スレッド制御レジスタ52は、複数のスロット(例えば、スロットSLT0〜SLT7)を備える。このスロットの構成を図13に示す。図13に示すように、スロットSLT0〜SLT7は、それぞれハードウェアスレッド番号HWTが格納される番号格納部と、当該スロットが選択された場合における実時間ビット信号の論理レベルを決定する期間属性設定フラグ(例えば実時間ビットRT)が格納される実時間ビット格納部とを有する。
カウンタ53は、所定の間隔でカウント値CNTを更新する。より具体的には、本実施の形態におけるカウンタ53は、図示しないマルチスレッドプロセッサ1の動作クロックに同期してカウント値CNTaをカウントアップする。カウント最大値格納部54は、カウンタ53のカウント値CNTaの上限値を定めるカウント最大値CNTMを格納する。一致比較回路55は、カウント値CNTaとカウント最大値CNTMとを比較し、カウント値CNTとカウント最大値CNTMが一致した場合に、カウンタ53のカウント値CNTaをリセットするリセット信号RSTを出力する。つまり、カウンタ53は、所定の周期でカウント値CNTaを初期化しながら、カウントアップ動作を繰り返すことで、循環的に値が更新されるカウント値CNTaを出力する。
セレクタ56は、カウント値CNTaに応じてスレッド制御レジスタ52内のスロットの1つを選択し、選択したスロットに格納される値に基づき実時間ビット信号と第2のスレッド選択信号TSELbを出力する。より具体的には、セレクタ56は、カウント値CNTaが0であればスロットSLT0を選択し、スロットSLT0の番号格納部に格納されたハードウェアスレッド番号を第2のスレッド選択信号TSELbとし、スロットSLT0の実時間ビット格納部に格納される実時間ビットRTの値を実時間ビット信号の論理レベルとする。
なお、第2のスレッドスケジューラ51のスレッド制御レジスタ52のスロットに格納される値、カウンタ53のカウント値CNTaの初期値、カウント最大値格納部54のカウント最大値CNTMは、マルチスレッドプロセッサ1の起動時に実行される管理プログラムにより設定される。また、管理プログラムは、メモリ2からこれら設定値を読み込むものとする。
次に、通常動作開始後のスレッドスケジューラ19aの動作について説明する。まず、第2のスレッドスケジューラ51のみの動作について説明する。なお、以下の説明では、設定の一例として、カウンタ53のカウント値CNTの初期値を0、カウント最大値CNTMを4とする。また、スレッド制御レジスタ52のスロットの各値は、スロットSLT0〜SLT2、SLT4、SLT5、SLT7の実時間ビットを1とし、スロットSLT3、SLT6の実時間ビットを0とする。さらに、スロットSLT0、SLT2、SLT5、SLT7のハードウェアスレッド番号を0、スロットSLT1、SLT4のハードウェアスレッド番号を1、スロットSLT3のハードウェアスレッド番号を2とする。
上記条件において第2のスレッドスケジューラ51が出力する第2のスレッド選択信号TSELbが選択するハードウェアスレッド番号を図14の表に示す。図14の表では、第2のスレッドスケジューラ51が選択するハードウェアスレッドを切り替える一タイミングを一時刻とし、時刻の経過と共に第2のスレッド選択信号TSELbがどのように切り替わるかを示した。
図15に示すように、まず時刻t1におけるカウント値CNTが0とすると、セレクタ56は、スロットSLT0を選択する。従って、セレクタ56は、実時間ビット信号の論理レベルを1とし、第2のスレッド選択信号TSELbを0番とする。続いて、時刻t2ではカウント値CNTが1にカウントアップされる。そのため、セレクタ56は、スロットSLT1を選択する。従って、セレクタ56は、実時間ビット信号の論理レベルを1とし、第2のスレッド選択信号TSELbを1番とする。次いで、時刻t3ではカウント値CNTが2にカウントアップされる。そのため、セレクタ56は、スロットSLT2を選択する。従って、セレクタ56は、実時間ビット信号の論理レベルを0とし、第2のスレッド選択信号TSELbを1番とする。次いで、時刻t4ではカウント値CNTが3にカウントアップされる。そのため、セレクタ56は、スロットSLT3を選択する。従って、セレクタ56は、実時間ビット信号の論理レベルを1とし、第2のスレッド選択信号TSELbを2番とする。次いで、時刻t5ではカウント値CNTが4にカウントアップされる。そのため、セレクタ56は、スロットSLT4を選択する。従って、セレクタ56は、実時間ビット信号の論理レベルを1とし、第2のスレッド選択信号TSELbを1番とする。そして、時刻t5では、カウント値CNTaがカウント最大値CNTMに達するため、時刻t6の経過後にカウント値CNTaはリセットされる。これにより、時刻t6〜t10の期間の第2のスレッドスケジューラ51は、時刻t1〜t5の動作を繰り返すことになる。
実施の形態2では、第1のスレッドスケジューラ19は、第2のスレッドスケジューラ51により指定される第2の実行期間において実行するハードウェアスレッドの選択を行う。そこで、実施の形態2にかかるスレッドスケジューラ19aの動作を示す表を図15に示す。なお、図15に示した例は、第2のスレッドスケジューラ51の設定値として図14において示した条件を用いる。また、第1のスレッドスケジューラ19のカウンタ初期設定値は、0番のハードウェアスレッドから3番のハードウェアスレッドの順に2、1、3、4とする。つまり、この例における第1のスレッドスケジューラでは、第2のスレッドスケジューラ51において実行が予定されていないハードウェアスレッドの優先順位を他のハードウェアスレッドよりも高くする。
図15に示すように、第2のスレッドスケジューラ51は、時刻t3、t9、t13、t18において実時間ビット信号(図中のRT)を0とする。そのため、スレッドスケジューラ19aは、時刻t3、t9、t13、t18において第1のスレッドスケジューラ19が出力する第1のスレッド選択信号TSELaを用いる。このとき、時刻t3、t9、t13、t18のいずれのタイミングにおいても3番目のハードウェアスレッドに対応するディスパッチカウント値が最も大きくなるため、第1のスレッド選択信号TSELaは、時刻t3、t9、t13、t18のいずれ他のタイミングにおいても3番のハードウェアスレッドを指定する。
なお、第1のスレッドスケジューラ19には、第2のスレッドスケジューラ51が出力する第2のスレッド選択信号TSELbに基づき実行されたハードウェアスレッドがディスパッチ信号DPTにより通知される。そのため、時刻t1〜t18の期間においてカウント値CNT0〜CNT3が減少する。このときカウント値CNT0〜CNT3は0を下限としてそれ以上減少しないものとする。
上記説明より、実施の形態2にかかるスレッドスケジューラ19aでは、第1のスレッドスケジューラ19を、第2のスレッドスケジューラ51において第2の実行期間が指定された場合のスレッド選択信号を生成するために用いる。このとき、第1のスレッドスケジューラでは、第2のスレッドスケジューラ51の動作に基づき実行されたハードウェアスレッドの回数を反映してハードウェアスレッドの優先順位が変動する。そのため、第2のスレッドスケジューラ51に第1のスレッドスケジューラ19を組み合わせることで、第2のスレッドスケジューラ51において実行回数の少ないハードウェアスレッドを第1のスレッドスケジューラ19により指定することができる。
また、第2のスレッドスケジューラ19では、第1の実行期間において実行されるハードウェアスレッドが固定されているため、ハードウェアスレッドの優先順位にかかわらずハードウェアスレッドの最低実行時間を保証することができる。つまり、実施の形態2にかかるマルチスレッドプロセッサ1aによれば、第2のスレッドスケジューラ51により第1の実行期間を指定することでハードウェアスレッドの最低実行時間を保証する。そして、第2の実行期間において第1のスレッドスケジューラ19によるハードウェアスレッドの選択を行うことで、第2の実行期間に実行頻度の低いハードウェアスレッドを優先的に選択することができる。つまり、実施の形態2にかかるマルチスレッドプロセッサ1aによれば、ハードウェアスレッドの最低実行時間を保証しながら、処理が滞るハードウェアスレッドの発生を防止することができる。
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。例えば、第2のスケジューラにおけるスレッドのスケジューリング方法は、マルチスレッドプロセッサの仕様に応じて適宜変更することが可能である。