(57)【特許請求の範囲】
【請求項１】
データフローアーキテクチャにおける複数の処理要素を有するシステムであって、各葉ノード処理要素は入力データとして２つのビットストリングを引き受け２つの入力ビットストリングにブール演算を施して出力ビットユニットを生成する、システムにおける、複数の入力ビットストリングにブール演算を施して１つの合成ビットストリングを生成する、コンピュータで実現される方法であって、
入力ビットストリングの対の各々を処理要素の選択された１つにつなぎ、
処理要素を接続して複数のレベルを有する２分木を形成し、ここで選択された処理要素は２分木の葉ノードであり、選択された処理要素の出力ビットユニットは葉ノードよりも低い２分木レベルにある葉でないノードである中間処理要素へ入力され、中間処理要素の出力ビットユニットはより低い２分木レベルの他の中間処理要素へ入力され、合成ビットストリングは２分木の根ノードである根処理要素から出力され、
選択された処理要素へ入力されるビットベクトルにブール演算を施すことによって２分木のすべての葉ノードを処理して出力ビットユニットを生成し、ここで出力ビットユニットは中間処理要素へ入力されるビットユニットになり、中間処理要素へ入力されるビットユニットにブール演算を施すことによって２分木のすべての葉でないノードを処理して出力ビットユニットを生成し、根処理要素へ入力されるビットユニットにブール演算を施して合成ビットストリングを生成することによって２分木の根ノードを処理するステップを具備する方法。
【請求項２】
接続するステップは、選択された処理要素からの出力ビットユニットを保持するFIFOを中間処理要素へ、中間処理要素からのものを２分木のより低いレベルの中間処理要素へ、２つの中間処理要素からのものを根ノードへ接続する請求の範囲１の方法。
【請求項３】
すべての葉でないノードおよび根ノードの処理は葉でないノードと根ノードに対する入力ビットユニットがFIFOからの入力として利用可能であるとき達成される請求の範囲２の方法。
【請求項４】
入力ビットストリングの数が奇数であるとき、最後の奇数番目の入力ビットストリングをセーブし、ブール演算に従って最後の奇数番目の入力ビットストリングを合成ビットストリングと組み合わせるステップをさらに具備する請求の範囲１の方法。
【請求項５】
ブール演算はOR演算である請求の範囲１の方法。
【請求項６】
つなぐステップは、
（Ａ）処理要素の１つを選択し、
（Ｂ）第１の入力ビットストリングを処理要素の選択された１つの第１入力へつなぎ、
（Ｃ）第２の入力ビットストリングを処理要素の選択された１つの第２入力へつなぎ、
（Ｄ）入力ビットストリングの対の各々についてステップ（Ａ）−（Ｃ）を繰り返すステップを具備する請求の範囲１の方法。
【請求項７】
接続するステップは、
（Ａ）処理要素のフィールドを初期化し、
（Ｂ）葉でない処理要素の第１の選択された１つの第１入力を葉でない処理要素の第１の選択された１つのレベルよりも高い２分木レベルの第１処理要素の出力ビットユニットのFIFOにつなぎ、
（Ｃ）葉でない処理要素の第１の選択された１つの第２入力を葉でない処理要素の第１の選択された１つのレベルよりも高い２分木レベルの第２処理要素の出力ビットユニットのFIFOにつなぎ、
（Ｄ）すべての葉でない処理要素についてステップ（Ｂ）および（Ｃ）を繰り返すステップを具備する請求の範囲２の方法。
【請求項８】
接続するステップは、
根処理要素の第１入力を根処理要素のレベルよりも高い２分木レベルの処理要素の出力ビットユニットのFIFOにつなぎ、
根処理要素の第２入力を根処理要素のレベルよりも高い２分木レベルの他の処理要素の出力ビットユニットのFIFOにつなぐステップをさらに具備する請求の範囲７の方法。
【請求項９】
すべての葉ノードを処理しすべての葉でないノードを処理し根ノードを処理するステップは、
（Ａ）２分木に対する合成ビットストリングを初期化し、
（Ｂ）入力の少なくとも一方のデータのすべてが空になるまでまたは選択された処理要素に対する出力ビットユニットを格納するFIFOが満杯になるまで選択された処理要素に対する入力ビットユニットへのブール演算を達成し、
（Ｃ）すべての処理要素についてステップ（Ｂ）を繰り返し、
（Ｄ）根ノードの出力ビットユニットを格納するFIFOに格納されているデータを合成ビットストリングへ移動し、
（Ｅ）すべての入力ビットストリングのすべてのデータが処理されるまでステップ（Ｂ）−（Ｄ）を繰り返すステップを具備する請求の範囲２の方法。
【請求項１０】
入力ビットベクトルは、入力データがランであるかインパルスであるかを示すキャラクタタイプとランまたはインパルスの２進値を示すジェンダタイプと入力データ内のビット数を示すレングスを含む属性によって表わされる請求の範囲１の方法。
【請求項１１】
ランは或る２進値の１つ以上の連続ビットを有するビットストリングである請求の範囲10の方法。
【請求項１２】
インパルスは、或る２進値の１つ以上の連続ビットを有するビットストリングであって反対の２進値を有する終了ビットが続くものである請求の範囲10の方法。
【請求項１３】
複数の入力ビットストリングにブール演算を施して合成ビットストリングを生成するシステムであって、
１対の入力ビットユニットにブール演算を施して出力ビットユニットを生成する手段をその各々が具備する複数の処理要素と、
入力ビットストリングの対の各々を処理要素の選択された１つにつなぐ手段と、
処理要素を接続して複数のレベルを有する２分木を形成する手段であって、選択された処理要素は２分木の葉ノードであり、選択された処理要素の出力ビットユニットは葉ノードよりも低い２分木レベルの葉でないノードである中間処理要素へ入力され、中間処理要素の出力ビットユニットはより低い２分木レベルの他の中間処理要素へ入力され、合成ビットベクトルは２分木の根ノードである根処理要素によって出力されるものと、
選択された処理要素へ入力されるビットベクトルに対するブール演算を開始することによって２分木のすべての葉ノードを処理して出力ビットユニットを生成し、ここで出力ビットユニットは中間処理要素へ入力されるビットユニットになり、中間処理要素へ入力されるビットユニットに対するブール演算を開始することによって２分木のすべての葉でないノードを処理して出力ビットユニットを生成し、根処理要素へ入力されるビットユニットに対するブール演算を開始して合成ビットストリングを生成することによって２分木の根ノードを処理する手段とを具備するシステム。
【請求項１４】
選択された処理要素から中間処理要素へ、中間処理要素から２分木のより低いレベルの中間処理要素へ、及び２つの中間処理要素から根ノードへの出力ビットユニットを保持する複数のFIFOをさらに具備する請求の範囲13のシステム。
【請求項１５】
処理手段は、葉でないノードと根ノードに対する入力ビットユニットがFIFOからの入力として利用可能であるときすべての葉でないノードと根ノードの処理を開始する請求の範囲14のシステム。
【請求項１６】
入力ビットストリングの数が奇数であるとき、最後の奇数番目の入力ビットストリングをセーブする手段と、
ブール演算に従って最後の奇数番目の入力ビットストリングを合成ビットストリングと組み合わせる手段とをさらに具備する請求の範囲13のシステム。
【請求項１７】
ブール演算はOR演算である請求の範囲13のシステム。
【請求項１８】
つなぐ手段は、
処理要素の１つを選択する手段と、
第１の入力ビットストリングを処理要素の選択された１つの第１入力へつなぐ手段と、
第２の入力ビットストリングを処理要素の選択された１つの第２入力へつなぐ手段とを具備する請求の範囲13のシステム。
【請求項１９】
接続手段は、
処理要素のフィールドを初期化する手段と、
葉でない処理要素の第１の選択された１つの第１入力を葉でない処理要素の第１の選択された１つのレベルよりも高い２分木レベルの第１処理要素の出力ビットユニットのFIFOにつなぐ手段と、
葉でない処理要素の第１の選択された１つの第２入力を葉でない処理要素の第１の選択された１つのレベルよりも高い２分木レベルの第２処理要素の出力ビットユニットのFIFOにつなぐ手段とを具備する請求の範囲13のシステム。
【請求項２０】
接続手段は、
根処理要素の第１入力を根処理要素のレベルよりも高い２分木レベルの処理要素の第１の出力ビットユニットのFIFOにつなぐ手段と、
根処理要素の第２入力を根処理要素のレベルよりも高い２分木レベルの他の処理要素の出力ビットユニットのFIFOにつなぐ手段とをさらに具備する請求の範囲19のシステム。
【請求項２１】
処理手段は、
２分木に対する合成ビットストリングを初期化する手段と、
選択された処理要素の入力の少なくとも一方のデータのすべてが処理されるまでまたは選択された処理要素に対する出力ビットユニットを格納するFIFOが満杯になるまで選択された処理要素に対する入力ビットユニットへのブール演算の遂行を制御する手段と、
根ノードの出力ビットユニットを格納するFIFOに格納されているデータを合成ビットストリングへ移動する手段とを具備する請求の範囲14のシステム。
【請求項２２】
入力ビットユニットは、入力データがランであるかインパルスであるかを示すキャラクタタイプとランまたはインパルスの２進値を示すジェンダタイプと入力データ内のビット数を示すレングスを含む属性によって表わされる請求の範囲13のシステム。
【請求項２３】
ランは或る２進値の１つ以上の連続ビットを有するビットベクトルである請求の範囲22のシステム。
【請求項２４】
インパルスは、或る２進値の１つ以上の連続ビットを有するビットベクトルであって反対の２進値を有する終了ビットが続くものである請求の範囲22のシステム。
【請求項２５】
データフローアーキテクチャにおける複数の処理要素を有する関係データベース管理システムであって、各処理要素は入力データとして２つの入力ビットベクトルを引き受け２つの入力ビットベクトルにブールOR演算を施して出力ビットベクトルを生成する、システムにおける、関係データベースでの関係の２進表現を生成し、２進表現をビットベクトルに圧縮し、複数の入力ビットベクトルにブールOR演算を施して関係データベースのクエリーを満足する１つの合成ビットベクトルを生成する、コンピュータで実現される方法であって、
関係データベースでの関係の２進表現を生成し、ここで、該２進表現は符号化された連続した２進ビットのストリングを含み、
各ストリングを１つ以上の圧縮インパルスに分離し、ここで、１つ以上の圧縮インパルスは一緒になって実質的にストリング全体を構成し、１つ以上の圧縮インパルスの各々は同じ極性の１つ以上の連続ビットのランのストリングであって反対の極性を有する次のビットが続くものを含み、
該１つ以上の圧縮インパルスの各々を符号化されたインパルスフォーマットの対応するシーケンスに符号化し、ここで、該符号化インパルスフォーマットは入力ビットベクトルを形成し、
入力ビットベクトルの対の各々を処理要素の選択された１つにつなぎ、
処理要素を接続して複数のレベルを有する２分木を形成し、ここで選択された処理要素は２分木の葉ノードであり、選択された処理要素の出力ビットユニットは葉ノードよりも低い２分木レベルにある葉でないノードである中間処理要素へ入力され、中間処理要素の出力ビットユニットはより低い２分木レベルの他の中間処理要素へ入力され、合成ビットベクトルは２分木の根ノードである根処理要素から出力され、
選択された処理要素へ入力されるビットベクトルにブールOR演算を施すことによって２分木のすべての葉ノードを処理して出力ビットユニットを生成し、ここで出力ビットユニットは中間処理要素へ入力されるビットユニットになり、中間処理要素へ入力されるビットユニットにブールOR演算を施すことによって２分木のすべての葉でないノードを処理して出力ビットユニットを生成し、クエリー根処理要素へ入力されるビットユニットにブール演算を施してクエリーを満足する合成ビットベクトルを生成することによって２分木の根ノードを処理するステップを具備する方法。
【請求項２６】
接続するステップは、選択された処理要素からの出力ビットユニットを保持するFIFOを中間処理要素へ、中間処理要素からのものを２分木のより低いレベルの中間処理要素へ、２つの中間処理要素からのものを根ノードへ接続する請求の範囲25の方法。
【請求項２７】
すべての葉でないノードおよび根ノードの処理は葉でないノードと根ノードに対する入力ビットユニットがFIFOからの入力として利用可能であるとき達成される請求の範囲26の方法。
【請求項２８】
入力ビットベクトルの数が奇数であるとき、最後の奇数番目の入力ビットベクトルをセーブし、ブール演算に従って最後の奇数番目の入力ビットストリングを合成ビットベクトルと組み合わせるステップをさらに具備する請求の範囲25の方法。
【請求項２９】
つなぐステップは、
（Ａ）処理要素の１つを選択し、
（Ｂ）第１の入力ビットベクトルを処理要素の選択された１つの第１入力へつなぎ、
（Ｃ）第２の入力ビットベクトルを処理要素の選択された１つの第２入力へつなぎ、
（Ｄ）入力ビットベクトルの対の各々についてステップ（Ａ）−（Ｃ）を繰り返すステップを具備する請求の範囲25の方法。
【請求項３０】
接続するステップは、
（Ａ）処理要素のフィールドを初期化し、
（Ｂ）葉でない処理要素の第１の選択された１つの第１入力を葉でない処理要素の第１の選択された１つのレベルよりも高い２分木レベルの第１処理要素の出力ビットユニットのFIFOにつなぎ、
（Ｃ）葉でない処理要素の第１の選択された１つの第２入力を葉でない処理要素の第１の選択された１つのレベルよりも高い２分木レベルの第２処理要素の出力ビットユニットのFIFOにつなぎ、
（Ｄ）すべての葉でない処理要素についてステップ（Ｂ）および（Ｃ）を繰り返すステップを具備する請求の範囲25の方法。
【請求項３１】
接続するステップは、
根処理要素の第１入力を根処理要素のレベルよりも高い２分木レベルの処理要素の出力ビットユニットのFIFOにつなぎ、
根処理要素の第２入力を根処理要素のレベルよりも高い２分木レベルの他の処理要素の出力ビットユニットのFIFOにつなぐステップをさらに具備する請求の範囲30の方法。
【請求項３２】
すべての葉ノードを処理しすべての葉でないノードを処理し根ノードを処理するステップは、
（Ａ）２分木に対する合成ビットストリングを初期化し、
（Ｂ）入力の少なくとも一方のデータのすべてが処理されるまでまたは選択された処理要素に対する出力ビットユニットを格納するFIFOが満杯になるまで選択された処理要素に対する入力ビットユニットへのブールOR演算を達成し、
（Ｃ）すべての処理要素についてステップ（Ｂ）を繰り返し、
（Ｄ）根ノードの出力ビットユニットを格納するFIFOに格納されているデータを合成ビットストリングへ移動し、
（Ｅ）すべての入力ビットベクトルのすべてのデータが処理されるまでステップ（Ｂ）−（Ｄ）を繰り返すステップを具備する請求の範囲26の方法。
【請求項３３】
関係データベースにおける関係を表わす複数の入力ビットベクトルにブールOR演算を施して関係データベースのクエリーを満足する合成ビットベクトルを生成するシステムであって、
関係データベースでの関係の２進表現を生成する手段であって、該２進表現は連続した２進ビットのストリングを含むものと、
各ストリングを１つ以上の圧縮インパルスに分離する手段であって、１つ以上の圧縮インパルスは一緒になって実質的にストリング全体を構成し、１つ以上の圧縮インパルスの各々は同じ極性の１つ以上の連続ビットのランのストリングであって反対の極性を有する次のビットが続くものを含むものと、
該１つ以上の圧縮インパルスの各々を符号化されたインパルスフォーマットの対応するシーケンスに符号化する手段であって、該符号化インパルスフォーマットはビットベクトルを形成するものと、複数の処理要素であって、各処理要素は１対の入力ビットユニットにブールOR演算を施して出力ビットユニットを生成する手段を具備するものと、
入力ビットベクトルの対の各々を処理要素の選択された１つにつなぐ手段と、
処理要素を接続して複数のレベルを有する２分木を形成する手段であって、選択された処理要素は２分木の葉ノードであり、選択された処理要素の出力ビットユニットは葉ノードよりも低い２分木レベルにある葉でないノードである中間処理要素へ入力され、中間処理要素の出力ビットユニットはより低い２分木レベルの他の中間処理要素へ入力され、合成ビットベクトルは２分木の根ノードである根処理要素から出力されるものと、
選択された処理要素へ入力されるビットベクトルへのブールOR演算を開始することによって２分木のすべての葉ノードを処理して出力ビットユニットを生成する手段であって、出力ビットユニットは中間処理要素へ入力されるビットユニットになり、中間処理要素へ入力されるビットユニットへのブールOR演算を開始することによって２分木のすべての葉でないノードを処理して出力ビットユニットを生成し、クエリー根処理要素へ入力されるビットユニットにブール演算を施してクエリーを満足する合成ビットベクトルを生成することによって２分木の根ノードを処理するものとを具備するシステム。
【請求項３４】
選択された処理要素から中間処理要素へ、中間処理要素から２分木のより低いレベルの中間処理要素へ、及び２つの中間処理要素から根ノードへの出力ビットユニットを保持する複数のFIFOをさらに具備する請求の範囲33のシステム。
【請求項３５】
処理手段は、葉でないノードと根ノードに対する入力ビットユニットがFIFOからの入力として利用可能であるときすべての葉でないノードと根ノードの処理を開始する請求の範囲34のシステム。
【請求項３６】
入力ビットベクトルの数が奇数であるとき、最後の奇数番目の入力ビットストリングをセーブする手段と、
ブールOR演算に従って最後の奇数番目の入力ビットベクトルを合成ビットベクトルと組み合わせる手段とをさらに具備する請求の範囲33のシステム。
【請求項３７】
つなぐ手段は、
処理要素の１つを選択する手段と、
第１の入力ビットベクトルを処理要素の選択された１つの第１入力へつなぐ手段と、
第２の入力ビットベクトルを処理要素の選択された１つの第２入力へつなぐ手段とを具備する請求の範囲33のシステム。
【請求項３８】
接続手段は、
処理要素のフィールドを初期化する手段と、
葉でない処理要素の第１の選択された１つの第１入力を葉でない処理要素の第１の選択された１つのレベルよりも高い２分木レベルの第１処理要素の出力ビットユニットのFIFOにつなぐ手段と、
葉でない処理要素の第１の選択された１つの第２入力を葉でない処理要素の第１の選択された１つのレベルよりも高い２分木レベルの第２処理要素の出力ビットユニットのFIFOにつなぐ手段とを具備する請求の範囲33のシステム。
【請求項３９】
接続手段は、
根処理要素の第１入力を根処理要素のレベルよりも高い２分木レベルの処理要素の第１の出力ビットユニットのFIFOにつなぐ手段と、
根処理要素の第２入力を根処理要素のレベルよりも高い２分木レベルの他の処理要素の出力ビットユニットのFIFOにつなぐ手段とをさらに具備する請求の範囲38のシステム。
【請求項４０】
処理手段は、
２分木に対する合成ビットベクトルを初期化する手段と、
選択された処理要素への入力の少なくとも一方のデータのすべてが処理されるまでまたは選択された処理要素に対する出力ビットユニットを格納するFIFOが満杯になるまで選択された処理要素に対する入力ビットユニットへのブールOR演算の遂行を制御する手段と、
根ノードの出力ビットユニットを格納するFIFOに格納されているデータを合成ビットベクトルへ移動する手段とを具備する請求の範囲34のシステム。
【発明の詳細な説明】
発明の分野
本発明は、概括的にはコンピュータシステムにおいて複数のビットストリングを処理するための方法とシステムに関し、より特定的には、複数のビットストリングに対するブール“OR”演算の達成に関する。
発明の背景
ビットベクトル（すなわち符号化されたビットストリング）は関係データベース管理システム（“RDBMS”）においてデータベースに格納されるレコード内のデータ項目のインスタンスを表わすために使用される。ビットベクトルはビットストリングすなわち１と０の１次元アレイの符号化された形式を格納する。関係データベース管理システムにおけるデータ格納への従来のアプローチは、データの行および列に組織化されたテーブルの集まりを使用することである。各列は特定のタイプの情報を含み各行は列ごとに異なる情報を有する個々のレコードからなる。列は等しく構造化されたレコードとして連続的に格納される。このレコード指向アプローチは膨大な入力および出力（Ｉ／Ｏ）要件を負わせ、複雑なインデクス機構を必要とし、容認できる性能レベルを達成するためには反復的なチューニングと脱正規化（denormalization）を必要とする。
これらの問題を実質的に軽減するRDBMSにおけるデータの表現方法は、1998年10月７日出願の国際出願PCT／US88／03528に記述されており、その開示の全体は参照することによりここに組み込まれる。データベースはビットベクトルを使用することによりデータ値をデータベースにおける使用から切り離す列指向アプローチを使って構造化される。情報を連続するレコードとして格納するのでなく、データは列状の組織に格納される。各テーブルを埋めるデータ値はビットベクトルを用いて分離され、各ビットベクトルは列の各々からユニークな値を表わす。各ビットベクトル内では、２進ビット値が所与のレコード（または行）内の列値の発生率を示す。ビットベクトルはRDBMSにおける値を表わすために使われるが他の応用に対して使用することもできる。
あらゆるRDBMSにおけるように個々のデータレコードはクエリーを用いてデータベースに問い合わせることによって所在が確認される。クエリー過程の共通な形式は、１対のビットストリングにブール演算を施してクエリーの条件を満たすデータベースレコードを表わす合成ビットストリングを形成することを含む。
データベースの領域を節約し処理コストを軽減するため、Glaser et al．に発行された米国特許第5,036,457号に開示されるように圧縮され符号化されブール演算に従って処理されるが、これの開示全体が参照することによりここに組み入れられる。符号化された２進ビットストリングが復号され、或いは生のビットストリングが変換されて、一連のビットユニット、すなわちランまたはインパルスのいずれかを記述する圧縮された２進ビット形式になる。ランとは、同一の２進値を持つ１つ以上のビットの連続からなるビットストリングをいう。インパルスとは、同一の２進値を持つ１つ以上のビットの連続からなるビットストリングであってその２進値のビットと反対の２進値を有する終了ビットが続くものをいう。ブール演算がビットユニットすなわち圧縮形式のランまたはインパルスの対に対して実施され繰り返しループ構造を用いて合成ビットユニットが形成される。この方法は、典型的な従来技術において行なわれるように一度に１ビットずつ演算するよりも著しく早い。
１対の圧縮パルスが１対の符号化ビットストリング（すなわちビットベクトル）または１対の変換された生のビットストリングから得られ、より短かい（“最小”と呼ばれる）長さのインパルスが選択される。ブール演算が最小長さのインパルスの多数のビットについて実行されこの最小長さの合成ビットユニットが形成される。このサイクルが残りの最小長さのインパルスについて繰り返される。ブール演算の実行のために必要なトータルの回数は２つの入力ビットベクトルのインパルスの数の合計にほぼ等しく、これは入力ビットベクトルのビット数よりも著しく少ない。
多数の短かいインパルスを有するビットベクトルの処理のための計算のオーバーヘッドは最小長さ法を使うと多くなるが多数の長いインパルスを有するビットベクトルでは大きな問題にはならない。
それ故、不確定の長さの符号化ビットストリングの対に対してブール演算を実行する方法で、各最小長さインパルスについて繰り返しを行なうことによるオーバーヘッドを回避する方法が開発された。この方法は、1995年12月１日に出願された米国特許出願08／586,005号に記述されており、その開示全体が参照することによりここに組み込まれる。“最大”法と呼ばれるこの方法は最小長さのインパルスの代わりに最大長さのインパルスを使用してビットベクトルのブール演算を実行することによりクエリー処理を改善した。
上記に説明した進歩にもかかわらず、大規模なRDBMSにおけるクエリーの処理速度のさらなる改善が要望されている。従来の方法では１度に１対しかビットストリングの演算を行なわない。或るクエリーを解決するのに多数のビットストリングの組み合わせが必要とされそれを例えば１対ずつのOR演算で行なうとき、ビットストリングの処理のために最小または最大法の多数の繰り返しが必要である。例えば、４つのビットストリングＡ，Ｂ，ＣおよびＤがあるとすれば、最初にＡとＢが対として処理されて合成ビットストリングＥが出力される。次にＥとＣが処理されて合成ビットストリングＦを生成する。最後にＦとＤが処理されて合成ビットストリングを生成する。この合成ビットストリングの生成のためには多数の手続きの呼び出し、文脈切替、及び格納さらには中間的な（そしてそれゆえに一時的な）処理値を表現するために生成されるビットストリングのようなデータ構造の再呼び出しといった形のかなりの処理オーバーヘッドを必要とする。クエリー処理の改良を継続するためには、現在の１対ずつのやり方における処理オーバーヘッドなしで任意の数“Ｎ”の並列入力ビットストリングをサポートするシステムと方法が必要である。
発明の概要
本発明の実施例は、複数の入力された符号化ビットストリングまたは変換された生のビットストリングにブール演算を施して１つの合成された符号化ビットストリングまたは生のビットストリングを生成する方法であって、入力された符号化ビットストリングまたは変換された生のビットストリングの対の各々を複数の処理要素の選択された１つにつなぎ、複数の処理要素を接続して複数のレベルを有する２分木を形成し、ここで選択された処理要素は２分木の葉ノードであり、選択された処理要素の出力ビットユニット、すなわち圧縮されたランおよびインパルスは葉ノードよりも低い木レベルにある葉でないノードである中間処理要素へ入力され、中間処理要素の出力圧縮ランおよびインパルスはより低い２分木レベルの他の中間処理要素へ入力され、合成された符号化ビットストリングまたは生のビットストリングは２分木の根ノードである根処理要素から出力され、選択された処理要素へ入力される符号化ビットストリングまたは変換された生のビットストリングにブール演算を施して出力圧縮ランおよびインパルスを生成することによって２分木のすべての葉ノードを処理し、ここで出力圧縮ランおよびインパルスは中間処理要素へ入力される圧縮ランおよびインパルスになり、中間処理要素へ入力される圧縮ランおよびインパルスにブール演算を施して出力圧縮ランおよびインパルスを生成することによって２分木のすべての葉でないノードを処理し、根ノード処理要素へ入力される圧縮ランおよびインパルスにブール演算を施して合成された符号化ビットストリングまたは生のビットストリングを生成することによって２分木の根ノードを処理するステップを具備する方法を含む。
本発明の他の実施例によれば、上記のおよび他の利益は、複数の入力された符号化ビットストリングまたは生のビットストリングにブール演算を施して合成された符号化ビットストリングまたは生のビットストリングを生成するシステムであって、１対の入力された圧縮ランおよびインパルスにブール演算を施して出力圧縮ランおよびインパルスを生成する手段をその各々が具備する複数の処理要素と、入力された符号化ビットストリングまたは変換された生のビットストリングの対の各々を処理要素の選択された１つにつなぐ第１の処理手段と、処理要素を接続して複数のレベルを有する２分木を形成する第２の処理手段であって、選択された処理要素は２分木の葉ノードであり、選択された処理要素の出力圧縮ランおよびインパルスは葉ノードよりも低い２分木レベルの葉でないノードである中間処理要素へ入力され、中間処理要素の出力圧縮ランおよびインパルスはより低い２分木レベルの他の中間処理要素へ入力され、合成された符号化ビットストリングまたは生のビットストリングは２分木の根ノードである根処理要素によって出力されるものと、選択された処理要素へ入力される符号化ビットストリングまたは変換された生のビットストリングに対するブール演算を開始して出力圧縮ランンおよびインパルスを生成することによって２分木のすべての葉ノードを処理し、ここで出力圧縮ランおよびインパルスは中間処理要素へ入力される圧縮ランおよびインパルスになり、中間処理要素へ入力される符号化ビットストリングまたは変換されたビットストリングに対するブール演算を開始して出力圧縮ランおよびインパルスを生成することによって２分木のすべての葉でないノードを処理し、根処理要素へ入力される圧縮ランおよびインパルスに対するブール演算を開始して合成された符号化ビットストリングまたは生のビットストリングを生成することによって２分木の根ノードを処理する第３の処理手段とを具備するシステムによって達成される。
本発明のさらなる利益および新規な特徴は、以下の記述に一部が述べられ、以下の記述を検討することにより当業者に明らかになり、或いは発明の実施により学ばれるであろう。以下の詳細な記述は、発明の実施のために意図された最良の形態の単なる例として発明の好適な実施例のみを記述している。理解されるように、本発明は他の異なる実施が可能であり、そのいくつかの詳細は本発明から逸脱することなく様々の自明な点において変形が可能である。したがって、図面および記述は全くの例であり限定的ではないとみるべきである。
【図面の簡単な説明】
図１は本発明に従ってブール演算を実行するコンピュータプラットフォームを備えたコンピュータシステムの機能ブロック図である。
図２Ａはエンコーダ／デコーダを含む図１のコンピュータプラットフォームの機能ブロック図である。
図２Ｂは変換器を含む図１のコンピュータプラットフォームの機能ブロック図である。
図３Ａおよび３Ｂは、例として、非圧縮ビットストリングおよび圧縮ビットストリングを描いた図である。
図４は生のビットストリング、符号化ビットストリングおよび圧縮インパルスを描いたフローチャートである。
図５Ａは本発明のデータフローアーキテクチャモデル内単一ノードの図である。
図５Ｂは本発明のデータフローアーキテクチャモデル内ノードの２分木の図である。
図６はデータフローマシンの図である。
図７は４個の入力ビットストリングをもったデータフローマシンの図である。
図８は８個の入力ビットストリングをもったデータフローマシンの図である。
図９は６個の入力ビットストリングを持ったデータフローマシンの一例の図である。
図10は本発明の状態遷移図である。
図11Ａ〜11Ｃは本発明の処理中に使用されるデータ構造の図である。
図12は本発明のソフトウェア設計の呼出しレベルチャートである。
図13はビットベクトルのＮ−ウェイ処理機能の処理ステップのフローチャートである。
図14は入力ビットストリングを処理要素につなぐ処理ステップのフローチャートである。
図15は処理要素ノードの２分木を接続する処理ステップのフローチャートである。
図16はつながれた入力ビットストリングの組を処理するステップのフローチャートである。
図17は処理要素によって実行される処理のステップのフローチャートである。
図18Ａ〜18Ｃは処理要素の処理で使用される処理要素データ構造のフィールドおよび他の動作変数を局所化する処理ステップのフローチャートである。
図19は両方の入力が入力終了状態になるまであるいは出力FIFOが満杯となるまで処理要素によって実行される処理ステップのフローチャートである。
図20Ａ〜20Ｂは演算の準備過程の処理ステップのフローチャートである。
図21は処理要素のＡ側入力を準備するステップのフローチャートである。
図22は処理要素のＢ側入力を準備するステップのフローチャートである。
図23は現在の処理要素のＡ側入力およびＢ側入力のブール「OR」演算を実行するステップのフローチャートである。
図24は処理要素のフィールドに局所変数の内容を再記憶するステップのフローチャートである。
図25は出力ビットストリングを生成するステップのフローチャートである。
図26は出力ビットベクトルを処理するステップのフローチャートである。
好ましい実施態様の詳細な説明
Ｉ．用語集
下記の定義が後に続く記述内容の理解に助けとなる。
「ビットストリング」；２進ビット列（ラン（run）かインパルスかのどちらか）を意味する。
「ビットベクトル」；一連のビット列の符号化形式を意味する。
「ビットユニット」；ビット列の一部の圧縮形式を意味する。
ビットユニットは３つの異った形；ラン、インパルス、エンドオブインプット（end-of-input（EOV））のうちの一つとなる。
「ラン」；同じ２進値（またはジエンダ（gender））が１つまたはそれ以上続くビット列を意味する。
「インパルス」；同一２進値のビット列と反対の２進値を有する終了ビットがその後に続く、同一２進値（あるいはジエンダ）が１個以上続くビット列を意味する。
「特性種別（characteristic type)」；ビットユニットをランかインパルスのいずれかに分類することを示すものを意味する。
「ジエンダ」；ビットユニットの２進値を示すものを意味し、また「極性」として代りに意味される。
「非圧縮形式」；ランかインパルスのいずれかである２進ビットの１次元配列（即ち生のビットストリング）を意味する。
「圧縮形式」；（１）ジエンダ、（２）特性種別、（３）長さおよび（４）エンドオブインプットを示すランまたはインパルスの簡潔な表現を意味する。
「符号化形式」；短縮されたフォーマットで記憶される１個以上続くインパルスを意味する。
II．ハードウェア、ソフトウェアならびにファームウェア実施例
Ａ．コンピュータシステムの説明
図１は本発明に従ってブール演算を実行するコンピュータプラットフォームを備えたコンピュータシステムの機能ブロック図である。コンピュータシステムはプログラマブルプロセッサ２（むしろマイクロプロセッサ）、ディスプレイ２、プロセッサ２へのキーボード入力装置11およびビット列の記憶かバッファリング（buffering）に用いられる外部記憶装置12から構成されている。変換用のハードウェア、ソフトウェアあるいはファームウェアおよびブール演算用のハードウェア、ソフトウェアあるいはファームウェアはプロセッサ２に組込まれたコンピュータプラットフォーム10（仮想線で示される）に収容される。コンピュータプラットフォーム10は、Glaser外による米国特許No．5306457で示されているような、ビットストリングのブール演算の実行に関係する様々な活動を調整する。
一般に、コンピュータプラットフォーム10はプリント回路基板上に組み立てられた汎用プログラマブルコンピュータであり、ここで開示されるような動作を指示するコンピュータプログラムのソフトウェアを備えたパーソナル、ミニおよびメインフレームコンピュータを含むほとんどの標準的なコンピュータシステムの中で、手軽に採用されている。コンピュータプラットフォーム10は集積回路チップ（またはチップセット）上に形成された特定用途コンピュータあるいは、従来の方法かマイクロコードとして読み取られる読み取り専用メモリ（ROM）上に焼き付けられた実行可能コンピュータコードであってもよいことがまた思い描かれる。
Ｂ．コンピュータプラットフォームの説明
図２Ａはエンコーダ／デコーダを含む図１のコンピュータプラットフォームの機能ブロック図である。さらに具体的には、コンピュータプラットフォーム10は、エンコーダ／デコーダ14、バス15と27によりオプショナルなバッファメモリに相互接続されるオプショナルな２次メモリ16（コンピュータプラットフォーム10の外部に置かれる）、すくなくとも１個のブール論理ユニット（BLU）20、標準プロセッサ25およびシステムコーディネータ26から構成されている。ビットベクトルの符号化／復号化、生のビットストリングの変換、ブール演算の処理および構成部分間のデータ転送の調整に用いられるソフトウェアプログラムがコンピュータプラットフォーム10にロードされると、コンピュータプラットフォーム10は起動され処理可の状態になる。
コンピュータプラットフォーム10の特定の構成部分についての詳細な議論がここで示される。外部記憶装置12は、ビットストリング（符号化および生のビットストリングの両方）の永久またはバッファ記憶装置であり、代表的にはハートディスクである。ビットストリングは、リレーショナルデータベースの組織化されたデータ（関係（relations）のような）、外部の通信手段により取得された組織化されていないデータ、あるいはビットの隣り合った連続によって表わされるその他のどのような種類のデータも代表している。
外部記憶装置12の内容はバス13によってコンピュータプラットフォーム10および符号化ビットストリングを１ビットユニット以上（即ち圧縮インパルス）に分離するエンコーダ／デコーダ14にロードされる。インパルスは本明細書の至る所で、逆極性の終了ビットを持つとして述べられているが、この記述は逆極性の開始ビットを持つインパルスにも同等に適用される。また「極性」と「ジエンダ」という用語が交換可として使用されており単に２進値に適用する。４つの異なった符号化フォーマットのうちの１つへ／からビット列を符号化／復号化するためにエンコーダ／デコーダにより実行されるルーチンがGlaser外による米国特許No．5036457に述べられている。
オプショナルな２次メモリ16は将来のブール演算のためのビットユニットを記憶し、プロセッサに含まれるメモリ構成部分かコンピュータプラットフォーム内部に含まれるメモリ構成部分となる。バッファメモリ18はBLU 20で処理する前か処理後２次メモリに記憶する前に一時的にビットユニットを保持するためのもう一つのメモリ領域である。
一組のBLU 20（図２に示されているのはそのうちの１個のみ）は、インテルコーポレーションから市販で入手可能なペンティアム（PENTTIUM）マイクロプロセッサあるいはディジタルエクイップメントコーポレーションから市販で入手可能なアルファ（ALPHA）マイクロプロセッサのようなマイクロプロセッサ上に（図示はされていない）実施例を実現したBLUを利用して複数のビット列のブール演算を実行する。いくつかのあるいは全てのブール演算がハードウェアでもっと効率的に実現される。しかしながらブール演算が主としてソフトウェアで実現されても、１個のBLU 20は、符号化ビットストリングまたは変換された生のビットストリングのブール演算を実行する現在知られている方法よりも記憶、速度などについてもっと効率的にブール演算を実行できる。
合成ビットユニット、即ち、複数のビットユニットのブール演算実行結果がBLU 20により一度決定されると、合成ビットユニットはバス21により、それらが結合されて圧縮インパルスとされるまで合成ビットユニット（ランであってもよい）を一時的に保持する本質的には一対のバッファである標準プロセッサ25に送られる。圧縮インパルスが標準プロセッサ25で形成されると、前記インパルスはバス23により符号化のためにバッファメモリ18に出力される。
システムコーディネータ26はコンピュータプラットフォーム10上のデータ処理を制御する。バスシステムの動作およびコンピュータプラットフォームの構成部分の動作はシステムコーディネータ26のソフトウェアプログラムにより制御される。システムコーディネータ26から出ている図２の点線はいろいろな構成部分を制御することを示している。
図２Ｂは変換器を含む図１のコンピュータプラットフォームの機能ブロック図を示す。この実施例は、エンコーダ／デコーダ14が変換器15に置き換えられている以外は、図２Ａの実施例と同様に機能する。変換器15は、コンピュータプラットフォーム10でさらに処理するために生のビットストリングを圧縮インパルスに変換する。
III．ビットストリングフォーマット
図３Ａと図３Ｂは、例として非圧縮ビットストリングと圧縮ビットストリングを描いたものである。非圧縮ビットストリングが２進ビット値33として、また２進値化された波形33′として図示されている。２進値は本明細書のいたる所で言及されるが、同じ記述が、交換可能で２進値化された波形に適用される。
Ａ．非圧縮フォーマット
示された２種類のビットストリングパターンはラン34またはインパルス35である。これらは前記したように両方とも生のビットストリングである。
Ｂ．圧縮フォーマット
ラン34かインパルス35のような各ビットストリングパターンは圧縮形式でビットストリングを記述している属性５，６，７で表わされる。この圧縮形式は「ビットユニット」として言及される。ビットストリングを非圧縮にする必要なしに、ブール演算が、属性５，６，７を使用して実行される。前記実施例で入力属性は、特性種別rS５；ジエンダgS６；および長さlS７を含む。特性種別rS５「０」か「１」はそのスライス（slice）がそれぞれインパルス35かラン34であることを示している。ジエンダgS６「０」か「１」は終了ビットの前の１個以上連続するビットのジエンダを確認する。長さlS７はビット列に存在するビット数を示す。図３の例はインパルス、即ちrS＝０、「１」のジエンダを持った連続したビット即ちgS＝１、15ビットの長さをもった、即ちlS＝５を示している。
前記実施例は圧縮フォーマット専用で動作するが、本発明は以下のように圧縮することにより生の非圧縮ビットストリングに拡張される。同じジエンダの１個以上連続するビット、即ちラン34をメモリ（図示されていない）に順次読み取り、ラン34と逆のジエンダの１個のビット、即ち終了ビットが読み取られるまで前記連続ビットを計数することにより、それぞれの非圧縮ビットストリング33に対して、各ビットユニット34，35が形成される。ビットストリングの各インパルスが非圧縮から圧縮形式に変換されるように属性５，６，７は作られる。ビット列がインパルス35であり、同じく前記インパルスに対する適切なジエンダがジエンダgS６でありまたビットカウントが長さlS７であることを示すために特性種別rS５に「０」が記憶される。ブール演算が完了したあと、合成ビットユニットはオプショナルに圧縮されていない生のビットストリング33にもどって変換される。
一般に、一対の入力ビットベクトルはスライスＡとＢを形成し、特性種別rAとrB、ジエンダgAとgBおよび長さlAとlBでそれぞれ構成されており、ここで長さはインパルスの長さであり、また特性種別rAとrBは以下の等式から決定される；
rA＝（lA＜lB）            （１）
rB＝（lA＜lB）            （２）
ここにlAとlBは前記で定義された長さである。スライスＡとＢの短い方がランとして、長い方がインパルス35としてそれぞれ処理されるべきであることを示すために等式（１）と（２）は［０］か「１」のいずれかに戻り、その戻った値を特性種別rAとrBとして記憶する。長さが等しいことは両方のビットスライスが同じ長さのインパルスであることを示すブール条件〜rA＆〜rBによって表わされる。
Ｃ．ビットストリングフォーマット間の関係
図４は生のビットストリング、符号化ビットストリングおよび圧縮インパルス（即ちビットユニット）の間の関係を描いたフローチャートである。生のビットストリング（ブロック120）はビットストリング変換器手段121、むしろプロセッサ２によって圧縮インパルス（ブロック122）に変換される。符号化ビットストリング（ブロック123）は復号器手段124、むしろエンコーダ／デコーダ14によって圧縮インパルス（ブロック122）に復号化される。
ブールOR演算125は合成圧縮インパルス（ブロック126）を形成するために複数の圧縮インパルス（ブロック122）について本発明に従って実行される。オプショナルとして、合成圧縮インパルス（ブロック126）はエンコーダ手段127、むしろエンコーダ／デコーダ14によって符号化ビットストリング（ブロック128）に翻訳される。
本発明のデータフローアーキテクチャモデル（以下でさらに述べられる）は、圧縮インパルス122が消費されそして合成圧縮インパルス126が、ブール「OR」演算125を実行する処理要素の２分木配置内に作られる本過程を一般化したものである。データフローアーキテクチャモデルの根ノードはエンコーダ127を使用するノードのみである。データフローアーキテクチャモデルの葉ノードはデコーダ手段124か変換器手段121に必要なノードのみである。データアーキテクチャモデルの内部あるいは中間のノードは圧縮ビットユニットの先入れ先出しバッファ（FIFOs）を使用して通信する。
IV．データフローアーキテクチャモデル
本発明の内部コンピュータ構成はデータフローアーキテクチャに基づいている。データフローは、その機能に必要なデータの有用性によってその機能が決定されるアルゴリズムあるいはマシン（machine）に関係する一般用語である。データフローアルゴリズムは、円弧がデータパスであり、またノードが、入ってくる円弧に到達したデータトークン（data tokens）について実行されるべき演算であるような有向（directed）グラフとして表わされる。
Ａ．処理要素
図５Ａは本発明のデータフローアーキテクチャモデル内単一ノードの図である。本発明のノードは処理要素（PE）200と呼ばれる。各PEは２個の入力ビットユニットを受け取り１個の出力ビットユニットを作り出す。本発明のより好ましい実施例では、PEは出力を作り出すために２つの入力のブール「OR」演算を実行するが、他のブール演算あるいは他の処理もまた実行されてもよい。各データフローアーキテクチャモデルの各PEは前記したようにBLUである。入力ビットユニットはＡ202およびＢ204と名づけられ、また出力ビットユニットはＣ206と名づけられる。出力Ｃは先入れ先出し（FIFO）列（示されていない）に記憶される。入力Ａ202とＢ204は２個の入カビットストリングかあるいは２個の他のPEからの出力である複数のビットユニットを含んでいる２個のFIFOバッファのいずれかである。
図５Ｂは本発明のデータフローアーキテクチャモデル内ノードの２分木の図である。示された例では、各PEはPEのネットワークで番号を付された過程となっている。ネットワークは多くの入力ビットストリングから１個の出力ビットストリングを作り出す２分木として構成されている。２分木は、その木の最高レベルで葉ノードを、最低レベルで根ノードを伴う複合レベルを有する。処理要素（PE）１ 208はPE１に接続された入力ビットストリングＡ１ 220とＢ１ 212を読み取り、ビットユニットＣ１ 214出力ストリーム（stream）を作り出す。出力ビットユニットＣ214はFIFO（示されていない）に記憶されそしてPE５ 218によってＡ５ 216入力として読みとられる。処理要素２ 220はPE２に接続された入力ビットストリングＡ２ 222とＢ２ 224を読み取り、ビットユニットＣ２ 226の出力ストリームを作り出す。出力ビットユニットＣ２ 226は、最初のFIFOとは異ったFIFO（これもまた示されていない）に記憶され、PE５ 218によってＢ５ 228入力として読み取られる。ビットユニットＣ５ 230の出力ストリームを作り出すためにＡ５ 216とＢ５ 228により供給される入力FIFOをPE５は読み取る。合成出力ビットストリングＣ７ 232が根ノードPE７ 234で生成されるまで、他のPEは同じように入力ビットストリングと出力FIFOに接続される。
番号を付された各過程は同時に生じる。PEの入力FIFOは、そのPEへの入力データを含んでいるので、PEはその出力FIFOに記憶されるべき出力データを作り出すために、入力データの処理を実行する。PEの演算に対する唯一の妨害は入力FIFOのうちのどれか１つが中に何も入っていない時である。ソフトウェアで実行される一つの実施例では、PEが順を追ったやり方で処理され、この最小限の方法が、入力FIFOが空にされる前に出力FIFOが満杯になることを保証しているため、このことは決して起らない。前記最小限の方法を使用すると、結果は常に２つの入力の長さの短い方になることが保証される。このように、一つの入力が短い方の長さのビットストリングの全てを有する場合でさえも、この入力FIFOは出力FIFOが満たされると同時に空にされる。まず葉ノードが、入力ビットストリングが空になるまで、あるいは出力FIFOが満たされるまで、処理される。それからすべての内部ノードが２分木のレベルごとに処理され、それによって、その木の次のレベルへの入力である出力FIFOsをいっぱいに満たす。この処理は２分木の根ノードが処理される、即ちデータが現われるまで続く。
Ｂ．データフローアーキテクチャの例
図６は本発明のデータフローアーキテクチャモデルに従うデータフローマシンの図である。データフローマシン250は複数の入力ビットストリングＶ１ 252，Ｖ２ 254，Ｖ３ 256，…ＶＮ 258を受取り、出力ビットストリングＶ０ 260を作り出す。変換された生のビットストリングか符号化ビットストリングのいずれかから圧縮インパルスを作り出すどのような情報源からの入力でいい。データフローマシンは、従来の方法のように入力ビットストリングの組を繰り返し結合しなければならないということ無しに、出力ビットストリングを作り出す。好ましい実施例では、入力ビットストリングのどのような数「Ｎ」も、データフローマシンの入力であり、合成出力ビットストリングが作り出される。
図７は４個の入力ビットストリングをもったデータフローマシンの一例の図である。この簡単な例では、入力ビットストリングＶ５ 262とＶ６ 264はPE８ 266への入力であり、また入力ビットストリングＶ７ 268とＶ８ 270はPE９ 272への入力である。PE８ 266とPE９ 272の出力はPE10 274への入力である。PE10 274は合成出力ビットストリングＶ９ 276を作り出す。処理要素PE８ 266とPE９ 272は葉ノードであり、またPE10 274は根ノードである。この例は、４個の入力ビットストリング、２つのレベル、および３個の処理要素を持った２分木を示している。どのＮ入力ビットストリングに対してもＮ−１ノードがあり、２分木はｉレベルを有し、ここで２**ｉ−１はその木の中のノード数に等しいということに注意すること。
図８は８個の入力ビットストリングをもったデータフローマシンの一例の図である。この例で入力ビットストリングＶ10 300とＶ11 312はPE11 314への入力であり、入力ビットストリングＶ12 316とＶ13 318はPE12 320への入力、入力ビットストリングＶ14 322とＶ15 324はPE13 326への入力そして入力ビットストリングＶ16 328とＶ17 330はPE14 332への入力である。処理要素PE11 314，PE12 320，PE13 326およびPE14 332は２分木の葉ノードである。PE11 314の出力はFIFO Ｆ１ 334に記憶され、またPE12 320の出力はFIFO Ｆ２ 336に記憶される。FIFO Ｆ１ 334とFIFO Ｆ２ 336のデータはPE15 338への入力となる。同様にPE13 326の出力はFIFO Ｆ３ 340に記憶されまたPE14 332の出力はFIFO Ｆ４ 342に記憶される。FIFO Ｆ３ 340とFIFO Ｆ４ 342のデータはPE16 344への入力となる。PE15 338とPE16 344は２分木の中間あるいは内部ノードである。PE15 338の出力データはFIFO Ｆ５ 346に記憶されまたPE16 344の出力データはFIFO Ｆ６ 348に記憶される。これらのFIFOはPE17 350にデータを供給する。PE17は２分木の根ノードである。PE17 350はFIFO Ｆ７ 352にデータを出力する。出力ビットストリングＶ18 354を作るためにデータがFIFO Ｆ７ 352から取り出される。
図９は６個の入力ビットストリングを持ったデータフローマシンの一例の図である。この例では、入力ビットストリングの数は２の累乗ではない。前の例の様に、入カストリングＶ18 370とＶ19 372、およびＶ20 374とＶ21 376はそれぞれPE18 378およびPE19 380にどのように接続されるか注意すること。入力ビットストリングＶ22 382とＶ23 384はPE20 386に接続される。PE20の出力はFIFO Ｆ10 388を通ってPE22 390に結合される。PE18 378とPE19 380からのデータは図に示されているようにPE21 392を通ってPE22 390に流れ込む。PE22 390の出力は出力ビットストリングＶ24 396として生成するまえにFIFO Ｆ12 394に記憶される。
Ｃ．データフローアーキテクチャの利点ならびに設計上考慮すべき事項
１個の出力ビットベクトルを作り出すために多くの入力ビットベクトルを処理するデータフローアーキテクチャモデルの使用は、多くの重要な利点を与えるものである。
第一に、ビットベクトルの生成処理を減らし、より高速の演算となる。以前のシステムは中間処理結果を表わすために一時的なビットストリングを生成していた。従って、これらの一時的なビットストリングの記憶の繰返される割り付け（allocation）と、それに続く割り付け解除（deallocation）が必要とされた。これに比べ、本発明は、中間結果が一時的なビットストリングとして出現しないように、あらかじめ決められたメモリ常駐（memory-resident）のFIFOに中間結果をバッファ（buffer）する。
データフローアーキテクチャモデルは、入力ビットストリングの数があらかじめ決められた最大入力数を超える場合に（例えば256個の葉ノードをもった２分木の好ましい実施例として512）一時的なビットストリングを作り出すだけである。512個の入力ビットストリングの各グループはデータフローマシンによって処理されるので、中間結果を保持するために新しい一時的なビットストリングが作り出される。データフローマシンは、すべての入力ビットストリングが処理されるまでこのようにして演算を継続する。そしてそれは、合成出力ビットストリングを作り出すために一時的な中間ビットストリングの結果を集めたものに再びデータフローマシンを通過させる。従ってデータフローモデルは十分に少ない一時的なビットストリングを作り出し、そのため記憶の要求条件は最小となり割り付け／割り付け解除のオーバーヘッド（overhead）は最小化される。
従来のシステムでは多くの入力ビットストリングを含むビットストリング演算を実行するためにメモリ１メガバイト（MB）の分類バッファが割り付けられていた。多くの入力ビットストリングの演算の大多数を扱うためにデータフローマシンを使用することによって、残りの演算に必要な分類バッファの大きさはメモリ512キロバイト（KB）に低減され、実行効果を下げることなく、FIFOにメモリ512KBを供給する。
本発明は、一時的な中間ビットストリングを記憶するのに必要なディスク入力／出力（Ｉ／Ｏ）動作をほとんど取り除く。一般的に割り付けられたディスクの記憶が一時的な中間ビットストリングの記憶に対する要求を満足しない場合は、外部記憶装置のファイルがその記憶を提供するために拡張される。この拡張はディスクＩ／Ｏ動作如何による。より少ない一時的な中間ビットストリングが必要とされるので、より少ないディスクＩ／Ｏ動作が実行される。
高度に最適化された汎用分類（sorting）アルゴリズム（シエルソート（shell sort）のような）よりも良い、クエリー（query）全体の性能が、ビットストリングの本質的な特性を活用することにより本発明では可能となっている。ほとんどの汎用分類方法は次のような一般的な方法を２つの段階で使用している；１）分類されるファイルに最初のパス（pass）を作り、内部メモリ資源の大きさに関してそれをブロックに分け（スキャン（scan）段階）それからこれらのブロックをメモリ内に分類しそしてディスクにそれらを戻して書き込む；２）さらに数個のパスをファイルに作ることにより分類されたブロックを併合し（merge）、連続的により大きな分類ブロックを作り出していく（併合段階）。
同様の方法が従来のシステムでも使用されていた。まず入力ビットストリングがスキャンされ、それらの内容が分類バッファ内に整数として記憶された。分類バッファは、それが満たされる前に多くの入力ビットストリングがスキャンされるように１MBの大きさであった。分類バッファが満たされると、前記整数値はシエルソートアルゴリズムを使用して分類される。結果の分類表から、中間ビットストリングの結果が作り出された。これらのステップは前記スキャン段階と同等である。すべての入力ビットストリングに関してスキャン段階が完了した後、併合段階が、最終結果のビットストリングが作り出されるまで、組式（pair-wise）ブール演算を行うことにより、中間ビットストリングの結果に関して実行された。
十分に大きな分類バッファで（我々の例では１MB）、このスキャンおよび併合方法は作り出される中間ビットストリングの数を最小にした。アルゴリズムの複雑さがＯ（n log n）であるので、ここでｎは分類バッファ内の要素（element）の数であるが、分類バッファを１MBを超えて大きくすることによりさらに実行の機能を高めることは可能とならなかった。１MBを超えるバッファの大きさに対してｎが増加すると、シエルソートアルゴリズムは比例して実行がより長くかかり（n log n）、より少ない中間ビットストリングに併合することにより得られる節約を相殺し、最終的には実行を制限するようになる。ｎが増加した時、シエルソートアルゴリズムが遅くならなければ、その時は任意に大きな分類バッファが使用され、中間ビットストリングが作り出される必要もない。即ち併合時間はスキャン時間とトレードオフ（trade off）される。分類バッファの大きさ（スキャン段階）と中間ビットストリングの結果を併合するコスト（併合段階）との間で最良のバランスを決定することにより、最適な実行が得られる。
しかしながら、ビットストリングの一つの本質的な特性は、ビットストリングは本来分類されているということである（例えばビット１はビット５に先行し、ビット５はビット８に先行する）。従って入力値の分類はスキャン段階で不要であり、Ｏ（n log n）よりも良く動作する、高度に効率的な併合段階の方法が考案されれば、全く削除されてもよい。
本発明はデータフローアーキテクチャでスキャンおよび併合の方法を使用している。データフローマシンは、中間ビットストリングの結果をバッファするFIFOを使用することにより、それによって確実な分類動作を実行するコストを回避して、入力ビットストリングをスキャンし、また本来的に分類されたビットストリングの併合を編成する。この方法は、与えられたメモリ量について（分類バッファ対FIFO）、従来の方法よりも、測定可能なほどの良い性能となる。
本発明の好ましい実施例はGlaser外による米国特許No．5036457号で開示されているような「最小」法を使用しており、その開示内容の全体を参照してここへ組入れられる。最小法は２つのインパルスのうち最短のものを処理要素（PE）に渡す。この方法で、各PEが実行するサイクル数はＡおよびＢの入力ビットストリング内のインパルス数の合計に等しい。データフローマシンによって処理されるビットストリングの経路長は２分木構成を使用することにより最小となる。データフローマシンを通る１つのビットストリングの経路長は、それが到来するPEの数に等しい。データフローマシンはPEノードの２分木で構成されているので、どの葉ノードから根ノードに至る経路長も常に固定値となる。例えば、16個の葉ノードをもった２分木は、５レベルと５の経路長を有する。
組式に連続的に結合されるPEノードの直線状配置のふるまいは本発明の２分木データ構造と同じく予測できない。とくに根ノードから最も遠く移動させられた大多数のインパルスをもった、即ち最長経路長を持ったビットストリングの時がそうである。データフローマシンに関してのように、各PEのサイクル数は同じに計算されるが、直線状配置については、PEへの２つの入力のうちの１つが前のPEからの出力となる。その後に続くPEのサイクル数は、その前のPEのサイクル数によって効果的に合成される。最も少ないインパルスから最も多いインパルスまでの入力の分類はこの計算上の問題を緩和するのを助けるが、最低限に有益であることを証明している。この直線状のアプローチの性能は16個の入力を有する最大16個のノードで最高となるが、これに対して本発明のデータフローマシンは少なくとも同時に512個のビットストリングを処理する。
全体の性能利得が、データフローアーキテクチャの本来の特性を活用することにより本発明でまた得られる。データフローマシンの好ましい実施例は最小法を使用しているので、入力FIFOが空になる前に出力FIFOが満杯になることは確かである。それ故に空の入力FIFOに対する試験は必要とされない。
PEへの入力のうちの１つが「エンドオブインプット」（EOV）状態に達すると（すべてのビットユニットが処理されたことを意味している）、他の入力が出力ビットユニットとして修正されないで単にそのPEに渡される。本発明は、出力経路Ｃに、渡されるべき入力データをあらかじめロードし、そしてPEによるさらに続くどの独立した処理も迂回することにより、この特性を利用する。この最適化は入力を「分路（shunting）」と呼ばれる。データフローマシンは、不必要な処理ステップを避けるためにPEのプログラムで特性の処理径路を築くことによって、PEの連続的な演算サイクルに他の入力ビットユニットを渡し続ける。
本発明の好ましい実施例でのPEは入力データのブール「OR」演算のみを処理する。この事実のために、出力Ｃを組立てる際にある条件に基づくことができる。Ｃのランおよびジエンダは、他の演算数がジエンダのものでない限り、短い方の入力演算数のランおよびジエンダに等しく、この場合ランビットは１およびジエンダビットは１である。このことは結果Ｃの組み立てを簡単にしている。
ブール「OR」演算のみが実行されるので、PEを通りぬけるビットユニットは通常インパルスである。通常インパルスであるビットユニットを図１の標準プロセッサ25を使用して結合しようと試みることは結合が不能か、必要でないのでPEサイクルを浪費し、従ってデータフローマシンの性能上のボトルネックとして働く。性能を改善するために、根PEのFIFOが出力ビットストリングを作り出すために読み取られるまで、ビットユニットの結合が遅らせられる。
Ｖ．処理アーキテクチャ
図１のシステムで使用されるコンピュータプログラムおよび本発明に基づいて複数のビットストリングにブール「OR」演算を実行するためのコンピュータプログラムによって作り出される過程の構成が図10〜26の図に示される。
一般に、データフロー処理は次のように進行する。データ構造が初期化されたあと、２分木のすべての葉ノードが処理される。この処理はＡ or Ｂフラグ（AoB）と呼ばれるブールフラグを使用する。AoBフラグは、PEに接続されている現在の入力ビットストリングがＡ側入力かＢ側入力のどちらかを示すために切替えられまたは切り戻される。葉ノードの処理は２つの入力ごとのPEの創出を含んでいる。ソフトウェアの実行では、PEの創出はPEにデータ構造を例示（instantiate）することによって達成される。葉ノードの次の処理は、入力ビットストリングの識別子をAoBでなければ現在のPEのＡ側に、AoBならば現在のPEのＢ側に設定することにより、入力ビットストリングをPEに結びつけることを含んでいる。AoBフラグはそれから各入力の結合のあと切替えられる。この処理はすべての葉ノードに対して実行される。
入力ビットストリングの奇数があると、最後の入力ビットストリングが処理されたのち、最後の葉PEのＡ側VIDは、Ａ or Ｂが真（true）ならこのPEから切り離される。２分木の残りのノードがそれから接続される。接続は、図５Ｂのように２分木を形成するために内部PEの入力FIFOとして各出力FIFOを連結することにより行われる。各PEはＡおよびＢ入力ビットユニットを読み取ることにより処理され、入力データのブール「OR」演算を実行し、そしてＣビットユニットキュー（queue）があふれるまで、あるいはPEが入力終了の状態になるまで、Ｃビットユニットキューに出力データを記憶する。２分木の根PEのＣビットユニットキューを読み取り、出力ビットストリングを書き込むことによって、合成ビットストリングが作り出される。出力終了状態が根PEに到達した時に「終了（done）」状態が呼出しプログラムに返される。
図10は本発明の状態遷移図である。スタート状態400のあとに、弧404を経由してＡをつなぐ状態402にデータフローマシンは移る。Ａをつなぐ状態にある間、データフローマシンは「Ａ」側入力をPEにつなぐ。さらに入力ビットストリングが利用可能なら、入力ありの弧406がデータフローマシンをＢをつなぐ状態408に移す。Ｂをつなぐ状態にある間、データフローマシンは「Ｂ」側入力をPEにつなぐ。さらに入力ビットストリングがまだ利用可能なら、インプットありの弧410がＡをつなぐ状態402に戻って続けられる。Ａをつなぐ状態402の間、もはや入力ビットストリングが利用可能でない場合には、データフローマシンは入力なしの弧414を経由して切り離し状態412に移る。それからデータフローマシンはつながれていた奇数番号を付された入力ビットストリングをPEから切り離す。さらに進んだ処理が弧418を経由して木の接続状態416で続く。Ｂをつなぐ状態408の間、もはや入力ビットストリングが利用可能でないかあるいは２分木の葉の数があらかじめ決められた最大値よりも大きければ、データフローマシンは入力なし0r#Leaf＞Leafmaxの弧420を経由して木の接続状態416に移る。
木の接続状態416の間、データフローマシンはすべてのPEを２分木構成に接続する。弧422を経由してPEの処理状態424で処理が続く。この状態の間、データフローマシンは選択されたPEを処理する。処理されるPEの数が、PEのあらかじめ決められた最大値よりも少ない場合は、PE＜＝PEMAXの弧426はPEの処理状態424に戻って続けられる。２分木のすべてのPEが処理された場合、PE＞PEMAXの弧428が出力の生成状態430に続けられる。出力の生成状態430で、データフローマシンはPEの２分木から出力ビットストリングを生成する。出力終了が根PEに届けられていなければ、データフローマシンは継続の弧432を経由してPEの処理状態424に戻って移る。そうでなければ、データフローマシンは弧436を経由して終了状態434に移る。
図11Ａ〜11Ｃは本発明の処理中に使用されるデータ構造の図である。図11Ａは処理要素（PE）444の構成要素を示している。PEは本発明で使用される主要データ構造である。PEはコンピュータのハードウェアあるいはソフトウェアのいずれでも実行されることに注意のこと。コンピュータハードウェアとして実行される場合、データ構造あるいはポインタは使用されない。コンピュータソフトウェアとして実行される場合、PEはデータ構造とポインタで表わされる。以下は、コンピュータソフトウェアで実行されるPEの議論である。PE 444は与えられた入力ビットストリングの組に関するデータフローアーキテクチャモデルの中でそれぞれ論理PEとして生成されるかあるいは具体例をあげて示される。PE 444は、Ａ VID 446ベクトル識別子（ID）、Ｂ VID 448ベクトルID、第１のビットユニットキューへのポインタＡ FIFO 450、第２のビットユニットキューへのポインタＢ FIFO 452、ビットユニットＡ454とＢ456、ビットユニットキューＣ456およびエンドオブベクトル（EOV）カウンタで構成されている。EOVカウンタは入力終了状態がビットユニットに届けられた時を示す。Ａ VID 446とＢ VID 448のフィールド（field）は、図５Ａに示されるPEモデルの入力Ａ202と入力Ｂ204それぞれに対する処理のきっかけを識別しかつ提供する。ＡおよびＢ入力は葉ノードのビットユニットかあるいは、内部または中間ノードのビットユニットキューのどちらかである。ビットユニットとビットユニットキューは図11Ｂと図11Ｃにそれぞれ記述されている。ある特定のPEへのビットストリング入力が２分木への入力ビットストリングならば（即ちこのPEは葉ノードである）、ビットユニットＡ454とＢ456はPEへの入力を意味する。ある特定のPEへのビットストリング入力が他のPEからの出力ならば（即ちこのPEは葉ノードではない）、Ａ FIFO 450とＢ FIFO 452によって参照されるビットユニットキューはPEへの入力を意味する。Ａ側とＢ側のビットユニットキューは２分木で「高位の（higher）」PEにより生成される。ビットユニットキューＣ458は図５Ａに示されるようにPEモデルの出力経路Ｃ206を意味する。EOVの値460はPEの入力ビットストリングが入力FIFOsで入力データの終了を意味する。
ビットユニット462の要素が図11Ｂに示される。Ｖブールフラッグ464は入力終了状態を示す。Ｖ464がオンなら、ビットユニットストリームは入力終了状態にあり、そうでなければ、ビットユニットは入力終了状態にない。入力終了状態にある場合は、もはや入力データはPEで利用可能ではない。Ｒブールフラッグ466は現在のビットユニットがランかインパルスかのどちらであるかを示す。Ｒがオンなら、ビットユニットはランであり、そうでなければビットユニットはインパルスである。Ｇブールフラッグ468は現在のビットユニットのジエンダを示す。Ｇ468がオンならビットユニットのジエンダは１であり、そうでなければビットユニットのジエンダは０である。長さのフィールド（LEN）470は32ビットか64ビットいずれかのように符号のつかない整数値でビットユニットの長さを指定する。
ビットユニットキュー472の構成要素が図11Ｃに示されている。ソフトウェアで実行される場合、環状バッファ構成要素472は先入れ先出し（FIFO）の方法でアクセスされるビットユニットのリストである。FIFOのビットユニット数はあらかじめ決められた最大値に設定される（即ち、FIFOの大きさが知られている）。先頭（head）フィールド476はFIFOの先頭エレメント（element）の指標である。末尾（tail）フィールド478はFIFOの末尾エレメントの指標である。カウント（count）フィールド480は現在FIFOにあるビットユニットエレメントの数である。
図10の木の接続状態416にある間、データフローマシンは以下のようにPEのデータ構造を初期化する。各PEが２分木のノードに割り当てられると、Ａ FIFO 450とＢ FIFO 452の指標は０に設定され、Ａ454，Ｂ456およびＣ458は空いており、そしてEOV 460は偽（false）に設定される。
図12は本発明のソフトウェア設計の呼び出しレベルチャートである。本発明のソフトウェア実施例は、他のプログラム言語が使用されても良いが、図１のプロセッサ２で実行される「Ｃ」言語プログラムとして実現されている。好ましい実施例では、この設計は全体のシステム性能を上げるためにコンピュータハードウェアで実現される。図12はこのプログラムの主要動作を示している。データフローマシンが作り出されそしてビットベクトルのＮ−ウェイセットの処理500の機能を呼び出すことにより処理が達成される。この実施例で、ビットストリングはビットベクトルとして表わされる。ビットベクトルは連続したビットストリングの符号化形式であることを思い出すこと。この機能は図示されているように他の処理を呼び出す。図12に示されたそれぞれの処理は図13〜26で以下に議論される。出力ビットベクトルの処理502の過程は、ビットベクトルのＮ−ウェイセットの処理500の機能を再帰的（recursively）に呼び出す。
図13はビットベクトルのＮ−ウェイ処理の機能に関する処理ステップのフローチャートである。この機能は与えられた入力ビットベクトルの組についてブール「OR」演算を実行し、合成出力ビットベクトルを戻す。エントリー（entry）600ののち、入力ビットベクトルのPEへのつなぎ602の過程が呼び出され入力ビットセットの組を処理要素（PE）に接続する。この過程は図14に関して以下にさらに詳細に述べられる。一つのデータフローマシンで処理される入力ビットストリングの数は実行の仕方に依存する。好ましい実施例ではデータフローマシンで処理される入力ビットベクトルの数は512であるが、図１のプロセッサ２の処理能力とメモリ能力に依って他の限界値が設定されてもよい。本発明は、どの入力が現在のPEに接続されているか（即ちＡ側かＢ側のいずれか）を追跡し続けるためにＡ or Ｂフラグ（AoB）と呼ばれるブールフラグを使用する。AoBフラグは処理が進むに従って切替えられる。すべての入力ビットベクトルが葉ノードにつながれたあと、AoBフラグがオン（真）なら、データフローマシンには奇数個の入力ビットベクトルがあったことになる。余分な入力ビットベクトルは他の入力ビットベクトルとは別に処理されなければならない。従ってテストステップ604でＡ or Ｂフラグ（AoB）が、それが真である−入力ビットベクトルが最後のPEで唯一つの入力であることを示している−かどうかを確認するために点検される。Ａ or Ｂフラグが真に設定されていれば、YESの経路606がステップ608まで取られ、ここでＡ側入力ベクトルが最後のPEから切り離され、それからステップ610に至りここで入力ビットベクトルは将来の処理のために一時的なデータ構造にセーブ（save）される。
Ａ or Ｂフラグが設定されなければ、このデータフローマシンには偶数個の入力ビットベクトルがあることになる。従ってNOの経路612がステップ614まで取られる。このステップでデータフローマシンの２分木は、すべてのPEノードを２分木形式で一緒に連結することにより接続される。この過程は図15に関して以下にさらに詳細に述べられる。次に、ステップ616でつながれた入力ビットベクトルが、入力ビットベクトルから入力データを読みとりデータフローマシンでデータを「プッシング（pushing）」することにより処理される。この過程は図16に関してさらに詳細に述べられる。現在のクエリーの一部としてテストステップ618で入力があれば、YESの経路620がステップ602まで戻して取られ、ここでインプットビットベクトルがさらに再初期化されたPEの組に接続され、それによって、一つのデータフローマシンによって処理されることのできる入力ビットベクトルのあらかじめ決められた最大値よりもさらに多くを必要とするクエリーを処理する。もしそうでなければNOの経路622がステップ502まで取られ、そこでデータフローマシンからの出力ベクトルが、合成ビットベクトルを作るために処理される。この過程は図26に関してさらに詳細に以下に述べられる。処理は出口（Exit）626で終了する。
図14は入力ビットベクトルをPEにつなぐ処理ステップのフローチャートである。エントリー628のあと、AoBフラグが真に設定されそしてカウント（Count）と呼ばれるカウンタがステップ630で０に設定される。カウントはデータフローマシンの葉PEの数を表している。AoBフラグはPEのＡ側かＢ側を示す。ステップ632で、次の入力ビットベクトル（最初に第１番目のビットベクトル）のベクトルID（VID）が現在の入力データの組から得られる。「排他的論理和（XOR）」は、AoBの値を切替える他の入力として１とAoBで実行される。そしてテストステップ636でAoBフラグが偽（０）なら、NOの経路638がステップ640まで取られる。このステップで、カウントはデータフローマシンで付加されたPEに進むためにインクリメント（increment）される。次に、ステップ642で処理されつつある現在の入力ビットベクトルのVIDは、現在のPEのＡ側入力のVID（Ａ VID 446）を現在の入力ビットベクトルに設定することにより、この現在のPE（PEの配列のカウント変数により選択される）のＡ側につながれる。テストステップ644で処理が続く。入力ビットベクトルがまだなお処理されるなら、YESの経路が、その次の入力ビットベクトルのVIDを得るために、図に示されているようにステップ632まで戻って取られる。
テストステップ636でAoBフラグが真なら、YESの経路648がステップ650まで取られる。これはＢ側入力ビットベクトルがその時つながれるべきであることを意味している。ステップ650で処理されつつある現在の入力ビットベクトルのVIDは、現在PEのＢ側入力のVID（Ｂ VID 448）を現在の入力ビットベクトルのVIDに設定することにより、このPE（PEの配列のカウント変数により選択される）のＢ側入力につながれる。二つの入力ビットベクトルがこの時現在のPEに接続される。テストステップ652で葉PEの最大値が達せられたかを確認するために点検がなされる。最大値が達せられていれば、YESの経路654が取られこの過程は出口656で終わる。AoBフラグとカウントは呼び出し過程に戻される。カウントは２分木構造の葉ノードの数を保持する。葉PEの最大値が達成されていなければ、NOの経路658が、入力ビットベクトルがさらに処理される必要があるかどうかを確認するために、テストステップ644まで取られる。処理する入力ビットベクトルがもうなければ、NOの経路660が出口656まで取られる。そうでなければ、追加の入力ビットベクトルの処理がステップ632で続く。
図15はPEノードの２分木を接続する処理ステップのフローチャートである。エントリー662で、リミット（Limit）変数が、ステップ664の間カウント変数に記憶されたPEの数の２倍に設定される。リミットは１プラス２分木のPEの総数である。データフローマシンの２分木を表わすPEデータ構造はまず初期化されなければならない。ステップ666で、ループカウンタＩが１に設定される。次に、ステップ668で、Ｉにより選択された現在のPEデータ構造のフィールドが、必要な場合、０と偽に設定することにより初期化される（Ａ VIDとB VIDフィールドを除いて、葉リーフのＡ VIDとＢ VIDフィールドが図14で述べられた入力ビットベクトルのPEへのつなぎの過程に設定される）。ループカウンタＩがステップ670でインクリメントされる。テストステップ672で、Ｉがリミットより小さければ、YESの経路674が次のPEを初期化するためにステップ668まで取られる。そうでなければ、すべてのPEが初期化されていれば、NOの経路676が２分木の内部ノードの初期化のためにステップ678まで取られる。このステップで動作変数Ｎは１に設定され、第１のPEに示す。ステップ680で、ループカウンタＩがカウントプラス１に設定される。ループカウンタＩはその時２分木の第１の内部（即ち葉でない）ノードを示す。ステップ682で、第１の内部ノードが第１の葉ノードの出力に設定される。Ｉによって選択されたPEのＡ FIFO 450をＮによって選択されたPEのＣ458フィールドに設定することにより、これは達成される。動作変数Ｎはステップ684でインクリメントされる。動作変数Ｎはこの時第２の葉ノードを参照する。次に、ステップ686で、第１の内部ノードのＢ側入力が第２の葉ノードの出力に設定される。これは、Ｉにより選択されたPEのＢ FIFO 452を、Ｎにより選択されたPEのＣ458フィールドに設定することにより達成される。ステップ688でＩは次の内部ノードに示すためにインクリメントされる。テストステップ690で、Ｉがリミットより小さいかを確認するために点検が行われる。即ち、２分木のすべての内部ノードが処理されているかどうか確認される。Ｉがリミットより小さいなら、YESの経路が、２分木の次の内部ノードを接続するために、ステップ682まで取られる。このようにしてすべての内部ノードがデータフローマシンを表わす２分木を形成するように接続される。その木の根ノードが初期化されている時は、NOの経路694が出口696まで取られる。
図16はつながれた入力ビットベクトルの組を処理するステップのフローチャートである。エントリー700のあと、出力ビットベクトルはステップ702で初期化される。出力ビットベクトルは根ノードのFIFOからの出力データを記憶する。次にPEの処理704がデータフローアプローチを利用して２分木に結びつけられたビットベクトルを処理するために呼び出される。この過程は図17に関して以下でさらに詳細に述べられる。２分木が処理されたあと、出力ビットベクトルが、出力ビットベクトルの生成706の過程を呼び出すことにより生成される。この過程は図25に関して以下でさらに詳細に述べられる。テストステップ708で、出力データ終了が達せられていないなら、Ｃ FIFO 458はまだ入力終了状態（EOV Ｃ）ではない。従って、NOの経路710がさらに続くPEを処理するためにステップ704まで戻して取られる。EOV Ｃの状態が達せられたら、YESの経路712がステップ714まで取られる。このステップで、出力ビットベクトルは閉鎖され、このことは２分木の根ノードによりこれ以上の書き込みが止められることを意味している。ステップ716で、入力ビットベクトルは閉鎖され、これ以上の入力データが処理されるのを中止する。それから処理はステップ718で終る。
図17はPEを処理するステップのフローチャートである。エントリー720のあと、指標Ｉはステップ722で１に設定される。これは、その木の第１の葉PEでPEの処理を開始させる。ステップ724で、処理されるべき現在のPEのポインタが１に指定されてPEに設定される。次に、テストステップ726で、PEのEOVフラグ420を問合わせることによりPEがEOV状態（即ちこのPEにこれ以上の入力がない）かを確認するために点検が行われる。このPEがEOV状態にあれば、YESの経路730がステップ732まで取られ、ここで指標Ｉはインクリメントされる。このPEがEOV状態になければ、NOの経路734がテストステップ736まで取られる。PEの出力FIFO（Ｃ458）がいっぱいなら、YESの経路738がステップ732まで取られ、ここで指標Ｉがインクリメントされる。そうでなければ、NOの経路740がステップ742まで取られる。このステップで、PEフィールドと変数の局所化（localize）の過程が、PEに局所（local）データ構造をそして次の処理に他の変数を準備するために呼び出される。この過程は図18Ａ〜18Ｃに関して以下でさらに詳細に述べられる。
ステップ744で、EOVまたはFIFO満杯までPEの処理が、両方の入力がEOV状態となるまで、あるいは出力FIFOが満杯になるまで現在のPEを処理するために呼び出される。この過程は図19に関して以下でさらに詳細に述べられる。次に、ステップ746で、局所値をPEフィールドに戻す過程が局所データを現在のPEのPEデータ構造に戻して記憶するために呼び出される。この過程は図24に関して以下でさらに詳細に述べられる。指標Ｉはステップ732で処理されるべき次のPEに示すためにインクリメントされる。テストステップ748で、Ｉがカウントの２倍よりも小さければ（即ちPEの最大値マイナス１）、YESの経路750が、その木で次のPEの処理を開始するためにステップ724まで戻して取られる。そうでなければ、NOの経路752が取られ、処理は出口756で終了する。
図18Ａ〜18Ｃは、PEの処理で使用されるPEデータ構造のフィールドおよび他の動作変数を局所化する処理ステップのフローチャートである。エントリー758のあと、出力FIFO Ｃの文脈（context）（先頭指標476、末尾指標478、およびカウントフィールド480）が、ステップ760でＣの内容を局所変数に記憶することにより局所化される。テストステップ762で、現在のPEが葉ノードなら、YESの経路764がステップ766まで取られ、ここで入力ベクトル動作変数の文脈がインプット入力ベクトルから設定される。そうでなければ現在のPEはその木の内部ノードであり、NOの経路768がステップ770まで続けられる。このステップで入力ベクトル動作変数は入力FIFOから設定される。処理はいずれの場合でもステップ772で続く。出力データ構造がこの時初期化されなければならない。ステップ722で、Ｃ FIFOが現在のPEのＡビットユニットに設定される。次に、ステップ744で、Ａの長さ（length）（LEN Ａ）をＣ FIFOの長さに設定し、そしてＡのＶ，ＲおよびＧフラグをそれぞれＣに記憶されているＶ，ＲおよびＧの値に設定することにより、Ａの局所変数（local variable）は指定された値となる。次に、ステップ778で、Ｂの長さ（LEN Ｂ）をＣ FIFOの長さに設定し、そしてＢのＶ，ＲおよびＧフラグを、Ｃにそれぞれ記憶されているＶ，ＲおよびＧの値に設定することにより、Ｂの局所変数は指定された値となる。
ステップ780で、Ａの入力終了（EOV）が、Ｖビットを引き出すことによりＡのＶフラグに設定される。EOV Ａがテストステップ782で設定されると、YESの経路784がステップ786まで取られる。Ａの長さ（LEN Ａ）は１に設定される。このことは入力データのＢ側がPEに渡されて出力FIFOに至るようにさせる。もしそうでなければNOの経路788が図18Ｃのステップ792まで結合子Ｂを介して取られる。EOVが設定されると、ステップ786のあと、EOVイベント（event）数を数える変数（EOVEVENTS）がステップ790でインクリメントされる。処理は結合子Ｂを経由して図18Ｃに続く。
ステップ792で、Ｂに関する入力終了（EOV）変数がＶビットを引き出すことによりＢのＶフラグに設定される。EOV Ｂがテストステップ794で設定されると、YESの経路796がステップ798まで取られる。Ｂの長さ（LEN Ｂ）は１に設定される。これは入力データのＡ側がPEに渡されて出力FIFOに至るようにさせる。EOVイベント数を数える変数（EOVEVENTS）がステップ800でインクリメントされる。EOV Ｂがテストセット794で設定されなければ、NOの経路802が取られ、処理は出口804を経由して終了する。
図19は、両方の入力がEOV状態になるまであるいは出力FIFOが満杯となるまでPEによって実行される処理ステップのフローチャートである。エントリーステップ806のあと、EOVイベント数がテストステップ808でテストされる。EOVEVENTSが１より大きければ、このPEではこれ以上の処理は必要なく、従ってYESの経路810が出口812まで取られる。もしそうでなければ、EOVEVENTSは１より小さいか、１に等しくなるから、NOの経路814がステップ816まで取られる。このステップで演算の準備の過程が、Ａ側とＢ側の入力データを得るために呼び出される。この過程は、図20Ａ〜20Ｃに関して以下でさらに詳細に述べられる。テストステップ818で、EOVEVENTSが０ならば、処理されるべき入力データが有ることになる。従って、YESの経路820がステップ822に続き、ここで演算の過程が結果のベクトルＣを計算するために呼び出される。このプロセスは図23に関して以下でさらに詳細に述べられる。
結果Ｃは演算の準備の論理により「あらかじめロード（load）される」であることに注意すること。３つの条件のうちの１つがＣの内容を決定する。第１の条件は、入力ビットユニットＡがEOV状態にある時で、この時入力ビットユニットＢが出力として結果のビットユニットＣに渡される。第２の条件は、入力ビットユニットＢがEOV状態にある時で、この時入力ビットユニットＡが出力として結果のビットユニットＣに渡される。第３の条件は両方の入力がEOV状態にある時で、この時EOVの代表（representation）が結果のビットユニットＣとして渡される。両方の入力がどちらもEOV状態にない時、Ｃにあらかじめロードされた値は使用されない。
EOVEVENTSがテストステップ818で０より大きかったら、その時NOの経路826がステップ824まで取られる。結果のＣはステップ824で出力FIFOに置かれる。YESの経路820が取られた場合、ビットユニットＡかビットユニットＢの短い方の長さが出力としてPEを通って結果のＣに流れ込む。結果のＣのランとジエンダは演算の過程により決定される。次に、テストステップ828で、出力FIFOが満杯ならば、YESの経路830が続けられそして処理が出口812で終了する。もしそうでなければ、処理はNOの経路832を経由してテストステップ808まで続く。
図20Ａ〜20Ｂは演算の準備過程の処理ステップのフローチャートである。エントリー834のあと、Ａの長さ（LEN Ａ）がテストステップ836で０に等しければ、YESの経路838がテストステップ840まで取られる。もしそうでなければ、処理は結合子Ａを経由して図20Ｂのテストステップ842で続く。Ａの長さが０で現在のPEがテストステップ840で葉ノードであることが確認されると、YESの経路がステップ848まで取られ、もしそうでなければNOの経路850がステップ822まで取られる。ステップ848で、インプットビットストリングＡからのビットユニットが得られ葉PEの出力変数Ｃにロードされる。ステップ852で、入力FIFO Ａからのビットユニットが得られ内部PEの出力変数Ｃにロードされる。次にステップ854で、Ａの準備の過程がＡ側入力データを処理するために呼び出される。この過程は図21に関して以下でさらに詳細に述べられる。演算の準備の処理は図20Ｂのテストステップ842で続く。
テストステップ842で、Ｂの長さ（LEN Ｂ）が０に等しければ、YESの経路856がテストステップ858まで取られる。もしそうでなければ、処理はテストステップ860で続く。Ｂの長さが０で、テストステップ858で現在のPEが葉ノードであることが確認された時は、YESの経路がステップ864まで取られ、もしそうでなければ、NOの経路866がステップ868まで取られる。ステップ864で、入力ビットベクトルＢからのビットユニットが得られ葉PEの出力変数Ｃにロードされる。ステップ868で、入力FIFO Ｂからのビットユニットが得られ、内部PEの出力変数Ｃにロードされる。次に、ステップ870で、Ｂの準備の過程がＢ側入力データを処理するために呼び出される。この過程は図22に関して以下でさらに詳細に述べられる。それから処理は出口872を経由して終了する。
Ｂの長さがテストステップ842で０でないならば、処理はテストステップ860で続く。このステップでEDV Ａフラグが、Ａ入力ビットユニットがベクトル終了状態であるかどうか確認するために点検される。もしそうなら、YESの経路874がステップ876まで取られる。Ｂの長さ（LEN Ｂ）が０に設定されそして処理が出口872で終了する。もしそうでなければ、処理はNOの経路875をたどり出口872で終了する。
図21はＡ側入力を準備するステップのフローチャートである。エントリー880のあと、局所変数VRG Ａがステップ882で、ＣのＶ（入力終了）、Ｒ（ラン）、およひＧ（ジエンダ）フラグにロードされる。Ａの入力終了フラグ（EOV Ａ）がステップ884で局所変数VRG Ａから引き出される。次に、テストステップ886で、Ａが入力終了状態にあるかどうか確認するためにテストされる。もしそうならYESの経路888がステップ890まで取られ、ここでEOVEVENTSカウンタが、Ａは入力終了であることを示すためにインクリメントされる。そうでなければ、NOの経路892がテストステップ894まで取られる。テストステップ894で、Ｂの入力終了フラグ（EOV Ｂ）が、このPEのＢ側入力に処理すべきデータがもう無いことを確認するために点検される。もしそうなら、YESの経路が出口898まで取られる。EOV Ｂが処理すべきデータがまだ残されていることを示せば、NOの経路900がステップ902まで取られる。このステップで、長さＡ（LEN Ａ）の局所変数がＣの長さに設定される。EOV Ａが真でないなら、その時NOの経路906が出口898まで取られ、そしてＡ処理の準備は終了する。そうでなければYESの経路がステップ910まで取られ、ここでＣにある長さはＢ側入力の長さ（LEN Ｂ）に設定される。次に、ステップ912で、ＣのＶ，ＲおよびＧフラグがVRG Ｂ局所変数に設定される。Ａ側入力の長さ（LEN Ａ）はステップ914で１に設定される。これら３つのステップはＢ側データがPEに渡される原因となる。Ａの準備の処理は出口898で終了する。
図22はＢ側入力を準備するステップのフローチャートである。Ｂ側入力を処理するステップは、Ａ側入力を処理する図21で述べられたステップと非常に似ていることに注意すること。エントリー916のあと、局所変数VRG Ｂがステップ920でＣのＶ（入力終了）、Ｒ（ラン）、およびＧ（ジエンダ）フラグにロードされる。Ｂの入力終了フラグ（EOV Ｂ）がステップ922で局所変数VRG Ｂから引き出される。次に、Ｂが入力終了状態にあるかどうか確認するためにテストステップ924でEOV Ｂがテストされる。もしそうなら、YESの経路926がステップ930まで取られるが、ここでEOVEVENTSカウンタが、入力の１つが入力終了であることを示すために、インクリメントされる。そうでなければ、NOの経路932がテストステップ934まで取られる。テストステップ934で、このPEのＡ側入力で処理すべきデータがもう無いかを確認するために、Ａの入力終了フラグ（EOV Ａ）が点検される。もしそうなら、YESの経路936が出口938まで取られる。EOV Ａが処理すべきデータがまだ残されていることを示せば、NOの経路940がステップ942まで取られる。このステップで、Ｂの長さ（LEN Ｂ）の局所変数がＣの長さに設定される。EOV Ｂが入力終了でないなら、NOの経路946が出口938まで取られそしてＢの準備の処理が終了する。もしそうでないならYESの経路948がステップ950まで取られ、ここでＣにある長さはＡ側入力の長さ（LEN Ａ）に設定される。次に、ステップ952でＣのＶ，ＲおよびＧフラグはVRG Ａ局所変数に設定される。Ｂ側入力の長さ（LEN Ｂ）はステップ954で１に設定される。これら３つのステップはＡ側データがPEに渡される原因となる。最後に、Ａの長さ（LEN Ａ）が０に設定されそしてＡの準備の処理が出口938で終了する。
図23は、現在の処理要素のＡ側入力とＢ側入力のブール「OR」演算を実行するステップのフローチャートである。エントリー958のあと、Ａ側入力の長さ（LEN Ａ）がテストステップ960でＢ側入力の長さ（LEN Ｂ）と比較される。
LEN ＡがLEN Ｂより小さければ、経路962がステップ964まで取られ、ここでＣにある長さのフィールドがLEN Ａに設定される。次にステップ966でLEN ＡがLEN Ｂから差し引かれる。ステップ967で、LEN Ａは０に設定される。テストステップ968で、ジエンダフラグがVRG Ｂ局所変数から差し引かれそして点検される。関数Ｇ（ｘ）がｘのジエンダビットを引き出す。Ｂ側入力がジエンダビットの組を持っているなら、YESの経路970がステップ972まで取られ、ここでＣのVRGフィールドがジエンダ１のランを示すために設定される。そうでなければＢ側はジエンダビットの組を持たないので、NOの経路974がステップ976まで取られる。このステップで、ＣのVRGフィールドはVRG Ａ局所変数の内容に設定される。処理は出口978を経由して終了する。
テストステップ960に戻って調べ、LEN ＡがLEN Ｂより大きければ、経路980がステップ982まで取られ、ここでＣの長さフィールドが０に設定される。次に、ステップ984で、LEN ＢがLEN Ａから差し引かれる。ステップ985で、LEN Ｂが０に設定される。テストステップ986で、ジエンダフラグがVRG Ａ局所変数から引き出されそして点検される。Ａ側入力がジエンダビットの組を持っていれば、YESの経路988がステップ990まで取られ、ここでＣのVRGフィールドがジエンダ１のランを示すために設定される。もしそうでなければ、Ａ側はジエンダビットの組を持たないので、NOの経路がステップ994まで取られる。このステップで、ＣのVRGフィールドはVRG Ｂ局所変数の内容に設定される。処理は出口978を経由して終了する。
テストステップ960に戻って調べ、LEN ＡがLEN Ｂに等しければ、経路996がステップ998まで取られ、ここでＣの長さフィールドがLEN Ｂに設定される。ステップ1000で、局所変数LEN Ａが０に設定される。ステップ1001で、局所変数LEN Ｂが０に設定される。ステップ1002で、ＣのVRGフィールドが、表Ｉで以下に述べられるように関数Ｓに応じてVRG ＡとVRG Ｂのラン／ジエンダの計算を示すために設定される。
0004267707.tif 000002
Ａ側入力とＢ側入力が長さで等しい場合、結果Ｃのランおよびジエンダビット（Ｃ．VRGに記憶されているように）は、表に示されているようにＡ（Ｇ（VRG Ａ））のジエンダとＢ（Ｇ（VRG Ｂ））の２つの変数の関数である。示されているラン／ジエンダ計算表はGlaser外による米国特許No．5036457で述べられているように最小法（miima method）により与えられるランとジエンダの計算表と合っていることに注意すること。しかしながら、データフローマシンではブール「OR」演算のみが使用される。
図24はPEフィールドに局所変数の内容を再記憶するステップのフローチャートである。エントリー1004のあと、出力FIFOの文脈（先頭指標476、末尾指標478およびカウントフィールド480）がステップ1006で局所変数を使用して設定される。テストステップ1008で現在のPEが葉ノードなら、YESの経路1010がステップ1012まで取られる。もしそうでなければ、現在のPEは内部ノードであり、そしてNOの経路1014がステップ1016まで取られ、ここで入力FIFOの文脈（先頭指標476、末尾指標478、およびカウントフィールド438）が局所変数を使用して設定される。次に、ステップ1012で、Ｃの長さがLEN Ａに設定されまたＣのＶ，ＲおよびＧフラグがVRG Ａに設定される。それからＣの値がステップ1014で現在のPEのＢ側にロードされる。処理は出口1020で終了する。
図25は出力ビットベクトルを生成するステップのフローチャートである。エントリー1022のあと、根PEはステップ1024で処理された最後のPEに設定される。このPEはカウントに２−１を乗じた式により指標化（index）される。次に、ステップ1026で、出力FIFOの文脈（先頭指標476、末尾指標478およびカウントフィールド480）が根PEに設定される。テストステップ1028で、出力FIFOが空いていれば、経路1030がステップ1032まで取られる。このステップで出力FIFOの文脈は空きに設定される。Ｃの入力終了フラグ（EOV Ｃ）がステップ1034で局所データ構造Ｃから引き出されたＶフラグの現在値に設定される。変数EOV Ｃは入力終了状態が出力ビットベクトルに届けられた時を示す。出力ビットベクトルの生成処理がEOV Ｃの値をステップ1036で呼び出し先（caller）に戻すことにより終了する。テストステップ1028で出力FIFOが空いてなければ、NOの経路1038がステップ1040まで取られる。このステップで、出力FIFOからのビットユニットはＣに記憶される。次に、Ｃのビットユニットはステップ1042で出力ベクトルに記憶される。出力FIFOにさらに出力データがないかを点検するために処理がテストステップ1028に戻って続く。
図26は出力ビットベクトルを処理するステップのフローチャートである。入力ビットユニットの数が、１つのデータフローマシンで１度に処理されるあらかじめ決められた最大入力数よりも大きい場合はデータフローマシンの別の例により余分の入力ビットが処理されなければならないということに注意すること。エントリー1044のあと、テストステップ1046でAoBフラグが点検される。AoBが真なら（即ち１に設定されている）、奇数の入力ビットベクトルがデータフローマシンへの入力である。従って、YESの経路がステップ1050まで取られ、ここで一時的なベクトルが出力ベクトルの組に加えられる。この一時的なベクトルは奇数の入力ビットベクトルを表わしている。AoBフラグが偽ならば、NOの経路1052がたどられる。テストステップ1054で、出力ベクトルが２より大きければ、これらのベクトルについてさらに処理が実行される。従って、経路1056がたどられ、再帰的（recursive）呼出しがビットベクトルのＮ−ウェイ（way）処理機能に対してなされ、出力ベクトルの現在の組に入力データとして入る。出力ベクトルの数がテストステップ1054で１に等しければ、入力ビットベクトルの完全な組は、一つの出力ビットベクトルとなるように処理される。従って、経路1060が取られ処理が出口1062を経由して終了する。もしそうでなければ、出力ベクトルの数は２に等しい。この場合、経路1064がステップ1066までたどられ、ここで一つの出力ビットベクトルを作り出すために残りの２つのベクトルにブール「OR」演算が実行される。それから処理が出口1062で終了する。
本発明が現在考えられる最善の方法で述べられており、またすべて当業者の能力と熟練の範囲内で、かつこれ以上の発明活動を行うことなく、本発明がいろいろな変更、動作モードおよび実施態様が可能であることは明らかである。従って、特許証によって保護されるべきと意図されることが付け加えられた請求項で述べられる。
【図１】
0004267707.tif 000003
【図２Ａ】
0004267707.tif 000004
【図２Ｂ】
0004267707.tif 000005
【図３Ａ】
0004267707.tif 000006
【図３Ｂ】
0004267707.tif 000007
【図４】
0004267707.tif 000008
【図５Ａ】
0004267707.tif 000009
【図５Ｂ】
0004267707.tif 000010
【図６】
0004267707.tif 000011
【図７】
0004267707.tif 000012
【図８】
0004267707.tif 000013
【図９】
0004267707.tif 000014
【図１０】
0004267707.tif 000015
【図１１Ａ】
0004267707.tif 000016
【図１１Ｂ】
0004267707.tif 000017
【図１１Ｃ】
0004267707.tif 000018
【図１２】
0004267707.tif 000019
【図１３】
0004267707.tif 000020
【図１４】
0004267707.tif 000021
【図１５】
0004267707.tif 000022
【図１６】
0004267707.tif 000023
【図１７】
0004267707.tif 000024
【図１８Ａ】
0004267707.tif 000025
【図１８Ｂ】
0004267707.tif 000026
【図１８Ｃ】
0004267707.tif 000027
【図１９】
0004267707.tif 000028
【図２０Ａ】
0004267707.tif 000029
【図２０Ｂ】
0004267707.tif 000030
【図２１】
0004267707.tif 000031
【図２２】
0004267707.tif 000032
【図２３】
0004267707.tif 000033
【図２４】
0004267707.tif 000034
【図２５】
0004267707.tif 000035
【図２６】
0004267707.tif 000036