説明

マルチスレッドプロセッサ

【課題】従来のマルチスレッドプロセッサは、処理能力を十分に引き出すことができない問題があった。
【解決手段】本発明のマルチスレッドプロセッサは、第1の命令コードを格納する第1の命令バッファ231と、第2の命令コードを格納する第2の命令バッファ232〜23mと、を備える命令供給部10と、第1、第2の命令バッファから発行される命令コード選択する命令セレクタ11と、命令セレクタ11が選択した命令コードをデコードする命令デコーダ12と、デコード結果に基づく情報処理を行う命令実行部13と、を有する。命令供給部10は、優先的に第1の命令バッファに第1の命令コードを格納し、第1の命令バッファに格納される第1の命令コードの数が命令供給部10が並列して発行可能な命令コード数の最大値の2倍以上となった場合に第2の命令バッファに第2の命令コードを格納するスレッド制御部24を有する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明はマルチスレッドプロセッサに関し、特に高優先度のスレッドと、低優先度のスレッドと、を実行するマルチスレッドプロセッサに関する。
【背景技術】
【0002】
プロセッサは、外部メモリからプログラム及び処理対象データを読み出してデータ処理を行う。このようなプロセッサでは、命令コードを直列的に処理することでデータ処理を進める。なお、プロセッサは、命令供給部と、命令デコーダ、命令実行部とを有する。命令供給部は、外部メモリからプログラムをフェッチする。命令デコーダは、命令供給部が供給する命令をデコードし、命令実行部の制御情報を生成する。命令実行部は、前記制御情報に基づき、外部メモリに格納されているデータを処理する。
【0003】
しかし、プロセッサは、処理能力の向上が強く求められている。そのため、処理能力向上のために多くの手法が提案されている。この手法には、例えば、VLIW(Very Long Instruction Word)プロセッサと、マルチスレッドプロセッサとがある。
【0004】
VLIWプロセッサは、複数の命令を並列して処理する。VLIWプロセッサは、命令供給部、命令デコーダ、命令実行部を有する。つまり、基本的な構成は、一般的なプロセッサとは変わらない。しかし、VLIWプロセッサでは、命令供給部が外部メモリから複数の命令をフェッチし、命令デコーダが複数の命令をデコードして複数の制御情報を生成する。そして、命令実行部は、複数の制御情報に基づき、複数のデータを並列処理する。このVLIWプロセッサには、平均的な命令並列性(Instruction-Level parallelism:ILP)の限界があるため、その性能向上には限界がある。
【0005】
マルチスレッドプロセッサは、独立した複数のプログラム(スレッド)を並列実行することで、VLIWプロセッサのILPの限界を超えることができる。マルチスレッドプロセッサは、命令供給部、命令デコーダ、命令実行部に加えて命令セレクタを有する。マルチスレッドプロセッサでは、命令供給部が独立した複数のスレッドの命令をフェッチする。そして、命令供給部が、供給する複数のスレッドの命令の中からランタイムに同時実行可能な命令を抽出する。命令セレクタは、命令供給部から読み出された命令を命令デコーダ部へ供給する。
【0006】
マルチスレッドプロセッサでは、命令キャッシュと、命令バッファが設けられる。命令キャッシュは、外部メモリからフェッチした命令を格納する。命令バッファは、スレッドの数に応じた命令バッファが設けられている。命令バッファは、命令キャッシュから対応するスレッドの命令の供給を受ける。つまり、命令バッファには、処理する予定の命令がスレッド毎に格納される。マルチスレッドプロセッサは、適宜、命令バッファから命令を読み出すことで複数のスレッドを並列的に処理する。このマルチスレッドプロセッサでは、命令バッファに蓄積された命令の処理効率を向上させることで処理性能を向上させることができる。
【0007】
特許文献1では、ソフトウェアのプログラムが規定した頻度に基づき処理対象のスレッドを選択する方式が提案されている。また、非特許文献1では、複数のスレッドを循環的に選択するラウンドロビン方式、分岐が確定しているスレッドを選択する方式、命令バッファが保持する命令数が少ないスレッドを選択する方式が提案されている。
【0008】
また、特許文献2では、マルチスレッドプロセッサにおいて、メモリからの命令読み出し待ちによるプログラムの停止(メモリ・ストール)を防ぐため、命令のフェッチ・バッファに管理部を設け、フェッチ・バッファに蓄積されている命令が少なくなった場合は、そのフェッチ・バッファに対応する命令の読み出しの緊急度をあげる、といった技術が開示されている。
【先行技術文献】
【特許文献】
【0009】
【特許文献1】特開2010−86130号公報
【特許文献2】特開2006−195705号公報
【非特許文献】
【0010】
【非特許文献1】"Exploiting Choice: Instruction Fetch and Issue on an Implementable Simultaneous Multithreading Processor", International Symposium on Computer Architecture, 1996
【発明の概要】
【発明が解決しようとする課題】
【0011】
しかしながら、特許文献1及び非特許文献1に記載のスレッド選択方式では、マルチスレッド動作可能なVLIWプロセッサにおいて十分な処理能力を実現できない問題がある。例えば、一のプログラムが、処理に多くの時間を要する主処理(主スレッド)と、主スレッドの結果を利用し、かつ、少ない時間で処理可能な副処理(副スレッド)と、から構成されている場合である。この場合、最適な性能を実現するためには、主スレッドと副スレッドが同時に終了することが望ましい。
【0012】
特許文献1では、各スレッドが選択される頻度のみに基づき、選択するスレッドを決定する。そのため、特許文献1に記載のスレッド選択方式では、高優先度のスレッドが同時実行する命令数が少ない場合には、実行される命令数よりも、命令バッファにフェッチされる命令数の方が多くなり、命令バッファに処理待ちの命令が蓄積される。つまり、命令が命令バッファに格納される時間が不必要に長くなると共に、命令バッファに格納できない命令が廃棄される無駄が発生する。つまり、特許文献1に記載のスレッド選択方式では、命令キャッシュの命令供給能力が無駄になる問題がある。
【0013】
また、特許文献1に記載のスレッド選択方式では、高優先度のスレッドに対応する命令バッファに実行するのに十分な命令がない場合であっても、低優先度のスレッドに対応した命令バッファに命令が蓄積されるケースが生じる。その際には、高優先度のスレッドに対応した命令バッファに実行する命令が無くなり、処理がストール状態となり、高優先度のスレッドの実行が、過度に抑制されることになる問題が生じる。
【0014】
また、非特許文献1に記載のスレッド選択方式では、全スレッドを平等に扱うことを前提とする。そのため、主スレッドと副スレッドとの間の処理時間(あるいは、処理するスレッド数)に差がある場合、効率的な処理を行うことができない問題がある。
【0015】
また、特許文献2においても、スレッド毎、フェッチ・バッファ毎に優先度を考慮していないため、優先度の低い命令が優先して処理され、高優先度のスレッドの処理が滞る問題が生じる。特に、高優先度のスレッドにおいて処理する命令コード数が低優先度のスレッドの命令コード数よりも遙かに多いなど、命令コードの比率が極端に偏っている場合は特にこの問題は顕著になる。
【0016】
つまり、特許文献1、2及び非特許文献1に記載の技術では、マルチスレッド動作可能なVLIWプロセッサにおいて、主スレッドと副スレッドとを有するプログラムを実行しようとした場合、処理性能を十分に発揮させることができない問題がある。
【課題を解決するための手段】
【0017】
本発明にかかるマルチスレッドプロセッサの一態様は、第1のスレッドに属する第1の命令コードを格納する第1の命令バッファと、第2のスレッドに属する第2の命令コードを格納する第2の命令バッファと、を備える命令供給部と、前記第1、第2の命令バッファから発行される命令コードのうち後段回路に伝達する命令コードを選択する命令セレクタと、前記命令セレクタが選択した前記命令コードをデコードして実行命令情報を生成する命令デコーダと、前記実行命令情報に基づく情報処理を行う命令実行部と、を有し、前記命令供給部は、優先的に前記第1の命令バッファに前記第1の命令コードを格納し、前記第1の命令バッファに格納される前記第1の命令コードの数が前記命令供給部が並列して発行可能な命令コード数の最大値の2倍以上となった場合に前記第2の命令バッファに前記第2の命令コードを格納するスレッド制御部を有する。
【0018】
また、本発明にかかるマルチスレッドプロセッサの別の態様は、第1のスレッドに属する第1の命令コードと第2のスレッドに属する第2の命令コードとを時分割で実行するマルチスレッドプロセッサであって、第1のスレッドに属する第1の命令コードを格納する第1の命令バッファと、第2のスレッドに属する第2の命令コードを格納する第2の命令バッファと、優先的に前記第1の命令バッファに前記第1の命令コードを格納し、前記第1の命令バッファに格納される前記第1の命令コードの数が前記第1のバッファが並列して発行可能な命令数の最大値の2倍よりも多くなった場合に前記第2の命令バッファに前記第2の命令コードを格納するスレッド制御部と、を有する。
【0019】
本発明にかかるマルチスレッドプロセッサは、スレッド制御部が、第1の命令バッファに格納される第1の命令コードの数が第1のバッファが並列して発行可能な命令数の最大値の2倍よりも多くなった場合に第2の命令バッファに第2の命令コードを格納する。これにより、本発明にかかるマルチスレッドプロセッサでは、第2の命令バッファに命令コードを蓄積したとしても、第1の命令バッファに蓄積される命令コードがストールすること防ぐことができる。
【発明の効果】
【0020】
本発明にかかるマルチスレッドプロセッサによれば、命令バッファに命令コードを効率よく蓄積することで、処理性能を向上させることができる。
【図面の簡単な説明】
【0021】
【図1】実施の形態1にかかるマルチスレッドプロセッサのブロック図である。
【図2】実施の形態1にかかる命令キャッシュのデータ格納構造を示す概念図である。
【図3】実施の形態1にかかる命令キャッシュの命令フェッチ手順を示すタイミングチャートである。
【図4】実施の形態1にかかるスレッド制御部のブロック図である。
【図5】実施の形態1にかかる命令供給部の命令発行シーケンスを示すタイミングチャートである。
【図6】図5のスレッド3に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図7】図5のスレッド4に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図8】図5のスレッド5に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図9】実施の形態1にかかる命令供給部の命令発行シーケンスを示すタイミングチャートである。
【図10】図9のスレッド3に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図11】図9のスレッド4に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図12】図9のスレッド5に対応する動作状態のマルチスレッドプロセッサを示すブロック図である。
【図13】一般的なスレッド制御部による命令供給部の命令発行シーケンスを示すタイミングチャートである。
【図14】実施の形態2にかかるスレッド制御部のブロック図である。
【図15】実施の形態2にかかる命令供給部の命令発行シーケンスを示すタイミングチャートである。
【図16】実施の形態3にかかるマルチスレッドプロセッサのブロック図である。
【図17】実施の形態3にかかる待ち合わせ制御部のブロック図である。
【図18】実施の形態3にかかる制御信号生成部のブロック図である。
【図19】実施の形態3にかかる制御信号生成部のブロック図である。
【図20】実施の形態3にかかるスレッド制御部のブロック図である。
【図21】実施の形態3にかかる命令供給部の命令発行シーケンスを示すタイミングチャートである。
【図22】実施の形態3にかかるマルチスレッドプロセッサにおいてフェッチされるスレッドの切り替わり状態を示すシーケンス図である。
【発明を実施するための形態】
【0022】
実施の形態1
以下、図面を参照して本発明の実施の形態について説明する。本発明にかかるマルチスレッドプロセッサは、一度にフェッチする命令に複数の命令コードを含むVLIWプロセッサである。VLIWプロセッサは、複数の命令コードを並列して処理することができる。以下の説明では、1サイクルで最大2個の命令を同時実行するVLIWプロセッサを例に説明を行う。
【0023】
図1に実施の形態1にかかるマルチスレッドプロセッサ1のブロック図を示す。図1に示すように、マルチスレッドプロセッサ1は、命令供給部10、命令セレクタ11、命令デコーダ12、命令実行部13を有する。マルチスレッドプロセッサ1は、命令供給部10が外部メモリからプログラムを読み出す。命令供給部10は、読み出したプログラムに関する命令コードを発行する。マルチスレッドプロセッサ1では、命令供給部10から発行された命令コードに基づき外部メモリに格納されているデータを処理することでデータ処理を行う。
【0024】
命令供給部10は、第1のスレッド(例えば、第1のプログラム)に属する第1の命令コードを格納する第1の命令バッファと、第2のスレッド(例えば、第2のプログラム)に属する第2の命令コードを格納する第2の命令バッファと、を備える。命令供給部10は、一度に複数の命令コードを発行する。この複数の命令コードは、第1のスレッドに属するものによってのみ構成されていても良く、第1、第2のスレッドに属する命令コードが混在していても良い。本実施の形態では、第1のスレッドは、処理完了までに多くの時間を要する主スレッドであって、第2のスレッドは、少ない時間で処理が完了する副スレッドであるものとする。また、副スレッドは、主スレッドの演算結果を利用する、または、主スレッドの演算に必要な処理を準備するものとする。さらに、副スレッドは、複数のスレッドから構成されていても良い。命令供給部10の詳細については後述する。
【0025】
命令セレクタ11は、第1、第2の命令バッファから発行される命令コードのうち後段回路に伝達する命令コードを選択する。より具体的には、命令セレクタ11は、命令供給部10が発行する複数の命令コードが同一の演算ユニットを利用することがない命令コードの組み合わせを考慮して後段回路に伝達する命令コードを選択する。
【0026】
命令デコーダ12は、命令セレクタ11が選択した命令コードをデコードして実行命令情報を生成する。命令実行部13は、外部メモリから処理対処のデータを読み出す。そして命令実行部13は、命令デコーダ12がデコードした実行命令情報に基づき読み出したデータを処理する。その後、命令実行部13は、処理結果を外部メモリに書き戻す。
【0027】
実施の形態1にかかるマルチスレッドプロセッサ1は、命令供給部10において、命令バッファに蓄積させる命令コードの数の制御方法に特徴の1つを有する。そこで、命令供給部10について以下で詳細に説明する。
【0028】
図1に示すように、命令供給部10は、プログラムカウンタ201〜20m、アドレスセレクタ21、命令キャッシュ22、命令バッファ231〜23m、スレッド制御部24を有する。プログラムカウンタは、実行可能なスレッド(例えば、プログラム)の数に応じて設けられる。図1に示す例では、m個(mは整数)のスレッドに対応するものである。プログラムカウンタ201〜20mは、それぞれスレッドの進捗に合わせてカウント値を増加させる。このカウント値は、スレッドに属する命令コードが格納される命令キャッシュのアドレスを占めすポインタとして機能する。なお、以下の説明では、プログラムカウンタ201は第1のスレッド(例えば、主スレッド)に対応して設けられるものとし、プログラムカウンタ201のカウント値を第1のカウント値とする。また、プログラムカウンタ202〜20mは、第2のスレッド(例えば、副スレッド)に対応して設けられるものとし、プログラムカウンタ202〜20mのカウント値を第2のカウント値とする。
【0029】
アドレスセレクタ21は、アドレス選択信号AdSelに応じて第1のカウント値と前記第2のカウント値とのいずれか一方を選択して出力する。
【0030】
命令キャッシュ22は、外部メモリからスレッドに関連するプログラムを読み込んで、格納する。プログラムは、複数の命令コードから構成される。ここで、以下の説明では、第1のスレッドに関連するプログラムを構成する命令コードを第1の命令コードと称し、第2のスレッドに関連するプログラムを構成する命令コードを第2お命令コードと称す。命令キャッシュ22は、第1のカウント値に応じて第1の命令コードを第1の命令バッファ231にフェッチし、第2のカウント値に応じて第2の命令コードを第2の命令バッファ232〜23mにフェッチする。
【0031】
命令キャッシュ22は、入力されるカウント値に応じて複数の命令コードをフェッチする。複数の命令コードは、同一のスレッドに属する命令コードであり、命令キャッシュ22上において連続するアドレスに格納されるものである。実施の形態1にかかるマルチスレッドプロセッサ1は、命令供給部10が同時に発行可能な命令コードの最大数NMIとして2が設定される。従って、マルチスレッドプロセッサ1では、命令キャッシュ22は、2つの命令コードをフェッチするものとする。ここで、命令キャッシュ22のデータ格納構造の概念図を図2に示す。図2に示すように、命令キャッシュ22は、スレッド毎に命令コードを格納する。図2に示す例では、第1のスレッド(例えば、スレッド1)が命令コードIm1〜Im16により構成され、第2のスレッド(例えば、スレッド2)が命令コードIsa1〜Isa6により構成され、第2のスレッド(例えば、スレッドm)が命令コードIsx1〜Isx8により構成される。そして、命令キャッシュ22は、入力されるカウント値をポインタとし、当該ポインタにより示されるアドレスと当該アドレスに続くアドレスに格納されるデータをフェッチする。
【0032】
命令バッファ231〜23mは、スレッドに対応して設けられる。ここで、本実施の形態では、命令バッファ231は、第1のスレッドに対応して設けられる第1の命令バッファとして機能する。命令バッファ232〜23mは、第2のスレッドに対応して設けられる第2の命令バッファとして機能する。実施の形態1にかかるマルチスレッドプロセッサ1では、第1の命令バッファの容量を命令供給部10が同時に発行可能な命令コードの最大数NMIの2倍以上に設定する。図1に示す例では、命令供給部10が同時に発行可能な命令コードの最大数NMIが2に設定される。そのため、図1に示す例では、第1の命令バッファとして用いられる命令バッファ231は4つの命令を格納可能に設定される。また、第1、第2の命令バッファは、同容量に設定しても良いが、第2の命令バッファの容量を第1の命令バッファよりも小容量に設定しても良い。
【0033】
実施の形態1にかかるマルチスレッドプロセッサ1は、VLIWプロセッサであるため、命令キャッシュから命令バッファへの命令のフェッチ方法が単一の命令コードをフェッチする一般的な方式とは異なる。そこで、マルチスレッドプロセッサ1において、処理対象のスレッドが1つである場合の命令フェッチ手順を示すタイミングチャートを図3に示す。この図3を参照して処理対象スレッドが1スレッドである場合の命令フェッチ手順の説明を行う。なお、マルチスレッドプロセッサ1では、動作サイクル毎に処理が進むものとする。また、図3では、スレッド1のみを処理対象スレッドとし、プログラムカウンタ201のカウント値が増加する例を示す。
【0034】
図3に示す例では、サイクル0でプログラムカウンタ201がリセットされる。そして、サイクル1でプログラムカウンタ201のカウント値が1となる。このとき、命令バッファ231には命令コードは蓄積されていない。そのため、命令キャッシュ22は、2つの命令コードをフェッチする。図3に示す例では、命令キャッシュ22は、カウント値"1"に対応する命令コードIm1と、命令コードIm1に続く命令コードIm2と、をフェッチする。命令キャッシュ22が2つの命令コードを同時にフェッチするのは、命令供給部10の同時発行命令の最大数NMIが2であるためである。また、命令キャッシュ22と命令バッファ231との間の帯域幅は、同時にフェッチされる命令コードを十分に転送できる帯域に設定される。
【0035】
続いて、サイクル2においてプログラムカウンタ201のカウント値が増加する。カウント増加数は、命令キャッシュ22の同時フェッチ命令コード数に対応して、最大値が2に設定される。また、カウント増加数は、命令バッファ231が保持することができる最大命令数をHmax、命令バッファ231に保持されている命令数をHMI、命令供給部10が発行する命令コードの数をNIIとすると、カウント増加数=Hmax−(HNI−NII)で表される。図3に示す例では、サイクル1のカウント増加数が4であるため、サイクル2のカウント増加数は2となる。従って、サイクル2では、プログラムカウンタ201のカウント値は3となる。そして、命令キャッシュ22は、カウント値"3"に対応して命令コードIm3、Im4がフェッチされる。また、サイクル2では、サイクル1においてフェッチされた命令コードIm1、Im2が命令バッファ231に格納されると共に、命令コードIm1が発行される。
【0036】
続いて、サイクル3では、サイクル2におけるカウント増加数が3であるため、プログラムカウンタ201のカウント値は最大の増加数の2だけ増加して5となる。そして、命令キャッシュ22からは、カウント値"5"に対応して命令コードIm5、Im6がフェッチされる。サイクル2において命令コードIm1が発行され、かつ、命令コードIm3、Im4がフェッチされている。そのため、サイクル3で命令バッファ231に蓄積されている命令コードは、命令コードIm2、Im3、Im4の3つである。そして、図3に示す例では、サイクル3で、命令コードIm2が発行される。これにより、サイクル3の動作完了時のカウント増加数は2となる。
【0037】
続いて、サイクル4では、サイクル3におけるカウント増加数が2であるため、プログラムカウンタ201のカウント値は2増加して7となる。そして、命令キャッシュ22からは、カウント値"7"に対応して命令コードIm7、Im8がフェッチされる。サイクル3において命令コードIm2が発行され、かつ、命令コードIm5、Im6がフェッチされている。そのため、サイクル4で命令バッファ231に蓄積されている命令コードは、命令コードIm3、Im4、Im5、Im6の4つである。そして、図3に示す例では、サイクル4で、命令コードIm3が発行される。これにより、サイクル4の動作完了時のカウント増加数は1となる。
【0038】
続いて、サイクル5では、サイクル4におけるカウント増加数が1であるため、プログラムカウンタ201のカウント値は1増加して8となる。そして、命令キャッシュ22からは、カウント値"8"に対応して命令コードIm8、Im9がフェッチされる。サイクル4において命令コードIm3が発行され、かつ、命令コードIm7、Im8がフェッチされている。しかし、サイクル5では、命令バッファ231の保持可能な命令数が1しかない。そのため、命令コードIm8は、サイクル5では廃棄されることになる。サイクル5で命令バッファ231に蓄積されている命令コードは、命令コードIm4、Im5、Im6、Im7の4つである。そして、図3に示す例では、サイクル5で、命令コードIm4が発行される。これにより、サイクル5の動作完了時のカウント増加数は1となる。
【0039】
続いて、サイクル6では、サイクル5におけるカウント増加数が1であるため、プログラムカウンタ201のカウント値は1増加して9となる。そして、命令キャッシュ22からは、カウント値"9"に対応して命令コードIm9、Im10がフェッチされる。サイクル5において命令コードIm4が発行され、かつ、命令コードIm8、Im9がフェッチされている。しかし、サイクル6では、命令バッファ231の保持可能な命令数が1しかない。そのため、命令コードIm9は、サイクル6では廃棄されることになる。サイクル6で命令バッファ231に蓄積されている命令コードは、命令コードIm5、Im6、Im7、Im8の4つである。そして、図3に示す例では、サイクル6で、命令コードIm5、Im6が発行される。これにより、サイクル6の動作完了時のカウント増加数は2となる。
【0040】
続いて、サイクル7では、サイクル6におけるカウント増加数が2であるため、プログラムカウンタ201のカウント値は2増加して11となる。そして、命令キャッシュ22からは、カウント値"11"に対応して命令コードIm11、Im12がフェッチされる。サイクル6において命令コードIm5、Im6が発行され、かつ、命令コードIm9、Im10がフェッチされている。そのため、サイクル7で命令バッファ231に蓄積されている命令コードは、命令コードIm7、Im8、Im9、Im10の4つである。そして、図3に示す例では、サイクル7で、命令コードIm7、Im8が発行される。これにより、サイクル7の動作完了時のカウント増加数は2となる。
【0041】
続いて、サイクル8では、サイクル7におけるカウント増加数が2であるため、プログラムカウンタ201のカウント値は2増加して13となる。そして、命令キャッシュ22からは、カウント値"13"に対応して命令コードIm13、Im14がフェッチされる。サイクル7において命令コードIm7、Im8が発行され、かつ、命令コードIm11、Im12がフェッチされている。そのため、サイクル8で命令バッファ231に蓄積されている命令コードは、命令コードIm9、Im10、Im11、Im12の4つである。そして、図3に示す例では、サイクル8で、命令コードIm9が発行される。これにより、サイクル8の動作完了時のカウント増加数は1となる。
【0042】
このように、プログラムカウンタ201は、命令バッファ231の最大保持命令数Hmaxと命令供給部10が発行する命令コードの数に応じて、カウント値を進める。また、命令キャッシュ22は、フェッチした命令コードが命令バッファ231に保持されるか否かにかかわらず常にフェッチ可能な最大の命令コード数をフェッチする。なお、命令キャッシュ22は、フェッチした命令コードが命令バッファ231に保持されるか否かにより、最大の命令コード数以下の命令をフェッチする構成としても良い。上記で説明したプログラムカウンタ201及び命令キャッシュ22の制御方法は一例であり、その他の制御方法を適用することも可能である。
【0043】
次に、命令供給部10において命令バッファ231〜23mにいずれのスレッドに属する命令コードを蓄積するかを制御するスレッド制御部24について詳細に説明する。実施の形態1にかかるスレッド制御部24は、優先的に第1の命令バッファ(例えば、命令バッファ231)に第1の命令コード(スレッド1に属する命令コード)を格納し、命令バッファ231に格納される第1の命令コードの数が命令供給部10が並列して発行可能な命令コード数の最大値の2倍以上となった場合に第2の命令バッファ(例えば、命令バッファ232〜23m)に第2の命令コード(スレッド2〜スレッドmに属する命令コード)を格納する。本実施の形態では、スレッド制御部24が出力するアドレス選択信号AdSelをアドレスセレクタ21に出力する。スレッド制御部24は、アドレスセレクタが出力するカウント値を第1のカウント値とするか第2のカウント値とするかを第1の命令バッファに蓄積された命令コードの数に応じて切り替える。出力するカウント値の切り替えは、アドレス選択信号AdSelにより指定するプログラムカウンタを切り替えることで制御される。このような制御により、スレッド制御部24は、命令バッファへの命令コードの蓄積状態を制御する。
【0044】
また、実施の形態1にかかるマルチスレッドプロセッサ1では、命令キャッシュ22がフェッチした命令コードの数を示すフェッチ数信号NFIを出力し、命令バッファ231〜23mが保持している命令コードの数を示す命令保持数信号NHIを出力し、命令デコーダ12が命令供給部から発行された命令コードの数を示す命令発行数信号NIIを出力する。そして、スレッド制御部24は、フェッチ数信号NFI、命令保持数信号NHI、命令発行数信号NIIに基づきアドレス選択信号AdSelの状態を切り替える。なお、本実施の形態では、フェッチ数信号NFI、命令保持数信号NHI、命令発行数信号NIIはいずれも主スレッド(例えば、スレッド1)に属する命令コードの数を示すものとする。
【0045】
スレッド制御部24のブロック図を図4に示す。図4に示すように、スレッド制御部24は、高スレッド選択部30、ラウンドロビン選択部31、低スレッド選択部32を有する。本実施の形態では、スレッド制御部24が出力するアドレス選択信号AdSelは、プログラムカウンタの数に応じた複数の信号により構成される。そして、スレッド制御部24は、命令キャッシュにカウント値を伝達すべきスレッドに対応するアドレス選択信号をハイレベル(例えば、1)とすることで、アドレスセレクタ21を制御する。
【0046】
高スレッド選択部30は、第1の命令バッファに格納される命令コードの数が命令供給部10が並列して発行可能な命令の最大数NMIの2倍未満である期間はアドレス選択信号を第1のカウント値(例えば、プログラムカウンタ201のカウント値)を選択する状態(例えば、アドレス選択信号AdSel[1]を1とする状態)とする。より具体的には、高スレッド選択部30は、フェッチ数信号NFIにより示される値をNFI、命令保持数信号NHIにより示される値をNHI、命令発行数信号NIIにより示される値をNII、命令供給部10の同時発行可能な最大命令数をNMIした場合に(1)式の条件が満たされる場合に主スレッドに対応するアドレス選択信号AdSel[1]を1(例えば、選択状態)とする。
NFI+NHI≧NII+2×NMI ・・・ (1)
【0047】
ラウンドロビン選択部31は、副スレッドとして定義されるスレッド2〜スレッドmを巡回的に選択する。ラウンドロビン選択部31には主スレッド(例えば、スレッド1)のアドレス選択信号AdSel[1]が入力される。ラウンドロビン選択部31は、アドレス選択信号AdSel[1]が非選択状態を示す場合(例えば、0)となる毎に選択状態にするスレッドを切り替える。
【0048】
低スレッド選択部32は、アドレス選択信号AdSel[1]が第1のカウント値を非選択状態とした場合にアドレス選択信号AdSel[2]〜AdSel[m]を第2のカウント値を選択する状態とする。より具体的には、低スレッド選択部32は、ゲーティング回路として副スレッドの数に対応したAND回路を有する。このAND回路は、アドレス選択信号AdSel[1]が0の状態でラウンドロビン選択部31の出力信号をアドレス選択信号AdSel[2]〜AdSel[m]として出力する。
【0049】
続いて、スレッド制御部24を有する実施の形態1にかかるマルチスレッドプロセッサ1の動作について説明する。マルチスレッドプロセッサ1では、主スレッドに属する命令コードの命令バッファへの蓄積状態をスレッド制御部24により制御することで、少なくとも2つの効果を奏する。第1の効果は、主スレッドの実行効率を向上させることである。第2の効果は、命令キャッシュから命令バッファへの命令コードのフェッチ効率を向上させることである。そこで、以下の説明では、まず、第1の効果について説明する。
【0050】
第1の効果を説明するためのマルチスレッドプロセッサ1の動作を示すタイミングチャートを図5に示す。図5では、サイクル0〜サイクル8のサイクル毎に、アドレス選択信号AdSelにより選択されるスレッドとそのときの命令コードのフェッチ数、命令保持数、命令発行数を示した。また、図5に示す例では、扱うスレッド数を3とした。そして、図5に示すタイミングチャートの各欄に示される数字は、スレッド1/スレッド2/スレッド3の命令コード数である。なお、スレッド1は主スレッドであり、スレッド2、3は副スレッドである。また、図5に示す例では、命令供給部10が同時に発行可能な命令コードの最大数NMIを2と設定する。
【0051】
図5では、サイクル0で動作が開始される。サイクル0では、命令キャッシュ22から命令コードのフェッチは行われず、命令バッファ231〜233に保持されている命令コードもない状態である。また、サイクル0において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル0では、アドレス選択信号AdSelによりスレッド1が選択される。
【0052】
サイクル1では、サイクル0においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル1では、命令キャッシュ22がフェッチした命令コードは命令バッファに格納されていない。また、サイクル1において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル1では、アドレス選択信号AdSelによりスレッド1が選択される。
【0053】
サイクル2では、サイクル1においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル2では、サイクル1で命令キャッシュ22がフェッチした命令コードがスレッド1に対応して設けられた命令バッファ231に格納される。そのため、命令保持数NHIは2/0/0となる。さらに、サイクル2では、命令供給部10からスレッド1に属する命令コードが1つ発行されるため、命令発行数NIIは1/0/0となる。ここで、命令供給部10が発行する命令数は、同時発行数の最大値を2とし、命令バッファ231〜233に保持されている命令コードが利用する演算器の種類に基づき決定される。つまり、命令バッファ231の先頭の2つの命令コードが、同じ演算器を利用する場合は同時発行数が1となり、異なる演算器を利用する場合は同時発行数が2となる。また、サイクル2において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル2では、アドレス選択信号AdSelによりスレッド1が選択される。
【0054】
サイクル3では、サイクル2においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル3では、サイクル2のフェッチ数NFIが2/0/0、命令保持数NHIが2/0/0、命令発行数NIIが1/0/0である。そのため、サイクル3の命令保持数NHIは3/0/0となる。さらに、サイクル3では、命令供給部10からスレッド1に属する命令コードが1つ発行されるため、命令発行数NIIは1/0/0となる。また、サイクル3において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たす。そのため、サイクル3では、アドレス選択信号AdSelによりスレッド2が選択される。
【0055】
サイクル4では、サイクル3においてアドレス選択信号AdSelによりスレッド2が選択されていることに基づいて、命令キャッシュ22がスレッド2に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは0/2/0となる。また、サイクル4では、サイクル3のフェッチ数NFIが2/0/0、命令保持数NHIが3/0/0、命令発行数NIIが1/0/0である。そのため、サイクル4の命令保持数NHIは4/0/0となる。さらに、サイクル4では、命令供給部10からスレッド1に属する命令コードが2つ発行されるため、命令発行数NIIは2/0/0となる。また、サイクル4において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル4では、アドレス選択信号AdSelによりスレッド1が選択される。
【0056】
サイクル5では、サイクル4においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル5では、サイクル4のフェッチ数NFIが0/2/0、命令保持数NHIが4/0/0、命令発行数NIIが2/0/0である。そのため、サイクル5の命令保持数NHIは2/2/0となる。さらに、サイクル5では、命令供給部10からスレッド1に属する命令コードとスレッド2に属する命令コードとが1つずつ発行されるため、命令発行数NIIは1/1/0となる。また、サイクル5において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル5では、アドレス選択信号AdSelによりスレッド1が選択される。
【0057】
サイクル6では、サイクル5においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル6では、サイクル5のフェッチ数NFIが2/0/0、命令保持数NHIが2/2/0、命令発行数NIIが1/1/0である。そのため、サイクル6の命令保持数NHIは3/1/0となる。さらに、サイクル6では、命令供給部10からスレッド1に属する命令コードとスレッド2に属する命令コードとが1つずつ発行されるため、命令発行数NIIは1/1/0となる。また、サイクル6において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たす。そのため、サイクル6では、アドレス選択信号AdSelによりスレッド3が選択される。
【0058】
サイクル7では、サイクル6においてアドレス選択信号AdSelによりスレッド3が選択されていることに基づいて、命令キャッシュ22がスレッド3に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは0/0/2となる。また、サイクル7では、サイクル6のフェッチ数NFIが1/1/0、命令保持数NHIが3/1/0、命令発行数NIIが1/1/0である。そのため、サイクル7の命令保持数NHIは4/0/0となる。さらに、サイクル7では、命令供給部10からスレッド1に属する命令コードが2つ発行されるため、命令発行数NIIは2/0/0となる。また、サイクル7において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル7では、アドレス選択信号AdSelによりスレッド1が選択される。
【0059】
サイクル8では、サイクル7においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル8では、サイクル7のフェッチ数NFIが0/0/2、命令保持数NHIが4/0/0、命令発行数NIIが2/0/0である。そのため、サイクル8の命令保持数NHIは2/0/2となる。さらに、サイクル8では、命令供給部10からスレッド1に属する命令コードとスレッド3に属する命令コードとが1つずつ発行されるため、命令発行数NIIは1/0/1となる。また、サイクル8において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル8では、アドレス選択信号AdSelによりスレッド1が選択される。
【0060】
図5で示す例では、サイクル4で副スレッドとして定義されるスレッド2に属する命令コードがフェッチされる。マルチスレッドプロセッサ1では、サイクル3〜サイクル5の動作をスレッド制御部24により実現することで、主スレッドの実行効率を向上させるという第1の効果を奏する。そこで、サイクル3〜サイクル5の動作について、マルチスレッドプロセッサ1のブロック図を用いてより具体的に説明する。図5のサイクル3〜サイクル5の動作を示すマルチスレッドプロセッサ1のブロック図を図6〜図8に示す。
【0061】
図6は、図5のサイクル3の動作を行っている状態のマルチスレッドプロセッサ1のブロック図である。図6に示すように、サイクル3では、命令バッファ231に命令コードIm2、Im3、Im4が蓄積されている。命令供給部10は命令コードIm2を発行する。命令キャッシュ22は、プログラムカウンタ201のカウント値に基づき命令コードIm5、Im6をフェッチする。
【0062】
続いて、図7は、図5のサイクル4の動作を行っている状態のマルチスレッドプロセッサ1のブロック図である。サイクル3において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たす。つまり、サイクル4では、命令バッファ231に発行最大数NMIの2倍の命令コードが蓄積された状態となる。従って、スレッド制御部24は、アドレス選択信号AdSelによって、サイクル4において、命令バッファ232にスレッド2に属する命令コードIsa1、Isa2が蓄積されるように、スレッドを制御する。一方、サイクル4では、命令供給部10が命令コードIm3、Im4を発行する。
【0063】
続いて、図8は、図5のサイクル5の動作を行っている状態のマルチスレッドプロセッサ1のブロック図である。図8に示すように、マルチスレッドプロセッサ1では、サイクル4(図7に示す動作サイクル)において、命令バッファ231に命令コードのフェッチが行われない。しかしながら、サイクル3までの動作において、命令バッファ231には、発行最大数NMIの2倍の数の命令コードが蓄積される。そのため、サイクル4において、発行最大数NMIと同数の命令コードが発行された場合においても、命令バッファ231には、次サイクルにおいて発行される可能性のある命令コード数の最大数を満たす命令コードが蓄積された状態を維持する。つまり、副スレッドの実行が、主スレッドの実行に全く影響を与えない。そして、マルチスレッドプロセッサ1は、サイクル4においてアドレス選択信号AdSelがスレッド1を選択する状態となることに応じて、サイクル5でスレッド1に属する命令コードIm7、Im8を命令バッファ231に蓄積する。また、サイクル5では、命令バッファ231から命令コードIm5が発行され、かつ、命令バッファ232から命令コードIsa1が発行される。しかし、サイクル5において、命令バッファ231に命令コードIm7、Im8が蓄積されることで、サイクル6以降においても、発行される可能性のある命令コード数の最大数を満たす命令コードが命令バッファ231に蓄積された状態を維持することができる。
【0064】
続いて、命令キャッシュから命令バッファへの命令コードのフェッチ効率を向上させる第2の効果について説明する。第2の効果を説明するためのマルチスレッドプロセッサ1の動作を示すタイミングチャートを図9に示す。図9では、サイクル0〜サイクル8のサイクル毎に、アドレス選択信号AdSelにより選択されるスレッドとそのときの命令コードのフェッチ数、命令保持数、命令発行数を示した。また、図9に示す例では、扱うスレッド数を3とした。そして、図9に示すタイミングチャートの各欄に示される数字は、スレッド1/スレッド2/スレッド3の命令コード数である。なお、スレッド1は主スレッドであり、スレッド2、3は副スレッドである。また、図9に示す例では、命令供給部10が同時に発行可能な命令コードの最大数NMIを2と設定する。
【0065】
図9では、サイクル0で動作が開始される。サイクル0では、命令キャッシュ22から命令コードのフェッチは行われず、命令バッファ231〜233に保持されている命令コードもない状態である。また、サイクル0において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル0では、アドレス選択信号AdSelによりスレッド1が選択される。
【0066】
サイクル1では、サイクル0においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル1では、命令キャッシュ22がフェッチした命令コードは命令バッファに格納されていない。また、サイクル1において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル1では、アドレス選択信号AdSelによりスレッド1が選択される。
【0067】
サイクル2では、サイクル1においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル2では、サイクル1で命令キャッシュ22がフェッチした命令コードがスレッド1に対応して設けられた命令バッファ231に格納される。そのため、命令保持数NHIは2/0/0となる。さらに、サイクル2では、命令供給部10からスレッド1に属する命令コードが2つ発行されるため、命令発行数NIIは2/0/0となる。ここで、命令供給部10が発行する命令数は、同時発行数の最大値を2とし、命令バッファ231〜233に保持されている命令コードが利用する演算器の種類に基づき決定される。つまり、命令バッファ231の先頭の2つの命令コードが、同じ演算器を利用する場合は同時発行数が1となり、異なる演算器を利用する場合は同時発行数が2となる。また、サイクル2において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル2では、アドレス選択信号AdSelによりスレッド1が選択される。
【0068】
サイクル3では、サイクル2においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル3では、サイクル2のフェッチ数NFIが2/0/0、命令保持数NHIが2/0/0、命令発行数NIIが2/0/0である。そのため、サイクル3の命令保持数NHIは2/0/0となる。さらに、サイクル3では、命令供給部10からスレッド1に属する命令コードが1つ発行されるため、命令発行数NIIは1/0/0となる。また、サイクル3において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル3では、アドレス選択信号AdSelによりスレッド1が選択される。
【0069】
サイクル4では、サイクル3においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル4では、サイクル3のフェッチ数NFIが2/0/0、命令保持数NHIが2/0/0、命令発行数NIIが1/0/0である。そのため、サイクル4の命令保持数NHIは3/0/0となる。さらに、サイクル4では、命令供給部10からスレッド1に属する命令コードが2つ発行されるため、命令発行数NIIは1/0/0となる。また、サイクル4において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たす。そのため、サイクル4では、アドレス選択信号AdSelによりスレッド2が選択される。
【0070】
サイクル5では、サイクル4においてアドレス選択信号AdSelによりスレッド2が選択されていることに基づいて、命令キャッシュ22がスレッド2に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは0/2/0となる。また、サイクル5では、サイクル4のフェッチ数NFIが2/0/0、命令保持数NHIが3/0/0、命令発行数NIIが1/0/0である。そのため、サイクル5の命令保持数NHIは4/0/0となる。さらに、サイクル5では、命令供給部10からスレッド1に属する命令コードが2つ発行されるため、命令発行数NIIは2/0/0となる。また、サイクル5において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル5では、アドレス選択信号AdSelによりスレッド1が選択される。
【0071】
サイクル6では、サイクル5においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル6では、サイクル5のフェッチ数NFIが0/2/0、命令保持数NHIが4/0/0、命令発行数NIIが2/0/0である。そのため、サイクル6の命令保持数NHIは2/2/0となる。さらに、サイクル6では、命令供給部10からスレッド2に属する命令コードが2つ発行されるため、命令発行数NIIは0/2/0となる。また、サイクル6において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たす。そのため、サイクル6では、アドレス選択信号AdSelによりスレッド3が選択される。
【0072】
サイクル7では、サイクル6においてアドレス選択信号AdSelによりスレッド3が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは0/0/2となる。また、サイクル7では、サイクル6のフェッチ数NFIが2/0/0、命令保持数NHIが2/2/0、命令発行数NIIが0/2/0である。そのため、サイクル7の命令保持数NHIは4/0/0となる。さらに、サイクル7では、命令供給部10からスレッド1に属する命令コードが2つ発行されるため、命令発行数NIIは2/0/0となる。また、サイクル7において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル7では、アドレス選択信号AdSelによりスレッド1が選択される。
【0073】
サイクル8では、サイクル7においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル8では、サイクル7のフェッチ数NFIが2/0/0、命令保持数NHIが4/0/0、命令発行数NIIが2/0/0である。そのため、サイクル8の命令保持数NHIは2/0/2となる。さらに、サイクル8では、命令供給部10からスレッド1に属する命令コードとスレッド3に属する命令コードとが1つずつ発行されるため、命令発行数NIIは1/0/1となる。また、サイクル8において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル8では、アドレス選択信号AdSelによりスレッド1が選択される。
【0074】
図9で示す例では、サイクル4で副スレッドとして定義されるスレッド2に属する命令コードがフェッチされる。マルチスレッドプロセッサ1では、サイクル3〜サイクル5の動作をスレッド制御部24により実現することで、命令キャッシュから命令バッファへの命令コードのフェッチ効率を向上させるという第2の効果を奏する。そこで、サイクル3〜サイクル5の動作について、マルチスレッドプロセッサ1のブロック図を用いてより具体的に説明する。図9のサイクル3〜サイクル5の動作を示すマルチスレッドプロセッサ1のブロック図を図10〜図12に示す。
【0075】
図10は、図9のサイクル3の動作を行っている状態のマルチスレッドプロセッサ1のブロック図である。図10に示すように、サイクル3では、命令バッファ231に命令コードIm3、Im4が蓄積されている。命令供給部10は命令コードIm3を発行する。命令キャッシュ22は、プログラムカウンタ201のカウント値に基づき命令コードIm5、Im6をフェッチする。
【0076】
続いて、図11は、図9のサイクル4の動作を行っている状態のマルチスレッドプロセッサ1のブロック図である。サイクル3において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。従って、スレッド制御部24は、アドレス選択信号AdSelによって、サイクル4において、命令バッファ231にスレッド1に属する命令コードIm7、Im8が蓄積されるように、スレッドを制御する。一方、サイクル4では、命令供給部10が命令コードIm4を発行する。
【0077】
続いて、図12は、図9のサイクル5の動作を行っている状態のマルチスレッドプロセッサ1のブロック図である。サイクル4において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たす。つまり、サイクル5では、命令バッファ231に発行最大数NMIの2倍の命令コードが蓄積された状態となる。従って、スレッド制御部24は、アドレス選択信号AdSelによって、サイクル5において、命令バッファ232にスレッド2に属する命令コードIsa1、Isa2が蓄積されるように、スレッドを制御する。一方、サイクル5では、命令供給部10が命令コードIm5、Im6を発行する。
【0078】
一般的には、1つのスレッドから生成される命令コードの命令並列性(ILP)には限界がある。この命令並列性により、平均的にフェッチされる命令数は発行される命令数よりも多くなる。そこで、実施の形態1にかかるマルチスレッドプロセッサ1では、上述したように、フェッチ数と命令発行数との差分にかかる命令コードを蓄積する。また、マルチスレッドプロセッサ1では、主スレッドに対応して設けられる命令バッファに最大発行数の命令発行サイクルが2回連続したとしても十分な数の命令コードが格納されるまで主スレッドに対応した命令バッファへの命令コードのフェッチを継続する。このような動作により、マルチスレッドプロセッサ1は、主スレッドに対応して設けられる命令バッファへのフェッチに代えて副スレッドに対応して設けられる命令バッファへのフェッチを行っている間に主スレッドに属する命令コードの発行がストールすることを防止することができる。つまり、マルチスレッドプロセッサ1は、命令キャッシュのフェッチ能力を効率よく利用することができる。
【0079】
一般的に、マルチスレッド動作可能なVLIWプロセッサにおいて一のスレッドを考えた場合、平均的に命令フェッチ数が命令発行数よりも多くなる。上記説明より、実施の形態1にかかるマルチスレッドプロセッサ1は、主スレッドに関し、命令フェッチ数と命令発行数との差分に相当する数の命令コードを命令バッファに蓄積する。また、マルチスレッドプロセッサ1は、スレッド制御部24が、命令コードのフェッチを行うことなく主スレッドに対応する命令バッファが少なくとも2サイクルの期間命令コードの発行を継続できる場合に限り、副スレッドに対応する命令バッファに命令コードを蓄積する。
【0080】
マルチスレッドプロセッサ1は、上記のような構成及び制御により、主スレッドに対応する命令バッファへの命令コードのフェッチを停止した場合においても命令コードの発行を停止させることがない。つまり、マルチスレッドプロセッサ1は、主スレッドの処理効率を向上させることができる。また、マルチスレッドプロセッサ1は、上記のような構成及び制御により、命令発行数を命令フェッチ数に近づけることができるため、命令キャッシュのフェッチ効率を向上させることができる。
【0081】
ここで、マルチスレッドプロセッサ1の処理効率が向上する効果について定量的な説明をする。一般的なマルチスレッドプロセッサでは、命令バッファの命令コードの格納数が命令発行最大数と同じ数に設定される。また、一般的なマルチスレッドプロセッサ1では、所定の選択順序(例えば、ラウンドロビン方式)により処理対処のスレッドを選択する。そこで、このような一般的なマルチスレッドプロセッサの動作を示すタイミングチャートを図13に示す。
【0082】
図13に示す例では、スレッド1が主スレッドであり、スレッド2、3が副スレッドである。また、図13に示す例では、スレッド1が2回選択された後にスレッド2が選択され、その後さらにスレッド1が2回選択された後にスレッド3が選択されるというスレッド選択シーケンスが繰り返される。また、図13に示す例では、命令保持数の最大値は2に制限される。
【0083】
図13に示す例では、サイクル1でスレッド1に属する命令コードが2個フェッチされる。そして、サイクル2において、スレッド1に属する命令コードが2個命令バッファに保持されると共に、保持された命令コードの1つが発行される。また、サイクル2では、スレッド1に属する命令コードが2個フェッチされる。
【0084】
そして、サイクル3において、サイクル2でフェッチされたスレッド1に属する命令コードが命令バッファに格納されるが、このとき、サイクル2で発行されなかった命令コードが命令バッファに残っている。そのため、サイクル3では、サイクル2でフェッチされた命令コードのうち1つは命令バッファに蓄積されるが、他の1つは廃棄される。また、サイクル3では、スレッド1に属する命令コードが1つ発行される。さらに、サイクル3では、スレッド2に属する命令コードが2個フェッチされる。そして、サイクル4では、命令保持数が1/2/0となる。
【0085】
このサイクル4で、スレッド1に属する命令コードを2つ発行使用とした場合、スレッド1に関する命令保持数は1である。そのため、サイクル4において、スレッド1の命令コードが発行できないストール状態が発生する。このサイクル4までの期間にフェッチされるスレッド1に属する命令コード数が6であり、発行できなかった命令コード数は1があるため、サイクル4までの間において、従来のマルチスレッドプロセッサでは、スレッド1に関し16%(=1/6)の性能低下が生じる。
【0086】
また、平均的な命令並列性(ILP)の限界のために、命令フェッチ数は命令発行数よりも大きくなる。図13に示す例では、サイクル2では命令フェッチ数が2であるのに対して命令発行数が1である。つまり、図13に示す例では、サイクル2でフェッチされた名コードが1つ無駄になっている。従来のマルチスレッドプロセッサでは、サイクル4までの間に16個の命令コードがフェッチされ、2つの命令コードが廃棄されていることから命令フェッチ能力に関し12.5%(=2/16)の性能低下が生じる。
【0087】
実施の形態1にかかるマルチスレッドプロセッサ1では、主スレッドに対応する命令バッファには命令コードのフェッチを行うことなく2サイクル以上命令コードを発行することができるため、従来のマルチスレッドプロセッサのような性能低下は生じない。
【0088】
なお、実施の形態1にかかるマルチスレッドプロセッサ1では、主スレッドに対応する命令バッファの容量よりも副スレッドに対応する命令バッファの容量を小さくすることで、複数レッドに対応する命令バッファに関する回路面積を削減することができる。
【0089】
実施の形態2
実施の形態2では、スレッド制御部24の別の形態について説明する。スレッド制御部24の別の形態を示すスレッド制御部24aのブロック図を図14に示す。図14に示すように、スレッド制御部24aは、スレッド制御部24に低スレッド強制処理部を追加したものである。低スレッド強制処理部は、アドレス選択信号AdSel[1]が第1のカウント値を選択する状態を示した動作サイクル数をカウントし、当該動作サイクルが規定回数に達したことに応じてアドレス選択信号AdSel[2]〜AdSel[m]が第2のカウント値を選択した状態とする。スレッド制御部24aでは、低スレッド強制処理部をカウンタ33及びAND回路34により構成する。
【0090】
カウンタ33は、アドレス選択信号AdSel[1]が選択状態を示す動作サイクル数をカウントする。そして、カウンタ33は、動作サイクル数が規定回数に達したことに応じて、抑制信号をアサート(アドレス選択信号AdSel[1]が非選択状態を指定する状態)する。AND回路34は、抑制信号がアサートされている期間は、アドレス選択信号AdSel[1]を非選択状態とし、抑制信号がネゲートされている期間は、高スレッド選択部30の出力信号をアドレス選択信号AdSel[1]とする。
【0091】
続いて、スレッド制御部24aを有するマルチスレッドプロセッサ1aの動作について説明する。図15にマルチスレッドプロセッサ1aの動作を示すタイミングチャートを示す。図15に示す例では、カウンタ33の規定回数として2が設定される。図15に示すように、スレッド制御部24aは、フェッチ数NFI、命令保持数NHI、命令発行数NIIの値にかかわらずカウント値CNTが2に達した動作サイクルで副スレッドを選択した状態とする。
【0092】
スレッド制御部24がフェッチ数NFI、命令保持数NHI、命令発行数NIIの値のみを考慮してアドレス選択信号AdSelによる選択スレッドの切り替えを行った場合、副スレッドに属する命令コードがフェッチされないことが生じる。しかし、実施の形態2にかかるスレッド制御部24aを用いた場合、所定の動作サイクル数毎に副スレッドに属する命令コードがフェッチされる。つまり、実施の形態2にかかるマルチスレッドプロセッサ1aでは、副スレッドの処理が未処理のままとなることを防ぐことができる。
【0093】
実施の形態3
実施の形態3では、複数のスレッドを実行している場合に、一のスレッドが他のスレッドの演算の終了を待ち合わせて処理を進める待ち合わせ動作を行うマルチスレッドプロセッサについて説明する。この待ち合わせ処理は、例えば、主スレッドが副スレッドの演算結果を用いる場合に有効である。以下の説明では、動作及びマルチスレッドプロセッサの一例として、スレッド1(主スレッド)がスレッド2(副スレッド)の演算終了を待って処理を進める例について説明する。
【0094】
実施の形態3にかかるマルチスレッドプロセッサ2のブロック図を図16に示す。図16に示すように、マルチスレッドプロセッサ2は、マルチスレッドプロセッサ1に待ち合わせ制御部25を追加し、かつ、スレッド制御部24に代えてスレッド制御部24bを用いたものである。
【0095】
待ち合わせ制御部25は、アドレス選択信号AdSelが所定のアドレス値を選択する状態となることを抑制する制御信号SCをスレッド制御部24bに出力し、第1のカウント値PC1が予め設定された第1の切り替え閾値C1に達した場合に制御信号SCをアドレス選択信号AdSelが第1のカウント値PC1に対応するスレッドを選択する状態となることを防止するスレッド抑制状態とし、その後、第2のカウント値PC2が予め設定された第2の切り替え閾値C2に達した場合に制御信号SCのスレッド抑制状態を解除する。図16に示す例では、第1のカウント値としてプログラムカウンタ201のカウント値PC1が用いられ、第2のカウント値としてプログラムカウンタ202のカウント値PC2が用いられる。
【0096】
ここで、待ち合わせ制御部25のブロック図を図17に示す。図17に示すように、待ち合わせ制御部25は、比較器401、402、制御信号生成部411、412を有する。比較器401には、カウント値PC1と切り替え閾値C1が入力される。比較器402には、カウント値PC2と切り替え閾値C2が入力される。そして、比較器401、402は、入力されるカウント値と切り替え閾値とが一致した場合にスレッド切り替え通知信号CRをアサート(例えば、1)する。この切り替え閾値C1、C2は、図示しない他の回路によって設定される。なお、図17に示す例では、比較器401がスレッド切り替え通知信号CR1を出力し、比較器402がスレッド切り替え通知信号CR2を出力する。さらに、スレッド切り替え通知信号CR1は制御信号生成部411に出力され、スレッド切り替え通知信号CR2は制御信号生成部411、412に出力される。
【0097】
なお、比較器が対応するスレッドが待ち合わせ処理を必要としない場合、切り替え閾値としてカウント値が取り得ない値を設定することで、対応するスレッドの待ち合わせ処理を無効にすることができる。例えば、プログラムカウンタのカウント値の初期値が1である場合、切り替え閾値として0を設定すれば良い。
【0098】
制御信号生成部411は、スレッド切り替え通知信号CR1、CR2が入力され、制御信号SC[1]を生成する。制御信号SC[1]は、スレッド1に対応する制御信号である。そして、制御信号生成部411は、スレッド切り替え通知信号CR1がアサート状態とされるたことに応じて制御信号SC[1]をアサート状態する。さらに、制御信号生成部411は、スレッド切り替え通知信号CR1がアサート状態である期間にスレッド切り替え通知信号CR2がアサート状態とされることに応じて制御信号SC[1]をアサート状態からネゲート状態とする。
【0099】
ここで、制御信号生成部411の詳細な回路図を図18に示す。図18に示すように、制御信号生成部411は、AND回路511、512、61を有する。AND回路511は、スレッド切り替え通知信号CR1と待ち合わせ設定値S1との論理積を出力する。AND回路512は、スレッド切り替え通知信号CR2の反転値と待ち合わせ設定値S2との論理積を出力する。AND回路61は、AND回路511の出力値とAND回路512の出力値との論理積を制御信号SC[1]として出力する。
【0100】
制御信号生成部412は、スレッド切り替え通知信号CR2が入力され、制御信号SC[2]を生成する。制御信号SC[2]は、スレッド2に対応する制御信号である。そして、制御信号生成部412は、スレッド切り替え通知信号CR2がアサート状態とされるたことに応じて制御信号SC[2]をアサート状態する。
【0101】
ここで、制御信号生成部412の詳細な回路図を図19に示す。図19に示すように、制御信号生成部412は、AND回路521を有する。AND回路521は、スレッド切り替え通知信号CR2と待ち合わせ設定値S2との論理積を制御信号SC[2]として出力する。
【0102】
上記待ち合わせ設定値S1、S2は、例えば、0又は1を示す値であり、スレッド1、2がどのような待ち合わせ処理を行うかによって設定される値である。本実施の形態では、スレッド1のカウント値PC1が切り替え閾値C1に達した状態でスレッド2のカウント値PC1が切り替え閾値C2に達していない場合に、スレッド1に関する命令コードのフェッチを抑制し、スレッド2の処理を待ち合わせる。そのため、待ち合わせ設定値S1、S2としては1が設定される。待ち合わせ処理を行わない場合待ち合わせ設定値S1、S2は0に設定される。待ち合わせ設定値S1、S2は、図示しない他の回路によって設定される。
【0103】
続いてスレッド制御部24bについて説明する。スレッド制御部24bは、スレッド制御部24aに制御信号SCに基づくアドレス選択信号AdSelの制御機能を追加したものである。具体的には、スレッド制御部24bは、制御信号SCがアサートされた場合に、アサートされた制御信号SCに対応するスレッドを除くスレッドのみが選択されるようにアドレス選択信号AdSelを制御する。
【0104】
スレッド制御部24bのブロック図を図20に示す。図20に示すように、スレッド制御部24bは、スレッド制御部24aのラウンドロビン選択部31に代えてラウンドロビン選択部35を備え、AND回路34に代えてAND回路36を備える。
【0105】
ラウンドロビン選択部35は、アドレス選択信号AdSel[1]に応じて副スレッドに属するスレッドを巡回的に選択する信号を生成する。また、ラウンドロビン選択部35には、制御信号SC[2]が入力される。ラウンドロビン選択部35は、制御信号SC[2]がアサート状態であれば、スレッド2を除くスレッドに対応する信号を巡回的に選択状態とする。
【0106】
AND回路36は、カウンタ33が出力する抑制信号と、高スレッド選択部30の出力信号、及び、制御信号SC[1]が入力される。そして、AND回路36は、抑制信号がアサートされている期間又は制御信号SC[1]がアサートされている期間は、アドレス選択信号AdSel[1]を非選択状態とし、抑制信号と制御信号SC[1]との両方がネゲートされている期間は、高スレッド選択部30の出力信号をアドレス選択信号AdSel[1]とする。
【0107】
続いて、実施の形態3にかかるマルチスレッドプロセッサ2の動作について説明する。図21にマルチスレッドプロセッサ2の動作を示すタイミングチャートを示す。図21に示す例では、処理対象のスレッド数を3とし、スレッド1を主スレッド、スレッド2、3を副スレッドとした。また、カウンタ33の所定値を7、切り替え閾値C1をp(pは整数)、切り替え閾値C2をq(qは整数)、待ち合わせ設定値S1、S2を1とした。つまり、図21に示す例は、スレッド1が終了し、かつ、その終了時点でスレッド2が所定の演算を終えていない場合にスレッド1のフェッチが抑制される状態を示すものである。
【0108】
図21に示す例では、サイクル0においてスレッド1が起動する。サイクル0では、命令キャッシュ22から命令コードのフェッチは行われず、命令バッファ231〜233に保持されている命令コードもない状態である。また、サイクル0において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル0では、アドレス選択信号AdSelによりスレッド1が選択される。
【0109】
サイクル1では、サイクル0においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル1では、命令キャッシュ22がフェッチした命令コードは命令バッファに格納されていない。また、サイクル1において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル1では、アドレス選択信号AdSelによりスレッド1が選択される。また、サイクル1では、アドレス選択信号AdSel[1]が選択状態であるため、カウンタ33のカウント値CNTが1増加する
【0110】
サイクル2では、サイクル1においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクル2では、サイクル1で命令キャッシュ22がフェッチした命令コードがスレッド1に対応して設けられた命令バッファ231に格納される。そのため、命令保持数NHIは2/0/0となる。さらに、サイクル2では、命令供給部10からスレッド1に属する命令コードが1つ発行されるため、命令発行数NIIは1/0/0となる。ここで、命令供給部10が発行する命令数は、同時発行数の最大値を2とし、命令バッファ231〜233に保持されている命令コードが利用する演算器の種類に基づき決定される。つまり、命令バッファ231の先頭の2つの命令コードが、同じ演算器を利用する場合は同時発行数が1となり、異なる演算器を利用する場合は同時発行数が2となる。また、サイクル2において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクル2では、アドレス選択信号AdSelによりスレッド1が選択される。
【0111】
そして、サイクル2からサイクルnまでは、実施の形態3にかかるマルチスレッドプロセッサ2は、実施の形態2にかかるマルチスレッドプロセッサ1aと同様の動作により処理が進む。そして、処理がサイクルnに達した時点において、マルチスレッドプロセッサ2は、スレッド1に属する命令コードを2つフェッチする。つまり、サイクルnにおけるフェッチ数は2/0/0である。また、サイクルnでは、サイクルn−1までの処理によって、命令保持数NHIは2/0/0となる。さらに、サイクルnでは、命令供給部10からスレッド1に属する命令コードが2つ発行されるため、命令発行数NIIは2/0/0となる。また、サイクルnにおいて、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクルnでは、アドレス選択信号AdSelによりスレッド1が選択される。また、サイクルnでは、アドレス選択信号AdSel[1]が選択状態であるため、カウント値CNTが1増加して2となる。
【0112】
サイクルn+1では、サイクルnにおいてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクルn+1では、サイクルnのフェッチ数NFIが2/0/0、命令保持数NHIが2/0/0、命令発行数NIIが2/0/0である。そのため、サイクルn+1の命令保持数NHIは2/0/0となる。さらに、サイクルn+1では、命令供給部10からスレッド1に属する命令コードが2つ発行されるため、命令発行数NIIは2/0/0となる。また、サイクルn+1において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない。そのため、サイクルn+1では、アドレス選択信号AdSelによりスレッド1が選択される。また、サイクルnでは、アドレス選択信号AdSel[1]が選択状態であるため、カウント値CNTが1増加して2となる。
【0113】
サイクルn+2では、サイクルn+1においてアドレス選択信号AdSelによりスレッド1が選択されていることに基づいて、命令キャッシュ22がスレッド1に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは2/0/0となる。また、サイクルn+2では、サイクルn+1のフェッチ数NFIが2/0/0、命令保持数NHIが2/0/0、命令発行数NIIが2/0/0である。そのため、サイクルn+2の命令保持数NHIは2/0/0となる。さらに、サイクルn+2では、命令供給部10からスレッド1に属する命令コードが1つずつ発行されるため、命令発行数NIIは1/0/0となる。
【0114】
ここで、図21に示す例では、サイクルn+2において、プログラムカウンタ201のカウント値PC1(例えば、第1のアドレス値)がpに達するものとする。そのため、サイクルn+2において、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさないが、サイクルn+2では、制御信号SC[1]がアサート状態となり、アドレス選択信号AdSelによりスレッド1が選択される状態が抑制される。そして、図21に示す例では、アドレス選択信号AdSel[1]に代えて第2のカウント値を選択状態とするアドレス選択信号AdSel[2]が1となる。つまり、サイクルn+2では、スレッド2が選択される。なお、サイクルn+2では、カウンタ33のカウント値CNTが規定値の7に達していないが、AND回路36は、制御信号SC[1]がアサート状態であれば、カウンタ33の抑制信号の状態にかかわらずアドレス選択信号AdSel[1]を非選択状態とする。また、サイクルn+2では、アドレス選択信号AdSel[1]が非選択状態となるため、カウント値CNTがリセットされる。
【0115】
サイクルn+3では、サイクルn+2においてアドレス選択信号AdSelによりスレッド2が選択されていることに基づいて、命令キャッシュ22がスレッド2に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは0/2/0となる。また、サイクルn+3では、サイクルn+2のフェッチ数NFIが2/0/0、命令保持数NHIが2/0/0、命令発行数NIIが1/0/0である。そのため、サイクルn+3の命令保持数NHIは3/0/0となる。さらに、サイクルn+3では、命令供給部10からスレッド1に属する命令コードが2つ発行されるため、命令発行数NIIは2/0/0となる。また、サイクルn+3では、制御信号SC[1]がアサート状態であるため、サイクルn+3では、アドレス選択信号AdSelによりスレッド3が選択される。
【0116】
サイクルn+4では、サイクルn+3においてアドレス選択信号AdSelによりスレッド3が選択されていることに基づいて、命令キャッシュ22がスレッド3に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは0/0/2となる。また、サイクルn+4では、サイクルn+3のフェッチ数NFIが0/2/0、命令保持数NHIが3/0/0、命令発行数NIIが2/0/0である。そのため、サイクルn+4の命令保持数NHIは1/2/0となる。さらに、サイクルn+4では、命令供給部10からスレッド1に属する命令コードとスレッド2に属する命令コードが1つずつ発行されるため、命令発行数NIIは1/1/0となる。また、サイクルn+4では、制御信号SC[1]がアサート状態であること、及び、サイクルn+3の選択スレッドがスレッド3であったことに基づきスレッド2が選択される。
【0117】
サイクルn+5では、サイクルn+4においてアドレス選択信号AdSelによりスレッド2が選択されていることに基づいて、命令キャッシュ22がスレッド2に属する命令コードを2個フェッチする。つまり、フェッチ数NFIは0/2/0となる。また、サイクルn+5では、サイクルn+4のフェッチ数NFIが0/0/2、命令保持数NHIが1/2/0、命令発行数NIIが1/1/0である。そのため、サイクルn+5の命令保持数NHIは0/1/2となる。さらに、サイクルn+5では、命令供給部10からスレッド2に属する命令コードとスレッド3に属する命令コードが1つずつ発行されるため、命令発行数NIIは0/1/1となる。
【0118】
ここで、図21に示す例では、サイクルn+5において、スレッド2に属する命令コードがフェッチされることで、カウント値PC2(例えば、第2のカウント値)がqに達する。そのため、サイクルn+5では、スレッド切り替え通知信号CR1がアサート状態の期間にスレッド切り替え通知信号CR2がアサート状態となる。そにため、スレッド切り通知信号CR2がアサート状態に切り替わったことに応じて、制御信号SC[1]がネゲート状態に切り替わり、制御信号SC[2]がアサート状態に切り替わる。このようなことから、サイクルn+5では、アドレス選択信号AdSelによりスレッド1を選択することが可能になり、かつ、スレッド1に対応するフェッチ数NFI、命令保持数NHI、命令発行数NIIに基づき上述した(1)式を計算すると、(1)式の条件を満たさない状態となる。従って、サイクルn+5では、アドレス選択信号AdSelによりスレッド1が選択される。
【0119】
ここで、図21のサイクルn〜n+5の間に選択されるスレッドの切り替わりを示すシーケンス図を図22に示す。図22に示すように、サイクルn+1で、カウント値PC1がpに達すると、主スレッドの選択は抑制され、副スレッドから処理対処のスレッドが選択される。本実施の形態では、ラウンドロビン方式で副スレッドを選択する。そのため、サイクルn+2〜n+3の期間は、スレッド2とスレッド3が巡回的に選択される。そして、サイクルn+5で、カウント値PC2がqに達すると、制御信号SC[1]がネゲート状態となるため、スレッド1が選択される。このような処理を行うことで、マルチスレッドプロセッサ2は、値がpとなるカウント値PC1に対応する命令コード以降の命令コードをスレッド2の処理が完了した後にフェッチすることが可能になる。
【0120】
上記説明より、実施の形態3にかかるマルチスレッドプロセッサ2は、待ち合わせ制御部25を有する。そして、待ち合わせ制御部25は、プログラムカウンタのカウント値に基づき特定のスレッドの選択を抑制する制御信号SCを生成する。これにより、マルチスレッドプロセッサ2では、各スレッドの進捗度に応じて一部のスレッドが選択されることを抑制することが可能となる。
【0121】
マルチスレッドプロセッサでは、主スレッドが副スレッドの終了を条件として処理を進めることがある。このような場合、副スレッドの終了を検出するために主スレッドが無限ループ処理を行う。従来、この無限ループ処理を行うためには、無限ループを実行するための命令コードのフェッチが必要であった。この無限ループ処理は、副スレッドに属する命令コードのフェッチを阻害することになる。
【0122】
しかしながら、実施の形態3にかかるマルチスレッドプロセッサ2は、主スレッドにおいて無限ループに関する命令コードをフェッチすることなく副スレッドの終了を条件とした待ち合わせ処理を実行することができる。つまり、実施の形態3にかかるマルチスレッドプロセッサ2は、待ち合わせ処理の対象となるスレッドに対する命令フェッチ能力を向上させることができる。
【0123】
また、主スレッドに対応した命令バッファに蓄積された命令コードの数のみに基づき副スレッドの命令コードのフェッチを行った場合、主スレッドの命令コードが終了すると、主スレッドに対応した命令バッファに命令コードが蓄積されない。そのため、このような場合には、スレッド制御部が副スレッドに対応する第2のカウント値を選択状態とするアドレス選択信号AdSelを生成できない問題がある。しかし、実施の形態3にかかるマルチスレッドプロセッサ2では、プログラムカウンタ201のカウント値に基づき主スレッドの終了を検出し、主スレッドの終了後は、主スレッドの選択を抑制して副スレッドを実行することができる。
【0124】
実施の形態3では、スレッド1がスレッド2の終了を待ち合わせる例について説明した。しかし、待ち合わせ制御部25において、スレッド1が待ち合わせを必要とするカウント値と、スレッド2、3の処理が終了するカウント値とを設定して、上記待ち合わせ処理を行うことも可能である。この場合、スレッド1は、スレッド2とスレッド3との2つのスレッドの終了を条件(或いは、いずれかのスレッドの終了を条件)として処理を再開させることが可能である。つまり、待ち合わせの方式や待ち合わせ条件の設定方法については、種々の変更が可能である。
【0125】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
【符号の説明】
【0126】
AdSel アドレス選択信号
NFI フェッチ数
NHI 命令保持数
NII 命令発行数
NMI 発行最大数
C1、C2 切り替え閾値
S1、S2 待ち合わせ設定値
SC 制御信号
1、1a、2 マルチスレッドプロセッサ
10 命令供給部
11 命令セレクタ
12 命令デコーダ
13 命令実行部
21 アドレスセレクタ
22 命令キャッシュ
24、24a、24b スレッド制御部
25 待ち合わせ制御部
30 高スレッド選択部
31、35 ラウンドロビン選択部
32 低スレッド選択部
33 カウンタ
34、36、61 AND回路
511、512、521 AND回路
201-20m プログラムカウンタ
231-23m 命令バッファ
231 命令バッファ
232 命令バッファ
401-402 比較器
411-412 制御信号生成部

