(57)【特許請求の範囲】
【請求項１】
データセットに属する複数の値を処理するベクトル処理システムにおいて、該ベクトル処理システムは、各要素に割り当てられた固有のインデックスを含む多数の要素を有する少なくとも１つの入力ベクトルを含み、前記インデックスは昇順に割り当てられ、該昇順は前記入力ベクトル内の前記要素の位置に対応し、単一命令複数データ（ＳＩＭＤ）指令として実行される、前記入力ベクトル内の反復値の複数のインスタンスを発見する方法であって、
前記値を前記入力ベクトルにロードするステップと、
前記入力ベクトルの各要素を選択するステップと、
前記選択された要素の一致数を計算するために、各選択された要素を、前記選択された要素のインデックスよりも低いインデックスを有する前記入力ベクトルの全ての要素と比較するステップであって、一致数が、前記選択された要素と同じ値を有する前記要素の数である、比較するステップと、
前記入力ベクトルと同じ数の要素の第１の出力ベクトルおよび同一のインデックスを生成するステップとを含み、前記入力ベクトルの各要素が、同一のインデックスを有する前記第１の出力ベクトルの前記要素に対応し、
前記第１の出力ベクトルの各要素が、前記入力ベクトルの対応する要素について計算された一致数に等しい値を有する、方法。
【請求項２】
前記第１の出力ベクトルの要素の値をゼロに等しく設定するステップと、
前記入力ベクトルの選択された要素ごとに、
前記選択された要素の前記インデックスよりも低いインデックスを有する前記入力ベクトル内の要素ごとに、
一致を識別するために、前記選択された要素の前記値を、前記選択された要素の前記インデックスよりも低いインデックスを有する前記入力ベクトル内の前記要素の前記値と比較するステップとをさらに含み、
第１の出力ベクトルを生成するステップは、
前記比較が一致を識別した場合に、前記選択された要素に対応する前記第１の出力ベクトルの前記要素の前記値を１だけインクリメントする、請求項１に記載の方法。
【請求項３】
前記入力ベクトルと同じ数の要素の第２の出力ベクトルおよび同一のインデックスを生成するステップをさらに含み、前記入力ベクトルの各要素が、同一のインデックスを有する第２の出力ベクトルの要素に対応し、
前記入力ベクトルの対応する要素が、対応する要素の前記インデックスよりも高いインデックスを有する前記入力ベクトルの要素の値と等しい値を有していない限り、第２の出力ベクトルの各要素の値が第１の値に等しく設定され、前記入力ベクトルの対応する要素が、対応する要素の前記インデックスよりも高いインデックスを有する前記入力ベクトルの要素の値と等しい値を有している場合、前記第２の出力ベクトルの前記要素の前記値が第２の値に等しく設定される、請求項１または２に記載の方法。
【請求項４】
前記第２の出力ベクトルはベクトルマスクである、請求項３に記載の方法。
【請求項５】
各エントリが少なくともキーフィールド、カウントフィールドおよび有効フィールドを含む、前記入力ベクトルの要素の数に等しいエントリ数を有する連想記憶メモリ（ＣＡＭ）を使用するステップであって、
エントリが、有効フィールドが第３の値に等しく設定された場合に有効であり、第４の値に等しく設定された場合に有効でない、連想記憶メモリ（ＣＡＭ）を提供するステップと、
全てのエントリの前記有効フィールドを前記第４の値に等しく設定するステップと、
前記入力ベクトルの各要素をインデックスの昇順に選択するステップとをさらに含み、
各選択された要素を前記選択された要素のインデックスよりも低いインデックスを有する前記入力ベクトルの全ての要素と比較するステップは、
前記選択された要素の前記値と等しいキーフィールドを有する一致するエントリを識別するか、そうでない場合は、新規の有効なエントリを生成するために、選択された要素の値を全ての有効なエントリのキーフィールドと比較するステップを含み、
一致するエントリが識別されると、
前記選択された要素に対応する前記第１の出力ベクトルの前記要素の前記値が、前記一致するエントリのカウントフィールドに等しく設定され、
前記一致する前記エントリのカウントフィールドが１だけインクリメントされ、
一致が発見されず、新規の有効なエントリが生成されると、
無効なエントリが選択され、
前記選択されたエントリの前記有効フィールドが前記第３の値に設定され、
前記選択されたエントリの前記キーフィールドが、前記選択された要素の前記値と等しく設定され、
前記選択された要素に対応する前記第１の出力ベクトルの前記要素の値はゼロに等しく設定され、その後、
前記選択されたエントリの前記カウントフィールドが１に設定される、請求項１〜４のいずれか一項に記載の方法。
【請求項６】
各エントリは最終インデックスフィールドをさらに含み、一致するエントリが識別されると、一致するエントリの最終インデックスフィールドが更新されるか、又は、新規の有効なエントリが生成されると、新規の有効なエントリの最終インデックスフィールドが更新される、請求項５に記載の方法。
【請求項７】
全ての要素の前記最終インデックスフィールドを更新した後、前記方法は、第２の出力ベクトルを生成するステップをさらに含み、
有効なエントリの前記最終インデックスフィールドに等しいインデックスを有する前記第２の出力ベクトルの各要素の前記値は第１の値と等しく設定され、そうでない場合は第２の値と等しく設定される、請求項６に記載の方法。
【請求項８】
前記入力ベクトルの複数の要素は選択され、かつ並列に処理される、請求項５〜７のいずれか一項に記載の方法。
【請求項９】
前記入力ベクトルの複数の要素を同時に選択するステップと、
前記同時に選択された値を互いに比較するステップと、
前記比較が一致を全く識別しない場合、前記複数の値を並列に処理するステップとを含む、請求項８に記載の方法。
【請求項１０】
前記第１の出力ベクトルの要素を選択し、かつ、第３の出力ベクトルを生成するために、第２の出力ベクトルを前記第１の出力ベクトル上のマスクとして使用するステップをさらに含む、請求項５〜９のいずれか一項に記載の方法。
【請求項１１】
前記第３の出力ベクトルを生成するステップは、
第１の値を有する前記第２の出力ベクトルの要素を識別するステップと、
前記第１の値を有する前記第２の出力ベクトルの前記要素をマスクとして使用して、前記第１の出力ベクトルを前記第３の出力ベクトルに圧縮するステップと
を含む、請求項１０に記載の方法。
【請求項１２】
ヒストグラム配列を初期化するステップと、
第４の出力ベクトルを生成するために前記第３の出力ベクトルの前記要素の値に１を加算するステップと、
前記第２の出力ベクトルをマスクとして使用して前記入力ベクトルを第５の出力ベクトルに圧縮するステップと、
ヒストグラム配列から第６の出力ベクトルへ集めるために前記第５の出力ベクトルの前記要素の前記値をインデックスとして用いるステップと、
前記第６の出力ベクトルの前記要素の前記値および前記第４の出力ベクトルの前記要素の前記値を加算することによって第７の出力ベクトルを生成するステップと、
前記第７の出力ベクトルの前記要素の前記値を前記ヒストグラム配列に分散するために、前記第５の出力ベクトルの前記要素の前記値をインデックスとして使用するステップとによって、
前記ヒストグラム配列をインクリメントするために前記第３の出力ベクトルを使用するステップをさらに含む、請求項１１に記載の方法。
【請求項１３】
メモリとプロセッサとを備える計算装置であって、前記メモリは、前記プロセッサによって実行可能なコンピュータプログラム命令を格納し、前記命令は、請求項１〜１２のいずれか一項に記載の方法を実行する機能を含む、計算装置。
【請求項１４】
請求項１〜１２のいずれか一項に記載の方法を計算装置に実施させるための命令を含むプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、コンピュータ科学に関し、より具体的には、ベクトル内の反復値の複数のインスタンスを発見するための方法および装置、ならびにソートアルゴリズムにおけるそれらの応用に関する。
【背景技術】
【０００２】
単一命令複数データ（ＳＩＭＤ）は、並列コンピュータの類である。ＳＩＭＤは、複数のデータ点で同じ操作を同時に実行する複数の処理要素を含むコンピュータを表している。したがって、そのようなマシンはデータレベル並列性（ＤＬＰ）を利用する。すなわち、同時（並列）計算が存在するが、所与の時点においては単一の制御処理（命令）のみが存在する。ＳＩＭＤ命令は、ＳＩＭＤおよびベクトル・アーキテクチャで使用される（非特許文献１を参照）。ＳＩＭＤ命令セットは、ＤＬＰを加速する効率的な方法を提供する。ＳＩＭＤ命令のサポートを提供する特定の方法は、ベクトル処理システム、すなわちベクトル・アーキテクチャを使用するコンピュータシステムを介したものである。この特許は、「ベクトル」および「ＳＩＭＤ」という用語を同じ意味で使用する。
【０００３】
ベクトル処理システムは、単一の命令で複数の値を処理するように構成されたシステムである。ベクトル処理システムは、各要素に割り当てられた固有のインデックスを含む多数の要素を各々が有する、多数のベクトルまたはベクトルレジスタを含んでもよい。インデックスは昇順に割り当てられてもよく、この昇順は、ベクトル内の要素の位置に対応する。ＳＩＭＤ命令を使用したアルゴリズムを実装することは、アルゴリズムのベクトル化と見なすことができる。
【０００４】
ソートは、コンピュータ科学において広く研究されている問題であり、科学計算およびデータベース管理システムを含む多くのサブフィールドでは、単純な基礎的要素である。
【０００５】
基数ソートは、非比較数値ソートアルゴリズムである。Ｚａｇｈａら（非特許文献２）は、基数ソートをベクトル化する方法が提案した。ベクトル化された基数ソートアルゴリズムでは、索引アクセスを使用してデータを配列に格納する必要がある。索引アクセスでは、要素は、第２のベクトルの内容によって示される要素のアドレスで、メモリ内の任意の位置に配置されてもよい。これは、ロードの形態で集まることが知られている。したがって、分散という用語は、それぞれその格納形式において使用される。分散の操作中に、同じベクトル内の複数の要素が同じメモリ位置を索引することがあり、したがって競合が発生する。この競合を防止するために、ベクトル化された基数ソートは、それ自体が欠点である関連する配列を複製する。この手法のもう一つの主な欠点は、ソートされた配列を非連続（ストライド）パターンでアクセスする必要があることである。
【０００６】
Ｃｒａｙ  Ｘ１（商標）システムなどのマイクロプロセッサアーキテクチャによって使用される既存のＳＩＭＤ命令セット（例えば、「Ｃｒａｙ  Ａｓｓｅｍｂｌｙ  Ｌａｎｇｕａｇｅ  （ＣＡＬ）  ｆｏｒ  Ｃｒａｙ  Ｘ１（商標）Ｓｙｓｔｅｍｓ  Ｒｅｆｅｒｅｎｃｅ  Ｍａｎｕａｌ，  Ｓ−２３１４−５１」、２００３年１０月、第７．７章、「Ｖｅｃｔｏｒ  Ｒｅｇｉｓｔｅｒ  Ｉｎｓｔｒｕｃｔｉｏｎｓ」を参照）は、そのような競合を処理するための直接的な解決策を提供していない。当業者であれば、ベクトル化された基数ソートが、配列に分散する際の競合を回避する必要があるアルゴリズムの一例に過ぎないことを理解するであろう。他のアルゴリズムをベクトル化するために、配列へ分散する際に競合を回避する必要もある。
【０００７】
新規のＳＩＭＤ命令、および、新規のＳＩＭＤ命令の使用との競合を回避するベクトル化されたソートアルゴリズムを提供することが望ましい。
【先行技術文献】
【非特許文献】
【０００８】
【非特許文献１】Ｆｌｙｎｎ著、「Ｓｏｍｅ  Ｃｏｍｐｕｔｅｒ  Ｏｒｇａｎｉｚａｔｉｏｎｓ  ａｎｄ  Ｔｈｅｉｒ  Ｅｆｆｅｃｔｉｖｅｎｅｓｓ」、論文誌ＩＥＥＥ  Ｔｒａｎｓａｃｔｉｏｎｓ  Ｏｎ  Ｃｏｍｐｕｔｅｒｓ、第Ｃ−２１巻第９号、１９７２年９月発行
【非特許文献２】Ｍ．  ＺａｇｈａおよびＧ．Ｅ．Ｂｌｅｌｌｏｃｈ著、「Ｒａｄｉｘ  Ｓｏｒｔ  ｆｏｒ  Ｖｅｃｔｏｒ  Ｍｕｌｔｉｐｒｏｃｅｓｓｏｒｓ」、１９９１年ＡＣＭ  ／  ＩＥＥＥ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｓｕｐｅｒｃｏｍｐｕｔｉｎｇ会報、Ｓｕｐｅｒｃｏｍｐｕｔｉｎｇ  シリーズ’９１、１９９１年、７１２〜７２１頁
【発明の概要】
【発明が解決しようとする課題】
【０００９】
ＳＩＭＤ命令セットアーキテクチャ（ＩＳＡ）に含まれる２つの新規の命令が提案され、これらの命令をハードウェアにおいて実現する２つの異なる方法も提案される。その後、新規の命令を利用するソートアルゴリズムが提案される。    
【課題を解決するための手段】
【００１０】
第１の態様によれば、データセット（データの集合）に属する複数の値を処理するように構成されたベクトル処理システムでは、入力ベクトル内の反復値の複数のインスタンス（事象、事実）を発見する方法が開示される。この方法は、以降に入力ベクトルと呼ぶベクトルに値をロードすることを含む。入力ベクトルの各要素は選択され、次いで選択された要素のインデックスよりも低いインデックスを有する入力ベクトルの全ての要素と比較され、選択された要素の一致数が計算される。一致数は、選択された要素と同じ値を有する要素の数である。次に、入力ベクトルと同じ数の要素および同一のインデックスを有する第１の出力ベクトルが生成される。入力ベクトルの各要素は、同一のインデックスを有する第１の出力ベクトルの要素に対応する。第１の出力ベクトルの各要素は、入力ベクトルの対応する要素について計算された一致数に等しい値を有する。
【００１１】
前述の方法を使用して、入力ベクトルの対応する要素における値のインスタンス（状態）が、より低いインデックスを有する入力ベクトルの要素にいくつ存在するかを正確にアサートすることが可能である。この方法は、新規のＳＩＭＤ命令として実施してもよい。本明細書で開示される新規のＳＩＭＤ命令は、以後、ベクトル先行インスタンス（ＶＰＩ：Ｖｅｃｔｏｒ  Ｐｒｉｏｒ  Ｉｎｓｔａｎｃｅｓ）と呼ばれる。
【００１２】
いくつかの実施例では、この方法は、最初に第１の出力ベクトルの要素の値をゼロに等しく設定するステップをさらに含んでもよい。次に、入力ベクトルの各選択された要素ごとに、および、選択された要素のインデックスよりも低いインデックスを有する入力ベクトルの要素ごとに、選択された要素の値を、選択された要素のインデックスよりも低いインデックスを有する入力ベクトル内の要素の値と比較して一致を識別してもよい。第１の出力ベクトルを生成するステップは、前記比較が一致を識別した場合に、選択された要素に対応する第１の出力ベクトルの要素の値を１だけインクリメントするステップを含んでもよい。これらのＶＰＩの実装は、入力ベクトルの要素の数に比例して線形的に変化しないので、限られた数の要素を含む入力ベクトルに適している場合がある。
【００１３】
いくつかの例では、この方法は、入力ベクトルの要素の値を互いに比較して等しい値を識別し、前記比較に応答して、入力ベクトルと同じ数の要素の第２の出力ベクトルおよび同一のインデックスを生成することをさらに含んでもよい。そこで、入力ベクトルの各要素は、同一のインデックスを有する第２の出力ベクトルの要素に対応してもよい。入力ベクトルの対応する要素が、対応する要素のインデックスよりも高いインデックスを有する入力ベクトルの要素の値と等しい値を有していない限り、第２の出力ベクトルの各要素の値を第１の値に等しく設定してもよい。次に、第２の出力ベクトルの前記要素の値を第２の値に等しく設定してもよい。
【００１４】
したがって、第２の出力ベクトルでは、入力ベクトルの要素に存在する全ての値の最終インスタンスをマークすることが可能である。第２の出力ベクトルは、ベクトルマスクと見なすことができる。この方法も同様に、新規のＳＩＭＤ命令として実施してもよい。本明細書で開示されるこの新規の命令は、以後、ベクトルラストユニーク（ＶＬＵ：Ｖｅｃｔｏｒ  Ｌａｓｔ  Ｕｎｉｑｕｅ）と呼ばれる。なお、本明細書で開示される２つの命令（ＶＰＩおよびＶＬＵ）を、様々なアルゴリズムをベクトル化するために独立してまたは一緒に使用することができる。
【００１５】
いくつかの実装では、この方法は、入力ベクトルの要素の数に等しい数のエントリを有する連想記憶メモリ（ＣＡＭ：Ｃｏｎｔｅｎｔ  Ａｄｄｒｅｓｓａｂｌｅ  Ｍｅｍｏｒｙ）を提供することをさらに含んでもよい。ＣＡＭの各エントリは、少なくとも１つのキーフィールド、カウントフィールド、および有効フィールドを含んでもよい。エントリは、その有効フィールドが第３の値に等しく設定された場合に有効であると見なされ、第４の値に等しく設定された場合に有効でないと見なされる。この方法は、最初に全てのエントリの有効フィールドを第４の値に等しく設定することをさらに含んでもよい。次に、入力ベクトルの各要素は、インデックスの昇順に選択される。次に、選択された各要素を全ての有効なエントリのキーフィールドと比較して、選択された要素の値と等しいキーフィールドを有する一致するエントリを識別するか、そうでない場合は、新規の有効なエントリを生成してもよい。一致するエントリが識別されると、選択された要素に対応する第１の出力ベクトルの要素の値を、一致するエントリのカウントフィールドに等しく設定してもよい。次に、一致するエントリのカウントフィールドを１だけインクリメントしてもよい（増やしてもよい）。新規の有効なエントリが生成されると、無効なエントリを最初に選択してもよい。次に、選択されたエントリの有効フィールドを第３の値に等しく設定してもよい。続いて、選択されたエントリのキーフィールドを、選択された要素の値と等しく設定してもよい。次のステップでは、選択された要素に対応する出力ベクトルの要素の値をゼロに等しく設定してもよい。最後に、選択されたエントリのカウントフィールドを１に設定してもよい。
【００１６】
これらのＶＰＩ命令の実装は、入力ベクトルの要素の数に比例して線形的に変化するＣＡＭを使用する。
【００１７】
いくつかの例では、ＣＡＭの各エントリは最終インデックスフィールドをさらに含んでもよい。最終インデックスフィールドは、一致するエントリが識別されるたびに、かつ、新規の有効なエントリが生成されるたびに更新されてもよい。更新された最終インデックスフィールドは、選択された要素のインデックスと等しく設定されてもよい。全ての要素について最終インデックスフィールドを更新した後、有効なエントリの最終インデックスフィールドに等しいインデックスを有する第２の出力ベクトルの各要素の値を第１の値と等しく設定し、残りの値を第２の値と等しく設定して、第２の出力ベクトルを生成してもよい。
【００１８】
したがって、最終インデックスフィールドの更新は、第１の出力ベクトルが生成されるのと同時に行われてもよい。その後、第２の出力ベクトルの生成は単一のステップを必要とする。
【００１９】
いくつかの例では、入力ベクトルの複数の要素を選択して並列に処理してもよい。これは、ＣＡＭ構造のポートの数を増加させることによって行うことができる。したがって、処理をさらに加速することができる。このような並列処理は、入力ベクトルの複数の隣接する要素を同時に選択することと、同時に選択された値を互いに比較することと、前記比較が一致を全く識別しない場合、複数の値を並列に処理することとを含んでもよい。そうでない場合、選択された複数の値に対して並列ではなく逐次的に処理を進めることができる。前記比較が一致を識別しない場合にのみ並列に処理することにより、並列処理中にエラーが引き起こされず、すなわち予測不可能な出力が提供されないので出力が正確であることが保証される。
【００２０】
いくつかの例では、第１の出力ベクトルの要素を選択し、かつ、第３の出力ベクトルを生成するために、第２の出力ベクトルを第１の出力ベクトル上のマスクとして使用してもよい。第３の出力ベクトルを生成することは、第１の値を有する第２の出力ベクトルの要素を識別することと、第１の値を有する第２の出力ベクトルの要素をマスクとして使用して、第１の出力ベクトルを第３の出力ベクトルに圧縮することとを含んでもよい。本明細書で使用する「圧縮」という用語は、ＫｒｓｔｅＡｓａｎｏｖｉ?著、「Ｖｅｃｔｏｒ  Ｍｉｃｒｏｐｒｏｃｅｓｓｏｒｓ」、博士論文、１９９８年、カリフォルニア大学バークレー校、セクション２．２．２（Ａｓａｎｏｖｉ?、１９９８年）に定義されているベクトル圧縮命令を指す。すなわち、圧縮命令は、入力ベクトル（ソースベクトルレジスタ）から出力ベクトル（目標ベクトルレジスタ）の開始点の連続要素までマスクレジスタによって示される位置の要素を圧縮する。そこで、マスクされた命令が全体を通して使用されている場合よりも効率的に、要素を後続のベクトル命令で処理することができる。
【００２１】
いくつかの例では、第３の出力ベクトルを使用してヒストグラム配列をインクリメントしてもよい。ヒストグラム配列は、要素の配列である。これらの要素の各々はビンとして知られている。各ビンは、ビンＩＤとして知られる固有の識別子を有する。ヒストグラム配列を所与の配列で更新する場合、ヒストグラム配列のビンの内容は、前記ビンのビンＩＤに等しい値を含む所与の配列の要素の数だけインクリメントされる。
【００２２】
所与の配列としての入力ベクトルによってヒストグラム配列をインクリメントするために、第３の出力ベクトルの要素の値に１を加算して第４の出力ベクトルを生成してもよい。次に、第２の出力ベクトルをマスクとして使用して、入力ベクトルを第５の出力ベクトルに圧縮してもよい。次に、ヒストグラム配列から第６の出力ベクトルへ集めるために、第５の出力ベクトルの要素の値をインデックスとして使用してもよい。続いて、第６の出力ベクトルの要素の値を第４の出力ベクトルの値に加算することによって、第７の出力ベクトルを生成してもよい。最後に、第５の出力ベクトルの要素の値をインデックスとして使用して、第７の出力ベクトルの要素の値をヒストグラム配列に分散してもよい。
【００２３】
別の態様では、ソート方法が開示される。多くともｍ個の連続値の少なくともｎ個の連続ブロックで構成された多くともｎ×ｍ個の値を有する初期入力配列を提供することができる。各値は、ｚ個のビット数を有してもよい。値のビットの複数のｊ個のサブセットを定義することができる。仮にｋ＝１〜ｊであるサブセットｋのビット数をｚｋとすると、ｚ１＋ｚ２＋．．．＋ｚｊ＝ｚであり、ｋ＝２〜ｊであるサブセットｋ−１の全てのビットはサブセットｋの全てのビットをはるかに下回る。次に、ｋ＝１から連続した順序で開始して、ｋ＝１〜ｊであるビットｋのサブセットごとに以下のステップを繰り返すことができ、これらステップは、まず、ヒストグラム配列をリセットしてその全ての値をゼロに設定する。次に、ｉ＝１から連続した順序で開始して、ｉ＝１〜ｎであるブロックｉごとに以下のステップを繰り返すことができ、これらステップは、まず、少なくともｍ個の要素の第８の出力ベクトルの値をブロックｉの値と等しく設定する一方で、第８の出力ベクトルにおいて前記値が入力配列内で有した連続的な順序を維持し、次に、入力ベクトルの各要素の値を、同一のインデックスを有する第８の出力ベクトル内の要素の値のビットのサブセットｋに等しく設定し、次に、ここに開示されている例示的な方法によって、および命令ＶＰＩおよびＶＬＵを使用して、ヒストグラム配列を更新してもよい。次に、全てのブロックが処理された後、ヒストグラム配列のプレフィックス和を生成してもよい。プレフィックス和の第１の要素の値をゼロに等しく設定し、プレフィックス和の残りの各要素の値を、プレフィックス和において先行インデックスを有する要素の値と、同じ先行インデックスを有するヒストグラム配列の要素の値とを加算した合計と等しく設定してもよい。次に、ｉ＝１から連続した順序で開始して、ｉ＝１〜ｎであるブロックｉごとに以下のステップを反復することができ、これらステップは、第８の出力ベクトルの値をブロックの値と等しく設定する一方で、第８の出力ベクトルにおいて前記値が入力配列内で有した連続的な順序を維持してもよく、入力ベクトルの各要素の値を、同一のインデックスを有する第８の出力ベクトル内の要素の値のビットのサブセットｋに等しく設定してもよく、ここに開示されている例示的な方法によって、および命令ＶＰＩおよびＶＬＵを使用して、第１の出力ベクトルおよび第２の出力ベクトルを生成してもよく、プレフィックス和から集めるために入力ベクトルの要素の値をインデックスとして使用して第９の出力ベクトルを生成してもよく、第１の出力ベクトルおよび第９の出力ベクトルの要素の値を加算して第１０の出力ベクトルを生成してもよく、第２の出力ベクトルをマスクとして使用して第１０の出力ベクトルを第１１の出力ベクトルに圧縮してもよく、第１２の出力ベクトルを生成するために第１１の出力ベクトルの要素の値に１を加算してもよく、第２の出力ベクトルをマスクとして使用して入力ベクトルを第１３のベクトルに圧縮してもよく、第１２の出力ベクトルの要素の値をプレフィックス和に分散するために第１３のベクトルの要素の値をインデックスとして使用してもよく、第８の出力ベクトルの要素の値を出力配列に分散する���めに第１０の出力ベクトルの要素の値をインデックスとして使用してもよい。次に、全てのブロックが処理された後、入力配列を出力配列と等しく設定してもよい。最後に、ビットの全てのサブセットが処理された後、出力配列をソートされた初期入力配列として提供してもよい。
【００２４】
ＶＰＩ、ＶＬＵ命令を使用して、提案されたソートアルゴリズムは効率的にベクトル化することが可能である。ＶＰＩおよびＶＬＵを使用しない場合、基数ソートアルゴリズムをベクトル化する唯一の既知の方法では、ヒストグラム配列を複製する必要がある。これには、性能が大幅に低下するいくつかの結果があり、そのうちの１つは、大きなストライドアクセスパターンの使用である。ＶＰＩ、ＶＬＵ命令では、より効率的なユニットストライドアクセスが代わりに使用される。
【００２５】
いくつかの例では、ｚｋ＝ｂである場合、ヒストグラム配列は２ｂビンを含んでもよい。例えば、ｚｋ＝２である場合、ヒストグラム配列は２２ビンを含んでもよい。
【００２６】
別の態様では、計算装置が開示される。計算装置は、メモリおよびプロセッサを備えてもよい。メモリは、プロセッサによって実行可能なコンピュータプログラム命令を格納することができる。前記命令は、本明細書で開示された実施例による方法を実行する機能を含んでもよい。
【００２７】
さらに別の態様では、コンピュータプログラム製品が開示される。コンピュータプログラム製品は、本明細書で開示された実施例による方法を計算装置に実施させるための命令を含んでもよい。
【００２８】
コンピュータプログラム製品は、記憶媒体（例えば、ＣＤ−ＲＯＭ、ＤＶＤ、ＵＳＢドライブ、コンピュータメモリ、または読み取り専用メモリ）上に、または、キャリア信号（例えば、電気的または光学的キャリア信号）上に具現化されてもよい。
【００２９】
コンピュータプログラムは、ソースコード、オブジェクトコード、コード中間ソース、部分的にコンパイルされた形式または処理の実施における使用に適した他の任意の形式などのオブジェクトコードの形式であってもよい。キャリアは、コンピュータプログラムを送信することができる任意のエンティティまたは装置であってもよい。
【００３０】
例えば、キャリアは、ＲＯＭ、例えばＣＤ−ＲＯＭまたは半導体ＲＯＭ、または例えばハードディスクなどの磁気記録媒体などの記憶媒体を含んでもよい。さらに、キャリアは、電気信号または光信号などの伝送可能なキャリアであってもよく、電気ケーブルまたは光ケーブルを介して、または無線または他の手段によって伝達されてもよい。
【００３１】
コンピュータプログラムが、ケーブルまたは他の装置あるいは他の手段によって直接伝達することができる信号に具体化される場合、キャリアは、そのようなケーブルまたは他の装置あるいは他の手段によって構成されてもよい。
あるいは、キャリアは、コンピュータプログラムが埋め込まれた集積回路であってもよく、集積回路は、関連する方法を実行するために、または関連する方法の実行において使用されるように適合される。
【００３２】
本発明の実施例の追加の目的、利点および特徴は、説明を検討する際に当業者に明らかになるか、または本発明の実施によって習得されるであろう。
【図面の簡単な説明】
【００３３】
【図１】ベクトルの先行インスタンスを計算する方法の例示的なフロー図である。
【図１ａ】ＶＰＩ命令の意味論の例示的な一例を示す図である。
【図２】ベクトルの最終の固有インスタンスを計算する方法の例示的なフロー図である。
【図２ａ】ＶＬＵ命令の意味論の例示的な一例を示す図である。
【図３】連想記憶メモリ（ＣＡＭ）を使用してベクトルの先行インスタンスを計算する方法の例示的なフロー図である。
【図３ａ】ＶＰＩが計算された後に連想記憶メモリ（ＣＡＭ）を使用して、ベクトルの最終の固有インスタンスを計算する方法の例示的なフロー図である。
【図４】ＣＡＭメモリを使用してＶＰＩを計算するための実施例を示す図である。
【図５】２つの並列経路（またはレーン）を使用した並列最適化を示す図である。
【図６】入力ベクトルの値を用いてヒストグラム配列を更新する方法の例示的なフロー図である。
【図７】入力配列をソートする方法の例示的なフロー図である。
【図８】ｉ＝１およびｋ＝１の場合に提案されたソートアルゴリズムの例の高レベルの概観を示す図である。
【発明を実施するための形態】
【００３４】
図１は、ベクトル（ベクター、一次元配列）の先行インスタンスを計算する方法の例示的なフロー図である。第１のステップ１１０では、以降に入力ベクトルと呼ぶベクトル処理システムのベクトル（配列）に値がロードされる（入力される、取り込まれる）。次に、ステップ１１５では、一致したかどうかを識別するために、入力ベクトルの各要素が選択されて、選択された要素のインデックスよりも低いインデックスを有する入力ベクトルの全ての要素と比較される。ステップ１２０では、各選択された要素に対する一致数が計算される。一致数（適合数）は、選択された要素と同じ値を有する選択された要素のインデックスよりも低いインデックスを有する要素の数である。ステップ１２５では、第１の出力ベクトルが生成される。第１の出力ベクトルは、入力ベクトルと同じ数の要素および同一のインデックスを有する。さらに、入力ベクトルの各要素は、同一のインデックスを有する第１の出力ベクトルの要素に対応する。第１の出力ベクトルの各要素は、入力ベクトルの対応する要素について計算された一致数に等しい値を有する。一実施例では、これは、比較が一致を識別した場合に、選択された要素に対応する第１の出力ベクトルの要素の値を１だけインクリメントすることによって、第１の出力ベクトルを生成するステップを行うことができる。この実装では、第１の出力ベクトルの要素の値は必ずゼロに等しく、または処理される前にゼロに等しく設定されなければならない。
【００３５】
図１ａは、ＶＰＩ命令の意味論の例示的な一例を示す図である。要素は左から右へ処理される。図１ａの例では、値５は、入力ベクトル（ｉｎ）のインデックス１の位置で初めて発見される。この時点まで、出力ベクトル（ｏｕｔ）の全ての要素は０に等しい。次に、インデックス２の位置で値５が２回目に再び発見される。結果として、出力ベクトル（ｏｕｔ）のインデックス２の位置は１に設定され、インデックス２の位置にある要素の値の先行インスタンスの数に対応する。次に、インデックス３の位置では、値５は３回目に発見される。結果として、出力ベクトル（ｏｕｔ）のインデックス３の位置は２に設定され、インデックス３の位置にある要素の値の先行インスタンスの数に対応する。
【００３６】
図２は、ベクトル（ベクター、一次元配列）の最終の固有インスタンスを計算する方法の例示的なフロー図である。第１のステップ２１０では、以降に入力ベクトルと呼ぶベクトルにｍ個の値がロードされる。以降に第２の出力ベクトルとして知られる入力ベクトルと同じ数の要素のベクトルが同一のインデックスを有して生成される。入力ベクトルの各要素は、同一のインデックスを有する第２の出力ベクトルの要素に対応する。次に、ステップ２１０では、ｅが０に等しく設定される。ステップ２２５では、入力ベクトルの対応する要素（ｅ番目）が、対応する要素のインデックスよりも高いインデックスを有する入力ベクトルの任意の要素の値と等しい値を有しているかどうかが確認される。ＮＯである場合、ステップ２３５では、第２の出力ベクトルのｅ番目の要素の値が第１の値に等しく設定される。ＹＥＳである場合、ステップ２３０では、第２の出力ベクトルのｅ番目の要素の値が第２の値に等しく設定される。ステップ２４０では、全ての要素が処理されたかどうか、すなわちｅ＝ｍ−１であるかどうかが確認される。ＹＥＳである場合、ＶＬＵが完了したと見なされる２４５において処理が終了する。ＮＯである場合、ｅが２５０においてインクリメントされ、処理が継続する。
【００３７】
図２ａは、ＶＬＵ命令の意味論の例示的な一例を示す図である。出力ベクトル（ｏｕｔ）は、各要素がビットであるベクトルマスク（vector mask）と見なしてもよい。第１の値は１であってもよく、第２の値は０であってもよい。出力ベクトルのビットは、入力ベクトルにおける対応する値がその後に見られない場合にのみ設定される。これらの事例は、入力ベクトル内で網掛けされている。図２ａの例では、インデックス０，３，６および７の出力ベクトルの要素は、入力ベクトルの要素の値の最終の固有のインスタンス（状態）に対応するので１に設定される。
【００３８】
図３は、連想記憶メモリ（ＣＡＭ）を使用してベクトルの先行インスタンスを計算する方法の例示的なフロー図である。ＣＡＭは、入力ベクトルの要素の数（ｍ）に等しい数のエントリを有してもよい。各エントリは、少なくとも１つのキーフィールド、カウントフィールド、および有効フィールドを含んでもよい。エントリは、その有効フィールドが第３の値、例えばＹに等しく設定された場合に有効であると見なされ、第４の値に等しく設定された場合、例えばＮに等しく設定された場合に有効でないと見なされる。第１のステップ３０５では、全てのエントリの有効フィールドがＮに設定される。また、ｅが０に等しく設定される。次に、入力ベクトルのｅ番目の要素が選択される。ステップ３１０では、選択された要素の値が、全ての有効なエントリのキーフィールドと比較される。ステップ３１５では、一致するエントリが識別されたかどうか、すなわち、選択された（ｅ番目の）要素の値と等しいキーフィールドをエントリが有しているかどうかが確認される。答えがＹＥＳである場合、ステップ３２５では、選択された要素（ｅ番目）に対応する第１の出力ベクトルの要素の値が、一致するエントリのカウントフィールドに等しく設定される。ＮＯである場合、ステップ３２０では、新規の有効なエントリが生成される。ステップ３２５に続いて、ステップ３３５では、一致するエントリのカウントフィールドが１だけインクリメントされる。その後、処理はステップ３５５に引き継がれる。ここで、ステップ３２０では、新規の有効なエントリを生成するために、無効なエントリの有効フィールドが、第３の値、すなわちＹに等しく設定される。次に、ステップ３３０では、選択されたエントリのキーフィールドが、選択されたｅ番目の要素の値と等しく設定される。ステップ３４０では、選択された要素（ｅ番目）に対応する出力ベクトルの要素の値がゼロに等しく設定される。ステップ３５０では、選択されたエントリのカウントフィールドが１に等しく設定される。最後に、ステップ３５５では、ｅ＝ｍ−１であるかどうか、すなわち全ての要素が処理されたかどうかが確認される。答えがＹＥＳである場合、処理がステップ３６５で終了し、ＶＰＩが完了したと見なされる。そうでなければ、ステップ３６０では、ｅはｅ＋１に等しく設定され、処理はステップ３１０からの次の要素のために継続する。
【００３９】
各エントリは最終インデックスフィールドをさらに含んでもよい。最終インデックスフィールドは、一致するエントリが識別された場合にステップ３３５の後で、または新規の有効なエントリが生成された場合にステップ３２０の後のいずれかで、ステップ３７０で更新されてもよい。その後、更新された最終インデックスフィールドは、選択された要素のインデックスと等しく設定される。
【００４０】
図３ａは、ＶＰＩが計算された後に連想記憶メモリ（ＣＡＭ）を使用して、入力ベクトルの最終の固有インスタンスを計算する方法の例示的なフロー図を示している。ステップ３７５では、全ての要素の最終インデックスフィールドが更新されたかどうか、すなわちＶＰＩが完了したかどうかが確認される。そうでなければ、処理はこの条件が満たされるまで待機する。全ての要素について最終インデックスフィールドを更新した後、処理はステップ３８０に引き継がれる。ステップ３８０では、第２の出力ベクトルの要素は、第２の値に等しく設定される。ステップ３８５では、有効なエントリの最終インデックスフィールドの値に等しいインデックスを有する第２の出力ベクトルの各要素が、第１の値に等しく設定される。ステップ３９０では、ＶＬＵは完了したと見なされる。
【００４１】
図４は、ＣＡＭメモリを使用してＶＰＩを計算するための実施例を示す図である。この図は、命令が完了する前の中間ステップにおける処理の状態を示している。入力ベクトルの８つの要素のうち６つは既に処理されており、出力ベクトルの８つの要素のうち６つが計算される（斑点模様で示されている）。入力ベクトルの７番目の要素が処理されており、出力ベクトルの対応する要素が計算されるところである。図４に示すＣＡＭメモリは８つのエントリを含む。各エントリは、有効、キー、最終インデックス（図中の最終ｉｄｘ）およびカウントフィールドを含む。図示のステップの間、４つの有効フィールドがＹに設定され、残りはＮに設定される。ここで、ＣＡＭにアクセスするために入力のインデックス６の要素の値９が使用される。値９は、先に処理された要素（インデックス５の要素）において既に発見されているので、インデックス６の入力ベクトルの要素の値と等しいキーフィールドを有する有効なエントリが既に存在する。
【００４２】
したがって、有効なエントリのカウントフィールドにある値は、第１の出力ベクトルの７番目の要素に複製される。値９を含むこの点まで発見された入力の要素はまさに１つしかないため、この値は１に等しい。その後、カウントフィールドは１だけインクリメントされ、対応する最終ｉｄｘフィールドの値は、値９が観測された入力ベクトルの最新のインデックスを参照するので、６に更新される。
【００４３】
最終ｉｄｘフィールドはＶＰＩを計算するために使用されないが、カウントを更新する際にこのフィールドを更新するのは比較的容易であり、この方法では、同じ入力を使用してＶＰＩの後にＶＬＵが実行される場合、最後に行うべきことは、最終ｉｄｘ値の配列をビットマスクに変換することである。これは、比較的少ない周期で行うことができる。
【００４４】
上記の処理を最適化する方法は、１９９８年のＡｓａｎｏｖｉ?の３２頁のセクション３．３に定義されているように、複数のレーンを使用して入力ベクトルの複数の要素を並列に選択して処理することである。この実装を複数のレーンに拡張するための１つの明白な障害は、先行インスタンスおよび最終の固有の要素を計算するための方法が連続して定義されることである。入力ベクトルの隣接する要素を、複数のグループに配置してもよい。グループ内の要素を、互いに競合しなければ並列に処理し、そうでない場合は連続して処理してもよい。競合の検出は、１！／（２ｘ（ｌ−２）！比較器が必要であり、ここで、１は対象とされる並列レーンの数、すなわちグループの大きさである。
【００４５】
図５は、２つの並列経路（またはレーン）を使用した並列最適化を示す図である。左から右に処理される入力ベクトルがあり、その下にパラレル実装およびシリアル実装の両方の相対的な実行時間を表す２つの時系列がある。時系列の各ブロックは、１つの要素を処理するために必要な時間を表しているが、並列の時系列は、このグループの要素が直列に処理されることを意味する積層ブロックを示している。要素の第１、第３および第４のグループは競合がないので、並行して処理することができる。要素の２番目のグループには競合があり、直列化する必要がある。ハッチングされた箱は、シリアル実装にわたって節約された相対時間を表している。
【００４６】
図６は、入力ベクトルの値を用いてヒストグラム配列を更新する方法の例示的なフロー図である。ステップ６０５では、図１または図３を参照して説明したＶＰＩ命令を使用して、第１の出力ベクトルが入力ベクトルから生成されてもよい。ステップ６１０では、図２または図３ａを参照して説明したＶＬＵ命令を使用して、第２の出力ベクトルが入力ベクトルから生成されてもよい。ステップ６１５では、第２の出力ベクトルをマスクとして使用して、第１の出力ベクトルが第３の出力ベクトルに圧縮される。第１の値を有する第２の出力ベクトルの要素に対応する第１の出力ベクトルの要素が、圧縮命令によって選択される。ステップ６２０では、第３の出力ベクトルの要素の値に１を加算することによって、第４の出力ベクトルが生成される。ステップ６２５では、第２の出力ベクトルをマスクとして使用して、入力ベクトルが第５の出力ベクトルに圧縮される。ステップ６３０では、ヒストグラム配列から第６の出力ベクトルへ集めるために、第５の出力ベクトルの要素の値がインデックスとして使用される。ステップ６３５では、第６の出力ベクトルの要素の値と第４の出力ベクトルの値とを加算することによって、第７の出力ベクトルが生成される。ステップ６４０では、第５の出力ベクトルの要素の値をインデックスとして使用して、第７の出力ベクトルの要素の値がヒストグラム配列に分散される。
【００４７】
上述の命令および実装は、Ｒａｄｉｘソートなどのベクトル化されたソートアルゴリズムにおける競合を処理するために使用されてもよい。図７は、入力配列をソートする方法の例示的なフロー図である。第１のステップ７０５では、各値がｚ個のビット数を有する、多くともｍ個の連続値の少なくともｎ個の連続ブロックで構成された多くともｎ×ｍ個の値を有する初期入力配列が提供される。次に、ステップ７１０では、値のビットの複数のｊ個のサブセット（部分集合）が定義される。仮にｋ＝１〜ｊであるサブセットｋのビット数をｚｋとすると、ｚ１＋ｚ２＋．．．＋ｚｊ＝ｚであり、サブセットｋ−１（ｋ＝２〜ｊ）の全てのビットはサブセットｋの全てのビットをはるかに下回る。さらに、ｋは０に設定される。次に、ステップ７１５では、ｋがｋ＋１に設定される。次に、ステップ７２０では、ヒストグラム配列が、自身の全ての値をゼロに設定することによってリセットされる。ステップ７２７では、ｉが１に設定される。次いで、ステップ７３０では、第８の出力ベクトルの値がｉ番目のブロックの値に等しく設定される一方で、第８の出力ベクトルにおいて前記値が入力配列内で有した連続的な順序が維持される。ステップ７３５では、入力ベクトルの各要素の値が、同一のインデックスを有する第８の出力ベクトル内の要素の値のビットのｋ番目のサブセットに等しく設定される。ステップ７４０では、図６を参照して説明した方法によって、ヒストグラム配列が入力ベクトルを用いて更新されてもよい。ここで、ステップ７４５では、処理は、ｎ個のブロックの全てが処理されたかどうか、すなわちｉ＝ｎであるかどうかを確認する。そうでなければ、ステップ７２５において、ｉがｉ＋１に等しく設定され、ステップ７３０からｉ＝ｎとなるまで処理が繰り返される。次に、ステップ７５０では、ヒストグラム配列のプレフィックス和が生成され、ｉが１に設定される。プレフィックス和の第１の要素の値がゼロに等しく設定され、プレフィックス和の残りの各要素の値が、プレフィックス和において先行インデックスを有する要素の値と、同じ先行インデックスを有するヒストグラム配列の要素の値とを加算した合計と等しく設定される。次いで、ｉ＝ｎとなるまで以下の処理が繰り返され、ステップ７６０では、第８の出力ベクトルの値がｉ番目のブロックの値に等しく設定される一方で、第８の出力ベクトルにおいて前記値が入力配列内で有した連続的な順序が維持される。ステップ７６２では、入力ベクトルの各要素の値が、同一のインデックスを有する第８の出力ベクトル内の要素の値のビットのｋ番目のサブセットに等しく設定される。ステップ７６４およびステップ７６５では、ＶＰＩ命令およびＶＬＵ命令は、第１および第２の出力ベクトルを生成するために使用される。ＶＰＩ命令およびＶＬＵ命令は、図１，２，３および３ａを参照して本明細書で開示される例によって実施されてもよい。ステップ７６６では、プレフィックス和から集めるために、入力ベクトルの要素の値をインデックスとして使用して第９の出力ベクトルが生成される。ステップ７６８では、第１の出力ベクトルの要素の値を第９の出力ベクトルの要素の値に加算することによって、第１０の出力ベクトルが生���される。ステップ７７０では、第２の出力ベクトルをマスクとして使用して、第１０の出力ベクトルが第１１の出力ベクトルに圧縮される。ステップ７７２では、第１２の出力ベクトルを生成するために、第１１の出力ベクトルの要素の値に１が加算される。ステップ７７４では、第２の出力ベクトルをマスクとして使用して、入力ベクトルが第１３の出力ベクトルに圧縮される。ステップ７７６では、第１３の出力ベクトルの要素の値をインデックスとして使用して、第１２の出力ベクトルの要素の値がプレフィックス和に分散される。ステップ７７８では、第１０の出力ベクトルの要素の値をインデックスとして使用して、第８の出力ベクトルの要素の値が出力配列に分散される。ステップ７８０では、ｉ＝ｎであるかどうかが確認される。ｉ＝ｎであれば、ステップ７８２において、入力配列が出力配列と等しく設定される。そうでなければ、処理がステップ７５５から繰り返され、ここで、ｉがｉ＝ｎになるまで１だけインクリメントされる。最後に、ステップ７８４では、ｋ＝ｊであるかどうかが確認される。そうであれば、ステップ７８６において、出力配列がソートされた初期入力配列として提供される。そうでなければ、ステップ７１５からｋ＝ｊとなるまで処理が繰り返される。
【００４８】
図８は、ｉ＝１およびｋ＝１の場合に提案されたソートアルゴリズムの例の高レベルの概観を示す図である。ステップ８０５およびステップ８１０では、入力が反復的にロードされ、ヒストグラム配列が入力のビットの第１のサブセット（部分集合）について作成される。ステップ８０５では、入力がベクトル（ｖ）にロードされ、これらの値のビットの第１のサブセットが選択される。ステップ８０５は、図７のステップ７３０および７３５に対応する。ステップ８１０では、ヒストグラム配列を更新するために、選択されたビットのベクトルが使用される。ステップ８１０は、図７のステップ７４０に対応する。ステップ８０５および８１０は、入力配列の残りのブロック（図示せず）について繰り返される。次のステップ８１５では、プレフィックス和がヒストグラム配列にわたって行われる。ステップ８１５は、図７のステップ７５０に対応する。ステップ８２０，８２５および８３０では、入力配列全体が再びロードされ、プレフィックス和によって決定されたインデックスを含む出力配列に分散される。ステップ８２０では、入力は、ステップ８０５と同一の方法でベクトルに再ロードされ、ビットの同じサブセットが選択される。ステップ８２０は、図７のステップ７６０および７６２に対応する。次に、ステップ８２５では、選択されたビットは、プレフィックス和へ読み込まれかつインクリメントされるインデックスである。プレフィックス和が更新される。プレフィックス和からロードされた値は、計算された先行インスタンスに従って修正され、次のステップ８３０で使用されるベクトル（オフセット）に格納される。ステップ８２５は、ステップ７６４〜７７６に対応する。最後に、ステップ８３０では、ベクトルｖの要素の値を出力配列に分散するためにオフセットの要素の値がインデックスとして使用される。ステップ８３０は、図７のステップ７７８に対応する。ステップ８２０，８２５および８３０は、入力配列の残りのブロック（図示せず）について繰り返される。
【００４９】
本明細書では多くの特定の実施形態および実施例のみが開示されているが、当業者であれば、他の代替実施形態および／または使用、明らかな変更および均等物が可能であることを理解するであろう。さらに、本開示は、記載の特定の実施形態の全ての可能な組み合わせを包含している。したがって、本開示の範囲は、特定の実施形態によって限定されるべきではない。
【００５０】
さらに、図面を参照して説明された例は、計算装置／システムおよび計算装置／システムで実行される処理を含むが、本開示はまた、コンピュータプログラム、特にシステムを実用化するように適合された、キャリア上の、またはキャリア内のコンピュータプログラムにまで及ぶ。
【図１】
0006615209.tif 000002
【図１ａ】
0006615209.tif 000003
【図２】
0006615209.tif 000004
【図２ａ】
0006615209.tif 000005
【図３】
0006615209.tif 000006
【図３ａ】
0006615209.tif 000007
【図４】
0006615209.tif 000008
【図５】
0006615209.tif 000009
【図６】
0006615209.tif 000010
【図７】
0006615209.tif 000011
【図８】
0006615209.tif 000012