(57)【要約】【課題】コスト及び消費電力を低減しつつ、並列処理の性能を向上する。【解決手段】並列プロセッサは、繰り返し指定付きの複合演算命令と同期命令とを有するプロセッサ命令を保持するフェッチユニット２０と、プロセッサ命令をデコードするデコーダユニット４０と、複合演算命令に基づいて並列に演算を実行し、同期命令に応じてパイプライン接続が制御される複数のパイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢと、フェッチユニットとデコーダユニットとの間に設けられ、同期命令に応じてパイプライン演算器のパイプライン接続の実行開始タイミングを制御する同期制御ユニット３０とを具備する。【選択図】      図１
2009054032.tif 000002
【特許請求の範囲】
【請求項１】
繰り返し指定付きの複合演算命令と同期命令とを有するプロセッサ命令を保持するフェッチユニットと、
前記プロセッサ命令をデコードするデコーダユニットと、
前記複合演算命令に基づいて並列に演算を実行し、前記同期命令に応じてパイプライン接続が制御される複数のパイプライン演算器と、
前記フェッチユニットと前記デコーダユニットとの間に設けられ、前記同期命令に応じて前記パイプライン演算器の前記パイプライン接続の実行開始タイミングを制御する同期制御ユニットと
を具備することを特徴とする並列プロセッサ。
【請求項２】
前記同期制御ユニットは、前記パイプライン接続を行う前段のパイプライン演算器の演算結果のライトバックを待って、このライトバックされた前記演算結果を参照して後段のパイプライン演算器の実行を開始する制御を行うことを特徴とする請求項１に記載の並列プロセッサ。
【請求項３】
前記前段のパイプライン演算器の前記演算結果を保持し、前記前段のパイプライン演算器と前記後段のパイプライン演算器との前記パイプライン接続を行うパイプラインレジスタと
をさらに具備することを特徴とする請求項２に記載の並列プロセッサ。
【請求項４】
前記パイプラインレジスタによる前記パイプライン接続は、前記前段のパイプライン演算器の前記ライトバックの進み進み具合の状態に合わせて、前記同期制御ユニットにより制御されることを特徴とする請求項３に記載の並列プロセッサ。
【請求項５】
前記プロセッサ命令は、同期用命令ＩＤをさらに有し、
前記同期制御ユニットは、前記同期用命令ＩＤに対応するステートマシンを備えていることを特徴とする請求項１乃至４のいずれか１項に記載の並列プロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、パイプライン演算器を有する並列プロセッサに関する。
【背景技術】
【０００２】
プロセッサの演算処理では、処理能力を高めるために、同時に実行する命令数を増やす手段がいくつかある（例えば、特許文献１参照）。しかし、アウトオブオーダー実行付きのスーパースカラプロセッサ等では、リオーダーバッファを用いて並列演算処理を実行するが、面積が大きくかつ複雑である上に、コスト及び消費電力が高いという問題があった。
【特許文献１】特開２０００−２９３５０９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
本発明は、コスト及び消費電力を低減しつつ、並列処理の性能を向上することが可能な並列プロセッサを提供する。
【課題を解決するための手段】
【０００４】
本発明の一態様による並列プロセッサは、繰り返し指定付きの複合演算命令と同期命令とを有するプロセッサ命令を保持するフェッチユニットと、前記プロセッサ命令をデコードするデコーダユニットと、前記複合演算命令に基づいて並列に演算を実行し、前記同期命令に応じてパイプライン接続が制御される複数のパイプライン演算器と、前記フェッチユニットと前記デコーダユニットとの間に設けられ、前記同期命令に応じて前記パイプライン演算器の前記パイプライン接続の実行開始タイミングを制御する同期制御ユニットとを具備する。
【発明の効果】
【０００５】
本発明によれば、コスト及び消費電力を低減しつつ、並列処理の性能を向上することが可能な並列プロセッサを提供できる。
【発明を実施するための最良の形態】
【０００６】
本発明の実施の形態を以下に図面を参照して説明する。この説明に際し、全図にわたり、共通する部分には共通する参照符号を付す。
【０００７】
［１］並列プロセッサの構成
図１は、本発明の一実施形態に係る並列プロセッサの概略的な構成図を示す。以下に、本発明の一実施形態に係る並列プロセッサの概略的な構成について説明する。
【０００８】
図１に示すように、並列プロセッサは、バスインターフェイスユニット１、命令メモリ１０、命令フェッチユニット（ＩＦＵ：Instruction Fetch Unit）２０、同期制御ユニット３０、デコーダコントロールユニット（ＤＣＵ：Decode Control Unit）４０、レジスタファイル５０、ロードストアユニット（ＬＳＵ：Load Store Unit）６０、データメモリ７０、パイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢを備えている。
【０００９】
バスインターフェイスユニット１は、主記憶装置等と命令やデータのやりとりを行う。命令メモリ１０は、命令キャッシュメモリであり、バスインターフェイスユニット１から受けたプロセッサ命令を一時的に格納する。命令フェッチユニット２０は、プロセッサ命令をフェッチする。デコーダコントロールユニット４０は、プロセッサ命令を解読し、パイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢに対する制御信号を出力する。
【００１０】
パイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢは、複数の演算論理ユニット（ＡＬＵ：Arithmetic and Logic Unit）Ａ．ＡＬＵ１〜３、Ｂ．ＡＬＵ１〜３をそれぞれ有する。このパイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢは、デコーダコントロールユニット４０で解読したプロセッサ命令に従って複合演算を行う。尚、演算論理ユニットＡ．ＡＬＵ１〜３、Ｂ．ＡＬＵ１〜３は、複数段あればよく、３段に限定されない。
【００１１】
レジスタファイル５０は、内部に複数のレジスタを持ち、パイプライン演算器ｐｉｐｅＡとパイプライン演算器ｐｉｐｅＢに供給するデータ及びこれらのパイプライン演算器での複合演算の結果を一時的に格納する。
【００１２】
同期制御ユニット３０は、命令フェッチユニット２０とデコーダコントロールユニット４０との間に設けられる。この同期制御ユニット３０は、パイプライン演算器ｐｉｐｅＡとパイプライン演算器ｐｉｐｅＢとのパイプライン接続の実行開始タイミングを制御する。
【００１３】
ロードストアユニット６０は、データメモリ７０とレジスタファイル５０の間のデータ転送を制御する。より具体的には、デコーダコントロールユニット４０で解読されたプロセッサ命令がロード命令の場合、データメモリ７０からレジスタファイル５０にデータを転送する。プロセッサ命令がストア命令の場合、レジスタファイル５０からデータメモリ７０にデータを転送する。データメモリ７０は、データキャッシュメモリであり、バスインターフェイスユニット１から受けたデータ及びバスインターフェイスユニット１に送るデータを一時的に格納する。
【００１４】
［２］並列プロセッサの命令形式
図２は、本発明の一実施形態に係る並列プロセッサの命令形式を示す。以下に、本発明の一実施形態に係る並列プロセッサの命令形式について説明する。
【００１５】
図２に示すように、プロセッサの命令形式は、同期用命令ＩＤ、同期命令、ｐｉｐｅ指定、繰り返し指定、複合演算命令を有する。このように、プロセッサの命令形式は、複数のフィールドで構成される。複数のフィールドを合わせると命令ビット長が長くなるので、これをＬＩＷ(Long Instruction Words)命令を呼ぶ。
【００１６】
このようなプロセッサ命令をアセンブリ言語で表現する場合、下記のように、命令フィールドの区切りを識別する記号としてコロン（：）やセミコロン（；）を付けて記述する。
【００１７】
同期用命令ＩＤ：同期命令；ｐｉｐｅ指定；繰り返し指定；複合演算命令；
ここで、繰り返し指定付きの複合演算命令をベクタ演算命令と呼ぶことにする。このベクタ演算命令は、例えば、以下のような処理を１つの命令で実現する。
【００１８】
for (i=0; i<4; i++) {
x[i] = a[i] * 11 + b[i];
}
尚、複合演算命令は、ＳＩＭＤ（single instruction Multiple Data）演算でもよい。ＳＩＭＤ演算の場合、例えば、以下の２重ループを１つのＬＩＷ命令で実行する。
【００１９】
for (i=0; i<4; i++) {
for (j=0; j<8; j++) {  /* SIMD並列方向 */
x[i*8+j] = a[i*8+j] * 11 + b[i*8+j];
}
}
上記の例では、変数jで回るループをＳＩＭＤ演算で並列に実行する。尚、以降の説明では、このＳＩＭＤ演算ループについての説明は省略する。
【００２０】
［３］複合演算のパイプライン動作
［３−１］複合演算
図３は、本発明の一実施形態に係る並列プロセッサの複合演算のパイプライン動作のブロック図を示す。図４は、本発明の一実施形態に係る１つのパイプライン演算器による複合演算動作を描いたタイミング図を示す。以下に、本発明の一実施形態に係る並列プロセッサにおいて、１つのパイプライン演算器による複合演算について説明する。
【００２１】
図３及び図４において、パイプラインステージの各記号の意味は下記の通りである。
【００２２】
Ｆ：命令フェッチ
Ｑ：同期用待ち合わせ
Ｄ：デコード
Ｒ：レジスタフェッチ
Ｘ１，Ｘ２，Ｘ３：実行
Ｗ：ライトバック
図３及び図４に示すように、同期用命令ＩＤ＝１、同期命令＝なし（nosync）、ｐｉｐｅ指定＝パイプライン演算器ｐｉｐｅＡ、繰り返し指定＝４回（repeat4）の複合演算命令が行われた場合、次のようになる。尚、本例では、パイプライン演算器ｐｉｐｅＡは１つのみ使用しているため、複数のパイプライン演算器の同期制御を行う必要がないため、同期命令はなしとなっている。
【００２３】
まず、命令フェッチユニット２０が複合演算命令をフェッチする（Ｆ）。そして、同期制御ユニット３０が同期用待ち合わせを行い（Ｑ）、デコーダコントロールユニット４０が複合演算命令を解読する（Ｄ）。このデコードと同時に、レジスタファイル５０でレジスタフェッチが行われる（Ｒ）。次に、パイプライン演算器ｐｉｐｅＡの演算論理ユニットＡ．ＡＬＵ１、Ａ．ＡＬＵ２、Ａ．ＡＬＵ３により、演算１〜４が４回繰り返される。
【００２４】
具体的には、レジスタファイル５０によるレジスタフェッチ（Ｒ）、演算論理ユニットＡ．ＡＬＵ１の命令実行（Ｘ１）、演算論理ユニットＡ．ＡＬＵ２の命令実行（Ｘ２）、演算論理ユニットＡ．ＡＬＵ３の命令実行（Ｘ３）、レジスタファイル５０へのライトバック（Ｗ）の順で、演算１が実行される。
【００２５】
演算２のレジスタフェッチ（Ｒ）は、演算１の演算論理ユニットＡ．ＡＬＵ１の命令実行（Ｘ１）と同時に行われる。そして、演算２も、演算１と同様、演算論理ユニットＡ．ＡＬＵ１、Ａ．ＡＬＵ２、Ａ．ＡＬＵ３により順に実行され（Ｘ１、Ｘ２、Ｘ３）、レジスタファイル５０へのライトバック（Ｗ）が行われる。
【００２６】
演算３のレジスタフェッチ（Ｒ）は、演算２の演算論理ユニットＡ．ＡＬＵ１の命令実行（Ｘ１）と同時に行われる。そして、演算３も、演算１と同様、演算論理ユニットＡ．ＡＬＵ１、Ａ．ＡＬＵ２、Ａ．ＡＬＵ３により順に実行され（Ｘ１、Ｘ２、Ｘ３）、レジスタファイル５０へのライトバック（Ｗ）が行われる。
【００２７】
演算４のレジスタフェッチ（Ｒ）は、演算３の演算論理ユニットＡ．ＡＬＵ１の命令実行（Ｘ１）と同時に行われる。そして、演算４も、演算１と同様、演算論理ユニットＡ．ＡＬＵ１、Ａ．ＡＬＵ２、Ａ．ＡＬＵ３により順に実行され（Ｘ１、Ｘ２、Ｘ３）、レジスタファイル５０へのライトバック（Ｗ）が行われる。
【００２８】
尚、この例では、実行ステージを３段にしているが、他の段数でも構わない。また、ベクタ演算による１つの繰り返しあたり１サイクルのスループットで実行する。ＬＩＷ命令は、１サイクルに１個フェッチできる。
【００２９】
［３−２］複合演算の並列実行
図５は、本発明の一実施形態に係る２つのパイプライン演算器による複合演算のパイプライン動作を描いたタイミング図を示す。以下に、本発明の一実施形態に係る並列プロセッサにおいて、２つのパイプライン演算器による複合演算のパイプライン動作の一例について説明する。
【００３０】
本実施形態では、複合演算を行うパイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢが複数ある。ここで、複数のパイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢに依存関係が無ければ、複数のベクタ演算を複数のパイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢを使って並列実行できる。この例を下記に示す。
【００３１】
for (i=0; i<4; i++) {
x[i] = a[i] * 11 + b[i];  /* pipe Aで実行 */
}
for (i=0; i<4; i++) {
y[i] = d[i] * 13 + e[i];  /* pipe Bで実行 */
}
上記の例で配列変数同士の依存がないとき、例えば、下記のＬＩＷ命令に翻訳できる。尚、この段階ではまだ同期命令は考慮していないため、同期命令は記述していない。
【００３２】
pipe A; repeat 4; muli_add $8+, $0+, $4+, 11;
pipe B; repeat 4; muli_add $20+, $12+, $16+, 13;
ここで、$で始まる数字は、レジスタファイル５０内のレジスタ番号を表す。このレジスタ番号の直後の+は、レジスタ番号の自動インクリメントを表す。
【００３３】
このような同期命令のない複数のパイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢによる並列実行は、例えば図５のようになる。ＬＩＷ命令を１サイクルに１個ずつフェッチできるとすると、図５に示すように、命令フェッチ（Ｆ）のために１サイクルのオーバーヘッドが付くが、この分を除いて、２つのベクタ演算を並列実行できる。
【００３４】
尚、ここでは、説明の簡略化のため、パイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢが２つの場合のみを記述しているが、パイプライン演算器が３つ以上の場合も同様にして並列実行できる。
【００３５】
［３−３］同期制御
図６は、本発明の一実施形態に係る２つのパイプライン演算器による複合演算のパイプライン動作を描いたブロック図を示す。図７は、本発明の一実施形態に係る２つのパイプライン演算器による複合演算のパイプライン動作を描いたタイミング図を示す。図８は、本発明の一実施形態に係る同期制御ユニットによるパイプライン接続の制御の様子を示す。以下に、本発明の一実施形態に係る複合演算のパイプライン動作において、２つのパイプライン演算器の同期制御について説明する。
【００３６】
上記［３−２］で説明した例からも推測が付くが、パイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢの２つのベクタ演算を並列実行すると、同時に使用するレジスタの本数が多くなるという問題がある。レジスタの本数は、並列プロセッサのコストと消費電力に大きな影響を与える。よって、同時に使用されるレジスタの本数はできるだけ少ない方が望ましい。
【００３７】
そこで、本実施形態では、この問題の一解決策として、パイプライン接続する前段側の命令（本例の場合、パイプライン演算器ｐｉｐｅＡの命令）の繰り返しの最初のライトバックが完了する直後のサイクルから後段側の命令（本例の場合、パイプライン演算器ｐｉｐｅＢの命令）の繰り返しの最初のレジスタフェッチが開始されるように制御する。
【００３８】
このような制御は、例えば、下記の例で考える。
【００３９】
for (i=0; i<4; i++) {
y[i] = d[i] * 13 + a[i] * 11 + b[i];
}
上記のループ内の式を下記のように２つに分割して、それぞれを１つのパイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢに割り当てる。
【００４０】
for (i=0; i<4; i++) {
x[i] = a[i] * 11 + b[i];  /* pipe Aで実行 */
}
for (i=0; i<4; i++) {
y[i] = d[i] * 13 + x[i];  /* pipe Bで実行 */
}
上記をＬＩＷ命令に直訳すると、下記のようになる。
【００４１】
pipe A; repeat 4; muli_add $8+, $0+, $4+, 11;
pipe B; repeat 4; muli_add $16+, $12+, $8+, 13;
変数x[i]には、$8, $9, $10, $11の４本のレジスタを割り当てることになる。そこで、このレジスタの本数を減らすため、下記のように変形する。
【００４２】
for (i=0; i<4; i++) {
tmp = a[i] * 11 + b[i];  /* pipe Aで実行 */
y[i] = d[i] * 13 + tmp;  /* pipe Bで実行 */
}
ここで、変数tmpには、レジスタ1本のみを割り当てる。これをＬＩＷ命令に翻訳すると、下記のようになる。尚、変数tmpの参照の同期に関する説明は後述する。
【００４３】
pipe A; repeat 4; muli_add $8, $0+, $4+, 11;
pipe B; repeat 4; muli_add $13+, $9+, $8, 13;
ここで、パイプライン処理を行うとき、変数tmpをパイプライン演算器ｐｉｐｅＡからパイプライン演算器ｐｉｐｅＢに送る仕組みとして、バイパス制御することも考えられる。しかし、パイプラインの本数と段数が多いと、各パイプライン演算器の各段からバイパスする回路が大きく、コストと消費電力が増加する。
【００４４】
そこで、本実施形態では、パイプライン演算器ｐｉｐｅＡの演算結果のレジスタファイル５０へのライトバックを待って、パイプライン演算器ｐｉｐｅＢでの参照においてはライトバックした演算結果をレジスタファイル５０から読むようにする。また、この制御を簡単にするために、この同期を指示するための専用の同期命令を用意する。
【００４５】
具体的には、上記の例で言えば、下記のようなＬＩＷ命令にする。
【００４６】
1: pipe A; repeat 4; muli_add $8, $0+, $4+, 11;
sync 1; pipe B; repeat 4; muli_add $13+, $9+, $8, 13;
ここで、１つ目のＬＩＷ命令の先頭の1:は、同期用命令ＩＤを表す。２つ目のＬＩＷ命令の先頭のsync 1;は、同期用命令ＩＤ＝１の命令結果を参照する同期を表す。
【００４７】
このようなＬＩＷ命令を実行するにあたり、本実施形態の並列プロセッサは、図６に示すように、命令フェッチステージ（Ｆ）とレジスタフェッチステージ（Ｒ）の間に同期制御ユニット３０を備える。この同期制御ユニット３０は、上述する同期命令に従って、後から接続されるパイプライン演算器ｐｉｐｅＢの接続を待たせる制御を行い、パイプライン演算器ｐｉｐｅＢを使う命令の実行開始タイミングを制御する。この際、レジスタファイル５０中の１本のレジスタをパイプラインレジスタ５１として使用する。このパイプラインレジスタ５１は、同期制御ユニット３０の制御信号に従って、２つのパイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢをつなぐ。
【００４８】
パイプライン演算器ｐｉｐｅＢの実行開始タイミングは、レジスタファイル５０中に確保するパイプラインレジスタ５１がちょうど１つで済むタイミングとする。つまり、パイプライン接続する前段側の命令（本例の場合、パイプライン演算器ｐｉｐｅＡの命令）の繰り返しの最初のライトバックが完了する直後のサイクルから後段側の命令（本例の場合、パイプライン演算器ｐｉｐｅＢの命令）の繰り返しの最初のレジスタフェッチが開始されるように制御する。繰り返しのこれ以降でも、このライトバックした値を直後のサイクルで読む関係が保持されるように制御する。
【００４９】
このような複合演算の制御について、図７を用いて具体的に説明する。ここでは、２つのパイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢを用い、複合演算の繰り返し回数は４回である。そして、パイプライン接続において、前段側がパイプライン演算器ｐｉｐｅＡであり、後段側がパイプライン演算器ｐｉｐｅＢとする。
【００５０】
まず、パイプライン演算器ｐｉｐｅＡに対する命令１は、次のように実行される。命令フェッチユニット２０が命令１をフェッチする（Ｆ）。そして、同期制御ユニット３０が同期用待ち合わせを行い（Ｑ）、デコーダコントロールユニット４０が命令１を解読する（Ｄ）。このデコードと同時に、レジスタファイル５０でレジスタフェッチが行われる（Ｒ）。次に、演算論理ユニットＡ．ＡＬＵ１の命令実行（Ｘ１）、演算論理ユニットＡ．ＡＬＵ２の命令実行（Ｘ２）、演算論理ユニットＡ．ＡＬＵ３の命令実行（Ｘ３）、レジスタファイル５０へのライトバック（Ｗ）の順で、演算１が実行される。次の演算２のレジスタフェッチ（Ｒ）は、演算１の演算論理ユニットＡ．ＡＬＵ１の命令実行（Ｘ１）と同時に行われる。そして、演算２も、演算１と同様、演算論理ユニットＡ．ＡＬＵ１、Ａ．ＡＬＵ２、Ａ．ＡＬＵ３により順に実行され（Ｘ１、Ｘ２、Ｘ３）、レジスタファイル５０にライトバック（Ｗ）が行われる。このような演算１〜４が、命令１によりパイプライン演算器ｐｉｐｅＡで実行される。
【００５１】
ここで、パイプライン演算器ｐｉｐｅＢに対する命令２は、命令１の同期用待ち合わせ（Ｑ）と同時に、命令フェッチユニット２０でフェッチされる（Ｆ）。そして、同期制御ユニット３０で同期用待ちか否かの判定が行われる（Ｑ）。ここで、命令１の演算１のライトバック（Ｗ）が終了するまで、パイプライン演算器ｐｉｐｅＢは待ち状態となる（Ｑストール）。一方、命令１の演算１のライトバック（Ｗ）が終了すると、レジスタファイル５０中のパイプラインレジスタ５１には、パイプライン演算器ｐｉｐｅＡの演算１の演算結果が保持されている。そこで、この演算結果をレジスタファイル５０から読み、パイプライン演算器ｐｉｐｅＢの演算１を開始する。同様に、パイプライン演算器ｐｉｐｅＢの演算２はパイプライン演算器ｐｉｐｅＡの演算２の演算結果を参照し、パイプライン演算器ｐｉｐｅＢの演算３はパイプライン演算器ｐｉｐｅＡの演算３の演算結果を参照し、パイプライン演算器ｐｉｐｅＢの演算４はパイプライン演算器ｐｉｐｅＡの演算４の演算結果を参照する。
【００５２】
上記のような複合演算において、パイプラインレジスタ５１の状態は、図７に示すように、Ｓ０、Ｓ１、Ｓ２、Ｓ３、Ｓ４、Ｓ０と順に変化する。ここで、サイクル０〜２は状態Ｓ０である。サイクル３〜５は状態Ｓ１である。サイクル６は状態Ｓ２である。サイクル７〜８は状態Ｓ３である。サイクル９は状態Ｓ４である。サイクル１０〜１４は状態０である。
【００５３】
このようなパイプラインレジスタ５１の状態は、図８に示すように、パイプライン演算器ｐｉｐｅＡのライトバックの進み具合により変化する。具体的には、以下のようになる。
【００５４】
まず、１つ目の命令の演算が開始されるまで、パイプラインレジスタ５１は初期状態Ｓ０である。つまり、図７の例では、命令１の演算１の実行（Ｘ１）が開始されるまで初期状態Ｓ０である。
【００５５】
次に、１つ目の命令の演算が開始されると、状態Ｓ１に変化する。そして、１つ目の命令の繰り返しの最初のライトバックが行われる直前のサイクルまでが、状態Ｓ１である。すなわち、図７の例では、命令１の演算１の実行（Ｘ１）が開始されてからこの演算１のライトバック（Ｗ）が開始される直前のサイクルまでが状態Ｓ１である。
【００５６】
次に、１つ目の命令の繰り返しの最初のライトバックが行われるサイクルで、状態Ｓ２に変化する。状態Ｓ２に留まるのは1サイクルのみであり、次のサイクルでは別の状態に変化する。すなわち、図７の例では、命令１の演算１のライトバック（Ｗ）が行われるサイクルのみが状態Ｓ２である。
【００５７】
次に、１つ目の命令の繰り返しの最初のライトバック後は、状態Ｓ３に変化する。そして、１つ目の命令の繰り返しの２番目から最後より１つ前のライトバックまでが、状態Ｓ３である。すなわち、図７の例では、命令１の演算２のライトバック（Ｗ）から、命令１の演算３のライトバック（Ｗ）までが状態Ｓ３である。状態Ｓ３に変化すると同時に、２つ目の命令の繰り返しの最初のレジスタフェッチ（Ｒ）を開始する。すなわち、図７の例では、命令２の演算１のレジスタフェッチ（Ｒ）を開始する。
【００５８】
次に、１つ目の命令の繰り返しの最後のライトバックが行われるサイクルで、状態Ｓ４に変化する。状態Ｓ４に留まるのは1サイクルのみであり、次のサイクルでは別の状態に変化する。すなわち、図７の例では、命令１の演算４のライトバック（Ｗ）が行われるサイクルのみが状態Ｓ４である。
【００５９】
次に、１つ目の命令の繰り返しの最後のライトバック後は、状態Ｓ０に戻る。すなわち、図７の例では、命令１の演算４のライトバック（Ｗ）の直後のサイクルで、状態Ｓ０に変化する。状態Ｓ０に変化すると同時に、２つ目の命令の繰り返しの最後のレジスタフェッチ（Ｒ）を行う。すなわち、図７の例では、命令２の演算４のレジスタフェッチ（Ｒ）を行う。
【００６０】
以上のように、２つ目の命令のレジスタフェッチ（Ｒ）のタイミングを１つ目の命令のライトバック（Ｗ）の進み具合の状態に合わせて制御し、パイプライン演算器のパイプライン接続が行われる。
【００６１】
尚、図８において、状態Ｓ２から状態Ｓ０に戻るループはベクタ演算が１回の場合の流れを示している。状態Ｓ２から状態Ｓ４に飛ぶループはベクタ演算が２回の場合の流れを示している。各状態Ｓ０、Ｓ１、Ｓ３の自己に戻るループは、次の状態に移るまでの条件が不成立である場合を示している。
【００６２】
［３−４］ステートマシン
図９は、本発明の一実施形態に係る同期制御ユニットに実装されるステートマシンの概略図を示す。以下に、本実施形態の同期制御を行うためのステートマシンの一例について説明する。
【００６３】
上述するパイプラインレジスタ５１の状態Ｓ０、Ｓ１、Ｓ２、Ｓ３、Ｓ４は、図９に示す同期制御ユニット３０のステートマシンによって制御される。このステートマシンは、２つ目のパイプライン演算器ｐｉｐｅＢの命令２のレジスタフェッチ（Ｒ）のタイミングを、１つ目のパイプライン演算器ｐｉｐｅＡの命令１のライトバック（Ｗ）の進み具合の状態Ｓ０、Ｓ１、Ｓ２、Ｓ３、Ｓ４に合わせて制御する。
【００６４】
同期制御ユニット３０は、図９に示すように、複数の同期管理ステートマシン３１、３２、３３、３４で構成される。ここで、同期制御ユニット３０は、同期用命令ＩＤとして取り得る値の数だけステートマシンを持つ。つまり、本実施形態では、パイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢが２つしかないが、一般にはもっと多くてもよく、その場合には同期制御の対象となる命令の数が２つ以上になり得る。このような場合には、ＬＩＷ命令中の同期用命令ＩＤのフィールドに２ビット以上割り当てると共に、この同期用命令ＩＤとして取り得る値の数だけ同期管理ステートマシンを用意するとよい。
【００６５】
同期制御ユニット３０では、同期用命令ＩＤ付きの命令を受け取った場合、この同期用命令ＩＤに対応する同期管理ステートマシンを起動する。すなわち、同期用命令ＩＤ＝０の命令の場合、同期管理ステートマシン３１を起動する。また、同期命令を受け取った場合、オペランドで指定された同期用命令ＩＤに対応する同期管理ステートマシンを見て、２つ目のパイプライン演算器ｐｉｐｅＢの実行開始を制御する。
【００６６】
［４］効果
本発明の一実施形態の並列プロセッサは、命令フェッチユニット２０とデコーダコントロールユニット４０との間に同期制御ユニット３０を備えている。そして、この同期制御ユニット３０は、複数のパイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢのうち後から接続されるパイプライン演算器ｐｉｐｅＢの接続を待たせる制御を行い、パイプライン演算器ｐｉｐｅＢの実行命令を開始するタイミングを制御する。具体的には、パイプライン演算器ｐｉｐｅＡの演算結果のライトバックを待って、このライトバックした結果をレジスタファイル５０から読み、パイプライン演算器ｐｉｐｅＢで参照するようにする。ここで、パイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢのパイプライン接続は、レジスタファイル５０内の１本のパイプラインレジスタ５１によって行われる。このため、パイプライン演算器ｐｉｐｅＡ、ｐｉｐｅＢにおいて２つのベクタ演算を並列実行する場合も、同時に使用するのは１本のパイプラインレジスタ５１のみとなる。従って、従来のように、ベクタ演算を並列実行する際、同時に使用するレジスタの本数が多くなることを回避できる。
【００６７】
以上のように、本実施形態によれば、規模の小さい同期制御ユニット３０を追加するだけで、多くのパイプライン演算器のパイプライン接続による並列実行の制御が可能となり、コスト及び消費電力を低減しつつ、並列処理の性能を向上することが実現できる。
【００６８】
その他、本発明は、上記実施形態に限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で、種々に変形することが可能である。さらに、上記実施形態には種々の段階の発明が含まれており、開示される複数の構成要件における適宜な組み合わせにより種々の発明が抽出され得る。例えば、実施形態に示される全構成要件から幾つかの構成要件が削除されても、発明が解決しようとする課題の欄で述べた課題が解決でき、発明の効果の欄で述べられている効果が得られる場合には、この構成要件が削除された構成が発明として抽出され得る。
【図面の簡単な説明】
【００６９】
【図１】本発明の一実施形態に係る並列プロセッサの概略的な構成図。
【図２】本発明の一実施形態に係る並列プロセッサの命令形式を示す図。
【図３】本発明の一実施形態に係る並列プロセッサの複合演算のパイプライン動作のブロック図。
【図４】本発明の一実施形態に係る１つのパイプライン演算器による複合演算動作を描いたタイミング図。
【図５】本発明の一実施形態に係る２つのパイプライン演算器による複合演算のパイプライン動作を描いたタイミング図。
【図６】本発明の一実施形態に係る２つのパイプライン演算器による複合演算のパイプライン動作を描いたブロック図。
【図７】本発明の一実施形態に係る２つのパイプライン演算器による複合演算のパイプライン動作を描いたタイミング図。
【図８】本発明の一実施形態に係る同期制御ユニットによるパイプライン接続の制御の様子を示す。
【図９】本発明の一実施形態に係る同期制御ユニットに実装されるステートマシンの概略図。
【符号の説明】
【００７０】
１…バスインターフェイスユニット、１０…命令メモリ、２０…命令フェッチユニット（ＩＦＵ）、３０…同期制御ユニット、４０…デコーダコントロールユニット（ＤＣＵ）、５０…レジスタファイル、５１…パイプラインレジスタ、６０…ロードストアユニット（ＬＳＵ）、７０…データメモリ、ｐｉｐｅＡ、ｐｉｐｅＢ…パイプライン演算器、Ａ．ＡＬＵ１〜３、Ｂ．ＡＬＵ１〜３…演算論理ユニット。
【図１】
2009054032.tif 000003
【図２】
2009054032.tif 000004
【図３】
2009054032.tif 000005
【図４】
2009054032.tif 000006
【図５】
2009054032.tif 000007
【図６】
2009054032.tif 000008
【図７】
2009054032.tif 000009
【図８】
2009054032.tif 000010
【図９】
2009054032.tif 000011