【特許請求の範囲】
【請求項1】
第1のスレッドに属する第1の命令コードを格納する第1の命令バッファと、第2のスレッドに属する第2の命令コードを格納する第2の命令バッファと、を備える命令供給部と、
前記第1、第2の命令バッファから発行される命令コードのうち後段回路に伝達する命令コードを選択する命令セレクタと、
前記命令セレクタが選択した前記命令コードをデコードして実行命令情報を生成する命令デコーダと、
前記実行命令情報に基づく情報処理を行う命令実行部と、を有し、
前記命令供給部は、
優先的に前記第1の命令バッファに前記第1の命令コードを格納し、前記第1の命令バッファに格納される前記第1の命令コードの数が前記命令供給部が並列して発行可能な命令コード数の最大値の2倍以上となった場合に前記第2の命令バッファに前記第2の命令コードを格納するスレッド制御部を有するマルチスレッドプロセッサ。
【請求項2】
前記命令供給部は、
前記第1のスレッドに応じて設けられ、前記第1のスレッドの進度に応じて第1のカウント値を増加させる第1のプログラムカウンタと、
前記第2のスレッドに応じて設けられ、前記第2のスレッドの進度に応じて第2のカウント値を増加させる第2のプログラムカウンタと、
アドレス選択信号に応じて前記第1のカウント値と前記第2のカウント値とのいずれか一方を選択して出力するアドレスセレクタと、
前記第1、第2の命令コードを外部メモリから読み出して格納し、前記第1のカウント値に応じて前記第1の命令コードを前記第1の命令バッファに出力し、前記第2のカウント値に応じて前記第2の命令コードを前記第2の命令バッファに出力する命令キャッシュと、
前記第1の命令バッファに蓄積された命令コードの数に応じて、前記アドレス選択信号により前記第1のカウント値と前記第2のカウント値とのいずれを指示するかを切り替えるスレッド制御部と、
を有する請求項1に記載のマルチスレッドプロセッサ。
【請求項3】
前記スレッド制御部は、前記第1の命令バッファに格納される命令コードの数が前記命令供給部が並列して発行可能な命令数の最大値の2倍未満である期間は前記アドレス選択信号を前記第1のカウント値を選択する状態とする高スレッド選択部を有する請求項2に記載のマルチスレッドプロセッサ。
【請求項4】
前記スレッド制御部は、前記アドレス選択信号が前記第1のカウント値を非選択状態とした場合に前記アドレス選択信号を前記第2のカウント値を選択する状態とする低スレッド選択部を有する請求項2又は3に記載のマルチスレッドプロセッサ。
【請求項5】
前記スレッド制御部は、前記アドレス選択信号が前記第1のカウント値を選択する状態を示した動作サイクル数をカウントし、当該動作サイクルが規定回数に達したことに応じて前記アドレス選択信号が第2のカウント値を選択した状態とする低スレッド強制処理部を有する請求項4に記載のマルチスレッドプロセッサ。
【請求項6】
前記アドレス選択信号が所定のアドレス値を選択する状態となることを抑制する制御信号を前記スレッド制御部に出力し、前記第1のカウント値が予め設定された第1の切り替え閾値に達した場合に前記制御信号を前記アドレス選択信号が前記第1のカウント値に対応するスレッドを選択する状態となることを防止するスレッド抑制状態とし、その後、前記第2のカウント値が予め設定された第2の切り替え閾値に達した場合に前記制御信号の前記スレッド抑制状態を解除する待ち合わせ部を有する請求項3乃至5のいずれか1項に記載のマルチスレッドプロセッサ。
【請求項7】
前記第1のスレッドは主スレッドであって、前記第2のスレッドは副スレッドであって、前記副スレッドは、前記主スレッドによる演算結果を用いて演算を行う請求項1乃至6のいずれか1項に記載のマルチスレッドプロセッサ。
【請求項8】
前記第2の命令バッファは、前記第1の命令バッファよりも記憶容量が小さく設定される請求項1乃至7のいずれか1項に記載のマルチスレッドプロセッサ。
【請求項9】
前記第1の命令バッファは、複数の第1の命令コードを並列して格納し、第2の命令バッファは、複数の第2の命令コードを並列して格納し、前記命令実行部は、複数の命令コードからデコードされた複数の実行命令情報を並列的に処理する請求項1乃至8のいずれか1項に記載のマルチスレッドプロセッサ。
【請求項10】
第1のスレッドに属する第1の命令コードと第2のスレッドに属する第2の命令コードとを時分割で実行するマルチスレッドプロセッサであって、
第1のスレッドに属する第1の命令コードを格納する第1の命令バッファと、
第2のスレッドに属する第2の命令コードを格納する第2の命令バッファと、
優先的に前記第1の命令バッファに前記第1の命令コードを格納し、前記第1の命令バッファに格納される前記第1の命令コードの数が前記第1のバッファが並列して発行可能な命令数の最大値の2倍よりも多くなった場合に前記第2の命令バッファに前記第2の命令コードを格納するスレッド制御部と、
を有するマルチスレッドプロセッサ。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate

【図21】
image rotate

【図22】
image rotate