JP5177141B2 - 演算処理装置、演算処理方法 - Google Patents

演算処理装置、演算処理方法 Download PDF

Info

Publication number
JP5177141B2
JP5177141B2 JP2009520188A JP2009520188A JP5177141B2 JP 5177141 B2 JP5177141 B2 JP 5177141B2 JP 2009520188 A JP2009520188 A JP 2009520188A JP 2009520188 A JP2009520188 A JP 2009520188A JP 5177141 B2 JP5177141 B2 JP 5177141B2
Authority
JP
Japan
Prior art keywords
thread
instruction
unit
buffer
register
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2009520188A
Other languages
English (en)
Other versions
JPWO2008155834A1 (ja
Inventor
恵美 鵜飼
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Publication of JPWO2008155834A1 publication Critical patent/JPWO2008155834A1/ja
Application granted granted Critical
Publication of JP5177141B2 publication Critical patent/JP5177141B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming

Description

本発明は、情報処理装置の制御技術、特に、命令処理技術に関するものである。
パイプライン処理方式以降の高度な命令処理方式を採用した情報処理装置は、1つの命令実行の終了を待たずに、投機的に後続の命令の処理を行うことで性能の向上を図ってきた。もちろん、その命令実行に先立ち、命令供給(命令フェッチ)も投機的に行うことで性能向上を果たしてきた。ここで、投機的とは、例えば、後続の命令のフェッチアドレスが確定する前に所定の予測結果にしたがった分岐先アドレスから後続の命令をフェッチし、処理すること等をいう。
命令バッファ方式では、投機的にフェッチされた命令はいったん命令バッファに保持される。そして、命令バッファは、命令を解釈実行する実行制御部に向けて命令を供給する。このような命令バッファを複数持つことで投機的フェッチを先まで進めることができる。しかし、情報処理装置の資源は無限ではないため、例えば、特許文献1に記載のような方式によって効率的に命令バッファを使用するよう努めてきた。
日本国特許第3845043号公報 日本国特許第3683968号公報
プロセッサの命令処理において、マルチスレッドという手法がある。マルチスレッドとは、1つのプロセッサを用いて、あたかも複数のプロセッサが処理を行っているかのように見せる手法である。スレッドとはその複数の論理的なプロセッサのうちの1つの論理的なプロセッサの処理を指す。あるいは、プロセッサから見ると、プロセッサが実行すべき複数の命令からなる処理のうち、それぞれ独立に実行可能な処理としてプロセッサに引き渡される命令の系統をスレッドとすることができる。
例えば、あるスレッドの処理を行っているときにキャッシュミスが発生したとする。キャッシュミスが発生したプロセッサではメモリリード要求を送出し、他プロセッサあるいはメモリからデータを取り寄せることとなる。その期間、そのスレッドにおいては演算器が不要となるので、代わりに別のスレッドの処理を行わせて演算器を有効活用することができる。またキャッシュミスがない状態でも通常、複数種類用意される演算器は、それらすべてが常時稼働している訳ではない。そのため、全く依存関係のないスレッドを走行させ、使用されていない演算器を有効活用することもできる。
そのようなマルチスレッド技術のうち、Simultaneous MultiThread(SMT)と呼ばれる方法では、命令処理のパイプラインを単数もしくは複数持って、複数スレッドの命令列を交互もしくは同時に投入し、演算器を共有して処理を行う。よって、ある時間に演算器で実行されているスレッドが複数あり、演算器に命令供給するための装置内でも、複数のスレッドが存在することになる。この技術では、いかに効率よく資源を複数のスレッドに対して分配するかが、コストを抑えつつ性能向上を図るための鍵となる。
命令を解釈実行する実行制御部に命令を供給する命令バッファについても、当然この間題、すなわち、いかに効率よく複数のスレッドに命令バッファを分配するかという問題が存在することになる。これまでの命令バッファは、ある時間においては1つのスレッドの命令のみを保持していればよかった。しかし、SMTに対応するためには同時に複数のスレッドの命令列を命令バッファに保持し、演算器に供給していく必要がある。
これを解決するにあたり、上記日本国特許3845043号で提案されたような装置をスレッドの数の分だけ並べるということがまず考えられる。例えば、スレッド数が2である場合に、各スレッドの命令バッファを4個として、合計8の命令バッファを有する装置を作ればよい。
この場合、命令バッファの数としては合計8個となる。しかし、例えば、一方のスレッドにおいてキャッシュミスが発生した場合、データが取得されるまでの間は命令フェッチ要求を出すことは無意味である。なぜなら、そのキャッシュミスが命令キャッシュミスであったならば、それ以降の命令フェッチを要求してももちろん命令列は得られない。またデータキャッシュミスであったならば、やはりそのデータが取得されるまで以降の命令処理は進まないため、命令フェッチで命令列を取得していたとしても、ただ命令バッファ上で長時間待たせるだけとなる。そこで、そのような間は当該スレッドの命令フェッチ要求を止めて、もう一方のスレッドで命令フェッチを優先させるのがよい。しかし、キャッシュミスの発生したスレッドでは、命令フェッチを止めているので命令バッファが余っている。一方、別の優先させたいスレッドでは命令バッファ資源をすでに使いきっていて、フェッチを行うことができない、というような事態も大いに発生しうる。
効率よく資源を使用して性能向上を図ることが目的のSMTにおいて、このような無駄な資源の使用方法を採用することは得策とはいえない。さらに、命令バッファは実装上、非常に大きな面積を必要とするものである。性能を向上するためには各スレッドの命令バッファの数を増やすことが有効である。しかし、物量を増やすことによって、チップ面積が大きくなり、消費電力が増大し、故障率が上昇し、コストが増加する、など、たくさんのデメリットが発生する。したがって、効率よく資源を使用して命令バッファの数を抑え、実装面積を少なくする方向の努力をすべきである。
以上をまとめると、
(1)従来例では、マルチスレッド時の命令バッファの割り当てを解決する手段が提示されていない。
(2)単純な拡張方法は、命令バッファのセットをスレッド数の分だけも持つことである。
(3)しかしそのような、システムの一部だけを考慮した手法によれば、ある時間において命令バッファが余剰となっているスレッドと、命令バッファが不足しているスレッドとが生じる可能性があり、効率の悪い結果となる。
(4)効率の悪い使い方で性能を出そうとすると、現在のコンピュータ業界において緊急の課題である、低消費電力化の実現とは逆の方向に向かうことになる。
そこで、本発明の課題は、マルチスレッドを実現するシステムにおいて、それぞれのスレッドに無駄なく効率的に命令バッファを割り当てることができる技術を提供することにある。
本発明は前記課題を解決するために、以下の手段を採用した。本発明の一態様は、複数の命令によって処理が構成され、互いに独立に実行可能な複数の処理のそれぞれがスレッドとして識別される処理装置として構成される。本処理装置は、命令を実行する実行部と、実行部に命令を供給する供給部と、供給部から供給される命令を保持するバッファ部と、バッファ部を管理する制御部とを備える。そして、バッファ部は、複数のバッファ要素の集合を含み、バッファ要素は、命令を格納するデータ部と、バッファ要素間の接続関係を定義するポインタ部とを含む。このような構成において、制御部は、ポインタ部で接続関係が定義された複数のバッファ要素の系列を前記処理装置で実行されるそれぞれのスレッドに割り当てるスレッド割り当て部を有する。
本処理装置によれば、命令を保持するバッファ要素は、ポインタ部で接続関係が定義され複数の系列を構成する。これらのバッファ要素の系列は、互いに独立に実行可能な複数の処理であるスレッドに割り当てられる。したがって、複数のスレッドを実行する処理装置において、重要な資源の1つであるバッファ要素が必要とされるスレッドに効果的、かつ、簡易に配分することができる。バッファ要素の系列は、ポインタで接続されているため、その割り当て、および解放を極めて柔軟に実現できる。その結果、複数のスレッドを実行する処理装置において、物理的に過剰にバッファ部を大きくすることなく、効率よくバッファ要素をそれぞれのスレッドに割り当てられる。
本発明では、命令バッファのセットはスレッドごとに持つのではなく、複数のスレッドで共用できる。これにより、命令バッファ資源のある限り、それらを有効にそれぞれのスレッドに使用することができる。
図1は命令バッファのセットをスレッド数の分だけも持つシステムの構成を示す図である。 図2は一実施形態によるシステムの構成図である。 図3は命令バッファのポインタチェーンの一例を示す図である。 図4は予め個々の命令バッファに振られた識別番号をポインタとして用いた場合のさらなるポインタについて示す図である。 図5は本処理装置の構成図である。 命令フェッチにおける制御の全体図である。 図7は命令フェッチ制御ユニットの詳細構造と命令フェッチ制御ユニット5に関連する回路の構成を示す図である。 図8は命令バッファの構造を示す図である。 図9は命令フェッチアドレス要求部の詳細を示す図である。 図10Aは有効スレッド識別信号(THj_VALID)の生成回路を示す図である。 図10Bは使用中の命令バッファの数にしたがってスレッドを選択する場合の概念を示す図である。 図10Cはスレッド選択後の経過時間によるスレッド優先度決定するレジスタ列の概念を示す図である。 図10Dはスレッド選択によってスレッドの優先順位を変更する処理例を示す図である。 図10Eはスレッド選択後の経過時間によるスレッド優先度決定回路を示す図である。 図10Fは最優先される第1プライオリティのスレッドが決定されたときにオンになる回路を示す図である。 図10Gは第2プライオリティのスレッドが決定されたときにオンになる回路を示す図である。 図10Hはラストプライオリティのスレッドが決定されたときにオンになる回路を示す図である。 図10Iは図10Fから図10Hで示した回路の出力信号によって、決定される最も高い優先度のスレッドが決定されたときに、そのスレッド番号を出力する回路を示す図である。 図10Jはスレッド数が2つの場合に利用なスレッド選択回路の例を示す図である。 図11Aはスレッド用命令フェッチアドレス保持部およびスレッド2用命令フェッチアドレス保持部からセレクタおよびデコーダを介して親の命令バッファを選択する回路を示す図である。 図11Bはシーケンシャル方向のポインタを設定する回路の例を示す図である。 図11Cは分岐先方向のポインタを設定する回路の例を示す図である。 図12Aはスレッド選択後の経過時間によるスレッド優先度決定回路を示す図である。 図12Bは最優先される第1プライオリティのスレッドが決定されたときにオンになる回路を示す図である。 図12は第2プライオリティのスレッドが決定されたときにオンになる回路を示す図である。 図12Dはラストプライオリティのスレッドが決定されたときにオンになる回路を示す図である。 図12Eは図12Aから図12Dで示した回路の出力信号によって、決定される最も高い優先度のスレッドが決定されたときに、そのスレッド番号を出力する回路である。 図12Fはスレッド数が2つの場合に利用なスレッド選択回路の例である。 図13は使用中の命令バッファ1の先頭のバッファエントリを指し示すさらなるポインタを生成する回路である。 図14は図13のセレクタ61への入力となるシーケンシャル方向のポインタおよび分岐先方向のポインタの選択回路である。 図15はスレッドごとに個別にさらなるポインタを生成し、セレクタで選択する回路を示す図である。 図16は命令供給されるスレッドに対するさらなるポインタを格納するレジスタを1つ専用で設け、スレッド間でさらなるポインタを入れ替える回路の構成例を示す図である。 図17Aは命令バッファの投入から解放までのサイクルを示す図である。 図17BはレジスタR_STREAM_IDに保持されている命令バッファのバッファ番号をデコードする回路である。 図17Cは特定のスレッド(例えば、スレッド番号j)で使用される命令バッファ1を一括して解放するための信号を生成する回路の例を示す図である。 図17Dはバッファのバリッドビットを生成する回路の例を示す図である。 図18Aはキャンセルが発生したときからの処理を示すタイムチャートである。 図18BはSTART_IBR_ID_THjを起点にして命令バッファ1のチェーンを順次解放する回路を示す図(その1)である。 図18CはSTART_IBR_ID_THjを起点にして命令バッファ1のチェーンを順次解放する回路を示す図(その2)である。 図19は起点レジスタを適用させた命令フェッチ制御ユニットの構成を示す図である。 図20Aはスレッド0用起点レジスタの構成を示す図である。 図20Bはスレッド1用起点レジスタの構成を示す図である。 図21は起点レジスタのバリッドフラグSTART_IBR_ID_VALIDを生成する回路を示す図である。 図22は起点レジスタのバッファ番号を保持するレジスタSTART_IBR_IDにバッファ番号を設定する回路を示す図である。 図22はショートループの概念図である。 図23はショートループを構成した例を示す図である。 図25は起点レジスタによる命令バッファの処理を示すタイムチャートである。 図26は命令バッファのループを示す概念図である。
符号の説明
1 命令バッファ
2 命令フェッチ要求部
3 分岐予測部
4 命令キャッシュ制御ユニット
5 命令フェッチ制御ユニット
6 命令供給制御部
7 命令デコーダ
8 命令バッファ制御部
9 命令フェッチアドレス選択部
11 命令フェッチアドレス保持部
61 セレクタ
62 レジスタ
122 プログラムカウンタ
126 分岐リザベーションユニット
130 プロセス管理ユニット
《実施形態の骨子》
以下、マルチスレッド方式のシステムにおいて、それぞれのスレッドに無駄なく効率的に命令バッファを割り当てることができる計算機システム(以下、単に処理装置という)の概要を示す。図1に、単純に、命令バッファのセットをスレッド数の分だけも持つシステムの構成を示す。以下、スレッド数が2である場合のマルチスレッドのシステムを例に説明する。
図1において点線で囲まれた部分は、システムが有する命令バッファの全体を示している。この例では、スレッド1用の命令バッファ群と、スレッド2用の命令バッファ群とが設けられている。さらに、それぞれの命令バッファ群には、命令バッファ#1から#4が設けられている。なお、各命令バッファ群における命令バッファの数は、4個に限定される訳ではない。
またさらに、各命令バッファ群内で、各命令バッファにポインタが設けられている。ポインタは、それぞれの命令バッファの命令が、命令実行部へ供給されたときに、次に供給すべき命令が格納されている命令バッファを示すために使用される。例えば、特許第3845043号公報に記載された命令フェッチ制御装置では、複数の命令バッファをポインタで動的に接続することによって、命令バッファの命令を効率的に命令実行部に供給する。それとともに、命令フェッチされ(命令フェッチは命令読出と同義;以下、読出のことをフェッチとして説明する場合がある)、命令実行部に供給される命令の系列として、複数の系列が存在した場合にも、命令バッファの使用効率低下を抑制している。ここで、複数の系列は、例えば、分岐命令によって分岐が発生した後に続く系列と、分岐することなく命令が実行された後に続く系列とによって形成される。
しかしながら、図1の構成では、基本的には、マルチスレッドでの効率的な命令バッファの使用とはならないことがある。すなわち、スレッド1において多数の命令バッファが使用され、命令バッファ数が不足し、一方、スレッド2においては、命令バッファの使用が少なくなるような場合である。
図2に、本実施形態によるシステムの構成を示す。この構成では、予めスレッドが固定された命令バッファ群という概念はない。すなわち、命令バッファが割り当てられるスレッドは、事前に固定されておらず、命令フェッチに際して、それぞれの命令バッファが割り当てられるスレッドが決定される。
本実施形態の構成では、各命令バッファは、複数のエントリに命令語を保持するデータ部と、当該複数のエントリを有する命令バッファの次に供給使用されるべきエントリを有する命令バッファを指示するためのポインタ部から構成される。また、命令フェッチされたデータを格納するための命令バッファを指示する命令バッファ割り当て部(命令バッファ制御部ともいう)がスレッド間に共通で1つ設けられる。
命令バッファ割り当て部は、どのスレッドの命令フェッチ要求かを気にすることなく、現在使用されていない命令バッファの中から単に1つの命令バッファを選択する。この場合の命令バッファの選択は、スレッドが1つのときと同様の手段を用いればよい。
本実施形態のシステムでは、その命令バッファが選択されたときに、所属するスレッドが決まる。つまり、その命令バッファを使用するときの命令フェッチが、どのスレッドのものであるかによって、その命令バッファの所属するスレッドが決まる。システム内で、命令フェッチを起動する命令フェッチ要求部はスレッドごとに命令フェッチ要求を出す。
命令バッファの割り当てルールは例えば、命令バッファに予め個別の番号を振っておき、現在空きの命令バッファの番号が小さい順番から割り当てるなどでもよい。空いているものを自由に使えばよい。また、例えば、現在空いている命令バッファをポインタで結合して空きリスト構造を形成しておいてもよい。空きリストの先頭から、命令バッファを使用するようにすればよい。
各命令バッファのポインタ部は、同じスレッド内で、次に投入されるべき命令列を格納する命令バッファを指示するようにして次の命令バッファへの関連付けを行う。その関連付けは、例えば、命令バッファに予め個別の番号を振っておき、次の命令バッファの番号を指示する方法で実現することもできる。
さらに、本処理装置は、分岐予測部を備える。そのため、当該命令バッファに格納される命令列に、分岐する分岐命令が存在するならば、ポインタ部は、同じスレッド内の予測分岐先命令列を格納する命令バッファを指示して命令列の命令バッファを関連付ける。
つまり、命令フェッチ単位内に分岐命令がなく、シーケンシャルに命令が続いていくならば、同一スレッドでシーケンシャル方向に続く命令列を格納する命令バッファが指示される。なお、ここでは、分岐命令がない場合の命令の系列をシーケンシャル方向の系列と呼ぶことにする。
分岐命令があれば、同一スレッドで分岐先命令フェッチの命令列を格納する命令バッファが指示される。ポインタ部は、当該命令バッファからシーケンシャル方向に続く命令バッファの指示と分岐方向で続く命令バッファの指示のために、一つのレジスタをもって、これらのどちらかの情報が格納されているようにしてもよいし、また、シーケンシャル専用のポインタを格納するレジスタ、分岐専用のポインタを格納するレジスタを別々に設けてもよい。
このように、スレッドごとに命令バッファのポインタを関連付けていくことで、スレッドが混在することなく、ポインタチェーンを作ることができる。
図3にその一例を示す。この例では、スレッド1とスレッド2の2つのポインタチェーンが構成されている。また、それぞれのスレッドにおいて、シーケンシャル方向を示す実線のポインタと、分岐方向を示す波線のポインタとが存在する。
本処理装置では、命令バッファ間の関連付けはポインタによって行われる。また、命令フェッチの都度、命令バッファが割り当てられる。したがって、あるタイミングでの命令フェッチは、どのスレッドのものでも構わない。命令フェッチやその他の要素の都合で自由に命令フェッチを行うスレッドを選択することができる。
また、命令フェッチ要求のアドレスは、特許第3845043号に示されるようなシーケンシャル方向の命令フェッチアドレスを保持するレジスタと、分岐予測先アドレスを保持するレジスタと、命令バッファのすべてが無効化された場合に命令フェッチを再開するための再命令フェッチアドレスを保持するレジスタとを用いて、それらから予め定められた優先度に応じて選択するようなことが考えられる。
これらをマルチスレッドに対応させるために、それぞれのアドレス保持用のレジスタをスレッドごとに1セット用意する。再命令フェッチのアドレスは、同じスレッドに所属し、使用中のすべての命令バッファが無効化された場合に、命令フェッチを再開するためのアドレス、ということになる。
以上のような命令フェッチするアドレスの選択指針としては、種々のものを考えることができる。例えば、予め定められた優先度によって、すべてのレジスタの中から1つのレジスタを選んで、その選択されたレジスタに格納されたアドレスで命令フェッチ要求を送出してもよい。また、例えば、スレッドごとに優先度を予め決めて、スレッドごとにレジスタを1つ選び、さらに別の手段を持ってどのスレッドの命令フェッチ要求を送出するかを決めて、命令フェッチ要求を送出することもできる。
後者の場合、命令フェッチするスレッドの選択手法は、単純にラウンドロビンで、選択するスレッドを巡回させることがまず考えられる。命令バッファを少しでも効率よく使うため、別の要因でのスレッドごとの命令フェッチ制限がなければ、現在使用中の命令バッファの個数がより少ないスレッドを選択してもよい。そのような選択により、常にどのスレッドも平均的に使用されているようにする、ということが考えられる。別のレジスタの設定値によって、それらを選択してもよい。優先すべきスレッドをレジスタに設定しておけばよい。それらは、性能測定を行った結果で静的に設定してもよいし、動的に設定してもよい。例えば、例えば、命令フェッチ後の経過時間順(長く命令フェッチされていないスレッドを優先し、最近命令フェッチされたスレッドの優先度を低くする順)にフェッチするスレッドを決定してもよい。
本実施形態では、このような命令フェッチための手段を提案する。そして、命令フェッチで得たデータを命令解釈実行する実行制御部に供給する際には、スレッドごとに前述の各命令バッファのポインタチェーンをトレースしていけばよい。ただし、命令フェッチ手段は、本実施形態の構成に限定される訳ではない。
ポインタをトレースするための手段として、現在、命令供給のために使用しようとしている、または使用中の命令バッファを指し示す、さらなるポインタを準備することができる。該さらなるポインタによって、各命令バッファ自身が持つポインタをトレースしていく。該さらなるポインタの出力信号を用いて、命令バッファを選択し、実行制御部に命令を供給する。該さらなるポインタは、スレッドごとに準備してもよい。その際には、どちらのスレッドのポインタで選ばれたものを実際に投入するかは、別の機構によって選択する。図4に、予め個々の命令バッファに振られた識別番号をポインタとして用いた場合のさらなるポインタについて示す。
この例では、スレッド1のさらなるポインタには、トレースされる命令バッファのポインタ(バッファ番号)が設定される。すると、さらなるポインタは、セレクト信号を出力し、スレッド1のセレクタを切り換え、読み出すべき命令バッファから、命令を出力させる。出力された命令は、命令実行部に引き渡される。
また、該さらなるポインタは、投入することが決定されたスレッドの命令バッファを指し示すようにしてもよい。どのスレッドを投入するかは、別の機構によって予め選択しておく。
その別の機構での命令実行部へ命令供給すべきスレッドの選択方法は、単純にラウンドロビンで順番にスレッド番号(スレッドを識別する情報であり、スレッド識別情報ともいう)を巡回することがまず考えられる。命令バッファを少しでも効率よく使うため、別の要因でのスレッドごとの命令供給制限がなければ、現在使用中の命令バッファの個数がより多いスレッドを選択して、常にどのスレッドも平均的に使用されているようにする、ということが考えられる。別のレジスタの設定値によって、それらを選択してもよい。それらは、性能測定を行った結果で静的に設定してもよいし、動的に設定してもよい。例えば、スレッドに属する命令実行後の経過時間順(長く命令が実行されていないスレッドを優先し、最近命令が実行されたスレッドの優先度を低くする順)に、命令供給するスレッドを決定してもよい。
このように、別の機構で命令供給すべきスレッドを決定した場合は、その他のスレッドが現在どこまで投入されたかの情報を保持するレジスタを別途持つようにする。その保持するレジスタは、スレッドごとに固定で持ってもよいし、スレッドごとに固定せず、レジスタそのものにスレッド番号を持たせてもよい。次に投入することが決定したスレッドはこのレジスタにある現在までの投入情報を用いて、次に投入すべき命令バッファを確定し、該さらなるポインタにセットする。このようにして、スレッドごとにポインタチェーンをトレースしていくことができる。
さらに、これらの命令バッファの付属タグとして、スレッドの番号を保持しておくことができる。分岐予測の失敗、あるいは、何らかの初期化要求、例えば、エラー処理等で、特定スレッドの使用中の命令バッファすべてが不要となったときには、このスレッド番号によって命令バッファを見分け、バッファを解放することができる。解放されたバッファは、どのスレッドが使用してもよい。
さらに、特定スレッドの命令バッファの解放では、それぞれの命令バッファの間の関連付けを利用して、順番に行っていくという手順も考えられる。複数の命令バッファを同時に使用開始するようなことでもない限り、ポインタにしたがってトレースしつつ順番に解放していっても問題はない。解放されたバッファは、どのスレッドが使用してもよい。以上に述べたような構成をとることで数限りある命令バッファを効率よく使うことができる。
また、特許第3804941号のようなショートループを構成したい場合には、ショートループの起点を保持する起点保持レジスタをスレッドごとに持つことで命令バッファでのショートループの構成と利用が可能となる。
本起点レジスタを持つことで、起点となる命令バッファをスレッドごとに場所を限定することなく設定することができる。空きがあればどのスレッドでも使用することができる。かつ、ショートループの構成も可能となる。このようにして、限りある資源を存分に生かしたマルチスレッドの処理が可能となる。
以上をまとめると以下の通りである。
(1)命令バッファ割り当て部はこれまで通り、1つでよい。割り当て部は、次に使用可能な命令バッファを1つ選択するだけでよい。
(2)命令バッファをどちらのスレッドに割り当てるかは、命令フェッチがどのスレッドのものであるかに依存する。
(3)命令フェッチ要求部も、マルチスレッド対応が必要となる。それは、すべての要求の中から、ある優先度によって1つの命令フェッチ要求を選択する方法と、従来の手順にしたがった優先度を決定してスレッドごとに1つを選択した後、別の機構によってスレッドの選択を行って最終的に1つの命令フェッチ要求に絞る方法と、が考えられる。
(4)命令フェッチのスレッドの選択手法は、単純なラウンドロビンによる方法、命令バッファ使用個数の大小比較(命令バッファ使用個数の少ないスレッドを選択)による方法、命令フェッチ後の経過時間順(長く命令フェッチされていないスレッドを優先し、最近命令フェッチされたスレッドの優先度を低くする)、または、優先して選択すべきスレッドをレジスタで設定してもよい。
(5)命令実行部への命令供給対象のスレッドの選択方法は、単純なラウンドロビンによる方法、または、命令バッファ使用個数の大小比較(命令バッファ使用個数の多いスレッドを優先して選択)による方法、命令供給後の経過時間順(長く命令実行部に命令供給されていないスレッドを優先し、最近命令供給されたスレッドの優先度を低くする)または、優先して選択すべきスレッドをレジスタで設定してもよい。
(6)それぞれのスレッドの命令バッファをトレースしていけるように各命令バッファのポインタを設定する。つまり、自分のスレッドの次の命令フェッチ(いつ発行されるか予測困難)でポインタを設定する。それだけで、スレッドごとのポインタチェーンができ上がる。
(7)命令供給は、スレッドごとにポインタチェーンをトレースしていけばよい。ポインタチェーンをトレースしていくための手段は以下に例示できる。
手段1:トレーサとなるレジスタをスレッドごとに持って、ポインタチェーンをトレースしていく。実行部での命令投入時にどのスレッドにするかを選択する。
手段2:実行部に命令投入する命令バッファを示すポインタのレジスタは専用で持つ。投入待機中のスレッドについては、現在どこまで投入されたかを保持しておく。
《第1実施形態》
<システムの構成と概要>
図5に、本処理装置の構成図を示す。図6に命令フェッチにおける制御の全体図を示す。本処理装置は、例えば、主記憶装置121に格納された命令を読み出して実行する、いわゆるプログラム内蔵方式のコンピュータである。
図5、図6のように、この処理装置は、命令を実行する演算ユニット120と、演算ユニット120で実行される命令および演算ユニット120が処理するデータ等を格納する主記憶装置121と、演算ユニット120が実行すべき命令の主記憶装置121上のアドレスを指定するプログラムカウンタ122とを有している。
図6では、さらに具体的に、プログラムカウンタ122の生成するアドレス、分岐リザベーションステーション126からの再命令フェッチ指示、あるいは分岐予測部3の予測結果に基づいて命令のフェッチを制御する命令フェッチ制御ユニット5(命令フェッチ部に相当)と、命令キャッシュ102を管理し命令フェッチ制御ユニット5からの命令フェッチ要求にしたがって命令をフェッチする命令キャッシュ制御ユニット4と、命令キャッシュ102からフェッチされた命令を保持する命令バッファ1(命令バッファ1がバッファ要素に相当し、命令バッファ1の集合がバッファ部に相当する)と、命令バッファ1の命令をデコードする命令デコーダ7と、デコードされた命令の実行タイミングを制御するリザベーションユニット(分岐命令の実行を制御する分岐リザベーションユニット126およびレジスタ演算命令、アドレス演算命令の実行を制御するその他リザベーションユニット127)と、命令の実行完了を監視する命令完了管理ユニット128と、演算ユニット120で実行される命令のオペランドを高速に演算ユニット120に供給するオペランドキャッシュ129と、主記憶装置121とオペランドキャッシュ129との間でデータの授受を管理するデータキャッシュ制御ユニット131とを有している。
ここで、命令デコーダ7と演算ユニット120とが実行部に相当する。また、主記憶装置121と命令キャッシュ102とが記憶部に相当する。さらに、命令フェッチ制御ユニット5とプロセス管理ユニット140とリザベーションユニット(分岐リザベーションユニット126を含む)と分岐予測部3と命令完了ユニット128とが制御部に相当する。
<命令フェッチ制御ユニットの構成>
図7に、命令フェッチ制御ユニット5の詳細構造と命令フェッチ制御ユニット5に関連する回路の構成を示す。
プロセス管理ユニット140は、スレッドごとにプログラムカウンタ122をもつ。プログラムカウンタ122は、スレッドごとに、命令実行完了にともなって値の更新を行う。
分岐リザベーションステーション126は、分岐命令の実行を制御する。そして、分岐命令の実行によって分岐するか否か、また分岐する場合には分岐先アドレスが確定したときに、完了報告が分岐リザベーションステーション126から、命令完了ユニット128に送出される。また、分岐リザベーションステーション126は分岐予測が正しかったか否かを判定し、その結果を分岐予測部3に通知する。さらに分岐予測が失敗した場合には、その旨を示すキャンセル信号を命令フェッチアドレス選択部9に送出する。
命令フェッチアドレス選択部9は、割り込み、あるいは、トラップ等が発生したときにプログラムカウンタ122から供給されるアドレス、分岐予測失敗時に分岐リザベーションステーション126から出力される再命令フェッチ要求信号および再命令フェッチ要求アドレス、分岐予測部3から出力された分岐予測先命令フェッチ要求信号および分岐予測先命令フェッチ要求アドレス、またはシーケンシャル方向のアドレス(命令語長単位、例えば、32バイトずつ順次、加算することで生成される命令アドレス)等に基づいて、命令データが格納されている命令キャッシュ102を索引するための命令フェッチ要求アドレス(IF_REQ_ADDRESS)を生成する。
命令フェッチ要求部2は、命令バッファ1において、現在無効化されている命令バッファ(単体の場合も命令バッファと呼ぶ)の中から、命令バッファ制御部8によって確保された命令バッファを指示するためのバッファ識別情報(IF_REQ_ID)を受け取る。命令フェッチ要求部2は、無効化されている命令バッファ1が存在する限り命令フェッチ要求を出すように構成されている。
そして、命令フェッチ要求部2は、生成された命令フェッチ要求アドレス(IF_REQ_ADDRESS)とともに、命令フェッチ要求信号(IF_REQ_VALID)、および1つの無効化されている命令バッファ1を指示するためのバッファ識別情報(IF_REQ_ID)を出力する、等の処理を行う。これにより、命令キャッシュ102に格納されている命令データの中からIF_REQ_ADDRESSに対応する命令列が読み出される。読み出された命令列は、IF_REQ_IDに対応する命令バッファ1に格納される。なお、図7では、省略されているが、IF_REQ_IDとIF_REQ_ADDRESSとを組み合わせた命令フェッチ要求の生成は、命令フェッチアドレス選択部9で行ってもよい。
分岐予測部3は、IF_REQ_ADDRESSに対応する命令列に分岐が成立する分岐命令が含まれているか否かを予測し、それが含まれていると予測した場合には、その分岐先の命令アドレスを予測し、その予測した分岐先命令アドレス(分岐予測先命令アドレス)と共に分岐予測先命令フェッチ要求信号を、アドレス選択部9へ出力する。また、その場合には、分岐予測部3は、IF_REQ_ADDRESSに対応する命令列に分岐成立が予測された命令が含まれることを示す情報、およびその予測された命令の命令列上の位置を示す情報を、命令バッファ制御部8へ出力する等の処理を行う。命令バッファ制御部8では、これらの情報を命令バッファに付属のタグとして、管理する。
命令バッファ制御部8は、無効化された命令バッファ1のいずれかを選択し、その命令バッファ1を指示するためのスレッド識別情報(IF_REQ_ID)を命令フェッチ要求部2に供給する。さらに、命令バッファ制御部8は、ポインタによって継続してデコードされるべき命令バッファ1を結合する。すなわち、命令バッファ制御部8は、IF_REQ_ADDRESSに対応する命令列が保持されている命令バッファ1のポインタ部1Bに、当該命令バッファ1に保持されている命令列の次に供給されるべき後続命令列が保持されている命令バッファ1を指示する情報を格納する。本実施形態では、後続命令列を格納する後続の命令バッファ1が確保されたときに、その後続の命令バッファ1の識別IDを先行する命令の命令バッファ1のポインタ部1Bに設定する。
命令供給制御部6(供給スレッド決定部に相当)は、次に命令デコード部7へ供給する命令列を保持している命令バッファ1の識別IDを示すCURRENT_STREAM_IDと、CURRENT_STREAM_IDが示す命令バッファ1に保持されている命令列のオフセット位置を示すNSI_COUNTER(オフセット値)を設定する、等の処理を行う。NSI_COUNTERは、命令バッファ1の各命令バッファに含まれる複数の命令列(例えば8命令)のうち、何番目の命令から命令を供給するかを示す。CURRENT_STREAM_IDによって命令バッファを選択し、NSIカウンタの示す命令から供給を行う、というようにして、命令デコード部7への命令供給を実現する。またさらに、現在供給中のスレッド番号をしめすCURRENT_THREAD_IDを備える。
<命令バッファの構成>
本処理装置においては、各命令バッファ1は個別に識別番号iを持つ。本実施形態では、識別番号i=0〜7までの合計8つの命令バッファ1があるものとする。また、マルチスレッドのスレッド数はN+1とし、スレッド番号j=0〜Nとする。
図8に、命令バッファ1の構造を示す。各命令バッファ1は、命令フェッチ単位ごとに命令語を保持するデータ部1Aと、当該命令バッファ1の次に供給使用される命令バッファ1の番号を指示するためのポインタ部1Bから構成される。
図8のように、データ部1Aは、複数の命令を保持するレジスタ列を含む。また、ポインタ部1Bは、シーケンシャル方向に続く命令バッファ1の番号を示すIBRi_SEQ_IBR_IDおよびその有効性フラグIBRi_SEQ_ID_Vと、分岐する場合に、分岐先命令列を保持する命令バッファ1の番号を示すIBRi_TGT_IBR_IDおよびその有効性フラグIBRi_TGT_ID_Vという、2系統のレジスタを備える。
ここで、レジスタをIBRi_SEQ_IBR_ID等にて表した場合、先頭の”IBRi_”は、第i番目の命令バッファ1 (IBRi)に所属するレジスタであることを示している。図8では、命令バッファ1を総称しているので、”IBRi_”が省略されている。以下、命令バッファ1を総称する場合、それぞれのレジスタの先頭の”IBRi_”を省略する。また、IBRi_SEQ_IBR_ID等は、レジスタを示すとともに、各レジスタに格納された信号の種類を表している。
さらに、命令バッファ1は、バリッドビット(IBRi_VALID)、および当該命令バッファ1を使用しているスレッド番号(IBRi_THREAD_ID)の保持部を備える。バリッドビットは、1に設定することで、当該命令バッファ1が使用中であることを示す。命令バッファ1が不要となった際には、このバリッドビットを0に設定する。このことを命令バッファ1の解放または無効化と呼ぶ。
<命令フェッチ要求アドレス選択部の機能概要>
(1スレッド内で命令フェッチ要求アドレスの選択)
図9に、命令フェッチアドレス選択部9の詳細を示す。命令フェッチアドレス選択部9は、複数の命令フェッチアドレス保持部11をスレッドごとにそれぞれ個別に有する。そのため、スレッド1、2等を識別する場合には、命令フェッチアドレス保持部(本実施形態のアドレス保持部に相当)11−1、11−2のように示す。また、スレッドを識別することなく、総称する場合には、命令フェッチアドレス保持部11という。
命令フェッチアドレス選択部9の命令フェッチアドレス保持部11は、スレッドごとに、以下の複数の命令フェッチ要求アドレスを保持するレジスタを持つ。
(1)シーケンシャル命令フェッチ要求用レジスタ(非分岐アドレス保持部に相当):
シーケンシャル命令フェッチ要求のアドレスは、現在出力されたある命令フェッチ要求にシーケンシャルに続くアドレスである。そのアドレスは,出力された命令フェッチ要求のアドレス(IF_REQ_ADDRESS)に対して、該命令フェッチで取得され命令バッファ1内に保持される命令列の合計命令長を加算したものとなる。
つまり、一命令を4バイトとして、命令バッファ1が8命令を格納する(32バイト)のであれば、次の命令アドレスは、IF_REQ_ADDRESS+32とする。
(2)分岐先命令フェッチ要求用レジスタ(分岐先アドレス保持部に相当):
分岐先命令フェッチ要求のアドレスは、分岐予測部3を備える場合に生成される。分岐先命令フェッチ要求のアドレスは、現在出力されたある命令フェッチ要求で得られる命令列の中に、分岐する分岐命令が予測されときの、その予測分岐先アドレス(IF_TGT_ADDRESS)である。
(3)再命令フェッチ要求用レジスタ(再読み出しアドレス保持部に相当):
再命令フェッチ要求のアドレスは、分岐予測失敗、エラー処理などの理由により、あるスレッドの命令バッファ1がすべて無効になった場合に、新たに命令フェッチを開始するときの再命令フェッチアドレス(REIFCH_ADDRESS)である。ただし、割り込み、あるいは、トラップ等が発生した場合は、プログラムカウンタ122から、再命令フェッチ要求用レジスタに次にフェッチすべきアドレスが供給される。
これらのアドレスは、それぞれのレジスタに格納される。これらのレジスタは各々バリッドビットを備える。バリッドビットは、レジスタに保持されるアドレスの有効性を示すと同時に、要求の有効性を示す。
命令フェッチ要求は、予め定められた優先順位によって、上記(1)から(3)のレジスタの中から、1つのアドレスを選択する。これを本実施形態では、第一の選択と呼ぶ。第1の選択は、1つのスレッド内での命令フェッチ要求用レジスタ(1)から(3)の選択である。
(スレッド選択)
さらに、本処理装置は、これらのレジスタをスレッド数分もつ。そして、スレッド間で1つの命令キャッシュ102を共有していて、入力受付は1つだけであるなど、同時には1つのフェッチ要求のみ受け付けることができる構成の場合には、複数のスレッドの中から、次の命令フェッチで出力すべきスレッド(IF_REQ_THREAD_ID)を選択する必要がある(第二の選択)。もちろん、本実施形態は、そのような構成のみではなく、同時に複数のフェッチ要求を受け付ける処理装置にも適用できる。スレッドの選択を行う場合の選択の条件を以下のように設定する。
A.現在、命令処理実行状態(ENABLE_PROCESS_THj)にある。
B.分岐予測失敗などによる全キャンセルが発せられていない〜CANCEL_THj)。なお、本実施形態で、”〜”は、否定を表す記号である。
C.命令キャッシュ制御ユニット4が命令フェッチ要求を受け付けることができる〜I$_BUSY_THj)。すなわち、命令キャッシュ102がビジーでない。
D.他のスレッドに比べて、命令バッファ1の使用数が少ない。
スレッドごとの命令バッファ1の使用数は、命令バッファ1のバリッドをスレッドごとに、例えば、加算回路によって数えることで調べることができる。また、命令バッファ1が特定のスレッドに使用されているか否かの判定は、図8に示したレジスタであるTHREAD_IDを参照すればよい。
これらの条件を満たし、かつスレッドごとの命令バッファ1の使用数(IBUFF_NUM_THj)が同じであるスレッドが複数あってそれらの優先順位がつけがたい状態にあれば、本処理装置は、さらにそれらの中で、前回の命令フェッチから最も時間の経過したスレッドを選択するようにする。
<命令フェッチアドレスの第二の選択回路の選択信号>
選択回路を図10A−10Jに示す。このようにして第一の選択で選択された各スレッドの命令フェッチ要求アドレスに対して、さらに第二の選択を行う。そして最終的に、命令フェッチで使用するアドレス(IF_REQ_ADDRESS)を得る。
図10Aに、有効スレッド識別信号(THj_VALID)の生成回路を示す。図10Aのように、有効スレッド識別信号(THj_VALID)は、イネーブルプロセススレッド信号(ENABLE_PROCESS_THj)、キャンセルスレッド信号の否定(〜CANCEL_THj)、およびキャッシュビジースレッド信号の否定(〜I$_BUSY_THj)のAND信号によって形成される。図10Aの生成回路の構成は、上記スレッドの選択で説明したA、B、およびCの3つの条件に対応している。
イネーブルプロセススレッド信号(ENABLE_PROCESS_THj)は、プロセス管理ユニット140(図7参照)から出力され、現在命令実行状態にあるスレッドを示す信号である。
キャンセルスレッド信号(CANCEL_THj)は、分岐リザベーションステーション126から出力され、スレッドjに対して処理のキャンセルを要求する信号である。処理がキャンセルされる場合とは、例えば、分岐予測失敗等によって命令バッファ1に読み出された未実行の命令が無効になる場合である。
キャッシュビジースレッド信号(I$_BUSY_THj)は、命令キャッシュ制御ユニット4から出力され、命令キャッシュに対する新規命令フェッチ要求が受け付けられないことを示す信号である。
以上のように、現在実行可能であり、現在キャンセル信号がでておらず、かつ、命令キャッシュ102に空きがあるとき、有効スレッド識別信号(THj_VALID)はオンとなる。
図10Bに、使用中の命令バッファ1の数にしたがって、スレッドを選択する場合の概念を示す。図10Bでは、各スレッドjが使用中の命令バッファ1の数(IBUFF_NUM_THj)を簡略化してTHjで示している。
例えば、n番目のスレッドが選択されるのは、
THn_VALID
& ( THn <= TH1 | 〜TH1_VALID )
& ( THn <= TH2 | 〜TH2_VALID )
&・・・(中略)・・・
& ( THn <=TH0 | 〜TH0_VALID )
が真の場合である。
すなわち、n番目のスレッドが選択されるのは、図10Aに示した有効スレッド識別信号(THn_VALID)がオンであり、かつ、スレッドnで使用中の命令バッファ1の数(THn)が、他の有効なスレッドで使用中の命令バッファ1の数(THj、jはn以外)よりも少ないことが条件である。ここで”|”は、OR条件を示している。したがって、〜TH1_VALID等がオンの場合、すなわち、スレッド1等が有効でない場合には、そのスレッドについては、使用中の命令バッファ1の数は比較されないことになる。図10Bの構成をそのまま論理ゲートで構成することで、使用中の命令バッファ1の数が少ないスレッドを選択できる。
図10Cに、スレッド選択後の経過時間によるスレッド優先度決定するレジスタ列の概念を示す。図10Cで、レジスタ列に格納されているデータAからデータHは、スレッドの識別情報(スレッド番号)である。このレジスタ列は、図面上で上方に位置するものほど、最近命令フェッチされたスレッドの識別情報を格納する。また、このレジスタ列は、図面上で上方に位置するものほど、優先順位が低いスレッドの識別情報を格納する。逆に、このレジスタ列は、図面上で下方に位置するものほど、優先順位が高いスレッドの識別情報を格納する。
図10Dに、スレッド選択によってスレッドの優先順位を変更する処理例を示す。この例では、上から第m番目に位置するレジスタにデータEが格納されている。今、データEに相当するスレッドが選択され、命令フェッチされた場合を考える。この場合に、まず、第m番目に位置するレジスタのエントリが空きとなる(実際には、上書き可能な状態となる)。このとき、第m番目に位置するレジスタの内容(データE)は、外部のレジスタに保持されている。
そして、第m+1番目のレジスタより上側のレジスタ(データA〜データDが格納されている)が1つずつ下方向にシフトされる。これによって、データA〜データDに対応するスレッドの優先順位が1ずつ高められることになる。そして、最後に、外部のレジスタに保持されていたデータEが、最上段のレジスタに格納される。その結果、データEに相当するスレッドの優先順位が最後尾となる。
図10Eに、スレッド選択後の経過時間によるスレッド優先度決定回路(スレッド順序管理部、および順序管理部に相当)を示す。このスレッド優先度決定回路は、図10Bの使用中の命令バッファ1の数(THj)によって、優劣がつかないスレッド間で、さらに優先度を決定する。図10Eの回路では、”LAST_PRIO_THREAD”、”nTH_PRIO_THREAD”、・・・、”1ST_PRIO_THREAD”の各エントリには、いずれかのスレッド番号(TH0からTHn)が保持されている。
これらの初期値は、例えば、スレッド番号順に、下からセットしておく。この場合、1ST_PRIO_THREADには、TH0が設定され、LAST_PRIO_THREADには、THnが設定される。そして、以後、命令フェッチでのスレッドの選択にしたがって、最近命令フェッチされたスレッドのスレッド番号が最も優先度の低い最上段のエントリ(LAST_PRIO_THREAD)に移動し、それ以外のスレッドが、上から2番目のエントリ以下に順送りで移動される。このスレッド優先度決定回路のエントリがスレッドレジスタに相当する。
以下、図10Eの回路の動作を説明する。図10Eの上部左側の端子であるIF_REQ_THREAD_IDおよびIF_REQ_VALIDには、前回の処理で命令フェッチ要求部2から命令フェッチ要求がされた送出されたスレッドのスレッド番号(IF_REQ_THREAD_ID)およびその有効性を示す信号(IF_REQ_VALID)が入力される。なお、IF_REQ_THREAD_IDを生成する回路は、図10Iに示す。
ANDゲート111は、IF_REQ_VALIDがオンの場合に、前回の処理で命令フェッチ要求部2から命令フェッチ要求がされた送出されたスレッドのスレッド番号(IF_REQ_THREAD_ID)をマッチ回路(MCH、比較部に相当する)に出力する。
各マッチ回路(MCH)には、”LAST_PRIO_THREAD”、”nTH_PRIO_THREAD”、・・・、”1ST_PRIO_THREAD”の各エントリが入力されている。したがって、IF_REQ_THREAD_IDのスレッド番号とそれぞれのエントリとの比較結果が一致したとき、マッチ回路(MCH)の出力がオンになる。すなわち、USED_LASTからUSED_1STのいずれかがオンとなる。
今、IF_REQ_THREAD_IDが1ST_PRIO_THREADの値(上記のように初期値は、スレッド番号0(TH0))であったする。すると、USED_1STがオンとなる。その結果、まず、最下段のANDゲート113−1が開き、1ST_PRIO_THREADのエントリに、1つ上段である2ND_PRIO_THREADのエントリのスレッド番号が書き込まれる。
このとき、USED_1STが入力されるORゲート112−n、112−(n−1)、・・・のすべてがオンになっている。その結果、ORゲート112−n、112−(n−1)、・・・の次段のANDゲート113−n、113−(n−1)、・・・113−1がオンとなる。
すると、LAST_PRIO_THREADのエントリから2ND_PRIO_THREADのエントリまで、エントリ内のスレッド番号が順送りされる。最後に、スレッド番号0(TH0)がLAST_PRIO_THREADにセットされる。以上のORゲート112−i(i=1〜n)、ANDゲート113−k(k=2〜n)、およびデコーダがシフト制御部に相当する。
同様に、IF_REQ_THREAD_IDがスレッド番号j(0<j<N)であった場合も同様に、j番目のエントリの1つ上段のエントリから最上段LAST_PRIO_THREADのエントリが、それぞれ1つずつ順送りされるとともに、最上段LAST_PRIO_THREADのエントリには、スレッド番号jが書き込まれる。このようにして、命令フェッチされたスレッドの番号が、常に最上段LAST_PRIO_THREADのエントリに保持されるとともに、命令フェッチされなかったスレッドのスレッド番号が、下段のエントリに順送りされることになる。
図10Eでデコーダ(DEC)は、スレッド番号に対応するビット線をオンにする回路である。したがって、”LAST_PRIO_THREAD”、”nTH_PRIO_THREAD”、・・・、”1ST_PRIO_THREAD”の各エントリの値に対応するビットがそれぞれオンになってデコードされることになる。すなわち、最近使用された順に、スレッドが識別されることになる。
以上の構成によれば、最近処理がなされたスレッドの優先順位を低くし、処理がなされてから最も長い期間処理がなされていないスレッドの優先順位を高くし、スレッドを管理できる。管理は、図10Eのように、管理対象分のスレッドを識別するエントリと、このエントリのそれぞれと現在時点で処理がなされたスレッドとを比較するマッチ回路と、マッチ結果にしたがって各エントリを移動するシフト回路があればよい。したがって、極めて簡易かつ柔軟に、スレッドの優先順位を管理できる。
図10Fは、最優先される第1プライオリティのスレッドが決定されたときにオンになる回路である。すなわち、図10Fで各ANDゲートに入力されるTH0_SELからTHn_SELは、図10Bに示した各スレッドで使用中の命令バッファ1の数に基づく、スレッドの選択信号である。また、1ST_PRIO_TH0から1ST_PRIO_THnは、図10Eに示した第1優先度スレッドのデコード信号である。したがって、スレッドで使用中の命令バッファ1の数が最も少なく、かつ、第1優先度のスレッドが存在した場合に、図10Fの回路の出力であるSEL_1ST_PRIOはオンになる。
図10Gは、同様に、第2プライオリティのスレッドが決定されたときにオンになる回路である。ただし、1ST_PRIO_OR信号が反転されてANDゲートに入力されていることから、第1プライオリティのスレッドが決定されなかったことを条件とする。
図10Hは、同様に、ラストプライオリティのスレッドが決定されたときにオンになる回路である。ただし、1ST_PRIO_OR信号からnST_PRIO_OR信号が反転されてANDゲートに入力されていることから、第nプライオリティ以上の優先度のスレッドが決定されなかったことを条件とする。
図10Iは、図10Fから図10Hで示した回路の出力信号によって、決定される最も高い優先度のスレッドが決定されたときに、そのスレッド番号を出力する回路である。すなわち、SEL_1ST_PRIO等がオンのときに、1ST_PRIO_THREAD等がそれぞれスイッチから出力され、IF_REQ_THREAD_IDが生成されることになる。このIF_REQ_THREAD_IDは、図9に示した第2の選択回路において、スレッドを選択するための制御信号として使用される。また、IF_REQ_THREAD_IDは、図10Eの左上方に示された端子から入力される信号であり、前回の命令フェッチで選択されたスレッドを示す。
図10Jは、スレッド数が2つの場合に利用可能なスレッド選択回路の例である。すなわち、スレッド数が2つの場合には、使用中の命令バッファ1の数が同数の場合、優先度を交互に変更してもよい。二つのスレッド番号は各々0、1とする。ここで、フリップフロップFF(2値保持部に相当)には、前回命令フェッチされたスレッドのスレッド番号が保持されている。例えば、前回命令フェッチされたスレッドがスレッド0であれば、フリップフロップをリセット状態にすればよい(=0をセット)。また、前回命令フェッチされたスレッドがスレッド1であれば、フリップフロップをセット状態(=1をセット)にすればよい。
また、BOTH_VALIDは、ANDゲートG1の2つの入力が真、すなわち、現在使用中の命令バッファ1の数が2つのスレッドについて同数の場合に、オンになる。ANDゲートG1が同数判定部に相当する。インバータIV(反転部に相当)は、前回命令フェッチされた信号を示す信号(LAST_THREAD_ID)を反転する。
一方、図10Jにおいて、BOTH_VALIDがオフ、すなわち、現在使用中の命令バッファ1の数が2つのスレッドについて同数でない場合、一方の入力が反転されたANDゲートG2によって使用中の命令バッファ1の数でスレッドが決定される。例えば、スレッド0の使用中の命令バッファ1の数が少ない場合、IF_REQ_THREAD_IDは0となる。また、スレッド1が選択された場合、IF_REQ_THREAD_IDは1なる。このようにして、スレッド数を2に限定した場合には、図10B−10Gと比
較して簡略な回路でスレッドを選択できる。
なお、第二の選択信号の生成は、命令バッファ制御部8において行われる。
<命令フェッチの処理手順>
図7、図9を用いて処理手順を説明する。図9のスレッド1用命令フェッチアドレス保持部11−1、およびスレッド2用命令フェッチアドレス保持部11−2において、IF_SEQ_ADDRESSおよびSEQ_PARENT_IDとあるのは、シーケンシャル命令フェッチ要求用レジスタSEQ1(スレッド1用)、SEQ2(スレッド2用)である(非分岐アドレス保持部に相当する)。また、IF_TGT_ADDRESSおよびTGT_PARENT_IDとあるのは、分岐命令フェッチ要求用レジスタTGT1(スレッド1用)、TGT2(スレッド2用)である(分岐アドレス保持部に相当する)。また、REIFCH_ADDRESS(再命令読み出しアドレス保持部に相当)とあるのは、再命令フェッチ要求時の命令フェッチ先アドレスを保持する。
そして、先に述べたとおり、保持されたアドレスの中から第一および第二の選択によって一つの命令フェッチ要求アドレスが選択される。なお、再命令フェッチ要求が発せられるときは、演算器で実行中の同一スレッド内の命令はすべてキャンセルされた状態であるため、最も優先されなければならない。一スレッド内での選択は再命令フェッチの優先順位を一番高くして行うが、第二の選択においては、Dの条件により、必然的にこれが選ばれることになる。なぜなら、使用中のバッファ数が0だからである。
命令フェッチ要求部2は、このようにして選択された命令フェッチ要求アドレスを送出する。命令フェッチ要求送出のバリッド信号をIF_REQ_VALIDとする。このとき、命令バッファ制御部8は、命令フェッチの度に、新たな命令フェッチデータを格納するための命令バッファ1を現在使用されていない(=バリッドが立っていない)命令バッファ1の中から1つ選択する(IF_REQ_ID)。このときのスレッドの識別子IF_REQ_THREAD_IDで示されるスレッドに、選択された命令バッファ1は所属することになる。
そして、命令バッファ制御部8は、命令フェッチ要求送出時に、選択された命令バッファ1のバリッドフラグを立てるよう指示を出す。さらに、命令バッファ制御部8は、該命令フェッチ要求を出したスレッドの番号を当該命令バッファ1のスレッド番号保持部(THREAD_ID)に登録する(図8参照)。
さらに、命令フェッチ要求のアドレスによって、分岐命令の検索を並行して行う。分岐予測部3については、例えば特開平9−218786のようなブランチ・ヒストリが利用できる。
さらに、シーケンシャル用と分岐用の命令フェッチ要求保持レジスタ(図9のシーケンシャル命令フェッチ要求用レジスタSEQ1、SEQ2、分岐先命令フェッチ要求用レジスタTGT1、TGT2)は、該レジスタに保持される命令フェッチ要求の親にあたる命令フェッチのデータが格納される命令バッファ1の番号保持部(SEQ_PARENT_ID、TGT_PARENT_ID)を備える。親とはつまり、シーケンシャル命令フェッチ要求用レジスタSEQ1、SEQ2であれば、合計命令長を足す元となるアドレスによる命令フェッチ要求である(格納内容は、親命令バッファ番号:SEQ_PARENT_ID_THj,jはスレッド番号)。また、分岐先命令フェッチ要求用レジスタTGT1、TGT2であれば、親は分岐する分岐命令が予測された命令フェッチ要求のことである(格納内容は親命令バッファ番号:TGT_PARENT_ID_THj)(図9参照)。
そして、命令バッファ1と次の命令バッファ1との関連付け(ポインタの設定)は、同じスレッドの次の命令フェッチの際に行う。図9に示すように命令フェッチアドレス選択部は、親の命令バッファ番号を持っている。そこで、命令バッファ制御部8は、命令フェッチ要求が送出された際に、親の命令バッファ番号(SEQ_PARENT_ID または TGT_PARENT_ID)を用いて、命令バッファ1内の親の命令バッファのポインタを選択し、現在処理中の命令フェッチで使用する命令バッファ番号(IF_REQ_ID)を設定する。また、IF_REQ_IDは新たに親の命令バッファ番号となる。命令フェッチ要求がシーケンシャル方向のものであれば、命令フェッチアドレス選択部9は、親の命令バッファ1(SEQ_PARENT_ID_THn)のSEQ_IBR_IDに対して、現在処理中の命令バッファ番号(そのときのIF_REQ_ID)を設定する。また、命令フェッチ要求が予測分岐先のものであれば、命令フェッチ選択部9は、親の命令バッファ1(TGT_PARENT_ID_THj)のTGT_IBR_IDに対して処理中の命令バッファ番号(そのときのIF_REQ_ID)を設定する。また、各々、ポインタが有効であることを示すフラグを設定する(図9のSEQ_IBR_V、TGT_IBR_V)。
図11A−11Cに、親の命令バッファに対してポインタ設定を実行する回路構成を示す。図11Aは、スレッド1用命令フェッチアドレス保持部11−1およびスレッド2用命令フェッチアドレス保持部11−2から、セレクタおよびデコーダを介して、親の命令バッファ1を選択する回路を示している。デコードされた結果、シーケンシャル方向に対して、SEQ_PARENT_0からSEQ_PARENT_nのいずれかがオンになり、親の命令バッファ1が選択される。また、予測分岐先に対して、TGT_PARENT_0からTGT_PARENT_nのいずれかがオンになり、親の命令バッファ1を選択する。
図11Bは、シーケンシャル方向のポインタを設定する回路の例である。例えば、SEQ_PARENT_nがオンであるときに、さらに、シーケンシャルの命令フェッチ要求であることが判明したときに、親の命令バッファ1(SEQ_PARENT_ID_THn)のSEQ_IBR_IDに対して設定信号(SET_IBRn_SEQ_ID_POINTER)が発生する。そして、その設定信号によって、現在処理中の命令バッファ1を識別するIF_REQ_IDが、SEQ_IBR_IDに設定される。
図11Cは、分岐先方向のポインタを設定する回路の例である。分岐先の命令フェッチ要求が発生したときに、ポインタを設定する回路の動作も図11Bと同様である。すなわち、例えば、TGT_PARENT_nがオンであるときに、さらに、分岐先方向の命令フェッチ要求であることが判明したときに、親の命令バッファ1(TGT_PARENT_ID_THn)のSEQ_IBR_IDに対して設定信号(SET_IBRn_TGT_ID_POINTER)が発生する。そして、その設定信号によって、現在処理中の命令バッファ1を識別するIF_REQ_IDが、TGT_IBR_IDに設定される。
これを続けていくことで、命令バッファ1のポインタチェーンが形成される。命令の供給は、スレッドごとにこのポインタチェーンをたどりつつ行う。このようにして、命令バッファ1を自由に割り当てつつ、スレッドごとにポインタのチェーンを構成して、資源を有効に活用することができる。
<命令供給処理>
(スレッドの選択)
以下、命令供給に際して、どのスレッドを選択するかを決定する選択機構の処理を例示する。各々のスレッドで次に投入する命令バッファ1として選ばれているCURRENT_STREAM_ID_THjのバリッドをCURRENT_STREAM_ID_VALID_THjとする。
本実施形態では、CURRENT_STREAM_ID_VALID_THjがオンとなっているスレッドの中で、前回の命令投入から最も時間の経過したスレッドを選択するようにする。図12A、図12B、図12C、図12D、図12Eおよび図12Fに命令供給時のスレッド選択回路を示す。
図12Aは、命令供給制御部6に含まれる、スレッド選択後の経過時間によるスレッド優先度決定回路(供給順序管理部、順序管理部に相当)を示す。この回路は、最近命令供給されたスレッドの優先順位を最後尾に移動し、命令供給されなかったスレッドの優先順位を1つずつ上げる回路である。
図12Bは、最優先される第1プライオリティのスレッドが決定されたときにオンになる回路である。
図12Cは、同様に、第2プライオリティのスレッドが決定されたときにオンになる回路である。
図12Dは、同様に、ラストプライオリティのスレッドが決定されたときにオンになる回路である。
図12Eは、図12Aから図12Dで示した回路の出力信号によって、決定される最も高い優先度のスレッドが決定されたときに、そのスレッド番号を出力する回路である。
図12Fは、スレッド数が2つの場合に利用なスレッド選択回路の例である。すなわち、スレッド数が2つの場合には、使用中の命令バッファ1の数が同数の場合、優先度を交互に変更してもよい。
以上の回路は、命令フェッチでのスレッド選択で示したスレッドの優先度を決定する回路(図10E、図10F、図10G、図10H、図10Iおよび図10J)と同様であるので、その説明を省略する。
この他には、命令実行リソースの状態を監視しながら、例えば、リザベーションステーション、キャッシュ等のリソースに空きがない場合に、VALIDをオフにするなどして、PRIORITY回路はそのまま流用して、選択するスレッドを決定することもできる。
(命令供給処理例1)
以下、選択されたスレッドにおいて、命令バッファ1から命令実行部へ命令供給する第一の方法を示す。本実施形態では、命令バッファ1において、各々の命令バッファは8命令分を格納できる。現在、命令供給のために使用しようとしている、または使用中の命令バッファ1を指し示すさらなるポインタをスレッドごとに用意する(CURRENT_STREAM_ID_THj)。また、投入を始める命令が命令バッファ1の先頭から何番目の命令であるかを示すオフセット(NSI_COUNTER_THj)も同時に持つ。このオフセットは、8個のバッファエントリのいずれかを指すことになる。
CURRENT_STREAID_THjの更新は、命令供給ごとに行う。命令実行部に供給を供給した結果、命令バッファ1の8個のバッファエントリをまだ使いきっていなければ、現在と同じ命令バッファ1の番号で更新を行う(NSI_COUNTER_THj+命令供給数<8)
8個のバッファエントリを使いきって次の8個のバッファエントリからなる命令バッファ1の設定が必要であれば、該命令バッファ1のSEQ_IBR_IDの値によって更新を行う(NSI_COUNTER_THj+命令供給数>=8)。
また、該命令バッファ1が分岐する分岐命令を含んでいて、次には分岐先の命令バッファ1を設定することが必要であれば、TGT_IBR_IDの値によって更新を行う。
NSI_COUNTER_THjは、供給した命令の個数で更新する。NSI_COUNTER_THj=NSI_COUNTER_THj+命令供給数である(ただし、オフセットなので、繰り上がりから上限値を減算し、剰余を計算する)。
命令供給が2つの命令バッファ1にまたがる場合は、命令バッファ1のポインタを利用して次の命令バッファ1を選択して命令を得ることもできるし、次の命令バッファ1を示すためのさらなるポインタNEXT_STREAM_ID_THjを別途用意してもよい。さらなるポインタNEXT_STREAM_ID_THjを用いることで、事前に次のバッファ番号を用意することができる。もちろんこの NEXT_STREAM_ID_THjと同等のデータは、CURRENT_STREAM_ID_THjから導くことはできるが、実際の実装において、ディレイの問題を解決するためには、このような方策をとることで、論理段数を削減し、高速動作に対応できるようにすることが可能である。このようにして、命令バッファ1のポインタチェーンのトレースを行っていく。
命令デコーダ7は、同時に複数の命令を受けつけることができるが、同一スレッドに限られるものである場合、さらに、どのスレッドのCURRENT_STREAM_IDを用いるかは別の選択機構を持って選択する(選択されたスレッドは、CURRENT_STREAM_THREAD_IDで示される)。これにより、最終的に投入される命令バッファ1が決定され、命令投入が実行される。
もし、命令デコーダ7をスレッドごとに持つのであれば,こちらの選択は不要となり、並列に命令デコーダ7への投入を行う。
以下、選択されたスレッドにおいて、命令バッファ1のポインタをトレースして命令供給する回路構成を説明する。
図13は、1つのスレッド(スレッド番号j)における、使用中の命令バッファ1の先頭のバッファエントリを指し示すさらなるポインタ(CURRENT_STREAM_ID_THj)を生成する回路である。この回路は、命令供給制御部6(図7参照)に含まれる。
図13のように、さらなるポインタは、セレクタ61と、レジスタ62によって形成される。セレクタ61は、ANDゲート、ORゲートを組み合わせて構成される。そして、現在の命令バッファ1の供給が完了し、分岐が予測されていない場合、シーケンシャル方向のポインタSEQ_IBR_IDがレジスタ62に格納される。ここで、現在の命令バッファ1の供給が完了した場合とは、オフセット(NSI_COUNTER_THj)がバッファエントリ数による上限値(例えば、バッファエントリ数が8の場合の上限値7)を越えた場合である。
また、供給した命令列の中に分岐する分岐命令が予測されている場合には、命令列を使い切っていなくても、次には分岐先方向のポインタTGT_IBR_IDがレジスタ62に格納される。
以上のいずれの条件にも該当しない場合、すなわち、分岐が予測されず、かつ、まだ現在の命令バッファ1の供給が完了していない場合には、レジスタ62の値がそのままレジスタ62に戻される。
図14は、図13のセレクタ61への入力となるシーケンシャル方向のポインタSEQ_IBR_IDおよび分岐先方向のポインタTGT_IBR_IDの選択回路である。
この選択回路は、まず、さらなるポインタ(CURRENT_STREAM_ID_THj)をデコードする。さらなるポインタには、現在命令供給中のバッファ番号が格納されている。したがって、デコードされた結果、いずれかのバッファ番号に該当する信号線CURRENT_STREAM_ID_DEC_i_THj(例えば、i=0〜7)がオンになる。したがって、この信号によって、SEQ_IBR_ID_IBRi(i=0〜7)のいずれかが選択され、SEQ_IBR_IDとして抽出される。また、この信号によって、TGT_IBR_ID_IBRi(i=0〜7)のいずれかが選択され、TGT_IBR_IDとして抽出される。このようにして、SEQ_IBR_IDとTGT_IBR_IDが選択され、図13のセレクタ61に入力される。
図15は、スレッドごとに個別にさらなるポインタCURRENT_STREAM_ID_THjを生成し、セレクタで選択する回路を示している。ただし、図15では、j=0および1の場合だけを簡略して示した。しかし、本実施形態の実施は、このような構成に限定される訳ではない。さらなるポインタCURRENT_STREAM_ID_THjを生成する回路の構成および動作は、図13で説明した通りである。
ここでは、現在命令供給されているスレッドのスレッド番号を示すCURRENT_STREAM_THREAD_IDによって、複数のCURRENT_STREAM_ID_THjの中から、スレッド番号に対応するさらなるポインタを選択する。
以上の構成によって、スレッドごとにポインタチェーンをトレースしていくこ
とができる。
(命令供給処理例2)
命令バッファ1から命令実行部の命令供給についての第2の方法を示す。
命令デコーダ7は、同時に複数の命令を受けつけることができるが、同一スレッドに限られるものとする。
現在、命令供給のために使用しようとしている、または使用中の命令バッファ1を指し示すさらなるポインタを格納するレジスタをスレッドに共通で1つ用意する(CURRENT_STREAM_ID)。また、投入を始める命令が命令バッファ1の先頭から何番目かを示すオフセット(NSI_COUNTER)も設ける。
どのスレッドを投入するかは別の選択機構によって、予め選択しておく。選択されないスレッドが、現在どこまで投入されたかという情報を保持する保持レジスタを用意する。レジスタは、命令バッファ1の番号と、次に投入を始める命令が命令バッファ1の先頭から何番目かを示すオフセットを持つ。
CURRENT_STREAM_ID、NSI_COUNTERの更新は、命令供給ごとに行う。更新は、処理例1の手順と同様に行う。ただし、次の投入も同じスレッドが選択される場合は、更新先がCURRENT_STREAM_IDとなるが、別のスレッドが選択された場合は、情報の入れ替えを行う。つまり、新たに選択されたスレッドについて、保持レジスタに保持されていた情報をCURRENT_STREAM_IDおよびNSI_COUNTERに設定し、それによって空いた保持レジスタに、それまでCURRENT_STREAM_IDおよびNSI_COUNTERに設定されていたスレッドの更新情報を登録する。
図16に、命令供給されるスレッドに対するさらなるポインタを格納するレジスタを1つ専用で設け、スレッド間でさらなるポインタを入れ替える回路の構成例を示す。図16でも、説明を簡略化するため、スレッドは、j=0および1としている。ただし、本実施形態の実施は、このような構成に限定される訳ではなく、さらに多くのスレッドに対応する構成としてもよい。
この構成では、セレクタ61−0、61−1と、レジスタ62−0、62−1との間に切り換え回路63が設けられている。切り換え回路63は、スレッドの入れ替え指示信号によって、セレクタ61−0、61−1のいずれか一方をレジスタ62−1(トレースレジスタに相当)に入力し、さらなるポインタCURRENT_STREAM_IDとして、出力する。
一方、さらなるポインタとして出力されなかった他方セレクタの出力は、レジスタ62−0(トレース待ちレジスタに相当)に入力され、ダミーのポインタCURRENT_STREAM_ID_SAVEDとして、出力される。
なお、スレッド数に対応するセレクタ61が3以上ある場合には、命令供給中のスレッドを示すスレッド番号をデコードし、対応するセレクタ62−j(J=0,1,2,・・・)の出力のいずれかを選択すればよい。選択されたセレクタ62−jの出力をCURRENT_DSTREAM_IDとして、レジスタ62−1に出力すればよい。一方、選択されなかったセレクタ62−jの出力は、そのまま廃棄してよい。
このようにして、やはりスレッドごとにポインタチェーンをトレースしていくことができる。
<命令バッファの解放処理>
以下、命令バッファ1の解放(無効化ともいう)について説明する。命令バッファ1の解放は、命令バッファ1の使用後や分岐予測の失敗などで命令バッファ1が不要となったときに行う。
命令バッファ1の供給が終わった後には、供給が終わった命令バッファ1の番号をパイプラインで保持しておき、パイプライン処理上で命令バッファ1を解放してよい段階にくれば、その番号を持つ命令バッファ1のバリッドフラグを0に設定することで解放を行う。
分岐予測が失敗したときは、スレッドごとに分岐予測失敗を示す信号(CANCEL_THj)と、スレッド番号によって、命令バッファ1の無効化信号を生成し、解放を行う。解放された命令バッファ1は初期状態に戻るので、その後どのスレッドが用いてもよい。
図17Aは、命令バッファ1の投入から解放までのサイクルを示す図である。図17Aでは、命令バッファ投入ステージをC、命令デコードステージをD、命令バッファ解放ステージをRで表している。命令バッファ投入ステージで投入されている命令バッファ1の番号は、さらなるポインタCURRENT_STREAM_IDに保持されている。この命令バッファ1の番号は、命令デコードステージでは、レジスタD_STREAM_IDに保持されている。また、命令バッファ解放ステージでは、レジスタR_STREAM_IDに保持されている。
図17Bは、レジスタR_STREAM_IDに保持されている命令バッファ1のバッファ番号をデコードする回路(選択回路に相当)である。このデコードの結果、RELEAS_IBR0からRELEAS_IBRnのいずれかがオンになる。RELEAS_IBR0等は、命令バッファ1がデコードされ、不要となった命令バッファ1を解放するために使用される信号である。
図17Cは、命令フェッチ要求部2(解放部に相当)に含まれる、特定のスレッド(例えば、スレッド番号j)で使用される命令バッファ1を一括して解放するための信号を生成する回路(選択部に相当)の例である。例えば、あるスレッドTHj(スレッド番号j)にて、分岐予測部3による分岐予測が失敗した場合には、そのスレッドTHjでは、命令フェッチがやり直しとなり、その時点で使用中のすべての命令バッファ1が不要となる。また、分岐予測が成功しシーケンシャルな方向の命令バッファ1が不要となることもある。
図17Cにおいて、CANCEL_THjは、例えば、分岐リザベーションステーション126から分岐予測失敗が報知されたときにオンになる。また、IBR_THREAD_ID(識別情報保持部に相当)には、各命令バッファ1を使用中のスレッド番号が格納されている(図7のTHREAD_ID)。したがって、図17Cの回路によれば、出力信号CANCEL_IBRiは、CANCEL_THjがオンになったときに、キャンセルの対象となるスレッドjをIBR_THREAD_IDに持つ命令バッファ1を抽出することになる。
図17Dは、バッファのバリッドビットIBRi_VALID(図8のVALID)を生成する回路の例である。この回路では、まず、使用中の命令バッファ11のバッファ番号を示すレジスタIF_REQ_IDがデコードされ、そのバッファ番号に対応する信号IF_REQ_ID_EQ_0からIF_REQ_ID_EQ_nのいずれかが選択される。そして、IF_REQ_VALIDによってANDゲートがオンになり、IF_REQ_IDに対応するフリップフロップがセットされ、バリッドビットIBRi_VALIDが生成される。
一方、図17Bの回路で生成したRELEASE_IBRi(i=1〜n)または図17Cの回路で生成したCANCEL_IBRi(i=1〜n)のどちらかがオンになると、フリップフロップはリセットされ、バリッドビットIBRi_VALIDがオフとなる。
<逐次解放処理の例>
特定スレッドの全命令バッファ1の解放は、それぞれの命令バッファ1の間の関連付けを利用して、順番に行っていく手段も考えられる。つまり、ポインタにしたがってトレースしつつ順番に解放していっても問題はない。解放されたバッファは、どのスレッドが使用してもよい。本出願人が取得済みの日本国特許390806029のような起点保持レジスタを利用してもよい。すなわち、この起点レジスタをスレッドごとに持っていれば、それを起点として解放を始めればよい。
図18Aから図18Cに以上の処理を実行するタイムチャートおよび主要回路の構成を示す。ここでは、命令レジスタ1が、IBR0=>IBR4=>IBR2という命令バッファ1のチェーンが構成されていた場合を例にして、ポインタをたどる解放処理の例を示す。
図18Aは、分岐リザベーションステーション126にて、キャンセルが発生したときからさらに4サイクルまで(cancel、1T〜4T)の処理が示されている。
図18Bおよび図18Cは、START_IBR_ID_THjを起点にして命令バッファ1のチェーンを順次解放する回路である。命令バッファ1のチェーンの先頭は、例えば、起点レジスタSTART_IBR_ID_THjに保持することができる。本実施形態では、命令バッファ1のチェーンは、チェーンごとに異なるスレッドに対応する。したがって、起点レジスタSTART_IBR_ID_THjは、スレッドごとに用意することになる。
今、分岐リザベーションステーション126で分岐予測失敗等によって、スレッドThjに対する命令バッファ1のキャンセルが指令された場合を考える。この場合、起点レジスタSTART_IBR_ID_THjがデコードされ、例えば、IF_REQ_ID_EQ_iがオンになっている。さらに、IF_REQ_ID_EQ_iは、分岐リザベーションステーション126から発せられるCANCEL_THjとともにANDゲートに入力され、CANCEL_START_IBRiがオンになる。これによって、命令バッファ1のうち、バッファ番号iのバッファがまず解放される(図18Bのデコーダが第1の解放処理部に相当)。今、例ととして、i=0、すなわち、CANCEL_START_IBR0がオンになっている場合と考える。
すると、図18Cの回路(第2の解放処理部に相当)によってORゲート82を通じてCANCEL_IBR0がオンになる。これによって、まず、バッファ番号0の命令バッファ1が解放される。さらに、CANCEL_IBR0のオンによって、スイッチSW83がオンとなる。また、バッファ番号0の命令バッファ1の後続ポインタのうち、シーケンシャル方向のポインタIBR0_SEQ_IBR_IDまたは分岐先方向へのポインタIBR0_TGT_IBR_IDのどちらかによってチェーンが形成されている。そのどちらが有効であるかは、例えば、分岐方向へのポインタのバリッドフラグIBR0_TGT_ID_Vを見ればよい。図18Cの回路では、バリッドフラグIBR0_TGT_ID_Vによって、スイッチSW84がオン・オフされる。すなわち、IBR0_TGT_ID_Vがオフの場合は、シーケンシャル方向のポインタIBR0_SEQ_IBR_IDがレジスタ84に格納される。また、IBR0_TGT_ID_Vがオンの場合は、分岐先方向のポインタIBR0_TGT_IBR_IDがレジスタ84に格納される。そして、レジスタ84のバッファ番号がデコードされてCANCEL_FOLLOW_IBRk(kは、1からnのいずれか)がオンになる。
したがって、CANCEL_FOLLOW_IBRkによって、上記スイッチSW83と同等のスイッチがオンになり、CANCEL_IBRkがオンになる。その結果、命令バッファ1のチェーンが1つたどられ、バッファ番号kの命令バッファ1が解放される。以下同様の信号の伝搬によって、命令バッファ1のチェーンがたどられることになる。
図18Aにその場合の処理の流れ(タイミングチャート)が示されている。すなわち、まず、CANCEL_START_IBR0が参照され、CANCEL_IBR0が生成される。そして、IBR0_VALIDがオフされる。
次のサイクルで、CANCEL_FOLLOW_IBRkによる次のポインタの取り出しによってCANCEL_IBR4が生成され、IBR4_VALIDがオフされる。さらに、次のサイクルで、CANCEL_IBR2が生成され、IBR2_VALIDがオフされる。
<ショートループの処理>
さらにショートループの構成について説明する。日本国特許第3804941号のようなショートループを構成したい場合には、ショートループの起点を保持する起点レジスタをスレッドごとに持つことでそれが実現可能となる。
図19は、起点レジスタを適用させた命令フェッチ制御ユニット5の構成図である。図19では、簡略化のため、スレッド番号j=1および2に対応する起点レジスタのみ示されている。しかし、本実施形態の態様は、このような構成に限定されるものではない。
図20Aは、スレッド0用起点レジスタの構成を示す図である。また、図20Bは、スレッド1用起点レジスタの構成を示す図である。起点レジスタは、起点のバッファ番号を保持するレジスタSTART_IBR_ID、およびバリッドフラグ(START_IBR_ID_VALID)を有する。
図21は、起点レジスタのバリッドフラグSTART_IBR_ID_VALIDを生成する回路である。この回路は、命令フェッチ要求が有効であり(IF_REQ_VALIDがオン)、かつ、再命令フェッチまたは分岐先フェッチがなされたときに、オンになる。一方、命令バッファ1に対するキャンセル信号が発せられると、オフになる。
図22は、起点レジスタのバッファ番号を保持するレジスタSTART_IBR_IDにバッファ番号を設定する回路(起点設定部に相当)である。この回路は、起点レジスタのバリッドフラグが無効であり(START_IBR_ID_VALIDがオフ、つまりまだ有効な起点が設定されていない)、命令フェッチ要求が有効であり(IF_REQ_VALIDがオン)、かつ、再命令フェッチまたは分岐先フェッチがなされたときに、命令バッファ1の識別IDであるIF_REQ_IDを該当するスレッドの起点レジスタのSTART_IBR_IDに設定する。再命令フェッチ先アドレス、分岐先アドレスはともに、ループの起点となる可能性が大きいからである。
命令フェッチ要求部2から送出された命令フェッチ要求が、分岐予測部3のブランチ・ヒストリ・ユニットでなされた分岐予測による分岐先命令フェッチ要求の場合、あるいは、命令実行時に分岐予測が失敗していたことが分かって命令フェッチをやり直すための分岐先の再命令フェッチ要求であった場合を想定する。この場合には、その分岐先命令フェッチ要求あるいは再命令フェッチ要求によって確保された命令バッファ1の番号(つまり、IF_REQ_ID)を起点レジスタ(START_IBR_ID)に登録し、レジスタのバリッドをオンにする。
分岐予測部3は、ブランチ・ヒストリ・ユニットを有する。ここで、ブランチ・ヒストリ・ユニットについて簡単に説明する。ブランチ・ヒストリ・ユニットは、分岐命令の存在とその分岐先アドレスを予測する。例えばその実装としては、次のようなものがある。処理装置により処理を行っている際にある分岐命令を実行した結果、その分岐が成立することが判明した場合、次もその分岐命令は分岐すると考え、ブランチ・ヒストリに、その分岐命令自身のアドレス(以下、分岐命令アドレスという)と分岐先命令のアドレス(以下、分岐先アドレスという)とを対で登録する。このようにして、ブランチ・ヒストリには、分岐の成立した分岐命令についての上記対データを蓄積してゆく。つまり、ブランチ・ヒストリには、分岐すると予測された分岐命令のデータのみが登録されている。
そして、ある分岐命令を主記憶装置から取り出して実行する際には、その実行に先立ってブランチ・ヒストリ・ユニットを索引し、ブランチ・ヒストリ・ユニットにその分岐命令のアドレスが登録されている場合には、その分岐命令アドレスと対になっている分岐先アドレスをブランチ・ヒストリ・ユニットから読み出す。そして、先行する命令の実行の終了を待つことなく、その分岐先アドレスに対応する命令を主記憶装置から取り出して実行させる。なお、その分岐先アドレスに対応する命令の写しが命令キャッシュ102に保持されている場合には、その命令は、命令キャッシュ102から取り出されて実行される。さらに、ブランチ・ヒストリでは、ある分岐命令の過去の複数回分の分岐結果(=分岐履歴)をもって、次に該分岐命令が現れたときに分岐するか否かを予測することで分岐予測の精度を向上させることもできる。分岐すると予測した場合には同様にブランチ・ヒストリに登録を行う。
つまり、分岐命令の実行以前に、ブランチ・ヒストリ・ユニットによって、分岐成立が予想される場合(分岐命令アドレスに対応する分岐先アドレスがブランチ・ヒストリ・ユニットに登録されている場合)、予測された分岐先アドレスを用いて命令フェッチを行い、分岐命令に続いて、読み出された分岐先命令を命令実行ステージに投入する。
また、上述のように、本処理装置は、起点レジスタをスレッドごとに持つ。ある命令フェッチ要求が、IF_REQ_ADDRESS = “A”、IF_REQ_ID=“m”で送出されたとする。命令バッファ1の番号がmのとき、この命令バッファ1をIBRmと表す。以下、図25のタイムチャートにしたがって説明する。
上記命令フェッチ要求は、番号mの命令バッファ1(IBRm)を確保しつつ送出された、ということになる。そこで、IBRmのバリッドフラグであるIBRm_VALIDをオンにする。さらに、IBRmの命令フェッチアドレスは、レジスタIARmに記憶しておく。なお、以下は、すべて、同一のスレッド内のフェッチである。
後続のシーケンシャル方向の命令フェッチは、IF_REQ_ADDRESS = “A+32”、IF_REQ_ID=“n”、・・・と続いていく。
一方、その命令フェッチアドレスAで分岐予測部3のブランチ・ヒストリ・ユニットを検索したところ、分岐する分岐命令が検出されたとする(分岐先アドレスTGT_ADDRESS = “T”、話を簡単にするため、Tは32バイト境界のアドレスとする)。
そこで、命令フェッチ要求部2は、この後、分岐先の命令フェッチ要求を送出する。また、命令フェッチ要求部2は、シーケンシャル方向の命令フェッチ要求をキャンセルする。分岐先命令フェッチ要求時のIF_REQ_IDを“p”とすると、このとき、IBRp_VALIDがオンになる。
“p”は、 IBRmに、次の命令バッファ1の分岐先方向のポインタ(IBRm_TGT_IBR_ID)として登録される。さらに、この“p”を、 IF_REQ_THREAD_ID(=j)の示すスレッドの起点レジスタ(START_IBR_ID_THj)に対して、ループの起点として登録する。また、その命令フェッチアドレス“T”をレジスタIARpに登録する。
その後、アドレスTからシーケンシャル方向への命令フェッチ(IF_REQ_ADDRESS=“T+32”、IF_REQ_ID=“q”)のさらに次の命令フェッチ(IF_REQ_ADDRESS=“T+64”、IF_REQ_ID=“r” )で、分岐命令を検出したとする(TGT_ADDRESS = “TT”)。
ここで、分岐先アドレス“TT”とTTの属するスレッドjの起点レジスタSTART_IBR_ID_THjで指す命令バッファ1の命令フェッチアドレスIAR(START_IBR_ID)、つまりこの場合であればSTART_IBR_ID=“p”より、 IARpを参照する。そして、もし、IARp = “T”=“TT”となれば、IBRrの分岐先は、IBRpと同じということになる。そこで、IBRr_TGT_IBR_IDとして“p”を登録する。これによって、IBRrからIBRpへのループが構成される。図26に、このときに形成される命令バッファのループを示す。以上の処理は、図19の命令フェッチ制御ユニット5の起点レジスタを含む論理回路で実行される。この論理回路が、分岐方向ポインタ設定部に相当する。
図23は、IBR1、IBR3およびIBR4によって、IBR1(p=1の場合)を起点として、ショートループを構成する例である。また、図24は、SEQ_IBR_ID、およびTGT_IBR_IDを含む、複数の命令バッファ1(IBR0−IBR7)のうち、IBR1、IBR3およびIBR4によって、ショートループを示す図である。図24では、IBR4に含まれるTG_IBR_IDの値がIBR1に設定され、IBR1へのショートループが構成されている。
このように、起点レジスタSTART_IBR_ID_THjを持つことで、起点となる命令バッファ1を、スレッドごとに、場所を限定することなく設定することができる。空きがあればどのスレッドでも使うことができ、かつショートループの構成も可能となる。
さらに、起点レジスタは、再命令フェッチ時には再命令フェッチで使用した命令バッファの番号が登録されているので、再命令フェッチ後のCURRENT_STREAM_IDの初期値の設定にも、この値を用いることができる。
したがって、限りある資源を存分に生かしたマルチスレッドの処理が可能となる。
以上に述べたような構成をとることで、常に資源を無駄なく活用できる。したがって、命令バッファ1全体の個数を抑えることができる。その結果、チップ面積の増大を抑え、消費電力を抑えることができるなどの様々なメリットにつながる。
さらに、この構成によれば、例えばマルチスレッド処理からシングルスレッドでのプロセス処理に動的な変更が発生した場合にも、特別の対処をすることなく
すべての資源を使うことができる。
すなわち、固定的に命令バッファ1をスレッドに割り当てることがないので、マルチスレッドからシングルスレッドに切り換えるときに、命令バッファ1を解放しておけば、すべての命令バッファ1をそのシングルスレッドに使用できる。
スレッドごとに命令バッファ1のセットを持っている場合、シングルスレッドでの走行になったときには、
(1)他のスレッド用の命令バッファの使用をあきらめる
(2)別途、特別な手段を用いて命令バッファセットをすべて使えるようにする。
という、などの手段を選択することになる。
このように、本処理装置は、コストを抑えたマルチスレッド処理に様々の大きな効果を発挿する。

