(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6615209
(24)【登録日】2019年11月15日
(45)【発行日】2019年12月4日
(54)【発明の名称】ソートへの応用を伴うベクトル内の反復値の複数のインスタンスを発見するための方法および装置
(51)【国際特許分類】
G06F 17/16 20060101AFI20191125BHJP
G06F 7/24 20060101ALI20191125BHJP
【FI】
G06F17/16 L
G06F7/24 A
【請求項の数】14
【全頁数】17
(21)【出願番号】特願2017-539601(P2017-539601)
(86)(22)【出願日】2015年2月5日
(65)【公表番号】特表2018-510401(P2018-510401A)
(43)【公表日】2018年4月12日
(86)【国際出願番号】EP2015052394
(87)【国際公開番号】WO2016124242
(87)【国際公開日】20160811
【審査請求日】2018年1月31日
(73)【特許権者】
【識別番号】513231100
【氏名又は名称】バルセロナ スーパーコンピューティング センター − セントロ ナシオナル デ スーパーコンピュータシオン
(74)【代理人】
【識別番号】110000659
【氏名又は名称】特許業務法人広江アソシエイツ特許事務所
(72)【発明者】
【氏名】ヘイズ,ティモシー
(72)【発明者】
【氏名】パロマー ペレス,オスカー
(72)【発明者】
【氏名】アンサル,オスマン
(72)【発明者】
【氏名】クリスタル ケステルマン,エイドリアン
(72)【発明者】
【氏名】ヴァレロ コーテス,マテオ
【審査官】
大桃 由紀雄
(56)【参考文献】
【文献】
米国特許出願公開第2011/0010509(US,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 17/16
G06F 7/24
(57)【特許請求の範囲】
【請求項1】
データセットに属する複数の値を処理するベクトル処理システムにおいて、該ベクトル処理システムは、各要素に割り当てられた固有のインデックスを含む多数の要素を有する少なくとも1つの入力ベクトルを含み、前記インデックスは昇順に割り当てられ、該昇順は前記入力ベクトル内の前記要素の位置に対応し、単一命令複数データ(SIMD)指令として実行される、前記入力ベクトル内の反復値の複数のインスタンスを発見する方法であって、
前記値を前記入力ベクトルにロードするステップと、
前記入力ベクトルの各要素を選択するステップと、
前記選択された要素の一致数を計算するために、各選択された要素を、前記選択された要素のインデックスよりも低いインデックスを有する前記入力ベクトルの全ての要素と比較するステップであって、一致数が、前記選択された要素と同じ値を有する前記要素の数である、比較するステップと、
前記入力ベクトルと同じ数の要素の第1の出力ベクトルおよび同一のインデックスを生成するステップとを含み、前記入力ベクトルの各要素が、同一のインデックスを有する前記第1の出力ベクトルの前記要素に対応し、
前記第1の出力ベクトルの各要素が、前記入力ベクトルの対応する要素について計算された一致数に等しい値を有する、方法。
【請求項2】
前記第1の出力ベクトルの要素の値をゼロに等しく設定するステップと、
前記入力ベクトルの選択された要素ごとに、
前記選択された要素の前記インデックスよりも低いインデックスを有する前記入力ベクトル内の要素ごとに、
一致を識別するために、前記選択された要素の前記値を、前記選択された要素の前記インデックスよりも低いインデックスを有する前記入力ベクトル内の前記要素の前記値と比較するステップとをさらに含み、
第1の出力ベクトルを生成するステップは、
前記比較が一致を識別した場合に、前記選択された要素に対応する前記第1の出力ベクトルの前記要素の前記値を1だけインクリメントする、請求項1に記載の方法。
【請求項3】
前記入力ベクトルと同じ数の要素の第2の出力ベクトルおよび同一のインデックスを生成するステップをさらに含み、前記入力ベクトルの各要素が、同一のインデックスを有する第2の出力ベクトルの要素に対応し、
前記入力ベクトルの対応する要素が、対応する要素の前記インデックスよりも高いインデックスを有する前記入力ベクトルの要素の値と等しい値を有していない限り、第2の出力ベクトルの各要素の値が第1の値に等しく設定され、前記入力ベクトルの対応する要素が、対応する要素の前記インデックスよりも高いインデックスを有する前記入力ベクトルの要素の値と等しい値を有している場合、前記第2の出力ベクトルの前記要素の前記値が第2の値に等しく設定される、請求項1または2に記載の方法。
【請求項4】
前記第2の出力ベクトルはベクトルマスクである、請求項3に記載の方法。
【請求項5】
各エントリが少なくともキーフィールド、カウントフィールドおよび有効フィールドを含む、前記入力ベクトルの要素の数に等しいエントリ数を有する連想記憶メモリ(CAM)を使用するステップであって、
エントリが、有効フィールドが第3の値に等しく設定された場合に有効であり、第4の値に等しく設定された場合に有効でない、連想記憶メモリ(CAM)を提供するステップと、
全てのエントリの前記有効フィールドを前記第4の値に等しく設定するステップと、
前記入力ベクトルの各要素をインデックスの昇順に選択するステップとをさらに含み、
各選択された要素を前記選択された要素のインデックスよりも低いインデックスを有する前記入力ベクトルの全ての要素と比較するステップは、
前記選択された要素の前記値と等しいキーフィールドを有する一致するエントリを識別するか、そうでない場合は、新規の有効なエントリを生成するために、選択された要素の値を全ての有効なエントリのキーフィールドと比較するステップを含み、
一致するエントリが識別されると、
前記選択された要素に対応する前記第1の出力ベクトルの前記要素の前記値が、前記一致するエントリのカウントフィールドに等しく設定され、
前記一致する前記エントリのカウントフィールドが1だけインクリメントされ、
一致が発見されず、新規の有効なエントリが生成されると、
無効なエントリが選択され、
前記選択されたエントリの前記有効フィールドが前記第3の値に設定され、
前記選択されたエントリの前記キーフィールドが、前記選択された要素の前記値と等しく設定され、
前記選択された要素に対応する前記第1の出力ベクトルの前記要素の値はゼロに等しく設定され、その後、
前記選択されたエントリの前記カウントフィールドが1に設定される、請求項1〜4のいずれか一項に記載の方法。
【請求項6】
各エントリは最終インデックスフィールドをさらに含み、一致するエントリが識別されると、一致するエントリの最終インデックスフィールドが更新されるか、又は、新規の有効なエントリが生成されると、新規の有効なエントリの最終インデックスフィールドが更新される、請求項5に記載の方法。
【請求項7】
全ての要素の前記最終インデックスフィールドを更新した後、前記方法は、第2の出力ベクトルを生成するステップをさらに含み、
有効なエントリの前記最終インデックスフィールドに等しいインデックスを有する前記第2の出力ベクトルの各要素の前記値は第1の値と等しく設定され、そうでない場合は第2の値と等しく設定される、請求項6に記載の方法。
【請求項8】
前記入力ベクトルの複数の要素は選択され、かつ並列に処理される、請求項5〜7のいずれか一項に記載の方法。
【請求項9】
前記入力ベクトルの複数の要素を同時に選択するステップと、
前記同時に選択された値を互いに比較するステップと、
前記比較が一致を全く識別しない場合、前記複数の値を並列に処理するステップとを含む、請求項8に記載の方法。
【請求項10】
前記第1の出力ベクトルの要素を選択し、かつ、第3の出力ベクトルを生成するために、第2の出力ベクトルを前記第1の出力ベクトル上のマスクとして使用するステップをさらに含む、請求項5〜9のいずれか一項に記載の方法。
【請求項11】
前記第3の出力ベクトルを生成するステップは、
第1の値を有する前記第2の出力ベクトルの要素を識別するステップと、
前記第1の値を有する前記第2の出力ベクトルの前記要素をマスクとして使用して、前記第1の出力ベクトルを前記第3の出力ベクトルに圧縮するステップと
を含む、請求項10に記載の方法。
【請求項12】
ヒストグラム配列を初期化するステップと、
第4の出力ベクトルを生成するために前記第3の出力ベクトルの前記要素の値に1を加算するステップと、
前記第2の出力ベクトルをマスクとして使用して前記入力ベクトルを第5の出力ベクトルに圧縮するステップと、
ヒストグラム配列から第6の出力ベクトルへ集めるために前記第5の出力ベクトルの前記要素の前記値をインデックスとして用いるステップと、
前記第6の出力ベクトルの前記要素の前記値および前記第4の出力ベクトルの前記要素の前記値を加算することによって第7の出力ベクトルを生成するステップと、
前記第7の出力ベクトルの前記要素の前記値を前記ヒストグラム配列に分散するために、前記第5の出力ベクトルの前記要素の前記値をインデックスとして使用するステップとによって、
前記ヒストグラム配列をインクリメントするために前記第3の出力ベクトルを使用するステップをさらに含む、請求項11に記載の方法。
【請求項13】
メモリとプロセッサとを備える計算装置であって、前記メモリは、前記プロセッサによって実行可能なコンピュータプログラム命令を格納し、前記命令は、請求項1〜12のいずれか一項に記載の方法を実行する機能を含む、計算装置。
【請求項14】
請求項1〜12のいずれか一項に記載の方法を計算装置に実施させるための命令を含むプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、コンピュータ科学に関し、より具体的には、ベクトル内の反復値の複数のインスタンスを発見するための方法および装置、ならびにソートアルゴリズムにおけるそれらの応用に関する。
【背景技術】
【0002】
単一命令複数データ(SIMD)は、並列コンピュータの類である。SIMDは、複数のデータ点で同じ操作を同時に実行する複数の処理要素を含むコンピュータを表している。したがって、そのようなマシンはデータレベル並列性(DLP)を利用する。すなわち、同時(並列)計算が存在するが、所与の時点においては単一の制御処理(命令)のみが存在する。SIMD命令は、SIMDおよびベクトル・アーキテクチャで使用される(非特許文献1を参照)。SIMD命令セットは、DLPを加速する効率的な方法を提供する。SIMD命令のサポートを提供する特定の方法は、ベクトル処理システム、すなわちベクトル・アーキテクチャを使用するコンピュータシステムを介したものである。この特許は、「ベクトル」および「SIMD」という用語を同じ意味で使用する。
【0003】
ベクトル処理システムは、単一の命令で複数の値を処理するように構成されたシステムである。ベクトル処理システムは、各要素に割り当てられた固有のインデックスを含む多数の要素を各々が有する、多数のベクトルまたはベクトルレジスタを含んでもよい。インデックスは昇順に割り当てられてもよく、この昇順は、ベクトル内の要素の位置に対応する。SIMD命令を使用したアルゴリズムを実装することは、アルゴリズムのベクトル化と見なすことができる。
【0004】
ソートは、コンピュータ科学において広く研究されている問題であり、科学計算およびデータベース管理システムを含む多くのサブフィールドでは、単純な基礎的要素である。
【0005】
基数ソートは、非比較数値ソートアルゴリズムである。Zaghaら(非特許文献2)は、基数ソートをベクトル化する方法が提案した。ベクトル化された基数ソートアルゴリズムでは、索引アクセスを使用してデータを配列に格納する必要がある。索引アクセスでは、要素は、第2のベクトルの内容によって示される要素のアドレスで、メモリ内の任意の位置に配置されてもよい。これは、ロードの形態で集まることが知られている。したがって、分散という用語は、それぞれその格納形式において使用される。分散の操作中に、同じベクトル内の複数の要素が同じメモリ位置を索引することがあり、したがって競合が発生する。この競合を防止するために、ベクトル化された基数ソートは、それ自体が欠点である関連する配列を複製する。この手法のもう一つの主な欠点は、ソートされた配列を非連続(ストライド)パターンでアクセスする必要があることである。
【0006】
Cray X1(商標)システムなどのマイクロプロセッサアーキテクチャによって使用される既存のSIMD命令セット(例えば、「Cray Assembly Language (CAL) for Cray X1(商標)Systems Reference Manual, S−2314−51」、2003年10月、第7.7章、「Vector Register Instructions」を参照)は、そのような競合を処理するための直接的な解決策を提供していない。当業者であれば、ベクトル化された基数ソートが、配列に分散する際の競合を回避する必要があるアルゴリズムの一例に過ぎないことを理解するであろう。他のアルゴリズムをベクトル化するために、配列へ分散する際に競合を回避する必要もある。
【0007】
新規のSIMD命令、および、新規のSIMD命令の使用との競合を回避するベクトル化されたソートアルゴリズムを提供することが望ましい。
【先行技術文献】
【非特許文献】
【0008】
【非特許文献1】Flynn著、「Some Computer Organizations and Their Effectiveness」、論文誌IEEE Transactions On Computers、第C−21巻第9号、1972年9月発行
【非特許文献2】M. ZaghaおよびG.E.Blelloch著、「Radix Sort for Vector Multiprocessors」、1991年ACM / IEEE Conference on Supercomputing会報、Supercomputing シリーズ’91、1991年、712〜721頁
【発明の概要】
【発明が解決しようとする課題】
【0009】
SIMD命令セットアーキテクチャ(ISA)に含まれる2つの新規の命令が提案され、これらの命令をハードウェアにおいて実現する2つの異なる方法も提案される。その後、新規の命令を利用するソートアルゴリズムが提案される。
【課題を解決するための手段】
【0010】
第1の態様によれば、データセット(データの集合)に属する複数の値を処理するように構成されたベクトル処理システムでは、入力ベクトル内の反復値の複数のインスタンス(事象、事実)を発見する方法が開示される。この方法は、以降に入力ベクトルと呼ぶベクトルに値をロードすることを含む。入力ベクトルの各要素は選択され、次いで選択された要素のインデックスよりも低いインデックスを有する入力ベクトルの全ての要素と比較され、選択された要素の一致数が計算される。一致数は、選択された要素と同じ値を有する要素の数である。次に、入力ベクトルと同じ数の要素および同一のインデックスを有する第1の出力ベクトルが生成される。入力ベクトルの各要素は、同一のインデックスを有する第1の出力ベクトルの要素に対応する。第1の出力ベクトルの各要素は、入力ベクトルの対応する要素について計算された一致数に等しい値を有する。
【0011】
前述の方法を使用して、入力ベクトルの対応する要素における値のインスタンス(状態)が、より低いインデックスを有する入力ベクトルの要素にいくつ存在するかを正確にアサートすることが可能である。この方法は、新規のSIMD命令として実施してもよい。本明細書で開示される新規のSIMD命令は、以後、ベクトル先行インスタンス(VPI:Vector Prior Instances)と呼ばれる。
【0012】
いくつかの実施例では、この方法は、最初に第1の出力ベクトルの要素の値をゼロに等しく設定するステップをさらに含んでもよい。次に、入力ベクトルの各選択された要素ごとに、および、選択された要素のインデックスよりも低いインデックスを有する入力ベクトルの要素ごとに、選択された要素の値を、選択された要素のインデックスよりも低いインデックスを有する入力ベクトル内の要素の値と比較して一致を識別してもよい。第1の出力ベクトルを生成するステップは、前記比較が一致を識別した場合に、選択された要素に対応する第1の出力ベクトルの要素の値を1だけインクリメントするステップを含んでもよい。これらのVPIの実装は、入力ベクトルの要素の数に比例して線形的に変化しないので、限られた数の要素を含む入力ベクトルに適している場合がある。
【0013】
いくつかの例では、この方法は、入力ベクトルの要素の値を互いに比較して等しい値を識別し、前記比較に応答して、入力ベクトルと同じ数の要素の第2の出力ベクトルおよび同一のインデックスを生成することをさらに含んでもよい。そこで、入力ベクトルの各要素は、同一のインデックスを有する第2の出力ベクトルの要素に対応してもよい。入力ベクトルの対応する要素が、対応する要素のインデックスよりも高いインデックスを有する入力ベクトルの要素の値と等しい値を有していない限り、第2の出力ベクトルの各要素の値を第1の値に等しく設定してもよい。次に、第2の出力ベクトルの前記要素の値を第2の値に等しく設定してもよい。
【0014】
したがって、第2の出力ベクトルでは、入力ベクトルの要素に存在する全ての値の最終インスタンスをマークすることが可能である。第2の出力ベクトルは、ベクトルマスクと見なすことができる。この方法も同様に、新規のSIMD命令として実施してもよい。本明細書で開示されるこの新規の命令は、以後、ベクトルラストユニーク(VLU:Vector Last Unique)と呼ばれる。なお、本明細書で開示される2つの命令(VPIおよびVLU)を、様々なアルゴリズムをベクトル化するために独立してまたは一緒に使用することができる。
【0015】
いくつかの実装では、この方法は、入力ベクトルの要素の数に等しい数のエントリを有する連想記憶メモリ(CAM:Content Addressable Memory)を提供することをさらに含んでもよい。CAMの各エントリは、少なくとも1つのキーフィールド、カウントフィールド、および有効フィールドを含んでもよい。エントリは、その有効フィールドが第3の値に等しく設定された場合に有効であると見なされ、第4の値に等しく設定された場合に有効でないと見なされる。この方法は、最初に全てのエントリの有効フィールドを第4の値に等しく設定することをさらに含んでもよい。次に、入力ベクトルの各要素は、インデックスの昇順に選択される。次に、選択された各要素を全ての有効なエントリのキーフィールドと比較して、選択された要素の値と等しいキーフィールドを有する一致するエントリを識別するか、そうでない場合は、新規の有効なエントリを生成してもよい。一致するエントリが識別されると、選択された要素に対応する第1の出力ベクトルの要素の値を、一致するエントリのカウントフィールドに等しく設定してもよい。次に、一致するエントリのカウントフィールドを1だけインクリメントしてもよい(増やしてもよい)。新規の有効なエントリが生成されると、無効なエントリを最初に選択してもよい。次に、選択されたエントリの有効フィールドを第3の値に等しく設定してもよい。続いて、選択されたエントリのキーフィールドを、選択された要素の値と等しく設定してもよい。次のステップでは、選択された要素に対応する出力ベクトルの要素の値をゼロに等しく設定してもよい。最後に、選択されたエントリのカウントフィールドを1に設定してもよい。
【0016】
これらのVPI命令の実装は、入力ベクトルの要素の数に比例して線形的に変化するCAMを使用する。
【0017】
いくつかの例では、CAMの各エントリは最終インデックスフィールドをさらに含んでもよい。最終インデックスフィールドは、一致するエントリが識別されるたびに、かつ、新規の有効なエントリが生成されるたびに更新されてもよい。更新された最終インデックスフィールドは、選択された要素のインデックスと等しく設定されてもよい。全ての要素について最終インデックスフィールドを更新した後、有効なエントリの最終インデックスフィールドに等しいインデックスを有する第2の出力ベクトルの各要素の値を第1の値と等しく設定し、残りの値を第2の値と等しく設定して、第2の出力ベクトルを生成してもよい。
【0018】
したがって、最終インデックスフィールドの更新は、第1の出力ベクトルが生成されるのと同時に行われてもよい。その後、第2の出力ベクトルの生成は単一のステップを必要とする。
【0019】
いくつかの例では、入力ベクトルの複数の要素を選択して並列に処理してもよい。これは、CAM構造のポートの数を増加させることによって行うことができる。したがって、処理をさらに加速することができる。このような並列処理は、入力ベクトルの複数の隣接する要素を同時に選択することと、同時に選択された値を互いに比較することと、前記比較が一致を全く識別しない場合、複数の値を並列に処理することとを含んでもよい。そうでない場合、選択された複数の値に対して並列ではなく逐次的に処理を進めることができる。前記比較が一致を識別しない場合にのみ並列に処理することにより、並列処理中にエラーが引き起こされず、すなわち予測不可能な出力が提供されないので出力が正確であることが保証される。
【0020】
いくつかの例では、第1の出力ベクトルの要素を選択し、かつ、第3の出力ベクトルを生成するために、第2の出力ベクトルを第1の出力ベクトル上のマスクとして使用してもよい。第3の出力ベクトルを生成することは、第1の値を有する第2の出力ベクトルの要素を識別することと、第1の値を有する第2の出力ベクトルの要素をマスクとして使用して、第1の出力ベクトルを第3の出力ベクトルに圧縮することとを含んでもよい。本明細書で使用する「圧縮」という用語は、KrsteAsanovi?著、「Vector Microprocessors」、博士論文、1998年、カリフォルニア大学バークレー校、セクション2.2.2(Asanovi?、1998年)に定義されているベクトル圧縮命令を指す。すなわち、圧縮命令は、入力ベクトル(ソースベクトルレジスタ)から出力ベクトル(目標ベクトルレジスタ)の開始点の連続要素までマスクレジスタによって示される位置の要素を圧縮する。そこで、マスクされた命令が全体を通して使用されている場合よりも効率的に、要素を後続のベクトル命令で処理することができる。
【0021】
いくつかの例では、第3の出力ベクトルを使用してヒストグラム配列をインクリメントしてもよい。ヒストグラム配列は、要素の配列である。これらの要素の各々はビンとして知られている。各ビンは、ビンIDとして知られる固有の識別子を有する。ヒストグラム配列を所与の配列で更新する場合、ヒストグラム配列のビンの内容は、前記ビンのビンIDに等しい値を含む所与の配列の要素の数だけインクリメントされる。
【0022】
所与の配列としての入力ベクトルによってヒストグラム配列をインクリメントするために、第3の出力ベクトルの要素の値に1を加算して第4の出力ベクトルを生成してもよい。次に、第2の出力ベクトルをマスクとして使用して、入力ベクトルを第5の出力ベクトルに圧縮してもよい。次に、ヒストグラム配列から第6の出力ベクトルへ集めるために、第5の出力ベクトルの要素の値をインデックスとして使用してもよい。続いて、第6の出力ベクトルの要素の値を第4の出力ベクトルの値に加算することによって、第7の出力ベクトルを生成してもよい。最後に、第5の出力ベクトルの要素の値をインデックスとして使用して、第7の出力ベクトルの要素の値をヒストグラム配列に分散してもよい。
【0023】
別の態様では、ソート方法が開示される。多くともm個の連続値の少なくともn個の連続ブロックで構成された多くともn×m個の値を有する初期入力配列を提供することができる。各値は、z個のビット数を有してもよい。値のビットの複数のj個のサブセットを定義することができる。仮にk=1〜jであるサブセットkのビット数をz
kとすると、z
1+z
2+...+z
j=zであり、k=2〜jであるサブセットk−1の全てのビットはサブセットkの全てのビットをはるかに下回る。次に、k=1から連続した順序で開始して、k=1〜jであるビットkのサブセットごとに以下のステップを繰り返すことができ、これらステップは、まず、ヒストグラム配列をリセットしてその全ての値をゼロに設定する。次に、i=1から連続した順序で開始して、i=1〜nであるブロックiごとに以下のステップを繰り返すことができ、これらステップは、まず、少なくともm個の要素の第8の出力ベクトルの値をブロックiの値と等しく設定する一方で、第8の出力ベクトルにおいて前記値が入力配列内で有した連続的な順序を維持し、次に、入力ベクトルの各要素の値を、同一のインデックスを有する第8の出力ベクトル内の要素の値のビットのサブセットkに等しく設定し、次に、ここに開示されている例示的な方法によって、および命令VPIおよびVLUを使用して、ヒストグラム配列を更新してもよい。次に、全てのブロックが処理された後、ヒストグラム配列のプレフィックス和を生成してもよい。プレフィックス和の第1の要素の値をゼロに等しく設定し、プレフィックス和の残りの各要素の値を、プレフィックス和において先行インデックスを有する要素の値と、同じ先行インデックスを有するヒストグラム配列の要素の値とを加算した合計と等しく設定してもよい。次に、i=1から連続した順序で開始して、i=1〜nであるブロックiごとに以下のステップを反復することができ、これらステップは、第8の出力ベクトルの値をブロックの値と等しく設定する一方で、第8の出力ベクトルにおいて前記値が入力配列内で有した連続的な順序を維持してもよく、入力ベクトルの各要素の値を、同一のインデックスを有する第8の出力ベクトル内の要素の値のビットのサブセットkに等しく設定してもよく、ここに開示されている例示的な方法によって、および命令VPIおよびVLUを使用して、第1の出力ベクトルおよび第2の出力ベクトルを生成してもよく、プレフィックス和から集めるために入力ベクトルの要素の値をインデックスとして使用して第9の出力ベクトルを生成してもよく、第1の出力ベクトルおよび第9の出力ベクトルの要素の値を加算して第10の出力ベクトルを生成してもよく、第2の出力ベクトルをマスクとして使用して第10の出力ベクトルを第11の出力ベクトルに圧縮してもよく、第12の出力ベクトルを生成するために第11の出力ベクトルの要素の値に1を加算してもよく、第2の出力ベクトルをマスクとして使用して入力ベクトルを第13のベクトルに圧縮してもよく、第12の出力ベクトルの要素の値をプレフィックス和に分散するために第13のベクトルの要素の値をインデックスとして使用してもよく、第8の出力ベクトルの要素の値を出力配列に分散するために第10の出力ベクトルの要素の値をインデックスとして使用してもよい。次に、全てのブロックが処理された後、入力配列を出力配列と等しく設定してもよい。最後に、ビットの全てのサブセットが処理された後、出力配列をソートされた初期入力配列として提供してもよい。
【0024】
VPI、VLU命令を使用して、提案されたソートアルゴリズムは効率的にベクトル化することが可能である。VPIおよびVLUを使用しない場合、基数ソートアルゴリズムをベクトル化する唯一の既知の方法では、ヒストグラム配列を複製する必要がある。これには、性能が大幅に低下するいくつかの結果があり、そのうちの1つは、大きなストライドアクセスパターンの使用である。VPI、VLU命令では、より効率的なユニットストライドアクセスが代わりに使用される。
【0025】
いくつかの例では、z
k=bである場合、ヒストグラム配列は2
bビンを含んでもよい。例えば、z
k=2である場合、ヒストグラム配列は2
2ビンを含んでもよい。
【0026】
別の態様では、計算装置が開示される。計算装置は、メモリおよびプロセッサを備えてもよい。メモリは、プロセッサによって実行可能なコンピュータプログラム命令を格納することができる。前記命令は、本明細書で開示された実施例による方法を実行する機能を含んでもよい。
【0027】
さらに別の態様では、コンピュータプログラム製品が開示される。コンピュータプログラム製品は、本明細書で開示された実施例による方法を計算装置に実施させるための命令を含んでもよい。
【0028】
コンピュータプログラム製品は、記憶媒体(例えば、CD−ROM、DVD、USBドライブ、コンピュータメモリ、または読み取り専用メモリ)上に、または、キャリア信号(例えば、電気的または光学的キャリア信号)上に具現化されてもよい。
【0029】
コンピュータプログラムは、ソースコード、オブジェクトコード、コード中間ソース、部分的にコンパイルされた形式または処理の実施における使用に適した他の任意の形式などのオブジェクトコードの形式であってもよい。キャリアは、コンピュータプログラムを送信することができる任意のエンティティまたは装置であってもよい。
【0030】
例えば、キャリアは、ROM、例えばCD−ROMまたは半導体ROM、または例えばハードディスクなどの磁気記録媒体などの記憶媒体を含んでもよい。さらに、キャリアは、電気信号または光信号などの伝送可能なキャリアであってもよく、電気ケーブルまたは光ケーブルを介して、または無線または他の手段によって伝達されてもよい。
【0031】
コンピュータプログラムが、ケーブルまたは他の装置あるいは他の手段によって直接伝達することができる信号に具体化される場合、キャリアは、そのようなケーブルまたは他の装置あるいは他の手段によって構成されてもよい。
あるいは、キャリアは、コンピュータプログラムが埋め込まれた集積回路であってもよく、集積回路は、関連する方法を実行するために、または関連する方法の実行において使用されるように適合される。
【0032】
本発明の実施例の追加の目的、利点および特徴は、説明を検討する際に当業者に明らかになるか、または本発明の実施によって習得されるであろう。
【図面の簡単な説明】
【0033】
【
図1】ベクトルの先行インスタンスを計算する方法の例示的なフロー図である。
【
図1a】VPI命令の意味論の例示的な一例を示す図である。
【
図2】ベクトルの最終の固有インスタンスを計算する方法の例示的なフロー図である。
【
図2a】VLU命令の意味論の例示的な一例を示す図である。
【
図3】連想記憶メモリ(CAM)を使用してベクトルの先行インスタンスを計算する方法の例示的なフロー図である。
【
図3a】VPIが計算された後に連想記憶メモリ(CAM)を使用して、ベクトルの最終の固有インスタンスを計算する方法の例示的なフロー図である。
【
図4】CAMメモリを使用してVPIを計算するための実施例を示す図である。
【
図5】2つの並列経路(またはレーン)を使用した並列最適化を示す図である。
【
図6】入力ベクトルの値を用いてヒストグラム配列を更新する方法の例示的なフロー図である。
【
図7】入力配列をソートする方法の例示的なフロー図である。
【
図8】i=1およびk=1の場合に提案されたソートアルゴリズムの例の高レベルの概観を示す図である。
【発明を実施するための形態】
【0034】
図1は、ベクトル(ベクター、一次元配列)の先行インスタンスを計算する方法の例示的なフロー図である。第1のステップ110では、以降に入力ベクトルと呼ぶベクトル処理システムのベクトル(配列)に値がロードされる(入力される、取り込まれる)。次に、ステップ115では、一致したかどうかを識別するために、入力ベクトルの各要素が選択されて、選択された要素のインデックスよりも低いインデックスを有する入力ベクトルの全ての要素と比較される。ステップ120では、各選択された要素に対する一致数が計算される。一致数(適合数)は、選択された要素と同じ値を有する選択された要素のインデックスよりも低いインデックスを有する要素の数である。ステップ125では、第1の出力ベクトルが生成される。第1の出力ベクトルは、入力ベクトルと同じ数の要素および同一のインデックスを有する。さらに、入力ベクトルの各要素は、同一のインデックスを有する第1の出力ベクトルの要素に対応する。第1の出力ベクトルの各要素は、入力ベクトルの対応する要素について計算された一致数に等しい値を有する。一実施例では、これは、比較が一致を識別した場合に、選択された要素に対応する第1の出力ベクトルの要素の値を1だけインクリメントすることによって、第1の出力ベクトルを生成するステップを行うことができる。この実装では、第1の出力ベクトルの要素の値は必ずゼロに等しく、または処理される前にゼロに等しく設定されなければならない。
【0035】
図1aは、VPI命令の意味論の例示的な一例を示す図である。要素は左から右へ処理される。
図1aの例では、値5は、入力ベクトル(in)のインデックス1の位置で初めて発見される。この時点まで、出力ベクトル(out)の全ての要素は0に等しい。次に、インデックス2の位置で値5が2回目に再び発見される。結果として、出力ベクトル(out)のインデックス2の位置は1に設定され、インデックス2の位置にある要素の値の先行インスタンスの数に対応する。次に、インデックス3の位置では、値5は3回目に発見される。結果として、出力ベクトル(out)のインデックス3の位置は2に設定され、インデックス3の位置にある要素の値の先行インスタンスの数に対応する。
【0036】
図2は、ベクトル(ベクター、一次元配列)の最終の固有インスタンスを計算する方法の例示的なフロー図である。第1のステップ210では、以降に入力ベクトルと呼ぶベクトルにm個の値がロードされる。以降に第2の出力ベクトルとして知られる入力ベクトルと同じ数の要素のベクトルが同一のインデックスを有して生成される。入力ベクトルの各要素は、同一のインデックスを有する第2の出力ベクトルの要素に対応する。次に、ステップ210では、eが0に等しく設定される。ステップ225では、入力ベクトルの対応する要素(e番目)が、対応する要素のインデックスよりも高いインデックスを有する入力ベクトルの任意の要素の値と等しい値を有しているかどうかが確認される。NOである場合、ステップ235では、第2の出力ベクトルのe番目の要素の値が第1の値に等しく設定される。YESである場合、ステップ230では、第2の出力ベクトルのe番目の要素の値が第2の値に等しく設定される。ステップ240では、全ての要素が処理されたかどうか、すなわちe=m−1であるかどうかが確認される。YESである場合、VLUが完了したと見なされる245において処理が終了する。NOである場合、eが250においてインクリメントされ、処理が継続する。
【0037】
図2aは、VLU命令の意味論の例示的な一例を示す図である。出力ベクトル(out)は、各要素がビットであるベクトルマスク(vector mask)と見なしてもよい。第1の値は1であってもよく、第2の値は0であってもよい。出力ベクトルのビットは、入力ベクトルにおける対応する値がその後に見られない場合にのみ設定される。これらの事例は、入力ベクトル内で網掛けされている。
図2aの例では、インデックス0,3,6および7の出力ベクトルの要素は、入力ベクトルの要素の値の最終の固有のインスタンス(状態)に対応するので1に設定される。
【0038】
図3は、連想記憶メモリ(CAM)を使用してベクトルの先行インスタンスを計算する方法の例示的なフロー図である。CAMは、入力ベクトルの要素の数(m)に等しい数のエントリを有してもよい。各エントリは、少なくとも1つのキーフィールド、カウントフィールド、および有効フィールドを含んでもよい。エントリは、その有効フィールドが第3の値、例えばYに等しく設定された場合に有効であると見なされ、第4の値に等しく設定された場合、例えばNに等しく設定された場合に有効でないと見なされる。第1のステップ305では、全てのエントリの有効フィールドがNに設定される。また、eが0に等しく設定される。次に、入力ベクトルのe番目の要素が選択される。ステップ310では、選択された要素の値が、全ての有効なエントリのキーフィールドと比較される。ステップ315では、一致するエントリが識別されたかどうか、すなわち、選択された(e番目の)要素の値と等しいキーフィールドをエントリが有しているかどうかが確認される。答えがYESである場合、ステップ325では、選択された要素(e番目)に対応する第1の出力ベクトルの要素の値が、一致するエントリのカウントフィールドに等しく設定される。NOである場合、ステップ320では、新規の有効なエントリが生成される。ステップ325に続いて、ステップ335では、一致するエントリのカウントフィールドが1だけインクリメントされる。その後、処理はステップ355に引き継がれる。ここで、ステップ320では、新規の有効なエントリを生成するために、無効なエントリの有効フィールドが、第3の値、すなわちYに等しく設定される。次に、ステップ330では、選択されたエントリのキーフィールドが、選択されたe番目の要素の値と等しく設定される。ステップ340では、選択された要素(e番目)に対応する出力ベクトルの要素の値がゼロに等しく設定される。ステップ350では、選択されたエントリのカウントフィールドが1に等しく設定される。最後に、ステップ355では、e=m−1であるかどうか、すなわち全ての要素が処理されたかどうかが確認される。答えがYESである場合、処理がステップ365で終了し、VPIが完了したと見なされる。そうでなければ、ステップ360では、eはe+1に等しく設定され、処理はステップ310からの次の要素のために継続する。
【0039】
各エントリは最終インデックスフィールドをさらに含んでもよい。最終インデックスフィールドは、一致するエントリが識別された場合にステップ335の後で、または新規の有効なエントリが生成された場合にステップ320の後のいずれかで、ステップ370で更新されてもよい。その後、更新された最終インデックスフィールドは、選択された要素のインデックスと等しく設定される。
【0040】
図3aは、VPIが計算された後に連想記憶メモリ(CAM)を使用して、入力ベクトルの最終の固有インスタンスを計算する方法の例示的なフロー図を示している。ステップ375では、全ての要素の最終インデックスフィールドが更新されたかどうか、すなわちVPIが完了したかどうかが確認される。そうでなければ、処理はこの条件が満たされるまで待機する。全ての要素について最終インデックスフィールドを更新した後、処理はステップ380に引き継がれる。ステップ380では、第2の出力ベクトルの要素は、第2の値に等しく設定される。ステップ385では、有効なエントリの最終インデックスフィールドの値に等しいインデックスを有する第2の出力ベクトルの各要素が、第1の値に等しく設定される。ステップ390では、VLUは完了したと見なされる。
【0041】
図4は、CAMメモリを使用してVPIを計算するための実施例を示す図である。この図は、命令が完了する前の中間ステップにおける処理の状態を示している。入力ベクトルの8つの要素のうち6つは既に処理されており、出力ベクトルの8つの要素のうち6つが計算される(斑点模様で示されている)。入力ベクトルの7番目の要素が処理されており、出力ベクトルの対応する要素が計算されるところである。
図4に示すCAMメモリは8つのエントリを含む。各エントリは、有効、キー、最終インデックス(図中の最終idx)およびカウントフィールドを含む。図示のステップの間、4つの有効フィールドがYに設定され、残りはNに設定される。ここで、CAMにアクセスするために入力のインデックス6の要素の値9が使用される。値9は、先に処理された要素(インデックス5の要素)において既に発見されているので、インデックス6の入力ベクトルの要素の値と等しいキーフィールドを有する有効なエントリが既に存在する。
【0042】
したがって、有効なエントリのカウントフィールドにある値は、第1の出力ベクトルの7番目の要素に複製される。値9を含むこの点まで発見された入力の要素はまさに1つしかないため、この値は1に等しい。その後、カウントフィールドは1だけインクリメントされ、対応する最終idxフィールドの値は、値9が観測された入力ベクトルの最新のインデックスを参照するので、6に更新される。
【0043】
最終idxフィールドはVPIを計算するために使用されないが、カウントを更新する際にこのフィールドを更新するのは比較的容易であり、この方法では、同じ入力を使用してVPIの後にVLUが実行される場合、最後に行うべきことは、最終idx値の配列をビットマスクに変換することである。これは、比較的少ない周期で行うことができる。
【0044】
上記の処理を最適化する方法は、1998年のAsanovi?の32頁のセクション3.3に定義されているように、複数のレーンを使用して入力ベクトルの複数の要素を並列に選択して処理することである。この実装を複数のレーンに拡張するための1つの明白な障害は、先行インスタンスおよび最終の固有の要素を計算するための方法が連続して定義されることである。入力ベクトルの隣接する要素を、複数のグループに配置してもよい。グループ内の要素を、互いに競合しなければ並列に処理し、そうでない場合は連続して処理してもよい。競合の検出は、1!/(2x(l−2)!比較器が必要であり、ここで、1は対象とされる並列レーンの数、すなわちグループの大きさである。
【0045】
図5は、2つの並列経路(またはレーン)を使用した並列最適化を示す図である。左から右に処理される入力ベクトルがあり、その下にパラレル実装およびシリアル実装の両方の相対的な実行時間を表す2つの時系列がある。時系列の各ブロックは、1つの要素を処理するために必要な時間を表しているが、並列の時系列は、このグループの要素が直列に処理されることを意味する積層ブロックを示している。要素の第1、第3および第4のグループは競合がないので、並行して処理することができる。要素の2番目のグループには競合があり、直列化する必要がある。ハッチングされた箱は、シリアル実装にわたって節約された相対時間を表している。
【0046】
図6は、入力ベクトルの値を用いてヒストグラム配列を更新する方法の例示的なフロー図である。ステップ605では、
図1または
図3を参照して説明したVPI命令を使用して、第1の出力ベクトルが入力ベクトルから生成されてもよい。ステップ610では、
図2または
図3aを参照して説明したVLU命令を使用して、第2の出力ベクトルが入力ベクトルから生成されてもよい。ステップ615では、第2の出力ベクトルをマスクとして使用して、第1の出力ベクトルが第3の出力ベクトルに圧縮される。第1の値を有する第2の出力ベクトルの要素に対応する第1の出力ベクトルの要素が、圧縮命令によって選択される。ステップ620では、第3の出力ベクトルの要素の値に1を加算することによって、第4の出力ベクトルが生成される。ステップ625では、第2の出力ベクトルをマスクとして使用して、入力ベクトルが第5の出力ベクトルに圧縮される。ステップ630では、ヒストグラム配列から第6の出力ベクトルへ集めるために、第5の出力ベクトルの要素の値がインデックスとして使用される。ステップ635では、第6の出力ベクトルの要素の値と第4の出力ベクトルの値とを加算することによって、第7の出力ベクトルが生成される。ステップ640では、第5の出力ベクトルの要素の値をインデックスとして使用して、第7の出力ベクトルの要素の値がヒストグラム配列に分散される。
【0047】
上述の命令および実装は、Radixソートなどのベクトル化されたソートアルゴリズムにおける競合を処理するために使用されてもよい。
図7は、入力配列をソートする方法の例示的なフロー図である。第1のステップ705では、各値がz個のビット数を有する、多くともm個の連続値の少なくともn個の連続ブロックで構成された多くともn×m個の値を有する初期入力配列が提供される。次に、ステップ710では、値のビットの複数のj個のサブセット(部分集合)が定義される。仮にk=1〜jであるサブセットkのビット数をz
kとすると、z
1+z
2+...+z
j=zであり、サブセットk−1(k=2〜j)の全てのビットはサブセットkの全てのビットをはるかに下回る。さらに、kは0に設定される。次に、ステップ715では、kがk+1に設定される。次に、ステップ720では、ヒストグラム配列が、自身の全ての値をゼロに設定することによってリセットされる。ステップ727では、iが1に設定される。次いで、ステップ730では、第8の出力ベクトルの値がi番目のブロックの値に等しく設定される一方で、第8の出力ベクトルにおいて前記値が入力配列内で有した連続的な順序が維持される。ステップ735では、入力ベクトルの各要素の値が、同一のインデックスを有する第8の出力ベクトル内の要素の値のビットのk番目のサブセットに等しく設定される。ステップ740では、
図6を参照して説明した方法によって、ヒストグラム配列が入力ベクトルを用いて更新されてもよい。ここで、ステップ745では、処理は、n個のブロックの全てが処理されたかどうか、すなわちi=nであるかどうかを確認する。そうでなければ、ステップ725において、iがi+1に等しく設定され、ステップ730からi=nとなるまで処理が繰り返される。次に、ステップ750では、ヒストグラム配列のプレフィックス和が生成され、iが1に設定される。プレフィックス和の第1の要素の値がゼロに等しく設定され、プレフィックス和の残りの各要素の値が、プレフィックス和において先行インデックスを有する要素の値と、同じ先行インデックスを有するヒストグラム配列の要素の値とを加算した合計と等しく設定される。次いで、i=nとなるまで以下の処理が繰り返され、ステップ760では、第8の出力ベクトルの値がi番目のブロックの値に等しく設定される一方で、第8の出力ベクトルにおいて前記値が入力配列内で有した連続的な順序が維持される。ステップ762では、入力ベクトルの各要素の値が、同一のインデックスを有する第8の出力ベクトル内の要素の値のビットのk番目のサブセットに等しく設定される。ステップ764およびステップ765では、VPI命令およびVLU命令は、第1および第2の出力ベクトルを生成するために使用される。VPI命令およびVLU命令は、
図1,2,3および3aを参照して本明細書で開示される例によって実施されてもよい。ステップ766では、プレフィックス和から集めるために、入力ベクトルの要素の値をインデックスとして使用して第9の出力ベクトルが生成される。ステップ768では、第1の出力ベクトルの要素の値を第9の出力ベクトルの要素の値に加算することによって、第10の出力ベクトルが生成される。ステップ770では、第2の出力ベクトルをマスクとして使用して、第10の出力ベクトルが第11の出力ベクトルに圧縮される。ステップ772では、第12の出力ベクトルを生成するために、第11の出力ベクトルの要素の値に1が加算される。ステップ774では、第2の出力ベクトルをマスクとして使用して、入力ベクトルが第13の出力ベクトルに圧縮される。ステップ776では、第13の出力ベクトルの要素の値をインデックスとして使用して、第12の出力ベクトルの要素の値がプレフィックス和に分散される。ステップ778では、第10の出力ベクトルの要素の値をインデックスとして使用して、第8の出力ベクトルの要素の値が出力配列に分散される。ステップ780では、i=nであるかどうかが確認される。i=nであれば、ステップ782において、入力配列が出力配列と等しく設定される。そうでなければ、処理がステップ755から繰り返され、ここで、iがi=nになるまで1だけインクリメントされる。最後に、ステップ784では、k=jであるかどうかが確認される。そうであれば、ステップ786において、出力配列がソートされた初期入力配列として提供される。そうでなければ、ステップ715からk=jとなるまで処理が繰り返される。
【0048】
図8は、i=1およびk=1の場合に提案されたソートアルゴリズムの例の高レベルの概観を示す図である。ステップ805およびステップ810では、入力が反復的にロードされ、ヒストグラム配列が入力のビットの第1のサブセット(部分集合)について作成される。ステップ805では、入力がベクトル(v)にロードされ、これらの値のビットの第1のサブセットが選択される。ステップ805は、
図7のステップ730および735に対応する。ステップ810では、ヒストグラム配列を更新するために、選択されたビットのベクトルが使用される。ステップ810は、
図7のステップ740に対応する。ステップ805および810は、入力配列の残りのブロック(図示せず)について繰り返される。次のステップ815では、プレフィックス和がヒストグラム配列にわたって行われる。ステップ815は、
図7のステップ750に対応する。ステップ820,825および830では、入力配列全体が再びロードされ、プレフィックス和によって決定されたインデックスを含む出力配列に分散される。ステップ820では、入力は、ステップ805と同一の方法でベクトルに再ロードされ、ビットの同じサブセットが選択される。ステップ820は、
図7のステップ760および762に対応する。次に、ステップ825では、選択されたビットは、プレフィックス和へ読み込まれかつインクリメントされるインデックスである。プレフィックス和が更新される。プレフィックス和からロードされた値は、計算された先行インスタンスに従って修正され、次のステップ830で使用されるベクトル(オフセット)に格納される。ステップ825は、ステップ764〜776に対応する。最後に、ステップ830では、ベクトルvの要素の値を出力配列に分散するためにオフセットの要素の値がインデックスとして使用される。ステップ830は、
図7のステップ778に対応する。ステップ820,825および830は、入力配列の残りのブロック(図示せず)について繰り返される。
【0049】
本明細書では多くの特定の実施形態および実施例のみが開示されているが、当業者であれば、他の代替実施形態および/または使用、明らかな変更および均等物が可能であることを理解するであろう。さらに、本開示は、記載の特定の実施形態の全ての可能な組み合わせを包含している。したがって、本開示の範囲は、特定の実施形態によって限定されるべきではない。
【0050】
さらに、図面を参照して説明された例は、計算装置/システムおよび計算装置/システムで実行される処理を含むが、本開示はまた、コンピュータプログラム、特にシステムを実用化するように適合された、キャリア上の、またはキャリア内のコンピュータプログラムにまで及ぶ。