(57)【要約】【課題】命令の割り込みに対しても対応可能であり、命令長も縮小できるキュープロセッサを提供する。【解決手段】データの取り出し場所をＱＨが示す場所、またはその次とし、結果のデータの格納場所を可変とすることが可能である。また、後からデータを入れるために空きワードを確保することも可能である。このような命令は消費順序型命令と呼ばれる。例えば、“ａｄｄｃ  ｖ，ｓ”命令では、ｓ＝０のときＱＨから２個のデータ（ｑｈ０，ｑｈ２）を取り出し加算し、その結果をＱＴとＱＴ＋ｖ（ｑｔ０，ｑｔｖとして、ｖは２の補数表示による正負整数を示す）に格納する。ｓ＝１のときは、その上にＱＴの次のワード（ｑｔ１）を後の使用のために確保する。【選択図】    図６
2004246449.tif 000002
【特許請求の範囲】
【請求項１】
消費順序型命令で、空きワードの確保や、データの格納場所を指定できる命令を実行する、キューを中間結果格納用に用いたキュープロセッサ。
【請求項２】
前記消費順序型命令は、“ａｄｄｃ  ｖ，ｓ”である請求項１記載のキュープロセッサ。
【請求項３】
キュープロセッサ用命令で、生産消費型命令と生産型命令を区別する命令を実行する、キューを中間結果格納用に用いたキュープロセッサ。
【請求項４】
前記キュープロセッサ用命令は、“ａｄｄｃ  ｖ，ｓ”または“ａｄｄｃ  ｖ”である請求項３記載のキュープロセッサ。
【請求項５】
レジスタ・キュー型命令を実行可能にした、キューとレジスタを中間結果格納用に用いたキュープロセッサ。
【請求項６】
前記レジスタ・キュー型命令は、“ａｄｄｒ  ｒ，ｔ”である請求項５記載のキュープロセッサ。
【請求項７】
番地運送命令で、オペランドを拡張可能にした、請求項１、３又は５記載のキュープロセッサ。
【請求項８】
前記番地運送命令は、“ｃｏｎｖ  ａｄｄｒｌ”である請求項７記載のキュープロセッサ。
【請求項９】
あるユニット以降でｑｔ＞ｌｑｈであることを検出したとき、それ以降の命令を次ユニットへ送出することを止め、ｑｔ＞ｌｑｈが解消されたとき、それ以降のユニットにある命令が実行完了するか、または実行されることが確実になってから命令の送出を再開することによって、キューのオーバフローを制御する請求項１、３、５又は７記載のキュープロセッサ。
【請求項１０】
あるユニットでバリヤ命令を発見した場合、それ以降の命令の次ユニットへの送出をやめ、バリヤ命令以前の命令の実行が全てを終わったこと、または終わることが確実であることがわかった場合、その送出を再開することでバリヤ命令を実行する請求項１、３、５、７又は９記載のキュープロセッサ。
【請求項１１】
命令をフェッチしたとき、各命令に、命令順番号を付加すると同時に、フェッチカウンタにそのときの先頭の命令順番号を付加し、割り込みなどが起こったとき、そのときのフェッチカウンタの値とフェッチカウンタに付加された命令順番号と、割り込みを起こした命令の命令順番号を報告することによって、割り込みを起こした命令のプログラムカウンタの値を知る請求項１、３、５、７、９又は１０記載のキュープロセッサ。
【請求項１２】
生産消費順序型、消費順序型、生産順序型、レジスタ・キュー型命令をミックスして実行可能にし、複合型にしてなるキュープロセッサ。
【請求項１３】
割り込みが起こったとき、キュー内に新たな論理キューを作り、実行中のプログラムと割り込み処理を並行して行う請求項１、３、５、７、９、１０又は１２記載のキュープロセッサ。
【請求項１４】
論理キューを複数個設けてマルチスレッド処理をする請求項１、３、５、７、９、１０、１２又は１３記載のキュープロセッサ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、先入れ先出しのキューを中間結果格納用メモリとして用いるキュープロセッサに関するものである。
【０００２】
【従来の技術】
電子計算機の一般のプロセッサは、（１）ランダムアクセスメモリの一種であるレジスタをアキュムレータとして使ったプロセッサである。これをここでは便宜的にレジスタプロセッサと呼ぶ。
【０００３】
これとは別に、（２）ＦＩＬＯ（先入れ後出し）方式のメモリを用いたスタック計算機が作られている。この方式は通信量の問題を解決できるなどの点でＪＡＶＡ（登録商標）という言語で使われている。
【０００４】
しかしながら、レジスタプロセッサの場合、命令一つ一つでレジスタを指定しなければならないので、レジスタの抽象化が難しく、また命令長が長くなるため、プロセス切り替えが遅くなる、あるいはプログラム長が長くなるなどの問題があった。特に、インターネットが進展する現在では、通信量はさらに多くなる一方であるため、改善が求められている。
【０００５】
また、上記した（２）のスタックを使った方式は、出来たデータをすぐ使う方式であるため、並列処理が困難であるという問題があった。
【０００６】
そこで、本願発明者は、既に、命令長及びプログラム長を短くするとともに、並列実行を可能にし、プロセッサを高速化することができるキュープロセッサを提案した（下記特許文献１参照）。
【０００７】
【特許文献１】
特開２００２−３５１６５９  第２−３頁  図１
【０００８】
【発明が解決しようとする課題】
本願発明者は、更にキュープロセッサの研究を進めて具現化を図った。その際に問題となった課題を解決するものである。
【０００９】
本発明は、上記状況に鑑みて、命令の割り込みに対しても対応可能であり、命令長も縮小できるキュープロセッサを提供することを目的とする。
【００１０】
【課題を解決するための手段】
本発明は、上記目的を達成するために、
〔１〕キュープロセッサにおいて、消費順序型命令で、空きワードの確保や、データの格納場所を指定できる命令を実行する、キューを中間結果格納用に用いるようにしたものである。
【００１１】
〔２〕上記〔１〕記載のキュープロセッサにおいて、前記消費順序型命令は、“ａｄｄｃ  ｖ，ｓ”である。
【００１２】
〔３〕キュープロセッサにおいて、キュープロセッサ用命令で、生産消費型命令と生産型命令を区別する命令を実行する、キューを中間結果格納用に用いるようにしたものである。
【００１３】
〔４〕上記〔３〕記載のキュープロセッサにおいて、前記キュープロセッサ用命令は、“ａｄｄｃ  ｖ，ｓ”または“ａｄｄｃ  ｖ”である。
【００１４】
〔５〕キュープロセッサにおいて、レジスタ・キュー型命令を実行可能にした、キューとレジスタを中間結果格納用に用いるようにしたものである。
【００１５】
〔６〕上記〔５〕記載のキュープロセッサにおいて、前記レジスタ・キュー型命令は、“ａｄｄｒ  ｒ，ｔ”である。
【００１６】
〔７〕上記〔１〕、〔３〕、又は〔５〕記載のキュープロセッサにおいて、番地運送命令で、オペランドを拡張可能にした。
【００１７】
〔８〕上記〔７〕記載のキュープロセッサにおいて、前記番地運送命令は、“ｃｏｎｖ  ａｄｄｒｌ”である。
【００１８】
〔９〕上記〔１〕、〔３〕、〔５〕又は〔７〕記載のキュープロセッサにおいて、あるユニット以降でｑｔ＞ｌｑｈであることを検出したとき、それ以降の命令を次ユニットへ送出することを止め、ｑｔ＞ｌｑｈが解消されたとき、それ以降のユニットにある命令が実行完了するか、または実行されることが確実になってから命令の送出を再開することによって、キューのオーバフローを制御するようにしたものである。
【００１９】
〔１０〕上記〔１〕、〔３〕、〔５〕、〔７〕又は〔９〕記載のキュープロセッサるおいて、あるユニットでバリヤ命令を発見した場合、それ以降の命令の次ユニットへの送出をやめ、バリヤ命令以前の命令の実行が全てを終わったこと、または終わることが確実であることがわかった場合、その送出を再開することでバリヤ命令を実行するようにしたものである。
【００２０】
〔１１〕上記〔１〕、〔３〕、〔５〕、〔７〕、〔９〕又は〔１０〕記載のキュープロセッサにおいて、命令をフェッチしたとき、各命令に、命令順番号を付加すると同時に、フェッチカウンタにそのときの先頭の命令順番号を付加し、割り込みなどが起こったとき、そのときのフェッチカウンタの値とフェッチカウンタに付加された命令順番号と、割り込みを起こした命令の命令順番号を報告することによって、割り込みを起こした命令のプログラムカウンタの値を知るようにしたものである。
【００２１】
〔１２〕複合型キュープロセッサにおいて、生産消費順序型、消費順序型、生産順序型、レジスタ・キュー型命令をミックスして実行可能にし、複合型にするようにしたものである。
【００２２】
〔１３〕上記〔１〕、〔３〕、〔５〕、〔７〕、〔９〕、〔１０〕又は〔１２〕記載のキュープロセッサにおいて、割り込みが起こったとき、キュー内に新たな論理キューを作り、実行中のプログラムと割り込み処理を並行して行うようにしたものである。
【００２３】
〔１４〕上記〔１〕、〔３〕、〔５〕、〔７〕、〔９〕、〔１０〕、〔１２〕又は〔１３〕記載のキュープロセッサにおいて、論理キューを複数個設けてマルチスレッド処理をするようにしたものである。
【００２４】
【発明の実施の形態】
以下、本発明の実施の形態について詳細に説明する。
【００２５】
〔１〕基本原理
キュープロセッサとは、基本的に先入れ先出しのキューを中間結果格納用メモリとして用いるプロセッサである。キュープロセッサには、主にキューにどのような順番で中間結果のデータを格納するか、またはキューとレジスタに中間結果のデータを格納するかによって次の５つの種類の計算方法があり、それぞれの計算方法に従ってプロセッサが作られる。これらはキューまたはキューとレジスタへのデータ格納順が異なるだけであり、そのため命令の構成方法とその解釈と実行が異なるがプロセッサの構造（ブロック構造）は同じである。
【００２６】
（１）生産消費順序型キュー計算方式
キューに中間結果を入れる順序と、それが使われるときの順序が一致する方式。この方式の命令は以下のすべての種類の命令と組み合わせて使われる。
【００２７】
（２）消費順序型キュー計算方式
キューに中間結果を入れるとき、それを使われる順序通りに入れる方式。
【００２８】
（３）生産順序型キュー計算方式
キューに中間結果を入れるとき生産順に入れ、それを使う時に必要なデータを生産順序に無関係に取り出す方式。
【００２９】
（４）レジスタ・キュー型キュー計算方式
中間結果を入れる記憶装置を、キューとレジスタとした計算方式。
【００３０】
（５）複合型キュー計算方式
生産消費順序型、消費順序型、生産順序型、レジスタキュー型、レジスタ型命令のうち２つ以上をミックスして実行可能にした計算方式。
【００３１】
〔２〕生産順序型キュー計算方式のプログラム
図１は、ｅ＝ａｂ＋ｃ／ｄ、ｆ＝ａｂ−ｃ／ｄを計算するプログラムを図形的に表したものである。
【００３２】
この図において、ｌｄはメモリからデータをキューに持ってくるロード命令、＊は掛け算、／は割り算、＋は足し算、−は引き算のそれぞれの命令である。ｓｔはキューの内容をメモリに格納するストア命令である。
【００３３】
このプログラムを左から右へ、上から下へ走査し、シリアル化された生産順序型プログラムをアセンブリ風言語で書くと、以下のようになる。
【００３４】
ｌｄ    ａ
ｌｄ    ｂ
ｌｄ    ｃ
ｌｄ    ｄ
ｍｕｌ
ｄｉｖ
ａｄｄ  ３
ｓｕｂ  １
ｓｔ    ｅ
ｓｔ    ｆ
ｍｕｌ、ｄｉｖ、ａｄｄ、ｓｕｂは、それぞれ、掛け算、割り算、足し算、引き算命令である。キューは、図２及び図３に示すように、先頭としっぽが接続された循環キューになっているものとし（物理キューと呼ぶ）、ＬＱＨ（ライブキューヘッダ）ポインタ、もしくはＱＨ（キューヘッダ）ポインタとＱＴ（キューテール）ポインタの指し示す間にデータが入る。
【００３５】
ＬＱＨは既に一度使われたデータで再度使われる可能性のあるデータの範囲を示すポインタで、ＬＱＨとＱＨの間がそのデータである（ＬＱＨとＱＴ間は論理キューと呼ばれる）。ＬＱＨとＱＨの間の距離は常に２に保たれるように設定されていると仮定している。“ａｄｄ  ３”はＱＨの示すデータ（ｑｈ０と書く）と、ＬＱＨから数えて３番目のデータ（ｌｑｈ３と書く）を足すことを示している（ＱＨやＱＴから数えることもできるが、ここではＬＱＨから数えている）。“ｓｕｂ  １”も同様にｑｈ０からｌｑｈ１を減算することを意味している。
【００３６】
〔３〕生産順序型命令のシリアル実行と並列実行
この命令を一つ一つシリアルに実行したときのキューの様子は、図２及び図３に示すようになる。すなわち、データがキューに格納されると、ＱＴは一つ右に移動し、データが使われると、ＱＨとＬＱＨは使われた分だけ右に移動する。ただし、ＱＨとＬＱＨ間距離が２以内の場合には２になるまではＬＱＨは移動しない。
【００３７】
図２（ｅ）に示すように、“ｌｄ  ｄ”が実行された後には、ＱＴが４右に移動している。次に、図２（ｆ）に示すように、“ｍｕｌ”が実行されると、ｑｈ０とｑｈ１が取り出され（ＱＨが２右に移動し、消費されることを意味する）、それらが掛けられ、その結果がＱＴが示す位置に格納され、ＱＴは１右に移動する。
【００３８】
図３（ｈ）に示すように、“ａｄｄ  ３”が実行されるとｑｈ０とｌｑｈ３が加算され、その結果がＱＴの示す位置に書き込まれている。この場合ｌｑｈ３は読み出されるだけで消費されない。すなわち、このためにＱＨが移動することはない。
【００３９】
プログラムは１０ステップで終了する。“ｍｕｌ”、“ｄｉｖ”など、必要なデータをすべて消費する命令は、生産消費順序型命令（略して生消費順序型命令）と呼ばれ、“ａｄｄ  ３”、“ｓｕｂ  １”などは生産順序型命令と呼ばれる。キューの中にはデータが生産された順番に格納されるので必ずしも消費する順序には格納されていない。それ故、それを消費するとき“ａｄｄ  ３”の“３”などでその順序を調整している。
【００４０】
このように消費の時のことを考えずに生産順にデータを格納することが生産順序型キュープロセッサといわれる所以である。生産消費順序型命令部分では、生産されたデータがキューに格納される順番と、そのデータが消費される順番が一致している。
【００４１】
ＬＱＨの左側のデータは使い終わったデータであるので必要ないが、そのまま残っており、ＱＴがどんどん右に移動してこの位置に戻ってきたとき新しい値がここに書き込まれ消える。
【００４２】
もし、キューにデータを同時に出し入れできるようにし、命令を同時に複数個実行できるように設計すると、そのプログラムは以下のように実行され、４ステップで終了する。データの出し入れする場所は、シリアルに実行する場所と同じである。
【００４３】
｛ｌｄ  ａ，ｌｄ  ｂ，ｌｄ  ｃ，ｌｄ  ｄ｝
｛ｍｕｌ，ｄｉｖ｝
｛ａｄｄ  ３，ｓｕｂ  １｝
｛ｓｔ  ｅ，ｓｔ  ｆ｝
このときのキューの変化は図４に示すようになる。
【００４４】
〔４〕生産順序型キュー計算方式の命令の表現方法
一般にプロセッサの命令は、命令の内容を示すオペレーション部分と、その命令が及ぼす場所であるオペランドからなっている。例えば、“ｌｄ  ａ”では、“ｌｄ”がオペレーション部分、“ａ”がオペランド部分で、メモリのアドレスを表す。“ａｄｄ  ３”のような生産順序型の命令はオペランドを持っているが、“ｍｕｌ”などの生産消費順序型の命令は原則としてオペランドを持っていない。
【００４５】
これらを別々の命令として実現すると命令数が増えるし、また、命令長も異なってしまうので好ましいことではない。これらを一つの命令形式で表現する場合には“ａｄｄ  ｖ，ｓ”のような形式にする。（“ａｄｄ  ｓ，ｖ”でも良く、オペランドの表現順序は意味を持たない）。ここで、ｖはキューのワードを指定するためのオペランドで、ｓは命令の型を識別する識別子である。
【００４６】
ｓ＝０のとき生産消費順序型の命令、ｓ＝１のとき生産順序型の命令とすると、“ａｄｄ  ３，０”は“ａｄｄ”の生産消費順序型命令を表し、“ａｄｄ  ３，１”は生産順序型命令を表す。
【００４７】
実際には“ａｄｄ”を８ビット、“ｖ”を７ビット、“ｓ”を１ビットで構成すれば機械語の命令長は１６ビットとなる。
【００４８】
また、“ａｄｄ  ｖ”で両タイプを識別することも可能である。ｖがある特殊な値をとるとき（ＱＨを示すとき）を生産消費順序型、そうでないときを生産順序型とする。
【００４９】
〔５〕消費順序型キュー計算方式のプログラム
消費順序型キュープロセッサは、データを消費する時の順序に合うように、生産する時に調整する方法である。そのための命令は、データの取り出し場所をＱＨが示す場所、またはその次とし、結果のデータの格納場所が可変となる。また、後からデータを入れるために空きワードを確保することも可能である。
【００５０】
例えば、図１のプログラムを消費順序型で書けば以下のようになる。
【００５１】
ｌｄ      ａ
ｌｄ      ｂ
ｌｄ      ｃ
ｌｄ      ｄ
ｍｕｌｃ  ２，１
ｄｉｖｃ  ２，０
ａｄｄ    ３
ｓｕｂ    １
ｓｔ      ｅ
ｓｔ      ｆ
“ｍｕｌｃ  ２，１”のような命令は消費順序型命令と呼ばれる。例えば、“ｍｕｌｃ  ｖ，ｓ”命令では、
ｓ＝０のとき、ＱＨから２個のデータ（ｑｈ０，ｑｈ２）を取り出し乗算し、その結果をキューのＱＴとＱＴ＋ｖ（ｑｔ０，ｑｔｖとして、ｖは２の補数表示による正負整数を表す）のワードに格納する。ｓ＝１のときは、その上にＱＴの次のワード（ｑｔ１）を後の使用のために確保する。
【００５２】
図５及び図６はこの命令を実行したときのキューの内容を示す。消費順序型ではデータは使われると消失する。図５（ｆ）は、“ｍｕｌｃ  ２，１”が実行された後のキューの内容を示しているが、この命令によりａｂが２個とびとびに格納され、そのうえ最初のａｂの横に１ワードが確保されている。このワードには“ｄｉｖｃ  ２，０”が実行された時ｃ／ｄが入れられる〔図６（ｇ）参照〕。消費順序型ではＬＱＨは原理的に不必要であるが、ＬＱＨが常にＱＨと同じ場所を示すとすれば生産順序型の機構がそのまま使える。
【００５３】
〔６〕レジスタ・キュー型キュー計算方式
これは命令の演算結果の一部をキューとは別に設けたレジスタｒに入れ、その内容とキュー内のデータとの演算を行う方式である。
例えば、
“ａｄｄｒ  ｒ，ｔ”
は、ｔ＝０のとき、生産消費順序型命令として働き、ｔ＝１のとき、ｑｈ０とレジスタｒの内容を加え、その結果をＱＴが示す場所に格納する命令、ｔ＝２のとき、ｑｈ０とｑｈ１の内容を加えその結果をＱＴが示す場所に格納する命令、ｔ＝３のとき、ｑｈ０とｑｈ１の内容を加えその結果をＱＴが示す場所とレジスタｒに格納する命令となる。
【００５４】
図１のプログラムをこの方式で書けば以下のようになる。
【００５５】
ｌｄ      ａ
ｌｄ      ｂ
ｌｄ      ｃ
ｌｄ      ｄ
ｍｕｌｒ  ｒ０，３
ｄｉｖｒ  ｒ１，３
ａｄｄｒ  ｒ１，１
ｓｕｂｒ  ｒ０，１
ｓｔ      ｅ
ｓｔ      ｆ
この命令を実行したときのキューの中身は図２及び図３と同じであり、これ以外に“ｍｕｌｒ  ｒ０，３”，“ｄｉｖｒ  ｒ１，３”
ランダムアクセスであるレジスタｒ０とｒ１にデータが格納され、それが“ａｄｄｒ  ｒ１，１”，“ｓｕｂｒ  ｒ０，１”で参照される。
【００５６】
また、これは、次のような命令構成で、２個のレジスタとキューとの間で演算を行うこともできる。
【００５７】
“ａｄｄｒ  ｒ０，ｒ１，ｔ”
ｔ＝０のとき：ｑｔ０←ｑｈ０＋ｑｈ１
ｔ＝１のとき：ｑｔ０←ｑｈ０＋（ｒ０）
ｔ＝２のとき：ｒ０←ｑｈ０＋ｑｈ１
ｔ＝３のとき：ｒ０←ｑｈ０＋（ｒ１）
ｔ＝４のとき：ｑｔ０←（ｒ０）＋（ｒ１）
〔７〕複合型キュー計算方式
上述した生産消費順序型、消費順序型、生産順序型、レジスタ・キュー型命令のうち２つ以上を同時実行できるようにした計算方式で一つのプロセッサで実現できる。一般に使われているレジスタプロセッサの命令を同時に実行可能にする事もできる。
【００５８】
〔８〕命令オペランドの拡張
一般に命令の機械語は０と１のバイナリで表される。典型的には、オペレーション部は８ビット、オペランド部は２４ビットであり、このうち、１６ビットが“ｌｄ  ａ”のａのメモリアドレスを表すのに用いられる。１６ビットでは０から６４ｋまでのアドレスを指定できる。
【００５９】
一般にキュープロセッサではこのオペランドが無いか非常に小さい。たとえば上記で“ｍｕｌ”はオペランドを持たないし、“ａｄｄ  ３”ではオペランドは３でそのためには数ビットあれば十分である。それゆえ、この特徴を生かして命令長が短くなるように設計される。たとえば、“ａｄｄｃ  ｖ，ｓ”では、ａｄｄｃ表現に８ビット、ｖ表現に７ビット、ｓ表現に１ビットというように、１６ビット構成にする。
【００６０】
ところが、この構成にすると“ｌｄ  ａ”などのようにメモリにアクセスする命令では、ａに８ビットすべてを用いても０から２５５までの番地しかアクセスできないことになる。このため、番地運送命令（ｃｏｎｖ）と呼ばれる命令を導入し、オペランドを１６ビットにする。たとえば、“ｃｏｎｖ  ａｄｄｒ  １”、“ｌｄ  ａｄｄｒ  ０”の２命令で、実質的に“ｌｄ  ａｄｄｒ  １，ａｄｄｒ  ０”の命令を実現する。“ａｄｄｒ  １，ａｄｄｒ  ０”は８ビット＋８ビットで１６ビットのオペランドを表し、これで０から６４ｋまでのメモリアドレスを指定可能になる。
【００６１】
〔９〕キューアーキテクチャと命令の実行
図７は本発明の実施例を示す並列キュープロセッサの構造を示す図である。
【００６２】
この図において、１０１は命令メモリ（ＩＭ）、１０２はフェッチユニット（ＦＵ）、１０３はフェッチバッファ（ＦＢ）、１０４はフェッチカウンタ（ＦＣ）、１０５は命令解釈ユニット（ＤＵ）、１０６はデコードバッファ（ＤＢ）、１０７はキュー計算ユニット（ＱＵ）、１０８はキュー計算バッファ（ＱＢ）、１０９は発行（イシュー）ユニット（ＩＵ）、１１０は制御ステーション（ＢＳ）、１１１は計算ステーション（ＣＳ）、１１２はメモリステーション（ＭＳ）、１１３は実行ユニット（ＥＵ）、１１４はキュー（Ｑ）、１１５はデータメモリ（ＤＭ）、１１６はレジスタ（Ｒ）である。
【００６３】
図７に示すように、命令メモリ（ＩＭ）１０１とデータメモリ（ＤＭ）１１５は各々命令とデータを格納するメモリである。フェッチユニット（ＦＵ）１０２は命令メモリ（ＩＭ）１０１内のフェッチカウンタ（ＦＣ）１０４の示すメモリアドレスから複数個の命令を取り出し、それにそれぞれの命令が一つ一つフェッチされ実行されたときのプログラムカウンタ（図示なし）の値を付加して、フェッチバッファ（ＦＢ）１０３を通して命令解釈ユニット（ＤＵ）１０５に送る。プログラムカウンタ値はその命令の格納されていた番地を示す。これは割り込みが起こったときの命令を識別するのに使われる。
【００６４】
命令解釈ユニット（ＤＵ）１０５に送られた命令は解釈され、デコードバッファ（ＤＢ）１０６を通してキュー計算ユニット（ＱＵ）１０７に送られる。キュー計算ユニット（ＱＵ）１０７ではそれぞれの命令に、その命令がシリアルで実行されたときのＬＱＨ、ＱＨ、ＱＴの値を付加し、それを発行ユニット（ＩＵ）１０９に送る。
【００６５】
このときの命令の内部構造は典型的には、
デコードバッファ（ＤＢ）１０６では、“ｐｒｏｇｒａｍ  ｃｏｕｎｔｅｒ  ｖａｌｕｅ，ｏｐｅｒａｔｉｏｎ，ｏｐｅｒａｎｄ”、
キュー計算バッファ（ＱＢ）１０８では、“ｐｒｏｇｒａｍ  ｃｏｕｎｔｅｒｖａｌｕｅ，ｏｐｅｒａｔｉｏｎ，ｏｐｅｒａｎｄ，ｌｑｈ，ｑｈ，ｑｔ”の形となる。ｌｑｈなどはその命令が実行されるときのＬＱＨ等の値を示す。ｏｐｅｒａｎｄやｌｑｈなどを必要としない命令ではこれらの値が省略される。
【００６６】
発行ユニット（ＩＵ）１０９では、制御ステーション（ＢＳ）１１０でキューのオーバフローとバリヤ命令（後述の〔１０〕参照）を処理した後、メモリアクセス命令はメモリステーション（ＭＳ）１１２に送られ、計算系の命令は計算ステーション（ＣＳ）１１１に送られる。メモリアクセス命令は、ここでメモリ従属性を解消した後実行ユニット（ＥＵ）１１３に送られ実行される。
【００６７】
計算系命令は、ここでデータの準備状況などを検査し、実行可能であれば実行ユニット（ＥＵ）１１３に送られ実行される。計算実行に際してはキューやレジスタのデータが使われ、計算された後そこに結果が書き込まれる。
【００６８】
〔１０〕キューのオーバフローの防止方法
循環キューでは実行中のプログラムが多くのデータをキューに格納すると、ＱＴがＬＱＨを追い越してしまう。この場合、ＬＱＨより右にはまだ使用される見込みのあるデータが入っているので、追い越しはこのデータの破壊を意味する。これを避けるためには追い越しを禁止する方法が必要となる。この追い越しを、キューのオーバフローと呼ぶ。キューのオーバフローは制御ステーション（ＢＳ）１１０で次のようにして防止される。
【００６９】
（１）キュー計算バッファ（ＱＢ）１０８と発行ユニット（ＩＵ）１０９にあるすべての命令を調べ、個々の命令に付加されたｌｑｈ，ｑｔのうち、ｑｔ＞＝ｑｈである命令が見つかったら、そのｑｔを持つ命令以降の命令の発行（次段階への送出）を、この関係が解消されるまで止める。
【００７０】
（２）ｑｔ＞＝ｑｈの関係が解消されたら命令の発行を再開する。
【００７１】
〔１１〕バリヤ命令の実行方法
並列キュープロセッサにはバリヤ命令と呼ばれる一群の命令がある。バリヤ命令はそれ以前の命令の実行がすべて終わるまで、それ以後の命令の実行を禁止する命令である。シリアル処理では原則として命令の並び順に命令が実行されるので、命令はすべてバリヤ命令であると言える。しかし、並列処理では命令の並び順は原則として意味を持たない。それゆえ、命令群を並び順に実行したい場合などにこのバリア命令を使う。
【００７２】
バリヤ命令は制御ステーションＢＳ１１０で次のように行われる。
【００７３】
（１）バリヤ命令を発見したら、それ以降の命令の発行を止める。
【００７４】
（２）バリヤ命令以前の命令がすべて実行されたことが分かったら、命令の発行を再開する。
【００７５】
〔１２〕割り込みにおけるＰＣ値の短縮方法
コンピュータでは、命令はメモリにおける格納場所（番地）で特定される。シリアル処理では原則としてプロセッサにある命令は１個で、この番地はプログラムカウンタ値となるので、個々の命令にこの値をつけなくてもプログラムカウンタの値を見れば命令を特定できる。ところが、並列処理では多くの命令がプロセッサの中に存在するのでこの方法を使えない。それ故、命令をフェッチしたとき、シリアルにフェッチしたときのプログラムカウンタの値を計算して個々の命令に付加する。従って、命令のプロセッサの内部での形は、
“ｐｒｏｇｒａｍ  ｃｏｕｎｔｅｒ  ｖａｌｕｅ，ｏｐｅｒａｔｉｏｎ，ｏｐｅｒａｎｄ，ｌｑｈ，ｑｈ，ｑｔ”
のようになる。しかし、この形にするとハードウェアの複雑性という面で問題が発生する。それは、“ｏｐｅｒａｔｉｏｎ，ｏｐｅｒａｎｄ，ｌｑｈ，ｑｈ，ｑｔ”はそれぞれ８ビットや４ビットといった短いビット数で事足りるが、“ｐｒｏｇｒａｍ  ｃｏｕｎｔｅｒ  ｖａｌｕｅ”は３２ビットや６４ビットといった大きな値となるためである。このため、このプログラムカウンタの値を縮小することがハードウェアの簡単化につながる。
【００７６】
プログラムカウンタ値の縮小は図８に示すように行うことができる。
【００７７】
（１）命令をフェッチしたとき、各命令に、例えは０から１５までの数字（命令順番号と名付ける）を付加する。１５の次は０になる。
【００７８】
（２）フェッチカウンタ（ＦＣ）１０４にそのときの先頭の命令順番号を付加する（図８では２３６４９５２６  ６）。
【００７９】
割り込みが起こったとき、そのときのフェッチカウンタ（ＦＣ）１０４の値と、フェッチカウンタ（ＦＣ）１０４に付加された命令順番号（図８では６）と、割り込みを起こした命令の命令順番号（図８では１２）を報告する。
【００８０】
（３）割り込みを起こした命令のプログラムカウンタの値は次の式によって計算される。
【００８１】
プログラムカウンタの値＝フェッチカウンタの値（図８では２３６４９５２６）−〔命令順番号の最大数（図８では１２）−割り込みを起こした命令の命令順番号（図８では１２）〕−フェッチカウンタに付加された命令順番号（図８では６）＝２３６４９５２６−（１６−１２）−６＝２３６４９５１６
この方法によって、付加するプログラムカウンタ３２ビットの値を４ビットに縮小することができる。
【００８２】
〔１２〕割り込み処理とマルチスレッド処理
キュープロセッサでは物理キューの中に簡単に論理キューを作ることができる。一つの論理キューで一つのプログラムを走らせることができるので、複数の論理キューを作れば複数のプログラムを同時に走らせることができる。あるプログラムの実行中に割り込みが起こったとすると、そのとき新しい論理キューを作ってそこで割り込み処理プログラムを走らせると、実行中のプログラムを止めることなく割り込みの処理をすることができる。
【００８３】
複数個の論理キューを作れば複数個のプログラムを同時に走らせることができ、いわゆるマルチスレッド処理が可能である。
【００８４】
なお、本発明は上記実施例に限定されるものではなく、本発明の趣旨に基づいて種々の変形が可能であり、これらを本発明の範囲から排除するものではない。
【００８５】
【発明の効果】
以上、詳細に説明したように、本発明によれば、以下のような効果を奏することができる。
【００８６】
（Ａ）命令の表現方法に関して、全ての命令を短い命令長で統一することができる。例えば、命令形式を“ａｄｄｃ  ｖ，ｓ”のような形式にできる。
【００８７】
（Ｂ）オペランドの拡張を容易に行うことができる。例えば、“ｃｏｎｖ  ａｄｄｒｌ”のような命令でオペランドを拡張できる。
【００８８】
（Ｃ）キューのオーバフローが発生する場合は、解消するまで次段階への命令の送出を止め、キューのオーバフローを制御することができる。
【００８９】
（Ｄ）並列処理時、ある命令までの処理が完了しないまま先に進むと不都合が生じる場合、バリヤ命令と呼ぶ命令を設けて命令群の並び順を制御することができる。
【００９０】
（Ｅ）従来、命令の内部構成においてプログラムカウンタには３２又は６４ビットを当てていたが、これを縮小するためフェッチカウンタと呼ばれる命令順番号を用いる。これにより、命令の割り込みに対しても対応可能で、命令長も縮小できる。
【図面の簡単な説明】
【図１】本発明にかかるｅ＝ａｂ＋ｃ／ｄ、ｆ＝ａｂ−ｃ／ｄを計算するプログラムを図形的に表した図である。
【図２】本発明にかかる循環キューの変化の模式図（その１）である。
【図３】本発明にかかる循環キューの変化の模式図（その２）である。
【図４】本発明にかかる命令を並列実行した時のキューの変化を示す図である。
【図５】本発明の実施例を示す命令の表現方法を示す模式図（その１）である。
【図６】本発明の実施例を示す命令の表現方法を示す模式図（その２）である。
【図７】本発明の実施例を示す並列キュープロセッサの構造を示す図である。
【図８】本発明の実施例を示すプログラムカウンタ値の縮小の様子を示す図である。
【符号の説明】
１０１    命令メモリ（ＩＭ）
１０２    フェッチユニット（ＦＵ）
１０３    フェッチバッファ（ＦＢ）
１０４    フェッチカウンタ（ＦＣ）
１０５    命令解釈ユニット（ＤＵ）
１０６    デコードバッファ（ＤＢ）
１０７    キュー計算ユニット（ＱＵ）
１０８    キュー計算バッファ（ＱＢ）
１０９    発行（イシュー）ユニット（ＩＵ）
１１０    制御ステーション（ＢＳ）
１１１    計算ステーション（ＣＳ）
１１２    メモリステーション（ＭＳ）
１１３    実行ユニット（ＥＵ）
１１４    キュー（Ｑ）
１１５    データメモリ（ＤＭ）
１１６    レジスタ（Ｒ）
【図１】
2004246449.tif 000003
【図２】
2004246449.tif 000004
【図３】
2004246449.tif 000005
【図４】
2004246449.tif 000006
【図５】
2004246449.tif 000007
【図６】
2004246449.tif 000008
【図７】
2004246449.tif 000009
【図８】
2004246449.tif 000010