Claims (21)

  1. 複数の命令を有するスレッドに含まれる前記命令を実行する実行部と、
    前記実行部に命令を供給する供給部と、
    複数のエントリに命令を格納するバッファと前記エントリに格納されている命令の次に実行すべき命令を指定するポインタ部を有し、前記供給部から供給される命令を保持するバッファ部と、
    前記ポインタ部を制御して、前記命令の次に実行すべき命令を格納する前記バッファ部のバッファに前記次に実行すべき命令が属するスレッドを割り当てるスレッド割り当て部により、第1のバッファに対して、後続の命令が所属する第1のスレッドを割り当て、前記ポイント部によって前記第1のスレッドが割り当てられているバッファ間を接続する第1の系列を形成し、第2のバッファに対して、さらに後続の命令が所属する第2のスレッドを割り当て、前記ポイント部によって前記第2のスレッドが割り当てられているバッファ間を接続する第2の系列を形成する制御部とを有することを特徴とする演算処理装置。
  2. 前記命令を格納する記憶部と、
    前記記憶部の読み出しアドレスからの命令の読み出しと読み出された命令の前記バッファ部への格納を制御する命令フェッチ部と、
    次に読み出すべき命令の読み出しアドレスを前記スレッドごとに保持するアドレス保持部と、
    前記スレッドごとに設けられたアドレス保持部のうち選択されるべきスレッドを決定するフェッチスレッド決定部と、をさらに備える請求項1に記載の演算処理装置。
  3. 前記アドレス保持部は、
    分岐なしに後続命令を読み出す場合に後続命令の読み出しアドレスを保持する非分岐アドレス保持部と、
    分岐命令の実行が予測された分岐先アドレスから後続命令を読み出す場合の読み出しアドレスを保持する分岐先アドレス保持部と、
    分岐予測がはずれた場合に後続命令を読み出す場合の読み出しアドレスを保持する再読み出しアドレス保持部と、を有する請求項2に記載の演算処理装置。
  4. 前記ポインタ部は、分岐なしに後続命令を実行する場合に後続命令を格納するバッファを示す非分岐方向ポインタ部と、分岐命令によって後続命令を実行する場合の分岐先後続命令を格納するバッファを示す分岐方向ポインタ部とを有する請求項1から3のいずれか1項に記載の演算処理装置。
  5. 前記フェッチスレッド決定部は、使用バッファ数の少ないスレッドを優先して選択する請求項2から4のいずれか1項に記載の演算処理装置。
  6. 前記命令フェッチ部によってスレッドに含まれる命令が読み出された後の経過時間順に、複数のスレッド間の順序を管理するフェッチ順序管理部をさらに備え、
    フェッチスレッド決定部は、前記経過時間の長いスレッドを選択されるべきスレッドに決定する請求項2から5のいずれか1項に記載の演算処理装置。
  7. 前記フェッチ順序管理部は、実行中の複数のスレッドのスレッド識別情報を前記経過時間順に保持するスレッドレジスタと、
    フェッチスレッド決定部によって決定されたスレッドのスレッド識別情報と前記それぞれのスレッドレジスタ内のスレッド識別情報との一致を判定する比較部と、
    前記比較部によって前記一致が判定されたスレッド識別情報を前記経過時間順の最後尾のスレッドレジスタに移動するとともに、前記最後尾のスレッドレジスタに移動されたスレッド識別情報を移動前に保持していたスレッドレジスタより後方のスレッドレジスタにそれぞれ保持されていたスレッド識別情報を1つずつ前方に移動するシフト制御部と、を有する請求項6に記載の演算処理装置。
  8. 前記演算処理装置において同時に処理可能なスレッド数が2に限定されており、
    前記フェッチ順序管理部は、
    2つのスレッドの使用バッファ数が同数か否かを判定する同数判定部と、
    前回命令フェッチがされたスレッドの識別情報を保持する2値保持部と、
    前記2つのスレッドの使用バッファ数が同数の場合に、前記2値保持部の情報を反転する反転部と、を有する請求項6に記載の演算処理装置。
  9. 前記フェッチスレッド決定部は、分岐予測が失敗したことにより実行停止中にあって命令フェッチができないスレッドと、スレッドに対応する処理においてキャッシュへのアクセスが停滞中のスレッドとを除外する除外部を有する請求項2から8のいずれか1項に記載の演算処理装置。
  10. 前記複数のバッファの系列のうち、前記供給部によって実行部に命令が供給されるべき系列に該当する供給スレッドを決定する供給スレッド決定部をさらに備える請求項1から9のいずれか1項に記載の演算処理装置。
  11. 前記供給スレッド決定部は、使用バッファ数の多いスレッドを優先して供給スレッドに決定する請求項10に記載の演算処理装置。
  12. 前記供給部によって実行部に命令が供給された後の経過時間順に、複数のスレッド間の順序を管理する供給順序管理部をさらに備え、
    供給スレッド決定部は、前記経過時間の長いスレッドを前記供給スレッドに決定する請求項10または11に記載の演算処理装置。
  13. 前記供給順序管理部は、実行中の複数のスレッドのスレッド識別情報を前記経過時間順に保持するスレッドレジスタと、
    前記供給スレッド決定部によって決定されたスレッドのスレッド識別情報と前記それぞ
    れのスレッドレジスタ内のスレッド識別情報との一致を判定する比較部と、
    前記比較回路によって、前記一致が判定されたスレッド識別情報を前記経過時間順の最後尾のスレッドレジスタに移動するとともに、前記最後尾に移動されたスレッド識別情報が移動前に保持されていたスレッドレジスタより後方のスレッドレジスタに保持されたスレッド識別情報をそれぞれ1つずつ前方に移動するシフト制御部と、を有する請求項12に記載の演算処理装置。
  14. 前記演算処理装置において同時に処理可能なスレッド数が2に限定されており、
    前記供給順序管理部は、
    2つのスレッドの使用バッファ数が同数か否かを判定する同数判定部と、
    命令が供給されたスレッドの識別情報を保持する2値保持部と、
    前記2つのスレッドの使用バッファ数が同数の場合に、前記2値保持部の情報を反転する反転部と、を有する請求項12に記載の演算処理装置。
  15. 命令供給中のスレッドの識別情報を保持するトレースレジスタと、
    命令供給が待ち状態にあるスレッドの識別情報を保持するトレース待ちレジスタと、
    前記トレースレジスタの保持する情報と前記トレース待ちレジスタの保持する情報とを入れ替える入れ替え部と、をさらに有する請求項12から14のいずれか1項に記載の演算処理装置。
  16. 前記トレース待ちレジスタは複数設けられ、
    前記供給スレッド決定部によって決定されたスレッドの識別情報にしたがって、前記トレース待ちレジスタの1つが決定され、
    前記入れ替え部は、前記トレースレジスタが保持する情報と前記決定されたトレース待ちレジスタが保持する情報とを入れ替える請求項15に記載の演算処理装置。
  17. 前記制御部は、命令の保持が不要となったバッファを解放する解放部を有する請求項1から16のいずれか1項に記載の演算処理装置。
  18. 前記バッファまたはバッファの系列に割り当てられているスレッドの識別情報を保持する識別情報保持をさらに備え、
    前記解放部は、いずれかのスレッドに割り当てられたバッファの系列に含まれるバッファで未供給の命令を格納したバッファを解放するキャンセル信号が発せられたときに、前記スレッドを識別する識別情報から解放すべきバッファの選択信号を生成する選択部を有する、請求項17に記載の演算処理装置。
  19. 前記バッファの系列がループを形成しているときに、その系列のいずれかのバッファを保持する起点レジスタをさらに備え、
    前記解放部は、いずれかのスレッドに割り当てられたバッファの系列に含まれるバッファで未供給の命令を格納したバッファを解放するキャンセル信号が発せられたときに、前記そのスレッドに対応する起点レジスタによって示されるバッファを選択して解放する第1の解放処理部と、
    前記解放されたバッファと接続関係を定義されたバッファを前記ポインタ部の指定にしたがって、順次解放する第2の解放処理部と、を有する請求項17または18に記載の演算処理装置。
  20. 前記バッファの系列がループを形成しているときに、その系列のいずれかのバッファを前記スレッドごとに保持する起点レジスタと、
    分岐予測がなされた分岐先アドレス、または分岐予測がはずれて分岐予測の結果読み出された命令が無効とされた後に命令の読み出しを開始すべき読み出し開始先アドレスをス
    レッドごとに前記起点レジスタに設定する起点設定部と、
    分岐予測部で分岐前のアドレスに対して予測された分岐予測先アドレスが前記起点レジスタで保持するアドレスと一致したときに、前記分岐前のアドレスにて読み出された命令を格納するバッファの分岐方向ポインタ部に前記起点レジスタで保持するバッファの識別情報を設定する分岐方向ポインタ設定部とをさらに備える請求項4から19のいずれか1項に記載の演算処理装置。
  21. 演算処理装置が、複数の命令を有するスレッドに含まれる前記命令を実行するステップと、
    前記実行部に命令を供給するステップと、
    複数のエントリに命令を格納するバッファと前記エントリに格納されている命令の次に実行すべき命令を指定するポインタ部を有するバッファ部に、前記実行部に供給される命令を保持するステップと、
    前記ポインタ部を制御して、前記命令の次に実行すべき命令を格納する前記バッファ部のバッファに前記次に実行すべき命令が属するスレッドを割り当てるスレッド割り当て部により、第1のバッファに対して、後続の命令が所属する第1のスレッドを割り当て、前記ポイント部によって前記第1のスレッドが割り当てられているバッファ間を接続する第1の系列を形成し、第2のバッファに対して、さらに後続の命令が所属する第2のスレッドを割り当て、前記ポイント部によって前記第2のスレッドが割り当てられているバッファ間を接続する第2の系列を形成するステップと、を実行することを特徴とする演算処理方法。
