[103] 図11が最良の形態である。
[104] 発明の例示的な実施形態にたいする詳細な言及が、例示的な実施形態に関する付随された図表とともにこれからなされる。説明とクレームに言及することにより、この発明の特徴と利点がより明白にされる。なお、全ての付随する図表は簡略化されて不正確な比率を用いており、この開示された実施形態を便利かつ明晰に説明する目的のためのみに用いられる。
[105] なお、現行の開示の内容を明晰に説明するために複数の実施形態が、この開示の異なる実装を解釈するために、提示される。そして複数の実施形態は消尽法によってではなく列挙される。さらに、簡略化のために、先に言及された実施形態は、多くの場合、後述する実施形態においては省略される。従って、後述された実施形態において言及されなかった内容に関しては、先行する記述が参照される。
[106] この開示はいくつもの修正や変更のかたちで拡張されうるが、しかし明細書は幾つかの特定の実施形態を詳しく説明するために列挙する。発明者の意図は開示をここで扱われる特定の実施形態に限るものではないということが理解されるべきである。反対に、発明者の意図は、この開示のクレームによって定義された精神と範囲にもとづいた全ての改良、等価な変換や修正を保護することである。同じ参照番号がすべての図表に通じて、同じもしくは似た部分を示すために用いられる。
[107] この開示においてCPUはキャッシュ・システムの例として用いられるが、本発明は汎用プロセッサ、CPU、MCU、DSP、GPU、SOC、and ASIC、など全ての適当なプロセッサ・システムに適用されうる。
[108] 本開示において命令アドレスそしてデータアドレスは命令とデータの主メモリアドレスを意味する。簡略のため、本開示においては仮想アドレスは物理アドレスと同じであると仮定する。しかし、本発明によって開示された手法はアドレス変換が必要なケースにおいても適用されうる。本開示においては、現行命令とはプロセッサ・コアによって現在実行されているもしくは読み込まれている命令のことを指す;現行命令ブロックとはプロセッサ・コアによって実行されている命令を含む命令ブロックのことを指す。
[109] 図1に示されるように、プロセッサ・ユニットはフィラー202、アクティブ・リスト204、スキャナー208、トラック・テーブル210、トラッカー214、命令メモリ206、命令リードバッファ107、そしてプロセッサ・コア111を含む。これらのコンポーネントを列挙するのは説明目的である。これらのコンポーネントはハードウェアもしくはソフトウェア、またはそれらの組み合わせでありうる。
[110] プロセッサ・コア(CPUコア)111が命令を実行するとき、最初に高レベルメモリから命令を読み出す。ここで、メモリ階層レベルはプロセッサ・コア111への近さを意味する。プロセッサ・コア111へ近い程、レベルが高い。より高いレベルのメモリは低いレベルのメモリに比べて一般的により速いが容量がより少ない。
[111] 本実施形態において、命令リードバッファ107の容量並びに待ち時間はメモリ206よりも小さくそして短い。命令メモリ206と命令リードバッファ107はどんな適切なメモリ、例えばレジスタ、レジスタ・ファイル、SRAM、DRAM、フラッシュ・メモリ、ハードディスク、ソリッドステート・ディスク、もしくはどんな適切なメモリもしくは将来のメモリでも良い。命令メモリ206はシステムのキャッシュとして、もしくは他のキャッシュ・レベルが存在するときはレベル1キャッシュとして、機能することができる。それはプロセッサ・コア111が取得する、例えば命令ブロックの中の命令を、記憶する、メモリセクション上のメモリブロックへ再分割されうる。
[112] フィラー202は命令もしくは命令ブロックを低位レベルメモリから読み出し、アクティブ・リスト204によって供給されたアドレスにもとづいて命令メモリ206へ充填する。そして、命令ブロックは命令メモリ206から命令リードバッファ107へ充填され、プロセッサ・コア111に読み出される準備が整う。ここで充填するとは、命令を低位レベルメモリから高位レベルメモリへ動かすことである。メモリアクセスとはプロセッサ・コア111が命令をメモリ命令リードバッファ107から読み取ることである。
[113] テーブル204のテーブルエントリと命令メモリ206の両方におけるメモリブロックは互いに一対一に対応している。アクティブ・リスト204の各エントリは、命令ブロックのメモリブロック・アドレスとメモリ206におけるそのブロック番号(BNX)のペアである。本発明においてブロック番号は命令メモリ206における記憶ブロックの位置を示す。スキャナー208によって生成された分岐ターゲット命令アドレスはアクティブ・リスト204に記憶された命令ブロック・メモリ・アドレスと照合され、分岐ターゲットが既に命令メモリ206に記憶されているかを判定することができる。もしテーゲット命令ブロックがまだ命令メモリ206に無いならば、それを206へ充填し、同時に命令ブロック・アドレスとブロック番号(BNX)の対応しあうペアがアクティブ・リスト204において構成される。この開示において照合とは二つの値を比べることである。二つの値が等価であるとき、照合は成功であり、その他の場合は’不一致’である。
[114] スキャナ208は下位レベルメモリから命令メモリ206へ充填される命令をスキャンする。そして命令タイプ、命令ソース・アドレスそして分岐オフセットなどの情報を抽出し、この情報にもとづいて分岐ターゲット・アドレスを計算する。本発明においては、分岐命令もしくは分岐ポイントはプロセッサ・コア116の実行フローを変える(例えば命令をプログラムの順序で実行しない)ことが出来る全ての妥当な命令のことである。分岐ソースとは分岐命令を意味し、分岐ソースアドレスは分岐命令の命令アドレスのことである;分岐ターゲット命令は分岐成功の後に実行される。分岐ターゲットアドレスとは成功した分岐が移る先のアドレスであり、分岐ターゲット命令のアドレスでもある。例えば、命令タイプは条件分岐命令、無条件分岐命令そして他の命令タイプなどを含むことができる。命令タイプは条件分岐命令のサブカテゴリー、例えば等しい場合に分岐、大きい場合に分岐、などを含むことができる。無条件分岐命令は、いつも採用される、条件分岐命令の1つのタイプと見做すことできる。他の情報も含まれることが可能である。スキャナ208は上記情報とアドレスを他のモジュール、例えばアクティブ・リスト204やトラック・テーブル210へ送る。
[115] 命令リードバッファ107は現行命令ブロックを含む少なくとも1つの命令ブロックを含む。命令リードバッファの各行はメモリ206のブロックの命令と同じ数もしくは少ない数の命令を含む。命令リードバッファの各行と命令ブロックは同じ数の命令を含み、命令リードバッファの行は対応する命令ブロック番号で表現することができる。もし命令リードバッファの行がメモリ命令ブロックの命令より少ない命令を含むならば、複数行が1つの命令ブロックに対応し、命令リードバッファの行を特定するためにより下位のアドレスビットがブロック番号へ追加される。例えば、もしBNXが’111’である命令ブロックがあるならば、その対応する命令リードバッファ107の行は’1110’や’1111’として特定される。
[116] 以下の説明の簡略のため、命令リードバッファ107の行は命令メモリ206の命令ブロックと同じ数の命令を含むと仮定する。
[117] 本発明において、命令リードバッファ107は自動的にプロセッサ・コア111へ、プロセッサ・コア111の実行状態にもとづいて実行される命令を供給する。
[118] トラック・テーブル210は複数のトラック・ポイントを持つ。トラック・ポイントはトラック・テーブルのテーブル要素である。それは少なくとも1つの命令の情報、例えば命令タイプ、分岐ターゲット・アドレスなど、を含むことができる。本発明においては、命令メモリの命令はその対応するトラック・テーブル・エントリのトラック・テーブル・アドレスによってアドレス指定される。分岐命令に対応するトラック・テーブル・エントリはその分岐ターゲット命令のトラック・テーブル・アドレスを含む。トラックとは命令メモリ206の1つの命令ブロックに対応する複数のトラック・エントリ(トラック・ポイント)である。トラックとそれに対応する命令ブロックは同じブロック番号によってインデックス付けされる。トラック・テーブルは少なくとも1つのトラックを含む。トラック・ポイントの数はトラック・テーブル210の行のエントリ数と同じである。トラック・テーブル210は他の仕方でも編成されうる。
[119] 第一アドレス(BNX)と第二アドレス(BNY)はトラック・ポイント(すなわち命令)をトラック・テーブル(命令メモリ)内でインデックスするのに用いることができる。第一アドレスはトラック・ポイントの命令ブロック番号を表し、第二アドレスはトラック・ポイント(そして対応する命令)の位置(アドレス・オフセット)を表すことができる。もしトラック・ポイントが分岐タイプを持つならば、トラック・ポイントのアドレス内容はその分岐ターゲットを示す。トラック・ポイントの第一アドレスはターゲット・トラックを特定し、第二アドレスはターゲット・トラック上のターゲット命令を特定する。従って、トラック・テーブルはそのアドレスが分岐ソース命令に対応し、その内容が分岐ターゲット・アドレスに対応する。
[120] スキャナ208は命令メモリ206に記憶されている命令情報を抽出し、抽出された情報をトラック・テーブル210の対応するエントリに記憶する。もし命令が分岐命令であれば、分岐命令の分岐ターゲット命令アドレスが計算され、アクティブ・リスト204へ照合のために送る。照合が一致した場合、分岐ターゲット命令のブロック番号(BNX)を得る。もし分岐ターゲット・アドレスがまだアクティブ・リスト204になければ、分岐ターゲット・アドレスはフィラー202へ送られ、それは下位レベルメモリから命令ブロックを読み出す。同時に、アクティブ・リストの交換ロジックは命令ブロックのためにブロック番号BNXを割り当てる;ターゲット・アドレスのより上位部分がアクティブ・リスト204のエントリへ記憶され、そしてフィラー202によって読み出された命令ブロックがブロック番号によって示されたメモリブロックへ充填される。そしてBNXとターゲット・アドレスの下位部分は、対応するトラック・テーブルのエントリに第一および第二アドレスとして記憶される。
[121] トラック・テーブル210のトラックと命令メモリ206のメモリブロックは一対一に対応し、共に同じポインタを用いる。プロセッサ・コア111によって実行される命令は全て命令メモリ206と命令リードバッファ107へ充填される。トラック間のプログラム順序関係を維持するために、各トラック上に最後の命令に対応するトラック・ポイントの後にエンド・トラック・ポイントがあり、それは次の順番のトラックの命令ブロックの第一アドレスを記憶する。もし命令メモリ206が複数の命令ブロックを記憶するならば、命令ブロックが実行されているとき、次の順番の命令ブロックは命令メモリ206と命令リードバッファ107へ記憶され、プロセッサ・コア111によって実行されるために待機する。次の命令ブロックのアドレスは前の命令ブロックのアドレスとブロックサイズとの合計である。このアドレスはまたアクティブ・リスト204へ照合のために送られ、得られた命令ブロックは命令メモリ206へ充填され、BNXは現行トラックのエンド・トラック・ポイントへ充填される。206へ充填されたこの新しいブロックの中の命令はスキャナ208によってスキャンされ、抽出された情報は前述のように対応するトラックへ充填される。
[122] トラッカー214のリード・ポインタは第一アドレス・ポインタと第二アドレス・ポインタから構成される。第一アドレス・ポインタはトラック・テーブル210の現在実行されているトラックにポイントする。第二アドレス・ポインタは第一分岐トラック・ポイント、もしくはトラックに分岐トラック・ポイントが残っていないならばエンド・ポイントへ、現行命令に対応するトラック・ポイントが実行された後、ポイントする。第一アドレス・ポインタは命令メモリ206をインデックスして、ターゲットもしくは次の命令ブロックを読み出し、命令リードバッファ107へ充填し、もし分岐が成功裏に取られた場合にプロセッサ・コア111によって実行されるように備える。
[123] もしトラッカー214が分岐命令へポイントししかし分岐が取られなかった場合、トラッカー214のリード・ポインタは次の分岐トラック・ポイントへ、もしくはトラック上に残っている分岐トラック・ポイントがない場合はエンド・トラック・ポイントへ、ポイントする。命令リードバッファ107は、分岐命令が取られなかった後に続くフォールスルー命令をプロセッサ・コア111へ実行のために提供する。
[124] もしトラッカー114によってポイントされる分岐命令が分岐を取るならば、分岐ターゲットの第一アドレスと第二アドレスはトラッカーの新しいアドレス・ポインタになり、トラック・テーブルの分岐ターゲットに対応するトラック・ポイントをポイントする。新しいトラッカー・アドレス・ポインタはまた最近充填された分岐命令ブロックへポイントし、それを新しい現行命令ブロックとする。命令リードバッファ107は分岐ターゲット命令と現行分岐命令に後続する命令をプロセッサ・コア111へ実行のために供給する。それからトラッカー214のリード・ポインタは、新しい命令ブロックに対応する、トラック内の現行命令の後の最初の分岐命令トラック・ポイントへ、あるいはトラックに分岐トラック・ポイントが残っていない場合はエンド・トラックへ、ポイントする。
[125] もしトラッカー214がトラックのエンド・ポイントへポイントしているなら、トラッカー214のリード・ポインタは最後のトラック・ポイントの位置コンテンツ値に更新される。すなわち、ポインタは次トラックの最初のトラック・ポイントへポイントし、従って新しい現行命令ブロックをポイントする。それからトラッカー214のリード・ポインタは、トラック・テーブル210内の現行命令を含むトラックの中の現行命令の後の最初の分岐命令トラック・ポイントへポイントする。もしくは、トラック内に分岐トラック・ポイントが残っていない場合はエンド・トラック・ポイントへポイントする。前述のシーケンスを繰り返す。命令はプロセッサ・コア111で実行される前に命令メモリ206と命令リードバッファ107へ充填されうる。コア111は最小待機時間で命令を読み込み、よってプロセッサの性能を向上させる。
[126] 本開示において、スキャナ208からのアドレスがアクティブ・リスト204の中で照合一致しない場合、アドレスはフィラー202へ送られ下位レベルメモリから対応する命令ブロックを読み出す。同時に、アクティブ・リスト204は命令ブロックのブロック・アドレスを記憶するエントリを割り当て、よってブロック・アドレス/ブロック番号のペアを形成する。本開示におけるブロック・アドレスとは命令ブロックの始めの命令のアドレスのことである。本開示において命令メモリは複数のメモリ・ブロックへ論理的に分割されている。各メモリブロックは命令ブロックを記憶し、ブロック・アドレスを記憶するアクティブ・リストと対応している。アクティブ・リストのエントリとその対応するメモリ206の命令メモリブロックは同じブロック番号によってアドレス指定される。
[127] スキャナ208は命令メモリ206からの各命令を調べ、命令タイプを抽出し、分岐ターゲット・アドレスを計算する。同分岐ターゲット・アドレスは分岐アドレスと分岐オフセットの合計として計算されうる。分岐ターゲット・アドレスの上位部分は対応するブロック番号を得るためにアクティブ・リスト204の内容と照合され、第一アドレスになる。分岐ターゲット・アドレスの下位部分、ブロック内のオフセット・アドレスである、は第二アドレスになる。
[128] エンド・トラック・ポイントにおいて、命令ブロック・アドレスと命令ブロック長の合計は次の命令ブロックのブロックアドレスである。そして、ブロック・アドレスは、それが分岐ターゲット・アドレスであるかのように照合され、エンド・ポイントに記憶されているブロック番号を得る。
[129] もしターゲット・アドレスの上位部分がアクティブ・リスト204において照合一致されるなら、アクティブ・リスト204は対応するブロック番号をトラック・テーブル210へ出力する。もし一致しないならば、アクティブ・リスト204はこのアドレスをフィラー202へバス244を経て送り、対応する命令ブロックを命令メモリへ充填し、同時にブロック番号をこのアドレスに割り当て、そしてこのブロック番号をトラック・テーブル210へ出力する。
[130] 新しいトラックはトラック・テーブル210の交換可能な行へ置かれる。もし分岐命令がこの新しいトラックに対応する命令ブロックにあるならば、分岐トラック・ポイントが対応するトラック・エントリに構成される。同分岐トラック・ポイントは分岐ソース命令のアドレスによって見つけだされる。例えば、分岐ソース・アドレスの上位部分はトラック番号(ブロック番号)へマップされ、トラックをインデックスする;ソース・アドレスの下位部分(オフセット)はトラック上のエントリをインデックスする。
[131] トラック・テーブルの行のエンド・トラック・ポイントもしくはトラック・テーブル・エントリは、タイプ・フィールド、第一アドレス(XADDR)フィールドそして第二アドレス(YADDR)フィールドを含むフォーマットを持つ。他のフィールドも含むことも可能である。タイプ・フィールドは対応する命令の命令タイプを表す。タイプ・フィールドはトラック・ポイントに対応する命令のタイプ、例えば条件分岐、無条件分岐そして他の命令、を表すことができる。XADDRフィールドはまた第一次元アドレス、もしくは第一アドレスとして知られる。YADDRフィールドはまた第二次元アドレス、もしくは第二アドレスとして知られる。
[132] 新トラック・ポイントの内容は分岐ターゲット・アドレスに対応できる。つまり、分岐トラック・ポイントは分岐ターゲット命令のアドレス情報を記憶する。例えば、トラック・テーブル210のターゲット・トラックのブロック番号は同分岐トラック・ポイントの第一アドレスとして記憶される。分岐ターゲット命令のオフセット・アドレスは同分岐トラック・ポイントに記憶される第二アドレスである。
[133] トラックのエンド・トラック・ポイントは特殊なトラック・ポイントである。エンド・トラック・ポイントは次のブロックの最初の命令にポイントするから、エンド・トラックのフォーマットは無条件分岐のタイプとプログラム順序における次のブロックの第一アドレス、しかし第二アドレスを含まない、である。あるいは、定数’0’が第二アドレス・フィールドに置かれる。
[134] 図2Aは開示された実施形態と整合する例示的なトラック・ポイントのフォーマットを示す。図2Bに示されるように、非エンド・トラック・ポイントは内容フォーマットとして、命令タイプ322、第一アドレス334、第二アドレス336を含む。トラックの少なくとも二つのトラック・ポイントの命令タイプが同時に読み出されうる。従って、トラックの全ての非エンド・トラック・ポイントの命令タイプは一緒に記憶され、そしてこれらの非エンド・トラック・ポイントの第一アドレスと第二アドレスも一緒に記憶されうる。
エンド・トラック・ポイントは内容フォーマットとしては命令タイプ332、第一アドレス334、そして’0’値を持つ内容338を含む。同様にエンド・トラック・ポイントと非エンド・トラック・ポイントの命令タイプ322も一緒に記憶され、そして第一アドレス334と内容338も、トラックの全ての非エンド・トラック・ポイントの第一アドレスと第二アドレスに続いて記憶されうる。さらに、エンド・トラック・ポイントの第二アドレスは’0’値を持つ内容338であり、従って定数は記憶されない。第二アドレス’0’はトラッカー214がエンド・トラック・ポイントをポイントした時に直接生成される。
[135] 図2Bに示されるように、既存のトラック340(BNX0で表される)は3つの分岐命令もしくは分岐ポイント342、344、そして346を含む。分岐ポイント342を調べているとき(ターゲット・ブロック番号BNX1がアクティブ・リストにて照合されるか割り当てられる)、新しいトラック348(次の利用可能な行はBNX1と表される)は分岐ポイント342のターゲット命令を含むように生成され、トラック・テーブル210のブロック番号(つまりBNX1)は分岐ポイント324の中に第一アドレスとして記録される。同様に、分岐ポイント344を調べているとき(ターゲット・ブロック番号BNX2がアクティブ・リストにて照合されるか割り当てられる)、他の新しいトラック350(BNX2として表される)がトラック・テーブル210にて生成され、そしてブロック番号が分岐ポイント344に記録される;分岐ポイント546を調べているとき(ターゲット・ブロック番号BNX3がアクティブ・リストにて照合されるか割り当てられる)、他の新しいトラック352(BNX3として表される)がトラック・テーブル210に生成され、そしてブロック番号が分岐ポイント346に記録される。従って、単一トラック内の全ての分岐ポイントに対応する新しいトラックが生成される。
[136] 本記述において、各分岐命令のトラック・ポイントに記憶される第二アドレスは分岐命令の分岐ターゲット命令を含む命令ブロックのオフセットである。
[137] 前述の様々な実施形態は、分岐ターゲット・アドレスを計算し命令先取り操作を実現するために、直接アドレス指定方式を用いる。しかし、間接アドレス指定方式も用いられうる。間接アドレス指定方式においては、始めにレジスタ値(例えば基底レジスタ値)が決定され、それによって分岐ターゲットアドレスを計算する。レジスタ値は命令実行の結果に応じて変えられる。従って、新しい値が間接分岐の基底レジスタのために計算され、しかしまだ基底レジスタに書き込まれていないとき、新しい値はバイパスされターゲット・アドレス計算と後続オペレーションを実行する。
[138] 図3は開示された実施形態と整合するトラッカーのリード・ポインタの例示的な動きである。図3に示されるように、トラッカーのリード・ポインタはトラック・テーブルの非分岐命令をスキップし、トラック・テーブルの次の分岐ポイントへ動いてプロセッサ・コア111による分岐決定を待つ。関係のない部分またはコンポーネントは図3のこの実施形態から省略されている。この実施形態においては、メモリ210に記憶されている命令タイプと他の抽出された命令情報は左から右へ昇順アドレスに沿って、つまりプログラムの順番に沿って、配列される。さらに、メモリ210の命令タイプ’0’は対応する命令が非分岐命令であることを示し、メモリ210の命令タイプ’1’は対応する命令が分岐命令であることを示す。
[139] メモリ210の第一アドレス394(ブロック番号、BNX)によってポイントされたトラックの中の、第二アドレス396(ブロック・オフセット、BNY)によってポイントされた命令を表す、エントリはいつでも読み出されうる。複数のエントリが、メモリ210の第一アドレス394によってインデックスされたトラックの命令タイプを表す全てのエントリも、同時に読み出されうる。
[140] メモリ210の各行の最も大きなオフセット・アドレスを持つ命令に対応するエントリの右側に、順番に実行される次の命令のアドレスを記憶するためにエンド・エントリが追加される。エンド・エントリの命令タイプは常に’1’に設定される。エンド・エントリの命令情報の第一アドレスは次の命令の命令ブロック番号である。第二アドレス(BNY)は常にゼロに設定され、命令トラックの最初のエントリへポイントする。エンド・エントリは同等の無条件分岐命令として定義される。トラッカーがエンド・エントリをポイントするとき、セレクタ388がトラック・テーブル210の出力380を選択するように、内部制御信号が常に生成される;レジスタ390の値を更新するために他の制御信号もまた生成される。内部信号はトラック・テーブル550のエンド・エントリの特殊ビットによって、もしくは第二アドレス396がエンド・エントリをポイントするとき、トリガーされる。
[141] 図3において、トラッカー114は主にシフタ382、主要ゼロカウンタ384、加算器386、セレクタ388そしてレジスタ390を含む。トラック・テーブル210から読み出された複数の命令を表す複数の命令タイプはシフタ382によって左にシフトされる。シフト量はレジスタ390によって出力された第二アドレス・ポインタ396によって決定される。シフタ382によって出力されたシフトされた命令タイプ399の最左ビットはステップビットである。ステップビットの信号とプロセッサ・コアからのBRANCH信号は一緒にレジスタ390の更新を決定する。セレクタ388はTAKEN信号によって制御される。セレクタの出力391は第一アドレス部分と第二アドレス部分を含む次アドレスである。TAKENが’1’(分岐がある)であるとき、セレクタ388はトラック・テーブル210の出力380(分岐ターゲットの第一アドレスと第二アドレスを含む)を選び出力391とする。TAKENが’0’(分岐がない)であるとき、セレクタ388は現行第一アドレス394を出力391の第一アドレス部分として、そして加算器の出力397を出力391の第二アドレス部分として選ぶ。命令タイプ399は主要ゼロカウンタ384へ送られ、次の’1’命令タイプ(対応する命令が分岐命令であることを表す)の前の’0’命令タイプ(対応する命令が非分岐命令であることを表す)の数を計算する。計算においてステップビットは、ステップビットが実際には’0’か’1’であるかに関わらず、それは’0’であるとして取り扱われる。主要’0’の数395(ステップ数)は加算器386へ送られ、レジスタ390によって出力された第二アドレス396と加算され、次の分岐ソース・アドレス397を得る。ここで次の分岐ソース・アドレスは現行命令の次の分岐命令の第二アドレスであり、そして次の分岐ソース・アドレスの前の非分岐命令はトラッカー214によってスキップされる点が注意されるべきである。
[142] 第二アドレスは命令を表すエントリにポイントし、第二アドレスによって制御されたシフターがトラック・テーブル210によって出力された複数の命令タイプを左にシフトする。この時点で、トラック・テーブル210によって読み出された命令を表す命令タイプは命令タイプ399の最左ステップビットへシフトされる。シフト命令タイプ399は主要ゼロカウンタへ送られ、次の分岐命令の前の命令の数をカウントする。主要ゼロカウンタ384の出力395はトラッカーの先送りステップである。このステップは第二アドレス396へ加算器386によって加算される。加算操作の結果は次の分岐命令アドレス397である。
[143] シフトされた命令タイプ399のステップビット信号が’0’であるとき、それは第二アドレス396によってポイントされたトラック・テーブル210のエントリが非分岐命令であることを示し、ステップビット信号はレジスタ390の更新を制御する;セレクタ388は次の分岐ソース・アドレス397を第二アドレス396としてTAKEN信号392’0’の制御の下に選び、そして第一アドレス394は変わらないままである。新しい第一と第二アドレスは同じトラックの次の分岐命令へポイントし、分岐命令の前の非分岐命令はスキップされる。新しい第二アドレスはシフタ396を制御して命令タイプ398をシフトし、分岐命令を表す命令タイプは次の操作のためにステップビット399へ置かれる。
[144] シフトされた命令タイプ399のステップビット信号が’1’であるとき、それは第二アドレスによってポイントされたトラック・テーブルのエントリが分岐命令であることを示す。ステップビット信号はレジスタ390の更新に影響を与えず、プロセッサ・コアからのBRANCH信号393がレジスタ390の更新を制御する。加算器の出力397は同じトラックの現行分岐命令の次の分岐命令のアドレスであり、メモリの出力380は現行分岐命令のターゲット・アドレスである。
[145] BRANCH信号が’1’であるとき、セレクタ388の出力391はレジスタ390を更新する。もしプロセッサ・コアからのTAKEN信号392が’0’であるなら、それはプロセッサ・コアがこの分岐ポイントにおいてオペレーションを順番に実行することを決定したことを示す。セレクタ388は次の分岐のソース・アドレス397を選ぶ。レジスタ390によって出力された第一アドレス394は変わらないままで、次の分岐ソース・アドレス397が新しい第二アドレス396になる。新しい第一アドレスと新しい第二アドレスは同じトラックの次の分岐命令にポイントする。新しい第二アドレスはシフタ396を制御し命令タイプ398をシフトし、そして分岐命令ビットを表す命令タイプが次の操作のためにステップビット399に置かれる。
[146] プロセッサ・コアからのTAKEN信号392が’1’ならば、それはプロセッサ・コアがこの分岐ポイントにて分岐ターゲットへジャンプすることを決定したことを示す。セレクタはトラック・テーブル210から読み出された分岐ターゲット・アドレス380を選びレジスタ390から出力された第一アドレス394と第二アドレス395になる。この場合、BRANCH信号393はレジスタ390を制御して第一アドレスと第二アドレスをそれぞれ新第一アドレスと新第二アドレスとしてラッチする。新第一アドレスと新第二アドレスは同じトラックにない分岐ターゲット・アドレスにポイントしうる。新第二アドレスはシフタ396を制御して命令タイプ398をシフトさせ、分岐命令ビットを表す命令タイプはステップビット399に次の操作のために置かれる。
[147] 第二アドレスがトラック・テーブルのエンド・エントリ(次のライン・エントリ)にポイントするとき、前述のように、内部制御信号がセレクタ388を制御しトラック・テーブル210の出力530を選び、そしてレジスタ390を更新する。この場合、新しい第一アドレス394はトラック・テーブル220のエンド・エントリに記録された次のトラックの第一アドレスであり、そして第二アドレスはゼロである。第二アドレスはシフタ396を制御して命令タイプ398をゼロビットシフトし次の操作を開始する。操作は繰り返され、従ってトラッカー214はトラック・テーブル210と恊働してトラック・テーブルの非分岐命令をスキップしそして常に分岐命令にポイントする。
[148] 本記述においては、アクティブ・リスト104は一杯である時には交換される必要があるが、しかし新しいブロック・アドレス/ブロック番号のペアが生成される。各ブロックのステータスを分岐のターゲットとして記録する相関テーブルが、トラック・テーブル・エントリが既に交換されたブロックへ分岐するのを阻むために用いられる。ただ分岐のターゲットでない命令メモリのブロックとそれに対応するアクティブ・リスト・エントリだけが、交換の候補となる。
[149] 図4は命令リード・バッファ107の例示的な実施形態であり、本開示と整合する型でコア11に実行のために命令を供給する。説明の簡明のために、トラック・テーブル210、トラッカー214、命令メモリ206、命令リード・バッファ107そしてその制御ユニット401、そしてプロセッサ・コア111のみが示されている。
[150] 図4において、トラッカー214のリード・ポインタ231はトラック・テーブル210のトラックに沿って動き、現在実行されている命令の後の最初の分岐エントリにおいて止まる。分岐エントリBN233の内容は、BNXとBNYを含み、制御ユニット401へ送られる。加えて、エンド・ポイント235の内容(順番上次の命令の最初の命令のアドレス)もまた401へ送られる。
[151] 制御ユニット401は命令リード・バッファ107の各行の命令の対応するブロック番号を記憶する。本実施形態においては、命令リード・バッファ107の各行はメモリ206の1つの命令ブロックを記憶する。制御ユニット401は受け取った分岐ソースBNの第一アドレス(BNX)、分岐ターゲットBN、そしてエンド・ポイントをその内容とともに照合する。もし照合が一致するなら、必要な命令ブロックは既に命令リード・バッファにある。あるいは、一致しないBNXはメモリ206へ送られ、必要な命令ブロックを読み出し、命令リード・バッファ107の交換可能な行に充填する。交換可能な行はアクティブ・リスト204の交換と同様の仕方で決定される。
[152] さらに、ソースもしくはターゲットBNの第二アドレス(BNY)は、命令リード・バッファ107の一致した行からの対応する分岐命令もしくは分岐ターゲット命令をインデックスするのに用いられる。図5は開示された実施形態に整合する同制御の例示的なマッチングプロセスである。本実施形態においては、命令メモリ206は既に全ての必要な命令ブロックを含んでいるもと想定する。
[153] 図5に示されるように、命令リード・バッファ107の命令ブロック501は上から下へオフセット・アドレスの昇順に沿って8つの命令を保つ。制御ユニット401のサブ・ブロック503は第一アドレス・レジスタ505、次命令ブロック・アドレス・コンパレータ507、分岐ターゲット・アドレス・コンパレータ511、そしてターゲット・アドレス・デコーダ515を含む。505は命令ブロック501のブロック番号を記憶する。もし照合一致すれば、一致した507の出力は、命令ブロックは実行された命令ブロックの次の順番の命令ブロックであるから、501の最初(一番上)の命令にポイントする。もし照合が’一致しないならば、ブロック501は次の順番のブロックではない。
[154] コンパレータ511はバス233のBNXと505の内容とを比べる。もし一致すれば、一致した511の出力は、バス233のBNYアドレスをデコードするアドレス・デコーダ515を有効にする。デコーダ515の出力525は501の命令の1つ、分岐ターゲットをポイントする。もし一致しないならば、511の出力は515を無効にし、そして501はテーゲット命令ブロックではない。
[155] 図4に戻って、トラッカー214のリード・ポインタ231が新しいトラックをポイントするとき、エンド・ポイント235が読み出されて制御ユニット401へ送られ、コンパレータ507によって505のそれぞれの第一アドレスと比べられる。もし一致しないならば、制御ユニット401はBNXを命令メモリ206へ送り、命令ブロックを読み取ってそれを命令リード・バッファ107へ充填する。もし一致するならば、次の順番のブロックが命令リード・バッファ107において特定される。
[156] トラッカー214のリード・ポインタ231は動きそして前述のように実行されている命令に対応するトラック・ポイントの後の最初の分岐ポイントにて止まる。本記述においては、分岐ソースと分岐ターゲット・アドレスは制御ユニット401へ送られ図5に描かれたように比較される。分岐ソースを含む命令ブロックは既に命令リード・バッファ107にあるから分岐ソース位置は特定されうる。分岐ターゲット位置もまた照合によって特定されうる。制御ユニット401は分岐ターゲットBNXをメモリ206へ送り、もし照合一致しなければ対応する命令ブロックを読み取りそれを命令リード・バッファ107へ充填する。従ってターゲット位置は命令リード・バッファ107の中において知られている。
[157] よって分岐ソース、分岐ターゲットそして次の順番のブロックの最初の命令の位置は制御ユニット401における照合によって見つけられる。
[158] 本記述において、受け取られたクロック401はシステム・クロックとプロセッサ・コア111のパイプラインのステータスに依存する。コア111が命令を必要とするとき、制御ユニット401は有効なクロックを受け取る。コア111が新しい命令を必要としないとき、例えばパイプライン・ストールの間、制御ユニット401はクロック信号を受け取らない。
トークン・パッサーが制御ユニット401に含まれていて、各パッサーは1つの命令に対応する。パッサーはCPUが必要とする命令を表す有効なトークン信号をパスする。制御ユニット401は有効なクロック・サイクル毎にトークン・パッサーを更新し、コア111が次に必要とする命令に対応するトークンをトークン・パッサーにパスする。よって、制御ユニットは命令リード・バッファ107を制御してトークン信号に応じて正しい命令をコア111へ出力する。
[159] 本実施形態は制御ユニット401がコア111へ必要に応じて命令を供給するイニシアティブを取る、ほんの一例である。制御ユニット401がプロセッサ・コア111へ必要な命令を送るイニシアティブを取ることを保証する、他のハンドシェーク信号やコミュニケーション・プロトコルもまた本開示の保護の下にある。
[160] 図6は命令リード・バッファ107における各命令に対応するトークン・パッサーを例示する。図6におけるトークン・パッサーはトークン・シグナル・レジスタ601とORロジック607を含み、そして1つの同トークン・パッサーの出力621は他のトークン・パッサーのインプット623へ命令アドレス順に繋がり、分岐無しに順番に命令を実行しているときにトークンをパスする。トークン信号レジスタ601はリセット可能である。
[161] もし取られた分岐がない場合、全てのトークン・レジスタ601のリセットを制御するTAKEN信号はアクティブでない(’0’)。各トークン・パッサーはインプット203における前段階からのトークン信号を受け、アクティブ・トークンを制御ユニット401のクロックの制御のもと、伝搬させる。分岐が取られたとき、TAKEN信号は全てのトークン・レジスタ601のリセットを制御して、アクティブ状態’1’にし、よって現行のアクティブ・トークン信号の通過をブロックする。分岐ターゲット・デコーダは新しいトークンを生成し、625を経てORロジック607に差し込む。新しいトークンはその後、対応するトークン・レジスタ601へラッチされ、よってトークン信号挿入を完了する。
[162] 図7は開示された実施形態と整合する他の例示的なトークン信号パッシングを示す。簡便のため、図7はトラックテーブル1010、命令メモリ206、トラッカー214、コントロール・ユニット1001そして幾つかのトークン・パッサーを含む命令リード・バッファ107、のみを含む。ここにおいて、トークン・パッサー(1011、1013、1015、1017)はそれぞれ命令(701、703、705、707)に対応する。命令メモリ206とトラッカー214は図4と同じである。トークン・パッサーのトークン信号レジスタはリセットポートを持ち、全てのトークン信号レジスタは同時に’0’にリセットされる。制御ユニット1001はターゲット・デコーダ(例えば1021と1023)、対応する命令ブロックのBNXを記憶するレジスタ(例えば1025と1027)、分岐ターゲット・ブロックのBNXと照合するのに用いられるターゲットBNXコンパレータ(例えば1029と1031)、そして次の命令ブロックのBNXを照合するのに用いられる次BNXコンパレータ(例えば1033と1035)を含む。ここにおいて、ターゲットBNXコンパレータの機能は図5のコンパレータ511と同じであり、次BNXコンパレータの機能は図5のコンパレータ507と同じである。
[163] トラック214の分岐ソース・ポインタ231はトラック・テーブル1010をポイントし、それから分岐ターゲット・アドレス233を読み出す。ここにおいて、ターゲットBNX1043は制御ユニット1001の分岐ターゲット・コンパレータ(例えば1029と1031)へ送られ、各命令のBNXアドレスと比較される。対応する分岐ターゲット・デコーダ(1021もしくは1023)は、もし1043がレジスタに記憶されているBNXの1つと照合一致するならば使用可能になる。使用可能デコーダは分岐ターゲット・アドレスのBNYを受け取り、トークン信号を分岐ターゲット命令に対応するトークン・パッサーに差し込む。制御ユニット1001において、分岐が取られたなら、それは全てのトークン・パッサーを’0’にリセットし、分岐ソース命令ブロックに対応するトークン信号を消し、それからターゲット・デコーダは分岐ターゲット命令に対応するトークン・パッサーへトークンを差し込む。本実施形態において、各命令ブロックの第一トークン・パッサーのトークン信号レジスタのインプットはANDゲートから来る。ANDゲートの1つのインプットはグローバル・バス1024とカップルしており、他のインプットは次命令ブロックBNXコンパレータの出力とカップルしている。
[164] トラック214はまたトラック・テーブル1010から分岐ソース・ポインタ231を通して次命令ブロック・アドレス235を読み出し、それからアドレスを、制御ユニット1001のそれぞれの次命令ブロック・コンパレータ(例えばコンパレータ1033と10350)へ送り、それを各命令ブロックBNX(例えばレジスタ1025と1027に記憶されているBNX)と比較する。一致した結果は、対応する命令ブロックの第一トークン・パッサーのANDゲート(例えば1019)へ送られる。本実施形態において、各命令ブロックの最後のトークン・パッサーのトークン状態は、ORゲート1007の1つのインプットとカップルして、グローバル・バス1024を生成する。よって、ORゲート1007の出力1024は、トークンが任意の命令ブロックの最後のトークン・パッサーへ辿り着いたとき、’1’である。トークン・バス1024は、各命令ブロックの最初のトークン・パッサーのANDゲート(例えば1019)の1つのインプットとカップルする。これらのANDゲートの他のインプットは、対応する次命令ブロック・コンパレータの出力とカップルする。このとき、照合一致したコンパレータ(例えばコンパレータ1035)の出力は’1’であり、バス1024の状態は’1’であり、よって照合一致した命令ブロックに対応するANDゲートの出力は’1’であり、そしてトークンは対応する命令ブロックの最初のトークン・パッサーへ送られる。
[165] さらに、ORゲート1007の出力は、各命令ブロックに対応するANDゲート(例えばANDゲート1019)に送られる。同ANDゲートの他のインプットは次コンパレータ(例えばコンパレータ1033と1035)の出力とカップルし、次命令ブロックを決定するのに用いられる。その出力は命令リード・バッファ107の命令ブロックの最初のトークン・パッサー(例えばトークン・パッサー1015)へ送られる。トラック・テーブル1010の現行トラックのエンド・トラック・ポイントから読み出された次ブロックBNXは、制御ユニット1001の次BNXコンパレータへバス235を経て送られ、このBNXは対応する命令のBNXと比較される。ここで命令(705と707)の命令ブロックは1つの次命令ブロックで、次BNXコンパレータ1035の結果だけが’1’で、他の次BNXコンパレータの結果は’0’である。よってANDゲート1019は’1’を出力し、そしてこの値はトークン信号レジスタ1009に書き込まれる。他のトークン・パッサーのトークン信号レジスタの値は’0’であり、よってトークン信号は、トラック・テーブルのエンド・ポイントによってポイントされている次命令ブロックの最初の命令に対応するトークン・パッサーへ移る。それは正しい命令を実行のためにCPUへ出力し、そしてトークンは現行命令ブロックから次命令ブロックへパスされる。
[166] もう一方で、分岐命令が取られたとき、それは現行命令に対応するトークン・パッサーから分岐ターゲット命令に対応するトークン・パッサーへトークンをパスする必要がある。図7のトークン・パッサー1017は分岐ターゲット命令へ対応し、そして命令701は分岐ターゲット命令であると仮定しよう。この実施形態においては、分岐TAKEN信号1037がCPUコア111によって生成されたとき、この信号は全てのトークン信号レジスタのリセット・ポートへ送られトークン信号を消去する。ターゲットBNXはトラック・テーブル1010から読み出され、そして比較されるために全てのターゲットBNXコンパレータへ送られる。この例では、ターゲットBNXコンパレータ1029の結果のみが’1’であり、それはターゲット・デコーダ1021を制御しターゲット・トラック・ポイントのBNYをデコードする。デコードの結果に応じて、ターゲット・デコーダ1021のワード・ライン1039は’1’で、それはトークン信号をORゲート1042に差し込み、そしてストレージ701を制御して分岐ターゲット命令701をCPUコア111にバス1003を経て出力する。次のクロック・サイクルにおいて、トークン信号はトークン・パッサー1013へパスされ、命令703を出力する。
[167] 本記述において、プロセッサ・パイプラインは前端パイプラインと後端パイプラインにTAKEN信号の位置によって分割されうる。重複した前端パイプラインがCPUコアに追加され、命令リード・バッファはフォールスルー命令と分岐ターゲット命令をCPUコアに分岐命令の後に提供する。TAKEN信号1037が生成されたとき、CPUコアの二つの前端パイプラインは分岐命令の後に命令を実行する;それは前端パイプラインの2つの実行結果の1つを、さらに後端パイプラインによって実行されるべく、選ぶ。それは分岐が取られるか取られないかに関わらず、パイプラインが分岐ペナルティを被らないことを保証する。
[168] 図7に戻って、各命令とカップルする他のバス1094が存在し、それによって2クロック・サイクル先に読み出し前処理ユニット1069によって前処理される。よってトークン・パッサーは、正常実行のために現行命令を、そしてロード/記憶命令のために次命令後の命令を、同時に提供することができる。ここにおいて、トークン信号に対応する命令はCPUコア111へ実行のため送られ、次命令後の命令は前処理ユニット1069へ送られ前もってロード/記憶操作を実行する。
[169] この実施形態において、トークン信号は、出力された二つの命令が同じ命令ブロックにないとき、グローバル・バスへパスされる。つまり、現行命令は現行命令ブロックに位置するが、次命令後の命令は次命令ブロックに位置する。特に、命令ブロックの最後の二つのトークン・パッサーは、それぞれそのトークン信号レジスタの値を出力し、値をORゲート(1057と1007)へバス(1053と1055)を通して送る。トークン信号が、現行命令ブロックの最後のトークン・パッサーの前のトークン・パッサーにあるとき、命令リード・バッファは対応する命令を出力し、トークン信号はまたORゲート1057へバス1053を通して送られ、ORゲート1057の出力はグローバル・バス1061を通してANDゲート1065へ送られる。ここにおいて、ANDゲート1065にカップルしているトークン・パッサーは次命令ブロックであると仮定されている。ANDゲート1065の出力は’1’である、なぜならANDゲート1065の他のインプットは次BNXコンパレータの出力、それは’1’である、とカップルしているから。従って、同次命令ブロックの最初の命令は現行命令ブロックの最後の命令の前の命令と同時に出力されうる。もう一方で、トークン信号が現行命令ブロックの最後のトークン・パッサーにあるとき、命令リード・バッファーは対応する命令を出力し、トークン信号はまたORゲート1007へバス1055を経て送られ、ORゲート1007の結果はANDゲート1019へグローバル・バス1024を経て送られる。ANDゲート1019の出力は、ANDゲート1019の他のインプット・ポートは次BNXコンパレータの出力とカップルしていてそれは’1’であるから、’1’であり、よって同時命令ブロックの第二命令は現行命令ブロックの最後の命令と同時に出力される。
[170] 本記述においては、プロセッサ・システムは複数のレーンを含むことができ、各レーンは独立した命令リード・バッファ、レジスタ、実行ユニットと読み/書きユニットを含み、1つのレーンから他のレーンへ、レーン間の情報交換を可能にするイントラ・レーン・バスを経て、データを送ることができる。図8Aは本開示と整合する例示的なイントラ・レーン・バスを示す。レーン801の出力ドライバー810はバス820を動かしデータをレーン802へ送る。例えばドライバー810は、レーン801の実行ユニットの出力がバス820を通ってレーン802のレジスタ・ファイルもしくは実行ユニットへ行くようにする。図8Bを参照されること。レーン801の出力移送ゲート811と812は、イントラ・レーン・バス830と840をコンフィギュレーション信号の制御の下に駆動する;レーン802の移送ゲート821と822もまたイントラ・レーン・バス830と840をコンフィギュレーション信号の制御の下に駆動する。インプット・セレクタ815はバス830もしくはバス840のデータをレーン801へのインプットとして選び、またインプット・セレクタ825はバス830もしくは840のデータをレーン802へのインプットとして選ぶ。インプット・セレクタはコンフィギュレーション信号の制御の下にあるかもしくはオペランド・レジスタ・アドレスの照合によって制御される。例えば、R1はレーン801で実行される命令のターゲット・レジスタである;しかしR1はまたレーン802のソース・オペランドの1つである。それから照合結果は、マルチプレクサ825を制御してバス840を選び、従って801の実行結果をバス840を通してレーン802へパスする。イントラ・レーン連絡ゾーンはコンフィギュレーション制御信号によって定義されうる。例えば本実施形態においては、バス830はスイッチ832によって開き、そしてバス840はスイッチ841によって閉じる。
[171] 本記述においては、ある種の操作モードにおいては異なるレーンの実行ユニットは同じオペランドをインプットとして取りうるし、別の操作モードにおいては異なるレーンの各実行ユニットは独立したオペランドをインプットとして必要とする。図8Cは、開示された実施形態と整合する、例示的なレーンが同じもしくは異なる命令を実行することを示している。ここで850、851、852、853は異なるレーンの実行ユニットで、860、861、862、863はそれぞれ各自のレーンの実行ユニットに対応しているレジスタ・ファイルである。実行ユニット850は自身のレーンのレジスタ860から読み書きを行う。そして他の3つのレーンも各レーンが独自のオペランドにおいて実行するときに同じように振る舞う。
[172] 1つの実行ユニットの結果は、複数のレーンがある種の操作モードにおいて同じプログラムを実行しているとき、複数のレーンの中のレジスタ・ファイルにイントラ・レーン・バス870を経て出力され書き込まれる。よって、複数レーンの各命令ユニットは同じオペランドを読みうる。
[173] 本記述において、複数のトラッカーが複数命令複数データ(MIMD)オペレーションを制御するのに使われる。典型的なMIMDシステムにおいて、複数の命令ストリームは同時に複数のレーンで実行され、全てのこれらのレーンは同じ命令キャッシュとデータキャッシュを共有する。
[174] 図9Aは開示された実施形態と整合する例示的なMIMDオペレーションを示す;図9Aは命令キャッシュ1101、トラック・テーブル1103、データキャッシュ1105、4つの命令ユニット1111、1113、1115、1117そして4つのトラッカー1121、1123、1125、1127、4つの実行ユニットに対応する4つの命令リード・バッファ1131、1133、1135、1137を含む。各命令ユニットは自身のレジスタ・ファイル、算術ロジックユニット(ALU)そしてデコーダを持ち、対応する命令リード・バッファから送られてきた命令を独立に実行することができる。
[175] この実施形態においては、トラック・テーブル1103は4つのリード・ポートを持ち、それぞれ1つのトラッカーに仕えて各自のトラック・ポイントの内容を同時に読み出す。各トラッカーは前述の通り機能し、リード・ポインターは動きそして実行されている命令の後の最初の分岐において止まる。命令キャッシュ1101は、次の順番のブロックとターゲット・ブロックを、命令リード・バッファのターゲット・アドレスの照合結果にもとづいて、4つの命令リード・バッファへ供給する。各命令リード・バッファは命令をその対応するレーンに、デコードと各自のトークン・パッサーのもとの実行のために供給する。
[176] 各自のトラッカーをサポートし、 同じ内容を持つ4つのトラック・テーブルは図9Aの4ポート・トラック・テーブル1103にとって変わることができる。図9Bは開示された実施形態と整合する例示的な、同じ内容を持ちMIMDオペレーションをサポートする複数のトラック・テーブルを示す。トラック・テーブル1151、1153、1155そして1157は同じ内容を含み、各自のトラッカー1161、1163、1165そして1167のリード・ポインターによってインデクスされたそれぞれトラック・ポイント内容を出力する。トラック・テーブルの1つにおいて新しいトラックが追加されるか古いトラックが交換されるかしたとき、同じことが他のトラック・テーブルにおいても内容の一貫性を保つために施される。よって図9Aと同じ機能を実現する。
[177] 時分割多重方式は単一ポート・トラック・テーブルと複数のトラッカーを用いて、複数のトラック・ポイント内容を供給することができる。図9Cは開示された実施形態と整合する例示的な時分割多重方式トラック・テーブルを示す。4つのトラッカー1171、1173、1175、そして1177によって出力されたリード・ポインターの1つはマルチプレクサ1179によって選ばれ、トラック・テーブル1169をインデクスする。トラック・テーブル1169は4つ全てのトラッカーへトラック・テーブル内容を出力する。要求しているトラッカーだけが内容を受け付け、他のトラッカーは内容を受け付けない。全てのトラッカーが各サイクルにおいてトラック・テーブルに訪れる必要はないから、4つのトラッカーは 時分割多重方式を使ってトラック・テーブルに訪れることができる。セレクタ1179の制御は4つのレーンのそれぞれの実行優先順位にもとづく。これは各レーンにおいて実行されている命令の数の制御が時間の同じ周期の中で異なることを可能にする。さらにより高周波数のクロックがトラック・テーブル1169そしてトラッカー1171、1173、1175、そして1177へ供給され(例えば周波数がレーンのクロック周波数の4倍)、システム・クロック・サイクル内で、トラック・テーブルが成功裏にトラック・ポイント内容を全てのトラッカーへ出力することができる。このようにして、各命令リード・バッファは対応するレーンのために記憶命令を供給しなくてよい。
[178] 本記述において、複数の分岐ポイントの後の後続するトラックは、トラック・テーブルの複数の分岐ポイントに記憶されている情報にもとづいて活用されうる。この後続トラックは次の順番のトラックと分岐ターゲット・トラックを含む。図9Dは開示と整合する例示的な、複数レーンに後続トラック情報を供給する実施形態を示す。
[179] 図9Dにおいてトラック・テーブル1201は4つのトラック1211、1213、1215、そして1217の情報を、トラッカー1203によって出力されたリード・ポインターによってインデックスされた分岐ポイントにもとづいて、出力する。4つのトラックの情報は以下の通り:トラック情報1211は、1203(第一分岐)によってインデックスされた分岐と続く分岐(第二分岐)はともに取られなかったというものである;トラック情報1213は、第一分岐は取られなかったが第二分岐が取られたというもの;トラック情報1215は第一分岐は取られたが第二分岐は取られなかったというもの;トラック情報1217は第一と第二分岐が共に取られたというものである。
[180] 図9Dのレジスタ1221、1223、1225、1227、1228、そして1229はそれぞれ対応する6つのレーンの分岐履歴を記憶する。レーンが同分岐ポイントを実行したとき、6つのレジスタの各値は’01’、’10’、’10’、’11’、’00’、そして’11’である。第五レーンが1211のトラック情報を選びさらなる実行を方向づけることに基づいて、第一レーンは1213のトラック情報を選びさらなる実行を方向づけ、第四と第六レーンは1217のトラック情報を選びさらなる実行を方向づける。このようにして、同じ1つのトラッカーが、6つのレーンの二つの分岐の実行に基づいて後続トラック情報を供給し、6つのレーンが同じ命令を実行することを可能にする。よって、小さなオーバーヘッド・コストによる複数の分岐の並列処理が可能になる。
[181]独立した一時的なトラックが各トラッカーに対して与えられ、複数のトラッカーが同じトラック・テーブルを訪れるときの、トラック・テーブル・アクセスにおけるボトルネックを緩和する。本発明の一時的トラック行の例は図9Eを参照されたい。
[182] 例として同時にトラック・テーブル1301にアクセスする二つのトラッカー1303と1305を取り上げる。トラッカー1303のリード・ポインタ1307が新しいトラックをポイントするとき、マルチプレクサ1311はリード・ポインタ1307の値を選び、バス1313を経てトラック・テーブル1301をインデックスするためにそれを送る。全トラックは読み出され、一時的トラック行1315に記憶される。それから、トラック・ポイントは、トラック・テーブル1301にアクセスする代わりに、トラッカー1303のリード・ポインタがまだ同じトラックをインデクスしている間は、直接に一時的トラック行1315から読み出される。トラッカー1305のリード・ポインタ1309が新しいトラックをポイントするとき、マルチプレクサ1311はリード・ポインタ1309の値を選び、バス1313を経てトラック・テーブル1301をインデックスするためにそれを送る。全トラックが読み出され、一時的トラック行1317に記憶される。それから、トラック・ポイントは、トラック・テーブル1301にアクセスする代わりに、トラッカー1305のリード・ポインタがまだ同じトラックをインデクスしている間は、直接に一時的トラック行1317から読み出される。よって、これはアクセス争いとトラック・テーブル1301へのアクセス数を、そして電力消費を減らす。
[183] さらに、一時的トラック行の規模はトラッカーと働きやすいように拡大されうる。図9Fは開示された実施形態に整合する例示的なミクロ・トラック・テーブルである。
[184] 本実施形態において、トラック・テーブル1301、トラッカー1303そして1305は図9Eのそれらと同じである。違いは9Fはミクロ・トラック・テーブル1355と1357を用い、9Eの一時的トラック行1315と1317を代替する。図9Eにおいて、トラッカーのリード・ポインタが新しいトラックをポイントするとき、対応する一時的トラック行の内容は交換される。本実施形態においては、トラッカーのリード・ポインタが新しいトラックをポイントするとき、同新トラックの内容はミクロ・トラック・テーブルの交換可能行に書き込まれる(従来のメモリ交換ポリシーを用いる)。ミクロ・トラック・テーブルの各行はトラックの対応するBNXを記憶するレジスタを持つ。トラッカー・リード・ポインタのBNX値はミクロ・トラック・テーブルに記憶されているBNXと照合され、トラッカー・リード・ポインタによってインデックスされたトラックが既にトラック・テーブルに記憶されているか、そして既にトラック・テーブルにあるならその位置、をチェックする。このようにして、トラッカーのリード・ポインタが現行トラックを再びポイントするとき、対応するトラック・ポイントは見つけ出され、トラック・テーブル1301へ再びアクセスする代わりにミクロ・トラック・テーブルから読み出される。これはさらに二つのトラッカーによるトラック・テーブル1301へのアクセス争いを減らし、そして電力消費を減らす。
[185] ミクロ・トラック・テーブルも行数は対応する命令リード・バッファの命令ブロック数と同じ、もしくは異なることが可能である。ミクロ・トラック・テーブルの行数と命令リード・バッファの命令ブロックのブロック数が同じとき、二つは対応する、あるいは対応しなくてもよい。もし二つが完全に対応するなら、二つは同じBNXマッチャーを使うことができ、それぞれ自身のマッチャーをもつ必要がない。
[186] この開示における命令キャッシュは複数の異なるプログラムを同時に記憶でき、トラック・テーブルの各プログラムに対応するトラックは互いに独立している。
各プロラムのトラッカーはそれ自身のトラックにおいて互いに交わることなく走る。唯一の例外は異なるプログラムによって呼び出された共有サブルーティンである。しかし、この場合においても、各プログラムはそれ自身のトラックへ、共有サブルーティンの実行が完了した時点で、戻る。
[187] 本記述において、汎用トークン・パッサー・ユニットは複数レーン・プロセッサ環境において構成される。汎用トークン・パッサーはそれ自身のレーンの命令実行を制御するだけでなく、他のレーンのトークン・パッサーと連携して、ILPもしくはSIMDなどの複数レーン間の同期動作を実現する。複数レーンの同トークン・パッサーはマトリックスとして組織され、オペレーションの異なるモードをサポートするように設置されうる。
[188] 図10Aは本開示と整合する例示的なトークン・パッサー配列を示す。12のトークン・パッサーのマトリックスが示されている。前述のように、トークン・パッサーの各行は1つのレーンの命令リード・バッファに対応する。3レーンのトークン・パッサーの一部がここに示されていて、各トークン・パッサーは命令リード・バッファの命令に対応する各トークン・パッサーは基本パッサー(例えば1611)と 3インプット・マルチプレクサ(例えば1631)によって形成されている。本開示のトークン・パッサー・マトリックスの同基本トークン・パッサーについては図10Bを参照のこと。
[189] 図10Bにおいて、各基本パッサーは少なくとも1つのトークン信号レジスタ1651、ORゲート1653、そしてマルチプレクさ1655から構成される。前述されたように、トークン・パッサーはより多くの機能を実現するためにより複雑な構造を持つこともできる。ORゲート1653のインプットの1つはターゲット・デコーダから来る。もう1つはトークン信号レジスタ1651の出力から来る。図10Aに戻って、最左コラム以外の全てのコラムは、3インプット・マルチプレクサ、1631、1633、1635、1641、1643、そして1645を持つ。これらのマルチプレクサはコラム間の関係を定義するように設定されうる。最左コラムもまた3インプット・マルチプレクサを持ちうるが、インプットAのみを受付けるように設定される必要があり、このコラムの中でトークン・パッシングを受付ける。
[190] 各コラムのトークン・パッサーは他のコラムに関係しないように設定され、各レーンはそれ自身の命令リード・バッファの命令を実行する(各レーンは異なるプログラムを実行する)。図10Aのマルチプレクサ1631、1633、1635、1641、1643、そして1645 は全て各自のコラムのトークン・パッサーの出力(マルチプレクサのインプットA)を選ぶ。このようにして、トークン・パッサー1601、1603、1605そして1607は第一コラムのトークン・パッサーを構成し他のコラムから独立にトークン信号を次々にパスすることができる;トークン・パッサー1611、1613、1615そして1617は第二コラムを構成し次々にトークン信号をパスする;トークン・パッサー1621、1623、1625そして1627は第三コラムのトークン・パッサーを構成し次々にトークン信号を移送する。3つのグループのトークン・パッサーはそれぞれ、各自のレーンの実行のために命令を提供する自身の命令リード・バッファを制御し、よってMIMDプロセッサの機能を実現する。図9Bの実施形態において示される複数のトラッカーは分岐ターゲット・アドレスと次の命令ブロック・アドレスをトークン・パッサーの各グループに提供する。このトークン・パッサー間の相関はコラム相関と名付けられる。
[191] これらのコラムの命令リード・バッファが同じ命令を記憶しているとき、各トラックは同じ命令を同時に実行する(GPUオペレーションのように)。ここで、最左コラムはひとつのトラッカーの指示の下のリードコラムと設定されうる、右側の他のコラムは後続コラムとして設定され、リードコラムを追って同期する。
[192] 本記述において、リードコラムと後続コラムの設定は行相関関係を形成する。特に、図10Aのマルチプレクサ1631、1633、1635、1641、1643そして1645は全てその左のトークン・パッサーの出力(マルチプレクサのインプットC)を選ぶ。つまり、基本パッサー1611と1621は両方とも動かず、マルチプレクサ1631と1641が基本パッサー1601のトークン信号値をパスする;基本パッサー1613と1623は両方とも動かず、マルチプレクサ1633と1643が基本パッサー1603のトークン信号値をパスする;基本パッサー1615と1625は両方とも動かず、マルチプレクサ1635と1645が基本パッサー1605のトークン信号値をパスする。このようにして、トークン信号が基本パッサー1601にあるとき、基本パッサー1601のトークン信号値は、基本パッサー1601に対応するレーンへの命令の出力を制御するだけでなく、マルチプレクサ1631とマルチプレクサ1641へパスされ、そしてそこから基本パッサー1611と1621へ対応するレーンへの命令出力を制御する。
[193] 同様にして、トークン信号が基本パッサー1603へパスされるとき、基本パッサー1603、基本パッサー1611そして基本パッサー1621に対応する各自のレーンへの命令の出力を制御する。このモードにおいては、最初のトークン・パッサーは受動トークン・パッサーを動かして同じ命令を出力させ、SIMDもしくはGPUの機能を実現する。
[194] リードコラムと後続コラムは対角相関として設定されうる。特に、図10Aのマルチプレクサ1631、1633、1635、1641、1643、そして1645は全てその左上へのトークン・パッサーの出力(マルチプレクサの出力B)を選ぶ。すなわち、トークン・パッサー1613と1625は共にトークン・パッサー1601のトークン信号値を出力し、トークン・パッサー1615と1627は共にトークン・パッサー1603のトークン信号値を出力する。このようにして、トークン信号が基本パッサー1601にあるとき、基本パッサー1601のトークン信号値は、基本パッサー1601に対応するレーンへの命令の出力を制御するだけでなく、マルチプレクサ1633とマルチプレクサ1645にもパスされ、そこから基本パッサー1613と1625に対応するレーンへの命令出力を制御する。
[195] 同様にして、トークン信号が基本パッサー1603へパスされるとき、基本パッサー1603、基本パッサー1615そして基本パッサー1627に対応する各自のレーンへの命令出力を制御する。このモードにおいては、最初のトークン・パッサーは受動トークン・パッサーを動かして複数の連続した命令を出力させ、ILPプロセッサの機能を実現する。
[196] 本開示の設定可能な同プロセッサ・システムは複数の異なるプロセッサの機能を実現するように設定されうる。異なるレーンはそれぞれ、同プロセッサ・システムがILPプロセッサとして設定されているとき、連続する命令のセグメントの中の1つの命令を実行する。この場合、同じサイクル中に命令リード・バッファによって出力された複数の命令間のデータ依存をチェックする必要がある。隣り合うサイクルの中で命令リード・バッファによって出力された複数の命令間のデータ依存もまたチェックされ、実行ユニットの出力は、データ依存を持つ後の命令を実行する実行ユニットへバイパスされ、よって命令実行効率を向上させる。
[197] 本記述において、複数のレーンがILPモードに設定されうる。図11は開示された実施形態に整合する例示的な、トークン・パッサー・マトリックスを持つ設定可能複数レーン・プロセッサ・システムである。最大発行幅4のILP設定が例として用いられる。図11において、モジュール1701はトークン・パッサー配列と対応する命令リード・バッファ(この例においてはそれは4つのレーンに対応する)を含む。設定によって、最初のトークン・パッサーはトークン信号をパスし、後続するトークン・パッサーは対角相関におけるその左上にあるトークン・パッサーからのトークン信号を受付ける。簡明のため、使われない部分は省かれている。前述のように、モジュール1701は、各クロックサイクルにおいて、トークン信号に対応するものから始まる連続する4つの命令を出力することが可能である。
[198] モジュール1703は連続した命令の依存性チェックを行なうように設定されうる。4つの連続した命令の依存性チェックを例として取り上げる。同4つの連続した命令はモジュール1701の4レーン1411、1413、1415、1417によってバス1461,1463、1465、1467を経て出力される。同4つの連続した命令の最初の3つの命令の宛先レジスタ・アドレスはバス1711、1713、1715に置かれる。同4つの連続した命令の8つのオペランド・ソース・レジスタ・アドレスはバス1721、1723、1725、1727、1731、1733、1735、1737に置かれる。図11に示されるように、バス1711、1713、1715からバス1725、1727、1731、1733、1735、1737への交差点において設定可能コンパレータが存在する。命令依存性チェックはこれらのコンパレータの設定に応じて実行され、特定の命令のソース・レジスタ・アドレスと他の命令の宛先レジスタ・アドレスとを比較する。コンパレータの設定(つまり比較するまたはしない)が、特定の命令のソース・レジスタ・アドレスと他の命令の宛先レジスタ・アドレスとを比較することを決定し、よってイントラ命令依存関係チェックを行なう。
[199] 本実施形態における中空円は比較を行なうように設定されたコンパレータを表す。同一命令のソース・オペランド・レジスタ・アドレスは一緒にOR操作される。つまり、バス1725、1727そしてバス1711の交差点における2つのコンパレータの結果は、第1の命令の宛先レジスタ・アドレスと第2の命令の二つのソース・レジスタ・アドレスを比較するように設定されていて、ORゲート1743によってOR操作される;バス1731、1733とバス1711、1713の交差点におけるコンパレータは、第1と第2命令の宛先レジスタ・アドレスと第3の命令の二つのソース・レジスタ・アドレスを比較するように設定されていて、その結果はORゲート1745によってORされる;バス1735、1737、そしてバス1711、1713、1715の交差点における6つのコンパレータは、第1、第2、第3命令の宛先レジスタ・アドレスと第4の命令の二つのソース・レジスタ・アドレスを比較するように設定されていて、その結果はORゲート1747にてORされる。本実施形態において、2つのソース・レジスタ・アドレスは他の命令の宛先レジスタ・アドレスと比べるのに必要とされない。従って、バス1721、1723そしてバス1711、1713、1715、1717の交差点におけるコンパレータは比較するように設定されていない。よってORロジック1741の出力は’0’である。
[200] そして、ORロジック1741、1743、1745、1747の出力は、4つのレーン1411、1413、1415、1417の各自の決定ブロック1751、1753、1755、そして1757へ送られる。図11において、各決定ブロックはそれ自身のレーンのORゲートの出力を受付ける。加えて、決定モジュールはカスケードされ、各モジュールはその右側のレーンのモジュールからの出力を受付け、さらにそれは下方に1ポジション、シフトされる。そして右側レーン・モジュール出力の下方シフトによって取り残された、決定モジュールの残るインプットは右側レーンのORゲートの出力と接続される。例えば、決定ブロック1755はORロジック1745の出力を受け付け、一番上のその第一右側インプットはその右側のORロジック1747の出力を受け付け、その第二、第三、第四の右側インプットは決定ブロック1757の第一、第二、第三出力を受付ける。
[201] 最大発行速度4をサポートするために、4つの対応する決定ブロックが依存性チェック・モジュールのセットとして設定される。この依存性チェック・モジュールにおいて、最終ステージの決定ブロック(最も左)へのインプットは選択信号1739としてグループされ、トークン・パッサーのマルチプレクサを制御し、トークン信号の正確なパッシングを制御する。
[202] この実施形態において、各決定ブロックはある構造を持つ。図12は開示された実施形態と整合する例示的な、依存チェックモジュールの内部構造を示す。本記述において、Write after Read(WAR)ハザードとRead after Read(RAR)ハザードをチェックする必要はなく、Read after Write(RAW)ハザードとWrite after Write(WAW)ハザードをチェックするだけで良い。つまり、もし命令のソースレジスタ・アドレス(オペランド)が、この命令の前のある命令の宛先レジスタ・アドレスと同じであれば、これら2つの命令は並列に実行され得ない。2つの命令が同じ宛先レジスタに書き込んでいるとき、第一の命令の結果は破棄され、第二の命令の結果のみRFに書き込まれる。
[203] この実施形態において、最大2つのソースレジスタと1つの宛先レジスタを用いるそれぞれの命令が、例として用いられる。他のシナリオは類推によって推論されうる。RAWハザードをチェックすることにおいて、最初の3命令から抽出された宛先レジスタ・アドレス1711、1713、1715が、最初の命令の後の命令から抽出されたソースレジスタ・アドレス1725、1727、1731、1733、1735、1737と比較される。特に、最初の命令の宛先レジスタ・アドレス1711は各ソースレジスタ・アドレス1725、1727、1731、1733、1735、1737と比較される。宛先レジスタ・アドレス1713は各ソースレジスタ・アドレス1731、1733、1735、1737と比較される。宛先レジスタ・アドレス1715は各ソースレジスタ・アドレス1735、1737と比較される。レーンの同比較結果はレーンに付随した決定ロジックへ送られる。
[204] この実施形態において、決定ロジック・グループの最終段階におけるORゲート(各グループの決定は右から左へ行なわれるから最左)は強制的に’1’にされる。決定ロジックの残りの各段階は、その対応するレーンの比較結果と、前段階の決定ブロックからの決定結果を処理する。これらのロジックの最終段階の決定結果は選択信号1739になり、それは図11の各トークン・パッサーのマルチプレクサを制御する。
[205] トークン信号がトークン・パッサー1431にあると仮定し、トークン・パッサー1431、1433、1435、1437に対応する4命令は依存チェックユニットと実行ユニットへ、バス1461、1463、1465、1467を通して、同時に送られる。実行ユニットは、依存チェックユニットの検出結果に応じて、これら4命令のうちどれが並列に実行されうるかを決定する。依存チェックユニットによって出力された選択信号1739は、トークン信号の通過を制御する各トークン・パッサーへ送られる。
[206] 依存チェックのプロセスは図11と図12によって示される。トークン信号がトークン・パッサー1431にあると仮定し、レーン1411、1413、1415、1417はそれぞれ命令をバス1461、1463、1465、1467を経て発行する。ORゲート1741の出力は強制的に’1’にされ、次のグループに対する依存決定ロジックのこのグループの影響をブロックする。ORゲート1749の出力、他の決定ロジックの最終段階である、もまた強制的に’1’され、この決定グループに対する、依存決定ロジックのそのグループの影響をブロックする。もし4つの発行された命令間に依存がないならば、ORゲート1743、1745、1747の出力は全て’0’である。決定ブロック1759が決定ブロック1757へ送る出力は、上から下へ’1’、’0’、’0’、’0’である。決定ブロック1757において、ORゲート1747の出力は’0’であるから、決定ブロックが決定ブロック1755へ送る出力は、上から下へ’0’、’1’、’0’、’0’である。同様に決定ブロック1755の出力は、上から下へ’0’、’0’、’1’、’0’であり、決定ブロック1753の出力は、上から下へ’0’、’0’、’0’、’1’である。シフト・ブロッカー・ロジック1753、1755、1757は全て信号の通過をブロックせず、1491、1492、1493の’0’信号はそれぞれシフトされ、1471、1472、1473(これは命令2、3、4において依存が検出されないということ)になり、1494の信号は’1’に固定され、シフトされ信号1474へ着くようにパスされ、各トークン・パッサーにおける4インプット・マルチプレクサを制御する制御信号を値’0001’にセットし、全ての4インプット・マルチプレクサの第4インプットを選ぶ。各4インプット・マルチプレクサの第4インプットは、トークン・パッサー1439の4インプット・マルチプレクサ以外において、’0’である。このマルチプレクサの第4インプットは値が’1’の制御ライン1447に繋がっている。従って、トークン信号はトークン・パッサー1433、1435、1437を飛び越え、トークン・パッサー1439へパスされる。トークン信号パッサー1431に対応する命令の始めにおいて、4つの命令間には依存がないため、これら4命令は並列に発行されうる;これら4命令の全ては実行ユニットによって実行されうる。次のクロック・サイクルにおいて、IRBはトークン・パッサー1439に対応する命令から始まる4命令を、プロセッサ・コアへ実行のために、また依存チェックユニットへ検証のために、出力する。
[207] トークン・パッサー1431に対応する命令から始まる4命令の問題に戻る。もし4番目の命令のみ(トークン信号パッサー1437に対応する命令)が依存関係を持つ(4番目の命令が最初の3つの命令のどれかと依存関係を持つ)場合、依存ビット1493は’1’であり、シフト・ブロッカー・ロジック1757の3つのANDゲート全てが’0’を出力し、信号1494の通過をブロックし、信号1493は信号1473へ到達するために2段階のシフトを経る。各トークン・パッサーの全ての4インプット・マルチプレクサを制御する制御信号を’0010’にし、全4インプット・マルチプレクサの第3のインプットを選ぶ。全4インプット・マルチプレクサの第3のインプットは、トークン・パッサー1437の4インプット・マルチプレクサ、その第3インプットは値が’1’の制御ライン1447に繋がっている、以外は’0’である。このようにして、トークンはトークン・パッサー1437へパスされる。これはトークン・パッサー1437に対応する命令が最初の3つの命令と依存関係をもつからであり、これら3命令と同時には発行されえず、新しいクロック・サイクルにおいて再発行されなければならない。それから、実行ユニットは同最初の3命令のみを実行する。次のクロック・サイクルにおいて、IRBはトークン信号パッサー1437の命令から始まる4命令を、実行のためにプロセッサ・コアへ、そして依存チェックユニットへチェックのために、出力する。トークン・パッサー1437に対応する命令は第1レーン1411のバス1461からこのとき出力される(前サイクルは第4レーン1417のバス1467から出力した)。
[208] トークン・パッサー1431に対応する命令から始まる4命令の問題に戻る。もし第2(トークン・パッサー1433に対応する)と第4命令(トークン・パッサー1437に対応する)の両方が前の命令と依存関係を持つとき、第4命令の依存信号1493は従って’1’であり、シフト・ブロッカー・ロジック1757の3つのANDゲートが’0’を出力するようにし、従って信号1494の通過をブロックする;信号1493はシフトし左にパスする。しかし、このとき、第2命令の依存ビット1491は’1’で、シフト・ブロッカー・ロジック1753の3つのANDゲートが’0’を出力するようにし、従って信号1493の通過をブロックする;1491それ自身は信号1471へ到達し、トークン・パッサーの全ての4インプット・マルチプレクサの制御信号を’1000’にし、全4インプット・マルチプレクサの第1インプットを選ぶ。4インプット・マルチプレクサのそれぞれの第1インプットは 、トークン・パッサー1433の4インプット・マルチプレクサ、その第1インプットは値が’1’の制御ライン1447に繋がっている、以外は’0’である。従って、トークン信号はトークン・パッサー1433へパスされる。それから、実行ユニットは同第1命令しか実行できない。次のクロック・サイクルにおいて、命令バッファはトークン信号パッサー1433の始まりの命令に対応する4命令を、プロセッサ・コアへ実行のために、また依存チェックユニット1449へチェックのために、出力する。トークン・パッサー1433に対応する命令はこのとき第1レーン1411のバス1461から出力される(前サイクルは第2レーン1413のバス1463から出力した)。
[209] この実施形態において、トークン・パッサーのマルチプレクサは4インプット・マルチプレクサであり、また依存チェックユニットは設定可能であるから、従って最大4発行をサポートできる。並列でより少ない数の命令を発行するために、依存チェックユニット・モジュールはそれに対応して設定され、依存ビットの通過をブロックする。例えば、図12において、3発行を並列で実行するために、依存ビット1439は’1’と設定され、判断モジュール1757のANDゲートをブロックし、制御信号1739の信号1471、1472、1473はそれらの間で唯1つの’1’を持ち、信号1474は’0’である。最初の3命令(バス1461、1462、1463の命令)の依存関係チェック結果に応じて、トークン信号はそれに対応して、現行トークン信号パッサーの後の、第1、2、3トークン信号パッサーへパスされ、3-発行ILPを達成する。他のいかなる適切な最大命令数も同様に設定しうる。
[210] 本記述において、電力を節約するために、より小さな発行頻度が設定でき、使われていないレーンの電力供給を止めることができる。より小さな発行頻度はまた、他のレーンが他の目的で使われるために、設定できる。
[211] いくつかの命令セット・アーキテクチャにおいて、レジスタの値を比較することによって、分岐決定がなされる。これらの状況において、正しい分岐命令の実行は上述の依存チェック方法を用いることによって保証される。
[212] 他の幾つかの命令セット構造において、分岐決定は、ふつう前の命令の実行結果である、フラッグにもとづいてなさる。これらの状況において、追加的なロジックがこれらのフラッグの依存関係をチェックするために追加される。例えば、図12において、バス1451、1452、1453の値はそれぞれ、第1、第2、第3命令がフラッグ設定命令であるかを表し、そしてバス1454、1455、1456の値はそれぞれ第2、第3、第4命令が分岐命令であるかを表す。このようにして、同レジスタ依存関係チェックと同じ方法を用いいて、フラッグ設定命令と分岐命令との間に依存関係があるかを判断し、正しい分岐命令の実行を保証する。
[213] 図11に戻って、モジュール1705は対応する命令ユニットを含む;モジュール1709は同4レーン1411、1413、1415、1417の対応するレーンのレジスタファイル含む。各レジスタファイルは2つの読み込みポート(読み込みAと読み込みB)と4つの書き込みポートを持つ。同読み込みポートAと読み込みポートBは2つのソース・オペランドの読み出しを同時にサポートできる。この実施形態において、同4書き込みポートは4レーンの4命令の4実行結果の書き戻しを同時にサポートし、複数のレーンによる同じプログラムの連続した命令の一貫した実行をサポートする。同じ値が同時に全4レーンのレジスタファイルに書き込まれ、よってこれら4レジスタファイルの値の一貫性を保証する。よって、各レーンの実行ユニットがレーンのレジスタファイルからデータを読み出すとき、それは同じデータを読む。’Write after Write’依存関係チェックもまた実行されなければならず、故に同じ宛先レジスタ・アドレスを持つ複数の命令の最後の実行結果のみがレジスタファイルに書き戻される。WAW依存関係チェックは図12で示されたWAR依存関係チェックと同じやり方で実行されうる。理解を容易にするために、WAW依存関係チェックは図に示されていないが、この業界の平均的な人にとって実装するのは容易である。
[214] レーン間にイントラ-レーン・バスがあり、1つのレーンから複数の他のレーンへデータを運ぶ。図11を参照されたい。各レーンの実行ユニットは設定レジスタの制御のもとにある送信ゲートを持ち、各実行ユニットの実行結果をイントラ-レーン・バスへ送る。レーンの各実行ユニットはバイパス・ロジックの制御のもとにあるマルチプレクサを持ち、それは他のレーンによってイントラ-レーン・バスに置かれたデータを受け取ることができる。
[215] モジュール1707はバイパス・ロジックを含む。この実施形態において、前クロック・サイクルの命令の宛先レジスタ・アドレスは、現行サイクルの全ての命令のソースレジスタ・アドレスと照合されるために遅延される。比較結果は、バイパス実行結果を対応する命令のソース・オペランドとして有効にし、結果はRFへ書き戻される。モジュール1707の中空円はコンパレータを表す。連続する同4命令の宛先レジスタ・アドレス1711、1713、1715、1717は、それぞれが各自のレジスタ1771、1773、1775、1777によって遅延された後、バス1781、1783、1785、1787へ置かれる。
[216] 説明の簡明のため、前サイクルの4命令はデータ依存関係を持たないことが仮定されている。よって、現行サイクル命令のソースレジスタ・アドレスは、前サイクルの全ての4宛先レジスタ・アドレスと比較される。前サイクルでデータ依存関係があれば、それは同様に処理される。現行サイクル命令のソースレジスタ・アドレスは、並列に実行されうる全ての前サイクル命令の宛先レジスタ・アドレス(この状況では、少なくとも1、最大4)のみと比較される必要がある。
[217] モジュール1707において、コンパレータ(全部で8つ)の第1行はそれぞれ、前サイクルの最初の命令の宛先レジスタ・アドレスと現行サイクルの4命令の8つのソースレジスタ・アドレス(バス1721、1723、1735、1727、1731、1733、1735、1737の値)を比較する; 同様にコンパレータの第2行はそれぞれ、前サイクルの第2命令の宛先レジスタ・アドレス(バス1782の値)と現行サイクルの4命令の8ソースレジスタ・アドレスを比較する;コンパレータの第3行はそれぞれ、前サイクルの第3命令の宛先レジスタ・アドレス(バス1783の値)と現行サイクルの4命令の8ソースレジスタ・アドレスを比較する;コンパレータの第4行はそれぞれ、前サイクルの第4命令の宛先レジスタ・アドレス(バス1784の値)と現行サイクルの4命令の8ソースレジスタ・アドレスを比較する。現行サイクルの命令は前サイクルのバイパス結果から、もしくはレジスタファイルから、オペランドを得る。この実施形態において、もしWAWチェックが複数の命令が同じ宛先レジスタ・アドレスを持つことを見いだしたとき、最後のサイクルの最後の命令の実行結果のみが、今サイクルのソースオペランドとしてバイパスされる。
[218] 例えば、現行サイクルの第1命令のソースレジスタ・アドレス1721は、前サイクルの4宛先レジスタ・アドレスを比較する:1781、1783、1785、1788。比較結果1795はマルチプレクサ1791を制御する。マルチプレクサ1791は5インプットを持ち、そのうち4つは前サイクルの4つの実行結果に接続し、もう1つはレジスタファイルの読み取りポートAに接続する。ソースレジスタ・アドレス1721が宛先レジスタ・アドレス1781と一致するとき、 マルチプレクサ1791は前サイクルの第1命令の実行結果を選ぶ。同様に、もしソースレジスタ・アドレス1721が宛先レジスタ・アドレス1783もしくは1785もしくは1787と一致するなら、マルチプレクサ1791は前サイクルの第2、3、4命令の結果を選ぶ。もしどれも一致しないならば、マルチプレクサ1791はレジスタファイルの読み取りポートAの出力をオペランドとして選ぶ。他の状況は類推によって推し量られうる。
[219] 従って、本開示の同プロセッサ・システムの本体は同じ構造をもつレーンのマトリックスとして構成できる。各レーンは命令リード・バッファ、実行ユニット、レジスタ・ファイル、データ読み込みバッファ、読み込み/記憶バッファ、を含む。レーンは命令キャッシュとデータキャッシュを共有する。さらに、同プロセッサ・システムは異なる機能を持つプロセッサーとして設定されうる:例えば、単一命令単一データ・プロセッサ(SISD)、単一命令複数データ(SIMD)、複数命令単一データ(MISD)、複数命令複数データ(MIMD)、命令レベル並列プロセッサ(ILP)、あるいはベクタープロセッサ。それはまた、もし適当なスレッド資源が加えられるなら、スレッド・レベル並列プロセッサ(TLP)にもなる。ここでスレッド資源とは、命令やデータや状態を記憶する、重複した命令リード・バッファ、レジスタ・ファイル、データ読み取りバッファ、状態レジスタ、そしてパイプライン・レジスタなどである。以下の記述は4レーンからなるプロセッサ・システムにもとづいている。
[220] 図13Aは本開示と整合する例示的なプロセッサ・システムである。同プロセッサ・システムは4つのレーン1811、1813、1815そして1817を含む。同レーンは図11の実施形態と同様であるが、実行ユニットとロード/記憶ユニット以外に、二つのセットの命令リード・バッファ(IRB)と二つのグループのレジスタ・ファイル(RF)がある。これらのうち、IRB1801、IRB1861、実行ユニット1813、RF1821、RF1831そして読み込み/記憶ユニット1841、全てがレーン1811に対応する;IRB1803、IRB1863、実行ユニット1813、RF1823、RF1833、読み込み/記憶ユニット1843は全てレーン1813に対応する;IRB1805、IRB1865、実行ユニット1815、RF1825、RF1835、読み込み/記憶ユニット1845は全てレーン1815に対応する;IRB1807、IRB1867、実行ユニット1817、RF1827、RF1837、読み込み/記憶バッファ1847は全てレーン1817に対応する;IRB1801、1803、1805、1807、そしてRF1821、1823、1825、1827はスレッドQに対応し、IRB1861、1863、1865、1867そしてRF1831、1833、1835、1837はスレッドRに対応する。従って、4レーンと2スレッドが8つの仮想マシンを構成する。これらの仮想マシンのそれぞれは独立に走ることができる、もしくは複数の仮想マシンが一緒に走ることができる。またレーン間のデータを交換するイントラ・レーン・バスと、マルチレーン恊働オペレーションのためにデータ依存をチェックするデータ依存チェックユニットがある。本例においては、機能が前述されている部分に関しては省略される。
[221] IRB、RF、そして読み込み/記憶ユニットからなる前述のレーン構造において、IRBはトラッカーから供給されたトラック・アドレスの指示の下、命令キャッシュから命令ブロックを取ってくる。IRBはまた実行のために、命令を実行ユニットとロード/記憶ユニットへ供給する。命令ユニットは命令をデコードし実行し、オペランドをRFから読み出し、結果をRFヘ記憶する。ロード/記憶ユニットはデータを取りに行き、RFへロードするかもしくはRFからのデータをデータキャッシュへ記憶する。
[222] 図13Bは本開示のSISDプロセッサの例である。この例において、各モジュールの構造と機能は図13Aのそれらと同様である。コラム相関モードの、1つのレーンと1つのセットのスレッド資源だけがSISDオペレーションのために必要とされる。図13BのIRB1801は自動的に命令を実行のためにレーン1811へ出力する。レーン1811は命令を実行し、RF1821、1831そしてロード/記憶ユニット1841と図13Aで示された同じ仕方で、恊働する。他の3つのレーンと付随するIRB、RF、ロード/記憶ユニットは全て、例えばクロックを止めるもしくはこれらのモジュールへの電力を断つことで、シャットダウンする。イントラ・レーン・バスとデータ依存チェックは用いられない。単一データがレーン1811に付随するロード/記憶ユニットによって読み取られる。図13Bのように設定されたプロセッサ・システムはSISDプロセッサとして働ける、通常のシングル発行CPUである。
[223] 図13Cは本開示のSIMDの例である。この例において、各モジュールの構造と機能は図13Aのそれらと同様である。1つのスレッドの資源がSIMDオペレーションに用いられる。1つのトラッカーの指示のもと行相関モードにおいて、4つのIRBが同じ命令ブロックを記憶し、同じ命令を4つのレーンに供給する。各レーンの対応するRFは異なるデータを記憶でき、また各レーンの対応するロード/記憶ユニットは異なるデータアドレスに読み書きできる。このようにして、4つのレーンは、それぞれのデータに対して同じプログラムを実行し、SIMDプロセッサの機能を実現する。イントラ・レーン・バスとデータ依存チェックは用いられない。図13Cのように設定されたプロセッサ・システムは、SIMDプロセッサ、例えばベクター・プロセッサのように機能できる。
[224] 本開示のこのプロセッサ・システムはまたスーパーSIMDモードでも機能できる。通常SIMDモードでは複数レーンが同じ命令を同時に実行する。プログラムが分岐を持つとき、既存のSIMDプロセッサの各レーンは分岐決定をおこない、レーンマスクを生成する。そして各レーンはそのレーンマスク値に沿って動作する。最初に、レーンマスク値’0’のレーン(分岐を取らない決定)が非分岐命令を実行し(分岐命令までのフォールスルー命令)、その間レーンマスク値’1’のレーンは止まって待機する。それから、レーンマスク値’1’のレーン(分岐を取る決定)は分岐ターゲット命令を実行し、その間レーンマスク値’0’のレーンは止まって待機する。もし分岐の複数の層(例えば3層分岐)があるなら、プログラムは8回スプリットする必要があり実行効率はたったの12.5%である。これはマルチレーン・プロセッサの効率を減らし、あまり分岐の無い特殊プログラム用にしか使えない。本開示のスーパーSIMDモードは通常SIMDと異なり、複数レーンが同じプログラムを実行するが、各レーンはそれ自身の分岐決定と命令インデクス・メカニズムを持つ。各レーンは同じプログラムの異なるセグメントもしくは異なる分岐を実行することができる。よってプロセッサ・システムは複数分岐を実行するのにまだ100%の効率を持つ。
[225] 図13Dは本開示のスーパーSIMDの例である。この例において、各モジュールの構造と機能は図13Aのそれらと同様である。1つのスレッドの資源がスーパーSIMDオペレーションに用いられる。4つのトラッカーの指示のもとコラム相関モードにおいて、4つのIRBが同じ命令ブロックを記憶し、4つのレーンに命令を供給する。各レーンの対応するRFは異なるデータを記憶でき、また各レーンの対応するロード/記憶ユニットは異なるデータアドレスに読み書きできる。各レーンはそれ自身のデータを処理するから、各レーンの分岐決定を実行するのは、たとえレーンが同じ命令を実行しているときでも、同じではないかもしれず、4つのレーンが分岐ポイントの後のプログラムの異なる分岐を実行することに繋がる。このモードにおいては、各レーンはそれ自身のトラッカーとトークン・パッサーのもと、コラム相関モードにて動作し、プログラムを独立に実行し、よってマスク・レジスタを使ってそれぞれの分岐を交代で実行するSIMDプロセッサよりもずっと効率が良い。イントラ・レーン・バスとデータ依存チェックは用いられない。図13Dのように設定されたプロセッサ・システムは、高効率のSIMDプロセッサとして機能することができる。
[226] 図13Eは本開示のスーパーMISDの例である。この例において、各モジュールの構造と機能は図13Aのそれらと同様である。4つのトラッカーの指示のもとコラム相関モードにおいて、4つのIRBが異なる命令ブロックを記憶し、異なる命令を4つのレーンに供給する。4つのロード/記憶ユニットのうち1つだけが動き(例えば図13Eの1841)、その間他の3つはシャットダウンする。1841によって取ってこられたデータは、イントラ・レーン・バスを経て全4レーンのRFにロードするために送られる。全4レーンによって生成された結果データもまたイントラ・レーン・バスを経て1841へ送られデータキャッシュへ記憶される。データ依存チェックは用いられない。4つのレーンのそれぞれが、同じデータソースに対して異なるプログラムを実行し、MISDプロセッサとして機能する。
[227] 図13Fは本開示のMIMDの例である。この例において、各モジュールの構造と機能は図13Aのそれらと同様である。1つもしくは両方のスレッドの資源がMIMDオペレーションに用いられる。4つのトラッカーの指示のもとコラム相関モードにおいて、4つのIRBが異なる命令ブロックを記憶し、異なる命令を4つのレーンに供給する。各レーンの対応するRFは異なるデータを記憶でき、また各レーンの対応するロード/記憶ユニットは異なるデータアドレスに読み書きできる。イントラ・レーン・バスとデータ依存チェックは用いられない。このようにして、4つのレーンはそれぞれのデータに対して互いに独立に異なるプログラムを実施し、MIMDプロセッサの機能を実現する。
[228] 図13Gは本開示のILPの例である。この例において、各モジュールの構造と機能は図13Aのそれらと同様である。1つのトラッカーの指示のもと対角相関モードにおいて、4つのIRBが同じ命令ブロックを記憶し、同じプログラムの連続した命令を4つのレーンに供給する。データ依存チェックが用いられる。もし4つの命令間にデータ依存が無いならば、IRB1801、1803、1805、1807はそれぞれ4命令の第1、第2、第3、第4を出力し、4発行を実現する。もしデータ依存があるならば、依存関係を持つ命令はもう一度次のクロック・サイクルにて発行されなければならない。イントラ・レーン・バスが、各レーンの実行結果を全4レーンのRFへ送るのに用いられる。従って、各実行ユニットは、そのオペランドを共有RFからのそれであるように受け取る。各レーンの対応するロード/記憶ユニットは異なるデータアドレスに読み書きできる。このモードにおいて、マルチレーン・プロセッサはマルチ発行ILPプロセッサとして機能する。
[229] 図13Hは本開示のTLPの例である。この例において、2つのセットのスレッド資源QとR、それらに対応する4レーンがあり、全部で8つの仮想マシンを構成する。IRBは命令を、スレッドの待機/実行状態にもとづいて、その対応するレーンに出力し、そしてスレッドに対応するRFがデータを呼び出しまたは記憶するのに用いられる。例えば、レーン1811が、行記憶ユニット1841がデータをデータキャッシュから読み出し、1つのスレッドのもとレジスタ・ファイル1821に記憶するのを、待っているとき、IRB1861は他のスレッドの命令を実行のためにレーン1811へ供給する。前スレッドの中間実行結果はRF1821に記憶されるが、新しいスレッドの結果は1831にあり、レーン1811は各スレッドの命令を正しく実行できる。従ってそれはTLPプロセッサ、例えばGPU、として機能できる。
[230] 複数スレッドは他の前述のモードと共に共存できる;例えばマルチスレッドSIMDプロセッサ;あるいは1つのスレッドはILPで他のスレッドはSIMD。異なるスレッドは、ストレージ要素を共有しないから、互いに干渉しない。本開示のプロセッサ・システムはマルチスレッド・スーパーSIMDとして設定できる。各レーンが独立の命令フロー制御を持つから、分岐を持ったプログラムを実行するうえで、GPUよりも、ずっど効率が高い。それはマスキングを使ったGPUのように異なる分岐を交代で実行する必要がない。
[231] 図131は本開示の”ソフトワイヤー”の例である。1つのスレッドがこの実施形態で用いられる。異なる命令を含むが恊働している異なるレーンのIRBとIRBは行相関モードのもとにある。代わりに、同じ命令を含む異なるレーンのIRBとIRBは対角相関モードのもとにある。両方のケースにおいて、命令依存チェックはオフにされ、イントラ・レーン・バスは動いている。特別なのは、プログラミングがRead After Write方式で、命令の少なくとも1つのオペランド・レジスタが前の命令の宛先レジスタである。例えば:
[232] LD R3 R2 #0
[233] AND R5 R4 R3
[234] MUL R7 R6 R5
[235] SD R7R8 #0
[236] 本例において、定数はRFのレジスタR2、R3、R6、R8に記憶される。最初の命令はデータを(R2)+0(例えばストリームデータ)のI/Oアドレスからロードし、オペレーション結果は(R8)+0のI/Oアドレスへ戻され記憶される。この実施形態においては、依存チェックはオフにされているので、4つの命令が同じクロック・サイクル内で発行されうる。しかし各命令のオペランドは実際、前のクロック・サイクルの前の命令によって生成されている。例えばAND命令のオペランドR3は前のクロック・サイクルのLD命令によってロードされている。結果は実行ユニット間のリンクである。IRBのクロックは、実行ユニットとイントラ・バスへのクロックが正常に動いている間、止められる。その結果、各レーンは同じ命令を繰り返し実行し、命令ユニットは命令と共にソフトワイヤーされる。ソフトワイヤーとは、宛先レジスタ・アドレスとオペランド・レジスタ・アドレスとのペアリングとして定義され、イントラ・レーン・バスとバイパス・ロジックによって設定される。データ転送の全てはバスとバイパス・ロジックを通すので、このケースにおいては対応するRFの書き込みは、電力を保存するために、使用禁止にされうる。このソフトワイヤー方式は大規模科学技術計算、例えば高速フーリエ変換(Fast Fourier Transform : FFT)、にとって良い。
[237] 本記述において、命令ループは、プロセッサの実行効率を向上させるために、並列オペレーションとして展開することができる。プログラムが実行されているとき、通常、直列で実行される命令と並列で実行される命令が交互にある。よくある並列実行はループの形式である。ループは何千回も実行されうる。通常、ループの間に単一もしくは複数の直列命令がある。マルチレーン・プロセッサにおいて、直列命令を実行するために、単一発行において単一のレーンを、もしくはILPモードにおいて複数のレーンを、割り当てることができる;しかし複数のレーンを割り当て 、ループを並列実行のために展開して、実行効率を向上させることができる。
[238] この目的のため、命令の新しいタイプ、LOOP命令が定義される。LOOP命令は命令ループの中の複数の反復を展開し、それを複数のレーンへ並列実行のために配り、実行されるループの数を減らして実行時間を短縮する。図14AはLOOP命令によるレーン分配の例である。LOOP命令は以下のフォーマットを用いる:ループ命令タイプ(LOOP)、共有レジスタ・アドレス(一般reg)、基底レジスタ・アドレス(基底reg)、ステップ長(ストライド)、幅(Width)、深さ(Depth)。これらのうち、LOOPは命令タイプ、一般regはループが共有するパラメータのレジスタ・アドレス(パラメータは反復中に変化しない)、基底regはループにおいて用いられる基底レジスタのアドレス、ストライドは反復毎に変化するパラメータの2つの反復間の違い、Widthはループの数、Depthはループの中の命令の数である。ストライド、Width、Depthは即値の形式でありうる。あるいは、ストライド、Width、Depthの値はRFに記憶され、そしてLOOP命令はLOOP、一般reg、基底reg、そしてストライド、Width、Depthのレジスタ・アドレスのフォーマットを取りうる。またそれは一部のパラメータを即値、一部のパラメータをレジスタというフォーマットで取り得る。複数の異なるストライド、基底reg、一般regがまた、複数のパラメータの反復パターン、複数の基底アドレス、複数の共有パラメータ、を持つ命令ループのために用いられる。
[239] 以下の命令の例を参照されたい。
[240] LOOP R2 R1 #-4 #256 #3
[241] LD R3 R1 0
[242] MUL R4 R3 R2
[243] SD R4 R1 100
[244] ループの意味は前術定義され、R2は一般reg、R1は基底reg、ストライドは-4、Widthは256(ループ数)、Depthは3(ループ命令自体以外に、ループは3命令を持つ)。他の命令の第一コラムは命令タイプで、LDはロード、MULは掛け算;SDは記憶;第二コラムは記憶命令のための宛先レジスタ・アドレスかソース・レジスタ・アドレス;第三コラムは第一ソース・レジスタ・アドレスかロード記憶命令の基底レジスタ・アドレス;第四コラムは第二レジスタ・アドレスか即値である。
[245] 図14Aは複数レーンの3レーン2100、2101、2102とコントローラ2150を示す。バス2140、2141、2142等はレーン間でデータを移送する。命令はレーンを制御してデータをバスに置く、またはレーンを制御してバスからデータを受け取る。最左レーン2100はLOOP命令を実行する前に命令を直列で実行する(今後このレーンはリード・レーンと呼ばれる)。LOOP命令実行の前はR1の値は1024、R2の値は138である。最大31レーンがこのスレッドのために割り当てられる。レーン番号レジスタ2110、2111、2112、….、があり、各スレッドのための各レーンにレーン番号を記憶する。リード・レーン番号は’0’であり、他の後続するレーンのレーン番号は左から右へ、1、2、3 …である。全てのレーンはレーン番号レジスタに繋がった検出器を持ち、もし’0’が検出されたら、レーンはリード・レーンとして検出される;もし’0’以外の番号が検出されたら、レーンは後続レーンとして検出される。
[246] ここで、走っているレーン2100とは別に、 全31レーンのIRB2120、2121、2122は全て同じ命令を持ち、他のレーンはイネーブラ信号2160の下では動かない。或は、命令はIRB2110の中にのみあり、IRB2111、2112にはない;レーン2100がLOOP命令をデコードするときのみ、またはLOOP命令が先に検出されたとき、IRB2120にある命令と同じものがIRB2111、2112へ充填される。
[247] アクティブ・レーン2100のデコーダは、LOOP命令をデコードするときに、マルチレーン実行リクエストを割り当てユニットへ送り、そして命令は図7の前処理プロセッサを用いてレーン割り当てのために前処理される。割り当てユニットは31のレーンを、リクエスト幅(ここでは256)とこのスレッドに許されたスレッドの最大数にもとづいて、このループを実行するために割り当てる。割り当てユニットは、要求された幅が許されたレーンの最大数よりも小さいならば、丁度充分なだけの数のレーンを割り当てる。この時点で、ループ命令と後続命令は全レーンのIRB2110、2111、2112、…の中にある。
[248] ループコントローラ2150はループ命令の実行を制御するのを助ける。2150はマルチプレクサ2152、2155、2163、レジスタ2153、2154、2162、2165、減算器2156、デクリメンタ2164、デコーダ2157、ループ決定ブロック2169から構成される。減算器2156は減算された結果が0より大きいかどうかを検出し、その結果を信号2158として用いてマルチプレクサ2155を制御する。デクリメンタ2164はインプットから’1’を引き、結果をレジスタ2165へ記憶するために送る。それはまた結果が’0’のとき信号2166を検出し送り出す。
デコーダ2157はバイナリ数をレーン・イネーブル信号へデコードする。ループ決定ブロック2169は信号2158と信号2166をインプットとして取り、信号2167と信号2168を生成して命令フローを制御する。デクリメンタ2164とレジスタ2165は、ループ内の命令実行をカウントする、カウンタを形成し、そしてループの終了を示して、レーンにループの始めの実行へジャンプして戻るように信号2166によって指示する。信号2166はまたレジスタ2153と減算器2156に、次のサイクルのカウントに入るよう指示する。レジスタ2165へのクロックはレーンのクロックと同期している。減算器2156とレジスタ2153はサイクル数を数えるカウンタを形成し、ループ・エグジットのタイミングを制御し、さらに最後のサイクルのレーン数を計算する。
[249] コントローラ2150はループ命令を検出したときループ・モードに入り、そのデコードと制御ロジックはマルチプレクサ2152を制御し、レジスタ2153はループ命令のWidth2151(この場合256)へラッチする。同時に、スレッドに割り当てられたレーン2170の数(この場合31)は2154にラッチされ、Depth2161が2162にラッチされる。減算器2156はそれからレジスタ2154の値をレジスタ2153の値から差し引き(ここでは、256-31==225)、結果が0より大きいことを検出する。検出結果2158はマルチプレクサ2155を制御し、レジスタ2154の値(31)をデコーダ2157へ送る。デコードの後、2157からのバス2160は全レーン(レーン0-31)を有効化する。コントローラ2150はまたLOOP命令の後の最初の命令を分岐ターゲットとしてセットする。サイクル決定ユニット2169は信号2158と2166をインプットとして取り、信号2167と信号2168を生成する。信号2158が減算器2156の結果が0より大きいことを示し、信号2166が減算器2164の結果が0に等しいことを示すとき、信号2167は有効である。ここで2167はレジスタ2153を制御して更新し、命令バッファ2120、2121、2122、…を制御して分岐ターゲットへのジャンプを実行する。他の状況において2167は無効であり、その場合2153を更新せずまた分岐を実行しない。信号2158が減算器2156の結果が0より大きくないことを示し、信号2166が減算器2164の結果が0に等しいことを示すとき、信号2168は有効である。この時点で2168は各レーンとコントローラ2150を制御しループから脱出し、単一もしくは複数レーンにおいてILPフォーマットの直列命令を実行する準備をする。
[250] 以下の例は前述のLOOP命令の実行を描写する。LOOP命令が実行されるとき、リードレーンはデータを発信し、パッシブレーンはデータを受け取る。リードレーン(レーン0)がLOOP命令をデコードした後、R1(R1[0])のレジスタ値(1000)が読み出され、データバス2140へ置かれる。デコードしているループ命令に続くレーンはデータバスから(R1[0])を読み出し、乗算加算操作(R1[n])= (R1[0])+n*ストライド を実行し、実行結果は対応するレーンのR1レジスタへ書き込まれる。ここで、nはレーン番号レジスタに記憶されているレーン番号で、(R1[n])はn番目レーンのレジスタ値(レーンの中のR1レジスタ値は左から右へ:1000、996、992、988 …. 880)を表す。レーン0は乗算操作、中間値=n *ストライド、を行い、その値はレーンの中間レジスタ2130、2131、2132、…. へバス2142を通して記憶される。同時に、ループ命令の一般Reg値R2にもとづいて、参照レーンのR2値(R2[0])は他の30レーンのR2にデータバス2141を通して記憶され、値は’138’である。この場合、LOOP命令は実行され、レーンは並列実行サイクルの反復のための準備ができる。
[251] 全31レーンが命令LDを実行するとき、各レーンがオフセット値(ここでは0)と基底Reg R1の値をロード・アドレスとして合計し、データをメモリから取りそれらを各R3レジスタへ記憶させる。同時にデクリメンタ2164はレジスタ2162のDepth値(3)を1減らし、そしてレジスタ2165に記憶させる(ここで値は2)。各レーンがMUL命令を実行するとき、各レーンのR3レジスタのデータとレジスタR2の値(138)は掛け合わされ、結果はR4レジスタへ記憶される。同時に、デクリメンタ2164はレジスタ2165の値を減らし、そしてそれをレジスタ2165(値は1に等しい)へ戻す。各レーンがSD命令を実行するとき、R4レジスタの値はメモリへ記憶される。メモリ・アドレスはオフセット(100)と各レーンの基底Reg R1の値(1000、1096、1092、1088、… 980)との合計である。同時にデクリメンタ2164はレジスタ2165の値を1減らす(今は0)。このときデクリメンタ2165は、結果が0であるが減算器2156の結果は0より大きいことを検出し、従って信号2167は有効である。信号2167はIRB2120、2121、2122、… に分岐を実行し、LD命令へポイントする(前は分岐ターゲットセット)よう指示する。同時に信号2167は減算器2156の出力(ここでは225)を制御しマルチプレクサ2152を通してパスし、レジスタ2153を更新する。信号2167はまた各レーンのR1レジスタを制御し、中間値(ここでは-124)を加え、そしてR1へ記憶させる。そして各レーンのR1値はそれぞれ、876、872、868、864、…、756である。このとき、2166の制御のもと、レジスタ2106のDepth(3)はデクリメンタ2164へマルチプレクサ2163を通して送られる。減算器2156の検出結果は0より大きく(225-31=194)、2158によってパスされたマルチプレクサ2155を制御する結果はレジスタ2156の値(31)を選び、それはデコーダ2157によってデコード(0-30有効)され、全31レーンを次のループを実行するように有効にする。次のループのための準備が今整っている。次のサイクルはLD命令から出発し、オペレーションは前サイクルと同じである。8つのそのようなサイクルが全部で実行される。
[252] 従って、9番目のサイクルの始めに、レジスタ2153に記憶されている値は8(256-8*31=8)である。減算器2156の結果は-23(8-31=-23)であり、結果検出器2158はこれが0より小さいことを示す;信号制御マルチプレクサ2155はレジスタ2153に記憶されている残りのWidth’8’を選ぶ。これらはデコーダ2157によってレーン0-7のイネーブル信号へデコードされる。9番目のループにおいて、レーン0-7のみがサイクル命令をイネーブル信号のもと実行し、レーン8-30は無効なイネーブル信号の制御のもとにあり動作しない。
[253] 9番サイクルの終わりまでに、信号2158(減算器2156の結果、0より小さい)と信号2166(デクリメンタ2164の結果、0に等しい)は一緒に信号2168を有効にし、信号2167を無効にする。有効な信号2168はコントローラ2150をしてサイクル状態から脱出させる。有効な信号2168はまたレジスタ2154を1にリセットし、フォローアップ命令をレーン0にてのみ実行されるように指示する。有効な信号2168はまたレーン7のR1値を制御してレーン0のR1レジスタへ書き戻されるようにする、もしくはレーン0にてオペレーション(R1[0])=(R1[0])+残りの幅*ストライド を実行し、(R1[0])がサイクル実行の最終状態を反映するようにする。無効シグナル2167は分岐をとらないようIRBを制御し、そしてサイクル後の次の命令がレーン0で正常に実行される。
[254] LOOP命令機能は既存の命令を用いて実現できる。そのテクニックは既存の命令ループの中からLOOP命令の鍵となる要素を抽出し、そしてそれらをループ・コントローラ2150へ送る。そして命令ループの中の複数の反復が展開され、並列で実行されループ数を減らす。これは以下のコードと図14Aによって説明される。
[255] Entry: LD R3 R1 0
[256] MUL R4 R3 R2
[257] SD R4 R1 100
[258] SUBS R1 R1 #4
[259] BNZ Entry
[260] この実施形態と前述のLOOP命令例は同じ機能を実現する。ループに入る時点で、前のようにR1値を1024、R2値は138と仮定する。最初にループが実行されるとき、ループ・コントローラ2150はこれがループであることを知らない、よってループの命令は直列で実行される。BNZ命令を実行するとき、検出ロジックは、その命令タイプと負アドレス・オフセットによって、それがバックワード分岐命令であることを判断する。同時にDepth5(アドレス・オフセットの絶対値)が決定される。ロジック検出はまた分岐決定基準をこの命令から抽出する(分岐命令の前の命令の実行結果が’0’か否かによる)。このループの2回目の実行において、検出ロジックはソース・レジスタと宛先レジスタ・アドレスの記録と比較を始め、要素を抽出する。R2はループの宛先レジスタではなく、そしてそれは一般レジスタとして定められる。R1はLD命令とSD命令の基底アドレスであり、基底アドレスとして定められる。SUBSは分岐命令の前の分岐決定を更新する最後の命令で、そのオペレーションは4を引くこと、従ってストライドは-4である。2回目のループの終わりにおいて、ループ・コントローラは、ストライドと各レーン番号にもとづいて、各レーンを制御し、結果を計算してR1レジスタに記憶させる(各レーンのR1レジスタの内容はそれぞれ1016、1012、1008、---、896)。レーン0のR2の内容はレーン1-30のR2レジスタへ記憶される。中間値(31*-4 = -124)はレーン0によって、割り当てられたレーンの数とストライドに応じて計算され、中間値は各レーンの中間レジスタに記憶される。オペレーションの残りは前述されたLOOP命令実施形態と同様である。
[261] 命令の他のタイプのループ要素、例えば分岐条件の1つが分岐命令によって生成される、もまた抽出されうる。 例えば:
[262] Entry: LD R3 R1 0
[263] MUL R4 R3 R2
[264] SD R4 R1 100
[265] SUB R1 R1 #4
[266] BNZ R1 Entry
[267] 最初の3命令は前件の例と同様で、SUB命令は引き算のみを実行し、分岐条件を作り出さない。BNZ命令は、R1値を0と比べ、それがNRZの条件を満たすか判断する(もし結果が0でなければジャンプ)。この例において、R1は直列で実行される最初のループの終わりまでに、R1は基底レジスタとして決定される。さらなるオペレーションは前回と同様である。
[268] この実施形態において、ループ分岐の終わりは、各自の分岐決定の結果として、各レーンのTAKEN信号によって決定され、サイクル・コントローラ2150の深度コントローラを不必要とする。サイクル・カウンタはここで主に最後のサイクルの有効レーンの数をカウントする。サイクルを脱出するタイミングはサイクル・カウンタを通して制御されうる。もしくは最後のサイクルの最後のレーンのTAKEN信号によっても制御されうる。
[269] 図14Bのサイクル・コントローラ2180を参照されたい。構造はコントローラ2150のループ・コントローラと同様であるが、しかしコンバータ2181が追加される。コンバータ2181は基底アドレス2182(並列ループに行くとき、R1値は1024-2*4=1016)を、レジスタ2153にラッチされたWidth2151(値は1016/4=254)へ変換する。コンバータは割り算を実行する(基底アドレス/ストライドのように。それは基底アドレスをストライド量だけシフトすることによって、もしくは基底/ストライドのテーブルをチェックすることによっても得られる)。割り当てられたレーンの数は前と同じくレジスタ2170へラッチされる。加えて、この実施形態の減算器2183は前例のように引き算を実行するが、決定ロジックは、0より大きいという条件だけでなく、命令セットの許可された分岐決定の全てに対して、決定をする。従って命令の分岐タイプ(例えばNRZ)とレーンによって生成された分岐条件もまた決定のために2183へ送られる。もしデコーダ2157の出力が負であれば、バス2160上の出力はレーン0を有効するが他のレーンを無効にする。よってシステムはループの並列実行の準備ができる。
[270] 31レーンのそれぞれが交代で、ループに入るときに、LD命令(ここで各レーンのR1内容は前述のように異なる)、MUL命令、SD命令、SUBS、NRZ命令を実行する。各レーンの分岐決定ロジックはそれ自身の分岐決定を行い、自身のTAKEN信号を送り、信号は各レーン2185、2186、2187、…のANDロジックへ送られる。各レーンの分岐信号の制御のもと(分岐信号はレーンが現在分岐命令を実行していることを示し、分岐が取られるか否かに関わらず、分岐命令を実行しているときは、分岐信号は’1’である。)、中間値-124がR1の内容にに追加され、R1にラッチされもどされる(例えば、オペレーション後の各レーンのR1値はそれぞれ892、888、884、…、772)。同時に’1’分岐信号はレジスタ2153を更新し、よって内容は今223で、減算器/コンパレータ2183の出力は’192’であり、比較出力2184はまだ’1’、コントロール・マルチプレクサ2155はレジスタ2154の内容をデコーダ2157でデコードするために選び、イネーブル信号2160を送って全31レーンを有効にする。‘1’信号2184は、各レーン2185、2186、2187、…. のANDロジックを有効にし、各レーンのTAKEN信号がそれぞれの分岐決定ロジックからIRB2120、2121、2122、….へ移されるのを可能にする。それぞれのIRBにおいて、トークンは対応するトラック・テーブルによって指定された分岐ターゲットへパスされ、ループの最初のLD命令を2回目において、実行し始める。
[271] 9回目のサイクルの始めにおいて、レジスタ2153の値は6(254-8*31=6)で、減算器2183の結果は-25(6-31=-25)、結果は0より小さいと検出される;信号2184は’0’でマルチプレクサ2155を制御して、デコーダ2157によってデコードされた、レジスタ2153に記憶された残りのWidth8を選び、結果として生じたイネーブル信号がレーン0-5を有効にする。9回目のループにおいて、レーン0からレーン5のみがループ命令を実行し、レーン6-30は有効にされていないので動作しない。
[272] 9回目のループの終わりにおいて、’0’信号2184は各レーン2185、2186、2187、…. のANDロジックの出力が’0’になるようにし、IRBを制御して分岐しないようにする、しかしループの外の命令(BNZの後の命令)の実行を開始し、コントローラ2180がループ状態を抜け出すようにする。レジスタ2154は’1’にリセットされ、後続する命令がレーン0でのみ実行されるよう指示し、レーン5のR1値をレーン0のR1レジスタへ書き戻す。かわりにレーン0は掛け算/足し算操作 (R1[0]) = (R1[0]) + 残りの幅*ストライド を実行し、(R1[0])はループ実行の最後における状態を反映する。信号2184が’0’であるとき、分岐信号はプロセッサが、最後の有効レーン(2157のインプットで決定される、ここではレーン5)の基底アドレスR1の内容(R1[5])を転送し、レーン0のR1へ記憶(R1[0])するようにする。
[273] 各チャンネルに既存の分岐決定ロジックを用いて、サイクル数に応じて決定するのではなく、サイクルを制御することが可能である。図14Cにおいて、サイクルの最後(最右)のレーンからのTAKEN信号を選ぶマルチプレクサ2155の出力2190を、制御信号2184として用いて、ANDゲート2185、2186、2187、…. を制御してTAKEN信号を有効にする。この実施形態において、出力2190は最初の8サイクルにおいて’31’である。これはレーン30のTAKEN信号を選んで、前述のANDロジックを制御する2084とする。8サイクルの全てにおいて、レーン30の分岐決定は全て’分岐を取る’で、従ってレーン30のTAKEN信号は’1’であり、それはバス2184に置かれ、各レーンが分岐を取り次のサイクルに入るように制御する。9回目サイクルにおいて、2090の値は’6’で、レーン5のTAKEN値は信号2184へパスされるように選ばれる。9回目サイクルの終わりにおいて、レーン0-4のTAKEN値は’1’で、しかしレーン5のTAKEN値は’0’である。レーン5のTAKEN値は信号2184へパスされ、各IRB2120、2121、2122、….全てがBNZの後の命令を出力しループを抜けるようにする。信号2184はまたR1[5]値をR1[0]に入れるのを制御する。この実施形態においては、サイクル・コントローラ2180の主な機能は、必要とされるレーンにおいて実行を制御しているサイクルのために割り当てられた数を提供することである(サイクルの終わりにおいて不必要なレーンの実行をストップし、誤データを生み出すのを防止する);もう一方で、それはまたサイクルの最後のレーンのトークン信号をサイクル・コントロール(最後のレーンの分岐決定は正しい決定である)として選ぶ。
[274] 実装の他の方法としては、基底アドレス値2181をサイクルの始めにおいてレジスタ2153へ記憶し(割り算やシフトやテーブルチェックを必要としない)、レーンの割り当て数2170をストライドによって掛け算し結果を2154へ記憶させる、ことができる。最後の例においては、数254(基底アドレス/ストライド=幅)-31(割り当てられたレーン数)である。この例においては、1016(基底アドレス)- 124(割り当てられたレーン数*ストライド =中間値)である。この操作の結果は調整される必要がある。この例においては、信号2190の値は前例のそれと比較され、’ストライド’倍大きく、よってコンバータがメモリ2155の出力ポートへ追加される必要があり、コンバータはマルチプレクサ2155の出力を’ストライド’で割ったものを選んで2190を生成する。コンバータはテーブルもしくはシフト操作として実装されうる。
[275] 前に述べられたように、ループ命令と通常のバックワード分岐命令は交換できる。通常の分岐命令の利点はソフトウェア互換性で、ループ命令の利点はより高い実行効率である。以下の実施形態はループ命令を用いるが、しかし通常の分岐命令の組み合わせによって代替されうる。
[276] もしループ命令のストライドが’0’なら、それは各レーンが同じデータを記憶するようにする。それはレーン・プロセッサが動作モードをスイッチする、例えばSIMD、MISD、MIMD間をスイッチする、ことを可能にする。MISDを例にとると、以下の命令はこのプログラムの最初に位置する。ループ命令はオペレーション・タイプ、一般Reg、基底Reg、ストライド、幅、深さ、のフォーマットを持つ。
[277] LOOP R2 R1 #-4 #3 #3
[278] LD R3 R1 0
[279] LD R11 R1 66
[280] LD R12 R1 66
[281] ループ命令を実行する前、R1値は前の命令によって1024にセットされ、R2値は138にセットされ、R4値は621、R5値は2148である。ループ命令を実行するとき、割り当てユニットはLOOP命令の要求に応じて3レーン;レーン0、1、2を割り当てる。各レーンのR1値は(前例と同様)それぞれ1024、1021、1016である。最初のLD命令を実行するとき、 各レーンは(R1)+0(オフセット)にもとづいて各自のデータを取りに行き、3片のデータが各レーンのR3レジスタに置かれる。最初のLD命令の実行後、(R3[0])=1、(R3[1])=0、(R3[2])=-1。第二、第三のLD命令も実行され、異なるデータが3レーンのR11とR12レジスタに記憶される。幅が3であるから、3つのレーンがあり、プログラムは第三LD命令に辿り着いたときループを脱出し、それから次の命令の実行を続ける:
[282] LOOP R4 R5 #-0 #3 #256
[283] LD R7 R5 0
[284] LD R8 R5 82
[285] LD R9 R5 116
[286] ……
[287] ループ命令のこのセグメントにおいて、ストライドが0であるから、3レーンの基底R5は同じ値(2148)である。従って、最初のLD命令を実行するとき、全3レーンは全て同じメモリ・アドレス2148からデータをロードし、各レーンのR7へデータを記憶する。第二LD命令を実行するとき、全3レーンは全て同じメモリ・アドレス2230からデータをロードし、各レーンのR8へデータを記憶する。それから、以下の分岐命令が実行される(レーンはまだサイクル状態にあることに注意)。
[288] BGT R3 entry0
[289] BEQ R3 entry1
[290] BLT R3 entry2
[291] Entry0: MUL R21 R7 R2
[292] ……
[293] SD R21 R1 500
[294] NOP
[295] Entry1: AND R21 R7 R8
[296] ……….
[297] SD R21 R1 500
[298] NOP
[299] Entry2: SUB R21 R7 R9
[300] ………
[301] SD R21 R1 500
[302] NOP
[303] 本記述において、BGT命令の意味は、レジスタR3値が0より大きいとき、エントリ0へ分岐するということ;BEQ命令の意味は、レジスタR3値が0に等しいとき、エントリ1へ分岐するということ;BLT命令の意味は、レジスタR3値が0より小さいとき、エントリ2へ分岐するということ。3レーンのR3値は同じではないから、レーン0はエントリ0コードを実行し、レーン1はエントリ1のコードを実行し、レーン2はエントリ2のコードを実行する。同じデータ、例えばR7、R8、R9のデータに対して、各レーンは異なる操作を実行し、結果をそれぞれのメモリ・アドレスに書き戻す。このようにして、MISDプログラムを、直列プログラムとして普通に始まりしかしMISDモードで実行する1つのプログラムとして、書くことができる。
[304] 同じ命令しかし異なるパラメータを持ったMISDに対して、非ゼロ・ストライドを持ったLOOP命令が各レーンに異なるパラメータを読み込むのに用いられる;それからゼロ・ストライドのLOOP命令が同じデータをレーンに読み込むために用いられる。それから、同じオペレーションを同じデータに対して、異なるパラメータにおいて実行し、結果は異なるメモリ・アドレスに記憶される。例えば
[305] LOOP R2 R1 #-4 #16 #3
[306] LD R3 R1 0
[307] LD R11 R1 66
[308] LD R12 R1 78
[309] LOOP R4 R5 #-0 #16 #256
[310] LD R7 R5 0
[311] LD R8 R5 82
[312] LD R9 R5 116
[313] MUL R21 R7 R11
[314] ADD R21 R21 R12
[315] SD R21 R5 56
[316] ……
[317] ここで、最初の非ゼロ・ストライドを持ったLOOP命令は異なる基底アドレスとパラメータを各レーンに読み込む。第二LOOP命令は同じデータもしくは一般パラメータを読み込む。オペレーションは同じデータに対して、同じまたは異なるパラメータにおいて並列に実行される。各レーンの結果は異なるメモリ・アドレスに記憶される。まとめると、 各レーンが異なるパラメータもしくはデータを必要とするとき非ゼロ・ストライドLOOP命令を用いて、各レーンが同じパラメータもしくはデータを必要とするときはゼロ・ストライドLOOP命令を用いる。
[318] 本開示のマルチレーン・プロセッサは複数のモードで動作でき、テーブル1がそれらの幾つかをまとめている。テーブルの各行はモードを表し、各コラムは鍵となるパラメータの幾つかの設定を表す。テーブルの中で、全部で11のモードがあり、これらのうちSISDは単一命令ストリーム、単一データ・ストリームのモードであり、SIMDは単一命令ストリーム、複数データストリームのモードであり、このモードにおけるマルチレーン・プロセッサはベクター・プロセッサ・オペレーションをエミュレートすることができる;スーパーSIMDは本開示の独自のオペレーションモデルであり、オペレーションはほぼSIMDのそれと同じであるが、各レーンは同じプログラムの異なる命令を実行できる;MISDは複数命令ストリーム、単一データ・ストリームのモードである;MIMDは複数命令ストリーム、複数データ・ストリームのモードである;ILPは命令レベル並列モードである;SWLはソフトウェア・ワイヤード・ロジック・モードである;LOOPは複数レーン・プロセッサがLOOP命令を実行するときのモードである;STLPは単一レーン複数スレッド・オペレーション・モードである;MTLPは複数レーン複数スレッド・オペレーション・モードであり、これらのモードの複数レーン・プロセッサはGPU操作をエミュレートすることができる;SMTは同時複数スレッドモードで、それはモードのミックスであり、マルチレーン・プロセッサは通常このモードで走る。
[319] テーブルは全部で8つの設定パラメータのコラムをもつ。これらのうち、スレッド・コラムは特定モードにおいて要求される最小スレッド資源のことを意味し、このコラムのパラメータは’単一’スレッドか’複数’スレッドかである。プログラム・コラムは異なるレーンが同じプログラムを実行するかを示し、設定は’同じ’もしくは’異なる’である。IRBコラムは異なるレーンの命令リード・バッファ間の相関関係を示し、’コラム’設定は各レーンのIRBは全てリードコラムであり、各自のトラッカーのもと独立に動くことを示す;’行’とはモードが1つのリードコラムを持ち、少なくとも1つの後追いコラムをもち、リードコラムはトラッカーのもと独立に動き、後追いコラムはリードコラムに従い、そして後追いコラムとリードコラムから出力された命令は同じプログラムの全く同じ命令であることを表す;’対角’はモードが1つのリードコラムと少なくとも1つの後追いコラムを持ち、リードコラムはそのトラッカーのもと独立に動き、後追いコラムはリードコラムに従い、そして後追いコラムの命令はリードコラムの命令に続く命令であることを表す。RFコラムは、同じスレッドの異なるレーンのRFが同じデータを持つかを表し、’同じ’もしくは’異なる’に設定される。イントラ・レーン・バス・コラムはバスがレーン間データ交換に用いられるか否かを表し、’Yes’もしくは’No’に設定される。データコラムは、異なるレーンのリード/記憶ユニットからのデータが同じか否かを表し、’同じ’もしくは’異なる’に設定される。
[320] テーブル1:11はマルチレーン・プロセッサの作業モードである。
[321] さらに、もし開示と整合する型でもっと多くのレーンがプロセッサ・システムにある場合、レーンはグループに分割されうる。これらのグループのそれぞれは1つの特定のプロセッサ構造に設定され、そして全てのこれらのグループは同時に動作する。本記述においは、異なるレーン間さらに同じレーンの異なるスレッド間で、異なるプロセッサモードに設定し動作させることが可能である。割り当てユニットは、プログラムのあらかじめ決められた優先順位とプログラムの資源に対する必要度に応じて、動的にレーンと資源を割り当て、資源を有効に使う。これは同時に上テーブルの同時マルチスレッド・モード(SMT)である。図15Aは開示された実施形態と整合する例示的な、プロセッサ・システムにおけるレーンの動的設定である。説明の簡明のため、図15はトラック・テーブル1901、命令キャッシュ1903、データキャッシュ1905、16レーン、そして対応する16トラッカーのみを表示する。
[322] この実施形態において、各レーンは4スレッドをサポートする。よって4スレッドをスイッチすることによって実行される命令をスイッチすることが可能である。しかし、1つのスレッドだけが一度につき実行されうる。従って、IRB、RF、DRBはすべて4つの同一の部品を持ち、それぞれ4つのスレッドに対応する。特に、レーン1941を例にとると、これは1つの実行ユニット1909しか持たない。しかし、IRB1911、RF1921、DRB1931はスレッドQに対応し、IRB1913、RF1923、DRB1933はスレッドRに対応し、IRB1915、RF1925、DRB1935はスレッドSに対応し、IRB1917、RF1927、DRB1937はスレッドTに対応する。従ってプログラムは各レーンの各スレッドに割り当てられ、プロセッサ・システムの実行効率を、優先順位とプログラムの並列処理度合いに応じて向上させる。
[323] 例えば、実行されるべき10のプログラムがあり、優先順位に応じて高い方からリストする:プログラムA、B、C、D、E、F、G、H、I、そしてJ。一般的に、より多くの計算資源(レーン)がより高い優先順位のプログラムに割り当てられる。加えて、より高い並列処理の度合いを持つプログラムへより多くのレーンが割り当てられる。並列処理とは、ここでは、同時に実行されうる連続した命令群、もしくは並列実行可能な命令(例えばループ命令)へ分割可能な命令、のこと。図15Bは、各レーンにプログラムを割り当てる割り当てユニットの、スレッド資源割り当てテーブルの例である。
[324] ここで割り当てユニットは、スレッド資源を異なるプログラムへ、スレッド資源、割り当てテーブル、プログラムの現在の資源に対する必要度、プログラムの準備状態(例えばデータが使えるか)、に応じて動的に割り当てる。この例において、プログラムAの優先度が一番高いので、1941から1956のQスレッドの16レーンが全てプログラムAへ割り当てられる。プログラムBはプログラムAに次ぐ優先度しかないので、1945から1956のRスレッドの12レーンがプログラムBのために割り当てられる。この例において、プログラムCはスレッドSのレーン1949から1952を占め、プログラムDはスレッドSのレーン1953から1954を占め、プログラムEはスレッドSのレーン1955から1956を占める。プログラムFはスレッドTのレーン1949から1950、プログラムGはスレッドTのレーン1951から1952、プログラムHはスレッドTのレーン1953から1954、プログラムIはスレッドTのレーン1955、プログラムJはスレッドTのレーン1956へ、1961に示されるように割り当てられる。各レーンのスレッド資源、例えばIRB、RF、DRBはスレッド資源テーブルにもとづいて配分される。
[325] スレッド資源割り当てテーブルは現在実行されているプログラムの数と同じ行数を持ち(この例では、プログラムAからJのために10行1990-1999)、各行は対応するプログラムのスレッド番号、リードコラムの位置そしてプログラムに割り当てられたレーンの位置を記憶する。このテーブルは全部で3つのコラムを持つ。1つのコラム1960は各プログラムの識別記号を記録する。コラム1961は各プログラムのリードコラムのスレッド番号と開始レーン番号を記録する。もう1つのコラム1962は、各行が16ビットバイナリ数で、コラム1961で示されたスレッドにおいて表されるプログラムのための、利用可能な行の位置を表す。‘1’はビットに対応するレーンをプログラムが使う権利があることを表し、’0’はプログラムがビットに対応するレーンを使う権利がないことを表す。この例において、リードコラムは利用可能レーンに位置する。例えば、1990行、1961コラムのテーブル・エントリはQ0で、プログラム(この例ではプログラムA)がスレッドQの資源を使い、リードコラムがレーン0から始まる利用可能レーンにあることを表す。行1990、コラム1962のテーブル・エントリの16ビットバイナリ数は’1111111111111111’である。コラム1961と1962の組み合わせは、この行によって表されたプログラムがQスレッドの全てのレーンを使え、リードレーンがこれらのレーンのいずれか1つにでも置かれうることを意味する。もう1つの例は、行1991コラム1961においてエントリがR4、コラム1962エントリが’0000111111111111’ で、プログラム(ここではプログラムB)がRスレッドのレーン4-15を使え、リードコラムが同レーン4-15のいずれか1つにでも置かれうることを表す。別の例では、行1992コラム1961においてエントリがS8で、1962エントリは’0000000011110000’で、プログラム(ここではプログラムC)がSスレッドのレーン8-11を使え、リードコラムが同レーン8-11のいずれか1つにでも置かれうることを表す。残りも類推によって理解されうる。記述の簡明のため、以下の説明においては、リードコラムは同利用可能レーンの最初のレーンに位置するもの、例えばQ0はリードコラムがレーン0にあることを表し、R4はリードコラムがレーン4にあること、S8 はリードコラムがレーン8にあることを表す、と仮定する。他の同様のテクニックもまた利用されうる。
[326] 全てのクロックサイクルにおいて、コラム1961のデータは全レーンのIRBへ送られ、それらは1961のデータを用いて実行の前にリードコラムの命令を取り、デコードした後、デマンド・フィードバック信号を送り返す。デマンド・フィードバック信号も16ビットバイナリ数で、その値は以下の意味を持つ:’0000000000000000’はプログラムが2クロックサイクル後にスレッド資源を必要としない(ここで命令は2サイクル前にプレデコードされると仮定する)、データが利用可能でない、などを表す;’1111000000000000’は正常な命令とデータが用意できていることを表す;’1111100000000000’〜’1111111111111111’はワイドな命令を表し(例えばループ命令のように)、バイナリ数は実行に必要なレーンを、最左レーン(リードレーン)から始まって表し、もし16レーン以上必要とされる場合は’1111111111111111’を送り返す。スレッド資源割り当てテーブルへ送り返されたデマンド・フィードバック信号と、テーブルの対応する行のエントリにおいてオペレーションが実行される。オペレーションはデマンド・フィードバック信号をコラム1961の量だけ右シフトさせ、シフト結果は対応する行のコラム1962値とともにAND操作される。例えば、行1990のデマンド・フィードバック信号は、0ビットロジック右シフト後(コラム1961はQ0)、’1111000000000000’ で、コラム1962の値とAND操作され、中間結果1980、その値は’1111000000000000’を得る。行1991のデマンド・フィードバック信号は、4ビットロジック右シフトの後(コラム1961のテーブル・アイテムはR4)、’1111000000000000’で、コラム1962の値とともにAND操作され、中間結果1981は’0000111100000000’である。行1992のデマンド・フィードバック信号は、8ビットロジック右シフトの後(1981のテーブル・アイテムはS8)、コラム1962の値とともにAND操作され、中間結果1982は’0000000011110000’である。意味するところは、プログラムCにおいてループ命令が先読みされ、16レーンをリクエストし、しかしプログラムCの優先度は4レーンしか許可せず、よって4レーンだけ割り当てられたということ。行1993のデマンド・フィードバック信号は、12ビットロジック右シフト後(1961のテーブルアイテムはS12)、’0000000000000000’で、プログラムDのデータが利用可能でないことを意味し、コラム1962の値とともにAND操作され、中間結果1983は’0000000000000000’である。行1994のデマンド・フィードバック信号は、14ビットロジック右シフト後(1961のアイテムの値はS14)、’1111000000000000’で、コラム1962値とのAND操作の後、中間結果1982は’0000000000000011’である。行1997のデマンド・フィードバック信号は、12ビットロジック右シフト後(コラム1961のアイテムの値はT12)、’1111000000000000’ で、コラム1962値とのAND操作の後、中間結果1987は’0000000000001100’である。プログラムF、G、I、Jに対するオペレーションも同様で、ここでは繰り返さない。
[327] 同中間結果に対するさらなるオペレーションは2次元スレッド・レーン割り当て値へ導き、それは各レーンのスレッド資源を制御する。行1990、コラム1960の’Q’を使って1980の中間値’1111000000000000’の’1’を交換し、結果は割り当て値’QQQQ------------’である。ここで’-‘はレーンがまだ割り当てられていないことを表す。そして1980行の値が反転されマスキング信号’0000111111111111’ を生成し、それは1981行の値とAND操作され’0000111100000000’になる。この値を用いて割り当て値’----RRRR--------’を前のように得る。この値を反転し’1111000011111111’を得て、行1980からのマスキング信号とAND操作され、新しいマスキング信号’0000000011111111’を得る。この新しいマスクは中間値1982へ適用され、割り当て値’--------SSSS----’を得る。それから他の新しいマスク’0000000000001111’が前と同じ方法を用いて生成される。行1983への操作の結果は割り当て値’----------------’で、新しいマスキング信号は、プログラムDが資源をリクエストせず、よってレーンが割り当てられていないので、まだ’0000000000001111’である。そして新しいマスキング信号と行1984値をAND操作し、割り当て値’------------SS’を得て、新しいマスキング信号は’0000000000001100’になる。それから、マスキング信号を行1985と行1986の値に適用して、二つのプログラムの割り当てられたレーンは両方とも優先度のより高いプログラムに取られるから、両方とも”----------------”を得る。そしてマスキング信号を行1987値とAND操作し、割り当て値’------------TT--’を得る。新しいマスキング信号’0000000000000000’が前と同じ方法を用いて生成される。この時点で全てのレーンは割り当てられる。割り当て値とマスキングを生成するプロセスはここで省略する。
[328] 上記の全ての割り当て値にOR操作をすることで、最終割り当て値1971 ’QQQQRRRRSSSSTTSS’を得る。この値は各レーンに送られ、そのオペレーションを指示する。指定のクロック・サイクルにおいて、レーンはこのスレッド割り当ての下に動作し、以下のプログラム’AAAABBBBCCCCHHEE’のために効率良くオペレーションを実行する。
[329] もし次のクロック・サイクルにおいて、プログラムA、C、D、E、F、G、H、I、Jの要求が変化せず、しかしプログラムBがループ命令をプレデコードした場合、行1991のデマンド・フィードバック信号を’1111111111111111’にする。4ビットロジック右シフト(コラム1961のテーブルアイテムはR4である)の後、コラム1962値とAND操作し、中間値1984は’0000111111111111’である。同中間結果に対するさらなるオペレーションは2次元スレッドレーン割り当て値に導かれ、それは各レーンのスレッド資源を制御する。図15Cを参照されたい。行1980の値は’1111000000000000’で、割り当て値の結果は’QQQQ------------’になり、行1980の値の反転値を取りマスキング値’0000111111111111’を得る。この値と行1981値をAND操作し、’0000111111111111’を得る。この値を用いて割り当て値’----RRRRRRRRRRRR’を前と同じように得る。この値を反転し’1111000000000000’を得て、行1980のマスキング信号とAND操作し、新しいマスキング信号’0000000000000000’を得る。この時点で、全てのレーンは割り当てられる。新しいマスキング信号はこの時点以降の他のプログラムの資源リクエストをマスクする。他のC、D、E、F、G、H、I、J、Kのデマンド・フィードバック信号は割り当て結果に影響しない。それから全ての同割り当て値に対してOR操作を実行し、最終割り当て値1972 ’QQQQRRRRRRRRRRRR’を得る。この値は各レーンに送られ、そのオペレーションを指示する。指定されたクロック・サイクルにおいて、レーンはこのスレッド割り当てのもと動作し、プログラム’AAAABBBBBBBBBBBB’のために効率良くオペレーションを実行する。
[330] このような割り当ての結果は、レーン1941、1942、1943、1944がスレッドQのプログラムAへ割り当てられ、これら4レーンにおいてはスレッド・スイッチングはなく、常にプログラムAを実行することである。プログラム実行の間、プログラムAの並列処理度合いが4よりも大きいとき、もっと多くのレーンがプログラムAのためにスレッドQに割り当てられうる(最大16スレッド)。レーン1945、1946、1947、1948がプログラムAによって使われないとき、これら4レーンはもっぱらプログラムBによって使われる。これら4レーンは、プログラムAが4レーン以上必要としない間、プログラムBの命令を実行し続けられる。図15Cに示されるように、レーン1941、1942、1943、1944はもっぱらプログラムAによって用いられるから、従ってプログラムBは最大12レーンを用いることができる。
[331] 他の8プログラムの優先度は低いから、これらはどのレーンをも排他的に使わない。同様に、図15Bの1965のレーン割り当て状況に示されるように、プログラムAとプログラムBが共にレーン1949、1950、1951、1952の1つもしくは複数を必要としないとき、これらのレーンはSスレッドのプログラムCへ割り当てられうる;プログラムAとプログラムBが共にレーン1953もしくは1954を使う必要がないとき、これらのレーンはSスレッドのプログラムDへ割り当てられうる;プログラムAとプログラムBが共にレーン1955もしくは1956を使う必要がないとき、これらのレーンはSスレッドのプログラムEへ割り当てられうる。
[332] 割り当てユニットはスレッド資源を異なるプログラムへ、スレッド資源割り当てテーブル、資源への要求、そして各プログラムの準備状態にもとづいて、動的に割り当てる。
[333] 本記述においては、同期制御が異なるレーンにおいて実行される命令に適用されうる。図16は本開示の構造におけるプロセッサの命令の同期化の実施形態を示す。この実施形態においては、例としてプロセッサの2レーンを使い2つの異なる命令を同時に実行する。これらのうち、IRB2005、実行ユニット2007、RF2009、データリード・バッファ2011、ロード/記憶ユニット2013そしてデータ書き込みバッファ2015が最初のレーン2031に対応し、IRB2017、実行ユニット2019、RF2021、データリードバッファ2023、ロード/記憶ユニット2025そしてデータ書き込みバッファ2027が第二レーン2033に対応する。加えて、命令キャッシュ2001とデータキャッシュ2003はこれらのレーン両方によって共有される。
[334] この実施形態において、トラック・テーブル2035をインデックスする二つのトラッカーがあり、トラッカー2037はレーン2031と恊働しトラッカー2039はレーン2033と恊働する。これら二つのトラッカーの機能と構造は同一である。トラッカー2037を例として取り上げると、通常のインクリメンタ2041、レジスタ2043、マルチプレクサ2045以外に、さらに追加的なロックレジスタ2047、アンロックFIFO2049、送信ゲート2051そしてANDゲート2053を含む。命令同期のためにロックとアンロック操作を行なうとき、ロックレジスタ2047はアドレス情報(例えばトラック・ポイント位置 BN)を記憶し、それはロックに使われる。またアンロックFIFO2049はアドレス情報(例えばトラック・ポイント位置 BN)を記憶し、それはアンロックに使われる。アンロックFIFO2049とロックレジスタ2047の命令情報が同じであるとき、アンロックが起こる。同じアドレスを持った同じ命令は、もし2つのレーンが同じプログラムを実行するなら、ロックになりうる。両方のプログラムが呼び出すサブルーチンは、もし2つのレーンが異なるプログラムを実行するなら、ロックになりうる。このサブルーチンを呼ぶには、ロックとアンロックの、2つの方法がある。
[335] 特にレーン2031とレーン2033が実行している命令を同期するのにシーケンシャル・ロックが必要とされる。つまりレーン2033は命令Bを実行する前に、レーン2031が命令Aを実行し終わるまで待つ必要があり、トラッカー2037の送信ゲート2051を有効にしてバス2071のアンロックFIFO2049の内容を駆り、そしてトラッカー2039のコンパレータ2073をセットしてバス2071のアドレス情報をモニターすし、3インプット・マルチプレクサ2075がコンパレータ2073の出力をANDゲート2063のインプットとする。この実施形態において、ロックとアンロック命令は分岐命令に似た命令として定義され、スキャナが命令のこのタイプをスキャンしたとき、それは分岐ポイントとして取り扱われトラック・テーブルへ記憶される。
[336] レーン2033のトッラカー2039はロックされた命令の分岐ポイントを読み出すとき、分岐命令に出会ったときと同じように振る舞い、命令アドレスのところで止まり、分岐決定を待つ。ここでデコーディングはこれがロック命令であることを示し、命令のアドレスはレジスタ2057へラッチされる(命令自身をデコードできるが、スキャンの途中でスキャナによって生成され、トラック・テーブルの中の命令に対応するテーブル・エントリに記憶された、ロックタイプでもあり得る。トラッカーはこの特殊タイプをデコードするデコーダを持つ)。このとき、コンパレータ2073はロックレジスタ2057の中のアドレスを照合しておらず、マルチプレクサ2075を通して’不一致’信号とフィードバックをANDゲート2063へ送り、トラッカーのポインタ・レジスタ2067の更新を防ぎ、トラッカー・アドレス・ポインタ2039の動きを止める。この信号はまたレーン2033の命令の実行も止める。
レーン2033と対応するトラッカー2039はロック状態に入る。
[337] レーン2031のトラッカー2037がアンロック命令の分岐ポイントをトラック・テーブルから読み出すとき、それは分岐命令を読み出すのと同じように振る舞い、命令のアドレスで止まり、分決定結果を待つ。ここでデコーダはこれがアンロック命令であることを示す。それにもとづいて、命令のアドレスはFIFO2049へ記憶され、また送信ゲート2051へバス2071を通して置かれる。同時にトラッカー2037は’分岐が取られなかった’信号を生成し、レーン2031とトラッカー2037が後続するコードを実行し続けるようにする。このとき、コンパレータ2073の’一致’結果がANDゲートへ3インプットマルチプレクサ2075を経て送られ、トラッカーとレーン2033が実行を再開するようにする。レーン2033と対応するトラッカー2039はアンロック状態に入る。アンロック状態のトラッカー2039はロックレジスタ2057とアンロックFIFO2049をリセットする。
[338] 上記の例において、もしレーン2031がアンロック命令を最初に実行すると、アンロック・アドレスはFIFO2049へ記憶され、バス2071へ送信ゲート2051を経て置かれ、レーン2031とトラッカー2037は後続コードを実行し続ける。もし他のアンロック命令が実行中に実行されたなら、新しいアンロック命令はまたFIFO2049に記憶される。トラッカー2039がロック命令のアドレスをレジスタ2057へラッチするとき、コンパレータ2073の照合一致結果は、レーン2033と2039がロック状態に行かないようにし、しかし後続命令を実行し続けるようにする。
[339] トークン・パッシングは、トークンが対応するIRB2017の命令Bに対応するトークン・パッサーへパスされるときに休止される。実行ユニット2019が命令Bを受けた後に実行を休止した後、それは信号2605をトラッカー2039のANDゲート2063へ出力し、ANDゲート2063にレジスタ2067の更新を休止させ、よってリード・ポインタ2055の更新を休止する。
[340] 同時に、レーン2031は命令実行を続け、命令Aの実行に近づくとき、該当するトラック・ポイントの位置情報をアンロック・レジスタ・グループ2049へ書き込む。アンロック・レジスタ・グループ2049の構造はFIFO構造である。
[341] 例えば、命令Aのトラック・ポイント情報はアンロックFIFO2049に命令Aの前の特別命令によって書き込まれる。このケースにおいて2049の深さは命令Aから同特別命令までの命令数に等しい。
[342] 別の例では、トラッカー2037のリード・ポインタ2053は、命令実行とともに、対応するトラックに沿って動き、リード・ポインタの値(トラック・ポイントの位置データ)をアンロックFIFO2049へ書き込む。ここで、アンロックFIFO2049の深さは、トラッカー2037のリード・ポインタ2053が命令Aにポイントするのとレーン2031が同じ命令を実行することの間の時間遅延に対応する。
[343] このようにして、リード ・ポインタ2053が命令Aに対応するトラック・ポイントのポイントするとき、命令Aの対応するトラック・ポイント位置データはアンロックFIFO2049の対応する最初のレジスタに書き込まれる。その後トラック・ポイント位置はアンロックFIFO2049の各レジスタを通して逐次送信される。トラック・ポイントの位置がアンロックFIFO2049へ送信されるとき、レーン2031は命令Aの実行を終了する。
[344] このプロセスにおいて(レーン2033はレーン2031が命令Aの実行が終わるのを待ち、命令Bの実行を開始する)、送信ゲート2051が開き、送信ゲート2061が閉じ、命令Aに対応するアンロックFIFO2049のトラック・ポイント位置をバス2071へ送る。コンパレータ2073はバス2071のトラック・ポイント位置とロックレジスタ2057に記憶された命令Aのトラック・ポイントを比較し、二つが等しいとき、それは命令Aが既にレーン2031によって実行されたことを示し、ここでレーン2033は命令Bの実行を開始できる。この実施形態において、マルチプレクサ2075はコンパレータ2073によって生成された比較結果を選び、トラッカー2039のレジスタ2067の更新を制御し、レーン2033は命令Bの実行後の後続命令の実行を続ける。
[345] レーン2031とレーン2033で走る命令を同期させるのにバリアロックが必要とされるとき、それは命令Aの実行がレーン2033とレーン2031の両方で完了した後でのみ後続命令を実行することである。この場合、トラッカー2037と2039の各ロックレジスタは命令Aのトラック・ポイント位置情報にラッチする。マルチプレクサ2075と2079の両方はANDゲート2077の出力を選び、トラッカー・リード・ポインタの更新を制御する。よって、レーン2031と2033は命令Aの後に、ANDゲート2077がそれぞれのマルチプレクサに’1’を出力したときのみ、後続命令を実行できる。これは全ての関係あるトラッカー(この例ではトラッカー2037と2039)のレジスタ(FIFO)が命令Aのトラック・ポイント位置を各自の対応するコンパレータへ出力した後、つまり全ての関係あるレーン(この例ではレーン2031とレーン2033)が命令Aを実行した後、でのみ起こる。もしいくつかのレーンがバリアロックに参加しないなら、これらのレーンのマスクレジスタ2080または2081は’1’にセットされる。これは、これらのレーンのそれぞれからゲート2077への信号が’1’にセットされることに繋がり、よって他のレーンに適用されるバリアロックに干渉しない。
[346] 他のケースにおいて、2つのレーンで実行されている命令が互いに同期する必要がないとき、マルチプレクサ2075と2077の両方は値’1’を選ぶようにセットされ、よってトラッカー2037のレジスタ2043とトラッカー2039のレジスタ2067は比較結果によって制御されず、それぞれは各自のトラックを独立に実行する。
[347] 開示されたマルチレーン・プロセッサは1つ以上の命令セットをサポートするように拡張されうる。図17は本開示と整合する例示的な、複数の命令セットをサポートするマルチレーン・プロセッサである。この図において、206は命令メモリ、209はスキャン・コンバータ、1811、1813、1815、1817は4つのプロセッサ・コアである。レーン1811、1813、1815、1817は命令セットAの命令のみを実行する。スキャン・コンバータ209のスキャン機能はスキャナ208の機能と同様であるが、それは変換機能も持ち、インプットされた命令セットBの命令を対応する命令セットAの命令に変換することができる。従って、図15の実施形態は命令セットAと命令セットBを同時にサポートできる。命令セットAを実行するとき、スキャン・コンバータはスキャン機能のみを実行し、命令セット変換機能は実行しない。命令セットBを実行しているときのみ、スキャン・コンバータ209はスキャン機能を実行するだけでなく、命令セット変換機能も実行する。命令の変換は、命令が命令メモリ206に記憶される前に起き、よって命令メモリ206は命令セットAの命令のみ持つ。従って、各レーンが命令を転送し割り当てるとき、ターゲットが命令メモリ206においてヒットされる限り、命令変換を待つ必要がない。
[348] さらに、スキャン・コンバータ209には2つの命令セット変換メカニズムがあり、それぞれ命令セットBと命令セットCを命令セットAへ変換する。この状況において、それはマルチレーン・プロセッサの異なるレーンと異なるスレッドが異なる命令セットの命令を実行していることと同じである。
[349] 本記述において、DRBを含むプロセッサ・システムの他の実施形態が図18Aに示される。DRB2218のエントリ数はIRB2214のエントリ数と異なり、一方、その構造と機能はIRB107に等しい。IRB2214の各エントリには追加のフィールドがあり、それはデータリードバッファ・アドレス(DRBA)を記憶するのに用いられる。そして追加のDRBAデコーダ2220があり、それはDRBAをデコードしDRBの対応するエントリを選ぶのに用いられる。IRBエントリに記憶されたDRBAは、このIRBエントリがバス2205を通して実行ユニット2206へ命令を発行するとき、バス2209によってパスされ、デコーダ2220によってデコードされた後DRB2218の1つのエントリを選ぶ。選ばれたDRBエントリに記憶されたデータはまた実行ユニット2206へ適切なパイプライン・サイクルにおいて送られる(それはバス2209におけるアドレス・パスを遅らせることによって実現できる)。もしIRBのエントリが他の命令によって交換されたとき、交換されたエントリのDRBAは読み出され、交換モジュールに記憶される。
[350] 本記述において、DRBを含むプロセッサ・システムの他の実施形態が図18Bに示される。DRBのエントリを充填するデータエンジン2230があり、加算器2232、ストライド・メモリ2236そしてマルチプレクサ2238、2242から構成される。データアドレス2235、ストライド値2237そして状態ビット2239はストライド・メモリ2236の各エントリを含む。それは命令ブロックが充填される度に命令を検査し、各データリード命令のためにそれぞれストライド・メモリとDRBにエントリを割り当てる。これは利用可能なDRBAを、データリード命令に対応するIRBエントリへ充填することによって実現でき、それは交換ロジックによってなされ、ストライド・メモリ・エントリとDRBエントリの初期化を完了する。実装の詳細については、ストライド・メモリの部分もしくは全ての内容(例えばデータアドレス2235、ストライド値2237、状態ビット2239)がDRB2218、もしくはトラック・テーブルの対応するエントリに記憶されうる。しかし、図18Bの実施形態は独立のDRB2218とストライド・メモリ2236を示す。データアドレスは、バス2215からのDRBAのデコーダ2220の結果をデコードすることによってアドレス指定された、ストライド・メモリ2236の内容に従って計算される。データエンジン2230は、DRB2218とストライド・メモリ2236の内容を書き込み更新することを担う。ストライド・メモリ2239のエントリの状態ビットとDRB2218のエントリの有効ビットの両方は最初の割り当てにおいて’0’にセットされる。
[351] バス2215のDRBAによってアドレス指定された、ストライド・メモリ2236とDRB2218の内容は、データ・リード命令が最初にIRB2214によってバス2205を経て発行されたとき、読み出される。DRBエントリの有効ビットはこのとき’0’であり、実行ユニットがパイプラインを失速させデータを待つように指示する。一方、ストライド・メモリ・エントリの状態ビット2239は’0’であり、データエンジン1930が実行ユニット2206によって生成される(もしくはデータエンジン自身によって計算される、例えばデータリード命令におけるデータ基底アドレスをデータ・オフセットに加えることによってデータ・アドレスを生成する)データ・アドレス2231を待つように指示する。キャッシュ2242からのデータ、それはマルチプレクサ2242によって選ばれバス2243を通して送られたアドレス2231によってインデックスされている、はDRB2218の対応するエントリへバス2223を通して充填され、このエントリの有効ビットと対応するストライド・メモリ・エントリの状態ビット2239を’1’にセットする。
実行ユニットはデータをDRBからバス2207を経て読み出し、もし望まれたDRBエントリの有効ビットが’1’ならパイプライン操作を完了する。
有効ビットはそれから’0’にリセットされ、バス2243のデータアドレスはストライド・メモリ2236の対応するエントリのデータ・アドレス・フィールド2235へ充填される。
[352] もしデータロード命令が再び発行された場合、DRB2218の該当エントリの’0’有効ビットは、実行ユニットのパイプラインを失速させDRB2218にデータが充填されるのを待つよう指示する。ストライド・メモリ2236の該当エントリの’1’状態ビット2239は、データエンジンが実行ユニットによって再び生成されたバス2231のデータ・アドレスを待つように指示し、データがデータキャッシュ2222から読み出されDRB2218の対応するエントリへ充填されたことにもとずいて、その有効ビットを’1’にセットする。よって命令ユニット2206は必要なデータをバス2207から読み出すことができ、前述のように実行を続行する。それから’1’有効ビットと’1’状態ビットはデータエンジンのマルチプレクサ2238を制御して、この時のデータアドレス2231を加算器2232のために選ぶ。加算器2232はストライド・メモリ2236に記憶された古いデータアドレス2235をデータアドレス2231から差し引き、結果(差異、つまりストライド)はストライド・メモリ2236のエントリのストライド・フィールド2237に記憶される。
[353] さらに、ストライド・フィールド2237のストライド値を、マルチプレクサ2238によって選ばれたバス2231の現行データアドレスに足した結果2233は、データリード命令が次回実行されるときの可能なデータアドレスである。結果のアドレスは、マルチプレクサ2242によって選ばれた後バス2243に送られ、ストライド・メモリ2236の対応するエントリのデータアドレス・フィールド2237に記憶される。データエンジンは、バス2243のデータアドレスに従ってデータキャッシュ2233から前もってデータを読み出し、DRB2218にそれを記憶する。対応する状態ビットが’2’にセットされ、有効ビットは’1’にセットされる。ここで注目に値するのは、ストライド・メモリ2236の対応するエントリは前もって計算された次データアドレスとデータ・ストライド値を記憶し、DRB2218の対応するエントリは先取りされた次データを記憶し、さらにDRB2218のエントリとストライド・メモリ2236のエントリは両方とも、データリード命令に対応しているIRB2214のエントリのDRBAによってポイントされている点である。
[354] 結果として、データリード命令によって必要とされるデータは、命令が再び実行されるとき、既にDRB2218に記憶されており、命令に対応するIRBのエントリのDRBAによってポイントされている。そしてそれは適切な時にバス2207へ送られる。よって、実行ユニット2206はデータキャッシュからデータを読むために待つ必要がない。状態ビット2239の値が’2’であるから、データエンジン2236は再び、データアドレス2235にデータ・ストライド2237を加えることによって、次回のデータアドレスを計算しデータを取りに行く。それはまたストライド・メモリ2236とDRB2218の対応するエントリを更新し、有効ビットを’1’にセットする。
[355] 上記手法と装置はループにおけるデータローディングの効率をあげる。しかし、可能データアドレスにおけるデータ先取りのため、確認する必要がある。図18Bの実施形態はコンパレータ2234を用いて、可能データアドレス2235と、データロード命令を実行したときに実行ユニットによって生成された実際のレータアドレス2231、とを比較し、よって可能データアドレスの正確さを確認する。それは先取りされたデータを保ち、後続オペレーションに進み、もし2つのアドレスが同一なら状態ビットを’2’に保ち、そうでなければ状態ビットを’1’にセットし、データストライドを再計算しこの状態から上記手順を繰り返す。
[356] 本記述において、図14A、B、Cで示される命令ループを並列に実行する実施形態にもとづいて、データエンジンはループにおけるロード命令への対応するデータを供給するために追加される。ここで、各レーンはそれ自身のデータエンジンを持ち、各データエンジンは該当するレーンのレーン番号を持つ(例えば’0’、’1’、……)。各レーンは掛け算器を持ち、同掛け算器はデータエンジンに置かれる独立した掛け算器でありうる。もしくはレーンは実行ユニットの掛け算器を共有しうる。加えて、4つのグループのバスがあり(ストライド・バス、幅バス、初期アドレス・バス、最終レーン番号バス)、それらは全てのバスに股がり、それぞれデータアドレス・ストライド値、並列実行に使われるレーン数(レーン幅)、並列実行が始まるデータアドレス、そして最後の並列ループ実行の最終レーン番号を全てのレーンに送る。
[357] この実施形態において、ループ命令は図14の実施形態のようにサイクル・コントローラによって分解される。まず最初に、同命令ループを2回ひとつのレーンにおいて実行し、それから前述と同じ方法でデータアドレス・ストライドを得る:同じデータロード命令を2回実行する中で生成された2つのデータアドレスを差し引く。それから、サイクル・コントローラは、ループカウント合計、割り当てられるレーンの数、ループ命令の優先度にもとづいて並列実行に必要なレーンの数を、決定する(この例では、これらのレーンは連続している)。同命令ループはすでに2回実行されているから、同レーン数はループの合計数より’2’少ない値に等しい。サイクル・コントローラは初期データアドレスを以下のように得る:初期レーン番号(ループを並列に実行するレーンの最初のレーンのレーン番号)を前回の最後(2度目)の実行におけるデータロード命令のデータアドレスから差し引き、そしてストライドによって掛け算し、つまり初期アドレス=最後の前データアドレス ー 初期レーン番号*データストライドを得る。サイクル・コントローラはまた、前の計算のように、サイクル数NIを計算する。同ループ命令は既に2回実行されているから、サイクル数NIはループ数合計から2を引いてレーン幅で割った値の切り上げ整数の商に等しい(余りは最後の並列ループ実行で用いられたレーン数である)。サイクル・コントローラはまた、ループ並列実行の最終サイクルのために、最終レーン番号LILを生成する。同最終レーン番号LILは、最終サイクルにおいて必要とされるレーン数に初期レーン番号を足して1引いたものである。それから、サイクル・コントローラは同ストライド、レーン幅、初期アドレス、そして同最終レーン番号LILをそれぞれ、ストライド・バス、幅バス、初期アドレスバス、最終レーン番号バスを通して、並列サイクルに参加している全てのレーンに送る。
[358] 最初のパラレルサイクルにおいて、各レーンのデータエンジンは、そのデータアドレスを自身のレーン番号、受けた初期アドレスと受けたデータ・ストライドにもとづいて計算する。特に、各レーンの対応するデータアドレスは、レーン番号に’1’足しそれからデータ・ストライドによって掛け算されそれから初期アドレスに足されたものに等しい、つまりデータアドレス=(レーン番号+1)*ストラド+初期アドレス。このようにして、データエンジンはデータを、データアドレスにもとづいて前もってDRBへ充填する。DRBは、該当するデータロード命令がレーンに対してIRBによって発行されたとき、該当するデータをレーンへ発行する。最初のサイクルの後の全てのサイクルにおいて、新しいデータアドレスは、レーン幅とストライドを掛け合わせたものに元のデータアドレスを足すことによって得られ、それからデータエンジンはデータを前もってDRBへ充填する。上記オペレーションを最後の並列サイクルまで繰り返す。
[359] この実施形態において、最後の並列サイクルの前の全てのサイクルにおいて、サイクル・コントローラは、並列サイクルに参加する全レーンの最大レーン番号を最終レーン番号バスを通して、全てのレーンへ送り、全ての同レーンが同ループ命令を実行するようにする。最後の並列サイクルにおいて、サイクル・コントローラは最終レーン番号LILを最終レーン番号バスを通して全てのレーンに送り、それから並列サイクルに参加している全てのレーンは受け取った最終レーン番号LILを各自のレーン番号と比べる。レーン番号が最終レーン番号LILよりも大きいレーンは同ループ命令を実行せず、残りのレーンは前述のように最後の並列サイクルを完了する。
[360] 例えば、命令ループのループ合計が100であると仮定すると、ループのロード命令が最初に実行された時に生成された最初のデータアドレスは’260’でデータ・ストライドは’3’である。そしてここで全部で10レーンが割り当てられる(レーン番号は’4’~’13’)。ストライド’3’は、命令ループを2度1つのレーンで実行することによって、ループのロード命令を2度目に実行するときのデータアドレスが’263’であることから、見いだせる。この命令ループには10レーンが割り当てられ、従ってレーン幅は’10’、初期アドレス=(263-4*3)=251、並列ループ番号 NI=(100-2)/10 =10(切り上げ)、最終並列ループは8レーン使い、最終レーン番号=8+4-1 = 11である。
[361] 最初の並列サイクルの間、最初のレーン(レーン番号’4’)のデータアドレス=(4+1)*3+251=266、第二レーン(レーン番号’5’)のデータアドレス=(5+1)*3+251=269、…そして最後のレーン(レーン番号’13’)のデータアドレス=(13+1)*3+251=293。各レーンのデータエンジンは、前と同様、各自のDRBへ対応するデータアドレスにもとづいてデータを充填し、それから新しいデータアドレスを計算する。特に、最初のレーンの新しいデータアドレス=10*3+266=296で、第二レーンのデータアドレス=10*3+269=299、…そして最後のレーンのデータアドレス=10*3+293=323。それからデータエンジンは対応するデータを各自のDRBへ充填し、第二サイクル中の発行に備える。このように、各レーンのデータアドレスは、ロード命令が実行される毎に更新され、それからこれら10レーンのデータアドレスは、ループ内のロード命令が9回実行された後、それぞれ’536’、’539’、… 、’563’と更新される。
[362] 10回目の並列サイクルにおいて、最終レーン番号LILが’11’であるから、レーン’4’~’11’は正常に動作し、レーン’12’と’13’は同命令ループを実行しない。このようにして、10回目の並列サイクルにおいて、レーン’4’~’11’のデータエンジンはデータアドレス’536’、’539’、…、’557’を持ち、これらのアドレスに対応するデータが実行ユニットへ発行され、対応する命令がIRBによって発行されるときに最後の並列サイクルを完了する。
[363] 少しの修正で、マルチレーン・プロセッサとそのIRBは分岐予測の助け無しに分岐命令を処理することができ、しかも分岐ペナルティによるパイプライン失速とパイプライン・フラッシュを被らない。その方法は、まだ未決定の分岐決定に依存する複数の命令(例えば分岐命令の次の命令(フォールスルー命令)や分岐ターゲット命令)を同時に分岐決定がなされるまでに実行することである;それから分岐決定によって選ばれた命令の分岐の実行を続行し、命令の他の分岐を中断する。分岐決定がなされるパイプライン段階を境界として用い、プロセッサ実行ユニット・パイプラインは前端パイプラインと後端パイプラインへ分けられる。分岐決定によって制御されるマルチプレクサは、複数の前端パイプラインによって出力された、部分的に処理された命令分岐の1つを選び、選ばれた命令分岐は実行され単一のパイプラインによって完了する。以下の記述は図10〜12の実施形態にもとづくが、にもかかわらず、他への応用は類推によって達成されうる。図19は実施形態と整合する例示的な命令セグメントである。図20は実施形態と整合する例示的な、同時に複数の可能な命令を発行することをサポートするIRBである。図21は実施形態と整合する例示的な、図20のIRBを使う例示的なレーン・プロセッサで、図19の命令セグメントを実行し、構造と機能を説明する。
[364] 実行される命令セグメントは図19Aに示される。行2301は同時に発行される4つの連続した命令からなり、図において丸で印された命令は分岐命令である。この例における全4命令は分岐命令で同じIRBブロックに置かれ、その最初のアドレスは’68’、次のブロックアドレスは’23’。行2301における4命令に対応するトラック・テーブル・エントリは行2302に示される。この図に示されるように、命令3の分岐ターゲットは’68.0’であり、命令4、5、6はそれぞれ’68.7’、’68.1’、’68.2’である(ここでのアドレス・フォーマットはBNX.BNY)。トラック・ポイント2303はそのトラックのエンド・ポイントで、それは次ブロック・アドレス’23’を記憶する。説明の簡明のため、同時に発行された4つの異なる命令は、プログラム・シーケンスによって異なる命令発行スロットにおいて発行されたものと定義する。行2304に示されるように、命令3はスロットAに置かれ、命令4、5、6はそれぞれスロットB、C、Dに置かれる。図19Bは、命令セグメントの、例えば2301、命令アドレスを軸とした可能な実行径路を示す。ポイント2306は1つのクロック・サイクルにおいて発行された最初の命令、命令3、を示し、影の部分は同じサイクルで発行された4命令を示す。この図で丸で印された分岐命令は行2301のそれに対応し、丸から派生する弧線は分岐を表し、矢印がポイントする先は行2302の分岐ターゲット・アドレスに対応する分岐ターゲットを表す。アドレスが0から7の命令がIRBブロックへ充填され、その最初のアドレスBNXは’68’であり、アドレスが8から15の命令はまた他のIRBブロックへ充填され、その最初のアドレスBNXは’23’である。
[365] これら4レーンの実行は命令3から始まり、前の3つの分岐命令の分岐決定にもとづいて、このサイクルにおいて4つの可能なプログラム実行径路が存在する。第4分岐命令の結果は次のクロック・サイクルに影響を及ぼし、それは後で議論される。実行径路は分岐命令3、分岐ターゲット0、もし分岐が取られた場合はその後続命令1と2、すなわち3、0、1、2;命令3の分岐ターゲット命令0、1、2はこれ以後簡明のためO道と呼ばれる。同様にして、分岐命令3が取られず分岐命令4が取られたとき、実行径路は命令3、4、7、8であり、命令4の分岐ターゲット命令7、8は以後P道と呼ばれる。同じ理由で、もし分岐命令3と4が取られずしかし分岐命令5が取られるなら、実行径路は命令3、4、5、1で、命令5の分岐ターゲット命令1は以後Q道と呼ばれる。最後に、もしこれら3つ全ての分岐命令が取られない場合、実行径路は命令3、4、5、6で、以後N道と呼ばれる。後続する命令7、8、9、10は、もし命令6が取られないなら、次のサイクルで実行され、以後N道と呼ばれる。または命令6が取られるなら、後続する命令2、3、4、5が実行され、以後J道と呼ばれる。N道とJ道は次のサイクルにおいて異なる実行径路であるが、それらの違いは現行サイクルで実行される命令には影響を与えない。充分な実行ユニットと対応するIRBリードポートとビット・ラインが1サイクル中に各可能実行径路に供給されている限り、実行されうる全ての可能な命令は同時に複数の前端パイプラインへ発行され、それから分岐決定によって選ばれ、可能な命令の一部のみが更なる実行のために後端パイプラインへ送られる。
[366] 図20は実施形態21で用いられる例示的なIRB構造である。全てのIRBブロックはマトリックスからなり、命令はプログラム・シーケンスに沿って上から下に、各行に1つの命令が置かれる;各行の各コラムは左から右へ対応する前端パイプラインへ仕えるリードポートを持つ。命令はどのコラムのリードポートからも出力され、必要に応じてコラムに付属した実行ユニットへ発行される。この実施形態はIRBとそれらに付属する前端パイプラインを発行スロットの面で組織する、つまり各レーンは単一のもしくは複数の可能な命令を、命令の連続したセグメントの、順列上固定された場所(発行スロット)において処理する。図19において、スロットAはたった1つの可能な命令をもち、B、C、Dスロットはそれぞれ、2、3、4の可能な命令を持つ。従ってこの実施形態において、各行は4つのリードポートを持ち、最大4つの命令が、IRBの1つの命令発行スロット、例えば2401から、発行されるのをサポートする。
[367] 各レーンは、複数のIRBブロックを持つ、自身のIRB(例えばIRB2401、2407)を持つ。各IRBブロックはデコード・モジュール2403と、ストレージ要素、リードポート、バスから構成されるマトリックス2405を含む。マトリックスの各行(例えば2411、2413)は命令を記憶し、4つのリードポート(図においてXで示される)を持つ;各行のリードポートはビットライン・バス(例えばバス2461)によってコラムに接続される。異なるレーンの同じ行の命令は、オペレーション・モードに依って、同じあるいは互いに異なる。各コラムのビットライン・バスは各IRBの各行のリードポートを、同じコラムのレーンの前端パイプラインへ接続する。例えばビットライン・バス2461はそのコラムのリードポートを前端パイプライン2491へ接続する。各コラムは、図19で説明された、1つのスロットの1つの’道’の命令、に対応する。’道’は複数の発行スロットにて発行される必要がある命令を持つかもしれない。レーンを発行スロットとして整理すると、同じ’道’の命令は複数のスロットに分散しうる。’道’はそれ自身の特定のコラムを複数の発行スロット(つまりレーン)において持ちうる。例えばN道は、N道に特定したコラムを発行スロットA、B、C、Dのそれぞれに持つ。発行スロット(レーン)のマトリックス2405において、コラム2421はN道に特定のコラムである;コラム2423、2325、2427はそれぞれO、P、Q道に特定のコラムである。IRB2407は他のレーンのIRBで、2401と同じ構造を持ち、同じデコーダ2408と同じマトリックス2409を持つ。オペレーションに必要な構成要素のみがデコーダ2408とマトリックス2408に示されている。この例において、デコーダ2403と2408はトラッカーからのアドレスをデコードし、ワードラインを駆動する。図10〜12の実施形態のトークン・レジスタは、トラッカーの指示のもと同じ機能を実行し、そのオペレーションの原理は以下に描かれるものと同じであるので、ここでは繰り返さない。
[368] IRBブロック2401のデコーダ・モジュール2403を例として用いて、第1アドレス・レジスタ1025、現第1アドレス・コンパレータ1029そして現第2アドレス・デコーダ1021は前実施形態の対応する部分と同じ(分岐ソース・コンパレータと分岐ソースアドレス・デコーダとして知られている)であり、これらのうち第1アドレス・レジスタ1025は現行命令ブロックの対応するBNX値を記憶し、命令が命令ブロックへ充填されるときに同時に書き込まれる。第1アドレス・コンパレータ1029はトラッカーからのリード・ポインタ2471のBNXと、第1アドレス・レジスタ1025に記憶されているBNXと比較し、もし比較結果が同じなら、対応する命令ブロックが現行命令ブロックであることを意味する。それは第2アドレス・デコーダ1021をして、リード・ポインタ2471のBNYをデコードし、ローカル・ワードライン2450もしくは2451のうちの1つにおいて、ただ1つの’1’を駆動する。第1アドレス・コンパレータ1029の比較結果が’等しくない’とき、第2アドレス・デコーダ1021の出力は全て’0’になる。
[369] レーン・プロセッサとして、この実施形態のIRBの各行のリードポートはワードラインの4タイプの制御のもと、命令を発行する。ワードラインのこれら4タイプは各コラムのマルチプレクサ(例えばマルチプレクサ2431)によって選ばれ、各行のリードポートを制御し、図13の実施形態に描かれたモードを実現する。ワードラインの4タイプのうち、1つのタイプはローカル・ワードラインで、第2アドレス・デコーダによって駆動される。例えばワードライン2450と2451は第2アドレス・デコーダ1021によって駆動される。第2のタイプは特殊ジグザグ・ワードライン(例えばワードライン2482)で、次アドレス・コンパレータ2481によって駆動され、各IRBブロックの第1行のリードポートを制御する。第1、第2のタイプのワードラインはレーンの中で割り当てられる。第3、第4のタイプのグローバル・ワードラインはデコーダやコンパレータによって直接に駆動されず、むしろワードラインの信号を1つのレーンからその右のレーンへパスする。第3タイプのグローバル・レベル・ワードライン(例えばワードライン2460)は、信号を水平に右のレーンの同じ行のリードポートへパスする。第4タイプのグローバル・ジグザグ・ワードライン(例えばワードライン2453)は、信号を右側のレーンの1行下のリードポートへ対角的にパスする。一般信号はレーンの同じコラムの全てのマルチプレクサを制御し、各マルチプレクサの同じインプット・ポートを選ぶ。異なるコラムの制御信号は独立に設定され、同じコラムのリードポートを、ワードラインの4タイプの1つによって、制御もしくは無効にする。
[370] レーン独立のオペレーション、例えばSISDやMIMDを実行しているとき、各レーンのトラッカーはデコーダ(例えばデコーダ1021)を制御し、レーンのIRBのトークン・レジスタはリードポートを制御するローカル・ワードラインを駆動し、レーンの実行ユニットへ命令を発行する。このモードのオペレーションはただ1つの道が必要で、つまり各スロットにただ1つのコラムを意味する。例えば、もしN道だけ用いられるなら、制御マトリックス2405のNコラム2421の全てのマルチプレクサは真ん中のインプットを選び、それはローカル・ワードライン2450、2451などである;そして制御Oコラム2423、Pコラム2425、Qコラム2427のマルチプレクサは全て左の’0’(無効)インプットを選ぶ。もし第1アドレス・レジスタ1025の内容が’68’で、リードポインタ2471のアドレスが’68.0’なら、コンパレータ1029はデコーダ1021を有効にし、ワードライン2450を駆動し、N道のマルチプレクサ2431はそれを水平のグローバル・ワードライン2460へ送信し、リードポート2432を有効にし、行2411に記憶された命令をビットライン・バス2461を通して前端パイプライン2491へ処理のために送る。そしてO、P、Qの全てのマルチプレクサ(例えばマルチプレクサ2433)は無効にセットされ、従ってワードライン2450はこれら3リードポートに影響を与えない。同じ議論によって、IRB2407のN道のマルチプレクサ2435と2457もローカル・ワードラインを選び、デコーダ2409の制御のもと、前端パイプライン2492へ実行のために命令を発行し、水平のグローバル・ワードライン2460の信号には影響されない。これは前述のコラム相関である。
[371] SIMDタイプのオペレーションを実行しているとき、それは各レーンの1つのコラム(1つの道)だけ使う必要があり、しかしレーンはリードレーンと後続レーンに区別される。このタイプのオペレーションにおいて、複数レーンの最左レーンはリードレーンで、リードレーンの各コラムのマルチプレクサのセットアップは前例のそれと同様である。リードレーンの右側の複数のレーンは後続レーンである。後続レーンのO、P、Qコラムのマルチプレクサは、前と同様、’0’(無効)を選ぶ。しかし、後続レーンのNコラム・マルチプレクサは左インプットを選び、それは第3タイプのワードライン- グローバル水平ワードライン(例えばワードライン2460)である。今IRBリードポート・マトリックス2405のレーンはリードレーンとしてセットされ、IRB2407のレーンは後続レーンとしてセットされる。マルチプレクサ2431はワードライン2450を選び、グローバル水平ワードライン2460を駆動し、リードポート2432が行2411の命令を発行するようにし、マルチプレクサ2435も水平ワードライン2460を選び、グローバル水平ワードライン2467を駆動してリードポート2436を有効にし、行2411の命令を前端パイプライン2499へ処理のために発行する(マトリックス2405とIRB2407の同じ行の命令は同じか異なる)。同時に、水平ワードライン2467の信号は、もっと右のレーンへ送られ、同じ方法を用いて各レーンの同じ行のN道リードポートを駆動し、命令を発行する。これは前述の行相関である。本例と上述の例は共にN道のみを使い、他の道は無効にされている。
[372] 命令レベル並列処理(ILP)モードにてマルチ発行オペレーションを行なっているとき、全ての道N、O、P、Qが用いられる。このモードにおいて、グローバル・ジグザグ・ワードライン(例えばワードライン2468)が、上記2例で使われたワードライン以外に、用いられる。ジグザグ・ワードラインは、ある道のレーンの行におけるリードポートの制御信号を、同じ道の右側のレーンの1行下のリードポートへパスし、同じ道の次の順番の命令を右レーンへ 発行する。このモードにおいて、トラッカーはデコーダ1021を制御しもしくはIRBのトークン・レジスタは、リードポートを制御する各レーンのローカル・ワードラインを駆動して命令を発行する。ローカル・ワードラインの信号はジグザグ・ワードラインを経て隣のレーンへパスされ、順序上次の命令を発行しILPを実現する。このモードにおいて、1021のような各レーンの第2アドレス・デコーダは、それぞれ1つの道のワードラインを駆動する。例えば、Aスロット・デコーダはN道を駆動し、B、C、DスロットデコーダはそれぞれO、P、Q道を駆動する。特に、スロットAのNコラム2421のマルチプレクサは、中央インプットを選ぶように設定され、それはデコーダによって出力されたローカル・ワードラインであり、他のコラムのそれらは、スロットAがたった1つの可能な命令しかもたないから、左’0’(無効)を選ぶ。スロットBのコラムO2423のマルチプレクサは全て中央インプットを選ぶように設定され、それはデコーダによって出力されたローカル・ワードラインであり、N道のマルチプレクサは右インプット、ジグザグ・ワードライン、を選ぶように設定され、またPとQ道は、スロットBは2つの可能な命令しか持たないから、左の無効を選ぶように設定される。
[373] スロットCのコラムP2425のマルチプレクサは中央インプットを選ぶように設定され、それはデコーダによって出力されたローカル・ワードラインであり、他の道NとOは右側インプットを選び、それはジグザグ・ワードラインで、道Qは、スロットCは3つの可能な命令しか持たないから、左側の無効を選ぶ。スロットDのコラムQ2427のマルチプレクサは右側インプットを選ぶように設定され(このコラムのマルチプレクサは2つのインプットしか持たず、右側インプット機能は他のコラムのマルチプレクサの中央インプットのそれと同じである)、それはデコーダによって出力されたローカル・ワードラインであり、他の道N、P、Qは、スロットDは4つの可能な命令しか持たないから、右側インプットを選び、それはジグザグ・ワードラインである。図20を参照されたい。IRB2401はスロットCに、IRB2407はスロットDにある。上で言及されたように、IRB2401のN道2421とQ道2423のマルチプレクサは右のインプット、ジグザグ・ワードラインを選ぶ;道2425のマルチプレクサは中央インプット、ローカル・ワードラインを選ぶ;道Q2427のマルチプレクサは左のインプット、無効を選ぶ。そしてIRB2407のマルチプレクサ、N、O、P道は全てジグザグ・ワードラインのインプットを選ぶ;そしてQ道はローカル・ワードラインのインプットを選ぶ。
[374] 前例のように、スロットCのデコーダ2403はリードポインタ2471をデコードし、ローカル・ワードライン2450を駆動し、有効にし、ここでP道2425のマルチプレクサ2433のみがローカル・ワードライン2450を選び、イネーブル信号をジグザグ・ワードライン2468に送ってリードポート2433を有効にし、行2411の命令を前端パイプライン2495へ処理のために発行する。P道のDスロットIRB2407のマルチプレクサ2437はジグザグ・ワードライン2468を選び、リードポート2438を有効にして、行2413の命令を前端パイプライン2496へ処理のために発行する。これは前述の対角相関である。この実施形態において、N道のグローバル・ジグザグ・ワードラインとグローバル水平ワードラインは同じワードラインを共有し、ワードラインは右レーンのN道の同じ行のマルチプレクサの左インプットに接続するだけでなく、右レーンのN道の下の行のマルチプレクサの右インプットにも接続する。もしN道のマルチプレクサ全てが左インプットを選ぶなら、前例で描かれたように、動作モードは行相関である。もしN道のマルチプレクサ全てが右インプットを選ぶなら、動作モードは対角相関である。もしIRB2401がスロットAにあり、ローカル・ワードライン2450が有効なら、マルチプレクサ2431は有効ワードライン2450を選んで駆動し、グローバル水平ワードライン2460をして行2411の命令を前端パイプライン2491へ発行する。そしてスロットBのIRB2407のマルチプレクサ2437は右インプットを選ぶよう設定され、それはリードポート2438を制御し、行2413から前端パイプライン2492へ命令を発行する。
[375] デコーダ例えば1021がIRBブロックの下方境界の近くのローカル・ワードラインをデコードし駆動するとき、ジグザグ・バスが下方境界に到達し、従って最後のスロット、スロットDへパスされる前に、引き続く命令の発行を可能にするように、パスし続けることができない、可能性がある。各命令ブロックはランダムに各IRBブロックへ充填されるから、この問題を解決するために、単純に下方境界のジグザグ・ワードラインと次の下方IRBブロックのジグザグ・ワードブロックを接続することはできない。本開示の前の実施形態は既に、この問題を解決するためにどのようにトークン・バスを利用するか説明している。この実施形態は例として図20を用いて、アドレス・デコーディングがどのように同じ機能を実現するか説明する。ジグザグ・ワードラインがIRBブロックの下方境界に達するスロットの数は、第2アドレスBNYにおいて計算を実行することで得られ、それはどのローカル・ワードラインを駆動するか、そして第2アドレスをデコードするデコーダのスロット番号を決定する。行番号は常にIRBブロックの第1行である。道番号は常にジグザグ・ワードラインが下方境界に達するのと同じ道である。計算の詳細は図21の実施形態にて説明され、ここではいかにIRBが、正しいジグザグ・ワードラインを駆動して、計算もしくはテーブル点検によって得られた第1アドレスBNXにもとづいて、発行スロットを利用して複数の連続した命令を継ぎ目なく発行するか、それらの命令は異なるIRBブロックに記憶されるかも知れない、のみを説明する。
[376] 例として、まだIRB2401をスロットCとして、IRB2407をスロットDをして使う。行2411はIRBブロックの第1行で、行2413は第2行であるが最後の行ではない。IRB2401のコラムN2421、コラムO2423、コラムP2425のマルチプレクサの右インプットは全てジグザグ・ワードラインへ接続されている。これら3コラムの第1行の3マルチプレクサの右インプットはそれぞれ、デコーダ2403の3次ブロック・コンパレータによって駆動された特別なジグザグ・ワードラインに接続している。例えば、N道次ブロック・コンパレータ2481はワードライン1082を駆動し、N道マルチプレクサ2431の右インプットに接続する。他のO、P道は類推によって推し量られうる。Q道は、スロットDに発行された1つの命令しか持たないから、このクロック・サイクルにおいて次ブロックを持たず、その後続命令は全て次のサイクルで発行されなければならない。次ブロック・コンパレータは次ブロック・アドレス・バスの最初のアドレスと、デコーダに記憶された最初のアドレスを比較し、比較結果は特別なジグザグ・バスを直接駆動する。
[377] スロットCのレーンのIRB2401の第1アドレスレジスタ1025に記憶された命令ブロック・アドレスは’23’と仮定する。トラッカー・リードポインタの現行アドレスは’68.6’である。リードポインタはスロットAへ送られ、N道ジグザグ・ワードレーンを駆動する。リードポインタの第1アドレスはスロットAのIRBブロックのそれぞれに記憶されている第1アドレスと比較される。第1アドレスが’68’であるIRBブロックはさらにリードポインタの第2アドレスをデコードし、ジグザグ・ワードライン’6’へ動く(図20には記されていない)。各IRBは8命令を含むと仮定し、よって8行のリードポートを持つ。前に説明されたように、同’6’ジグザグ・ワードラインは、第1アドレスが’68’のIRBブロックの中のスロットAの第6行命令の発行を可能にする。ジグザグ・バスはまた、右のレーン、スロットBを通して7行目の命令の発行を駆動する。それから、ジグザグ・ワードラインIRBブロックの下方境界へ到達する。
[378] 同時に、リードポインタ’68.6’が生成されたとき、次アドレス’23’は既にトラック・テーブルの点検を通じて得られている。リードポインタのBNY’6’とこのリードポインタがスロットAのレーンに送られる事実にもとづいて、またこのレーンのN道マルチプレクサのみがローカル・ワードライン、第2アドレス・デコーダによって出力される、を選ぶように設定される事実にもとづいて、次ブロックの第1命令はスロットCのN道から発行されるべきであることが推論される。従ってトラッカーは、次ブロック・アドレス’23’を、スロットCのN道の次ブロック・アドレス・バス2486へ置く。図20において、N道次ブロック・アドレス・コンパレータ2481はバス2486上のアドレスそして第1アドレス・レジスタ1025の内容と一致を見いだし、よって特別ジグザグ・バス2482を駆動する。スロットCとスロットDのN道のマルチプレクサ(例えばコラム2421)は右インプット、ILPモードにおいてジグザグ・ワードラインに接続するインプット、を選ぶように設定されることは既に説明された。従って、ワードライン2482はスロットCのマルチプレクサ2431によって選ばれ、バス2460を駆動し、スロットDのマルチプレクサ2437はバス2460を選ぶ。その結果、行2411の命令はスロットCの前端パイプライン2491へ発行され、行2412の命令はスロットDの前端パイプライン2492へ発行される。よって、N道の全4つの命令発行スロットは、IRBブロック境界を越える発行の時でも、充分に活用される。
[379] 図21は、4つの命令を並列に発行できる例示的な実施形態で、発行された命令内の分岐命令の分岐決定にもとづいて、プログラムの実行フローを決定する。描写の簡明のため、実施形態の実行ユニット・パイプラインは3つのステージを持つ:Dパイプは命令でコードのため、Eパイプは実行のため、Wパイプは書き戻しのため。この実施形態の方法は他の形式と構成のパイプラインにも適用可能である。IRB2550によって発行された命令、命令デコード、依存チェック、分岐決定そしてRFリードは全てパイプ・ステージDで行なわれる。図18のデータエンジンはデータリード・バッファDRB(図21には記されていない)へ前もってデータを充填する。IRBの制御のもと、DRBはパイプ・ステージE(実行のためにバイパス)とパイプ・ステージW(ロード命令を実行するときRFを充填する)でデータを供給する;従って、パイプラインは通常のデータアクセス・ステージMを必要としない。
[380] 図21のトラック・テーブル2501は前実施形態とは異なる。トラック・テーブルはリード・ポインタによってポイントされたテーブル・エントリ2511と3つの続きのテーブル・エントリ2512、2513、2514を出力し、同時に4つの連続した命令がポイントするかもしれない4つの分岐ターゲットを供給する。エンド・トラック・ポイント・メモリ2502はトラック・テーブルから分離され、にもかかわらず、トラック・テーブルのそれと同じ行アドレスによるアドレス内容を記憶し、そして内容は対応する行がトラック・テーブルにおいて更新されると同時に更新される。それは4つのリードポートを持ち、4BNXアドレス・インプットにもとづいて4エンド・トラック・ポイントを並列に出力する。4つのBNXアドレス・インプットにもとづいて、エンド・トラック・ポイント・メモリによって提供された次ブロック・アドレスは有効もしくは無効とみなされる。シフタ2546、2547、2548はこれら次ブロックアドレス(エンド・トラック・ポイント・メモリによって提供される)を適切なスロットへシフトすることを担う。レジスタ2530、2531、2532、2533は同4次ブロックアドレスを記憶する。これら4つの次ブロックアドレスにおいて、シフタ2546によってシフトされた後の第1次ブロックアドレスはレジスタ2540、2541、2542のいずれかによって記憶される;シフタ2547によってシフトされた後の第2の次ブロックアドレスはレジスタ2543と2544のいずれかによって記憶される;シフタ2548によってシフトされた後の第3の次ブロックアドレスはレジスタ2545によって記憶される。レジスタ2530、2531、2532、2533によって出力された次ブロックアドレスBNXはマルチプレクサ2586によって選ばれ、それは分岐決定結果2598によって制御される。出力はバス2539を通過し、次のクロック・サイクルの現行アドレスを計算するために、トラッカー2504のマルチプレクサ2529のインプットへ送られる。また、レジスタ2530、2531、2532によって出力された次ブロックアドレスは、IRB2550、2551、2552の次ブロックアドレス・コンパレータ2419へ送られる。レジスタ2540によって出力された次ブロックアドレスは、IRB2551のコラムアドレス・コントローラ2411へ送られ、レジスタ2541と2543によって出力された次ブロックアドレスは、IRB2552のコラムアドレス・コントローラ2411へ送られる。レジスタ2542、2544、2545によって出力された次ブロックアドレスはIRB2553のコラムアドレス・コントローラ2411へ送られる;これらは次IRBブロックの複数のジグザグ・ワードラインを制御する。この実施形態において、レジスタ2525、2530、2531、2532、2533はBNXを記憶する;レジスタ2526はBNYを記憶する;レジスタ2521、2522、2523、2524はBNXとBNYの両方を記憶する。
[381] トラッカー2504は前と違って、現行アドレスと、4命令以内の分岐命令の全ての分岐ターゲットを、現行命令の開始と同時に供給することができる。特に、レジスタ2525、2526はそれぞれ現行命令の第1アドレスBNXと第2アドレスBNYを記憶する;レジスタ2521、2522、2523、2524は、トラック・テーブルによって出力された現行命令セグメント(この実施形態においては4つ)の分岐ターゲット・アドレス(BNXとBNY)2511、2512、2513、2514を記憶する。この例において、4つのBNXは’68’、4つのBNYはそれぞれ’0’、’7’、’1’、’2’である。レジスタ2525(BNX)と2526(BNY)の出力はバス2520において一緒に結合される(図において円と矢印は一緒に結合された2つのバスを表す)。レジスタ2521、2524、2523の出力は、リードバッファ2504の全ての第1アドレス・コンパレータと現行第2アドレス・デコーダ1021へ送られ、それは複数のジグザグ・ワードラインを駆動する。
[382] バス2520とレジスタ2521、2522、2523、2524の出力はマルチプレクサ2585によって選ばれ、それは分岐決定によって制御される。マルチプレクサ2585の出力の第1アドレスBNX部分2535はマルチプレクサ2529の他のインプットへ送られる;第2アドレスBNY部分2536は加算器2528へ送られ、マルチプレクサ2527によって供給されたインクリメントへ加算され、それは依存関係チェックの検出結果2565の制御の下にある。加算器の合計は新しい現行第2アドレスBNYとして用いられ、レジスタ2526へ記録される。加算器のキャリー出力信号2538はマルチプレクサ2529を制御する。キャリー出力がないとき、マルチプレクサ2529は現行第1アドレス2535を選ぶ;キャリー出力があるとき、マルチプレクサ2529は次ブロックの第1アドレス2539を選ぶ;マルチプレクサ2529の出力は新しい現行第1アドレスBNXでレジスタ2526へ記憶される。
[383] マルチプレクサ2529の出力と加算器2528の出力もまた結合され、リードポインタ2510になり、トラック・テーブル2501の読み取りを制御する。リードポインタ2510(次サイクルの現行アドレス)とトラック・テーブル2501の出力2511、2512、2513(次サイクルの命令1、2、3の分岐ターゲット)はエンド・トラック・ポイント・メモリ2502へ送られ、各アドレスの次ブロックアドレスを読み出す;そしてまたコラム・アドレス・ジェネレータ2503へ送られる。コラム・アドレス・ジェネレータは対応するコラムアドレスを生成する。現行アドレスの次ブロックアドレスはレジスタ2530へ記憶され、対応するシフトの後、レジスタ2540へ記憶される。2511、2512、2513の次ブロックアドレスと現行命令セグメントの第1、2、3命令の分岐ターゲット・アドレスはレジスタ2531、2532、2533へ記憶され、対応するシフトの後、レジスタ2541、2542、2543、2544、2545へ記憶される。
[384] IRB2550、2551、2552、2553は図20のような構造を持つIRBの4つのグループである。4つのうち、IRB2553は次ブロック・アドレス・デコーダを必要としない。命令間の依存関係にもとづいて、依存関係チェッカー2560、2561、2562、2563は信号2597をトラッカー2504へ伝え、インクリメントを選び次サイクルの初期アドレスを決定する。2570〜2579は10個の前端パイプラインである。分岐決定の制御のもと、マルチプレクサ2581、2582、2583は、後端パイプライン2590などによる更なる実行のために、前端パイプラインの出力を選ぶ。全部で4つの後端パイプライン2590、2591、2592、2593があり、4命令の並列実行を支える。RF2595は全ての前端パイプラインと後端パイプラインによって共有される。前端パイプライン2570によって処理される命令は、RF2595からのデータ取得を制御し、データは後端パイプライン2590へさらなる処理のために送られる。前端パイプライン2571〜2579によって処理される命令はRF2595からのデータ取得を制御し、データは、命令デコーディングを経て得られた対応する動作制御と共に、マルチプレクサ2581、2582、2583によって選ばれる。選ばれたデータと動作制御は後端パイプライン2591、2592、2593へさらなる処理のために送られる。後端パイプラインにて完了されるべく選択された命令の実行結果は、RF2595へ書き戻される。
[385] 共通路があるから、全部で10前端パイプラインがあり、それらは分岐決定によって決定される同4実行通路によって共有される。例えば、全4通路は命令セグメントの第1命令(この例では命令3)を実行しなければならず、従ってセグメントの第1命令はただ1つだけ、4つではなく、前端パイプラインが必要である。セグメントの第2、3、4命令はそれぞれ2、3、4の前端パイプラインを必要とする。同じサイクルで処理される4命令は同じ命令実行スロットにある。説明の簡明のため、同じクロック・サイクルにおいて発行された4つの連続する命令が占める命令実行スロットを、それぞれスロットA、B、C、Dと命令実行順に名付ける。スロットAは1つの選択しかなく、図19A、Bの例では命令3である;スロットBは2つの選択を持ち、命令4(命令3は分岐しない)か命令0(命令3が分岐する)である;同じ理由でスロットCは3つ選択を持ち、スロットDは4つ選択を持つ。命令スロットにおいて実行される可能性のある全ての命令は、それ自身の指定された前端パイプラインを持つ。この図に示されるように、命令スロットAは前端パイプライン2570のみを含み、命令スロットBは2つの前端パイプライン2571、2574を、命令スロットCは3つの前端パイプライン2572、2575、2577を、命令スロットDは4つの前端パイプライン2573、2576、2578、2579を含む。後端パイプライン2590、2591、2592、2593はRA、RB、RC、RDと印され、それぞれA、B、C、D命令スロットにおける分岐決定選択の後の命令の実行を示唆する。RF2595は全命令スロットの前端、後端パイプラインによって共有される。
[386] 複数の命令が1つの命令スロットにおいて発行されうるから、説明の簡明のため、道を分岐命令に起因する可能な異なるプログラム実行径路と定義する。最初に、N道を、スロットA、B、Cにおける複数の命令が非分岐命令もしくは分岐を取らない分岐命令であるような、実行径路と定義し、このサイクルには4つの命令がある;命令Aで分岐が取られたと仮定すると、ここからの全ての必要とされる命令はO道と名付けられ、このサイクルには3つの命令がある;A命令は分岐しないがBが分岐すると仮定すると、ここから必要とされる命令はP道と名付けられ、このサイクルにおいて2命令がある;もし命令A、Bが分岐せず、命令Cが分岐する場合、ここから必要な命令はQ道と名付けられ、このサイクルにおいて1つの命令がある。命令A、B、Cが分岐しない、しかし分岐命令Dによって必要とされる命令はJ道と名付けられ、このサイクルにおいてはこれらの命令のうちのゼロである。トラック・テーブル2511、2512、2513、2514の出力は、N道のスロットA 、B、C、Dの命令の対応するトラック・テーブル・エントリで、内容は各命令の分岐ターゲットであり、またO、P、Q、J道の出発点でもある。
[387] 本記述において、現行命令もしくは分岐ターゲットの次ブロックアドレスは以下の方法にもとづいて生成される。生成された次ブロックアドレスはシフトされ、適切なレジスタにおいて記憶される。各IRBブロックの行数(ストレージ・エントリ数)をnとする;ブロックオフセット・アドレス(第2アドレス)をBNYとし、それは0〜n-1の値を持ち、トップ行は行0である;全部でm個のスロットがあり、0〜m-1の値を持ち、最左スロットはスロット0である;全部でw個の道があり、0〜w-1の値を持ち、最左は0道である。それから、次ブロックアドレスはもし((m-w) - (n-BNY))が0より大きければ有効で、それ以外では無効である。この実施形態において、N、O、P道の次ブロックアドレスは、対応する初期BNYアドレスにもとづいて適切なスロットへシフトされる。Q道は同次ブロックアドレスを必要としない。特に、((m-w) - (n-BNY)-1)値はシフト量として用いられ、次ブロックアドレスを右シフトする。
[388] この例では、n=8、m=4、w=4、Nは道0、Oは道1、Pは道2、Qは道3である。N道のBNY=6、((m-w) - (n-BNY))=((4-0) - (8-6))=2、で0より大きいから、次ブロックアドレスは有効である。その意味は、アドレス’6’はデコードされ、ジグザグ・ワードラインを駆動し、アドレス’6’に対応する命令はN道スロットAから発行され、アドレス’7’に対応する命令はN道スロットBから発行され、このときジグザグ・ワードラインはIRBブロックの下方境界に着いて止まる。このとき、次ブロックアドレスのデコーディングは、次命令ブロックの最初の命令にポイントし、知られるべき唯一のことは、プロセッサ資源をフル活用しそして現行IRBによって発行された命令との衝突を避けるべく、N道のどのスロットから命令が発行されるべきかということである。このとき、シフト量((m-w) - (n-BNY)-1)=1で、シフタ2546は有効な次ブロックアドレス、レジスタ2530に記憶されたN道次ブロックアドレス、を右に1つシフトし、シフト結果をN道Cスロットのレジスタ2541へ記憶する(N道の他の対応するレジスタ2540と2542の値は無効)。このアドレスは、コラム2の次命令ブロックのコラムデコーダ2411によってデコードされ、N道スロットCから最初の命令(BNY=0)を発行し、第2命令(BNY=1)はN道スロットDから発行される。もし((m-w) - (n-BNY))が0より小さいなら、次ブロックアドレスは無効であり、N道の対応するレジスタ2540、2541、2542は全て無効である。コントローラは全てのコラムデコーダ2411を制御し、それらはジグザグ・ワードラインを駆動せず、この状況故に、現行IRBブロックは命令を全てのコラムに同時に発行する。上記計算の結果は参照テーブルに置かれることで計算にとって代わることができる。
[389] 依存関係チェッカー2560〜2563は図12の依存関係チェッカーと同様の構造を持つが、検出されるべき命令のソースは少し異なる。N道の構造と依存関係チェッカー2560の接続は図12の依存関係チェッカーのそれと同様であり、検査されるRFアドレスは4スロットのN道命令から来る。O道の依存関係チェッカー2561の基本構造は依存関係チェッカー2560と同様で、最後の3命令はスロットB、C、DのO道から、最初の命令はスロットAのN道から来る。図21の影の部分は依存関係チェックで検査されるべきスロット命令を示している。P道の依存関係チェッカー2562はスロットA、BのN道の命令とスロットC、DのP道の相関関係を検査する。Q道の依存関係チェッカー2563はスロットA、B、CのN道とスロットDのQ道の相関関係を検査する。各依存関係チェッカーの結果はまた修正されなければならない。例えば、Q道が発行する最初の命令はスロットBからであり、もし依存関係チェッカー2561が依存関係を検出しないなら、インクリメントは’3’になる;もしスロットDの命令が依存関係を持つなら、インクリメントは’2’である;もしスロットCの命令が依存関係を持つなら、インクリメントは’1’である;もしスロットBの命令が依存関係を持つなら、インクリメントは’0’であり、次サイクルはスロットBの命令から発行を開始すべきである。同じ理由によって、依存関係チェッカー2562のソースはスロットA、BのN道とスロットC、DのP道で、それぞれインクリメント’2’(命令間に依存関係がない)、’1’(スロットDが依存関係を持つ)、’0’(スロットCが依存関係を持つ)を生成する。同じ理由で、依存関係チェッカー2563のソースはスロットA、B、CのN道とスロットDのQ道で、それぞれインクリメント’1’(命令間に依存関係がない)、’0’(スロットDが依存関係を持つ)を生成する。ここで分岐アドレス自身がプロセッサ状態を変えると仮定すると、後の命令との間に依存関係を生み出す。もしそうでなければ、トラッカー・レジスタ2521、2522、2523の命令タイプを依存関係チェックに導入し、分岐命令とそれに続く発行スロットの命令との間の依存関係チェックを無効にする。全4依存関係チェッカーによって出力されたインクリメントは、分岐決定によって制御されるマルチプレクサ2584によって選ばれ、2584の出力2597はトラッカーのマルチプレクサ2527を制御し、加法器2528へ適切なインクリメントを供給する。
[390] さらに、依存関係チェッカーの結果はまた、命令の結果を消去する中止信号を生成するのに用いられ、それは並列に生成されるが、並列には実行され得ない。特に、同時に発行された2命令間に依存関係があるとき、第2の命令とそれに続く命令の実行は中止されなければならない。
[391] 図12の依存関係チェックモジュールの実施形態を例として用いると、少なくとも1つの命令が発行されなくてはならないから、スロットAの命令は、依存関係チェックの結果がいかんであれ、常に発行され実行される。出力1491が’1’のとき、スロットBの命令とスロットAの命令との間に依存関係があり、従ってスロットB、C、Dの中止信号は’1’であり、スロットB、C、Dの前端パイプラインの実行結果はすべて消去される。これはスロットAの命令だけを発行し実行するのと等価であり、スロットB、C、Dの命令は実行されず、スロットB、C、Dは分岐TAKEN信号を生成しない。
[392] 出力1491が’0’、出力1492は’1’のとき、スロットC命令がスロットAもしくはBの命令と依存関係を持つこと、そしてスロットAとBの命令は依存関係を持たないこと、を示す。従って、スロットBの中止信号は’0’で、スロットBの前端パイプラインが正常に実行する。同時に、スロットCとDの中止信号は’1’で、スロットCとスロットDの前端パイプラインの実行結果は消去される。これはスロットA、Bの命令のみを発行し実行するのと等価であり、スロットCとDの命令は実行せず、スロットCとDは分岐TAKEN信号を生成しない。
[393] 出力1491、1492が両方’0’で、出力1493が’1’のとき、Dスロットの命令はスロットA、B、もしくはCのいずれかの命令と依存関係を持ち、スロットA、B、Cの命令は互いに依存関係を持たないことを示す。従って、スロットBとCの中止信号は’0’で、スロットBとCの前端パイプラインは正常に実行する。同時に、スロットDの中止信号は’1’で、スロットDの前端パイプラインの実行結果を消去する。これはスロットA、B、Cのみの命令を発行し実行し、スロットDの命令を実行しないのと等価である。スロットDは分岐TAKEN信号を生成しない。
[394] 最後に、出力1491、1492、1493が全て’0’のとき、それはスロットA、B、C、Dの命令間に依存関係がないことを示す。従って、スロットB、C、Dの中止信号は’0’であり、スロットB、C、Dの前端パイプラインは正常に実行し、それはスロットA、B、C、Dの命令を発行し実行することと等価である。
[395] 図21のIRBは説明の簡便のために編成されている。もしスロットによって編成されるなら、パイプラインと結果は同じであり、従ってここでは繰り返さない。IRB2550はスロットAに対応し、ビットラインによってリンクされたリードポートのコラムを持ち、それは対応する前端パイプライン2570へ命令を発行する。スロットAにただ1つの道(N道)があり、それは対応する前端パイプライン2570上の印によって特定される。IRB2551はBスロットへ対応し、全部で2つの道(N道、O道)を持つ。IRB2552はスロットCへ対応し、全部で3つの道(N道、O道、P道)を持つ。IRB2553はスロットDへ対応し、全部で4つの道(N道、O道、P道、Q道)を持つ。スロットAのIRB2550のデコーダ2417が発行する度に、それはジグザグ・ワードライン2555を駆動しスロットA、B、C、DのN道の命令を読み出し、それから対応する前端パイプラインへ発行する。IRB2550、2551、2552の対応するデコーダがワードラインを駆動するか否かは、N道によって発行された命令が分岐命令か否かに依る。もしスロットAのN道が分岐命令なら、レジスタ2521の命令タイプは分岐である。それから、スロットB IRB2551のデコーダはレジスタ2521の分岐ターゲット・アドレスをデコードし、ワードライン2556を駆動してスロットB、C、DのO道の命令を読み出し、対応する前端パイプラインへ発行する;それはもしタイプが分岐でなければ、ワードラインを駆動しない。もしスロットAが分岐命令を持たなければ、それは分岐ターゲットを持たないから、スロットB、C、DのO道は発行される必要がない。同じ原理で、道P、Qにおいてワードラインを駆動するかは、スロットBとCのN道命令が分岐命令かに依存する(レジスタ2522、2523の命令タイプが分岐か否かを見る)。分岐タイプ情報はトラック・テーブルのテーブル・エントリを読み出すことにより提供される。この実施形態においては、リードポートはワードラインにより直接制御され、それはジグザグ・ワードラインとして設定されている。
[396] 図19Aにおいて命令セグメントを実行するとき、初期条件は、命令アドレス0〜7の命令ブロックは既にIRBブロックにあり、IRBブロックの第1アドレスレジスタ505にあるアドレスは’68’である;命令アドレス8〜15の命令ブロックは既に他のIRBブロックにあり、IRBブロックの第1アドレスレジスタ505にあるアドレスは’23’である。前クロック・サイクルにおいて、リードポインタ2510の第1アドレスBNXは’68’で、第2アドレスは’3’である(円と矢印は2つのバスが交わっていることを表す)。リードポインタ’68.3’ をアドレスとして用いて、4つの連続したテーブル・エントリを、トラック・テーブル2501の行63の3番目のテーブル・エントリから始めて、読み出す;図19Aのテーブル・エントリの内容、分岐ターゲット・アドレス’68.0’、’68.7’、’68.1’、’68.2’はそれぞれバス2511、2512、2513、2514から読み出され、レジスタ2521、2522、2523、2524のインプットへ送られる。ここでアドレス・フォーマットはBNX.BNYである。バス2510、2511、2512の各第1命令アドレスBNXはエンド・トラック・ポイント・メモリ2502へ送られ、対応する次ブロックアドレスを読み出し、各第2アドレスBNYは、前述のように、対応するシフト量を決定するのに用いられる。バス2510〜2512のBNXアドレスは全て’68’で、メモリ2502の行68の内容は’23’で、エンド・トラック・ポイント・メモリ2502の3つの出力は全て’23’である。前述のように、現行アドレスの第2アドレス’3’とO道の第2アドレス’0’はともに無効な次ブロックアドレスを生成する。P道の第2アドレス’7’は有効な次ブロックアドレスを生成し、シフト量((m-w) - (n-BNY)-1) = ((4-2)-(8-7)-1) = 0で、シフトを必要とせず、直接レジスタ2545へ記憶される(ここでレジスタ2540、2541、2542、2543、2544は全て無効)。
[397] クロック信号がトラッカー・レジスタと次ブロックアドレス・レジスタを更新したあと、バス2520の値’68.3’、レジスタ2525と2526の出力を一緒にしたもの、がスロットA IRB2550へ現行クロック・サイクルにおいて送られる。値はデコーダの第1アドレス・コンパレータによって照合され、第2アドレス・デコーダによってデコードされ、ジグザグ・ワードライン2555を駆動して、スロットA、B、C、Dに沿って命令3、4、5、6;レジスタ2540、2541、2542のN道の次ブロックアドレスは全て無効であり、従ってスロットB、C、Dをデコードした後、コラムデコーダ2411はいかなるN道のワードラインも駆動しない。同時にレジスタ2521の出力’68.0’はスロットBのIRB2551へ送られる。デコーダによって照合されデコードされた後、それはジグザグ・ワードライン2556を駆動し、スロットB、C、DのQ道に沿った命令0、1、2を発行する;レジスタ2543と2544のO道の次ブロックアドレスは無効で、従ってスロットCとDのコラムデコーダによって駆動されるワードラインはない。同時に、レジスタ2522の出力’68.7’はP道IRB2552へ送られ、デコーダによって照合ならびにデコードされた後、ジグザグ・ワードライン2557を駆動する。P道Cスロットに沿って命令7を発行した後、ワードラインはそれがIRBブロックの下方境界に着いたときに終了する;レジスタ2545のP道の次ブロックアドレスは有効で、従ってDスロットのデコーダはそれをデコードし、ワードライン2558を駆動する;DスロットのP道の次命令ブロックのIRBにおいて’0’行が命令8を発行する。同時に、レジスタ2523の出力’68.1’はQ道のIRB2553へ送られ、デコーダによる照合とデコードの後、デコーダはワードライン2559を駆動してQ道のスロットDに沿って命令’1’を発行する。
[398] 各分岐決定は、スロットA、B、C、Dの前端パイプラインにおいて、N道の命令3、4、5、6のために、独立になされる。前端パイプラインによって出力される分岐決定は、前端パイプラインによって処理されている命令が分岐命令であり、分岐が取られたと決定され、そして命令が依存関係を持たない時にのみ、’taken’である。他の状況においては分岐決定は’not taken’である。
[399] 4スロットのN道分岐決定結果は優先度エンコーダ2596へ送られ、道優先順位コード2598をエンコードする。優先度エンコーダ2596は、対応する命令のアドレス順序にもとづいて、分岐決定の優先度をセットする。もしスロットA道Nの分岐決定が’taken’であれば、この場合、エンコーダによって出力された道優先順位コード2598は、スロットB、C、DのN道の命令の分岐決定結果に関わらず、道Oを選ぶことを意味する。もしスロットA道Nの命令が’not taken’であり、スロットB道Nの分岐決定が’taken’であるなら、エンコーダによって出力された道優先順位コード2598は、スロットC、DのN道も命令の分岐決定結果に関わらず、道Pを選ぶことを意味する。もしスロットA、B道Nの命令が’not taken’であり、スロットC道Nの命令が’taken’であれば、エンコーダによって出力された道優先順位コード2598は、スロットDのN道も命令の分岐決定結果に関わらず、道Qを選ぶことを意味する。もしスロットA、B、CのN道の命令が’not take’と決定された場合、エンコーダによって出力された道優先順位コード2598は、道Jを選ぶことを意味し、後で説明される。最後にスロットA、B、C、DのN道が全て’not taken’と決定された場合、エンコーダによって出力された道優先順位コード2598は、道Nを選ぶことを意味する。
[400] 道優先順位コード2598はマルチプレクサ2581、2582、2583、2584、2585、2586を制御する。全部のマルチプレクサが、道優先順位コードの全ての意味タイプの制御を必要とはしない。例えば 道優先順位コードJはマルチプレクサ2586の制御をしない。最初に、後端パイプラインに供給される前端パイプラインの出力を選ぶ状況を見る。マルチプレクサ2581、2582、2583は、前端パイプラインによってデコードされた動作制御信号とDRBからのデータを選ぶ。図18の実施形態に見られたように、データエンジンによって充填されたDRB(図21には記されていない)、もまたスロットへ、この実施形態ではIRB2550〜2553のように、編成される;スロットAはN道、スロットBはNとO道、スロットCはN、O、P道、スロットDはN、O、P、Q道を持つ。道グルーピングはIRB2550〜2553と同じである。各スロットのDRBは後端プロセッサとRFへ、その対応するスロットのIRB2550、2551、2552、2553の制御のもと、データを提供する。DRBスロットA道Nからのデータと、スロットA道Nの前端パイプラインによって生成された動作制御信号は、両方とも後端パイプライン2580へ、バイパス実行もしくはRF2595に記憶されるために、送られる。DRBの他のスロットからのデータと、対応するスロットの前端パイプライン2571〜2579の動作制御信号は共にマルチプレクサ2581、2582、2583を通して選ばれ、後端パイプライン2591、2592、2593へ、バイパス実行もしくはRF2595に記憶されるために、送られる。
[401] もし道優先順位コードがO道を選ぶことを意味するなら、マルチプレクサ2581、2582、2583はOインプットを選び、つまり3つのO道前端パイプラインの、後端パイプライン2591、2592、2593への出力を、処理続行のために、選ぶ。前端パイプライン2470の出力は後端パイプライン2590へ送られ、分岐決定には影響されない。ここでスロットA道Nの前端パイプラインの命令は命令3である。スロットB、C、DのO道の前端パイプラインの命令は、命令3が’taken’分岐命令であると仮定した時の命令で、つまり分岐命令3の分岐ターゲット0、そしてターゲットに続く2つの命令(命令1と2)である。よって命令3、0、1、2は後端パイプライン2590、2591、2592、2593へ処理のために送られる。
[402] 同じ理由で、道優先順位コードがP道を意味するなら、マルチプレクサ2581、2582、2583は全てそれらのPインプットを選ぶ、つまりN道スロットAとBの前端パイプラインの出力とP道スロットCとDの前端パイプラインの出力は、マルチプレクサの出力として用いられ、処理を続行するために後端パイプラインへ供給される。よって命令3、4、7、8は後端パイプライン2590、2591、2592、2593へ送られ処理される。同じ理由で、道優先順位コードがQ道を意味するとき、マルチプレクサ2581、2582、2583は全てそれらのQインプットを選び、N道スロットA、B、Cの前端パイプラインの出力とQ道スロットDの前端パイプラインの出力はマルチプレクサ出力として、処理を続行するために後端パイプラインへ供給される。よって命令3、4、1、2は後端パイプライン2590、2591、2592、2593へ処理のために送られる。同じ理由で、道優先順位コードがN道を意味するとき、マルチプレクサ2581、2582、2583は全てそれらのNインプットを選び、N道スロットA、B、C、Dの前端パイプラインの出力は、処理の続行のために後端パイプラインへ供給される。よって命令3、4、5、6は後端パイプライン2590、2591、2592、2593へ処理のために送られる。道優先順位コードがJ道を意味するとき、マルチプレクサ2581、2582、2583は全てそれらのJインプットを選び、そして命令3、4、5、6を出力する。J道とN道の選択は現行クロック・サイクルにおいて同じで、違いは次サイクルにおいてのみ重大である。
[403] 道優先順位コード2598はまた次サイクルでどの命令のセグメントが実行されるかを決定する。 分岐決定から生成される道優先順位コード2598はマルチプレクサ2584、2585、2586を制御しプログラムのコースを決定する。トラッカー2504は、次クロック・サイクルで実行されるべき命令セグメントの先頭命令アドレスを、マルチプレクサ2584の出力、それはある道のアドレス・インクリメント量を選ぶ;マルチプレクサ2585の出力、それは現行サイクルにおける同じ道の先頭アドレスを選ぶ;そしてマルチプレクサ2586の出力、それは現行サイクルにおける同じ道の次ブロックアレスを選ぶ、にもとづいて計算する。特に、この方法は加法器2528を使って、現行サイクルにおいてマルチプレクサ2585によって選ばれた(レジスタ2525、2526から、もしくはレジスタ2521、2522、2523、2524から)、ある道の先頭アドレスのBNYアドレス2536を、マルチプレクサ2527によって選ばれたインクリメント量、マルチプレクサ2584によって選ばれた同じ道の出力(依存関係チェッカー2560、2561、2562、2563から)によって制御されている、に追加する;合計は次サイクルの先頭命令の第2アドレスBNYである。加法器2528のキャリーアウト出力2538はマルチプレクサ2529を制御する;もしキャリーアウトが’0’なら、現行サイクルのこの道の先頭アドレスの第1アドレスBNX2535を選ぶ;もしキャリーアウトが’1’なら、マルチプレクサ2586の出力2539を選び、それはマルチプレクサ2586によって選ばれた(レジスタ2530、2531、2532、2533から)、現行サイクルのこの道の次ブロックアドレスの第1アドレスBNXであり、マルチプレクサ1529の出力は次サイクルの第1アドレスBNXである。BNXとBNYは合体してリードポインタ2510になり、それはトラック・テーブル2501へポイントし、pポイントされたエントリ2511、そして次の3つのエントリ2512、2513、2514を、前述と同様の仕方で読み出す。リードポインタ2510はまたエンド・アドレス・メモリ2502とコラムアドレス・ジェネレータ2503へ送られ、対応する次ブロックアドレスとコラムアドレスを得る。従って、クロック信号が来るとき、リードポインタ2510のBNXとBNYはそれぞれ現行アドレスとしてレジスタ2525と2526へ送られる;トラック・テーブル出力2511〜2514はそれぞれレジスタ2521〜2524へ分岐ターゲット・アドレスとしてラッチされる;エンド・アドレス・メモリ2502の出力はレジスタ2530〜2533へ次ブロックアドレスとしてラッチされ、そして対応するシフトの後レジスタ2540〜2545へラッチされる。プロセッサはオペレーションの新サイクルを、前に述べられたように、開始する。
[404] 道優先順位コード2598がN道であるとき、マルチプレクサ2584は命令依存関係チェッカー・ユニット2560の出力をインクリメント制御信号2597として選ぶ。道優先順位コード2598がO道、P道、Q道であるとき、マルチプレクサ2584はそれに対応して、命令依存関係チェッカー・ユニット2561、2562、2563の出力をインクリメント制御信号2597として選ぶ。道優先順位コード2598がJ道であるとき、マルチプレクサ2584は常に’0’をインクリメント制御信号2597として選び、制御信号はマルチプレクサ2527においてインクリメント値’0’を選ぶ。
[405] ここに幾つかの実例をあげる:分岐決定がN道命令3、4、5、6で分岐しない、そして依存関係チェック・ユニット2560は命令3、4、5、6に依存がないと判断したと仮定する。それから、分岐優先順位エンコーダ2596が道優先順位コードをN道として出力する。そしてマルチプレクサ2581、2582、2583はN道の前端パイプラインの出力を選び、実行のために後端パイプライン2591、2592、2593へ送る。従って、命令3、4、5、6は後端パイプラインで実行し、実行結果は共有RF2586へ書き戻される。マルチプレクサ2584は依存関係チェッカー2560の出力’4’をインクリメント量として選び、加法器2528から2597へ送り、それをマルチプレクサ2585によって選ばれたレジスタ2526の内容’3’に合計する。合計は’7’で、キャリーアウトは’0’である。従ってマルチプレクサ2529はレジスタ2525の内容’68’をマルチプレクサ2585を通して選ぶ。従ってリードポインタは’68.7’、次サイクルはN道の命令7、8、9、10(8、9、10は次IRBブロック内にある)を実行する。他の道O、P、Qは命令7、8、9のトラック・テーブル・エントリから記録された分岐ターゲットから実行を始める。もし命令が非分岐であれば、対応する道のIRBは命令を発行せず、そして道はまた最終分岐決定のために選ばれない。
[406] 分岐決定が命令3、4、5は分岐を取らないが命令6は分岐を取ると結論し、依存関係チェックユニット2560が4つの命令間に相関関係はないと結論したと仮定する。ここで、分岐優先順位エンコーダ2590は道優先順位コードをJ道として出力する。ここで、マルチプレクサ2581、2582、2583はN道の前端パイプライン出力を選び、実行のために後端パイプライン2591、2592、2593へ送る。従って、命令3、4、5、6は後端パイプラインにて実行する。マルチプレクサ2584はJ道のインクリメント制御’0’を選び、加法器2528から2597へ送る。加法器は同インクリメント制御と、マルチプレクサ2585によって選ばれたレジスタ2524の内容’2’を合計し、合計は’2’でキャリーアウトは’0’である。従ってマルチプレクサ2529はレジスタ2524の第1アドレス’68’を選び、それはマルチプレクサ2585によって選ばれる。従ってリードポインタは’68.2’で、次サイクル命令2、3、4、5はN道にて発行される。他の道O、P、Qは命令2、3、4のトラック・テーブル・エントリに記録された分岐ターゲットから実行を始める。
[407] 分岐決定がスロットA命令3は分岐を取らない、しかしスロットB命令4は分岐を取る、そして依存関係チェックユニット2562が4つの命令間に相関関係はないと結論したと仮定する。それから分岐優先順位エンコーダ2596は道優先順位コードをP道として出力する。マルチプレクサ2581はN道Bスロットの前端パイプライン出力を選び、実行のために後端パイプライン2591へ送る。マルチプレクサ2582、2583はP道スロットC、スロットDの前端パイプライン出力を、後端パイプライン2592、2593によって実行されるべく、選ぶ。従って命令3、4、7、8は後端パイプラインで実行される。マルチプレクサ2584は依存関係チェックユニット2562の出力のインクリメント制御’2’を選び、加法器2528から2597へ送る。
加法器2528はインクリメント制御とマルチプレクサ2585によって選ばれたレジスタ2522の内容’7’とを合計する。合計は’1’でキャリーは’1’である。従って、マルチプレクサ2529はレジスタ2532の第1アドレス’23’の内容を選び、それはマルチプレクサ2586によって選ばれる。従って、リードポインタは’23.1’、命令9、10、11、12(4つの連続した命令で次命令ブロックのアドレスが’1’であるものから始まる)は次サイクルにN道にて発行される。他の道O、P、Qは命令9、10、11のトラック・テーブル・エントリに記録された分岐ターゲットから実行を始める。
[408] 分岐決定がスロットA命令3は分岐を取り、そして依存関係チェックユニット2561がO道Bスロット命令0がN道Aスロット命令3に依存関係を持つ結論したと仮定する。それから分岐優先順位エンコーダ2596は道優先順位コードをO道として出力する。そしてマルチプレクサ2581、2582、2583はO道Bスロット、Cスロット、Dスロットの前端パイプラインの出力を、後端パイプライン2591、2592、2593によって実行されるべく選ぶ。従って命令3、0、1、2は後端パイプラインで実行される;しかしそれからB、C、Dスロットの0、1 、2命令は依存関係により中止され、スロットAの命令3のみが完了され、その結果は共有RF2595へ書き戻される。マルチプレクサ2584は依存関係チェックユニット2561によって出力されたインクリメント制御’0’を選び、加法器2528から2597へ送る。加法器2528はインクリメント制御とマルチプレクサ2585によって選ばれたレジスタ2521の第2アドレスの内容’0’とを合計する。合計は’0’でキャリーは’0’である。従って、マルチプレクサ2529は、マルチプレクサ2585によって選ばれた、レジスタ2521の第1アドレス’68’の内容を選ぶ。従って、リードポインタは’68.0’、命令0、1、2、3は次サイクルにN道にて発行される。他の道O、P、Qは命令0、1、2のトラック・テーブル・エントリに記録された分岐ターゲットから実行を始める。
[409] この実施形態はジグザグ・バスによって制御されたIRBを用い、それは複数の命令を順番に発行することができる。この実施形態は分岐ターゲット情報と命令の次ブロックアドレス情報をフル活用し、共にトラック・テーブルに記憶され、それは間もなく実行され、複数の同IRBを制御し、分岐命令による複数の実行径路上の命令を並列に前処理する。この実施形態は処理されている各分岐命令に対して分岐決定をおこない、それから最終分岐決定結果を、分岐命令の順序を考慮にいれて、生成する。分岐決定結果は、さらに処理されるべき複数の実行径路の1つのセットの、中間的な前処理結果を選び、そして選ばれたセットの中の命令に対する依存関係チェックは、選ばれたセットの中の命令の一部もしくは全部が実行を完了するために用いられる、他は中止される、かを決定する。それはまた選ばれた径路の先頭第2アドレスを同じ径路のインクリメント量に追加する。次サイクルにおいて、加算の合計は第2アドレスになり、先頭第1アドレスは、もし合計がIRBブロック境界を越えなければ、次サイクルの第1アドレスになる。次サイクルにおいて、IRBブロック境界以内の合計は第2アドレスになり、選ばれた径路の次ブロックアドレスは、もし合計がIRBブロック境界を越えれば、第1アドレスになる。
[410] 本開示は命令マルチ発行の方法を開示する。この方法はn個の連続した命令を並列に発行する、アドレスaの命令から始めて、依存関係チェックモジュールを用いて同複数命令間の依存関係を検出し、依存関係と依存命令の場所に応じてアドレス・インクリメント量iをフィードバックする;そして命令アドレスa=a+iから始まる n個の命令を発行する。ここで、発行する命令の列は0、1、2、…、n-1と定義される;それからi=p、pは命令列の最初の依存命令の場所である;nは、もし発行された命令間に依存が見つからない場合の依存命令の場所と定義される。ここで依存関係をもつ2命令のうち、列の後方にある命令を、依存命令と定義する。
[411] 本開示は特別データリード・バッファ(DRB)を採用する。データエンジンは命令に対応するデータを先取りし、DRBヘ前もって充填する命令が発行されるとき、対応するデータは自動的にIRBから実行のために抽出される。
[412] パイプラインのプロセッサは通常の命令取得パイプ段階から出発せず、むしろ命令デコード・パイプ段階から出発する;それはまたメモリ(データ)アクセス段階を含まない。命令はプロセッサ・コアへ、トラック・テーブル、トラッカー、そしてIRBを含む命令エンジンによって押し込まれる。データはデータエンジンによって先取りされ、DRBへ充填され、データはコアへ、対応する命令の発行に続いて、押し込まれる。
[413] この方法の具体的な実装は、対角もしくはいわゆるジグザグ・ワードラインを用いて、メモリを制御し、それは1つの命令(もしくは一般的にデータ)に対して複数のリードポートを持ち、複数のビットラインがこれらのリードポートを接続し、それらは互いに独立しており、よって連続した命令(もしくは連続したデータ)のセグメントが、複数のビットラインの上を、接続された複数の処理ユニットへ、並列処理のために送られる。
[414] 本開示はまた、命令ループを複数のレーンへ展開し並列に実行する方法も開示する。
[415] 本開示はまた、複数レーン・プロセッサの命令スケジューリング方法、そしてスレッド優先度、命令の準備/有効状態、そしてこれらスレッドのデータ、に応じてレーン資源を割り当てる方法も開示する。
[416] 本発明はまた、複数レーン・プロセッサのレーン間の命令実行を同期させる方法も開示する。
[417] 図22は実施形態に整合する例示的な、レーン・プロセッサの汎用IRB構造である。この実施形態において、各レーンは全く同じ構造、汎用構造を持ち、各レーンは4道を含みそして1つの命令スロットに対応する。全部で4つのスロットがある:A、B、C、D、で図21に示される分岐ペナルティ無しにILPマルチ発行を実現する。
[418] 特に、図22の第1レーン(スロットA)を例にとると、各レーンのトラック・テーブル2601、トラッカー2604、レジスタ2621、2622、2623、IRB2650はそれぞれ図21のトラック・テーブル2501、トラッカー2504、レジスタ2521、2522、2523、IRB2550へ対応する。レーンのIRB2650は4道を含むから、従って4つの対応する前端パイプラインが存在し、前端パイプライン2670は図21の実行ユニット2570へ対応し、実行ユニット2661、2662、2663は他の3道に対応する。マルチプレクサ2680がこれら4道の前端パイプラインの結果を選んだ後、実行を続けるためにそれを後端パイプライン2690へ送る。
[419] この実施形態において、図21の実施形態におけるように、スロットAはN道のみを必要とし、従ってIRB2650のO、P、Q道と最後の3つの前端パイプライン2661、2662、2663は無効と設定され、マルチプレクサ2680は常に前端パイプライン2670の出力を選ぶよう設定され、設定後のレーンの構造は図21のスロットAと同様である。スロットBはN、O道だけ必要とし、従ってIRB2651のP、Q道と最後の2つの前端パイプラインは無効と設定され、マルチプレクサ2681は前端パイプライン2671と2674の出力を選ぶよう設定され、設定後のレーンの構造は図21のスロットBと同様である。スロットCはN、O、P道だけ必要とし、従ってIRB2652のQ道と最後の前端パイプラインは無効と設定され、マルチプレクサ2681は前端パイプライン2672、2675、2674の出力を選ぶよう設定され、設定後のレーンの構造は図21のスロットCと同様である。スロットDは4道全て必要とし、従って設定後のレーンの構造は図21のスロットDと同様である。明瞭のため、優先順位エンコーダとその対応するマルチプレクサ、相関検出モジュール2660の詳細は図22に示されていない。優先順位エンコーダそしてその対応するマルチプレクサ、の構造と機能は図21のそれと同じである。依存関係チェッカー・モジュール2660は、図21の依存関係チェッカー・モジュール2560、2561、2562、2563の機能を含み、図21の配線が示すような、対応するスロットと道において発行された命令に対して同様の依存関係チェックを施すことができ、よってここでは繰り返されない。
[420] レーン・プロセッサが、図21の実施形態で示されたような、分岐ペナルティ無しのILPマルチ発行モードであるとき、4スロットのうち1スロットAのトラック・テーブル2601、トラッカー2604、レジスタ2621、2622、2623が用いられる。他の3つのスロットのトラック・テーブル、トラッカーそして対応するレジスタはオペレーションに参加しない。この実施形態において、このモードは、これら4スロットのマルチプレクサ2640、2641、2642、2643の設定を通して達成される。特に2640はトラッカー2604によって出力されたリードポインタを出力として選ぶように設定され、この出力は図21のバス2520と等しく、スロットAのIRB2650のコントローラへ送られ、ローカル・ワードライン2655を駆動して、N道スロットAから命令を発行する。ローカル・ワードライン2655はさらにグローバル・ジグザグ・ワードライン2645を駆動して、N道スロットB、C、Dから同時に命令を発行し、これら4つのN道の命令はそれぞれ前端パイプライン2670、2671、2672、2673へ実行のために送られる。
[421] マルチプレクサ2641は、レジスタ2621の出力のリードポインタ値をスロットBのIRB2651のコントローラへの出力として選び、ローカル・ワードライン2656を駆動して、O道スロットBからの命令を発行する、ように設定される。ローカル・ワードライン2656はさらにグローバル・ジグザグ・ワードライン2646を駆動して、O道スロットC、Dから同時に命令を発行し、これら3つのO道の命令はそれぞれ前端パイプライン2674、2675、2676へ実行のために送られる。
[422] マルチプレクサ2642は、レジスタ2622の出力のリードポインタ値をスロットCのIRB2652のコントローラへの出力として選び、ローカル・ワードライン2657を駆動して、P道スロットCからの命令を発行する、ように設定される。ローカル・ワードライン2657はさらにグローバル・ジグザグ・ワードライン2647を駆動して、P道スロットDから同時に命令を発行し、これら2つのP道の命令はそれぞれ前端パイプライン2677、2678へ実行のために送られる。
[423] マルチプレクサ2643は、レジスタ2623の出力のリードポインタ値をスロットDのIRB2653のコントローラへの出力として選び、ローカル・ワードライン2658を駆動して、Q道スロットDからの命令を発行し、前端パイプライン2679へ実行のために送る、ように設定される。
[424] 後続のオペレーションは図21で実施されたものと同じであり、よってここでは繰り返されない。よって、この実施形態の汎用レーン構造は図21の実施形態で描かれた機能を設定によって達成する。
[425] 本開示は、計算資源の複数のセットによって消費される命令とデータの間の相関関係を設定することで、様々なモードの並列命令実行を達成する方法を開示する。本開示はまたレーン・プロセッサを開示し、それは複数のワードライン(複数の命令メモリを制御し、そのリードポートは相互に独立なビットラインによって繋がっている)の設定を通して並列で複数の命令を発行することが可能である。これらのワードラインはローカル・ワードライン、それはレーン内を制御する、そしてグローバル直線ワードラインとグローバル筋交いワードライン、それらは共にレーン間の通過を制御する、を含む。ワードラインの設定と各命令メモリの内容そしてレーン間データ交換が、このレーン・プロセッサが複数モードの動作をサポートすることを可能にする。各レーンは独立にもしくは組み合わさって動作することができる。隣接するレーンは異なるモード下で動作でき、互いに干渉しない。レーンはまたソフトウェアによって直列関係に設定可能で、データをリレー方式で処理する。
[426] 本開示はさらに、マルチレーン・プロセッサを使ってILPマルチ命令発行を実現する方法も開示する。この方法は、各レーンへ複数分岐の命令を処理するために複数の前端パイプラインを供給し、レーン間のデータ交換を提供し、各レーンのレジスタファイル内容を同じにし、各レーンが同じプログラムを同期しながら実行するようにする。先頭アドレスから始まるn個の連続した命令を駆動し、そしてn命令内の分岐命令からの可能な分岐ターゲット命令を、分岐関係に応じた異なる仕方で駆動し、そして命令シーケンス順序に応じてn命令スロットへ駆動する。
各nレーンはそれ自身の発行スロットの命令に責任を持つ。各スロットの命令は同時に発行される。同複数の同時発行命令はそれぞれ独立に実行される。命令間の依存関係はチェックされ、依存関係を持つ命令と同じ道の後続命令は全て中止される;そして道アドレス・インクリメント量は、命令間に依存関係があるか、そして依存命令の場所、にもとづいて、各道へフィードバックされる。分岐決定が独立に各分岐命令を、他の分岐決定に関係なく、実行するようにする。独立した分岐決定のそれぞれと分岐命令シーケンス順序にもとづいた分岐優先度、にもとづいて、現行サイクルと次サイクルにおける実行の道を決定する。決定された道にもとづいて、同同時発行命令から正常実行とリタイアのためのn個の命令を選び、残りの命令を中止する。決定された次サイクルの道にもとづいて、この道の現行サイクル・アドレスと道のインクリメント量とを合計する。結果は次サイクルの先頭アドレスのブロックオフセット・アドレスBNYである。もし上記合計がブロックアドレス境界を越えないなら、決定された道の現行サイクル・アドレスを、次サイクルの先頭ブロック・アドレスBNXとする。もし上記合計がブロックアドレス境界を越えるなら、決定された道の現行サイクル次ブロック・アドレスを、次サイクルの先頭ブロック・アドレスBNXとする。それから先頭アドレスから始まるn個の連続した命令、そしてn個の命令内の分岐命令からの可能な分岐ターゲット命令が同時に発行される。このプロセスは繰り返して行なわれる。
[427] 図23は実施形態と整合する例示的な、レーン・プロセッサ・システムの完全な構造である。2つのレーンを持ち、各レーンは4つの道をもつ、レーン・プロセッサ・システムが例として示される。実施形態の方法とシステムはまた、より多くのレーンもしくは道を持ったレーン・プロセッサ・システムへも拡張できるが、それらの詳細はここでは探られない。この実施形態において、プロセッサ・システムはトラック・テーブル・モジュール2701、トラッカーモジュール2703、データエンジン・モジュール2705、第1レベル命令キャッシュ2707、IRB2709、依存関係チェッカー・モジュール2711、実行ユニット2713、データリード・バッファ2715、書き込みバッファ2717、第1レベルデータキャッシュ2719、スキャナ2721、第2レベルキャッシュ2723から構成される。第2レベルキャッシュ2723は命令とデータの両方を記憶する。前実施形態で述べられたように、トラッカー2703が、分岐ターゲット命令がまだ第1レベル命令キャッシュ2707に記憶されていないことを見いだしたとき、それは対応する命令ブロックを第2レベルキャッシュ2723から取得し、それを第1レベル命令キャッシュ2707へ充填し、同時に対応するトラックを、スキャナが充填された命令を検査した後、トラック・テーブル2701に造る。データエンジン2705が、データアクセス命令のデータアドレスに対応するデータがまだ第1レベルデータキャッシュ2719に記憶されていないことを見いだしたとき、それは対応するデータブロックを第2レベルキャッシュ2723から取得し、それを第1レベルデータキャッシュ2719へ充填し、同時に第2レベルキャッシュ2723へ、第1レベルデータキャッシュ2719からはじき出されたデータブロックを書き戻す。
[428] この実施形態のレーン・プロセッサ・システムは2つのレーン(命令スロットAとBに対応する)を含み、各レーンは4道(合計8道)を含み、各道は実行ユニット、IRB、DRBからなるセットを持つ。依存関係チェッカー・モジュール2711は設定可能で、レーン内で、もしくは複数レーンのある道において、あるいは複数レーンの全ての道において、発行された命令間の依存関係を検出する。トラッカー・モジュール2703とトラック・テーブル・モジュール2701は2つのトラッカーと2つのトラック・テーブルを含み、それぞれスロットAとBに対応する。命令レベル並列発行と設定されたとき、スロットAトラッカー・モジュール2703とトラック・テーブル・モジュール2701に対応するトラッカーとトラック・テーブルだけが動作し、スロットAのトラッカーは、第1レベル命令キャッシュ2707から、分岐ターゲット命令をインデックスし取得し、それをプロセッサが分岐命令へと実行する前に、IRB2709へ充填する。スロットBに対応するトラッカーとトラック・テーブルは動作しない。
[429] 加えて、図21、22の実施形態において描かれたように、トラッカー・モジュール2703は新しい現行BNX、BNYを、初期BNX、BNYに依存関係チェックユニット2711によって出力されたインクリメント量、実行ユニット2713によって出力される分岐結果2714に応じて決定される、を追加することによって計算する。
[430] データエンジン・モジュール2705もまた2つのデータエンジンを含み、それぞれスロットAとBに対応している。この例では、データエンジンは図18のそれと同様である。それは同じデータアクセス命令の次回の実行のために、ストライド情報にもとづいて可能なデータアドレスを計算する。同データアドレスに対応するデータが第1レベル・データキャッシュ2719からIRB2715へ、もしまだそこにないなら、充填される。特に、IRB2709がデータアクセス命令を実行ユニット2713へ発行するとき、同時にバス2710を通してDRB2715へ宛てる(図18Bの実施形態の例では、アドレスはバス2215を通してデコーダ222へ送られ、それからデータアクセス命令に対応するデータを読み出すためにインデクスする)。
[431] 加えて、実施形態のプロセッサ・システムにおいて、書き込みバッファ2717は、実行ユニット2713が第1レベルデータキャッシュ2719に書き戻そうとしているデータを、一時的に記憶し、一時的データを、もしDRB2715へデータを充填しないなら、第1レベルデータキャッシュ2719へ書き戻す(第1レベルデータキャッシュ2719のポートはこのときビジーでない)。これは第1レベルデータキャッシュ2719における読み込み/書き込み衝突を減らし、実行ユニット2713で使われうるデータがDRB2717へ直に充填されることを保証する。
[432] 前実施形態で述べられたように、トラッカー・モジュール2703の誘導のもと、本実施形態のプロセッサ・システムはIRBを制御し、正しい命令をプログラムフローに沿って中断無しに実行ユニットにて実行されるように供給し、そしてIRBに記憶された情報をもとに、分岐命令が分岐を取るか否かに関わらず、対応するデータをDRBの中に見つける。プロセッサ・システムで用いられた各道はそれ自身のIRBとDRBを持ち命令と対応するデータを供給するから、従って命令と対応するデータは異なる道に対して同時に供給され、よってプロセッサ・システム効率を向上させる。
[433] 本開示の技術的なプランはより多くの階層を持ったキャッシュ・システムに拡張しうる。
[434] この分野に精通した者には、ここに示された実施形態の様々なバリエーションが企てられうることが自明である。発明は例示的な実施形態において描写されたものの、添付された請求項の精神と範囲の中で修正を伴って上述で概説されたように実装されることが考えられる。
[435] 本開示の装置と方法はレーン・プロセッサに関連する様々なアプリケーションへ応用され、それはレーン・プロセッサの効率を向上させることができる。