本発明の実施の一形態について図1ないし図21に基づいて説明すれば、以下のとおりである。
(データ処理装置の構成)
本実施形態に係るデータ処理装置の概略構成を図2に示す。同図に示すように、該データ処理装置は、MSP(Main Stream Processor)1A、SSP(Shadow Stream Processor)1B、再利用表としての命令区間記憶部(入出力記憶手段)2、および主記憶(主記憶手段)3を備えた構成となっており、主記憶3に記憶されているプログラムデータなどを読み出して各種演算処理を行い、演算結果を主記憶3に書き込む処理を行うものである。なお、同図に示す構成では、SSP1Bを1つ備えた構成となっているが、2つ以上備えた構成となっていてもよい。
命令区間記憶部2は、プログラムにおける関数およびループを再利用するためのデータを格納するメモリ手段であり、RF、RB、RB登録処理部(登録処理手段)2A、および予測処理部(予測処理手段)2Bを備えた構成となっている。この命令区間記憶部2におけるRFおよびRBの詳細、ならびにRB登録処理部2Aおよび予測処理部2Bの詳細については後述する。
主記憶3は、MSP1AおよびSSP1Bの作業領域としてのメモリであり、例えばRAM(Random Access Memory)などによって構成されるものである。例えばハードディスクなどの外部記憶手段からプログラムやデータなどが主記憶3に読み出され、MSP1AおよびSSP1Bは、主記憶3に読み出されたデータに基づいて演算を行うことになる。
MSP1Aは、RW(再利用記憶手段)4A、演算器(第1の演算手段)5A、レジスタ6A、Cache7A、および通信部9Aを備えた構成となっている。また、SSP1Bは、RW(再利用記憶手段)4B、演算器(第2の演算手段)5B、レジスタ6B、Cache/Local7B、判定部8B、および通信部9Bを備えた構成となっている。
RW4A・4Bは、再利用ウィンドウであり、現在実行中かつ登録中であるRFおよびRBの各エントリをリング構造のスタックとして保持するものである。このRW4A・4Bは、実際のハードウェア構造としては、命令区間記憶部2における特定のエントリをアクティブにする制御線の集合によって構成される。
演算器5A・5Bは、レジスタ6A・6Bに保持されているデータに基づいて演算処理を行うものであり、ALU(arithmetic and logical unit)と呼ばれるものである。レジスタ6A・6Bは、演算器5A・5Bによって演算を行うためのデータを保持する記憶手段である。なお、本実施形態では、演算器5A・5B、およびレジスタ6A・6Bは、SPARCアーキテクチャに準じたものとする。Cache7A・7Bは、主記憶3と、MSP1AおよびSSP1Bとの間でのキャッシュメモリとして機能するものである。なお、SSP1Bでは、Cache7Bには、局所メモリとしてのLocal7Bが含まれているものとする。
判定部8Bは、後述する事前実行の起動開始後の主記憶読み出しが行われる際に、RBにおける入出力記録行(後述)、予測値格納領域(後述)、待機用アドレス格納領域(後述)、およびCache/Local7Bのうち、どこから値を読み出すかを判定するブロックである。この判定処理の詳細については後述する。この判定部8Bは、SSP1B内に設けられた小さなプロセッサによって実現される。
通信部9A・9Bは、MSP1AまたはSSP1Bによって主記憶書き込みが行われる場合に、その旨をその他の全てのSSP1B…またはMSP1Aに対して通知するブロックである。この通信部9A・9Bは、MSP1AまたはSSP1B内に設けられた小さなプロセッサによって実現される。
(RF/RBの構成)
図1は、本実施形態における命令区間記憶部2におけるRFおよびRBの構成の概要を示している。同図に示すように、RFは、複数のエントリを格納しており、各エントリに対して、該エントリが有効であるか否かを示すV、エントリ入れ替えのヒントを示すLRU、関数の先頭アドレスを示すStart、参照すべき主記憶アドレスを示すRead/Write、および、関数とループとを区別するF/Lを保持している。
また、RBは、RFに格納されているエントリに対応して複数のエントリを格納しており、各エントリに対して、該エントリが有効であるか否かを示すV、エントリ入れ替えのヒントを示すLRU、関数またはループを呼び出す際の直前のスタックポイント%spを示すSP、引数(Args.)(V:有効エントリ、Val.:値)、主記憶値(C-FLAG:Readアドレスの変更フラグ、P-Mask:Readアドレスの履歴マスク、Mask:Read/Writeアドレスの有効バイト、Value:値、S-Count:Read/Writeアドレスのストアカウンタ)、返り値(Return Values)(V:有効エントリ、Val.:値)、ループの終了アドレス(End)、ループ終了時の分岐方向を示すtaken/not、および、引数や返り値以外のレジスタおよび条件コード(Regs.,CC)を保持している。また、RBは、1つ以上のレジスタアドレスに対応して定数フラグ(Const-FLAG)を格納するメモリ領域を保持している。なお、定数フラグ(Const-FLAG)の詳細については後述する。
上記のRFおよびRBにおける各項目についてより詳細に説明する。上記Vは、上記のようにエントリが有効であるか否かを示すものであるが、具体的には、未登録時には「0」、登録中である場合には「2」、登録済である場合には「1」の値が格納されるようになっている。例えば、RFまたはRBを確保する際に、未登録エントリ(V=0)があれば、これを使用し、未登録エントリがなければ、登録済エントリ(V=1)の中からLRUが最小のものを選択して上書きすることになる。登録中エントリ(V=2)は使用中であるので上書きすることはできない。
上記LRUは、一定時間間隔で右へシフトされていくシフトレジスタの中の「1」の個数を示したものである。RFの場合、このシフトレジスタは、該当エントリに関して、再利用のための登録を行ったか、もしくは再利用を試みた場合に、左端に「1」が書き込まれるようになっている。したがって、該当エントリが頻繁に使用されれば、LRUは大きな値となり、一定期間使用されなければ、LRUの値は0となる。一方、RBの場合、シフトレジスタには、該当エントリが再利用された場合に「1」が書き込まれるようになっている。したがって、該当エントリが頻繁に使用されれば、LRUは大きな値となり、一定期間使用されなければ、LRUの値は0となる。
上記RBにおける主記憶値のMaskについて説明する。一般に、アドレスとデータとを1バイトずつ管理することにすれば管理が可能であるが、実際には、4バイト単位でデータを管理する方がキャッシュ参照を高速に行うことができる。そこで、RFでは、主記憶アドレスを4の倍数で記憶するようになっている。一方、管理単位を4バイトとする場合、1バイト分だけをロードすることに対応できるようにするために、4バイトのうちでどのバイトが有効であるかを示す必要がある。すなわち、Maskは、4バイトのうちでどのバイトが有効であるかを示す4ビットのデータとなっている。例えば、C001番地から1バイト分をロードした結果、値がE8であった場合、RFには、アドレスC000が登録され、RBのMaskに「0100」、Valueに「00E80000」が登録されることになる。なお、Readアドレスにおける変更フラグ(C-FLAG)および履歴マスク(P-Mask)、ならびにRead/Writeアドレスにおけるストアカウンタ(S-Count)の詳細については後述する。
上記の引数や返り値以外のレジスタおよび条件コード(Regs.,CC)について説明する。本実施形態では、SPARCアーキテクチャレジスタのうち、汎用レジスタ%g0-7、%o0-7、%l0-7、%i0-7、浮動小数点レジスタ%f0-31、条件コードレジスタICC、浮動小数点条件コードレジスタFCCを用いるようになっている(詳細は後述する)。このうち、リーフ関数の入力は汎用レジスタ%o0-5、出力は汎用レジスタ%o0-1、また、非リーフ関数の入力は汎用レジスタ%i0-5、出力は汎用レジスタ%i0-1、になり、入力は、arg[0-5]、出力は、rti[0-1]に登録される。SPARC−ABIの規定では、これら以外のレジスタは関数の入出力にはならないので、関数に関してはRBにおける引数(Args.)の項で十分である。
一方、SPARC−ABIの規定では、ループの入出力に関しては、用いられるレジスタの種類を特定することはできないので、ループの入出力を特定するには、全ての種類のレジスタに関してRBに登録する必要がある。よって、RBにおけるRegs.,CCには、%g0-7、%o0-7、%l0-7、%i0-7、%f0-31、ICC、FCCが登録されるようになっている。
以上のように、命令区間記憶部2において、ReadアドレスはRFが一括管理し、MaskおよびValueはRBが管理している。これにより、Readアドレスの内容とRBの複数エントリをCAM(content-addressable memory)によって一度に比較する構成を可能としている。このことについて、以下により詳しく説明する。
一般的に、アドレスが与えられると、そのアドレスに格納された値を参照することができるメモリは、RAMと呼ばれるメモリである。一方、上記のCAMとは、連想メモリと呼ばれるメモリであり、検索すべき内容が与えられると、そのエントリに対応する信号がONとなるように動作するようになっている。通常は、CAMはRAMとセットにして用いられる。
ここで、CAMとRAMとの連携動作について、具体例を挙げて説明する。CAMに、「5,5,5,5,5」、「1,3,1,1,1」、「1,3,3,5,2」、「6,6,6,6,6」というデータ列がエントリとして登録されており、RAMに、CAMにおける各データ列に対応して、「5,5」、「1,1」、「1,2」、「6,6」というデータが登録されているとする。ここで、検索すべきデータ列として、「1,3,3,5,2」をCAMに入力すると、一致するエントリがONとなり、RAMに登録されている該当するデータ「1,2」が出力されることになる。この具体例と同様の構成および動作によって、上記RBが実現されることになる。
なお、図2に示すように、本実施形態におけるRBには、入出力記録行(入出力記録領域)、区間毎情報として履歴格納行(履歴格納領域)、予測値格納領域、および待機要アドレス格納領域、ならびに予測実行結果記録行が設けられている。これらの入出力記録行、履歴格納行、予測値格納領域、および待機要アドレス格納領域、ならびに予測実行結果記録行は、図1に示すRBにおけるエントリにほぼ準じた形式で実現されるが、それぞれ格納形式が若干異なっている。これらの格納形式の詳細については後述する。
(再利用処理の概略)
次に、関数およびループのそれぞれの場合について、再利用処理の概略について説明する。
まず、関数の場合について説明する。関数から復帰するまでに次の関数を呼び出した場合、または、登録すべき入出力が再利用表の容量を超える、引数の第7ワードを検出する、途中でシステムコールや割り込みが発生する、などの擾乱が発生しなかった場合、復帰命令を実行した時点で、登録中のエントリを有効にする。
以降、図1を参照しながら説明すると、関数を呼び出す前に、(1)RFに登録されているエントリにおける関数の先頭アドレスに、該当関数の先頭アドレスと一致するものがあるかを検索する。一致するものがある場合には、(2)RBに登録されている該当関数に関するエントリにおける引数が、呼び出す関数の引数と完全に一致するエントリを選択する。そして、(3)関連する主記憶アドレスすなわち少なくとも1つのMaskが有効であるReadアドレスをRFからすべて参照して、(4)RBに登録されている内容と一致比較を行う。全ての入力が一致した場合に、(5)RBに登録済の出力(返り値、大域変数、およびAの局所変数)を主記憶3に書き戻すことによって、関数の実行を省略する、すなわち関数の再利用を実現することができる。
次に、ループの場合について説明する。ループが完了する以前に関数から復帰したり、前記した擾乱が発生したりするなど、ループの入出力登録が中止されなければ、登録中のループに対応する後方分岐命令を検出した時点で、登録中の入出力表エントリを有効にし、そのループの登録を完了する。
さらに、後方分岐命令が成立する場合は、次のループが再利用可能かどうかを判断する。すなわち、図1を参照しながら説明すると、後方分岐する前に、(1)RFに登録されているエントリにおけるループの先頭アドレスに、該当ループの先頭アドレスと一致するものがあるかを検索する。一致するものがある場合には、(2)RBに登録されている該当ループに関するレジスタ入力値が、呼び出すループのレジスタ入力値と完全に一致するエントリを選択する。そして、(3)関連する主記憶アドレスをRFから全て参照して、(4)RBに登録されている内容と一致比較を行う。全ての入力が一致した場合に、(5)RBに登録済の出力(レジスタおよび主記憶出力値)を主記憶3に書き戻すことによってループの実行を省略する、すなわちループの再利用を実現することができる。
再利用した場合、RBに登録されている分岐方向に基づいて、さらに次のループに関して同様の処理を繰り返す。一方、次のループが再利用不可能であれば、次のループを通常に実行し、RFおよびRBへの登録を開始する。
(命令区間の実行時における処理の流れ)
次に、命令がデコードされた場合の具体的な処理の流れについて説明する。以下では、命令がデコードされた結果、関数呼び出し命令である場合、関数復帰命令である場合、後方分岐成立の場合、後方分岐不成立の場合、およびその他の命令の場合について、それぞれ処理の流れを説明する。
(関数呼び出し命令である場合)
命令がデコードされた結果、関数呼び出し命令である場合の処理を図3に示すフローチャートを参照しながら以下に説明する。まずステップ1(以降、S1のように称する)において、引数の第7ワードを検出したか否かが判定される。S1においてYES、すなわち、引数の第7ワードを検出したと判定された場合には、RWに登録されている登録中RBエントリを全て無効化し、S6に移行して、プログラムカウンタを関数の先頭へ進め、処理を終了する。
一方、S1においてNO、すなわち、引数の第7ワードを検出していないと判定された場合には、該関数呼び出しおよび入力値がRFおよびRBに登録されているか否かを検索する(S2)。S2においてYES、すなわち、該関数呼び出しおよび入力値がRFおよびRBに登録されていると判定された場合には、後述するS7のステップに移行する。
S2においてNO、すなわち、該関数呼び出しおよび入力値がRFおよびRBに登録されていないと判定された場合、該関数のためのRFエントリおよびRBエントリを確保しようと試み、(1)既存のRFエントリがあるか、(2)登録作業中につき追い出すことのできないRFエントリ以外に、使用可能なRFエントリがあるか、または(3)登録作業中につき追い出すことができないRBエントリ以外に、使用可能なRBエントリがあるかを判定する(S3)。
S3においてNO、すなわち、使用可能なRF・RBエントリがないと判定された場合には、登録を開始せず、RWに登録されているRBを全て無効化し(S5)、RWを空にする。一方、S3においてYES、すなわち、使用可能なRF・RBエントリがあると判定された場合には、該関数のためのRFエントリおよびRBエントリを確保し、RWに登録する(S4)。ここで、RWに登録した際に、RWに登録されているRWエントリが溢れた際には、最も古いRWエントリを削除し、対応するRBを無効化する。S3またはS4が行われた後に、プログラムカウンタを関数の先頭へ進め(S6)、処理を終了する。
一方、S2においてYES、すなわち、該関数呼び出しおよび入力値がRFおよびRBに登録されていると判定された場合、該関数は再利用可能であることになる。すなわち、RBから出力値を求めるとともに、レジスタおよび主記憶3にこの出力値を書き込む(S7)。そして、登録中の関数/ループがRWに登録されているか否かを判定し(S8)、登録されている場合には、再利用を行った関数のRBエントリの内容のうち必要なものをRWに登録されているエントリに追加する(S9)。ここで、RWのTOPから順に登録し、途中でRBがあふれた場合には、以降、RWのBOTTOMまでに対するRBを無効化し、RWから削除する。その後、プログラムカウンタを次の命令へ進め(S10)、処理を終了する。
(関数復帰命令である場合)
命令がデコードされた結果、関数復帰命令である場合の処理を図4に示すフローチャートを参照しながら以下に説明する。S11において、RWのTOPから順にたどり、関数に対応するRF/RBが検出されるまでに、ループに関するRBが検出されるか否かが判定される(S12)。ここでループに関するRBが検出されると(S12においてYES)、該当RBを全て無効化するとともに、RWから削除する(S13)。
一方、RW探索中に、該関数に対応するRF/RBを検出したか否かが判定される(S14)。ここで、該関数に対応するRF/RBが検出されると(S14においてYES)、該当RBエントリを有効化するとともに、RWから削除する(S15)。
その後、復帰命令を実行し(S16)、処理を終了する。
(後方分岐成立である場合)
命令がデコードされた結果、後方分岐成立である場合の処理を図5に示すフローチャートを参照しながら以下に説明する。まず、RWのTOPから順にたどり、関数に対応するRBを検出するか否かが判定される(S21)。S21においてYES、すなわち、関数に対応するRBを検出した場合には、後述するS24のステップに移行する。
一方、S21においてNO、すなわち、関数に対応するRBを検出しない場合には、次に、該後方分岐命令自身のアドレスとRB中のループ終了アドレスとが一致するか否かが判定される(S22)。S22においてNO、すなわち、該後方分岐命令自身のアドレスとRB中のループ終了アドレスとが一致しないと判定されると、後述するS24のステップに移行する。
S22においてYES、すなわち、該後方分岐命令自身のアドレスとRB中のループ終了アドレスとが一致すると判定された場合、RWのTOPから該RBの手前までのRBを全て無効化し(S23)、RWから削除する。また、該RBエントリを有効化し、かつtaken=1とし、RWから削除する。
次に、S24において、次ループの先頭アドレスおよび入力値がRFおよびRBに登録されているか否かが判定される。S24においてYES、すなわち、次ループの先頭アドレスおよび入力値がRFおよびRBに登録されている場合には、後述するS30のステップに移行する。
一方、S24においてNO、すなわち、次ループの先頭アドレスおよび入力値がRFおよびRBに登録されていない場合には、次ループのためのRFエントリおよびRBエントリを確保しようと試み、(1)既存のRFエントリがあるか、(2)登録作業中につき追い出すことができないRFエントリ以外に、使用可能なRFエントリがあるか、または(3)登録作業中につき追い出すことができないRBエントリ以外に、使用可能なRBエントリがあるかが判定される(S25)。
S25においてNO、すなわち、使用可能なRF・RBエントリがないと判定された場合には、登録を開始せずに、RWに登録されているRBを全て無効化し(S26)、RWを空にする。その後、S29において、プログラムカウンタを条件分岐先へ進め、処理を終了する。
一方、S25においてYES、すなわち、使用可能なRF・RBエントリがあると判定された場合には、その使用可能なRF・RBエントリを確保し、確保したRF・RBをRWに登録する(S27)。また、RBにループ終了アドレス(後方分岐命令自身のアドレス)を登録する。ここで、RWへの登録を行った際にRWが溢れた場合には、最も古いRWエントリを削除し(S28)、それに対応するRBを無効化する。その後、S29において、プログラムカウンタを条件分岐先へ進め、処理を終了する。
一方、前記したS24においてYESとなった場合、次ループは再利用可能であることになるので、RBから出力値を求め、この値をレジスタおよび主記憶3に書き込む(S30)。ここで、登録中の関数/ループがRWに登録されているか否かが判定され(S31)、登録されている場合、再利用を行ったループのRBエントリの内容のうち必要なものをRWに登録されているエントリに追加する(S32)。このとき、RWのTOPから順に登録し、途中でRBが溢れた場合、以降、RWのBOTTOMまでに対するRBを無効化し、RWから削除する。
その後、プログラムカウンタは、次ループ先頭ではなく、該RB中のtakenの値に応じて、taken=1の場合は自命令、taken=0の場合は、RB中に記憶しておいたループ終了アドレスの次へ進める。その後、処理を終了する。
(後方分岐不成立である場合)
命令がデコードされた結果、後方分岐不成立である場合の処理を図6に示すフローチャートを参照しながら以下に説明する。まず、RWのTOPから順に検索し(S41)、関数に対応するRBを検出したか否かが判定される(S42)。S42においてYES、すなわち、関数に対応するRBを検出したと判定された場合、S46においてプログラムカウンタを次命令に進め、処理を終了する。
S42においてNO、すなわち、関数に対応するRBを検出していないと判定された場合、該後方分岐命令自身のアドレスとRB中のループ終了アドレスが一致するか否かが判定される(S43)。S43においてNO、すなわち、該後方分岐命令に対応するRF/RBを検出していないと判定された場合、S46においてプログラムカウンタを次命令に進め、処理を終了する。
一方、S43においてYES、すなわち、該後方分岐命令に対応するRF/RBを検出したと判定された場合、RWのTOPから該RBの手前までのRBを全て無効化し(S44)、RWから削除する。また、該RBエントリを有効化し、かつtaken=0とし、RWから削除する(S45)。その後、S46においてプログラムカウンタを次命令に進め、処理を終了する。
(その他の命令である場合)
次に、命令がデコードされた結果、上記以外のその他の命令である場合について説明する。その他の命令である場合、レジスタR/W、主記憶R/Wが実行される。その際に、RWが空でなければ、以下の手順によってレジスタR/W、主記憶R/WをRWに登録されているRBに対して登録する。以下では、(1)汎用レジスタREADの場合、(2)汎用レジスタWRITEの場合、(3)浮動小数点レジスタREADの場合、(4)浮動小数点レジスタWRITEの場合、(5)条件コードレジスタICC−READの場合、(6)条件コードレジスタICC−WRITEの場合、(7)浮動小数点条件コードレジスタFCC−READの場合、(8)浮動小数点条件コードレジスタFCC−WRITEの場合、(9)主記憶READの場合、(10)主記憶WRITEの場合についてそれぞれ説明する。
(1)汎用レジスタREADの場合
まず、RWのTOPからBOTTOMまで順にたどる。そして、(1−1)該RBがリーフ関数かつ%o0-6の場合、または該RBが非リーフ関数かつ%i0-6の場合、arg[0-5].V=0であれば、arg[0-5].V=1に変更し、arg[0-5].Valに読み出しデータを記録する。その後、さらにRWをたどり、該RBが関数の場合、処理を終了する。一方、該RBが関数ではない(ループである)場合、arg[0-5].V=0であれば、arg[0-5].V=1に変更し、arg[0-5].Valに読み出しデータを記録し、処理を終了する。
一方、(1−2)該RBがループの場合、(a)%g0-7でgrr[0-7].V=0であれば、grr[0-7].V=1に変更し、grr[0-7].Valに読み出しデータを記録し、処理を終了する。(b)%o0-7でarg[0-7].V=0であれば、arg[0-7].V=1に変更し、arg[0-7].Valに読み出しデータを記録し、処理を終了する。(c)%l0-7でlrr[0-7].V=0であれば、lrr[0-7].V=1に変更し、lrr[0-7].Valに読み出しデータを記録し、処理を終了する。(d)%i0-7でirr[0-7].V=0であれば、irr[0-7].V=1に変更し、irr[0-7].Valに読み出しデータを記録し、次のRWエントリに進む。
(2)汎用レジスタWRITEの場合
まず、RWのTOPからBOTTOMまで順にたどる。そして(2−1)該RBがリーフ関数かつ%o0-5の場合、または該RBが非リーフ関数かつ%i0-5の場合、arg[0-5].V=0であれば、以降の読み出しは入力ではないことを示すために、arg[0-5].V=2に変更する。さらに、%o0-1/%i0-1について、rti[0-1].V=1に変更し、rti[0-1].Valに書き込みデータを記録する。その後、さらにRWをたどり、該RBが関数の場合、処理を終了する。一方、該RBが関数ではない(ループである)場合、arg[0-1].V=0であれば、以降の読み出しは入力ではないことを示すために、arg[0-1].V=2に変更し、rti[0-1].V=1に変更し、rti[0-1].Valに書き込みデータを記録し、処理を終了する。
一方、(2−2)該RBがループの場合、(a)%g0-7でgrr[0-7].V=0であれば、grr[0-7].V=2に変更し、grr[0-7].Valに書き込みデータを記録し、処理を終了する。(b)%o0-7でarg[0-7].V=0であれば、arg[0-7].V=2に変更し、arg[0-7].Valに書き込みデータを記録し、処理を終了する。(c)%l0-7でlrr[0-7].V=0であれば、lrr[0-7].V=2に変更し、lrr[0-7].Valに書き込みデータを記録し、処理を終了する。(d)%i0-7でirr[0-7].V=0であれば、irr[0-7].V=2に変更し、irr[0-7].Valに書き込みデータを記録し、次のRWエントリに進む。
(3)浮動小数点レジスタREADの場合
まず、RWのTOPからBOTTOMまで順にたどる。そして(3−1)該RBが関数の場合、何もせずに処理を終了する。一方、(3−2)該RBがループの場合、frr[0-31].V=0であれば、frr[0-31].V=1に変更し、frr[0-31].Valに読み出しデータを記録し、処理を終了する。
(4)浮動小数点レジスタWRITEの場合
まず、RWのTOPからBOTTOMまで順にたどる。そして(4−1)該RBが関数かつ%f0-1の場合、rtf[0-1].V=1に変更し、rtf[0-1].Valに書き込みデータを記録する。さらにRWをたどり、frr[0-1].V=0であれば、以降の読み出しは入力ではないことを示すために、frr[0-1].V=2に変更し、rtf[0-1].V=1に変更し、rtf[0-1].Valに書き込みデータを記録し、処理を終了する。
一方、(4−2)該RBがループの場合、frr[0-31].V=0であれば、frr[0-31].V=2に変更し、frw[0-31].V=1に変更し、frw[0-7].Valに書き込みデータを記録し、処理を終了する。
(5)条件コードレジスタICC−READの場合
まず、RWのTOPからBOTTOMまで順にたどる。そして(5−1)該RBが関数の場合、何もせずに処理を終了する。一方、(5−2)該RBがループの場合、icr.V=0であれば、icr.V=1に変更し、icr.Valに読み出しデータを記録し、処理を終了する。
(6)条件コードレジスタICC−WRITEの場合
まず、RWのTOPからBOTTOMまで順にたどる。そして(6−1)該RBが関数の場合、何もせずに処理を終了する。一方、(6−2)該RBがループの場合、icr.V=0であれば、icr.V=2、icw.V=1に変更し、icw.Valに書き込みデータを記録し、処理を終了する。
(7)浮動小数点条件コードレジスタFCC−READの場合
まず、RWのTOPからBOTTOMまで順にたどる。そして(7−1)該RBが関数の場合、何もせずに処理を終了する。一方、(7−2)該RBがループの場合、fcr.V=0であれば、fcr.V=1に変更し、fcr.Valに読み出しデータを記録し、処理を終了する。
(8)条件コードレジスタICC−WRITEの場合
まず、RWのTOPからBOTTOMまで順にたどる。そして(8−1)該RBが関数の場合、何もせずに処理を終了する。一方、(8−2)該RBがループの場合、fcr.V=0であれば、fcr.V=2、fcw.V=1に変更し、fcw.Valに書き込みデータを記録し、処理を終了する。
(9)主記憶READの場合
まず、RWのTOPからBOTTOMまで順にたどる。そして、RBにWRITEデータとして登録済である場合は、その値を使用する。一方、上記の場合ではなく、RBにREADデータとして登録済である場合には、その値を使用する。さらに、いずれにも登録済でない場合は、キャッシュを経由して主記憶3から読み込む。
その後、再度RWのTOPからBOTTOMまで順にたどる。そして、(a)アドレスが、RBに登録されているsp+64の場合、構造体ポインタの読み出しであるので、arg0.V=0であれば、arg0.V=1に変更し、arg0.Valに読み出しデータを記録する。(b)上記の(a)の場合でなく、アドレスが、LIMIT以上sp+92未満であれば、登録不要領域であるので、何もしない。(c)上記の(b)の場合でない場合、WRITEデータとして登録済であるかどうかを検査し、そうであれば、すでに上書きされたあとのREADであるので登録不要であり、何もしない。(d)上記の(c)でない場合、READデータとして登録済であるかどうかを検査し、そうであれば、すでに登録済であるので登録不要であり、何もしない。(e)上記の(d)でない場合、READデータとしての登録が必要であるので、RFに主記憶READアドレスを確保し、READデータとして登録する。RFに主記憶アドレスを確保できなかった場合には、登録不能であるため、そのRWエントリからBOTTOMまでに対応するRBエントリを全て無効化する。
(10)主記憶WRITEの場合
まず、キャッシュを経由して、主記憶3に書き込む。そして、ベースレジスタが14(%sp)かつオフセットが92以上である場合、引数の第7ワードを検出したことを記憶する。
その後、RWのTOPからBOTTOMまで順にたどる。そして、(a)アドレスが、RBに登録されているsp+64の場合、構造体ポインタの読み出しであるので、arg0.V=0であれば、arg0.V=2に変更する。(b)上記の(a)の場合ではなく、アドレスがLIMIT以上sp+92未満であれば、登録不要領域であるので、何もしない。(c)上記の(b)の場合でない場合、WRITEデータとして登録済であるかどうかを検査し、そうであれば、すでにアドレスは登録済であるので、内容を新しいWRITEデータに更新する。(d)上記の(c)でない場合、WRITEデータとしての登録が必要であるので、RFに主記憶WRITEアドレスを確保し、WRITEデータとして登録する。RFに主記憶アドレスを確保できなかった場合には、登録不能であるため、そのRWエントリからBOTTOMまでに対応するRBエントリを全て無効化する。
(ループを含む多重再利用)
1レベルで上記のような再利用機構を用いた場合、図22(a)に示した例で言えば、リーフ関数としての関数Bや、関数Bの内部にあるループCなどをそれぞれ再利用することが可能となる。これに対して、ある関数を一度実行しただけで、その関数の内部に含まれる関数やループを含む全ての命令区間が再利用可能となるように登録を行う仕組みが多重再利用である。例えば上記の例で言えば、多重再利用によれば、関数Aを一度実行しただけで、入れ子関係にあるA,B,Cの全ての命令区間が再利用可能となる。以下に、多重再利用を実現する上で必要とされる機能拡張について説明する。
図7に、一例として、関数Aおよび関数Dの概念的な構造を示す。同図に示す例では、関数Aの内部にループBが存在しており、ループBの内部にループCが存在しており、ループCにおいて関数Dが呼び出されるようになっている。そして、関数Dの内部にループEが存在しており、ループEの内部にループFが存在している。
図8は、図7に示す関数A,DおよびループB,C,E,Fの入れ子構造において、内側の構造のレジスタ入出力(太枠セル領域)が、外側の構造のレジスタ入出力となる影響範囲(矢印)について示している。例えば、ループFの内部において入力として参照された%i0〜5は、ループEおよび関数Dに対する入力でもあり、さらに、関数Dを呼び出したループCおよびループBに対する入力(ただし%o0〜5に読み替える)でもある。一方、関数Aにとって%o0〜5は局所変数に相当するので、%i0〜5(%o0〜5)は、関数Aに対してのレジスタ入力とはならない。すなわち、%i0〜5(%o0〜5)の影響範囲はループBまでとなる。別の見方をすれば、関数Dの内部で%i0〜5が参照された場合には、ループBが直接的に%o0〜5を参照しなくても、%o0〜5をループBの入力値として登録する必要がある。ループF内部において出力された%i0〜1についても同様である。
浮動小数点レジスタはレジスタウィンドウに含まれないので、出力された%f0〜1は、関数Aを含む全階層の出力となる。一方、その他のレジスタ入出力は、関数を超えて影響がおよぶことはない。すなわち、ループF内部における入出力、すなわち、レジスタ入力としての%i6〜7、%g,l,o、%f0〜31、%icc、%fcc、およびレジスタ出力としての%I2〜7、%g,l,o、%f2〜31、%icc、%fccの影響範囲はループEまでとなる。主記憶3に対する入出力については、前述した、関数呼び出し直前の%sp(SP)と比較する方法を入れ子の全階層に対して適用することにより、影響範囲を特定することができる。
以上のことから、多重再利用を実現するには、前述したRFおよびRBを関数やループの入れ子構造と関連づける機構が必要である。図9に示すように、再利用ウィンドウ(RW)を装備することによって、現在実行中かつ登録中であるRFおよびRBの各エントリ(図中ではA、B、Cと示す)をスタック構造として保持する。関数やループの実行中は、RWに登録されている全てのエントリについて、これまでに述べた方法に基づいて、レジスタおよび主記憶参照を登録していく。
この際に、あるエントリに関して、(1)登録可能項目数の超過、(2)引数の第7ワードの検出、(3)システムコールの検出、によって再利用不可能であると判断した場合には、RWを用いて、そのエントリに対応するRBおよび上位のRBを特定し、登録を中止することができる。
なお、RWの深さは有限であるものの、一度に登録可能な多重度を超えて関数やループを検出した場合には、外側の命令区間から順次登録を中止し、より内側の命令区間を登録対象に加えることによって、入れ子関係の動的変化に追随することができる。また、実行および登録中(例えばA)に、再利用可能な命令区間(例えばD)に遭遇した場合には、登録済の入出力をそのまま登録中エントリに追加することによって、RWの深さを超えるAの多重再利用も可能となる。
(並列事前実行)
以上に述べた、関数やループの多重再利用では、RBエントリの生存時間よりも同一パラメータが出現する間隔が長い場合や、パラメータが単調に変化し続ける場合には全く効果がないことになる。すなわち、RBエントリの生存時間よりも同一パラメータが出現する間隔が長い場合には、ある関数またはループがRBに登録されたとしても、その登録された関数またはループに関して同一パラメータが次に出現した際には、すでにその関数またはループがRBエントリから消えていることになり、再利用できないことになる。また、パラメータが単調に変化し続ける場合には、該当する関数やループがRBに登録されていても、パラメータが異なることによって再利用できないことになる。
これに対して、多重再利用を行うプロセッサとしてのMSP1Aとは別に、命令区間の事前実行によってRBエントリを有効にするプロセッサとしてのSSP1Bを複数個設けることによって、さらなる高速化を図ることができる。
並列事前実行機構を行うためのハードウェア構成は、前記した図2に示すような構成となる。同図に示すように、RW4A・4B、演算器5A・5B、レジスタ6A・6B、キャッシュ7A・7Bは、各プロセッサごとに独立して設けられている一方、命令区間記憶部2、および主記憶3は全てのプロセッサが共有するようになっている。
ここで、並列事前実行を実現する上での課題は、(1)どのように主記憶一貫性を保つか、(2)どのように入力を予測するかが挙げられる。以下に、これらの課題に対する解決手法について説明する。
(主記憶一貫性に関する課題の解決方法)
まず、上記の課題(1)どのように主記憶一貫性を保つかについて説明する。特に予測した入力パラメータに基づいて命令区間を実行する場合、主記憶3に書き込む値がMSP1AとSSP1Bとで異なることになる。これを解決するために、図2に示すように、SSP1Bは、RBへの登録対象となる主記憶参照には命令区間記憶部2、また、その他の局所的な参照にはSSP1Bごとに設けた局所メモリとしてのLocal7Bを使用することとし、Cache7Bおよび主記憶3への書き込みを不要としている。なお、MSP1Aが主記憶3に対して書き込みを行った場合には、対応するSSP1Bのキャッシュラインが無効化される。
具体的には、RBへの登録対象のうち、読み出しが先行するアドレスについては主記憶3を参照し、MSP1Aと同様にアドレスおよび値をRBへ登録する。以後、主記憶3ではなくRBを参照することによって、他のプロセッサからの上書きによる矛盾の発生を避けることができる。局所的な参照については、読み出しが先行するということは、変数を初期化せずに使うことに相当し、値は不定でよいことになるので、主記憶3を参照する必要はない。
なお、局所メモリとしてのLocal7Bの容量は有限であり、関数フレームの大きさがLocal7Bの容量を超えた場合など、実行を継続できない場合は、事前実行を打ち切るようにする。また、事前実行の結果は主記憶3に書き込まれないので、事前実行結果を使って、さらに次の事前実行を行うことはできない。
(予測機構の参考例)
次に、上記の課題(2)どのように入力を予測するかについて説明する。事前実行に際しては、RBの使用履歴に基づいて将来の入力を予測し、SSP1Bへ渡す必要がある。このために、命令区間記憶部2には、予測処理部2Bが設けられている。この予測処理部2Bは、RFの各エントリごとに設けた小さなプロセッサによって構成され、MSP1AやSSP1Bとは独立して入力予測値を求めるものである。
前記したように、従来の入力予測では、RBにおける入力側に登録された全てのアドレスが一律に扱われたことによって、予測の的中率を下げる結果となっている。この問題を解決するためには、予測が的中する可能性が高いアドレスと、予想が外れる可能性が高いアドレスを区別するとともに、値の変化にも着目して必要最小限のアドレスのみを予測対象とすることが必要である。
予測が的中することが期待できるアドレスとは、アドレスが固定しており、かつ、値が単調変化するアドレスである。このようなアドレスには、ラベルによって参照される帯域変数、および、スタックポインタやフレームポインタをベースレジスタとして参照される局所変数(フレーム内変数)などがある。
これらのアドレスを識別するために、ロード命令実行時のアドレス計算が参照するレジスタに定数フラグ(Const-FLAG)が設けられる。スタックポインタやフレームポインタとして用いるレジスタについては無条件に定数フラグがセットされるものとする。その他のレジスタについては、定数をセットする命令が実行された時に定数フラグ(Const-FLAG)がセットされるものとする。
次に、過去に参照したアドレスのうち、一度も書き込みが行われないアドレスについては、内容が変化していないことが保証されることになり、このようなアドレスについては予測する必要がないことになる。よって、このようなアドレスを区別するために、書き込みが行われたことを示す変更フラグ(C-FLAG)が設けられる。入力要素としてのアドレスをRF/RBに新規に記録する時には、該アドレスに対応する変更フラグ(C-FLAG)がリセットされ、登録後に該アドレスに対してストア命令が実行された時に、変更フラグ(C-FLAG)がセットされる。
また、入力要素としてのアドレスを履歴保存対象とするか否かを示す履歴マスク(P-Mask)が設けられる。入力要素としてのアドレスをRF/RBに新規に記録する時には、該アドレスに対応する履歴マスク(P-Mask)(履歴フラグ)がリセットされる。そして、ロード命令実行時に、該アドレスを生成したレジスタに対応する定数フラグ(Const-FLAG)がセットされている場合には、履歴マスク(P-Mask)のうちロード対象となったバイト位置がセットされる。
以上の定数フラグ(Const-FLAG)、変更フラグ(C-FLAG)、および履歴マスク(P-Mask)の設定の制御は、命令区間記憶部2に設けられているRB登録処理部2Aによって行われる。このRB登録処理部2Aは、小さなプロセッサによって構成され、上記のような判断を行うことによって定数フラグ(Const-FLAG)、変更フラグ(C-FLAG)、および履歴マスク(P-Mask)の設定を行う。
(命令区間例)
ここで、命令区間の一例として、図10(a)に示す命令区間が実行された場合の例について説明する。同図において、PCは、該命令区間が開始された際のPC値を示している。すなわち、命令区間の先頭が1000番地となっている。この命令区間は、ループ構造となっており、11個の命令から構成されている。また、図10(b)は、上記命令区間が実行された場合に、RBに登録される入力アドレスおよび入力データ、並びに出力アドレスおよび出力データを簡略化して示している。
第1行目の命令(以降、単に第1の命令のように称する)において、アドレス定数A1がレジスタR1にセットされる。第2の命令において、レジスタR1の内容を用いて、アドレスA1の内容(00010004)がレジスタRxにロードされる。
第3の命令において、アドレス定数A2がレジスタR2にセットされる。第4の命令において、レジスタR2の内容を用いて、アドレスA2の内容(80000000)がレジスタRyにロードされる。
第5の命令において、レジスタRxの内容から4を減じた値をアドレスとするアドレスA3(00010000)の内容(0000AAAA)がレジスタRzにロードされる。第6の命令において、レジスタRxの内容に4を加えた値(00010008)がレジスタRxにセットされる。
第7の命令において、レジスタRxの内容(00010008)が、レジスタR1の内容を用いてアドレスA1にストアされる。第8の命令において、レジスタRyの内容(80000000)を右に1ビットシフトした値(40000000)がレジスタRyにセットされる。
第9の命令において、レジスタRyの内容(40000000)が、レジスタR2を用いてアドレスA2にストアされる。第10の命令において、レジスタRyの内容とレジスタRzの内容とを加えた値(4000AAAA)が、レジスタRzにセットされる。
第11の命令において、レジスタRzの内容(4000AAAA)がレジスタRxを用いてアドレスA4にストアされる。第12の命令において、ループの先頭アドレスとしての1000番地に処理が分岐される。
上記の第12の命令に引き続いて行われる第2回目のループ処理の例を図10(c)に示し、図10(d)に、この場合のRBに登録される入力アドレスおよび入力データ、並びに出力アドレスおよび出力データを簡略化して示す。また、第2回目のループ処理に引き続いて行われる第3回目のループ処理の例を図10(e)に示し、図10(f)に、この場合のRBに登録される入力アドレスおよび入力データ、並びに出力アドレスおよび出力データを簡略化して示す。
以上のように、ループ第1回目では、アドレスA1の値(00010004)、アドレスA2の値(80000000)、アドレス(00010000)の値(0000AAAA)が入力となっており、レジスタRxの値(00010008)、レジスタRyの値(40000000)、レジスタRzの値(4000AAAA)、アドレスA1の値(00010008)、アドレスA2の値(40000000)、アドレス(00010004)の値(4000AAAA)が出力となっている。
また、ループ第2回目では、アドレスA1の値(00010008)、アドレスA2の値(40000000)、アドレス(00010004)の値(4000AAAA)が入力となっており、レジスタRxの値(0001000C)、レジスタRyの値(20000000)、レジスタRzの値(6000AAAA)、アドレスA1の値(0001000C)、アドレスA2の値(20000000)、アドレス(00010008)の値(6000AAAA)が出力となっている。
以上の処理において、注目すべき点は、ループ第1回目とループ第2回目との間におけるデータの依存関係である。第1の依存関係は、定数アドレスA1に関するループ第1回目の第7の命令とループ第2回目の第2の命令との依存関係である。この依存関係において、定数アドレスA1の値の変化量は増分4と一定である。
第2の依存関係は、定数アドレスA2に関するループ第1回目の第9の命令とループ第2回目の第4の命令との依存関係である。この依存関係において、定数アドレスA2の値は右1ビットシフトのため変化量は不定である。
第3の依存関係は、変化するアドレスA4に関するループ第1回目の第11の命令とループ第2回目の第5の命令との依存関係である。この依存関係において、アドレスA4のアドレスの変化量は増分4と一定、また、値の変化量は不定である。
このようなループ構造をループ間の並列処理によって高速化するためには、データ依存関係を動的に把握し、依存関係にない部分を効率よく並列化することが必要である。
(参考例による命令区間の実行例)
次に、図10(a)に示す命令区間が、上記した参考例におけるRFおよびRBの構成によって実行された場合の例について説明する。図11は、図10(a)に示す命令区間が実行された場合のRBにおける実際の登録状況を示している。
第1の命令において、アドレス定数A1がレジスタR1にセットされる。この命令は、定数をセットする命令であるので、レジスタR1に対応する定数フラグ(Const-FLAG)がセットされる。
第2の命令において、レジスタR1の内容を用いて、アドレスA1の内容(00010004)がレジスタRxにロードされる。この場合、アドレスA1、マスク(FFFFFFFF)、データ(00010004)は、入力としてRBにおけるInput側の第1列に登録され、レジスタ番号Rx、マスク(FFFFFFFF)、およびデータ(00010004)は出力としてRBにおけるOutput側の第1列に登録される。なお、この時点でレジスタ番号Rxの出力として登録される値は、後の処理で書き換えられるので、図11に示す値とは異なっている。
また、アドレスとして用いたレジスタR1に対応する定数フラグ(Const-FLAG)がセットされているので、アドレスA1に対応する履歴マスク(P-Mask)がセットされる。ここで、対象となるデータは(00110000)の4バイトデータであるので、これに対応して、アドレスA1に対応する履歴マスク(P-Mask)には(FFFFFFFF)がセットされる。そして、レジスタRxは、定数がセットされるものではないことになるので、レジスタRxに対応する定数フラグ(Const-FLAG)はリセットされる。
第3の命令において、アドレス定数A2がレジスタR2にセットされる。この命令は、定数をセットする命令であるので、レジスタR2に対応する定数フラグ(Const-FLAG)がセットされる。
第4の命令において、レジスタR2の内容を用いて、アドレスA2の内容(80000000)がレジスタRyにロードされる。この場合、アドレスA2、マスク(FFFFFFFF)、データ(80000000)は、入力としてRBにおけるInput側の第2列に登録され、レジスタ番号Ry、マスク(FFFFFFFF)、およびデータ(80000000)は出力としてRBにおけるOutput側の第2列に登録される。なお、この時点でレジスタ番号Ryの出力として登録される値は、後の処理で書き換えられるので、図11に示す値とは異なっている。
また、アドレスとして用いたレジスタR2に対応する定数フラグ(Const-FLAG)がセットされているので、アドレスA2に対応する履歴マスク(P-Mask)がセットされる。ここで、対象となるデータは(80000000)の4バイトデータであるので、これに対応して、アドレスA1に対応する履歴マスク(P-Mask)には(FFFFFFFF)がセットされる。そして、レジスタRyは、定数がセットされるものではないことになるので、レジスタRyに対応する定数フラグ(Const-FLAG)はリセットされる。
第5の命令において、レジスタRxの内容から4を減じた値をアドレスとするアドレスA3(00010000)の内容(0000AAAA)がレジスタRzにロードされる。この場合、アドレスA3、マスク(FFFFFFFF)、データ(0000AAAA)は、入力としてRBにおけるInput側の第3列に登録され、レジスタ番号Rz、マスク(FFFFFFFF)、およびデータ(0000AAAA)は出力としてRBにおけるOutput側の第3列に登録される。なお、この時点でレジスタ番号Rzの出力として登録される値は、後の処理で書き換えられるので、図11に示す値とは異なっている。
また、アドレスとして用いたレジスタRxに対応する定数フラグ(Const-FLAG)がリセットされているので、アドレスA3に対応する履歴マスク(P-Mask)には(00000000)がセットされる。そして、レジスタRzは、定数がセットされるものではないことになるので、レジスタRzに対応する定数フラグ(Const-FLAG)はリセットされる。
第6の命令において、レジスタRxの内容に4を加えた値(00010008)がレジスタRxにセットされる。ここで、レジスタRxはRBにおけるOutput側に既に登録されているので、RBにおけるInput側には登録されない。そして、RBにおけるOutput側に登録されているレジスタRxに対応する値が(00010008)に更新される。
第7の命令において、レジスタRxの内容(00010008)が、レジスタR1の内容を用いてアドレスA1にストアされる。ここで、レジスタRxはRBにおけるOutput側に既に登録されているので、RBにおけるInput側には登録されない。アドレスA1、マスク(FFFFFFFF)、およびデータ(00010008)は、出力としてRBにおけるOutput側の第4列に登録される。また、RBにおけるInput側にはアドレスA1が既に登録されているので、アドレスA1に対応する変更フラグ(C-FLAG)がセット(図ではchangeと表示)される。
第8の命令において、レジスタRyの内容(80000000)を右に1ビットシフトした値(40000000)がレジスタRyにセットされる。ここで、レジスタRyはRBにおけるOutput側に既に登録されているので、RBにおけるInput側には登録されない。そして、RBにおけるOutput側に登録されているレジスタRyに対応する値が(40000000)に更新される。
第9の命令において、レジスタRyの内容(40000000)が、レジスタR2を用いてアドレスA2にストアされる。ここで、レジスタRyはRBにおけるOutput側に既に登録されているので、RBにおけるInput側には登録されない。アドレスA2、マスク(FFFFFFFF)、およびデータ(40000000)は、出力としてRBにおけるOutput側の第5列に登録される。また、RBにおけるInput側にはアドレスA2が既に登録されているので、アドレスA2に対応する変更フラグ(C-FLAG)がセット(図ではchangeと表示)される。
第10の命令において、レジスタRyの内容とレジスタRzの内容とを加えた値(4000AAAA)が、レジスタRzにセットされる。ここで、レジスタRyおよびレジスタRzはRBにおけるOutput側に既に登録されているので、RBにおけるInput側には登録されない。そして、RBにおけるOutput側に登録されているレジスタRzに対応する値が(4000 AAAA)に更新される。
第11の命令において、レジスタRzの内容(4000AAAA)がレジスタRxを用いてアドレスA4にストアされる。ここで、レジスタRxはRBにおけるOutput側に既に登録されているので、RBにおけるInput側には登録されない。アドレスA4、マスク(FFFFFFFF)、およびデータ(4000AAAA)は、出力としてRBにおけるOutput側の第6列に登録される。
第12の命令において、ループの先頭アドレスとしての1000番地に処理が分岐される。後方分岐が検出された時点で、分岐先と登録を開始した命令区間先頭アドレス(1000)とが比較され、一致した場合に、該命令区間の入出力登録が完了する。
以上の結果、変更フラグ(C-FLAG)がセットされ、かつ、履歴マスク(P-Mask)がセットされたマスク位置は、アドレスA1、およびアドレスA2となる。このマスク位置に対応するアドレス、マスク、および値が、予測対象として、命令区間ごとに過去の入力履歴を保持する履歴情報として、RBのエントリに記録される。なお、上記の例では出現しなかったが、RBの入力パターンに登録されたレジスタについては無条件に予測対象として履歴として記録される。
図12(a)は、図10(a)に示す命令区間が繰り返し実行された場合における、履歴としてRBに登録された例を示している。同図に示すように、RBには、アドレスA1の列に履歴マスク(P-Mask)として(FFFFFFFF)、および、アドレスA2の列に履歴マスク(P-Mask)として(FFFFFFFF)が記憶される。そして、ループの回数が1〜4に変化する間に、各アドレスにおける履歴マスク(P-Mask)に対応する値が変化することになる。各履歴の間に示されるdiffは、対応する入力要素の値の変化量(差分)を示している。このdiffは、予測処理部2Bによって算出される。
同図に示す例では、アドレスA1の列に関しては、ループの回数が1〜4に変化する間におけるdiffが全て04となっている。よって、このアドレスに対応する値は、1回のループあたりに04ずつ増加していくことが予想される。一方、アドレスA2の列に関しては、ループの回数が1〜4に変化する間に、diffの値が不定となっている。したがって、アドレスA2に関しては、予測することが困難であることがわかる。
以上より、予測処理部2Bは、履歴において、差分が一定となっているアドレスに関して、該差分がその後も継続するものと仮定して予測を行うとともに、差分が一定でない、または差分が0となっているアドレスに関しては予測を行わないようにする。
図12(b)は、上記の予測に基づいて、予測処理部2BがアドレスA1の値に関して予測を行った場合の、予測エントリとしてRBに記録される入力要素の状態を示している。同図において、アドレスA2およびアドレスA7〜A10に関しては、予測値を求めずに直接主記憶3を参照することによって得られたものとなっている。
このように入力要素の予測値が算出されると、SSP1Bが、この予測入力要素に基づいて命令区間を実行することによって出力要素が算出され、この予測出力要素が予測エントリとしてRBに記憶される。その後、MSP1Aによって命令区間が実行され、予測エントリとしてRBに記憶されている予測入力要素と同じ入力値が入力された場合に、それに対応する予測出力要素を出力することによって再利用が実現されることになる。
(参考例における課題)
例えばループ制御変数のように、単調変化するアドレス(上記の例ではアドレスA1に対応)の内容については正確に予測することができている。しかしながら、命令区間に配列要素が含まれている場合、配列要素の添字が単調変化していても、配列要素値は一般に単調変化するとは限らない。図10(a)に示す例では、アドレスA1からロードした値が配列要素の添字に該当しており、この添字をアドレスとして用いる主記憶参照(アドレスA3〜A10)はアドレスが変化するために、予測的中率が極めて悪化することになる。ループ間にデータ依存関係がない場合は、キャッシュを直接参照することによって並列処理効果を維持することが可能であるが、例えば図10(a)に示すプログラム例のように、ループ間に依存関係がある場合には、上記したような予測による効果を得ることができない。図13は、参考例による予測に基づいて、ループ処理の2回目および3回目における事前実行を行った結果を示している。同図に示すように、値が確定しないアドレスや、実際の値とは異なる値となっているアドレスが出現しており、予測の効果が薄いことがわかる。
(予測機構)
RBに対する入出力パターンの登録に関与するアドレスは次のように分類することができる。
(1)第1のタイプのアドレスは、内容が変化しない定数アドレスである。この第1のタイプのアドレスは、内容が変化しないので、再利用の際に過去の値と内容を比較する必要がなく、したがって、内容を予測する必要がないアドレスである。
(2)第2のタイプのアドレスは、内容の変化量が一定となっている定数アドレスである。この第2のタイプのアドレスは、内容の変化量が一定であるので、予測を行うことが可能なアドレスである。上記の例では、アドレスA1が第2のタイプのアドレスに該当する。
(3)第3のタイプのアドレスは、内容の変化量が不定である定数アドレスである。この第3のタイプのアドレスは、予測が困難であるので、書き込みを待ち合わせる必要がある。上記の例では、アドレスA2が第3のタイプのアドレスに該当する。
(4)第4のタイプのアドレスは、アドレス自体は変化するものの、それぞれのアドレスの内容は変化しないアドレスである。すなわち、ストアが発生しないアドレスであり、結果的に内容が変化しないアドレスである。この第4のタイプのアドレスは、内容が変化しないので、再利用の際に過去の値と内容を比較する必要がなく、したがって、内容を予測する必要がないアドレスである。
(5)第5のタイプのアドレスは、アドレス自体が変化し、それぞれのアドレスの内容も、ストアが発生することにより変化するアドレスである。この第5のタイプのアドレスは、内容の変化量が一定であることは期待できず予測は困難であるので、書き込みを待ち合わせる必要がある。上記の例では、アドレスA3〜A10が第5のタイプのアドレスに該当する。
本実施形態に係る予測機構は、命令区間の実行時に、上記の第1および第4のタイプのアドレスを除外し、第2、第3、および第5のタイプのアドレスについて動的に分類を行うことを可能としている。また、第5のタイプのアドレスに関しては、事前実行を行う複数のプロセッサ(MSP1A、SSP1B)間でデータの待ち合わせを行うようにしている。これを実現するために、上記した参考例におけるRBに、さらにストアカウンタ(S-Count)という項目が設けられている。図14(a)は、RBにおける入出力記録行の例を示しており、図14(b)は、履歴格納行の例を示している。
まず、RBにおける、MSP1AまたはSSP1Bによる命令区間の実行中の入出力パターンを記録する行としての入出力記録行において、出力要素としてのアドレス、すなわちWriteアドレスにストアカウンタ(S-Count)が設けられている。なお、入出力記録行は、MSP1AおよびSSP1Bのそれぞれに対応して設けられている。
このストアカウンタ(S-Count)は、MSP1AまたはSSP1Bによって該当アドレスに対してストアが行われた回数を示している。すなわち、MSP1AまたはSSP1Bによって該当アドレスに対してストアが1回行われる毎に、RB登録処理部2Aが、該当エントリのストアカウンタ(S-Count)を1増加させる。
また、RBにおける、各命令区間に対応する履歴エントリを格納する行としての履歴格納行において、Writeアドレスにストアカウンタ(S-Count)が設けられている。後方分岐命令の実行時に、入出力記録行に対する命令区間の入出力登録が完了すると、該入出力記録行に登録された内容が、該命令区間に対応する履歴格納行に追加される。この際に、入出力記録行に登録されている各出力要素のAddress、Mask、およびストアカウンタ(S-Count)が履歴格納行のWrite側に登録される。
また、RBにおける履歴格納行において、入力要素としてのアドレス、すなわちReadアドレスにもストアカウンタ(S-Count)が設けられている。RBにおける入出力記録行に登録された入力要素のうち、変更フラグ(C-FLAG)がセットされ、かつ、履歴マスク(P-Mask)がセットされた入力要素が、該命令区間に対応する履歴格納行に追加される。この際に、入出力記録行に登録されているAddress、履歴マスク(P-Mask)、およびValueが履歴格納行のRead側に登録される。さらに、RBにおける入出力記録行に登録された入力要素の全てのアドレスのうち、該当命令区間の前回の実行時における入出力パターンが記憶されている履歴格納行のWriteアドレスに含まれているアドレスと一致するアドレスが、該命令区間に対応する履歴格納行に追加される。この際に、入出力記録行に登録されている該当入力要素のAddress、履歴マスク(P-Mask)、およびストアカウンタ(S-Count)が履歴格納行のRead側に登録される。ここで登録されるストアカウンタ(S-Count)の値は、該当入力要素のアドレスと一致する、前回の命令区間実行時の入出力パターンが記憶されている履歴格納行のWriteアドレスにおけるストアカウンタ(S-Count)値となる。
(アドレスの分類手法)
以上のような構成のRBによって、上記した第2、第3、および第5のタイプのアドレスをどのように分類するかについて以下に説明する。図15(a)は、図10(a)に示す命令区間が繰り返し実行された場合における、履歴格納行の登録例を示しており、図15(b)は、図15(a)に示す履歴に基づいて、予測処理部2Bが以下に示す予測処理を行った際の、予測値格納領域および待機要アドレス格納領域の例を示している。
各命令区間に対応する履歴格納行に登録されている入力要素に履歴マスク(P-Mask)がセットされている場合、予測処理部2Bは、Addressの変化量およびValueの変化量を求める。Addressの変化量が一定の場合には、予測処理部2Bは、今後も変化量が一定であるものとして予測される外挿値を、該当入力要素に対応する予測Addressとして予測値格納領域に格納する。一方、Addressの変化量が不定である場合には、予測処理部2Bは、最後に出現したAddressを該当入力要素の予測Addressとして予測値格納領域に格納する。
Valueの変化量が一定の場合には、予測処理部2Bは、今後も変化量が一定であるものとして予測される外挿値を、該当入力要素に対応する予測Valueとして設定する。そして、RBにおける予測値格納領域に、該当するAddress、Mask、およびValueを格納する。以上の処理により、上記の第2のタイプのアドレスに関する予測機構が実現される。なお、図15(a)および図15(b)に示す例では、アドレスA1が、Addressの変化量が0で一定、Valueの変化量が04で一定となっており、これに基づいて、第2のタイプのアドレスとして予測値格納領域に登録されている。
一方、Valueの変化量が不定の場合には、予測処理部2Bは、RBにおける待機要アドレス格納領域に、該当するAddress、およびMaskを格納するとともに、ストアカウンタ(S-Count)(待機カウンタ)には、予測距離から1を減じた値に、履歴格納行の該当入力要素に対応するストアカウンタ(S-Count)値を乗じた値を格納する。なお、予測距離とは、該当命令区間が今後繰り返し実行された場合の、現時点からの実行回数を示している。以上のように待機要アドレス格納領域におけるストアカウンタ(S-Count)を設定することによって、待機すべきストアの回数を的確に設定することが可能となる。これにより、上記の第3のタイプのアドレスに関する予測機構が実現される。なお、図15(a)および図15(b)に示す例では、アドレスA2が、履歴マスク(P-Mask)がセットされ、かつ、Valueの変化量が不定となっており、これに基づいて、第3のタイプのアドレスとして待機要アドレス格納領域に登録されている。
なお、上記した例では、予測処理部2Bは、ストアカウンタ(S-Count)には、予測距離から1を減じた値に、履歴格納行の該当入力要素に対応するストアカウンタ(S-Count)値を乗じた値を格納するようになっているが、次のような処理を行ってもよい。すなわち、予測処理部は、RBにおける予測値格納領域に、該当するAddress、およびMaskを格納するとともに、ストアカウンタ(S-Count)には、履歴格納行の該当入力要素に対応するストアカウンタ(S-Count)値を格納するとともに、予測距離が1だけ短い前回の予測値に基づいて事前実行を開始したSSP1Bを特定する情報を格納してもよい。このようにすれば、全てのSSP1Bによる実行通知のうち、該当するSSP1Bからの実行通知が受信された場合にのみストアカウンタ値を減少させることによって、待機すべきストアの回数を的確に設定することが可能となる。
各命令区間に対応する履歴格納行に登録されている入力要素に履歴マスク(P-Mask)がセットされていない場合、予測処理部2Bは、上記と同様に、Addressの変化量およびValueの変化量を求める。Addressの変化量が一定の場合には、予測処理部2Bは、今後も変化量が一定であるものとして予測される外挿値を、該当入力要素に対応する予測Addressとして待機要アドレス格納領域に格納する。一方、Addressの変化量が不定である場合には、予測処理部2Bは、最後に出現したAddressを該当入力要素の予測Addressとして待機要アドレス格納領域に格納する。
Valueの変化量が一定であることは期待できないので、予測処理部2Bは、RBにおける待機要アドレス格納領域に、該当するAddress、およびMaskを格納するとともに、ストアカウンタ(S-Count)には、履歴格納行の該当入力要素に対応するストアカウンタ(S-Count)値を格納する。なお、この場合には、アドレスが変化しているので、ストアカウンタ(S-Count)を設定する際に、予測距離を考慮する必要はない。これにより、上記の第5のタイプのアドレスに関する予測機構が実現される。なお、図15(a)および図15(b)に示す例では、アドレスA7〜A10が、履歴マスク(P-Mask)がセットされておらず、かつ、Valueの変化量が不定となっており、これに基づいて、第5のタイプのアドレスとして待機要アドレス格納領域に登録されている。
(MSP/SSPによる事前実行)
上記のように予測処理部2Bによる処理によって生成された予測値格納行に基づくMSP1A/SSP1Bによる事前実行について説明する。SSP1Bによる事前実行の起動開始後の主記憶読み出しは次のように行われる。
まずCache/Local7Bが参照されるとともに、以下に示す処理が行われる。
最初に、該当SSPに対応する入出力記録行のうち、読み出し対象となる主記憶アドレスと同じアドレスがWrite側に登録されているかをSSP1Bにおける判定部8Bが判定する。登録されている場合には、登録されているValueが読み出し対象となる主記憶アドレスのValueとして読み出される。Write側に登録されていない場合には、該当SSPに対応する入出力記録行のうち、読み出し対象となる主記憶アドレスと同じアドレスがRead側のValueに登録されているかをSSP1Bにおける判定部8Bが判定する。登録されている場合には、登録されているValueが読み出し対象となる主記憶アドレスのValueとして読み出される。Read側に登録されていない場合には、読み出し対象となる主記憶アドレスと同じアドレスが予測値格納領域に登録されているかをSSP1Bにおける判定部8Bが判定する。登録されている場合には、登録されているValueが読み出し対象となる主記憶アドレスのValueとして読み出される。予測値格納領域に登録されていない場合には、読み出し対象となる主記憶アドレスと同じアドレスが待機要アドレス格納領域に登録されているかをSSP1Bにおける判定部8Bが判定する。登録されている場合、ストアカウンタ(S-Count)値が0より大きい場合には、ストアカウンタ(S-Count)値が0になるまで主記憶読み出しを保留し、Valueに有効な値がセットされた後にValueを参照する。以上のいずれの参照においても、読み出し対象となる主記憶アドレスがなかった場合には、Cache/Local7Bから該当アドレスに関する値の読み込みが行われる。
また、MSP1A/SSP1Bによる事前実行の起動開始後の主記憶書き込みは次のように行われる。
MSP1AまたはSSP1Bによってストア命令が実行される場合、その旨が通信部9Aまたは通信部9Bによって、その他の全てのSSP1B…またはMSP1Aに対して通知される。各SSP1Bにおいて、待機要アドレス格納領域の中に、通知されたアドレスと同一のアドレスが登録されている場合、該アドレスのストアカウンタ(S-Count)を1だけ減じてValueに書き込み値を格納する。ただし、ストアカウンタ(S-Count)が既に0である場合には何も行わない。
以上のようにしてSSP1Bによって予測事前実行が行われた結果は、RBにおける予測実行結果記憶行に格納される。
(命令区間の実行例)
上記のようにして予測値が生成された後に、予測値に基づく事前実行を行う場合の例について図16を参照しながら以下に説明する。ここで、予測値は、ループ処理が4回繰り返された結果に基づいて生成されたものとする。また、この例では、SSP1Bを2台利用して実行される例を想定している。この2台のSSP1Bを、それぞれSSP#1、およびSSP#2と称する。
はじめに、MSP1Aがループ5回目の実行を開始し、同時にSSP#1およびSSP#2が、それぞれループ6回目およびループ7回目の予測値を受け取って実行を開始したとする。SSP#1は、SSPのための予測値格納領域にアドレスA1および値(00010018)を保持し、待機要アドレス格納領域に、アドレスA2およびストアカウンタ(S-Count)値としての(0001)、ならびに、アドレスA8およびストアカウンタ(S-Count)値としての(0001)を保持している。同様に、SSP#2は、SSPのための予測値格納領域にアドレスA1および値(0001001C)を保持し、待機要アドレス格納領域に、アドレスA2およびストアカウンタ(S-Count)値としての(0002)、ならびに、アドレスA9およびストアカウンタ(S-Count)値としての(0001)を保持している。
SSP#1は、第2の命令において、レジスタR1を用いてアドレスA1の内容をレジスタRxにロードしている。この時、前記した主記憶読み出し手順に従って、SSPのための予測値格納領域からアドレスA1の値(00010018)を得ている。また、第4の命令において、レジスタR2を用いてアドレスA2の内容をレジスタRyにロードしている。この時、前記した主記憶読み出し手順に従って、待機要アドレス格納領域からアドレスA2のストアカウンタ(S-Count)値が(0001)であることを認識し、待機する。
SSP#2は、第2の命令において、レジスタR1を用いてアドレスA1の内容をレジスタRxにロードしている。この時、前記した主記憶読み出し手順に従って、SSPのための予測値格納領域からアドレスA1の値(0001001C)を得ている。また、第4の命令において、レジスタR2を用いてアドレスA2の内容をレジスタRyにロードしている。この時、前記した主記憶読み出し手順に従って、待機要アドレス格納領域から、アドレスA2のストアカウンタ(S-Count)値が(0001)であることを認識し、待機する。
その後、MSP1Aが第9の命令を実行し、アドレスA2およびストア値(04000000)をSSP#1、およびSSP#2に通知する。SSP#1では、待機要アドレス格納領域のうち、アドレスA2のストアカウンタ(S-Count)値が1だけ減じられることによって0となり、ストア値(04000000)がValueに格納される。これにより、待機状態が終了して第4の命令の実行が完了する。SSP#2では、待機要アドレス格納領域のうち、アドレスA2のストアカウンタ(S-Count)値が1だけ減じられることによって1となり、ストア値(04000000)がValueに格納されるものの、待機状態は継続する。
SSP#1は、第5の命令において、レジスタRxを用いてアドレスA8の内容をレジスタRxにロードしている。この時、前記した主記憶読み出し手順に従って、待機要アドレス格納領域から、アドレスA8のストアカウンタ(S-Count)値が(0001)であることを認識し、待機する。
その後、MSP1Aが第11の命令を実行し、アドレスA8およびストア値(7C00AAAA)をSSP#1、およびSSP#2に通知する。SSP#1では、待機要アドレス格納領域のうち、アドレスA8のストアカウンタ(S-Count)値が1だけ減じられることによって0となり、ストア値(7C00AAAA)がValueに格納される。これにより、待機状態が終了して第5の命令の実行が完了する。SSP#2では、待機要アドレス格納領域に該当アドレスがないため、何も実行されず、待機状態が継続する。
その後、SSP#1が第9の命令を実行し、通知部9Bが、アドレスA2およびストア値(02000000)を全てのSSP1B(SSP#2)に通知する。SSP#2では、待機要アドレス格納領域のうち、アドレスA2のストアカウンタ(S-Count)値が1だけ減じられることによって0となり、ストア値(02000000)がValueに格納される。これにより、待機状態が終了して第4の命令の実行が完了する。
さらに、SSP#1が第11の命令を実行し、通知部9Bが、アドレスA9およびストア値(7E00AAAA)を全てのSSP1B(SSP#2)に通知する。SSP#2では、待機要アドレス格納領域のうち、アドレスA9のストアカウンタ(S-Count)値が1だけ減じられることによって0となり、ストア値(7E00AAAA)がValueに格納される。これにより、待機状態が終了して第5の命令の実行が完了する。
(RF/RBの第2の構成例)
次に、命令区間記憶部2の第2の構成例について、図17を参照しながら以下に説明する。同図に示すように、命令区間記憶部2は、RB、RA、RO1(第2出力パターン記憶手段)、およびRO2(第1出力パターン記憶手段)を備えた構成となっている。
RBは、比較すべき値であるレジスタ値または主記憶入力値を格納するValue(値格納領域)、およびキー番号を格納するKey(キー格納領域)を備えており、ValueおよびKeyの組み合わせのラインを複数備えている。
RAは、次に比較すべきレジスタ番号または主記憶アドレスがないことを示す終端フラグE、次に比較すべきレジスタ番号または主記憶アドレスの内容が更新されたことを示す比較要フラグ、次に比較すべき対象がレジスタか主記憶かを示すR/M、次に比較すべきレジスタ番号または主記憶アドレスを示すAdr.(検索項目指定領域)、直前に参照したライン番号を示すUP(親ノード格納領域)、次に比較すべきレジスタ番号または主記憶アドレスよりも優先して比較すべきレジスタ番号または主記憶アドレスを示すAlt.(比較要項目指定領域)、および、優先して比較する際に必要なキーを示すDN(比較要キー指定領域)を備えており、これらはRBにおける各ラインに対応して設けられている。
RO1およびRO2は、RBおよびRAによる検索結果により、再利用が可能であると判定された場合に、主記憶および/またはレジスタに出力する出力値を格納するものである。RO1は、RAの各ラインに1対1で対応して出力値および出力すべきアドレスを格納している。RO2は、RO1のみでは出力値を格納しきれない場合に、格納しきれない分の出力値および出力すべきアドレスを格納している。RO2からも出力値を読み出す必要がある場合には、RO1における該当ラインに、RO2における出力値が格納されているポインタが示されており、このポインタを用いてRO2から出力値の読み出しが行われる。また、RBおよびRAは、それぞれCAMおよびRAMによって構成されている。
(第2の構成例における連想検索動作)
次に、第2の構成例における連想検索動作について説明する。図1に示した構成では、RBにおける各エントリとしての横の行は、一致比較を行うべき入力値の項目を全て含んだものとなっている。すなわち、全ての入力パターンをそれぞれ1つの行としてRBに登録するようになっている。
これに対して、第2の構成例では、一致比較を行うべき入力値の項目を短い単位に区切り、それぞれの比較単位をノードとしてとらえ、入力パターンを木構造として、アドレス管理表としてのRA、およびRBに登録するようになっている。そして、再利用を行う際には、一致するノードを順次選択することによって、最終的に再利用可能かを判断するようになっている。別の言い方をすれば、複数の入力パターンに共通する部分を1つにまとめて、RAおよびRBの1行に対応づけるようになっている。
これにより、冗長性をなくし、命令区間記憶部2を構成するメモリの利用効率を向上させることが可能となる。また、入力パターンを木構造としているので、1つの入力パターンをRBにおける1つの行としてのエントリに対応付ける必要がないことになる。よって、一致比較を行うべき入力値の項目の数を可変にすることが可能となっている。
また、RAおよびRBは、入力パターンを木構造として登録しているので、一致比較を行う際には、マルチマッチが行われないことになる。つまり、命令区間記憶部2としては、シングルマッチ機構を有する連想検索メモリであれば実現可能となる。ここで、シングルマッチ機構のみを有する連想検索メモリは一般的に市販されている一方、マルチマッチをシングルマッチと同一性能によって報告可能な連想検索メモリは一般的には市販されていない。すなわち、第2の構成例によれば、市販の連想検索メモリを利用することができるので、より短期間かつ低コストで、本実施形態に係るデータ処理装置を実現することが可能となる。
次に、図18を参照しながら、命令区間記憶部2における連想検索動作の具体例について説明する。まず、命令区間の実行が検出されると、プログラムカウンタ(PC)およびレジスタの内容(Reg.)がRBに入力される。そして、RBにおいて、連想検索により、入力されたこれらの値と、RBのValueの列に登録されている命令区間先頭アドレスおよびレジスタ値とが比較され、値が一致する唯一の行(ライン)が候補(マッチライン)として選択される。この例では、RBにおける「01」のラインがマッチラインとして選択される。
次に、マッチラインとして選択されたラインのRBにおける番地である「01」が、エンコード結果としてRAに伝達され、キー01に対応するRAにおけるラインが参照される。キー01に対応するRAにおけるラインでは、比較要フラグが「0」であり、比較すべき主記憶アドレスがA1となっている。すなわち、主記憶アドレスA1に関しては、一致比較を行う必要はないことになる。
次に、キー01を用いて、RBにおけるKeyの列に対して検索が行われる。この例では、RBにおける「03」のラインがマッチラインとして選択される。そして、エンコード結果としてキー03がRAに伝達され、キー03に対応するRAにおけるラインが参照される。キー03に対応するRAにおけるラインでは、比較要フラグが「1」であり、比較すべき主記憶アドレスがA2となっている。すなわち、主記憶アドレスA2に関しては、一致比較を行う必要があることになる。ここで、主記憶3における主記憶アドレスA2の値がCache7Aを介して読み出され、RBにおいて、Valueが主記憶3から読み出された値であり、かつ、Keyが「03」となっているラインが検索される。図14に示す例では、Keyが「03」となっているラインは「04」および「05」の2つあるが、主記憶3から読み出された値が「00」であるので、「05」のラインがマッチラインとして選択され、RAに対して、エンコード結果としてキー05が伝達される。
以上のような処理が繰り返され、RAにおいて、次に比較すべきレジスタ番号または主記憶アドレスがないことを示す終端フラグEが検出された場合、入力パターンが全て一致したと判定され、該当命令区間は再利用可能と判断される。そして、終端フラグEが検出されたラインから「Select Output」信号が出力され、RO1およびRO2に格納されている、該ラインに対応する出力値がレジスタ6Aおよび主記憶3に対して出力される。
以上のように、第2の構成例による連想検索動作は、次のような特徴を有している。まず、内容が一致したことを示すマッチラインは、RBにおいて1つのラインのみとなるので、検索動作を次列へ伝搬する際にエンコードした結果を1つ伝送すればよいことになる。したがって、RBとRAとの間を接続する信号線は、アドレスのエンコード結果である1組(N本)でよいことになる。これに対して、上記した図1に示す例では、RBにおいてマルチマッチが許容されているので、RBにおける各列同士を接続する信号線は、各ラインごとに設ける(2N本)必要があることになる。すなわち、第2の構成例によれば、命令区間記憶部2を構成する連想検索メモリにおける信号線の数を大幅に低減することが可能となる。
また、検索途中ではシングルマッチのみが許容されるようになっているので、比較すべき項目の比較順番は、木構造における参照順に限定されることになる。すなわち、レジスタ値とメモリ内容とは、参照順に混在させながら比較する必要がある。
入力パターンは、各項目を参照すべきKeyという形でリンクさせることにより、木構造によってRBおよびRAに登録されている。また、入力パターンの項目は、終端フラグによってその終端が示されるようになっている。よって、入力パターンの項目数を可変とすることができるので、再利用表に登録すべき命令区間の状態に応じて、柔軟に入力パターンの項目数を設定することが可能となる。また、入力パターンの項目数が固定でないことによって、利用しない項目が無駄にメモリ領域を占有することがなくなるので、メモリ領域の利用効率を向上させることができる。
また、木構造によって入力パターンが登録されるので、項目の内容が重複する部分については、複数の入力パターンで1つのラインを共有することが可能となっている。よって、メモリ領域の利用効率をさらに向上させることができる。
なお、以上のような構成の場合、RAおよびRBを構成するメモリとしては、構造が縦長のものとなる。例えばこのメモリ容量を2Mbyteとした場合、横が8word、縦を65536ラインとすることになる。
(連想検索動作の別の例)
上記の例では、図17に示したRAにおいて、UP、Alt.、およびDNの項目は利用していないことになる。すなわち、上記の例では、RAにおいて、これらの項目を設ける必要はないことになる。これに対して、UP、Alt.、およびDNの項目を利用することによって、連想検索動作をさらに高速化する構成および動作について以下に説明する。
まず、図19(b)に、プログラムカウンタ(PC)およびレジスタの内容(Reg.)のみを比較し、これらが一致した場合は、主記憶値を比較することなく、区間の再利用が可能であると判断できる場合の状態を示す。この状態では、まず、RBの「01」のラインにおいて、PCおよびReg.がValueに登録されており、RAの「01」のラインにおいて、終端フラグが「E」、比較要フラグが「0」、比較すべき主記憶アドレスが「A1」、親ノード番号を示すUPが「FF」となっている。また、RBの「03」のラインでは、Value値なしで、Keyが「01」となっており、RAの「03」のラインでは、終端フラグが「E」、比較要フラグが「0」、比較すべき主記憶アドレスが「A2」、親ノード番号を示すUPが「FF」となっている。以降、同様に、RBおよびRAにおける「05」のラインおよび「07」のラインが登録されており、それぞれ終端フラグが「E」、比較要フラグが「0」となっている。
この状態で、ある命令区間の実行が検出されると、PCおよびReg.がRBに入力され、マッチラインとして、RBにおける「01」のラインが選択される。そして、マッチラインとして選択されたラインのRBにおける番地である「01」が、エンコード結果としてRAに伝達され、キー01に対応するRAにおけるラインが参照される。キー01に対応するRAにおけるラインでは、終端フラグが「E」となっているので、次に比較すべき主記憶アドレスがないことがわかる。また、比較要フラグ「0」となっているので、主記憶アドレスA1について比較を行う必要はないことがわかる。
したがって、図19(a)の木構造に示すように、PCおよびReg.の一致がS1において確認されると、Tr1に示すノードのように、主記憶アドレスA1、A2、A3における比較を行うことなく、対応する出力値が出力されることになる。
RAおよびRBがこの状態である場合に、主記憶アドレスA2に対して書き込みが行われたとする。この場合、RAおよびRBにおける入力パターンの登録時には主記憶アドレスA2の一致比較を行う必要はない状態であったが、主記憶アドレスA2が変更されることによって、主記憶アドレスA2の一致比較を行う必要が生じることになる。したがって、この場合には、図20(b)に示すようにRAおよびRBが変更されることになる。
まず、内容が変更された主記憶アドレスであるA2をキーにして、RAにおけるAdr.
の列に対して検索がかけられる。これによって、RAにおける「03」のラインが選択される。そして、選択された「03」のラインにおいて、比較要フラグが「1」に設定されるとともに、終端フラグ「E」が削除される。
次に、「03」のラインにおけるUPを参照することによって、親ノードとしての「01」のラインが認識される。そして、「01」のラインにおいて、次に比較すべき主記憶アドレスよりも優先して比較すべき主記憶アドレスを示すAlt.に、内容が変更された主記憶アドレスであるA2を書き込まれるとともに、終端フラグ「E」が削除される。さらに、「01」のラインにおいて、優先して比較する際に必要なキーを示すDNに「03」が書き込まれる。
以上のようにRAおよびRBが書き換えられた場合の連想検索動作は次のようになる。ある命令区間が検出された際に、まず、PCおよびReg.がRBに入力される。そして、RBにおいて、連想検索により、入力されたこれらの値と、RBのValueの列に登録されている命令区間先頭アドレスおよびレジスタ値とが比較され、RBにおける「01」のラインがマッチラインとして選択される。
次に、マッチラインとして選択されたラインのRBにおける番地である「01」が、エンコード結果としてRAに伝達され、キー01に対応するRAにおけるラインが参照される。キー01に対応するRAにおけるラインでは、比較要フラグが「0」であり、比較すべき主記憶アドレスがA1となっている。すなわち、主記憶アドレスA1に関しては、一致比較を行う必要はないことがわかる。
また、次に比較すべき主記憶アドレスよりも優先して比較すべき主記憶アドレスを示すAlt.に、主記憶アドレスA2が登録されており、優先して比較する際に必要なキーを示すDNに「03」が登録されていることが確認される。この場合、主記憶3における主記憶アドレスA2の値がCache7Aを介して読み出され、RBにおいて、Valueが主記憶3から読み出された値であり、かつ、Keyが、DNに示されている「03」となっているラインが検索される。
図20(b)に示す例では、Keyが「03」となっているラインは「04」および「05」の2つあるが、主記憶3から読み出された値が「00」であるので、「05」のラインがマッチラインとして選択され、RAに対して、エンコード結果としてキー05が伝達される。キー05に対応するRAにおけるラインでは、終端フラグが「E」となっているので、入力パターンが全て一致したと判定され、該当命令区間は再利用可能と判断される。そして、終端フラグEが検出されたラインから「Select Output」信号が出力され、RO1およびRO2に格納されている、該ラインに対応する出力値がレジスタ6Aおよび主記憶3に対して出力される。
以上のような連想検索動作によれば、RAにおいて、次に比較すべき主記憶アドレスよりも優先して比較すべき主記憶アドレスを示すAlt.、および、優先して比較する際に必要なキーを示すDNが設けられているので、主記憶アドレスA1の内容とキー01による検索をスキップして、主記憶アドレスA2の内容とキー03による検索が可能となる。したがって、検索動作の処理ステップを低減することができるので、処理の高速化を図ることができる。
(出力値の格納手段)
上記では、命令区間の入力パターンをRAおよびRBに登録し、連想検索動作を行うことについて説明したが、以下では、入力パターンの一致が確認された後に、再利用として出力される出力値を格納する手段について説明する。上記において図17を参照しながら説明したように、命令区間記憶部2には、再利用が可能であると判定された場合に、主記憶および/またはレジスタに出力する出力値を格納する出力値格納手段として、RO1およびRO2が設けられている。
出力値は、RAおよびRBから出力されるアドレスに基づいて、出力値を記憶するRAMなどの記憶手段を参照することによって得ることが可能である。しかしながら、入力パターンと同様に、出力パターンについても、出力値の項目数を可変とすることが好ましいので、出力値の格納方法に関して工夫が必要である。
入力パターンに関しては、RAおよびRBにおいて木構造によって登録されている。そして、木構造の末端となっているライン、すなわち、終端フラグEが登録されているラインにおいて、再利用が可能であると判定されることになる。したがって、終端フラグEが登録されている各ラインに、出力すべき出力値を格納する出力値格納手段におけるポインタを登録しておくことによって、再利用の際の出力動作を行うことが可能となる。
しかしながら、入力パターンが全て一致したことが確認された時点で、出力値が格納されているポインタに基づいて出力値格納手段における格納位置が特定される場合、ポインタに基づいて格納位置を特定するという変換処理が必要となり、処理速度を低下させる要因となる。
そこで、本実施形態では、出力値格納手段として、RO1およびRO2の2つの記憶手段を設けている。そして、RO1は、RAの各ラインに1対1で対応して出力値および出力すべきアドレスを格納している。すなわち、終端フラグEが登録されているRAのラインにおいて再利用が可能であると判定された場合には、そのラインに対応するRO1のラインが選択され、出力値が出力される。
しかしながら、このように、出力値格納手段を、RAの各ラインに1対1で対応して出力値および出力すべきアドレスを格納している場合、RAにおける、終端フラグEが登録されていないRAのラインに対しても、RO1においてメモリ領域が確保されることになる。また、終端フラグEが登録されているRAの全てのラインに対応して、RO1において出力値を格納するので、同じ内容が複数箇所で記憶されている、というような冗長性が存在することになる。したがって、RO1は、高速に処理を行うという面では優れているが、メモリの利用効率としてはよくないことになる。
この問題を解消するために、RO1に登録可能な項目数、すなわち出力値と出力アドレスとの組の数を少なめに設定する(図17の例では2つ)とともに、RO1に登録しきれない出力値および出力アドレスの組については、ポインタを用いて格納領域が指示される構成のRO2に登録するようにしている。
RO2においては、ポインタによって格納領域が指示されるので、使用されないメモリ領域はほとんど生じないことになる。また、複数の出力値および出力アドレスの組を登録する場合には、順次ポインタを用いてつなげていくことができるので、登録可能な出力値および出力アドレスの組の数を可変にすることが可能である。さらに、RO1における複数のラインから、RO2における同じ格納位置を示すポインタを指示することも可能となるので、RO2における格納情報を、RO1における複数のラインで共有することも可能となる。よって、RO2においては、格納内容の冗長性を低くすることができる。
以上のように、出力値格納手段としてRO1およびRO2の2つを設けることによって、出力値の項目が少ない場合にはRO1のみの利用により処理の高速性を実現するとともに、出力値の項目が多い場合には、項目の数を可変とすることが可能なRO2を用いることによって対応している。よって、上記の構成によれば、処理の高速性とメモリ利用効率の向上とを実現することができる。
(命令区間記憶部に対する登録処理)
上記では、ある命令区間の実行に際して再利用を行う場合の動作について説明した。以下では、ある命令区間の実行に際して、再利用が行えないと判断された場合に、該命令区間による入出力をRA、RB、RO1、およびRO2に登録する際の動作について説明する。
まず、ある命令区間の実行が検出されると、PCおよびReg.の値がRBに入力される。そして、RBにおいて、連想検索により、入力されたこれらの値と、RBのValueの列に登録されている命令区間先頭アドレスおよびレジスタ値とが比較される。ここで、RBのValueの列に、入力された値と一致するものがないと判定された場合、該命令区間は、再利用が不可能であると判定され、演算器5Aによる演算処理が行われる。そして、該当命令区間の演算処理が終了するまでに用いられるレジスタ入力値、主記憶入力値、主記憶出力値、およびレジスタ出力値が、RB、RA、RO1、必要に応じてRO2に登録される。ここで、RBおよびRAに登録を行う際には、上記で示したような木構造となるように、各項目が1つのラインに対応するように登録が行われる。そして、登録すべき入力パターンの最後の項目が登録されたラインにおいて、RAの終端フラグを「E」とし、入力パターンの登録を終了する。
一方、入力されたPCおよびReg.の値に一致するものが、RBのValueの列に登録されている場合には、上記した連想検索動作と同様にして、次の一致比較すべき項目についての一致比較が行われる。このようにして、RBおよびRAに登録されている入力パターンと、該当命令区間における入力パターンとの一致比較を継続していき、一致しない項目が生じた時点で、新たにノードを追加する形で、その一致しない項目についてRBおよびRAに登録が行われる。そして、登録すべき入力パターンの最後の項目が登録されたラインにおいて、RAの終端フラグを「E」とし、入力パターンの登録を終了する。
入力パターンの登録が終了すると、終端フラグを「E」としたRAにおけるラインに対応する、RO1におけるラインに、出力値および出力アドレスの登録を行う。そして、出力値として登録すべき項目がRO1に登録しきれない場合には、ポインタを用いてRO2に対して登録が行われる。以上により、命令区間の登録処理が完了する。
(第2の構成例における予測機構)
図21は、第2の構成例を適用した場合のデータ処理装置の概略構成を示している。図2に示す構成と異なる点としては、RW4A・4Bに入出力記録行が設けられている点、命令区間記憶部2において、RFに区間毎情報として履歴格納行、予測値格納領域、および待機要アドレス格納領域が設けられている点、および上記した第2の構成例におけるRB、RA、W1が設けられている点である。なお、W1は、上記したRO1・RO2に相当するものである。その他の構成については、図2に示す構成と同様であるので、ここではその説明を省略する。
第2の構成例では、命令区間の実行時における入出力パターンを一時的に格納する場所としての入出力記録行は、上記のようにRW4A・4Bとなる。ここで、前記した第1の構成例では、命令区間の実行時における入出力パターンはRBに直接登録されていたので、RW4A・4BはRBの各行に対するポインタによって実現されていた。これに対して、第2の構成例では、RAおよびRBが木構造によって構成されているので、RW4A・4Bが直接RBの行をポイントすることができない。すなわち、第2の構成例では、RW4A・4Bは、RBの各行に対するポインタとして機能するものではなく、命令区間の実行時における入出力パターンを一時的に格納する実質的なメモリとして機能することになる。
また、図17においては図示していないが、第2の構成例においても、所定の命令区間が繰り返し実行された場合における入力パターンの履歴エントリ、および予測エントリを格納する一時格納メモリ領域として、図1に示すようなRFおよびRBがRFとして設けられている。ただし、この場合には、RBにおけるエントリの行は、履歴エントリを格納する履歴格納行、予測値格納領域、および待機要アドレス格納領域としての数行によって構成されることになる。
命令区間が実行されると、その入力要素がRW4A・4Bに順次格納され、全ての入力要素が揃い、演算が行われることによって出力要素が確定すると、この入出力パターンが、上記履歴格納行に格納されるとともに、上記のような木構造の入出力パターン格納機構に格納されることになる。
また、所定の命令区間が繰り返し実行された場合には、履歴格納行に順次格納され、所定の数の履歴が格納された時点で、上記のように予測処理部2Bによって予測が行われ、予測に基づいてSSP1Bによって実行された結果は、上記のような木構造の入出力パターン格納機構に格納されることになる。
(本発明の適用例)
「LIMIT」などによって大域変数領域とスタック領域とを区別できるプログラム実行環境があるとした上で、本発明に係るデータ処理装置を他の命令セットアーキテクチャにも適用するためには、スタックフレーム上の変数が、上位/下位関数のどちらの局所変数であるかを区別する手段が必要である。特に、引数を格納するレジスタが不足し、引数をスタックに格納する場合、呼ばれた関数側ではこの区別をすることができないことになる。
本実施の形態で取り上げたSPARCプロセッサでは、引数の先頭6ワードを汎用レジスタに格納しており、6ワード以上の引数を扱う関数は出現頻度が高くないことと、引数がスタックに溢れた時点で再利用ができなくなることの両方を利用することによって、関数/ループの再利用を実現している。SPARCプロセッサ同様に、32本以上の汎用レジスタを有する多くのRISCプロセッサでも、同様の判断をすることによって、本発明のような関数/ループの再利用を実現することが可能である。