(57)【要約】【課題】従来のマルチスレッドプロセッサは、処理能力を十分に引き出すことができない問題があった。【解決手段】本発明のマルチスレッドプロセッサは、第１の命令コードを格納する第１の命令バッファ２３１と、第２の命令コードを格納する第２の命令バッファ２３２〜２３ｍと、を備える命令供給部１０と、第１、第２の命令バッファから発行される命令コード選択する命令セレクタ１１と、命令セレクタ１１が選択した命令コードをデコードする命令デコーダ１２と、デコード結果に基づく情報処理を行う命令実行部１３と、を有する。命令供給部１０は、優先的に第１の命令バッファに第１の命令コードを格納し、第１の命令バッファに格納される第１の命令コードの数が命令供給部１０が並列して発行可能な命令コード数の最大値の２倍以上となった場合に第２の命令バッファに第２の命令コードを格納するスレッド制御部２４を有する。【選択図】図１
2012059195.tif 000002
【特許請求の範囲】
【請求項１】
第１のスレッドに属する第１の命令コードを格納する第１の命令バッファと、第２のスレッドに属する第２の命令コードを格納する第２の命令バッファと、を備える命令供給部と、
前記第１、第２の命令バッファから発行される命令コードのうち後段回路に伝達する命令コードを選択する命令セレクタと、
前記命令セレクタが選択した前記命令コードをデコードして実行命令情報を生成する命令デコーダと、
前記実行命令情報に基づく情報処理を行う命令実行部と、を有し、
前記命令供給部は、
優先的に前記第１の命令バッファに前記第１の命令コードを格納し、前記第１の命令バッファに格納される前記第１の命令コードの数が前記命令供給部が並列して発行可能な命令コード数の最大値の２倍以上となった場合に前記第２の命令バッファに前記第２の命令コードを格納するスレッド制御部を有するマルチスレッドプロセッサ。
【請求項２】
前記命令供給部は、
前記第１のスレッドに応じて設けられ、前記第１のスレッドの進度に応じて第１のカウント値を増加させる第１のプログラムカウンタと、
前記第２のスレッドに応じて設けられ、前記第２のスレッドの進度に応じて第２のカウント値を増加させる第２のプログラムカウンタと、
アドレス選択信号に応じて前記第１のカウント値と前記第２のカウント値とのいずれか一方を選択して出力するアドレスセレクタと、
前記第１、第２の命令コードを外部メモリから読み出して格納し、前記第１のカウント値に応じて前記第１の命令コードを前記第１の命令バッファに出力し、前記第２のカウント値に応じて前記第２の命令コードを前記第２の命令バッファに出力する命令キャッシュと、
前記第１の命令バッファに蓄積された命令コードの数に応じて、前記アドレス選択信号により前記第１のカウント値と前記第２のカウント値とのいずれを指示するかを切り替えるスレッド制御部と、
を有する請求項１に記載のマルチスレッドプロセッサ。
【請求項３】
前記スレッド制御部は、前記第１の命令バッファに格納される命令コードの数が前記命令供給部が並列して発行可能な命令数の最大値の２倍未満である期間は前記アドレス選択信号を前記第１のカウント値を選択する状態とする高スレッド選択部を有する請求項２に記載のマルチスレッドプロセッサ。
【請求項４】
前記スレッド制御部は、前記アドレス選択信号が前記第１のカウント値を非選択状態とした場合に前記アドレス選択信号を前記第２のカウント値を選択する状態とする低スレッド選択部を有する請求項２又は３に記載のマルチスレッドプロセッサ。
【請求項５】
前記スレッド制御部は、前記アドレス選択信号が前記第１のカウント値を選択する状態を示した動作サイクル数をカウントし、当該動作サイクルが規定回数に達したことに応じて前記アドレス選択信号が第２のカウント値を選択した状態とする低スレッド強制処理部を有する請求項４に記載のマルチスレッドプロセッサ。
【請求項６】
前記アドレス選択信号が所定のアドレス値を選択する状態となることを抑制する制御信号を前記スレッド制御部に出力し、前記第１のカウント値が予め設定された第１の切り替え閾値に達した場合に前記制御信号を前記アドレス選択信号が前記第１のカウント値に対応するスレッドを選択する状態となることを防止するスレッド抑制状態とし、その後、前記第２のカウント値が予め設定された第２の切り替え閾値に達した場合に前記制御信号の前記スレッド抑制状態を解除する待ち合わせ部を有する請求項３乃至５のいずれか１項に記載のマルチスレッドプロセッサ。
【請求項７】
前記第１のスレッドは主スレッドであって、前記第２のスレッドは副スレッドであって、前記副スレッドは、前記主スレッドによる演算結果を用いて演算を行う請求項１乃至６のいずれか１項に記載のマルチスレッドプロセッサ。
【請求項８】
前記第２の命令バッファは、前記第１の命令バッファよりも記憶容量が小さく設定される請求項１乃至７のいずれか１項に記載のマルチスレッドプロセッサ。
【請求項９】
前記第１の命令バッファは、複数の第１の命令コードを並列して格納し、第２の命令バッファは、複数の第２の命令コードを並列して格納し、前記命令実行部は、複数の命令コードからデコードされた複数の実行命令情報を並列的に処理する請求項１乃至８のいずれか１項に記載のマルチスレッドプロセッサ。
【請求項１０】
第１のスレッドに属する第１の命令コードと第２のスレッドに属する第２の命令コードとを時分割で実行するマルチスレッドプロセッサであって、
第１のスレッドに属する第１の命令コードを格納する第１の命令バッファと、
第２のスレッドに属する第２の命令コードを格納する第２の命令バッファと、
優先的に前記第１の命令バッファに前記第１の命令コードを格納し、前記第１の命令バッファに格納される前記第１の命令コードの数が前記第１のバッファが並列して発行可能な命令数の最大値の２倍よりも多くなった場合に前記第２の命令バッファに前記第２の命令コードを格納するスレッド制御部と、
を有するマルチスレッドプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はマルチスレッドプロセッサに関し、特に高優先度のスレッドと、低優先度のスレッドと、を実行するマルチスレッドプロセッサに関する。
【背景技術】
【０００２】
プロセッサは、外部メモリからプログラム及び処理対象データを読み出してデータ処理を行う。このようなプロセッサでは、命令コードを直列的に処理することでデータ処理を進める。なお、プロセッサは、命令供給部と、命令デコーダ、命令実行部とを有する。命令供給部は、外部メモリからプログラムをフェッチする。命令デコーダは、命令供給部が供給する命令をデコードし、命令実行部の制御情報を生成する。命令実行部は、前記制御情報に基づき、外部メモリに格納されているデータを処理する。
【０００３】
しかし、プロセッサは、処理能力の向上が強く求められている。そのため、処理能力向上のために多くの手法が提案されている。この手法には、例えば、ＶＬＩＷ（Very Long Instruction Word）プロセッサと、マルチスレッドプロセッサとがある。
【０００４】
ＶＬＩＷプロセッサは、複数の命令を並列して処理する。ＶＬＩＷプロセッサは、命令供給部、命令デコーダ、命令実行部を有する。つまり、基本的な構成は、一般的なプロセッサとは変わらない。しかし、ＶＬＩＷプロセッサでは、命令供給部が外部メモリから複数の命令をフェッチし、命令デコーダが複数の命令をデコードして複数の制御情報を生成する。そして、命令実行部は、複数の制御情報に基づき、複数のデータを並列処理する。このＶＬＩＷプロセッサには、平均的な命令並列性（Instruction-Level parallelism：ILP）の限界があるため、その性能向上には限界がある。
【０００５】
マルチスレッドプロセッサは、独立した複数のプログラム（スレッド）を並列実行することで、ＶＬＩＷプロセッサのＩＬＰの限界を超えることができる。マルチスレッドプロセッサは、命令供給部、命令デコーダ、命令実行部に加えて命令セレクタを有する。マルチスレッドプロセッサでは、命令供給部が独立した複数のスレッドの命令をフェッチする。そして、命令供給部が、供給する複数のスレッドの命令の中からランタイムに同時実行可能な命令を抽出する。命令セレクタは、命令供給部から読み出された命令を命令デコーダ部へ供給する。
【０００６】
マルチスレッドプロセッサでは、命令キャッシュと、命令バッファが設けられる。命令キャッシュは、外部メモリからフェッチした命令を格納する。命令バッファは、スレッドの数に応じた命令バッファが設けられている。命令バッファは、命令キャッシュから対応するスレッドの命令の供給を受ける。つまり、命令バッファには、処理する予定の命令がスレッド毎に格納される。マルチスレッドプロセッサは、適宜、命令バッファから命令を読み出すことで複数のスレッドを並列的に処理する。このマルチスレッドプロセッサでは、命令バッファに蓄積された命令の処理効率を向上させることで処理性能を向上させることができる。
【０００７】
特許文献１では、ソフトウェアのプログラムが規定した頻度に基づき処理対象のスレッドを選択する方式が提案されている。また、非特許文献１では、複数のスレッドを循環的に選択するラウンドロビン方式、分岐が確定しているスレッドを選択する方式、命令バッファが保持する命令数が少ないスレッドを選択する方式が提案されている。
【０００８】
また、特許文献２では、マルチスレッドプロセッサにおいて、メモリからの命令読み出し待ちによるプログラムの停止（メモリ・ストール）を防ぐため、命令のフェッチ・バッファに管理部を設け、フェッチ・バッファに蓄積されている命令が少なくなった場合は、そのフェッチ・バッファに対応する命令の読み出しの緊急度をあげる、といった技術が開示されている。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２０１０−８６１３０号公報
【特許文献２】特開２００６−１９５７０５号公報
【非特許文献】
【００１０】
【非特許文献１】"Exploiting Choice: Instruction Fetch and Issue on an Implementable Simultaneous Multithreading Processor", International Symposium on Computer Architecture, 1996
【発明の概要】
【発明が解決しようとする課題】
【００１１】
しかしながら、特許文献１及び非特許文献１に記載のスレッド選択方式では、マルチスレッド動作可能なＶＬＩＷプロセッサにおいて十分な処理能力を実現できない問題がある。例えば、一のプログラムが、処理に多くの時間を要する主処理（主スレッド）と、主スレッドの結果を利用し、かつ、少ない時間で処理可能な副処理（副スレッド）と、から構成されている場合である。この場合、最適な性能を実現するためには、主スレッドと副スレッドが同時に終了することが望ましい。
【００１２】
特許文献１では、各スレッドが選択される頻度のみに基づき、選択するスレッドを決定する。そのため、特許文献１に記載のスレッド選択方式では、高優先度のスレッドが同時実行する命令数が少ない場合には、実行される命令数よりも、命令バッファにフェッチされる命令数の方が多くなり、命令バッファに処理待ちの命令が蓄積される。つまり、命令が命令バッファに格納される時間が不必要に長くなると共に、命令バッファに格納できない命令が廃棄される無駄が発生する。つまり、特許文献１に記載のスレッド選択方式では、命令キャッシュの命令供給能力が無駄になる問題がある。
【００１３】
また、特許文献１に記載のスレッド選択方式では、高優先度のスレッドに対応する命令バッファに実行するのに十分な命令がない場合であっても、低優先度のスレッドに対応した命令バッファに命令が蓄積されるケースが生じる。その際には、高優先度のスレッドに対応した命令バッファに実行する命令が無くなり、処理がストール状態となり、高優先度のスレッドの実行が、過度に抑制されることになる問題が生じる。
【００１４】
また、非特許文献１に記載のスレッド選択方式では、全スレッドを平等に扱うことを前提とする。そのため、主スレッドと副スレッドとの間の処理時間（あるいは、処理するスレッド数）に差がある場合、効率的な処理を行うことができない問題がある。
【００１５】
また、特許文献２においても、スレッド毎、フェッチ・バッファ毎に優先度を考慮していないため、優先度の低い命令が優先して処理され、高優先度のスレッドの処理が滞る問題が生じる。特に、高優先度のスレッドにおいて処理する命令コード数が低優先度のスレッドの命令コード数よりも遙かに多いなど、命令コードの比率が極端に偏っている場合は特にこの問題は顕著になる。
【００１６】
つまり、特許文献１、２及び非特許文献１に記載の技術では、マルチスレッド動作可能なＶＬＩＷプロセッサにおいて、主スレッドと副スレッドとを有するプログラムを実行しようとした場合、処理性能を十分に発揮させることができない問題がある。
【課題を解決するための手段】
【００１７】
本発明にかかるマルチスレッドプロセッサの一態様は、第１のスレッドに属する第１の命令コードを格納する第１の命令バッファと、第２のスレッドに属する第２の命令コードを格納する第２の命令バッファと、を備える命令供給部と、前記第１、第２の命令バッファから発行される命令コードのうち後段回路に伝達する命令コードを選択する命令セレクタと、前記命令セレクタが選択した前記命令コードをデコードして実行命令情報を生成する命令デコーダと、前記実行命令情報に基づく情報処理を行う命令実行部と、を有し、前記命令供給部は、優先的に前記第１の命令バッファに前記第１の命令コードを格納し、前記第１の命令バッファに格納される前記第１の命令コードの数が前記命令供給部が並列して発行可能な命令コード数の最大値の２倍以上となった場合に前記第２の命令バッファに前記第２の命令コードを格納するスレッド制御部を有する。
【００１８】
また、本発明にかかるマルチスレッドプロセッサの別の態様は、第１のスレッドに属する第１の命令コードと第２のスレッドに属する第２の命令コードとを時分割で実行するマルチスレッドプロセッサであって、第１のスレッドに属する第１の命令コードを格納する第１の命令バッファと、第２のスレッドに属する第２の命令コードを格納する第２の命令バッファと、優先的に前記第１の命令バッファに前記第１の命令コードを格納し、前記第１の命令バッファに格納される前記第１の命令コードの数が前記第１のバッファが並列して発行可能な命令数の最大値の２倍よりも多くなった場合に前記第２の命令バッファに前記第２の命令コードを格納するスレッド制御部と、を有する。
【００１９】
本発明にかかるマルチスレッドプロセッサは、スレッド制御部が、第１の命令バッファに格納される第１の命令コードの数が第１のバッファが並列して発行可能な命令数の最大値の２倍よりも多くなった場合に第２の命令バッファに第２の命令コードを格納する。これにより、本発明にかかるマルチスレッドプロセッサでは、第２の命令バッファに命令コードを蓄積したとしても、第１の命令バッファに蓄積される命令コードがストールすること防ぐことができる。
【発明の効果】
【００２０】
本発明にかかるマルチスレッドプロセッサによれば、命令バッファに命令コードを効率よく蓄積することで、処理性能を向上させることができる。
【図面の簡単な説明】
【００２１】
【図１】実施の形態１にかかるマルチスレッドプロセッサのブロック図である。
【図２】実施の形態１にかかる命令キャッシュのデータ格納構造を示す概念図である。
【図３】実施の形態１にかかる命令キャッシュの命令フェッチ手順を示すタイミングチャートである。
【図４】実施の形態１にかかるスレッド制御部のブロック図である。
【図５】実施の形態１にかかる命令供給部の命令発行シーケンスを示すタイミングチャートである。
【図６】図５のスレッド３に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図７】図５のスレッド４に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図８】図５のスレッド５に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図９】実施の形態１にかかる命令供給部の命令発行シーケンスを示すタイミングチャートである。
【図１０】図９のスレッド３に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図１１】図９のスレッド４に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図１２】図９のスレッド５に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図１３】一般的なスレッド制御部による命令供給部の命令発行シーケンスを示すタイミングチャートである。
【図１４】実施の形態２にかかるスレッド制御部のブロック図である。
【図１５】実施の形態２にかかる命令供給部の命令発行シーケンスを示すタイミングチャートである。
【図１６】実施の形態３にかかるマルチスレッドプロセッサのブロック図である。
【図１７】実施の形態３にかかる待ち合わせ制御部のブロック図である。
【図１８】実施の形態３にかかる制御信号生成部のブロック図である。
【図１９】実施の形態３にかかる制御信号生成部のブロック図である。
【図２０】実施の形態３にかかるスレッド制御部のブロック図である。
【図２１】実施の形態３にかかる命令供給部の命令発行シーケンスを示すタイミングチャートである。
【図２２】実施の形態３にかかるマルチスレッドプロセッサにおいてフェッチされるスレッドの切り替わり状態を示すシーケンス図である。
【発明を実施するための形態】
【００２２】
実施の形態１
以下、図面を参照して本発明の実施の形態について説明する。本発明にかかるマルチスレッドプロセッサは、一度にフェッチする命令に複数の命令コードを含むＶＬＩＷプロセッサである。ＶＬＩＷプロセッサは、複数の命令コードを並列して処理することができる。以下の説明では、１サイクルで最大２個の命令を同時実行するＶＬＩＷプロセッサを例に説明を行う。
【００２３】
図１に実施の形態１にかかるマルチスレッドプロセッサ１のブロック図を示す。図１に示すように、マルチスレッドプロセッサ１は、命令供給部１０、命令セレクタ１１、命令デコーダ１２、命令実行部１３を有する。マルチスレッドプロセッサ１は、命令供給部１０が外部メモリからプログラムを読み出す。命令供給部１０は、読み出したプログラムに関する命令コードを発行する。マルチスレッドプロセッサ１では、命令供給部１０から発行された命令コードに基づき外部メモリに格納されているデータを処理することでデータ処理を行う。
【００２４】
命令供給部１０は、第１のスレッド（例えば、第１のプログラム）に属する第１の命令コードを格納する第１の命令バッファと、第２のスレッド（例えば、第２のプログラム）に属する第２の命令コードを格納する第２の命令バッファと、を備える。命令供給部１０は、一度に複数の命令コードを発行する。この複数の命令コードは、第１のスレッドに属するものによってのみ構成されていても良く、第１、第２のスレッドに属する命令コードが混在していても良い。本実施の形態では、第１のスレッドは、処理完了までに多くの時間を要する主スレッドであって、第２のスレッドは、少ない時間で処理が完了する副スレッドであるものとする。また、副スレッドは、主スレッドの演算結果を利用する、または、主スレッドの演算に必要な処理を準備するものとする。さらに、副スレッドは、複数のスレッドから構成されていても良い。命令供給部１０の詳細については後述する。
【００２５】
命令セレクタ１１は、第１、第２の命令バッファから発行される命令コードのうち後段回路に伝達する命令コードを選択する。より具体的には、命令セレクタ１１は、命令供給部１０が発行する複数の命令コードが同一の演算ユニットを利用することがない命令コードの組み合わせを考慮して後段回路に伝達する命令コードを選択する。
【００２６】
命令デコーダ１２は、命令セレクタ１１が選択した命令コードをデコードして実行命令情報を生成する。命令実行部１３は、外部メモリから処理対処のデータを読み出す。そして命令実行部１３は、命令デコーダ１２がデコードした実行命令情報に基づき読み出したデータを処理する。その後、命令実行部１３は、処理結果を外部メモリに書き戻す。
【００２７】
実施の形態１にかかるマルチスレッドプロセッサ１は、命令供給部１０において、命令バッファに蓄積させる命令コードの数の制御方法に特徴の１つを有する。そこで、命令供給部１０について以下で詳細に説明する。
【００２８】
図１に示すように、命令供給部１０は、プログラムカウンタ２０１〜２０ｍ、アドレスセレクタ２１、命令キャッシュ２２、命令バッファ２３１〜２３ｍ、スレッド制御部２４を有する。プログラムカウンタは、実行可能なスレッド（例えば、プログラム）の数に応じて設けられる。図１に示す例では、ｍ個（ｍは整数）のスレッドに対応するものである。プログラムカウンタ２０１〜２０ｍは、それぞれスレッドの進捗に合わせてカウント値を増加させる。このカウント値は、スレッドに属する命令コードが格納される命令キャッシュのアドレスを占めすポインタとして機能する。なお、以下の説明では、プログラムカウンタ２０１は第１のスレッド（例えば、主スレッド）に対応して設けられるものとし、プログラムカウンタ２０１のカウント値を第１のカウント値とする。また、プログラムカウンタ２０２〜２０ｍは、第２のスレッド（例えば、副スレッド）に対応して設けられるものとし、プログラムカウンタ２０２〜２０ｍのカウント値を第２のカウント値とする。
【００２９】
アドレスセレクタ２１は、アドレス選択信号ＡｄＳｅｌに応じて第１のカウント値と前記第２のカウント値とのいずれか一方を選択して出力する。
【００３０】
命令キャッシュ２２は、外部メモリからスレッドに関連するプログラムを読み込んで、格納する。プログラムは、複数の命令コードから構成される。ここで、以下の説明では、第１のスレッドに関連するプログラムを構成する命令コードを第１の命令コードと称し、第２のスレッドに関連するプログラムを構成する命令コードを第２お命令コードと称す。命令キャッシュ２２は、第１のカウント値に応じて第１の命令コードを第１の命令バッファ２３１にフェッチし、第２のカウント値に応じて第２の命令コードを第２の命令バッファ２３２〜２３ｍにフェッチする。
【００３１】
命令キャッシュ２２は、入力されるカウント値に応じて複数の命令コードをフェッチする。複数の命令コードは、同一のスレッドに属する命令コードであり、命令キャッシュ２２上において連続するアドレスに格納されるものである。実施の形態１にかかるマルチスレッドプロセッサ１は、命令供給部１０が同時に発行可能な命令コードの最大数ＮＭＩとして２が設定される。従って、マルチスレッドプロセッサ１では、命令キャッシュ２２は、２つの命令コードをフェッチするものとする。ここで、命令キャッシュ２２のデータ格納構造の概念図を図２に示す。図２に示すように、命令キャッシュ２２は、スレッド毎に命令コードを格納する。図２に示す例では、第１のスレッド（例えば、スレッド１）が命令コードＩｍ１〜Ｉｍ１６により構成され、第２のスレッド（例えば、スレッド２）が命令コードＩｓａ１〜Ｉｓａ６により構成され、第２のスレッド（例えば、スレッドｍ）が命令コードＩｓｘ１〜Ｉｓｘ８により構成される。そして、命令キャッシュ２２は、入力されるカウント値をポインタとし、当該ポインタにより示されるアドレスと当該アドレスに続くアドレスに格納されるデータをフェッチする。
【００３２】
命令バッファ２３１〜２３ｍは、スレッドに対応して設けられる。ここで、本実施の形態では、命令バッファ２３１は、第１のスレッドに対応して設けられる第１の命令バッファとして機能する。命令バッファ２３２〜２３ｍは、第２のスレッドに対応して設けられる第２の命令バッファとして機能する。実施の形態１にかかるマルチスレッドプロセッサ１では、第１の命令バッファの容量を命令供給部１０が同時に発行可能な命令コードの最大数ＮＭＩの２倍以上に設定する。図１に示す例では、命令供給部１０が同時に発行可能な命令コードの最大数ＮＭＩが２に設定される。そのため、図１に示す例では、第１の命令バッファとして用いられる命令バッファ２３１は４つの命令を格納可能に設定される。また、第１、第２の命令バッファは、同容量に設定しても良いが、第２の命令バッファの容量を第１の命令バッファよりも小容量に設定しても良い。
【００３３】
実施の形態１にかかるマルチスレッドプロセッサ１は、ＶＬＩＷプロセッサであるため、命令キャッシュから命令バッファへの命令のフェッチ方法が単一の命令コードをフェッチする一般的な方式とは異なる。そこで、マルチスレッドプロセッサ１において、処理対象のスレッドが１つである場合の命令フェッチ手順を示すタイミングチャートを図３に示す。この図３を参照して処理対象スレッドが１スレッドである場合の命令フェッチ手順の説明を行う。なお、マルチスレッドプロセッサ１では、動作サイクル毎に処理が進むものとする。また、図３では、スレッド１のみを処理対象スレッドとし、プログラムカウンタ２０１のカウント値が増加する例を示す。
【００３４】
図３に示す例では、サイクル０でプログラムカウンタ２０１がリセットされる。そして、サイクル１でプログラムカウンタ２０１のカウント値が１となる。このとき、命令バッファ２３１には命令コードは蓄積されていない。そのため、命令キャッシュ２２は、２つの命令コードをフェッチする。図３に示す例では、命令キャッシュ２２は、カウント値"１"に対応する命令コードＩｍ１と、命令コードＩｍ１に続く命令コードＩｍ２と、をフェッチする。命令キャッシュ２２が２つの命令コードを同時にフェッチするのは、命令供給部１０の同時発行命令の最大数ＮＭＩが２であるためである。また、命令キャッシュ２２と命令バッファ２３１との間の帯域幅は、同時にフェッチされる命令コードを十分に転送できる帯域に設定される。
【００３５】
続いて、サイクル２においてプログラムカウンタ２０１のカウント値が増加する。カウント増加数は、命令キャッシュ２２の同時フェッチ命令コード数に対応して、最大値が２に設定される。また、カウント増加数は、命令バッファ２３１が保持することができる最大命令数をＨｍａｘ、命令バッファ２３１に保持されている命令数をＨＭＩ、命令供給部１０が発行する命令コードの数をＮＩＩとすると、カウント増加数＝Ｈｍａｘ−（ＨＮＩ−ＮＩＩ）で表される。図３に示す例では、サイクル１のカウント増加数が４であるため、サイクル２のカウント増加数は２となる。従って、サイクル２では、プログラムカウンタ２０１のカウント値は３となる。そして、命令キャッシュ２２は、カウント値"３"に対応して命令コードＩｍ３、Ｉｍ４がフェッチされる。また、サイクル２では、サイクル１においてフェッチされた命令コードＩｍ１、Ｉｍ２が命令バッファ２３１に格納されると共に、命令コードＩｍ１が発行される。
【００３６】
続いて、サイクル３では、サイクル２におけるカウント増加数が３であるため、プログラムカウンタ２０１のカウント値は最大の増加数の２だけ増加して５となる。そして、命令キャッシュ２２からは、カウント値"５"に対応して命令コードＩｍ５、Ｉｍ６がフェッチされる。サイクル２において命令コードＩｍ１が発行され、かつ、命令コードＩｍ３、Ｉｍ４がフェッチされている。そのため、サイクル３で命令バッファ２３１に蓄積されている命令コードは、命令コードＩｍ２、Ｉｍ３、Ｉｍ４の３つである。そして、図３に示す例では、サイクル３で、命令コードＩｍ２が発行される。これにより、サイクル３の動作完了時のカウント増加数は２となる。
【００３７】
続いて、サイクル４では、サイクル３におけるカウント増加数が２であるため、プログラムカウンタ２０１のカウント値は２増加して７となる。そして、命令キャッシュ２２からは、カウント値"７"に対応して命令コードＩｍ７、Ｉｍ８がフェッチされる。サイクル３において命令コードＩｍ２が発行され、かつ、命令コードＩｍ５、Ｉｍ６がフェッチされている。そのため、サイクル４で命令バッファ２３１に蓄積されている命令コードは、命令コードＩｍ３、Ｉｍ４、Ｉｍ５、Ｉｍ６の４つである。そして、図３に示す例では、サイクル４で、命令コードＩｍ３が発行される。これにより、サイクル４の動作完了時のカウント増加数は１となる。
【００３８】
続いて、サイクル５では、サイクル４におけるカウント増加数が１であるため、プログラムカウンタ２０１のカウント値は１増加して８となる。そして、命令キャッシュ２２からは、カウント値"８"に対応して命令コードＩｍ８、Ｉｍ９がフェッチされる。サイクル４において命令コードＩｍ３が発行され、かつ、命令コードＩｍ７、Ｉｍ８がフェッチされている。しかし、サイクル５では、命令バッファ２３１の保持可能な命令数が１しかない。そのため、命令コードＩｍ８は、サイクル５では廃棄されることになる。サイクル５で命令バッファ２３１に蓄積されている命令コードは、命令コードＩｍ４、Ｉｍ５、Ｉｍ６、Ｉｍ７の４つである。そして、図３に示す例では、サイクル５で、命令コードＩｍ４が発行される。これにより、サイクル５の動作完了時のカウント増加数は１となる。
【００３９】
続いて、サイクル６では、サイクル５におけるカウント増加数が１であるため、プログラムカウンタ２０１のカウント値は１増加して９となる。そして、命令キャッシュ２２からは、カウント値"９"に対応して命令コードＩｍ９、Ｉｍ１０がフェッチされる。サイクル５において命令コードＩｍ４が発行され、かつ、命令コードＩｍ８、Ｉｍ９がフェッチされている。しかし、サイクル６では、命令バッファ２３１の保持可能な命令数が１しかない。そのため、命令コードＩｍ９は、サイクル６では廃棄されることになる。サイクル６で命令バッファ２３１に蓄積されている命令コードは、命令コードＩｍ５、Ｉｍ６、Ｉｍ７、Ｉｍ８の４つである。そして、図３に示す例では、サイクル６で、命令コードＩｍ５、Ｉｍ６が発行される。これにより、サイクル６の動作完了時のカウント増加数は２となる。
【００４０】
続いて、サイクル７では、サイクル６におけるカウント増加数が２であるため、プログラムカウンタ２０１のカウント値は２増加して１１となる。そして、命令キャッシュ２２からは、カウント値"１１"に対応して命令コードＩｍ１１、Ｉｍ１２がフェッチされる。サイクル６において命令コードＩｍ５、Ｉｍ６が発行され、かつ、命令コードＩｍ９、Ｉｍ１０がフェッチされている。そのため、サイクル７で命令バッファ２３１に蓄積されている命令コードは、命令コードＩｍ７、Ｉｍ８、Ｉｍ９、Ｉｍ１０の４つである。そして、図３に示す例では、サイクル７で、命令コードＩｍ７、Ｉｍ８が発行される。これにより、サイクル７の動作完了時のカウント増加数は２となる。
【００４１】
続いて、サイクル８では、サイクル７におけるカウント増加数が２であるため、プログラムカウンタ２０１のカウント値は２増加して１３となる。そして、命令キャッシュ２２からは、カウント値"１３"に対応して命令コードＩｍ１３、Ｉｍ１４がフェッチされる。サイクル７において命令コードＩｍ７、Ｉｍ８が発行され、かつ、命令コードＩｍ１１、Ｉｍ１２がフェッチされている。そのため、サイクル８で命令バッファ２３１に蓄積されている命令コードは、命令コードＩｍ９、Ｉｍ１０、Ｉｍ１１、Ｉｍ１２の４つである。そして、図３に示す例では、サイクル８で、命令コードＩｍ９が発行される。これにより、サイクル８の動作完了時のカウント増加数は１となる。
【００４２】
このように、プログラムカウンタ２０１は、命令バッファ２３１の最大保持命令数Ｈｍａｘと命令供給部１０が発行する命令コードの数に応じて、カウント値を進める。また、命令キャッシュ２２は、フェッチした命令コードが命令バッファ２３１に保持されるか否かにかかわらず常にフェッチ可能な最大の命令コード数をフェッチする。なお、命令キャッシュ２２は、フェッチした命令コードが命令バッファ２３１に保持されるか否かにより、最大の命令コード数以下の命令をフェッチする構成としても良い。上記で説明したプログラムカウンタ２０１及び命令キャッシュ２２の制御方法は一例であり、その他の制御方法を適用することも可能である。
【００４３】
次に、命令供給部１０において命令バッファ２３１〜２３ｍにいずれのスレッドに属する命令コードを蓄積するかを制御するスレッド制御部２４について詳細に説明する。実施の形態１にかかるスレッド制御部２４は、優先的に第１の命令バッファ（例えば、命令バッファ２３１）に第１の命令コード（スレッド１に属する命令コード）を格納し、命令バッファ２３１に格納される第１の命令コードの数が命令供給部１０が並列して発行可能な命令コード数の最大値の２倍以上となった場合に第２の命令バッファ（例えば、命令バッファ２３２〜２３ｍ）に第２の命令コード（スレッド２〜スレッドｍに属する命令コード）を格納する。本実施の形態では、スレッド制御部２４が出力するアドレス選択信号ＡｄＳｅｌをアドレスセレクタ２１に出力する。スレッド制御部２４は、アドレスセレクタが出力するカウント値を第１のカウント値とするか第２のカウント値とするかを第１の命令バッファに蓄積された命令コードの数に応じて切り替える。出力するカウント値の切り替えは、アドレス選択信号ＡｄＳｅｌにより指定するプログラムカウンタを切り替えることで制御される。このような制御により、スレッド制御部２４は、命令バッファへの命令コードの蓄積状態を制御する。
【００４４】
また、実施の形態１にかかるマルチスレッドプロセッサ１では、命令キャッシュ２２がフェッチした命令コードの数を示すフェッチ数信号ＮＦＩを出力し、命令バッファ２３１〜２３ｍが保持している命令コードの数を示す命令保持数信号ＮＨＩを出力し、命令デコーダ１２が命令供給部から発行された命令コードの数を示す命令発行数信号ＮＩＩを出力する。そして、スレッド制御部２４は、フェッチ数信号ＮＦＩ、命令保持数信号ＮＨＩ、命令発行数信号ＮＩＩに基づきアドレス選択信号ＡｄＳｅｌの状態を切り替える。なお、本実施の形態では、フェッチ数信号ＮＦＩ、命令保持数信号ＮＨＩ、命令発行数信号ＮＩＩはいずれも主スレッド（例えば、スレッド１）に属する命令コードの数を示すものとする。
【００４５】
スレッド制御部２４のブロック図を図４に示す。図４に示すように、スレッド制御部２４は、高スレッド選択部３０、ラウンドロビン選択部３１、低スレッド選択部３２を有する。本実施の形態では、スレッド制御部２４が出力するアドレス選択信号ＡｄＳｅｌは、プログラムカウンタの数に応じた複数の信号により構成される。そして、スレッド制御部２４は、命令キャッシュにカウント値を伝達すべきスレッドに対応するアドレス選択信号をハイレベル（例えば、１）とすることで、アドレスセレクタ２１を制御する。
【００４６】
高スレッド選択部３０は、第１の命令バッファに格納される命令コードの数が命令供給部１０が並列して発行可能な命令の最大数ＮＭＩの２倍未満である期間はアドレス選択信号を第１のカウント値（例えば、プログラムカウンタ２０１のカウント値）を選択する状態（例えば、アドレス選択信号ＡｄＳｅｌ[１]を１とする状態）とする。より具体的には、高スレッド選択部３０は、フェッチ数信号ＮＦＩにより示される値をＮＦＩ、命令保持数信号ＮＨＩにより示される値をＮＨＩ、命令発行数信号ＮＩＩにより示される値をＮＩＩ、命令供給部１０の同時発行可能な最大命令数をＮＭＩした場合に（１）式の条件が満たされる場合に主スレッドに対応するアドレス選択信号ＡｄＳｅｌ［１］を１（例えば、選択状態）とする。
ＮＦＩ＋ＮＨＩ≧ＮＩＩ＋２×ＮＭＩ  ・・・  （１）
【００４７】
ラウンドロビン選択部３１は、副スレッドとして定義されるスレッド２〜スレッドｍを巡回的に選択する。ラウンドロビン選択部３１には主スレッド（例えば、スレッド１）のアドレス選択信号ＡｄＳｅｌ［１］が入力される。ラウンドロビン選択部３１は、アドレス選択信号ＡｄＳｅｌ［１］が非選択状態を示す場合（例えば、０）となる毎に選択状態にするスレッドを切り替える。
【００４８】
低スレッド選択部３２は、アドレス選択信号ＡｄＳｅｌ［１］が第１のカウント値を非選択状態とした場合にアドレス選択信号ＡｄＳｅｌ［２］〜ＡｄＳｅｌ［ｍ］を第２のカウント値を選択する状態とする。より具体的には、低スレッド選択部３２は、ゲーティング回路として副スレッドの数に対応したＡＮＤ回路を有する。このＡＮＤ回路は、アドレス選択信号ＡｄＳｅｌ［１］が０の状態でラウンドロビン選択部３１の出力信号をアドレス選択信号ＡｄＳｅｌ［２］〜ＡｄＳｅｌ［ｍ］として出力する。
【００４９】
続いて、スレッド制御部２４を有する実施の形態１にかかるマルチスレッドプロセッサ１の動作について説明する。マルチスレッドプロセッサ１では、主スレッドに属する命令コードの命令バッファへの蓄積状態をスレッド制御部２４により制御することで、少なくとも２つの効果を奏する。第１の効果は、主スレッドの実行効率を向上させることである。第２の効果は、命令キャッシュから命令バッファへの命令コードのフェッチ効率を向上させることである。そこで、以下の説明では、まず、第１の効果について説明する。
【００５０】
第１の効果を説明するためのマルチスレッドプロセッサ１の動作を示すタイミングチャートを図５に示す。図５では、サイクル０〜サイクル８のサイクル毎に、アドレス選択信号ＡｄＳｅｌにより選択されるスレッドとそのときの命令コードのフェッチ数、命令保持数、命令発行数を示した。また、図５に示す例では、扱うスレッド数を３とした。そして、図５に示すタイミングチャートの各欄に示される数字は、スレッド１／スレッド２／スレッド３の命令コード数である。なお、スレッド１は主スレッドであり、スレッド２、３は副スレッドである。また、図５に示す例では、命令供給部１０が同時に発行可能な命令コードの最大数ＮＭＩを２と設定する。
【００５１】
図５では、サイクル０で動作が開始される。サイクル０では、命令キャッシュ２２から命令コードのフェッチは行われず、命令バッファ２３１〜２３３に保持されている命令コードもない状態である。また、サイクル０において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル０では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００５２】
サイクル１では、サイクル０においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル１では、命令キャッシュ２２がフェッチした命令コードは命令バッファに格納されていない。また、サイクル１において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル１では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００５３】
サイクル２では、サイクル１においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル２では、サイクル１で命令キャッシュ２２がフェッチした命令コードがスレッド１に対応して設けられた命令バッファ２３１に格納される。そのため、命令保持数ＮＨＩは２／０／０となる。さらに、サイクル２では、命令供給部１０からスレッド１に属する命令コードが１つ発行されるため、命令発行数ＮＩＩは１／０／０となる。ここで、命令供給部１０が発行する命令数は、同時発行数の最大値を２とし、命令バッファ２３１〜２３３に保持されている命令コードが利用する演算器の種類に基づき決定される。つまり、命令バッファ２３１の先頭の２つの命令コードが、同じ演算器を利用する場合は同時発行数が１となり、異なる演算器を利用する場合は同時発行数が２となる。また、サイクル２において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル２では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００５４】
サイクル３では、サイクル２においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル３では、サイクル２のフェッチ数ＮＦＩが２／０／０、命令保持数ＮＨＩが２／０／０、命令発行数ＮＩＩが１／０／０である。そのため、サイクル３の命令保持数ＮＨＩは３／０／０となる。さらに、サイクル３では、命令供給部１０からスレッド１に属する命令コードが１つ発行されるため、命令発行数ＮＩＩは１／０／０となる。また、サイクル３において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たす。そのため、サイクル３では、アドレス選択信号ＡｄＳｅｌによりスレッド２が選択される。
【００５５】
サイクル４では、サイクル３においてアドレス選択信号ＡｄＳｅｌによりスレッド２が選択されていることに基づいて、命令キャッシュ２２がスレッド２に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは０／２／０となる。また、サイクル４では、サイクル３のフェッチ数ＮＦＩが２／０／０、命令保持数ＮＨＩが３／０／０、命令発行数ＮＩＩが１／０／０である。そのため、サイクル４の命令保持数ＮＨＩは４／０／０となる。さらに、サイクル４では、命令供給部１０からスレッド１に属する命令コードが２つ発行されるため、命令発行数ＮＩＩは２／０／０となる。また、サイクル４において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル４では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００５６】
サイクル５では、サイクル４においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル５では、サイクル４のフェッチ数ＮＦＩが０／２／０、命令保持数ＮＨＩが４／０／０、命令発行数ＮＩＩが２／０／０である。そのため、サイクル５の命令保持数ＮＨＩは２／２／０となる。さらに、サイクル５では、命令供給部１０からスレッド１に属する命令コードとスレッド２に属する命令コードとが１つずつ発行されるため、命令発行数ＮＩＩは１／１／０となる。また、サイクル５において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル５では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００５７】
サイクル６では、サイクル５においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル６では、サイクル５のフェッチ数ＮＦＩが２／０／０、命令保持数ＮＨＩが２／２／０、命令発行数ＮＩＩが１／１／０である。そのため、サイクル６の命令保持数ＮＨＩは３／１／０となる。さらに、サイクル６では、命令供給部１０からスレッド１に属する命令コードとスレッド２に属する命令コードとが１つずつ発行されるため、命令発行数ＮＩＩは１／１／０となる。また、サイクル６において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たす。そのため、サイクル６では、アドレス選択信号ＡｄＳｅｌによりスレッド３が選択される。
【００５８】
サイクル７では、サイクル６においてアドレス選択信号ＡｄＳｅｌによりスレッド３が選択されていることに基づいて、命令キャッシュ２２がスレッド３に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは０／０／２となる。また、サイクル７では、サイクル６のフェッチ数ＮＦＩが１／１／０、命令保持数ＮＨＩが３／１／０、命令発行数ＮＩＩが１／１／０である。そのため、サイクル７の命令保持数ＮＨＩは４／０／０となる。さらに、サイクル７では、命令供給部１０からスレッド１に属する命令コードが２つ発行されるため、命令発行数ＮＩＩは２／０／０となる。また、サイクル７において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル７では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００５９】
サイクル８では、サイクル７においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル８では、サイクル７のフェッチ数ＮＦＩが０／０／２、命令保持数ＮＨＩが４／０／０、命令発行数ＮＩＩが２／０／０である。そのため、サイクル８の命令保持数ＮＨＩは２／０／２となる。さらに、サイクル８では、命令供給部１０からスレッド１に属する命令コードとスレッド３に属する命令コードとが１つずつ発行されるため、命令発行数ＮＩＩは１／０／１となる。また、サイクル８において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル８では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００６０】
図５で示す例では、サイクル４で副スレッドとして定義されるスレッド２に属する命令コードがフェッチされる。マルチスレッドプロセッサ１では、サイクル３〜サイクル５の動作をスレッド制御部２４により実現することで、主スレッドの実行効率を向上させるという第１の効果を奏する。そこで、サイクル３〜サイクル５の動作について、マルチスレッドプロセッサ１のブロック図を用いてより具体的に説明する。図５のサイクル３〜サイクル５の動作を示すマルチスレッドプロセッサ１のブロック図を図６〜図８に示す。
【００６１】
図６は、図５のサイクル３の動作を行っている状態のマルチスレッドプロセッサ１のブロック図である。図６に示すように、サイクル３では、命令バッファ２３１に命令コードＩｍ２、Ｉｍ３、Ｉｍ４が蓄積されている。命令供給部１０は命令コードＩｍ２を発行する。命令キャッシュ２２は、プログラムカウンタ２０１のカウント値に基づき命令コードＩｍ５、Ｉｍ６をフェッチする。
【００６２】
続いて、図７は、図５のサイクル４の動作を行っている状態のマルチスレッドプロセッサ１のブロック図である。サイクル３において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たす。つまり、サイクル４では、命令バッファ２３１に発行最大数ＮＭＩの２倍の命令コードが蓄積された状態となる。従って、スレッド制御部２４は、アドレス選択信号ＡｄＳｅｌによって、サイクル４において、命令バッファ２３２にスレッド２に属する命令コードＩｓａ１、Ｉｓａ２が蓄積されるように、スレッドを制御する。一方、サイクル４では、命令供給部１０が命令コードＩｍ３、Ｉｍ４を発行する。
【００６３】
続いて、図８は、図５のサイクル５の動作を行っている状態のマルチスレッドプロセッサ１のブロック図である。図８に示すように、マルチスレッドプロセッサ１では、サイクル４（図７に示す動作サイクル）において、命令バッファ２３１に命令コードのフェッチが行われない。しかしながら、サイクル３までの動作において、命令バッファ２３１には、発行最大数ＮＭＩの２倍の数の命令コードが蓄積される。そのため、サイクル４において、発行最大数ＮＭＩと同数の命令コードが発行された場合においても、命令バッファ２３１には、次サイクルにおいて発行される可能性のある命令コード数の最大数を満たす命令コードが蓄積された状態を維持する。つまり、副スレッドの実行が、主スレッドの実行に全く影響を与えない。そして、マルチスレッドプロセッサ１は、サイクル４においてアドレス選択信号ＡｄＳｅｌがスレッド１を選択する状態となることに応じて、サイクル５でスレッド１に属する命令コードＩｍ７、Ｉｍ８を命令バッファ２３１に蓄積する。また、サイクル５では、命令バッファ２３１から命令コードＩｍ５が発行され、かつ、命令バッファ２３２から命令コードＩｓａ１が発行される。しかし、サイクル５において、命令バッファ２３１に命令コードＩｍ７、Ｉｍ８が蓄積されることで、サイクル６以降においても、発行される可能性のある命令コード数の最大数を満たす命令コードが命令バッファ２３１に蓄積された状態を維持することができる。
【００６４】
続いて、命令キャッシュから命令バッファへの命令コードのフェッチ効率を向上させる第２の効果について説明する。第２の効果を説明するためのマルチスレッドプロセッサ１の動作を示すタイミングチャートを図９に示す。図９では、サイクル０〜サイクル８のサイクル毎に、アドレス選択信号ＡｄＳｅｌにより選択されるスレッドとそのときの命令コードのフェッチ数、命令保持数、命令発行数を示した。また、図９に示す例では、扱うスレッド数を３とした。そして、図９に示すタイミングチャートの各欄に示される数字は、スレッド１／スレッド２／スレッド３の命令コード数である。なお、スレッド１は主スレッドであり、スレッド２、３は副スレッドである。また、図９に示す例では、命令供給部１０が同時に発行可能な命令コードの最大数ＮＭＩを２と設定する。
【００６５】
図９では、サイクル０で動作が開始される。サイクル０では、命令キャッシュ２２から命令コードのフェッチは行われず、命令バッファ２３１〜２３３に保持されている命令コードもない状態である。また、サイクル０において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル０では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００６６】
サイクル１では、サイクル０においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル１では、命令キャッシュ２２がフェッチした命令コードは命令バッファに格納されていない。また、サイクル１において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル１では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００６７】
サイクル２では、サイクル１においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル２では、サイクル１で命令キャッシュ２２がフェッチした命令コードがスレッド１に対応して設けられた命令バッファ２３１に格納される。そのため、命令保持数ＮＨＩは２／０／０となる。さらに、サイクル２では、命令供給部１０からスレッド１に属する命令コードが２つ発行されるため、命令発行数ＮＩＩは２／０／０となる。ここで、命令供給部１０が発行する命令数は、同時発行数の最大値を２とし、命令バッファ２３１〜２３３に保持されている命令コードが利用する演算器の種類に基づき決定される。つまり、命令バッファ２３１の先頭の２つの命令コードが、同じ演算器を利用する場合は同時発行数が１となり、異なる演算器を利用する場合は同時発行数が２となる。また、サイクル２において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル２では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００６８】
サイクル３では、サイクル２においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル３では、サイクル２のフェッチ数ＮＦＩが２／０／０、命令保持数ＮＨＩが２／０／０、命令発行数ＮＩＩが２／０／０である。そのため、サイクル３の命令保持数ＮＨＩは２／０／０となる。さらに、サイクル３では、命令供給部１０からスレッド１に属する命令コードが１つ発行されるため、命令発行数ＮＩＩは１／０／０となる。また、サイクル３において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル３では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００６９】
サイクル４では、サイクル３においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル４では、サイクル３のフェッチ数ＮＦＩが２／０／０、命令保持数ＮＨＩが２／０／０、命令発行数ＮＩＩが１／０／０である。そのため、サイクル４の命令保持数ＮＨＩは３／０／０となる。さらに、サイクル４では、命令供給部１０からスレッド１に属する命令コードが２つ発行されるため、命令発行数ＮＩＩは１／０／０となる。また、サイクル４において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たす。そのため、サイクル４では、アドレス選択信号ＡｄＳｅｌによりスレッド２が選択される。
【００７０】
サイクル５では、サイクル４においてアドレス選択信号ＡｄＳｅｌによりスレッド２が選択されていることに基づいて、命令キャッシュ２２がスレッド２に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは０／２／０となる。また、サイクル５では、サイクル４のフェッチ数ＮＦＩが２／０／０、命令保持数ＮＨＩが３／０／０、命令発行数ＮＩＩが１／０／０である。そのため、サイクル５の命令保持数ＮＨＩは４／０／０となる。さらに、サイクル５では、命令供給部１０からスレッド１に属する命令コードが２つ発行されるため、命令発行数ＮＩＩは２／０／０となる。また、サイクル５において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル５では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００７１】
サイクル６では、サイクル５においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル６では、サイクル５のフェッチ数ＮＦＩが０／２／０、命令保持数ＮＨＩが４／０／０、命令発行数ＮＩＩが２／０／０である。そのため、サイクル６の命令保持数ＮＨＩは２／２／０となる。さらに、サイクル６では、命令供給部１０からスレッド２に属する命令コードが２つ発行されるため、命令発行数ＮＩＩは０／２／０となる。また、サイクル６において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たす。そのため、サイクル６では、アドレス選択信号ＡｄＳｅｌによりスレッド３が選択される。
【００７２】
サイクル７では、サイクル６においてアドレス選択信号ＡｄＳｅｌによりスレッド３が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは０／０／２となる。また、サイクル７では、サイクル６のフェッチ数ＮＦＩが２／０／０、命令保持数ＮＨＩが２／２／０、命令発行数ＮＩＩが０／２／０である。そのため、サイクル７の命令保持数ＮＨＩは４／０／０となる。さらに、サイクル７では、命令供給部１０からスレッド１に属する命令コードが２つ発行されるため、命令発行数ＮＩＩは２／０／０となる。また、サイクル７において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル７では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００７３】
サイクル８では、サイクル７においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル８では、サイクル７のフェッチ数ＮＦＩが２／０／０、命令保持数ＮＨＩが４／０／０、命令発行数ＮＩＩが２／０／０である。そのため、サイクル８の命令保持数ＮＨＩは２／０／２となる。さらに、サイクル８では、命令供給部１０からスレッド１に属する命令コードとスレッド３に属する命令コードとが１つずつ発行されるため、命令発行数ＮＩＩは１／０／１となる。また、サイクル８において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル８では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【００７４】
図９で示す例では、サイクル４で副スレッドとして定義されるスレッド２に属する命令コードがフェッチされる。マルチスレッドプロセッサ１では、サイクル３〜サイクル５の動作をスレッド制御部２４により実現することで、命令キャッシュから命令バッファへの命令コードのフェッチ効率を向上させるという第２の効果を奏する。そこで、サイクル３〜サイクル５の動作について、マルチスレッドプロセッサ１のブロック図を用いてより具体的に説明する。図９のサイクル３〜サイクル５の動作を示すマルチスレッドプロセッサ１のブロック図を図１０〜図１２に示す。
【００７５】
図１０は、図９のサイクル３の動作を行っている状態のマルチスレッドプロセッサ１のブロック図である。図１０に示すように、サイクル３では、命令バッファ２３１に命令コードＩｍ３、Ｉｍ４が蓄積されている。命令供給部１０は命令コードＩｍ３を発行する。命令キャッシュ２２は、プログラムカウンタ２０１のカウント値に基づき命令コードＩｍ５、Ｉｍ６をフェッチする。
【００７６】
続いて、図１１は、図９のサイクル４の動作を行っている状態のマルチスレッドプロセッサ１のブロック図である。サイクル３において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。従って、スレッド制御部２４は、アドレス選択信号ＡｄＳｅｌによって、サイクル４において、命令バッファ２３１にスレッド１に属する命令コードＩｍ７、Ｉｍ８が蓄積されるように、スレッドを制御する。一方、サイクル４では、命令供給部１０が命令コードＩｍ４を発行する。
【００７７】
続いて、図１２は、図９のサイクル５の動作を行っている状態のマルチスレッドプロセッサ１のブロック図である。サイクル４において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たす。つまり、サイクル５では、命令バッファ２３１に発行最大数ＮＭＩの２倍の命令コードが蓄積された状態となる。従って、スレッド制御部２４は、アドレス選択信号ＡｄＳｅｌによって、サイクル５において、命令バッファ２３２にスレッド２に属する命令コードＩｓａ１、Ｉｓａ２が蓄積されるように、スレッドを制御する。一方、サイクル５では、命令供給部１０が命令コードＩｍ５、Ｉｍ６を発行する。
【００７８】
一般的には、１つのスレッドから生成される命令コードの命令並列性（ＩＬＰ）には限界がある。この命令並列性により、平均的にフェッチされる命令数は発行される命令数よりも多くなる。そこで、実施の形態１にかかるマルチスレッドプロセッサ１では、上述したように、フェッチ数と命令発行数との差分にかかる命令コードを蓄積する。また、マルチスレッドプロセッサ１では、主スレッドに対応して設けられる命令バッファに最大発行数の命令発行サイクルが２回連続したとしても十分な数の命令コードが格納されるまで主スレッドに対応した命令バッファへの命令コードのフェッチを継続する。このような動作により、マルチスレッドプロセッサ１は、主スレッドに対応して設けられる命令バッファへのフェッチに代えて副スレッドに対応して設けられる命令バッファへのフェッチを行っている間に主スレッドに属する命令コードの発行がストールすることを防止することができる。つまり、マルチスレッドプロセッサ１は、命令キャッシュのフェッチ能力を効率よく利用することができる。
【００７９】
一般的に、マルチスレッド動作可能なＶＬＩＷプロセッサにおいて一のスレッドを考えた場合、平均的に命令フェッチ数が命令発行数よりも多くなる。上記説明より、実施の形態１にかかるマルチスレッドプロセッサ１は、主スレッドに関し、命令フェッチ数と命令発行数との差分に相当する数の命令コードを命令バッファに蓄積する。また、マルチスレッドプロセッサ１は、スレッド制御部２４が、命令コードのフェッチを行うことなく主スレッドに対応する命令バッファが少なくとも２サイクルの期間命令コードの発行を継続できる場合に限り、副スレッドに対応する命令バッファに命令コードを蓄積する。
【００８０】
マルチスレッドプロセッサ１は、上記のような構成及び制御により、主スレッドに対応する命令バッファへの命令コードのフェッチを停止した場合においても命令コードの発行を停止させることがない。つまり、マルチスレッドプロセッサ１は、主スレッドの処理効率を向上させることができる。また、マルチスレッドプロセッサ１は、上記のような構成及び制御により、命令発行数を命令フェッチ数に近づけることができるため、命令キャッシュのフェッチ効率を向上させることができる。
【００８１】
ここで、マルチスレッドプロセッサ１の処理効率が向上する効果について定量的な説明をする。一般的なマルチスレッドプロセッサでは、命令バッファの命令コードの格納数が命令発行最大数と同じ数に設定される。また、一般的なマルチスレッドプロセッサ１では、所定の選択順序（例えば、ラウンドロビン方式）により処理対処のスレッドを選択する。そこで、このような一般的なマルチスレッドプロセッサの動作を示すタイミングチャートを図１３に示す。
【００８２】
図１３に示す例では、スレッド１が主スレッドであり、スレッド２、３が副スレッドである。また、図１３に示す例では、スレッド１が２回選択された後にスレッド２が選択され、その後さらにスレッド１が２回選択された後にスレッド３が選択されるというスレッド選択シーケンスが繰り返される。また、図１３に示す例では、命令保持数の最大値は２に制限される。
【００８３】
図１３に示す例では、サイクル１でスレッド１に属する命令コードが２個フェッチされる。そして、サイクル２において、スレッド１に属する命令コードが２個命令バッファに保持されると共に、保持された命令コードの１つが発行される。また、サイクル２では、スレッド１に属する命令コードが２個フェッチされる。
【００８４】
そして、サイクル３において、サイクル２でフェッチされたスレッド１に属する命令コードが命令バッファに格納されるが、このとき、サイクル２で発行されなかった命令コードが命令バッファに残っている。そのため、サイクル３では、サイクル２でフェッチされた命令コードのうち１つは命令バッファに蓄積されるが、他の１つは廃棄される。また、サイクル３では、スレッド１に属する命令コードが１つ発行される。さらに、サイクル３では、スレッド２に属する命令コードが２個フェッチされる。そして、サイクル４では、命令保持数が１／２／０となる。
【００８５】
このサイクル４で、スレッド１に属する命令コードを２つ発行使用とした場合、スレッド１に関する命令保持数は１である。そのため、サイクル４において、スレッド１の命令コードが発行できないストール状態が発生する。このサイクル４までの期間にフェッチされるスレッド１に属する命令コード数が６であり、発行できなかった命令コード数は１があるため、サイクル４までの間において、従来のマルチスレッドプロセッサでは、スレッド１に関し１６％（＝１／６）の性能低下が生じる。
【００８６】
また、平均的な命令並列性（ＩＬＰ）の限界のために、命令フェッチ数は命令発行数よりも大きくなる。図１３に示す例では、サイクル２では命令フェッチ数が２であるのに対して命令発行数が１である。つまり、図１３に示す例では、サイクル２でフェッチされた名コードが１つ無駄になっている。従来のマルチスレッドプロセッサでは、サイクル４までの間に１６個の命令コードがフェッチされ、２つの命令コードが廃棄されていることから命令フェッチ能力に関し１２．５％（＝２／１６）の性能低下が生じる。
【００８７】
実施の形態１にかかるマルチスレッドプロセッサ１では、主スレッドに対応する命令バッファには命令コードのフェッチを行うことなく２サイクル以上命令コードを発行することができるため、従来のマルチスレッドプロセッサのような性能低下は生じない。
【００８８】
なお、実施の形態１にかかるマルチスレッドプロセッサ１では、主スレッドに対応する命令バッファの容量よりも副スレッドに対応する命令バッファの容量を小さくすることで、複数レッドに対応する命令バッファに関する回路面積を削減することができる。
【００８９】
実施の形態２
実施の形態２では、スレッド制御部２４の別の形態について説明する。スレッド制御部２４の別の形態を示すスレッド制御部２４ａのブロック図を図１４に示す。図１４に示すように、スレッド制御部２４ａは、スレッド制御部２４に低スレッド強制処理部を追加したものである。低スレッド強制処理部は、アドレス選択信号ＡｄＳｅｌ［１］が第１のカウント値を選択する状態を示した動作サイクル数をカウントし、当該動作サイクルが規定回数に達したことに応じてアドレス選択信号ＡｄＳｅｌ［２］〜ＡｄＳｅｌ［ｍ］が第２のカウント値を選択した状態とする。スレッド制御部２４ａでは、低スレッド強制処理部をカウンタ３３及びＡＮＤ回路３４により構成する。
【００９０】
カウンタ３３は、アドレス選択信号ＡｄＳｅｌ［１］が選択状態を示す動作サイクル数をカウントする。そして、カウンタ３３は、動作サイクル数が規定回数に達したことに応じて、抑制信号をアサート（アドレス選択信号ＡｄＳｅｌ［１］が非選択状態を指定する状態）する。ＡＮＤ回路３４は、抑制信号がアサートされている期間は、アドレス選択信号ＡｄＳｅｌ［１］を非選択状態とし、抑制信号がネゲートされている期間は、高スレッド選択部３０の出力信号をアドレス選択信号ＡｄＳｅｌ［１］とする。
【００９１】
続いて、スレッド制御部２４ａを有するマルチスレッドプロセッサ１ａの動作について説明する。図１５にマルチスレッドプロセッサ１ａの動作を示すタイミングチャートを示す。図１５に示す例では、カウンタ３３の規定回数として２が設定される。図１５に示すように、スレッド制御部２４ａは、フェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩの値にかかわらずカウント値ＣＮＴが２に達した動作サイクルで副スレッドを選択した状態とする。
【００９２】
スレッド制御部２４がフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩの値のみを考慮してアドレス選択信号ＡｄＳｅｌによる選択スレッドの切り替えを行った場合、副スレッドに属する命令コードがフェッチされないことが生じる。しかし、実施の形態２にかかるスレッド制御部２４ａを用いた場合、所定の動作サイクル数毎に副スレッドに属する命令コードがフェッチされる。つまり、実施の形態２にかかるマルチスレッドプロセッサ１ａでは、副スレッドの処理が未処理のままとなることを防ぐことができる。
【００９３】
実施の形態３
実施の形態３では、複数のスレッドを実行している場合に、一のスレッドが他のスレッドの演算の終了を待ち合わせて処理を進める待ち合わせ動作を行うマルチスレッドプロセッサについて説明する。この待ち合わせ処理は、例えば、主スレッドが副スレッドの演算結果を用いる場合に有効である。以下の説明では、動作及びマルチスレッドプロセッサの一例として、スレッド１（主スレッド）がスレッド２（副スレッド）の演算終了を待って処理を進める例について説明する。
【００９４】
実施の形態３にかかるマルチスレッドプロセッサ２のブロック図を図１６に示す。図１６に示すように、マルチスレッドプロセッサ２は、マルチスレッドプロセッサ１に待ち合わせ制御部２５を追加し、かつ、スレッド制御部２４に代えてスレッド制御部２４ｂを用いたものである。
【００９５】
待ち合わせ制御部２５は、アドレス選択信号ＡｄＳｅｌが所定のアドレス値を選択する状態となることを抑制する制御信号ＳＣをスレッド制御部２４ｂに出力し、第１のカウント値ＰＣ１が予め設定された第１の切り替え閾値Ｃ１に達した場合に制御信号ＳＣをアドレス選択信号ＡｄＳｅｌが第１のカウント値ＰＣ１に対応するスレッドを選択する状態となることを防止するスレッド抑制状態とし、その後、第２のカウント値ＰＣ２が予め設定された第２の切り替え閾値Ｃ２に達した場合に制御信号ＳＣのスレッド抑制状態を解除する。図１６に示す例では、第１のカウント値としてプログラムカウンタ２０１のカウント値ＰＣ１が用いられ、第２のカウント値としてプログラムカウンタ２０２のカウント値ＰＣ２が用いられる。
【００９６】
ここで、待ち合わせ制御部２５のブロック図を図１７に示す。図１７に示すように、待ち合わせ制御部２５は、比較器４０１、４０２、制御信号生成部４１１、４１２を有する。比較器４０１には、カウント値ＰＣ１と切り替え閾値Ｃ１が入力される。比較器４０２には、カウント値ＰＣ２と切り替え閾値Ｃ２が入力される。そして、比較器４０１、４０２は、入力されるカウント値と切り替え閾値とが一致した場合にスレッド切り替え通知信号ＣＲをアサート（例えば、１）する。この切り替え閾値Ｃ１、Ｃ２は、図示しない他の回路によって設定される。なお、図１７に示す例では、比較器４０１がスレッド切り替え通知信号ＣＲ１を出力し、比較器４０２がスレッド切り替え通知信号ＣＲ２を出力する。さらに、スレッド切り替え通知信号ＣＲ１は制御信号生成部４１１に出力され、スレッド切り替え通知信号ＣＲ２は制御信号生成部４１１、４１２に出力される。
【００９７】
なお、比較器が対応するスレッドが待ち合わせ処理を必要としない場合、切り替え閾値としてカウント値が取り得ない値を設定することで、対応するスレッドの待ち合わせ処理を無効にすることができる。例えば、プログラムカウンタのカウント値の初期値が１である場合、切り替え閾値として０を設定すれば良い。
【００９８】
制御信号生成部４１１は、スレッド切り替え通知信号ＣＲ１、ＣＲ２が入力され、制御信号ＳＣ［１］を生成する。制御信号ＳＣ［１］は、スレッド１に対応する制御信号である。そして、制御信号生成部４１１は、スレッド切り替え通知信号ＣＲ１がアサート状態とされるたことに応じて制御信号ＳＣ［１］をアサート状態する。さらに、制御信号生成部４１１は、スレッド切り替え通知信号ＣＲ１がアサート状態である期間にスレッド切り替え通知信号ＣＲ２がアサート状態とされることに応じて制御信号ＳＣ［１］をアサート状態からネゲート状態とする。
【００９９】
ここで、制御信号生成部４１１の詳細な回路図を図１８に示す。図１８に示すように、制御信号生成部４１１は、ＡＮＤ回路５１１、５１２、６１を有する。ＡＮＤ回路５１１は、スレッド切り替え通知信号ＣＲ１と待ち合わせ設定値Ｓ１との論理積を出力する。ＡＮＤ回路５１２は、スレッド切り替え通知信号ＣＲ２の反転値と待ち合わせ設定値Ｓ２との論理積を出力する。ＡＮＤ回路６１は、ＡＮＤ回路５１１の出力値とＡＮＤ回路５１２の出力値との論理積を制御信号ＳＣ［１］として出力する。
【０１００】
制御信号生成部４１２は、スレッド切り替え通知信号ＣＲ２が入力され、制御信号ＳＣ［２］を生成する。制御信号ＳＣ［２］は、スレッド２に対応する制御信号である。そして、制御信号生成部４１２は、スレッド切り替え通知信号ＣＲ２がアサート状態とされるたことに応じて制御信号ＳＣ［２］をアサート状態する。
【０１０１】
ここで、制御信号生成部４１２の詳細な回路図を図１９に示す。図１９に示すように、制御信号生成部４１２は、ＡＮＤ回路５２１を有する。ＡＮＤ回路５２１は、スレッド切り替え通知信号ＣＲ２と待ち合わせ設定値Ｓ２との論理積を制御信号ＳＣ［２］として出力する。
【０１０２】
上記待ち合わせ設定値Ｓ１、Ｓ２は、例えば、０又は１を示す値であり、スレッド１、２がどのような待ち合わせ処理を行うかによって設定される値である。本実施の形態では、スレッド１のカウント値ＰＣ１が切り替え閾値Ｃ１に達した状態でスレッド２のカウント値ＰＣ１が切り替え閾値Ｃ２に達していない場合に、スレッド１に関する命令コードのフェッチを抑制し、スレッド２の処理を待ち合わせる。そのため、待ち合わせ設定値Ｓ１、Ｓ２としては１が設定される。待ち合わせ処理を行わない場合待ち合わせ設定値Ｓ１、Ｓ２は０に設定される。待ち合わせ設定値Ｓ１、Ｓ２は、図示しない他の回路によって設定される。
【０１０３】
続いてスレッド制御部２４ｂについて説明する。スレッド制御部２４ｂは、スレッド制御部２４ａに制御信号ＳＣに基づくアドレス選択信号ＡｄＳｅｌの制御機能を追加したものである。具体的には、スレッド制御部２４ｂは、制御信号ＳＣがアサートされた場合に、アサートされた制御信号ＳＣに対応するスレッドを除くスレッドのみが選択されるようにアドレス選択信号ＡｄＳｅｌを制御する。
【０１０４】
スレッド制御部２４ｂのブロック図を図２０に示す。図２０に示すように、スレッド制御部２４ｂは、スレッド制御部２４ａのラウンドロビン選択部３１に代えてラウンドロビン選択部３５を備え、ＡＮＤ回路３４に代えてＡＮＤ回路３６を備える。
【０１０５】
ラウンドロビン選択部３５は、アドレス選択信号ＡｄＳｅｌ［１］に応じて副スレッドに属するスレッドを巡回的に選択する信号を生成する。また、ラウンドロビン選択部３５には、制御信号ＳＣ［２］が入力される。ラウンドロビン選択部３５は、制御信号ＳＣ［２］がアサート状態であれば、スレッド２を除くスレッドに対応する信号を巡回的に選択状態とする。
【０１０６】
ＡＮＤ回路３６は、カウンタ３３が出力する抑制信号と、高スレッド選択部３０の出力信号、及び、制御信号ＳＣ［１］が入力される。そして、ＡＮＤ回路３６は、抑制信号がアサートされている期間又は制御信号ＳＣ［１］がアサートされている期間は、アドレス選択信号ＡｄＳｅｌ［１］を非選択状態とし、抑制信号と制御信号ＳＣ［１］との両方がネゲートされている期間は、高スレッド選択部３０の出力信号をアドレス選択信号ＡｄＳｅｌ［１］とする。
【０１０７】
続いて、実施の形態３にかかるマルチスレッドプロセッサ２の動作について説明する。図２１にマルチスレッドプロセッサ２の動作を示すタイミングチャートを示す。図２１に示す例では、処理対象のスレッド数を３とし、スレッド１を主スレッド、スレッド２、３を副スレッドとした。また、カウンタ３３の所定値を７、切り替え閾値Ｃ１をｐ（ｐは整数）、切り替え閾値Ｃ２をｑ（ｑは整数）、待ち合わせ設定値Ｓ１、Ｓ２を１とした。つまり、図２１に示す例は、スレッド１が終了し、かつ、その終了時点でスレッド２が所定の演算を終えていない場合にスレッド１のフェッチが抑制される状態を示すものである。
【０１０８】
図２１に示す例では、サイクル０においてスレッド１が起動する。サイクル０では、命令キャッシュ２２から命令コードのフェッチは行われず、命令バッファ２３１〜２３３に保持されている命令コードもない状態である。また、サイクル０において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル０では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【０１０９】
サイクル１では、サイクル０においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル１では、命令キャッシュ２２がフェッチした命令コードは命令バッファに格納されていない。また、サイクル１において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル１では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。また、サイクル１では、アドレス選択信号ＡｄＳｅｌ［１］が選択状態であるため、カウンタ３３のカウント値ＣＮＴが１増加する
【０１１０】
サイクル２では、サイクル１においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクル２では、サイクル１で命令キャッシュ２２がフェッチした命令コードがスレッド１に対応して設けられた命令バッファ２３１に格納される。そのため、命令保持数ＮＨＩは２／０／０となる。さらに、サイクル２では、命令供給部１０からスレッド１に属する命令コードが１つ発行されるため、命令発行数ＮＩＩは１／０／０となる。ここで、命令供給部１０が発行する命令数は、同時発行数の最大値を２とし、命令バッファ２３１〜２３３に保持されている命令コードが利用する演算器の種類に基づき決定される。つまり、命令バッファ２３１の先頭の２つの命令コードが、同じ演算器を利用する場合は同時発行数が１となり、異なる演算器を利用する場合は同時発行数が２となる。また、サイクル２において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクル２では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【０１１１】
そして、サイクル２からサイクルｎまでは、実施の形態３にかかるマルチスレッドプロセッサ２は、実施の形態２にかかるマルチスレッドプロセッサ１ａと同様の動作により処理が進む。そして、処理がサイクルｎに達した時点において、マルチスレッドプロセッサ２は、スレッド１に属する命令コードを２つフェッチする。つまり、サイクルｎにおけるフェッチ数は２／０／０である。また、サイクルｎでは、サイクルｎ−１までの処理によって、命令保持数ＮＨＩは２／０／０となる。さらに、サイクルｎでは、命令供給部１０からスレッド１に属する命令コードが２つ発行されるため、命令発行数ＮＩＩは２／０／０となる。また、サイクルｎにおいて、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクルｎでは、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。また、サイクルｎでは、アドレス選択信号ＡｄＳｅｌ［１］が選択状態であるため、カウント値ＣＮＴが１増加して２となる。
【０１１２】
サイクルｎ＋１では、サイクルｎにおいてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクルｎ＋１では、サイクルｎのフェッチ数ＮＦＩが２／０／０、命令保持数ＮＨＩが２／０／０、命令発行数ＮＩＩが２／０／０である。そのため、サイクルｎ＋１の命令保持数ＮＨＩは２／０／０となる。さらに、サイクルｎ＋１では、命令供給部１０からスレッド１に属する命令コードが２つ発行されるため、命令発行数ＮＩＩは２／０／０となる。また、サイクルｎ＋１において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない。そのため、サイクルｎ＋１では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。また、サイクルｎでは、アドレス選択信号ＡｄＳｅｌ［１］が選択状態であるため、カウント値ＣＮＴが１増加して２となる。
【０１１３】
サイクルｎ＋２では、サイクルｎ＋１においてアドレス選択信号ＡｄＳｅｌによりスレッド１が選択されていることに基づいて、命令キャッシュ２２がスレッド１に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは２／０／０となる。また、サイクルｎ＋２では、サイクルｎ＋１のフェッチ数ＮＦＩが２／０／０、命令保持数ＮＨＩが２／０／０、命令発行数ＮＩＩが２／０／０である。そのため、サイクルｎ＋２の命令保持数ＮＨＩは２／０／０となる。さらに、サイクルｎ＋２では、命令供給部１０からスレッド１に属する命令コードが１つずつ発行されるため、命令発行数ＮＩＩは１／０／０となる。
【０１１４】
ここで、図２１に示す例では、サイクルｎ＋２において、プログラムカウンタ２０１のカウント値ＰＣ１（例えば、第１のアドレス値）がｐに達するものとする。そのため、サイクルｎ＋２において、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさないが、サイクルｎ＋２では、制御信号ＳＣ［１］がアサート状態となり、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される状態が抑制される。そして、図２１に示す例では、アドレス選択信号ＡｄＳｅｌ［１］に代えて第２のカウント値を選択状態とするアドレス選択信号ＡｄＳｅｌ［２］が１となる。つまり、サイクルｎ＋２では、スレッド２が選択される。なお、サイクルｎ＋２では、カウンタ３３のカウント値ＣＮＴが規定値の７に達していないが、ＡＮＤ回路３６は、制御信号ＳＣ［１］がアサート状態であれば、カウンタ３３の抑制信号の状態にかかわらずアドレス選択信号ＡｄＳｅｌ［１］を非選択状態とする。また、サイクルｎ＋２では、アドレス選択信号ＡｄＳｅｌ［１］が非選択状態となるため、カウント値ＣＮＴがリセットされる。
【０１１５】
サイクルｎ＋３では、サイクルｎ＋２においてアドレス選択信号ＡｄＳｅｌによりスレッド２が選択されていることに基づいて、命令キャッシュ２２がスレッド２に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは０／２／０となる。また、サイクルｎ＋３では、サイクルｎ＋２のフェッチ数ＮＦＩが２／０／０、命令保持数ＮＨＩが２／０／０、命令発行数ＮＩＩが１／０／０である。そのため、サイクルｎ＋３の命令保持数ＮＨＩは３／０／０となる。さらに、サイクルｎ＋３では、命令供給部１０からスレッド１に属する命令コードが２つ発行されるため、命令発行数ＮＩＩは２／０／０となる。また、サイクルｎ＋３では、制御信号ＳＣ［１］がアサート状態であるため、サイクルｎ＋３では、アドレス選択信号ＡｄＳｅｌによりスレッド３が選択される。
【０１１６】
サイクルｎ＋４では、サイクルｎ＋３においてアドレス選択信号ＡｄＳｅｌによりスレッド３が選択されていることに基づいて、命令キャッシュ２２がスレッド３に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは０／０／２となる。また、サイクルｎ＋４では、サイクルｎ＋３のフェッチ数ＮＦＩが０／２／０、命令保持数ＮＨＩが３／０／０、命令発行数ＮＩＩが２／０／０である。そのため、サイクルｎ＋４の命令保持数ＮＨＩは１／２／０となる。さらに、サイクルｎ＋４では、命令供給部１０からスレッド１に属する命令コードとスレッド２に属する命令コードが１つずつ発行されるため、命令発行数ＮＩＩは１／１／０となる。また、サイクルｎ＋４では、制御信号ＳＣ［１］がアサート状態であること、及び、サイクルｎ＋３の選択スレッドがスレッド３であったことに基づきスレッド２が選択される。
【０１１７】
サイクルｎ＋５では、サイクルｎ＋４においてアドレス選択信号ＡｄＳｅｌによりスレッド２が選択されていることに基づいて、命令キャッシュ２２がスレッド２に属する命令コードを２個フェッチする。つまり、フェッチ数ＮＦＩは０／２／０となる。また、サイクルｎ＋５では、サイクルｎ＋４のフェッチ数ＮＦＩが０／０／２、命令保持数ＮＨＩが１／２／０、命令発行数ＮＩＩが１／１／０である。そのため、サイクルｎ＋５の命令保持数ＮＨＩは０／１／２となる。さらに、サイクルｎ＋５では、命令供給部１０からスレッド２に属する命令コードとスレッド３に属する命令コードが１つずつ発行されるため、命令発行数ＮＩＩは０／１／１となる。
【０１１８】
ここで、図２１に示す例では、サイクルｎ＋５において、スレッド２に属する命令コードがフェッチされることで、カウント値ＰＣ２（例えば、第２のカウント値）がｑに達する。そのため、サイクルｎ＋５では、スレッド切り替え通知信号ＣＲ１がアサート状態の期間にスレッド切り替え通知信号ＣＲ２がアサート状態となる。そにため、スレッド切り通知信号ＣＲ２がアサート状態に切り替わったことに応じて、制御信号ＳＣ［１］がネゲート状態に切り替わり、制御信号ＳＣ［２］がアサート状態に切り替わる。このようなことから、サイクルｎ＋５では、アドレス選択信号ＡｄＳｅｌによりスレッド１を選択することが可能になり、かつ、スレッド１に対応するフェッチ数ＮＦＩ、命令保持数ＮＨＩ、命令発行数ＮＩＩに基づき上述した（１）式を計算すると、（１）式の条件を満たさない状態となる。従って、サイクルｎ＋５では、アドレス選択信号ＡｄＳｅｌによりスレッド１が選択される。
【０１１９】
ここで、図２１のサイクルｎ〜ｎ＋５の間に選択されるスレッドの切り替わりを示すシーケンス図を図２２に示す。図２２に示すように、サイクルｎ＋１で、カウント値ＰＣ１がｐに達すると、主スレッドの選択は抑制され、副スレッドから処理対処のスレッドが選択される。本実施の形態では、ラウンドロビン方式で副スレッドを選択する。そのため、サイクルｎ＋２〜ｎ＋３の期間は、スレッド２とスレッド３が巡回的に選択される。そして、サイクルｎ＋５で、カウント値ＰＣ２がｑに達すると、制御信号ＳＣ［１］がネゲート状態となるため、スレッド１が選択される。このような処理を行うことで、マルチスレッドプロセッサ２は、値がｐとなるカウント値ＰＣ１に対応する命令コード以降の命令コードをスレッド２の処理が完了した後にフェッチすることが可能になる。
【０１２０】
上記説明より、実施の形態３にかかるマルチスレッドプロセッサ２は、待ち合わせ制御部２５を有する。そして、待ち合わせ制御部２５は、プログラムカウンタのカウント値に基づき特定のスレッドの選択を抑制する制御信号ＳＣを生成する。これにより、マルチスレッドプロセッサ２では、各スレッドの進捗度に応じて一部のスレッドが選択されることを抑制することが可能となる。
【０１２１】
マルチスレッドプロセッサでは、主スレッドが副スレッドの終了を条件として処理を進めることがある。このような場合、副スレッドの終了を検出するために主スレッドが無限ループ処理を行う。従来、この無限ループ処理を行うためには、無限ループを実行するための命令コードのフェッチが必要であった。この無限ループ処理は、副スレッドに属する命令コードのフェッチを阻害することになる。
【０１２２】
しかしながら、実施の形態３にかかるマルチスレッドプロセッサ２は、主スレッドにおいて無限ループに関する命令コードをフェッチすることなく副スレッドの終了を条件とした待ち合わせ処理を実行することができる。つまり、実施の形態３にかかるマルチスレッドプロセッサ２は、待ち合わせ処理の対象となるスレッドに対する命令フェッチ能力を向上させることができる。
【０１２３】
また、主スレッドに対応した命令バッファに蓄積された命令コードの数のみに基づき副スレッドの命令コードのフェッチを行った場合、主スレッドの命令コードが終了すると、主スレッドに対応した命令バッファに命令コードが蓄積されない。そのため、このような場合には、スレッド制御部が副スレッドに対応する第２のカウント値を選択状態とするアドレス選択信号ＡｄＳｅｌを生成できない問題がある。しかし、実施の形態３にかかるマルチスレッドプロセッサ２では、プログラムカウンタ２０１のカウント値に基づき主スレッドの終了を検出し、主スレッドの終了後は、主スレッドの選択を抑制して副スレッドを実行することができる。
【０１２４】
実施の形態３では、スレッド１がスレッド２の終了を待ち合わせる例について説明した。しかし、待ち合わせ制御部２５において、スレッド１が待ち合わせを必要とするカウント値と、スレッド２、３の処理が終了するカウント値とを設定して、上記待ち合わせ処理を行うことも可能である。この場合、スレッド１は、スレッド２とスレッド３との２つのスレッドの終了を条件（或いは、いずれかのスレッドの終了を条件）として処理を再開させることが可能である。つまり、待ち合わせの方式や待ち合わせ条件の設定方法については、種々の変更が可能である。
【０１２５】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
【符号の説明】
【０１２６】
ＡｄＳｅｌ    アドレス選択信号
ＮＦＩ    フェッチ数
ＮＨＩ    命令保持数
ＮＩＩ    命令発行数
ＮＭＩ    発行最大数
Ｃ１、Ｃ２    切り替え閾値
Ｓ１、Ｓ２    待ち合わせ設定値
ＳＣ    制御信号
１、１ａ、２    マルチスレッドプロセッサ
１０    命令供給部
１１    命令セレクタ
１２    命令デコーダ
１３    命令実行部
２１    アドレスセレクタ
２２    命令キャッシュ
２４、２４ａ、２４ｂ    スレッド制御部
２５    待ち合わせ制御部
３０    高スレッド選択部
３１、３５    ラウンドロビン選択部
３２    低スレッド選択部
３３    カウンタ
３４、３６、６１    ＡＮＤ回路
５１１、５１２、５２１    ＡＮＤ回路
２０１-２０ｍ    プログラムカウンタ
２３１-２３ｍ    命令バッファ
２３１    命令バッファ
２３２    命令バッファ
４０１-４０２    比較器
４１１-４１２    制御信号生成部
【図１】
2012059195.tif 000003
【図２】
2012059195.tif 000004
【図３】
2012059195.tif 000005
【図４】
2012059195.tif 000006
【図５】
2012059195.tif 000007
【図６】
2012059195.tif 000008
【図７】
2012059195.tif 000009
【図８】
2012059195.tif 000010
【図９】
2012059195.tif 000011
【図１０】
2012059195.tif 000012
【図１１】
2012059195.tif 000013
【図１２】
2012059195.tif 000014
【図１３】
2012059195.tif 000015
【図１４】
2012059195.tif 000016
【図１５】
2012059195.tif 000017
【図１６】
2012059195.tif 000018
【図１７】
2012059195.tif 000019
【図１８】
2012059195.tif 000020
【図１９】
2012059195.tif 000021
【図２０】
2012059195.tif 000022
【図２１】
2012059195.tif 000023
【図２２】
2012059195.tif 000024