JP2009520188A 2007-06-20 2007-06-20 演算処理装置、演算処理方法 Active JP5177141B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2007/062412 WO2008155834A1 (ja) 2007-06-20 2007-06-20 処理装置

Publications (2)

Publication Number Publication Date
JPWO2008155834A1 JPWO2008155834A1 (ja) 2010-08-26
JP5177141B2 true JP5177141B2 (ja) 2013-04-03

Family

ID=40156000

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009520188A Active JP5177141B2 (ja) 2007-06-20 2007-06-20 演算処理装置、演算処理方法

Country Status (4)

Country Link
US (1) US8291195B2 (ja)
EP (2) EP2453350B1 (ja)
JP (1) JP5177141B2 (ja)
WO (1) WO2008155834A1 (ja)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5173711B2 (ja) * 2008-09-30 2013-04-03 ルネサスエレクトロニクス株式会社 マルチスレッドプロセッサ及びそのハードウェアスレッドのスケジュール方法
US9690625B2 (en) * 2009-06-16 2017-06-27 Oracle America, Inc. System and method for out-of-order resource allocation and deallocation in a threaded machine
JP4900449B2 (ja) * 2009-10-30 2012-03-21 住友化学株式会社 メタクリル酸製造用触媒の製造方法及びメタクリル酸の製造方法
BR112012013891B1 (pt) * 2009-12-10 2020-12-08 Royal Bank Of Canada Sistema para efetuar processamento sincronizado de dados através de múltiplos recursos de computação em rede, método, dispositivo e meio legível por computador
JP2012257063A (ja) * 2011-06-09 2012-12-27 Nec Corp アクセス中継ユニット
JP5648645B2 (ja) * 2012-03-02 2015-01-07 日本電気株式会社 ベクトル処理装置、ベクトルロード命令実行方法、及びベクトルロード命令実行プログラム
US9229791B1 (en) * 2012-08-24 2016-01-05 Qlogic, Corporation System and method for high speed multiple buffer allocation
GB2521155B (en) 2013-12-10 2021-06-02 Advanced Risc Mach Ltd Configuring thread scheduling on a multi-threaded data processing apparatus
GB2521151B (en) * 2013-12-10 2021-06-02 Advanced Risc Mach Ltd Configurable thread ordering for a data processing apparatus
US9996354B2 (en) * 2015-01-09 2018-06-12 International Business Machines Corporation Instruction stream tracing of multi-threaded processors
US10430342B2 (en) * 2015-11-18 2019-10-01 Oracle International Corporation Optimizing thread selection at fetch, select, and commit stages of processor core pipeline
US20170337062A1 (en) * 2016-05-19 2017-11-23 Centipede Semi Ltd. Single-thread speculative multi-threading
US11132233B2 (en) * 2018-05-07 2021-09-28 Micron Technology, Inc. Thread priority management in a multi-threaded, self-scheduling processor
GB2580316B (en) * 2018-12-27 2021-02-24 Graphcore Ltd Instruction cache in a multi-threaded processor
CN112540789A (zh) * 2019-09-23 2021-03-23 阿里巴巴集团控股有限公司 一种指令处理装置、处理器及其处理方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2005309762A (ja) * 2004-04-21 2005-11-04 Fujitsu Ltd スレッド切替制御装置。
JP3845043B2 (ja) * 2002-06-28 2006-11-15 富士通株式会社 命令フェッチ制御装置
JP2006343872A (ja) * 2005-06-07 2006-12-21 Keio Gijuku マルチスレッド中央演算装置および同時マルチスレッディング制御方法

