本発明の実施の一形態について図1ないし図20に基づいて説明すれば、以下のとおりである。
(データ処理装置の構成)
本実施形態に係るデータ処理装置の概略構成を図2示す。同図に示すように、該データ処理装置は、MSP(Main Stream Processor)1A、SSP(Shadow Stream Processor)1B、再利用表としての命令区間記憶部(命令区間記憶手段)2、および主記憶(主記憶手段)3を備えた構成となっており、主記憶3に記憶されているプログラムデータなどを読み出して各種演算処理を行い、演算結果を主記憶3に書き込む処理を行うものである。なお、同図に示す構成では、SSP1Bを1つ備えた構成となっているが、2つ以上備えた構成となっていてもよい。また、同図に示す構成では、SSP1Bを備えた構成となっているが、SSP1Bを備えていない構成としてもかまわない。SSP1Bを備えた場合の作用・効果については、後述する。
命令区間記憶部2は、プログラムにおける関数やループなどの命令区間を再利用するためのデータを格納するメモリ手段である。この命令区間記憶部2の詳細については後述する。
主記憶3は、MSP1AおよびSSP1Bの作業領域としてのメモリであり、例えばRAM(Random Access Memory)などによって構成されるものである。例えばハードディスクなどの外部記憶手段や、外部のI/O(input/output)装置などの外部装置からプログラムやデータなどが主記憶3に読み出され、MSP1AおよびSSP1Bは、主記憶3に読み出されたデータに基づいて演算を行うことになる。また、MSP1Aによる演算結果が主記憶3に書き込まれ、この演算結果が上記外部装置に送出されることになる。
MSP1Aは、再利用記憶手段としてのRW(入出力生成手段)4A、演算器(第1の演算手段)5A、レジスタ6A、およびCache7Aを備えた構成となっている。また、SSP1Bは、同様に、再利用記憶手段としてのRW(第2の演算手段)4B、演算器(第2の演算手段)5B、レジスタ6B、およびCache/Local7Bを備えた構成となっている。
RW4A・4Bは、再利用ウィンドウであり、現在実行中かつ登録中であるRF(付加記憶手段)およびRB(連想検索手段)(後述する)の各ラインをリング構造のスタックとして保持するものである。このRW4A・4Bは、実際のハードウェア構造としては、命令区間記憶部2における特定のラインをアクティブにする制御線の集合によって構成される。また、詳細は後述するが、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が含まれているものとする。
(命令区間記憶部の構成)
図1は、本実施形態における命令区間記憶部2によって実現される再利用表を示している。同図に示すように、命令区間記憶部2は、RB、RF、RO1(第2出力パターン記憶手段)、およびRO2(第1出力パターン記憶手段)を備えた構成となっている。
RBは、比較すべき値であるレジスタ値または主記憶入力値を格納するValue(値格納領域)、およびキー番号を格納するKey(キー格納領域)を備えており、ValueおよびKeyの組み合わせのラインを複数備えている。
RFは、次に比較すべきレジスタ番号または主記憶アドレスがないことを示す終端フラグE、次に比較すべきレジスタ番号または主記憶アドレスの内容が更新されたことを示す比較要フラグ、次に比較すべき対象がレジスタか主記憶かを示すR/M、次に比較すべきレジスタ番号または主記憶アドレスを示すAdr.(検索項目指定領域)、直前に参照したライン番号を示すUP(親ノード格納領域)、次に比較すべきレジスタ番号または主記憶アドレスよりも優先して比較すべきレジスタ番号または主記憶アドレスを示すAlt.(比較要項目指定領域)、および、優先して比較する際に必要なキーを示すDN(比較要キー指定領域)を備えており、これらはRBにおける各ラインに対応して設けられている。
RO1およびRO2は、RBおよびRFによる検索結果により、再利用が可能であると判定された場合に、主記憶および/またはレジスタに出力する出力値を格納するものである。RO1は、RFの各ラインに1対1で対応して出力値および出力すべきアドレスを格納している。RO2は、RO1のみでは出力値を格納しきれない場合に、格納しきれない分の出力値および出力すべきアドレスを格納している。RO2からも出力値を読み出す必要がある場合には、RO1における該当ラインに、RO2における出力値が格納されているポインタが示されており、このポインタを用いてRO2から出力値の読み出しが行われる。
また、RBおよびRFは、それぞれCAM(content-addressable memory)およびRAM(Random Access Memory)によって構成されている。一般的に、アドレスが与えられると、そのアドレスに格納された値を参照することができるメモリは、RAMと呼ばれるメモリである。一方、上記のCAMとは、連想メモリと呼ばれるメモリであり、検索すべき内容が与えられると、その内容に一致するラインが選択されるようになっている。通常は、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およびRFが実現されることになる。
(比較例)
ここで、比較例として、図8に示すような構成のRFおよびRBによる動作について説明する。同図に示すように、RFは、エントリが有効であるか否かを示す状態表示フラグV、エントリ入れ替えのヒントを示すLRU、関数とループとを区別するF/L、命令区間の先頭アドレスを示すStart、命令区間の終了アドレスを示すEnd、参照すべき主記憶入力アドレスに関する情報を示すRead、および、参照すべき主記憶出力アドレスに関する情報を示すWriteを保持している。
また、RBは、エントリが有効であるか否かを示す状態表示フラグV、エントリ入れ替えのヒントを示すLRU、命令区間を呼び出す際の直前のスタックポイント%spを示すSP、ループの終了アドレス(End)、ループ終了時の分岐方向を示すtaken/not、レジスタ入力値としての引数(Args.)(V:有効エントリ、Val.:値)および引数以外のレジスタ入力値および条件コード(Regs.,CC)、主記憶入力有効バイトMask、主記憶入力値Value、主記憶出力有効バイトMask、主記憶出力値Value、および、レジスタ出力値としての返り値Return Valuesおよび返り値以外のレジスタ出力値および条件コードRegs.,CC(V:有効エントリ、Val.:値)を保持している。
関数またはループを実行する際に、以前に実行した命令区間が再利用可能であるか否かを判断する際には、次の手順で行われる。まず、(1)RFに登録されている関数またはループのエントリの先頭アドレスStartに、該当関数またはループの先頭アドレスと一致するものがあるかを検索する。一致するものがある場合には、(2)RBに登録されている該当エントリのうち、有効エントリを示す状態表示フラグVが登録済状態にセットされているエントリであって、かつ、該エントリにおける引数args.およびRegs.,CCが、呼び出す関数またはループの対応する値と完全に一致するエントリを1つまたは複数選択する。そして、選択したエントリにおいて、(3)関連する主記憶アドレス、すなわち、少なくとも1つのMaskが有効であるReadアドレスを用いて主記憶を順に参照し、(4)該当関数またはループの主記憶入力値と、RBに登録されている主記憶入力値との比較を行う。そして、全ての入力が一致する場合に、(5)RBに記憶されているReturn Valuesをレジスタに書き込み、主記憶出力アドレスに対して、順次、各有効フラグMaskがセットされている主記憶出力値Valueを書き込む。以上により、関数またはループの再利用が実現されることになる。
以上のような比較例における動作を、図9を参照しながらより具体的に説明する。まず、プログラムカウンタ(PC)と、RFに登録された命令区間先頭アドレス(Region)とが比較され、さらに、レジスタの内容(Reg.)と、RBに登録されているレジスタ入力値(Args.、Regs.,CC)とを比較する。この時点で、RBにおけるエントリ01〜04のうち、エントリ03およびエントリ04が一致すると判定されたとする。すなわち、この時点では、マルチマッチとなっている。
次に、主記憶アドレスA1に関して比較することになるが、主記憶アドレスA1に対しては、RFにおいて、一致比較を行う必要がないことを示すフラグ(0)が示されているので、一致比較は行われない。すなわち、エントリ03およびエントリ04が候補として残ったままとなる。
次に、主記憶アドレスA2に関して比較が行われる。ここで、RFにおいて、主記憶アドレスA2に関しては一致比較を行う必要があることを示すフラグ(1)が示されているので、一致比較が行われる。この結果、内容が「00」であるエントリ03のみが候補として残ることになる。その後、一致比較を行う項目として主記憶アドレスA3およびA4があるが、これらはどちらも一致比較を行う必要がないことを示すフラグが示されているので、エントリ03は、比較が必要な全ての項目が一致したことになる。よって、エントリ03に対応する出力値としての主記憶出力値およびレジスタ出力値が主記憶およびレジスタに出力される。
この比較例における動作のポイントは次の通りである。(a)RBに登録されている各値と再利用対象となっている関数またはループにおける対応する値とを比較する際に、RBにおける縦の列を順に一致確認していくことになるが、内容が一致するエントリが複数存在する(マルチマッチ)ことを許容している。(b)検索途中においてマルチマッチを許容しているが、最終的に1つのエントリが選択されればよい。(c)RBにおける列を一致確認していく順番は任意であるので、例えばレジスタ入力値を最初にまとめて比較する、ということを行うことが可能である。
また、この比較例の場合、次のような問題がある。(d)RBにおいて、各エントリにおける項目数(横の長さ)は固定となっている。よって、登録されている項目以外の項目を追加することはできないようになっている。また、逆に、使用しない項目に対応するメモリ領域は空き領域となるが、これを有効利用することはできない。(e)各エントリは、1つの項目でも内容が異なれば、それぞれ別のエントリとして登録する必要がある。よって、RBにおけるメモリの利用効率は良くないことになる。
なお、以上のような比較例の場合、RFおよびRBを構成するメモリとしては、構造が横長のものとなる。例えばこのメモリ容量を2Mbyteとした場合、横が2Kword、縦を256エントリとすることになる。
(入力パターンを木構造として登録する第1構成例)
上記の比較例では、RBにおける各エントリとしての横の行は、一致比較を行うべき入力値の項目を全て含んだものとなっている。すなわち、全ての入力パターンをそれぞれ1つのエントリとしてRBに登録するようになっている。
これに対して、本第1構成例では、一致比較を行うべき入力値の項目を短い単位に区切り、それぞれの比較単位をノードとしてとらえ、入力パターンを木構造としてRFおよびRBに登録するようになっている。そして、再利用を行う際には、一致するノードを順次選択することによって、最終的に再利用可能かを判断するようになっている。別の言い方をすれば、複数の入力パターンに共通する部分を1つにまとめて、RFおよびRBの1行に対応づけるようになっている。
これにより、冗長性をなくし、命令区間記憶部2を構成するメモリの利用効率を向上させることが可能となる。また、入力パターンを木構造としているので、1つの入力パターンをRBにおける1つの行としてのエントリに対応付ける必要がないことになる。よって、一致比較を行うべき入力値の項目の数を可変にすることが可能となっている。
また、RFおよびRBは、入力パターンを木構造として登録しているので、一致比較を行う際には、マルチマッチが行われないことになる。つまり、命令区間記憶部2としては、シングルマッチ機構を有する連想検索メモリであれば実現可能となる。ここで、シングルマッチ機構のみを有する連想検索メモリは一般的に市販されている一方、マルチマッチをシングルマッチと同一性能によって報告可能な連想検索メモリは一般的には市販されていない。すなわち、本第1構成例における命令区間記憶部2によれば、市販の連想検索メモリを利用することができるので、より短期間かつ低コストで、本実施形態に係るデータ処理装置を実現することが可能となる。
次に、図3を参照しながら、上記第1構成例における命令区間記憶部2における連想検索動作の具体例について説明する。まず、命令区間の実行が検出されると、プログラムカウンタ(PC)およびレジスタの内容(Reg.)がRBに入力される。そして、RBにおいて、連想検索により、入力されたこれらの値と、RBのValueの列に登録されている命令区間先頭アドレスおよびレジスタ値とが比較され、値が一致する唯一の行(ライン)が候補(マッチライン)として選択される。この例では、RBにおける「01」のラインがマッチラインとして選択される。
次に、マッチラインとして選択されたラインのRBにおける番地である「01」が、エンコード結果としてRFに伝達され、キー01に対応するRFにおけるラインが参照される。キー01に対応するRFにおけるラインでは、比較要フラグが「0」であり、比較すべき主記憶アドレスがA1となっている。すなわち、主記憶アドレスA1に関しては、一致比較を行う必要はないことになる。
次に、キー01を用いて、RBにおけるKeyの列に対して検索が行われる。この例では、RBにおける「03」のラインがマッチラインとして選択される。そして、エンコード結果としてキー03がRFに伝達され、キー03に対応するRFにおけるラインが参照される。キー03に対応するRFにおけるラインでは、比較要フラグが「1」であり、比較すべき主記憶アドレスがA2となっている。すなわち、主記憶アドレスA2に関しては、一致比較を行う必要があることになる。ここで、主記憶3における主記憶アドレスA2の値がCache7Aを介して読み出され、RBにおいて、Valueが主記憶3から読み出された値であり、かつ、Keyが「03」となっているラインが検索される。図3に示す例では、Keyが「03」となっているラインは「04」および「05」の2つあるが、主記憶3から読み出された値が「00」であるので、「05」のラインがマッチラインとして選択され、RFに対して、エンコード結果としてキー05が伝達される。
以上のような処理が繰り返され、RFにおいて、次に比較すべきレジスタ番号または主記憶アドレスがないことを示す終端フラグEが検出された場合、入力パターンが全て一致したと判定され、該当命令区間は再利用可能と判断される。そして、終端フラグEが検出されたラインから「Select Output」信号が出力され、RO1およびRO2に格納されている、該ラインに対応する出力値がレジスタ6Aおよび主記憶3に対して出力される。
以上のように、本第1構成例における命令区間記憶部2による連想検索動作は、次のような特徴を有している。まず、内容が一致したことを示すマッチラインは、RBにおいて1つのラインのみとなるので、検索動作を次列へ伝搬する際にエンコードした結果を1つ伝送すればよいことになる。したがって、RBとRFとの間を接続する信号線は、アドレスのエンコード結果である1組(N本)でよいことになる。これに対して、上記した比較例では、RBにおいてマルチマッチが許容されているので、RBにおける各列同士を接続する信号線は、各ラインごとに設ける(2N本)必要があることになる。すなわち、本第1構成例の構成によれば、命令区間記憶部2を構成する連想検索メモリにおける信号線の数を大幅に低減することが可能となる。
また、検索途中ではシングルマッチのみが許容されるようになっているので、比較すべき項目の比較順番は、木構造における参照順に限定されることになる。すなわち、レジスタ値とメモリ内容とは、参照順に混在させながら比較する必要がある。
入力パターンは、各項目を参照すべきKeyという形でリンクさせることにより、木構造によってRBおよびRFに登録されている。また、入力パターンの項目は、終端フラグによってその終端が示されるようになっている。よって、入力パターンの項目数を可変とすることができるので、再利用表に登録すべき命令区間の状態に応じて、柔軟に入力パターンの項目数を設定することが可能となる。また、入力パターンの項目数が固定でないことによって、利用しない項目が無駄にメモリ領域を占有することがなくなるので、メモリ領域の利用効率を向上させることができる。
また、木構造によって入力パターンが登録されるので、項目の内容が重複する部分については、複数の入力パターンで1つのラインを共有することが可能となっている。よって、メモリ領域の利用効率をさらに向上させることができる。
なお、以上のような構成の場合、RFおよびRBを構成するメモリとしては、構造が縦長のものとなる。例えばこのメモリ容量を2Mbyteとした場合、横が8word、縦を65536ラインとすることになる。
(入力パターンを木構造として登録する第2構成例)
上記の例では、図1に示したRFにおいて、UP、Alt.、およびDNの項目は利用していないことになる。すなわち、上記の例では、RFにおいて、これらの項目を設ける必要はないことになる。これに対して、UP、Alt.、およびDNの項目を利用することによって、連想検索動作をさらに高速化する第2の構成例およびその動作について以下に説明する。
まず、図4(b)に、プログラムカウンタ(PC)およびレジスタの内容(Reg.)のみを比較し、これらが一致した場合は、主記憶値を比較することなく、区間の再利用が可能であると判断できる場合の状態を示す。この状態では、まず、RBの「01」のラインにおいて、PCおよびReg.がValueに登録されており、RFの「01」のラインにおいて、終端フラグが「E」、比較要フラグが「0」、比較すべき主記憶アドレスが「A1」、親ノード番号を示すUPが「FF」となっている。また、RBの「03」のラインでは、Value値なしで、Keyが「01」となっており、RFの「03」のラインでは、終端フラグが「E」、比較要フラグが「0」、比較すべき主記憶アドレスが「A2」、親ノード番号を示すUPが「FF」となっている。以降、同様に、RBおよびRFにおける「05」のラインおよび「07」のラインが登録されており、それぞれ終端フラグが「E」、比較要フラグが「0」となっている。
この状態で、ある命令区間の実行が検出されると、PCおよびReg.がRBに入力され、マッチラインとして、RBにおける「01」のラインが選択される。そして、マッチラインとして選択されたラインのRBにおける番地である「01」が、エンコード結果としてRFに伝達され、キー01に対応するRFにおけるラインが参照される。キー01に対応するRFにおけるラインでは、終端フラグが「E」となっているので、次に比較すべき主記憶アドレスがないことがわかる。また、比較要フラグ「0」となっているので、主記憶アドレスA1について比較を行う必要はないことがわかる。
したがって、図4(a)の木構造に示すように、PCおよびReg.の一致がS1において確認されると、Tr1に示すノードのように、主記憶アドレスA1、A2、A3における比較を行うことなく、対応する出力値が出力されることになる。
RFおよびRBがこの状態である場合に、主記憶アドレスA2に対して書き込みが行われたとする。この場合、RFおよびRBにおける入力パターンの登録時には主記憶アドレスA2の一致比較を行う必要はない状態であったが、主記憶アドレスA2が変更されることによって、主記憶アドレスA2の一致比較を行う必要が生じることになる。したがって、この場合には、図5(b)に示すようにRFおよびRBが変更されることになる。
まず、内容が変更された主記憶アドレスであるA2をキーにして、RFにおけるAdr.
の列に対して検索がかけられる。これによって、RFにおける「03」のラインが選択される。そして、選択された「03」のラインにおいて、比較要フラグが「1」に設定されるとともに、終端フラグ「E」が削除される。
次に、「03」のラインにおけるUPを参照することによって、親ノードとしての「01」のラインが認識される。そして、「01」のラインにおいて、次に比較すべき主記憶アドレスよりも優先して比較すべき主記憶アドレスを示すAlt.に、内容が変更された主記憶アドレスであるA2が書き込まれるとともに、終端フラグ「E」が削除される。さらに、「01」のラインにおいて、優先して比較する際に必要なキーを示すDNに「03」が書き込まれる。
以上のようにRFおよびRBが書き換えられた場合の連想検索動作は次のようになる。ある命令区間が検出された際に、まず、PCおよびReg.がRBに入力される。そして、RBにおいて、連想検索により、入力されたこれらの値と、RBのValueの列に登録されている命令区間先頭アドレスおよびレジスタ値とが比較され、RBにおける「01」のラインがマッチラインとして選択される。
次に、マッチラインとして選択されたラインのRBにおける番地である「01」が、エンコード結果としてRFに伝達され、キー01に対応するRFにおけるラインが参照される。キー01に対応するRFにおけるラインでは、比較要フラグが「0」であり、比較すべき主記憶アドレスがA1となっている。すなわち、主記憶アドレスA1に関しては、一致比較を行う必要はないことがわかる。
また、次に比較すべき主記憶アドレスよりも優先して比較すべき主記憶アドレスを示すAlt.に、主記憶アドレスA2が登録されており、優先して比較する際に必要なキーを示すDNに「03」が登録されていることが確認される。この場合、主記憶3における主記憶アドレスA2の値がCache7Aを介して読み出され、RBにおいて、Valueが主記憶3から読み出された値であり、かつ、Keyが、DNに示されている「03」となっているラインが検索される。
図5(b)に示す例では、Keyが「03」となっているラインは「04」および「05」の2つあるが、主記憶3から読み出された値が「00」であるので、「05」のラインがマッチラインとして選択され、RFに対して、エンコード結果としてキー05が伝達される。キー05に対応するRFにおけるラインでは、終端フラグが「E」となっているので、入力パターンが全て一致したと判定され、該当命令区間は再利用可能と判断される。そして、終端フラグEが検出されたラインから「Select Output」信号が出力され、RO1およびRO2に格納されている、該ラインに対応する出力値がレジスタ6Aおよび主記憶3に対して出力される。
以上のような連想検索動作を行う第2の構成例によれば、RFにおいて、次に比較すべき主記憶アドレスよりも優先して比較すべき主記憶アドレスを示すAlt.、および、優先して比較する際に必要なキーを示すDNが設けられているので、図5(a)に示す木構造のように、主記憶アドレスA1の内容とキー01による検索をスキップして、主記憶アドレスA2の内容とキー03による検索が可能となる。したがって、検索動作の処理ステップを低減することができるので、処理の高速化を図ることができる。
(出力値の格納手段構成例)
上記では、命令区間の入力パターンをRFおよびRBに登録し、連想検索動作を行うことについて説明したが、以下では、入力パターンの一致が確認された後に、再利用として出力される出力値を格納する手段の構成例について説明する。上記において図1を参照しながら説明したように、命令区間記憶部2には、再利用が可能であると判定された場合に、主記憶および/またはレジスタに出力する出力値を格納する出力値格納手段として、RO1およびRO2が設けられている。
出力値は、RFおよびRBから出力されるアドレスに基づいて、出力値を記憶するRAMなどの記憶手段を参照することによって得ることが可能である。しかしながら、入力パターンと同様に、出力パターンについても、出力値の項目数を可変とすることが好ましいので、出力値の格納方法に関して工夫が必要である。
入力パターンに関しては、RFおよびRBにおいて木構造によって登録されている。そして、木構造の末端となっているライン、すなわち、終端フラグEが登録されているラインにおいて、再利用が可能であると判定されることになる。したがって、終端フラグEが登録されている各ラインに、出力すべき出力値を格納する出力値格納手段におけるポインタを登録しておくことによって、再利用の際の出力動作を行うことが可能となる。
しかしながら、入力パターンが全て一致したことが確認された時点で、出力値が格納されているポインタに基づいて出力値格納手段における格納位置が特定される場合、ポインタに基づいて格納位置を特定するという変換処理が必要となり、処理速度を低下させる要因となる。
そこで、本構成例では、出力値格納手段として、RO1およびRO2の2つの記憶手段を設けている。そして、RO1は、RFの各ラインに1対1で対応して出力値および出力すべきアドレスを格納している。すなわち、終端フラグEが登録されているRFのラインにおいて再利用が可能であると判定された場合には、そのラインに対応するRO1のラインが選択され、出力値が出力される。
しかしながら、このように、出力値格納手段を、RFの各ラインに1対1で対応して出力値および出力すべきアドレスを格納している場合、RFにおける、終端フラグEが登録されていないRFのラインに対しても、RO1においてメモリ領域が確保されることになる。また、終端フラグEが登録されているRFの全てのラインに対応して、RO1において出力値を格納するので、同じ内容が複数箇所で記憶されている、というような冗長性が存在することになる。したがって、RO1は、高速に処理を行うという面では優れているが、メモリの利用効率としてはよくないことになる。
この問題を解消するために、RO1に登録可能な項目数、すなわち出力値と出力アドレスとの組の数を少なめに設定する(図1の例では2つ)とともに、RO1に登録しきれない出力値および出力アドレスの組については、ポインタを用いて格納領域が指示される構成のRO2に登録するようにしている。
RO2においては、ポインタによって格納領域が指示されるので、使用されないメモリ領域はほとんど生じないことになる。また、複数の出力値および出力アドレスの組を登録する場合には、順次ポインタを用いてつなげていくことができるので、登録可能な出力値および出力アドレスの組の数を可変にすることが可能である。さらに、RO1における複数のラインから、RO2における同じ格納位置を示すポインタを指示することも可能となるので、RO2における格納情報を、RO1における複数のラインで共有することも可能となる。よって、RO2においては、格納内容の冗長性を低くすることができる。
以上のように、出力値格納手段としてRO1およびRO2の2つを設けることによって、出力値の項目が少ない場合にはRO1のみの利用により処理の高速性を実現するとともに、出力値の項目が多い場合には、項目の数を可変とすることが可能なRO2を用いることによって対応している。よって、上記の構成によれば、処理の高速性とメモリ利用効率の向上とを実現することができる。
(命令区間記憶部に対する登録処理)
上記では、ある命令区間の実行に際して再利用を行う場合の動作について説明した。以下では、ある命令区間の実行に際して、再利用が行えないと判断された場合に、該命令区間による入出力をRF、RB、RO1、およびRO2に登録する際の動作について説明する。
まず、ある命令区間の実行が検出されると、PCおよびReg.の値がRBに入力される。そして、RBにおいて、連想検索により、入力されたこれらの値と、RBのValueの列に登録されている命令区間先頭アドレスおよびレジスタ値とが比較される。ここで、RBのValueの列に、入力された値と一致するものがないと判定された場合、該命令区間は、再利用が不可能であると判定され、演算器5Aによる演算処理が行われる。そして、該当命令区間の演算処理が終了するまでに用いられるレジスタ入力値、主記憶入力値、主記憶出力値、およびレジスタ出力値が、RB、RF、RO1、必要に応じてRO2に登録される。ここで、RBおよびRFに登録を行う際には、上記で示したような木構造となるように、各項目が1つのラインに対応するように登録が行われる。そして、登録すべき入力パターンの最後の項目が登録されたラインにおいて、RFの終端フラグを「E」とし、入力パターンの登録を終了する。
一方、入力されたPCおよびReg.の値に一致するものが、RBのValueの列に登録されている場合には、上記した連想検索動作と同様にして、次の一致比較すべき項目についての一致比較が行われる。このようにして、RBおよびRFに登録されている入力パターンと、該当命令区間における入力パターンとの一致比較を継続していき、一致しない項目が生じた時点で、新たにノードを追加する形で、その一致しない項目についてRBおよびRFに登録が行われる。そして、登録すべき入力パターンの最後の項目が登録されたラインにおいて、RFの終端フラグを「E」とし、入力パターンの登録を終了する。
入力パターンの登録が終了すると、終端フラグを「E」としたRFにおけるラインに対応する、RO1におけるラインに、出力値および出力アドレスの登録を行う。そして、出力値として登録すべき項目がRO1に登録しきれない場合には、ポインタを用いてRO2に対して登録が行われる。以上により、命令区間の登録処理が完了する。
(命令区間実行時の入出力セットの生成)
ある命令区間を実行した際に、命令区間記憶部2に対して実行結果が登録されることになるが、この実行結果は、該命令区間の実行に際して、レジスタおよび/または主記憶(以降、単にレジスタ/メモリと称する)に対して行われた入出力のセットに相当するものである。以下では、命令区間記憶部2に登録すべき入出力セットをどのように生成するかについて説明する。
上記した入力パターンを木構造として登録する第1および第2構成例の場合、入出力セットはRW4A・4Bによって生成され、生成された入出力セットに基づいて、RB、RF、RO1、およびRO2への上記したような登録処理が行われる。RW4A・4Bは、ある命令区間が実行された際に行われるレジスタ/メモリからの読み出し、および/または、レジスタ/メモリへの書き込みを監視し、これに基づいて入出力セットを生成する。このRW4A・4Bによる入出力セットの生成方法について以下に説明する。なお、以下の説明では、RW4Aについて説明するが、RW4Bについても同様である。
(RWの第1構成例)
図11は、第1構成例としてのRW4Aのメモリ構成の概略を示す図である。同図に示すように、RW4Aは、命令区間のPC値を格納するPC、入力アドレスおよび入力値を格納するRWI、および、出力アドレスおよび出力値を格納するRWOのメモリを有している。ある命令区間を実行した際の入出力セットはこのRW4Aのメモリに格納され、その後、命令区間記憶部2に登録されることになる。
まず、ある命令区間の実行が開始されると、そのPC値がRW4AにおけるPCに格納される。その後、命令区間の実行が順次行われると、レジスタ/メモリからの読み出し、および/または、レジスタ/メモリへの書き込みが順に行われることになる。
命令区間実行時にレジスタ/メモリからの読み出しが行われた場合には、RW4Aによって次の処理が行われる。
(AR1)読み出しが行われたレジスタ/メモリのアドレスが、RWOに登録されているか否かが検索される。RWOに登録されている場合には、既に出力値として入出力セットに登録されている値の読み出しが行われたものであるので、入力値として登録する必要はないことになる。すなわち、該アドレスをRWIに登録せずに終了する。
(AR2)読み出しが行われたレジスタ/メモリのアドレスが、RWOに登録されていない場合には、該アドレスがRWIに登録されているか否かが検索される。RWIに登録されている場合には、既に入力値として入出力セットに登録されている値の読み出しが行われたものであるので、さらに入力値として登録する必要はないことになる。すなわち、該アドレスをRWIに登録せずに終了する。
(AR3)読み出しが行われたレジスタ/メモリのアドレスが、RWOおよびRWIのいずれにも登録されていない場合には、該アドレスおよび値を入力アドレスおよび入力値としてRWIに登録する。
また、命令区間実行時にレジスタ/メモリへの書き込みが行われた場合には、RW4Aによって次の処理が行われる。
(AW1)書き込みが行われたレジスタ/メモリのアドレスが、RWOに登録されているか否かが検索される。RWOに登録されている場合には、既に出力値として入出力セットに登録されている値の書き換えが行われたことになるので、登録されている出力アドレスに対応する出力値を、書き込みが行われた値に更新し、終了する。
(AW2)書き込みが行われたレジスタ/メモリのアドレスが、RWOに登録されていない場合には、該アドレスおよび値を出力アドレスおよび出力値としてRWOに登録する。
以上の処理が該命令区間の終了まで行われることによって、該命令区間の入出力セットがRW4Aによって生成されることになる。生成された入出力セットは、上記したような登録処理によって命令区間記憶部2に登録される。
ここで、命令区間の一例として、図10に示す命令区間を実行した場合の例について説明する。同図において、PCは、該命令区間が開始された際のPC値を示している。このPC値が、RW4AのPCに格納される。
第1行目の命令(以降、単に第1の命令のように称する)において、メモリにおけるアドレスA1からロードした4バイトデータ(00110000)が、レジスタにおけるアドレスR1に格納される。この時点では、読み出しが行われたアドレスA1は、RWOおよびRWIのいずれにも登録されていないので、アドレスA1およびデータ(00110000)がRWIに登録される。また、書き込みが行われたアドレスR1は、RWOに登録されていないので、アドレスR1およびデータ(00110000)がRWOに登録される。
次に、第2の命令において、メモリにおけるアドレスA2からロードした1バイトデータ(02)が、レジスタにおけるアドレスR2に格納される。この時点では、読み出しが行われたアドレスA2は、RWOおよびRWIのいずれにも登録されていないので、アドレスA2およびデータ(02)がRWIに登録される。この際に、アドレスA2における残り3バイトについては、Don't Careを意味する「-」が格納される。また、書き込みが行われたアドレスR2は、RWOに登録されていないので、アドレスR2およびデータ(02)がRWOに登録される。
次に、第3の命令において、メモリにおけるアドレス(A2+R2)からロードした1バイトデータ(22)が、レジスタにおけるアドレスR2に格納される。ここで、アドレスR2に格納されているデータは(02)であったので、読み出しが行われたメモリにおけるアドレスは(A2+02)となる。この時点では、読み出しが行われたアドレス(A2+02)は、RWOおよびRWIのいずれにも登録されていないので、アドレス(A2+02)およびデータ(22)がRWIに登録される。この際に、アドレスA2における4バイトのうち、アドレス(A2+02)となるバイトの部分にデータ(22)が登録される。すなわち、第2の命令において、アドレスA2となるバイトの部分にデータ(02)が登録されているので、アドレス(A2+01)およびアドレス(A2+03)となるバイトの部分に、Don't Careを意味する「-」が格納されたままとなる。
また、書き込みが行われたアドレスR2は、既にRWOに登録されているので、アドレスR2に対応する出力値として、データ(02)からデータ(22)に書き換えられる。
次に、第4の命令において、メモリにおけるアドレスA3からロードした1バイトデータ(33)が、レジスタにおけるアドレスR3に格納される。この時点では、読み出しが行われたアドレスA3は、RWOおよびRWIのいずれにも登録されていないので、アドレスA1およびデータ(33)がRWIに登録される。また、書き込みが行われたアドレスR3は、RWOに登録されていないので、アドレスR3およびデータ(33)がRWOに登録される。
最後に、第5の命令において、メモリにおけるアドレス(R1+R2)からロードした1バイトデータ(44)が、レジスタにおけるアドレスR4に格納される。ここで、アドレスR1およびR2は、命令区間の内部にて上書きされたレジスタであるので、命令区間の入力とはならない。一方、(R1+R2)によって生成されたアドレスA4は命令区間の入力となる。このアドレスA4は、RWOおよびRWIのいずれにも登録されていないので、アドレスA4およびデータ(44)がRWIに登録される。また、書き込みが行われたアドレスR4は、RWOに登録されていないので、アドレスR4およびデータ(44)がRWOに登録される。以上の処理によって、図11に示すRW4Aの入出力セットが生成される。
以上のようにして生成された入出力セットは、図12に示すような木構造として、命令区間記憶部2に登録される。この木構造において、登録されている入力パターンは、ルートノードからリーフへ至る1本のパスとして命令区間記憶部2に保持される。以降、命令区間を実行する前に、該命令区間の入力パターンが、登録されている入力パターンと同じであるかを判断するために、図3に示したように、ルートノードから順に、ノードに記録されているアドレスを参照し、得られた値と一致するノードを連想検索機構を用いて選択することを繰り返すことになる。
(木構造連想検索の問題)
上記の木構造の場合、入力パターンを1つずつ順に読み出して連想検索を行い、一致するノードが見つかった後に、次のノードの選択を行うことになる。すなわち、先行するノードの検索が完全に終了してから次のノードの検索が開始されることになる。
ここで、CAM/RAMで構成される連想検索装置は、一般的に長レイテンシ高スループットの特性を有している。すなわち、一般的な連想検索装置は、1つの検索入力が行われてから出力されるまでの期間は比較的長いものであるが、複数の検索入力を同時に処理して出力することが可能であるという特性を有している。これに対し、上記のように、先行するノードの検索が完全に終了してから次のノードの検索が開始される、というような検索が行われる場合、連想検索装置における高スループットの能力を利用することができないことになり、連想検索装置の能力を十全に発揮することができないことになる(問題1)。
また、上記の木構造の場合、命令区間の入力パターンが参照順に一本のパスとして実現されており、入力パターン全体が一致しなければ出力を再利用することができないことになる。ここで、次のような例を想定する。まず、ある命令区間を実行した際の入力パターンのうち、前半がパターンA1、後半がパターンA2となっており、パターンA1に対応する出力がX1、パターンA2に対応する出力がX2となっていたとする。また、別の命令区間を実行した際の入力パターンのうち、前半がパターンB1、後半がパターンB2となっており、パターンB1に対応する出力がY1、パターンB2に対応する出力がY2となっていたとする。その後、ある命令区間を実行しようとした時の入力パターンのうち、前半がパターンA1、後半がパターンB2となっていた場合、入力パターンの前半および後半のそれぞれについては再利用が可能であるものの、入力パターン全体としては過去に同一パターンが出現していないので、実際には再利用することができないことになる(問題2)。
例えば、図11に示す例では、入力セットにおけるアドレスA1およびA2による入力パターンと、アドレスA3による入力パターンとは、相互に依存関係がなく、互いに独立となっている。すなわち、アドレスA1およびA2による入力パターンを含むが、アドレスA3による入力パターンを含まない命令区間や、アドレスA3による入力パターンを含むが、アドレスA1およびA2による入力パターンを含まない命令区間に関しては、図11に示す入力パターンの木構造が存在したとしても、再利用することができないことになる。
(RWの第2構成例)
上記の2つの問題は、ある呼び出し時点における命令区間の入力パターンをルートノードからリーフへ至る1本のパスによる表現したことによって生じたものである。これらの問題を解決するためには、入力パターンをグループ分割し、各グループ毎に過去の入力パターンを保持する木構造を構成し、さらに、複数木構造の同時探索を可能とすることによって連想検索装置を有効に利用できるようにすることが必要である。
例えば、図11に示す入出力セットに対して、図13に示すように、互いに独立な入力セットおよび出力セットそれぞれにグループ番号を付与する。すなわち、アドレスA1による入力パターン、アドレスA2による入力パターン、およびアドレスA4による入力パターンにグループ番号(grpid)0を付与し、アドレスA3による入力パターンにグループ番号(grpid)2を付与する。また、アドレスR1による出力パターン、アドレスR2による出力パターン、およびアドレスR4による出力パターンにグループ番号(grpid)0を付与し、アドレスR3による出力パターンにグループ番号(grpid)2を付与する。
次に、グループ番号に基づいて、図12に示す木構造を、図14に示すような複数の木構造に分割する。このようにすれば、グループの異なる入力パターンを独立に登録することが可能となり、ルートノードからリーフに至るパスに対応する入力グループ毎に独立に再利用を行うことが可能となるとともに、並列に検索を行うことが可能となる。
上記のように、木構造の分割を実現するためには、各入力グループ同士の間でデータ依存関係がないことが必要である。すなわち、ある入力パターンをグループAとグループBとに分割した場合において、グループAの入力がグループBの入力に依存する場合、あるいは、グループBの入力がグループAの入力に依存する場合には、グループ分割したとしても、各グループを独立に再利用できる可能性は極めて低くなる。
データ依存関係がないグループに分割するには、入力パターンを生成する際に、データ依存関係の解析を行う必要がある。すなわち、RW4Aが、データ依存関係の解析を行った上で、入力パターンをデータ依存関係がないグループに分割して入出力セットを生成するようにすればよいことになる。
図15は、上記を実現する第2構成例としてのRW4Aの概略構成を示している。同図に示すように、RW4Aは、命令区間のPC値を格納するPC、入力アドレスおよび入力値を格納するRWI、出力アドレスおよび出力値を格納するRWO、依存関係格納部M、行間論理積比較部MR、およびグループID格納部IDを有している。
依存関係格納部Mは、2次元配列のメモリであり、各メモリ要素には0または1が記憶されるようになっている。また、依存関係格納部Mにおいて、各列はRWIに登録されている各入力アドレスおよび入力値に対応しており、各行はRWOに登録されている各出力アドレスおよび出力値に対応している。そして、依存関係格納部Mは、各出力アドレスおよび出力値が、どの入力アドレスおよび入力値を起源とするものであるかを示している。
行間論理積比較部MRは、依存関係格納部Mに格納されている各行成分間の論理積演算を行い、1以上の出力アドレスおよび出力値を含む出力パターンと、1以上の入力アドレスおよび入力値を含む入力パターンとからなる入出力グループを設定する演算部である。この行間論理積比較部MRによる論理積演算の詳細については後述する。
グループID格納部IDは、行間論理積比較部MRによる論理積演算結果に基づいて、依存関係格納部Mにおける各列に対応する入力アドレスおよび入力値に対して付与されるグループIDを格納するメモリである。このグループIDの詳細については後述する。
ある命令区間の実行が開始されると、まず依存関係格納部Mにおける各メモリ要素の初期値として、全て0に設定される。そして、該命令区間のPC値がRW4AにおけるPCに格納される。その後、命令区間の実行が順次行われると、レジスタ/メモリからの読み出し、および/または、レジスタ/メモリへの書き込みが順に行われることになる。
命令区間実行時にレジスタ/メモリからの読み出しが行われた場合には、RW4Aによって次の処理が行われる。
(BR1)読み出しが行われたレジスタ/メモリのアドレスが、RWOに登録されているか否かが検索される。RWOに登録されている場合には、既に出力値として入出力セットに登録されている値の読み出しが行われたものであるので、入力値として登録する必要はないことになる。すなわち、該アドレスをRWIに登録せずに終了する。
この時、RWOにおいて既に登録されているアドレスに対応する依存関係格納部Mの行成分の各メモリ要素の値が取り出され、行成分のみの1次元行列としての暫定行列A(x)として記憶される。ここで、xは暫定行列Aが生成された順に付される番号とする。この暫定行列A(x)は、後述する書き込み処理が終了した時点で初期化される。なお、この暫定行列A(x)は、図15では図示していないが、暫定行列A(x)を複数格納することができる暫定行列格納メモリに格納されることになる。
(BR2)読み出しが行われたレジスタ/メモリのアドレスが、RWOに登録されていない場合には、該アドレスがRWIに登録されているか否かが検索される。RWIに登録されている場合には、既に入力値として入出力セットに登録されている値の読み出しが行われたものであるので、さらに入力値として登録する必要はないことになる。すなわち、該アドレスをRWIに登録せずに終了する。
この時、RWIにおいて既に登録されているアドレスに対応する依存関係格納部Mの列に対応するメモリ要素を1とし、その他のメモリ要素を0とした暫定行列A(x)が記憶される。
(BR3)読み出しが行われたレジスタ/メモリのアドレスが、RWOおよびRWIのいずれにも登録されていない場合には、該アドレスおよび値を入力アドレスおよび入力値としてRWIに登録する。
この時、新たに追加した入力アドレスおよび入力値(エントリ)に対応する依存関係格納部Mの列に対応するメモリ要素を1とし、その他のメモリ要素を0とした暫定行列A(x)が記憶される。
また、命令区間実行時にレジスタ/メモリへの書き込みが行われた場合には、RW4Aによって次の処理が行われる。
(BW1)書き込みが行われたレジスタ/メモリのアドレスが、RWOに登録されているか否かが検索される。RWOに登録されている場合には、既に出力値として入出力セットに登録されている値の書き換えが行われたことになるので、登録されている出力アドレスに対応する出力値を、書き込みが行われた値に更新し、終了する。
この時、RWOにおいて既に登録されているアドレスに対応する依存関係格納部Mの行成分が、その時点で記憶されている全ての暫定行列A(x)の論理和に置き換えられる。これにより、RWOにおいて既に登録されている出力アドレス/値に対する出力の起源となる入力アドレス/値のパターンが、該出力アドレスに対応する依存関係格納部Mの行成分によって示されることになる。書き込み処理が終了し、暫定行列A(x)の論理和への置き換えが完了すると、暫定行列A(x)が全て初期化される。
(BW2)書き込みが行われたレジスタ/メモリのアドレスが、RWOに登録されていない場合には、該アドレスおよび値を出力アドレスおよび出力値としてRWOに登録する。
この時、新たに追加した出力アドレスおよび出力値(エントリ)に対応する依存関係格納部Mの行成分が、その時点で記憶されている全ての暫定行列A(x)の論理和に置き換えられる。これにより、RWOに新たに登録した出力アドレス/値に対する出力の起源となる入力アドレス/値のパターンが、該出力アドレスに対応する依存関係格納部Mの行成分によって示されることになる。書き込み処理が終了し、暫定行列A(x)の論理和への置き換えが完了すると、暫定行列A(x)が全て初期化される。
ここで、命令区間の一例として、図16に示す命令区間を実行した場合の例について説明する。同図において、PCは、該命令区間が開始された際のPC値を示している。このPC値が、RW4AのPCに格納される。
その後、第1行目において、レジスタにおけるアドレスR1に格納されている(00001000)という値が読み込まれるとともに、この読み込まれた値に100を加える演算が行われた結果の主記憶アドレス(アドレスA1に相当)の値を読み出す命令が行われている。この時点では、アドレスR1はRWOおよびRWIのいずれにも登録されていないので、アドレスR1および値(00001000)がRWIに登録される。
この時、アドレスR1に対応する依存関係格納部Mの列に対応するメモリ要素を1とし、その他のメモリ要素を0とした暫定行列A(1)[1000]が記憶される。
また、アドレスA1の値(----FF--)が読み出され、レジスタのアドレスreg.に格納する命令が行われている。この時点では、アドレスA1はRWOおよびRWIのいずれにも登録されていないので、アドレスA1および値(----FF--)がRWIに登録される。
この時、アドレスA1に対応する依存関係格納部Mの列に対応するメモリ要素を1とし、その他のメモリ要素を0とした暫定行列A(2)[0100]が記憶される。
また、この時点では、アドレスreg.はRWOに登録されていないので、アドレスreg.および値(----FF--)がRWOに登録される。この時、新たに追加したアドレスreg.に対応する依存関係格納部Mの行成分が、その時点で記憶されている全ての暫定行列A(1)〜A(2)の論理和[1100]に置き換えられる。その後、暫定行列A(x)が初期化される。
次に、第2行目において、アドレスreg.から値を読み出して主記憶への書き込み処理が行われ、アドレスB1に値(----FF--)が書き込まれる。この時点では、アドレスreg.はRWOに登録されているので、RWOへの登録は行われない。この時、アドレスreg.に対応する依存関係格納部Mの行成分が取り出され、暫定行列A(1)[1100]が記憶される。
また、アドレスB1はRWOに登録されていないので、アドレスB1および値(----FF--)がRWOに登録される。
この時、新たに追加した出力アドレスに対応する依存関係格納部Mの行成分が、その時点で記憶されている全ての暫定行列A(1)の論理和[1100]に置き換えられる。その後、暫定行列A(x)が初期化される。
次に、第3行目において、レジスタにおけるアドレスR1に格納されている(00001000)という値が読み込まれるとともに、この読み込まれた値に200を加える演算が行われた結果の主記憶アドレス(アドレスA2に相当)の値を読み出す命令が行われている。この時点では、アドレスR1はRWIに既に登録されているので、RWIへの登録は行われない。
この時、アドレスR1に対応する依存関係格納部Mの列に対応するメモリ要素を1とし、その他のメモリ要素を0とした暫定行列A(1)[1000]が記憶される。
また、アドレスA2の値(--01----)が読み出され、レジスタのアドレスreg.に格納する命令が行われている。この時点では、アドレスA2はRWOおよびRWIのいずれにも登録されていないので、アドレスA2および値(--01----)がRWIに登録される。
この時、アドレスA2に対応する依存関係格納部Mの列に対応するメモリ要素を1とし、その他のメモリ要素を0とした暫定行列A(2)[0010]が記憶される。
また、この時点では、アドレスreg.はRWOに登録されており、このRWOにおけるアドレスreg.の値が値(--01----)に更新される。この時、更新されたアドレスreg.に対応する依存関係格納部Mの行成分が、その時点で記憶されている全ての暫定行列A(1)〜A(2)の論理和[1010]に置き換えられる。その後、暫定行列A(x)が初期化される。
次に、第4行目において、アドレスreg.から値を読み出して主記憶への書き込み処理が行われ、アドレスB2に値(--01----)が書き込まれる。この時点では、アドレスreg.はRWOに登録されているので、RWOへの登録は行われない。この時、アドレスreg.に対応する依存関係格納部Mの行成分が取り出され、暫定行列A(1)[1010]が記憶される。
また、アドレスB2はRWOに登録されていないので、アドレスB2および値(--01----)がRWOに登録される。
この時、新たに追加した出力アドレスに対応する依存関係格納部Mの行成分が、その時点で記憶されている全ての暫定行列A(1)の論理和[1010]に置き換えられる。その後、暫定行列A(x)が初期化される。
次に、第5行目において、アドレスA3の値(5678----)が読み出され、レジスタのアドレスreg.に格納する命令が行われている。この時点では、アドレスA3はRWOおよびRWIのいずれにも登録されていないので、アドレスA3および値(5678----)がRWIに登録される。
この時、アドレスA3に対応する依存関係格納部Mの列に対応するメモリ要素を1とし、その他のメモリ要素を0とした暫定行列A(1)[0001]が記憶される。
また、この時点では、アドレスreg.はRWOに登録されており、このRWOにおけるアドレスreg.の値が値(5678----)に更新される。この時、更新されたアドレスreg.に対応する依存関係格納部Mの行成分が、その時点で記憶されている全ての暫定行列A(1)の論理和[0001]に置き換えられる。その後、暫定行列A(x)が初期化される。
最後に、第6行目において、アドレスreg.から値を読み出して主記憶への書き込み処理が行われ、アドレスB3に値(5678----)が書き込まれる。この時点では、アドレスreg.はRWOに登録されているので、RWOへの登録は行われない。この時、アドレスreg.に対応する依存関係格納部Mの行成分が取り出され、暫定行列A(1)[0001]が記憶される。
また、アドレスB3はRWOに登録されていないので、アドレスB3および値(5678----)がRWOに登録される。
この時、新たに追加した出力アドレスに対応する依存関係格納部Mの行成分が、その時点で記憶されている全ての暫定行列A(1)の論理和[0001]に置き換えられる。その後、暫定行列A(x)が初期化される。以上の処理によって、図15に示すRW4Aの入出力セットが生成される。
以上のように依存関係格納部Mを生成することによって、命令区間の実行完了時には、次の情報が得られていることになる。
(Rs1)依存関係格納部Mの行成分は、対応する出力アドレス/値の起源となる入力アドレス/値を1によって示している。
(Rs2)ある行成分Maにおいて1が示されている入力アドレス/値の組が1つの入力グループを形成し、該入力グループが一致した場合に再利用可能な出力アドレス/値は、行成分Maに対応する出力アドレス/値である。
(Rs3)「ある行成分Maの反転」と「ある行成分Mb」との論理積が全て0である場合、Maにおける1のパターンは、Mbにおける1のパターンを包含する。すなわち、Maに属する入力アドレス/値の組が1つの入力グループを形成するとともに、該入力グループが一致した場合に再利用可能な出力アドレス/値は、Maに対応する出力アドレス/値、および、Mbに対応する出力アドレス/値となる。
(Rs4)「ある行成分Ma」と「ある行成分Mb」との論理積が全て0である場合、Maに属する入力アドレス/値と、Mbに属する入力アドレス/値とは互いに独立している。
以上の情報に基づいて、RW4Aは、入出力セットを複数の入出力グループに分割する。まず、上記の(Rs3)に関連する処理として、依存関係格納部Mにおいて、「ある行成分Maの反転」と「ある行成分Mb」との論理積が全て0になる行成分の組が行間論理積比較部MRによって抽出される。抽出された行成分の組のうち、入力アドレス/値の組を最も多く含む行成分、すなわち、他の行成分における入力アドレス/値の組を全て含んだ行成分が上位行成分として選択される。そして、抽出された行成分のうち、上位行成分以外の下位行成分が削除される。この処理によって、冗長な入出力グループを排除することができる。
次に、下位行成分が削除された状態において、上記の(Rs4)に関連する処理として、「ある行成分Ma」と「ある行成分Mb」との論理積が全て0になる行成分の組が行間論理積比較部MRによって抽出される。そして、抽出された行成分の組のうち、他のどの行成分に対しても論理積が全て0になる行成分がさらに抽出される。ここで抽出された行成分は、他のどの行成分に対しても依存関係を有さないことになるので、これを独立行成分と設定し、これ以外を非独立行成分と設定する。
独立行成分は、それぞれ対応する入力アドレス/値の組および出力アドレス/値の組が抽出されて、1つの入出力グループとして設定される。一方、非独立行成分は、次の2つの処理のいずれかによって入出力グループとして設定される。
第1の処理としては、非独立行成分の全てに含まれる入力アドレス/値の組および出力アドレス/値の組の総和を1つの入出力グループとして設定する処理である。第2の処理としては、非独立行成分のそれぞれをそのまま入出力グループとして設定する処理である。第1の処理を行う場合、入出力グループの数を必要以上に増大させることがなくなるので、命令区間記憶部2におけるメモリ使用容量を低減することができる。一方、第2の処理を行う場合、入出力グループの数が比較的多くなり、命令区間記憶部2におけるメモリ使用容量が比較的大きくなるという問題はあるが、命令区間記憶部2において、同時に検索すべき木構造の数を増やすことができるので、連想検索装置における高スループットの能力を利用することが可能となる。
以上のようにして入出力グループが設定されると、これに基づいて、行間論理積比較部MRが、各入出力グループにグループIDを付与し、RWIに登録されている入力アドレス/値のそれぞれに対して、どのグループIDに含まれているものであるかを示す情報をグループID格納部IDに格納する。これにより、グループID格納部IDの内容を見ることによって、各入出力グループにおける入力パターンを特定することが可能となる。
以上のように、RW4Aは、1つ以上の入出力グループを生成し、生成した入出力グループを命令区間記憶部2に対して実行結果として登録する。このような処理により、1つの命令区間の実行結果が、1つ以上の入出力グループとして命令区間記憶部2に登録されることになる。よって、ある命令区間を再利用によって実行する際に、以前に実行された命令区間の入力パターンの一部しか一致していない場合でも、再利用を行うことが可能となる確率を高めることができる。また、同時に検索すべき木構造が複数存在する確率を高めることができるので、連想検索装置における高スループットの能力を利用することが可能となり、処理速度の向上を期待することができる。
なお、本実施形態においては、RW4Aによって生成された入出力グループは、入力パターンを木構造として登録する命令区間記憶部2に登録されるようになっているが、これに限定されるものではない。すなわち、RW4Aによって生成された入出力グループを、命令区間の実行結果を再利用することが可能な形態で登録することが可能な命令区間記憶部であれば、本実施形態に係るRW4Aを適用することが可能である。
(RWの第3構成例)
上記のRWの第2構成例によれば、依存関係格納部Mを用いて行間論理積比較部MRが演算を行うことによって、1つの命令区間の実行結果を、1つ以上の入出力グループとして命令区間記憶部2に登録することが可能となる。しかしながら、命令区間の実行結果において、出力アドレスおよび出力値のパターンの数が多くなると、依存関係格納部Mの行数が多くなることになる。この場合、行間論理積比較部MRによる論理積演算が膨大になり、行間論理積比較部MRの回路規模が莫大になるという問題がある。以下に示すRWの第3構成例は、この問題を解決するものとなっている。
図17は、第3構成例としてのRW4Aの概略構成を示している。同図に示すように、RW4Aは、命令区間の命令区間のPC値を格納するPC、入力アドレスおよび入力値を格納するRWI、出力アドレスおよび出力値を格納するRWO、依存関係格納部M、行一時格納部(一時格納部)tmp00、入力側番号格納部(入力側グループ格納部)rgpid、出力側番号格納部(出力側グループ格納部)wgpid、番号管理部(グループ管理部)busy、および、番号一時格納部(グループ一時格納部)tmp01を有している。
依存関係格納部Mは、入力側を列指定子[I]、出力側を行指定子[O]とする2次元配列のメモリであり、各メモリ要素には0または1が記憶されるようになっている。また、依存関係格納部Mにおいて、各列はRWIに登録されている入力アドレスおよび入力値の組のそれぞれに対応しており、各行はRWOに登録されている出力アドレスおよび出力値の組のそれぞれに対応している。そして、依存関係格納部Mは、各出力アドレスおよび出力値の組が、どの入力アドレスおよび入力値の組を起源とするものであるかを示している。
行一時格納部tmp00は、依存関係格納部Mから読み出された行を一時的に保存するメモリである。入力側番号格納部rgpidは、入力アドレスおよび入力値の組のそれぞれに対して付与するグループ番号を格納するメモリである。出力側番号格納部wgpidは、出力アドレスおよび出力値の組のそれぞれに対して付与するグループ番号を格納するメモリである。命令区間の実行完了時には、(1)各入力データが所属するグループ番号が、対応する入力側番号格納部rgpidに1が示されているビット位置によって得られ、(2)各出力データが所属するグループ番号は、対応する出力側番号格納部wgpidに1が示されているビット位置によって得られることになる。
番号管理部busyは、グループ番号の空き状況を管理するメモリである。番号一時格納部tmp01は、入力側番号格納部rgpidおよび出力側番号格納部wgpidから読み出したグループ番号情報を一時的に格納するメモリである。
命令区間の実行開始直前には、依存関係格納部M、行一時格納部tmp00、入力側番号格納部rgpid、出力側番号格納部wgpid、番号管理部busy、および、番号一時格納部tmp01が全て0に初期化される。そして、該命令区間のPC値がRW4AにおけるPCに格納される。その後、命令区間の実行が順次行われると、レジスタ/メモリからの読み出し、および/または、レジスタ/メモリへの書き込みが順に行われることになる。
命令区間実行時にレジスタ/メモリからの読み出しが行われた場合には、RW4Aによって次の処理が行われる。
(CR1)読み出しが行われたレジスタ/メモリのアドレスが、RWOに登録されているか否かが検索される。RWOに登録されている場合には、既に出力値として入出力セットに登録されている値の読み出しが行われたものであるので、入力値として登録する必要はないことになる。すなわち、該アドレスをRWIに登録せずに終了する。
この時、RWOにおいて既に登録されているアドレスに対応する依存関係格納部Mの行成分の各メモリ要素の値が取り出され、行一時格納部tmp00に格納されている各要素との論理和が演算される。この演算結果としての論理和が、行一時格納部tmp00に格納される。すなわち、読み出しが行われたデータの起源を表す行一時格納部tmp00に、入力の情報が格納されることになる。
また、RWOにおいて既に登録されているアドレスに対応する出力側番号格納部wgpidの行成分の各要素の値が取り出され、番号一時格納部tmp01に格納されている各要素との論理和が演算される。この演算結果としての論理和が、番号一時格納部tmp01に格納される。すなわち、読み出しが行われたデータの所属グループを示す番号一時格納部tmp01に、入力の情報が格納されることになる。
(CR2)読み出しが行われたレジスタ/メモリのアドレスが、RWOに登録されていない場合には、該アドレスがRWIに登録されているか否かが検索される。RWIに登録されている場合には、既に入力値として入出力セットに登録されている値の読み出しが行われたものであるので、さらに入力値として登録する必要はないことになる。すなわち、該アドレスをRWIに登録せずに終了する。
この時、行一時格納部tmp00における、入力側の既登録位置[I]に対応するメモリ要素のビットを1とする。すなわち、読み出しが行われたデータの起源を表す行一時格納部tmp00が新規に作成されることになる。
また、行一時格納部tmp00においてビットが1にセットされたメモリ要素の列位置に対応する入力側番号格納部rgpidが読み出され、番号一時格納部tmp01に格納されている要素との論理和が演算される。この演算結果としての論理和が、番号一時格納部tmp01に格納される。すなわち、読み出しが行われたデータの所属グループを示す番号一時格納部tmp01に、入力の情報が格納されることになる。
(CR3)読み出しが行われたレジスタ/メモリのアドレスが、RWOおよびRWIのいずれにも登録されていない場合には、該アドレスおよび値を入力アドレスおよび入力値としてRWIに登録する。
この時、行一時格納部tmp00における、新たに登録された位置[I]に対応するメモリ要素のビットを1とする。すなわち、読み出しが行われたデータの起源を表す行一時格納部tmp00が新規に作成されることになる。
また、命令区間実行時にレジスタ/メモリへの書き込みが行われた場合には、RW4Aによって次の処理が行われる。
また、行一時格納部tmp00においてビットが1にセットされたメモリ要素の列位置に対応する入力側番号格納部rgpidが読み出され、番号一時格納部tmp01に格納されている要素との論理和が演算される。この演算結果としての論理和が、番号一時格納部tmp01に格納される。すなわち、読み出しが行われたデータの所属グループを示す番号一時格納部tmp01に、入力の情報が格納されることになる。
(CW1)書き込みが行われたレジスタ/メモリのアドレスが、RWOに登録されているか否かが検索される。RWOに登録されている場合には、既に出力値として入出力セットに登録されている値の書き換えが行われたことになるので、登録されている出力アドレスに対応する出力値を、書き込みが行われた値に更新し、終了する。
この時、RWOにおいて既に登録されているアドレスに対応する依存関係格納部Mの行成分の各メモリ要素の値が、該命令区間の実行時に生成された行一時格納部tmp00に格納されている各要素の値に書き換えられる。すなわち、書き込みが行われたデータの起源が行一時格納部tmp00の値に置き換えられることになる。
ここで、番号一時格納部tmp01の各要素の値がチェックされる。そして、番号一時格納部tmp01の全ての要素が0である場合には、番号管理部busyにおいて空きグループ番号となっている列位置の1つに対応する、番号一時格納部tmp01における列位置が1に設定される。具体的には、番号管理部busyにおける各要素のうち、最も左寄りの0に該当する列位置に対応する、番号一時格納部tmp01における列位置が1に設定される。また、この際に、番号一時格納部tmp01において、1に設定された列位置に対応する、番号管理部busyにおける列位置が1に設定される。
一方、番号一時格納部tmp01の要素に1がある場合には、最も左寄りの1に対応する列位置が使用すべきグループ番号と認識される。そして、番号一時格納部tmp01の全ての要素のうち、最も左寄りの位置にある1を残して、残りの要素を0にした値が、出力側番号格納部wgpidにおける既登録位置[O]、および、行一時格納部tmp00の該当位置が1である入力側番号格納部rgpidの該当位置にそれぞれ書き込まれる。
さらに、番号一時格納部tmp01の全ての要素のうち、最も左寄りの位置にある1を除いた残りの値と、入力側番号格納部rgpid全体および出力側番号格納部wgpid全体とをそれぞれ比較し、各要素の論理積が求められる。そして、論理積の結果、1となる要素を保持する入力側番号格納部rgpidおよび出力側番号格納部wgpidの列位置については、該当要素を0にリセットすることにより、番号一時格納部tmp01全体のうち、最も左寄りの位置にある1を残して、残りを0にした値がセットされる。
(CW2)
書き込みが行われたレジスタ/メモリのアドレスが、RWOに登録されていない場合には、該アドレスおよび値を出力アドレスおよび出力値としてRWOに登録する。
この時、新たに追加した出力アドレスおよび出力値(エントリ)に対応する依存関係格納部Mの行成分の各メモリ要素の値が、該命令区間の実行時に生成された行一時格納部tmp00に格納されている各要素の値に書き換えられる。すなわち、書き込みが行われたデータの起源が行一時格納部tmp00の値に置き換えられることになる。
ここで、上記したCW2と同様に、番号一時格納部tmp01の各要素の値がチェックされる。そして、番号一時格納部tmp01の全ての要素が0である場合には、番号管理部busyにおいて空きグループ番号となっている列位置の1つに対応する、番号一時格納部tmp01における列位置が1に設定される。具体的には、番号管理部busyにおける各要素のうち、最も左寄りの0に該当する列位置に対応する、番号一時格納部tmp01における列位置が1に設定される。また、この際に、番号一時格納部tmp01において、1に設定された列位置に対応する、番号管理部busyにおける列位置が1に設定される。
一方、番号一時格納部tmp01の要素に1がある場合には、最も左寄りの1に対応する列位置が使用すべきグループ番号と認識される。そして、番号一時格納部tmp01の全ての要素のうち、最も左寄りの位置にある1を残して、残りの要素を0にした値が、出力側番号格納部wgpidにおける既登録位置[O]、および、行一時格納部tmp00の該当位置が1である入力側番号格納部rgpidの該当位置にそれぞれ書き込まれる。
さらに、番号一時格納部tmp01の全ての要素のうち、最も左寄りの位置にある1を除いた残りの値と、入力側番号格納部rgpid全体および出力側番号格納部wgpid全体とをそれぞれ比較し、各要素の論理積が求められる。そして、論理積の結果、1となる要素を保持する入力側番号格納部rgpidおよび出力側番号格納部wgpidの列位置については、該当要素を0にリセットすることにより、番号一時格納部tmp01全体のうち、最も左寄りの位置にある1を残して、残りを0にした値がセットされる。
以上の手順により、命令区間の実行完了時には、以下の情報が得られている。
(1)各入力データが所属するグループ番号は、対応する入力側番号格納部rgpidに1が表示されているビット位置により得られる。
(2)各出力データが所属するグループ番号は、対応する出力側番号格納部wgpidに1が表示されているビット位置により得られる。
ここで、命令区間の一例として、図10に示す命令区間を実行した場合の例について説明する。同図において、PCは、該命令区間が開始された際のPC値を示している。このPC値が、RW4AのPCに格納される。
第1の命令において、メモリにおけるアドレスA1からロードした4バイトデータ(00110000)が、レジスタにおけるアドレスR1に格納される。この時点では、読み出しが行われたアドレスA1は、RWOおよびRWIのいずれにも登録されていないので、アドレスA1およびデータ(00110000)がRWIの第1列位置に登録される。
また、同時に、行一時格納部tmp00の第1列位置に1がセットされ、行一時格納部tmp00は「1000」となる。
また、行一時格納部tmp00に1がセットされた第1列位置に対応する入力側番号格納部rgpidの第1列位置から読み出された値「0000」が、番号一時格納部tmp01に書き込まれる。番号一時格納部tmp01の全ての要素が0の場合には、番号管理部busyの各要素が確認される。そして、番号管理部busy「0000」の各要素のうち、最も左寄りの0に該当する第1列位置が、次に利用すべき空きグループ番号として認識される。その後、番号管理部busyおよび番号一時格納部tmp01の第1列位置に1がそれぞれセットされる。この結果、番号管理部busyは「1000」、番号一時格納部tmp01は「1000」となる。
また、書き込みが行われたアドレスR1は、RWOに登録されていないので、アドレスR1およびデータ(00110000)がRWOの第1行に登録される。これと同時に、行一時格納部tmp00の全ての要素「1000」が依存関係格納部Mの第1行に書き込まれる。また、番号一時格納部tmp01の全ての要素「1000」が、出力側番号格納部wgpidの第1行に書き込まれる。また、同じく番号一時格納部tmp01の全ての要素「1000」が、行一時格納部tmp00において1となっている列における、入力側番号格納部rgpidの第1列位置に書き込まれる。
次に、第2の命令において、メモリにおけるアドレスA2からロードした1バイトデータ(02)が、レジスタにおけるアドレスR2に格納される。この時点では、読み出しが行われたアドレスA2は、RWOおよびRWIのいずれにも登録されていないので、アドレスA2およびデータ(02)がRWIの第2列に登録される。この際に、アドレスA2における残り3バイトについては、Don't Careを意味する「-」が格納される。
また、同時に、行一時格納部tmp00の第2列位置に1がセットされ、行一時格納部tmp00は「0100」となる。
また、行一時格納部tmp00に1がセットされた第2列位置に対応する入力側番号格納部rgpidの第2列位置から読み出された値「0000」が、番号一時格納部tmp01に書き込まれる。番号一時格納部tmp01の全ての要素が0の場合には、番号管理部busyの各要素が確認される。そして、番号管理部busy「1000」の各要素のうち、最も左寄りの0に該当する第2列位置が、次に利用すべき空きグループ番号として認識される。その後、番号管理部busyおよび番号一時格納部tmp01の第2列位置に1がそれぞれセットされる。この結果、番号管理部busyは「1100」、番号一時格納部tmp01は「0100」となる。
また、書き込みが行われたアドレスR2は、RWOに登録されていないので、アドレスR2およびデータ(02)がRWOの第2行に登録される。これと同時に、行一時格納部tmp00の全ての要素「0100」が依存関係格納部Mの第2行に書き込まれる。また、番号一時格納部tmp01の全ての要素「0100」が、出力側番号格納部wgpidの第2行に書き込まれる。また、同じく番号一時格納部tmp01の全ての要素「0100」が、行一時格納部tmp00において1となっている列における、入力側番号格納部rgpidの第2列位置に書き込まれる。
次に、第3の命令において、メモリにおけるアドレス(A2+R2)からロードした1バイトデータ(22)が、レジスタにおけるアドレスR2に格納される。この場合、アドレスR2は命令区間の内部にて上書きされたレジスタであるので、アドレスR2は命令区間の入力とはならない。
一方、アドレスR2に格納されているデータは(02)であったので、読み出しが行われたメモリにおけるアドレスは(A2+02)となる。この時点では、読み出しが行われたアドレス(A2+02)は、RWOおよびRWIのいずれにも登録されていないので、アドレス(A2+02)およびデータ(22)がRWIの第2列に追加登録される。
この際に、アドレスA2における4バイトのうち、アドレス(A2+02)となるバイトの部分にデータ(22)が登録される。すなわち、第2の命令において、アドレスA2となるバイトの部分にデータ(02)が登録されているので、アドレス(A2+01)およびアドレス(A2+03)となるバイトの部分に、Don't Careを意味する「-」が格納されたままとなる。
また、同時に、行一時格納部tmp00の第2列位置に1がセットされ、行一時格納部tmp00は「0100」となる。
また、アドレスR2からの読み出しに対応して、依存関係格納部Mのうち、アドレスR2に対応する第2行位置から読み出された値「0100」が、行一時格納部tmp00に書き込まれる。さらに、出力側番号格納部wgpidのうち、アドレスR2に対応する第2行位置から読み出された値「0100」が番号一時格納部tmp01に書き込まれる。
また、行一時格納部tmp00に1がセットされた第2列位置に対応する入力側番号格納部rgpidの第2列位置から読み出された値「0100」が、番号一時格納部tmp01に論理和として書き込まれる。番号一時格納部tmp01にビットが1となっている要素がある場合には、最も左寄りの1に該当する第2列位置が、次に利用すべき空きグループ番号として認識される。
また、書き込みが行われたアドレスR2は、既にRWOに登録されているので、アドレスR2に対応する出力値として、データ(02)からデータ(22)に書き換えられる。これと同時に、行一時格納部tmp00の全ての要素「0100」が依存関係格納部Mの第2行に書き込まれる。また、番号一時格納部tmp01の全ての要素「0100」が、出力側番号格納部wgpidの第2行に書き込まれる。また、同じく番号一時格納部tmp01の全ての要素「0100」が、行一時格納部tmp00において1となっている列における、入力側番号格納部rgpidの第2列位置に書き込まれる。
次に、第4の命令において、メモリにおけるアドレスA3からロードした1バイトデータ(33)が、レジスタにおけるアドレスR3に格納される。この時点では、読み出しが行われたアドレスA3は、RWOおよびRWIのいずれにも登録されていないので、アドレスA3およびデータ(33)がRWIの第3列に登録される。
また、同時に、行一時格納部tmp00の第3列位置に1がセットされ、行一時格納部tmp00は「0010」となる。
また、行一時格納部tmp00に1がセットされた第3列位置に対応する入力側番号格納部rgpidの第3列位置から読み出された値「0000」が、番号一時格納部tmp01に書き込まれる。番号一時格納部tmp01の全ての要素が0の場合には、番号管理部busyの各要素が確認される。そして、番号管理部busy「1100」の各要素のうち、最も左寄りの0に該当する第3列位置が、次に利用すべき空きグループ番号として認識される。その後、番号管理部busyおよび番号一時格納部tmp01の第3列位置に1がそれぞれセットされる。この結果、番号管理部busyは「1110」、番号一時格納部tmp01は「0010」となる。
また、書き込みが行われたアドレスR3は、RWOに登録されていないので、アドレスR3およびデータ(33)がRWOの第3行に登録される。これと同時に、行一時格納部tmp00の全ての要素「0010」が依存関係格納部Mの第3行に書き込まれる。また、番号一時格納部tmp01の全ての要素「0010」が、出力側番号格納部wgpidの第3行に書き込まれる。また、同じく番号一時格納部tmp01の全ての要素「0010」が、行一時格納部tmp00において1となっている列における、入力側番号格納部rgpidの第3列位置に書き込まれる。
最後に、第5の命令において、メモリにおけるアドレス(R1+R2)からロードした1バイトデータ(44)が、レジスタにおけるアドレスR4に格納される。ここで、アドレスR1およびR2は、命令区間の内部にて上書きされたレジスタであるので、命令区間の入力とはならない。一方、(R1+R2)によって生成されたアドレスA4は命令区間の入力となる。このアドレスA4は、RWOおよびRWIのいずれにも登録されていないので、アドレスA4およびデータ(44)がRWIの第4列に登録される。
また、同時に、行一時格納部tmp00の第4列位置に1がセットされ、行一時格納部tmp00は「0001」となる。
また、アドレスR1およびアドレスR2からの読み出しに対応して、依存関係格納部Mのうち、アドレスR1およびアドレスR2に対応する第1行位置および第2行位置から読み出された値「1000」、値「0100」、および行一時格納部tmp00の値「0001」の論理和「1101」が、行一時格納部tmp00に書き込まれる。さらに、出力側番号格納部wgpidのうち、アドレスR1およびアドレスR2に対応する第1行位置および第2行位置から読み出された値「1000」および値「0100」の論理和「1100」が番号一時格納部tmp01に書き込まれる。
また、最初に行一時格納部tmp00に1がセットされた第4列位置に対応する入力側番号格納部rgpidの第4列位置から読み出された値「0000」と、番号一時格納部tmp01に格納されている値「1100」との論理和「1100」が、番号一時格納部tmp01に書き込まれる。番号一時格納部tmp01にビットが1となっている要素がある場合には、最も左寄りの1に該当する第1列位置が、次に利用すべき空きグループ番号として認識される。
また、書き込みが行われたアドレスR4は、RWOに登録されていないので、アドレスR4およびデータ(44)がRWOの第4行に登録される。これと同時に、行一時格納部tmp00の全ての要素「1101」が依存関係格納部Mの第4行に書き込まれる。また、番号一時格納部tmp01の全ての要素「1100」のうち、最も左寄りの1を残して、残りを0にした「1000」が、出力側番号格納部wgpidの第4行に書き込まれる。また、同じく番号一時格納部tmp01の全ての要素「1100」のうち、最も左寄りの1を残して、残りを0にした「1000」が、行一時格納部tmp00において1となっている列における、入力側番号格納部rgpidの第1、2、4列位置に書き込まれる。
さらに、番号一時格納部tmp01の全ての要素「1100」のうち、最も左寄りの1を除外した残りの「0100」を、入力側番号格納部rgpidの全ての要素および出力側番号格納部wgpidの全ての要素と比較し、論理積が1になるビットを保持する入力側番号格納部rgpidおよび出力側番号格納部wgpidのエントリについては、該当ビットが0にリセットされることにより、番号一時格納部tmp01全体「1100」のうち、最も左寄りの位置にある1を残して、残りを0にした値「0100」がセットされる。
以上の手順により、入力セットA1−D1、A2−D2、およびA4−D4については、対応する入力側番号格納部rgpidの列位置にグループ0が表示され、出力セットR1、R2、およびR4については、対応する出力側番号格納部wgpidの行位置にグループ0が表示される。一方、入力セットA3−D3については、対応する入力側番号格納部rgpidの列位置にグループ番号2が表示され、出力セットR3については、対応する出力側番号格納部wgpidの行位置にグループ2が表示される。
(RWの第4構成例)
ある命令区間に条件分岐命令が含まれている場合、条件分岐に使用した条件コードの生成に関与した資源が、条件分岐命令実行後の全ての命令の実行に関与することになる。よって、条件分岐命令を考慮したグループ分割技術も必要となる。以下に示すRWの第4構成例は、これを実現することが可能となっている。
図18は、第4構成例としてのRW4Aの概略構成を示している。同図に示すように、RW4Aは、命令区間の命令区間のPC値を格納するPC、入力アドレスおよび入力値を格納するRWI、出力アドレスおよび出力値を格納するRWO、依存関係格納部M、行一時格納部tmp00、入力側番号格納部rgpid、出力側番号格納部wgpid、番号管理部busy、および、番号一時格納部tmp01に加えて、条件分岐命令の実行に伴う依存関係の擾乱に追随することを目的として、条件分岐格納部(条件分岐格納部)tmpccを有している。
条件分岐格納部tmpccは、条件分岐に関わった入力セットを格納するメモリである。条件分岐の成立/不成立に拘らず、分岐命令後の命令を実行すること自体が条件コード生成に関わった全入力に依存することになる。
前記したRWの第3構成例では、各命令ごとに行一時格納部tmp00を初期化するのに対して、RWの第4構成例では、条件分岐格納部tmpccの値を行一時格納部tmp00にコピーすることをもって、行一時格納部tmp00の初期化としている。
図18に示す例では、図19に示す命令区間が実行された場合を示している。図19に示す命令区間において、第1の命令から第4の命令までは、図10に示した命令区間と同様である。
第5の命令において、アドレスR3の値が検査される。そして、第6の命令において、第5の命令による検査結果に基づいて条件分岐が行われる。ここで、第5および第6の命令は、アドレスR3の値に依存しているので、実行時には、依存関係格納部Mの第3行が条件分岐格納部tmpccにコピーされる。そして、第7の命令が実行される前に、条件分岐格納部tmpccに格納されている「0010」が行一時格納部tmp00にコピーされる。
第7の命令では、アドレス(R1+R2)からロードした1バイトデータ(44)が、レジスタにおけるアドレスR4に格納される。ここで、アドレスR1およびR2は、命令区間の内部にて上書きされたレジスタであるので、命令区間の入力とはならない。一方、(R1+R2)によって生成されたアドレスA4は命令区間の入力となる。このアドレスA4は、RWOおよびRWIのいずれにも登録されていないので、アドレスA4およびデータ(44)がRWIの第4列に登録される。
また、同時に、行一時格納部tmp00の第4列位置に1がセットされ、行一時格納部tmp00は「0011」となる。
また、アドレスR1およびアドレスR2からの読み出しに対応して、依存関係格納部Mのうち、アドレスR1およびアドレスR2に対応する第1行位置および第2行位置から読み出された値「1000」、値「0100」、および行一時格納部tmp00の値「0011」の論理和「1111」が、行一時格納部tmp00に書き込まれる。さらに、出力側番号格納部wgpidのうち、アドレスR1およびアドレスR2に対応する第1行位置および第2行位置から読み出された値「1000」および値「0100」の論理和「1100」が番号一時格納部tmp01に書き込まれる。
また、最初に行一時格納部tmp00に1がセットされた第3列位置および第4列位置に対応する入力側番号格納部rgpidの第3列位置および第4列位置から読み出された値「0010」および値「0000」の論理和「0010」と、番号一時格納部tmp01に格納されている値「1100」との論理和「1110」が、番号一時格納部tmp01に書き込まれる。番号一時格納部tmp01にビットが1となっている要素がある場合には、最も左寄りの1に該当する第1列位置が、次に利用すべき空きグループ番号として認識される。
また、書き込みが行われたアドレスR4は、RWOに登録されていないので、アドレスR4およびデータ(44)がRWOの第4行に登録される。これと同時に、行一時格納部tmp00の全ての要素「1111」が依存関係格納部Mの第4行に書き込まれる。また、番号一時格納部tmp01の全ての要素「1110」のうち、最も左寄りの1を残して、残りを0にした「1000」が、出力側番号格納部wgpidの第4行に書き込まれる。また、同じく番号一時格納部tmp01の全ての要素「1110」のうち、最も左寄りの1を残して、残りを0にした「1000」が、行一時格納部tmp00において1となっている列における、入力側番号格納部rgpidの第1、2、3、4列位置に書き込まれる。
さらに、番号一時格納部tmp01の全ての要素「1110」のうち、最も左寄りの1を除外した残りの「0110」を、入力側番号格納部rgpidの全ての要素および出力側番号格納部wgpidの全ての要素と比較し、論理積が1になるビットを保持する入力側番号格納部rgpidおよび出力側番号格納部wgpidのエントリについては、該当ビットが0にリセットされることにより、番号一時格納部tmp01全体「1110」のうち、最も左寄りの位置にある1を残して、残りを0にした値「1000」がセットされる。
以上の手順により、入力セットA1−D1、A2−D2、A3−D3、およびA4−D4については、対応する入力側番号格納部rgpidの列位置にグループ0が表示され、出力セットR1、R2、R3、およびR4については、対応する出力側番号格納部wgpidの行位置にグループ0が表示される。すなわち、条件分岐命令の実行によって、アドレスR4の出力が依存する入力データは、入力セットA1−D1、A2−D2、A3−D3、およびA4−D4の全てとなっている。
(グループ分割に基づく再利用表設定)
以上のように、RWの第3および第4構成例によれば、各入力セットおよび各出力セットに対して、所属するグループ番号が割り当てられることになる。これに基づいて、同一グループとなる入力セットごとに、図14に示すような独立した木構造を構成することが可能となる。この木構造に基づいて、図20に示すように、各入力セットがRBおよびRFの連想検索装置に格納される。例えば図3に示す例では、初期検索キーとしてFFのみが用いられているが、上記のように各入力セットにグループ番号が与えられることによって、複数の初期検索キー(F0、F1、F2、…)を用いることが可能となる。これにより、複数の検索を同時に開始することが可能となる。図20に示す例では、グループ番号が0および2となっている独立木構造の先頭キーに対して、初期検索キーF0およびF2が設定されている。
(レジスタ値の詳細)
レジスタ入出力値としては、引数、返り値(Args.)、および、引数および返り値以外のレジスタおよび条件コード(Regs.,CC)が挙げられる。本実施形態では、SPARCアーキテクチャレジスタのうち、汎用レジスタ%g0-7、%o0-7、%l0-7、%i0-7、浮動小数点レジスタ%f0-31、条件コードレジスタICC、浮動小数点条件コードレジスタFCCを用いるようになっている(詳細は後述する)。このうち、リーフ関数の入力は汎用レジスタ%o0-5、出力は汎用レジスタ%o0-1または%f0-1、また、非リーフ関数の入力は汎用レジスタ%i0-5、出力は汎用レジスタ%i0-1または%f0-1、になり、入力は、arg[0-5]、出力は、rti[0-1] または%rtf[0-1]に登録される。SPARC−ABIの規定では、これら以外のレジスタは関数の入出力にはならないので、関数に関しては、レジスタ入出力値としては、Args.がRB、およびRO1/RO2に登録されることになる。
一方、SPARC−ABIの規定では、ループの入出力に関しては、用いられるレジスタの種類を特定することはできないので、ループの入出力を特定するには、全ての種類のレジスタに関してRBに登録する必要がある。よって、ループに関しては、レジスタ入出力値として、Regs.,CCに相当する、%g0-7、%o0-7、%l0-7、%i0-7、%f0-31、ICC、FCCが登録されることになる。
(多重再利用)
1レベルで上記のような再利用機構を用いた場合、図21(a)に示した例で言えば、リーフ関数としての関数Bや、関数Bの内部にあるループCなどをそれぞれ再利用することが可能となる。これに対して、ある関数を一度実行しただけで、その関数の内部に含まれる関数やループを含む全ての命令区間が再利用可能となるように登録を行う仕組みが多重再利用である。例えば上記の例で言えば、多重再利用によれば、関数Aを一度実行しただけで、入れ子関係にあるA,B,Cの全ての命令区間が再利用可能となる。以下に、多重再利用を実現する上で必要とされる機能拡張について説明する。
図6に、一例として、関数Aおよび関数Dの概念的な構造を示す。同図に示す例では、関数Aの内部にループBが存在しており、ループBの内部にループCが存在しており、ループCにおいて関数Dが呼び出されるようになっている。そして、関数Dの内部にループEが存在しており、ループEの内部にループFが存在している。
図7は、図6に示す関数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までとなる。主記憶に対する入出力については、前述した、関数呼び出し直前の%sp(SP)と比較する方法を入れ子の全階層に対して適用することにより、影響範囲を特定することができる。
ここで、上記のようなRW4A、RW4B、および命令区間記憶部2の構成によれば、複数の命令区間の入出力を個別に記録することが可能であるので、多重再利用を実現することが可能となる。
(並列事前実行)
以上に述べた、関数やループの多重再利用では、同一パラメータが出現する間隔が長い場合や、パラメータが単調に変化し続ける場合には全く効果がないことになる。すなわち、RBエントリの生存時間よりも同一パラメータが出現する間隔が長い場合には、ある関数またはループがRBに登録されたとしても、その登録された関数またはループに関して同一パラメータが次に出現した際には、すでにその関数またはループがRBエントリから消えていることになり、再利用できないことになる。また、パラメータが単調に変化し続ける場合には、該当する関数やループがRBに登録されていても、パラメータが異なることによって再利用できないことになる。
これに対して、多重再利用を行うプロセッサとしてのMSP1Aとは別に、命令区間の事前実行によってRBエントリを有効にするプロセッサとしてのSSP1Bを複数個設けることによって、さらなる高速化を図ることができる。
並列事前実行機構を行うためのハードウェア構成は、前記した図2に示すような構成となる。同図に示すように、RW4A・4B、演算器5A・5B、レジスタ6A・6B、キャッシュ7A・7Bは、各プロセッサごとに独立して設けられている一方、命令区間記憶部2、および主記憶3は全てのプロセッサが共有するようになっている。同図において、破線は、MSP1AおよびSSP1Bが命令区間記憶部2に対して入出力を登録するパスを示している。
ここで、並列事前実行を実現する上での課題は、(1)どのように主記憶一貫性を保つか、(2)どのように入力を予測するか、の2点が挙げられる。以下に、これらの課題に対する解決手法について説明する。
(主記憶一貫性に関する課題の解決方法)
まず、上記の課題(1)どのように主記憶一貫性を保つかについて説明する。特に予測した入力パラメータに基づいて命令区間を実行する場合、主記憶に書き込む値がMSP1AとSSP1Bとで異なることになる。これを解決するために、図2に示すように、SSP1Bは、RBへの登録対象となる主記憶参照には命令区間記憶部2、また、その他の局所的な参照にはSSP1Bごとに設けた局所メモリとしてのLocal7Bを使用することとし、Cache7Bおよび主記憶3への書き込みを不要としている。なお、MSP1Aが主記憶3に対して書き込みを行った場合には、対応するSSP1Bのキャッシュラインが無効化される。
具体的には、命令区間記憶部2への登録対象のうち、読み出しが先行するアドレスについては主記憶3を参照し、MSP1Aと同様にアドレスおよび値をRBへ登録する。以後、主記憶3ではなく命令区間記憶部2を参照することによって、他のプロセッサからの上書きによる矛盾の発生を避けることができる。局所的な参照については、読み出しが先行するということは、変数を初期化せずに使うことに相当し、値は不定でよいことになるので、主記憶3を参照する必要はない。
なお、局所メモリとしてのLocal7Bの容量は有限であり、関数フレームの大きさがLocal7Bの容量を超えた場合など、実行を継続できない場合は、事前実行を打ち切るようにする。また、事前実行の結果は主記憶3に書き込まれないので、事前実行結果を使って、さらに次の事前実行を行うことはできない。
(入力の予測方法)
次に、上記の課題(2)どのように入力を予測するかについて説明する。事前実行に際しては、命令区間記憶部2の使用履歴に基づいて将来の入力を予測し、SSP1Bへ渡す必要がある。このために、命令区間記憶部2に記憶されている各入力パターンごとに小さなプロセッサを設け、MSP1AやSSP1Bとは独立して入力予測値を求めるようにする。
具体的には、最後に出現した引数(B)および最近出現した2組の引数の差分(D)に基づいて、ストライド予測を行う。なお、B+Dに基づく命令区間の実行はMSP1Aがすでに開始していると考える。SSP1BがN台の場合には、用意する入力予測値は、B+D×2からB+D×(N+1)までの範囲とする。
以上のように入力予測を行えば、上記した入力パラメータが単調に変化し続けるような場合に、事前に予測しておいた結果に基づいて効果的に再利用を行うことが可能となる。