Family Cites Families (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5010482A (en) * 1987-07-02 1991-04-23 Unisys Corp. Multi-event mechanism for queuing happened events for a large data processing system
US5900025A (en) * 1995-09-12 1999-05-04 Zsp Corporation Processor having a hierarchical control register file and methods for operating the same
JP3683968B2 (ja) * 1996-02-09 2005-08-17 富士通株式会社 情報処理装置
US6535905B1 (en) * 1999-04-29 2003-03-18 Intel Corporation Method and apparatus for thread switching within a multithreaded processor
US6493741B1 (en) * 1999-10-01 2002-12-10 Compaq Information Technologies Group, L.P. Method and apparatus to quiesce a portion of a simultaneous multithreaded central processing unit
US6988186B2 (en) * 2001-06-28 2006-01-17 International Business Machines Corporation Shared resource queue for simultaneous multithreading processing wherein entries allocated to different threads are capable of being interspersed among each other and a head pointer for one thread is capable of wrapping around its own tail in order to access a free entry
US6898694B2 (en) * 2001-06-28 2005-05-24 Intel Corporation High instruction fetch bandwidth in multithread processor using temporary instruction cache to deliver portion of cache line in subsequent clock cycle
JP3806029B2 (ja) 2001-12-17 2006-08-09 株式会社東芝 電力託送における発電電力制御装置
JP3804941B2 (ja) 2002-06-28 2006-08-02 富士通株式会社 命令フェッチ制御装置
US7310722B2 (en) * 2003-12-18 2007-12-18 Nvidia Corporation Across-thread out of order instruction dispatch in a multithreaded graphics processor
JP2005284749A (ja) * 2004-03-30 2005-10-13 Kyushu Univ 並列処理コンピュータ
US7185178B1 (en) * 2004-06-30 2007-02-27 Sun Microsystems, Inc. Fetch speculation in a multithreaded processor
US8624906B2 (en) * 2004-09-29 2014-01-07 Nvidia Corporation Method and system for non stalling pipeline instruction fetching from memory
US8756605B2 (en) * 2004-12-17 2014-06-17 Oracle America, Inc. Method and apparatus for scheduling multiple threads for execution in a shared microprocessor pipeline
WO2008077283A1 (en) * 2006-12-27 2008-07-03 Intel Corporation Pointer renaming in workqueuing execution model

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3845043B2 (ja) * 2002-06-28 2006-11-15 富士通株式会社 命令フェッチ制御装置
JP2005309762A (ja) * 2004-04-21 2005-11-04 Fujitsu Ltd スレッド切替制御装置。
JP2006343872A (ja) * 2005-06-07 2006-12-21 Keio Gijuku マルチスレッド中央演算装置および同時マルチスレッディング制御方法

Also Published As

Publication number Publication date
EP2453350A2 (en) 2012-05-16
EP2192483B1 (en) 2016-04-20
US8291195B2 (en) 2012-10-16
EP2453350B1 (en) 2016-04-27
JPWO2008155834A1 (ja) 2010-08-26
EP2192483A1 (en) 2010-06-02
EP2192483A4 (en) 2011-05-04
EP2453350A3 (en) 2012-06-13
WO2008155834A1 (ja) 2008-12-24
US20100100708A1 (en) 2010-04-22

Similar Documents

Publication Publication Date Title
JP5177141B2 (ja) 演算処理装置、演算処理方法
US9965274B2 (en) Computer processor employing bypass network using result tags for routing result operands
US9524164B2 (en) Specialized memory disambiguation mechanisms for different memory read access types
US8082420B2 (en) Method and apparatus for executing instructions
KR100745904B1 (ko) 동시적 멀티스레드 프로세서에서 파이프라인 길이를변경하기 위한 방법 및 회로
JP2004326785A (ja) 同時マルチスレッドのための分割分岐履歴テーブルおよびカウント・キャッシュ
JP2008084009A (ja) マルチプロセッサシステム
JP5861354B2 (ja) 演算処理装置及び演算処理装置の制御方法
US20150154022A1 (en) Soft-Partitioning of a Register File Cache
EP2159691B1 (en) Simultaneous multithreaded instruction completion controller
US7725659B2 (en) Alignment of cache fetch return data relative to a thread
JP2004518183A (ja) マルチスレッド・システムにおける命令のフェッチとディスパッチ
JP5128382B2 (ja) 複数のロード命令を実行するための方法および装置
US10430342B2 (en) Optimizing thread selection at fetch, select, and commit stages of processor core pipeline
US10740102B2 (en) Hardware mechanism to mitigate stalling of a processor core
US20220058025A1 (en) Throttling while managing upstream resources
JP7131313B2 (ja) 演算処理装置および演算処理装置の制御方法
US11907126B2 (en) Processor with multiple op cache pipelines
US20220075624A1 (en) Alternate path for branch prediction redirect
CN115525343A (zh) 一种并行译码的方法、处理器、芯片及电子设备
GB2556740A (en) Soft-partitioning of a register file cache

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120828

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20121029

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20121211

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20121224

R150 Certificate of patent or registration of utility model

Ref document number: 5177141

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150