(57)【要約】整列処理のひとつであるマージ処理の基本形では、２つの整列済部分データ列の対を入力とし、全体として整列済の１系列のデータ列を出力する。従来この操作の高並列化は困難とされていた。整列済部分データ列対を複数の区画対に分割する方法があれば、主記憶を共有する密結合マルチプロセッサのような均質な構成の並列計算機システムでも高度な並列マージ処理が可能となる。マージ処理の基本は２つの整列済部分データ列の対を入力し一つの整列済データ列を出力する処理である。この入力データ列対を両データ列の先頭からキー値の大小を考慮して任意のデータ列対に細分割する方法を発明した。この方法を実現すると、任意数のデータ列対、例えばｋ組のデータ列対に分割すると並列度ｋでのマージ操作が可能となるほか、正順併合（データ列対の頭部から尾部に向かって併合し出力域の頭部から尾部に向かって出力する）と逆順併合（データ列対の尾部から頭部に向かって併合し出力域の尾部から頭部に向かって出力する）を適用すれば並列度２ｋのマージ操作も可能となる。
2003091872.tif 000002
【特許請求の範囲】
【請求項１】
複数のプロセッサを含み、２つの入力データ列に対してマージソート処理を行うマージソート用並列プロセッサと、マージソート処理の入力となる２つの整列済データ列対（つい）を指定された組数の部分データ列対に細分割するデータ列対分割用並列プロセッサのほか、全体を制御する管理用プロセッサを備え、前記管理用プロセッサは前記分割用並列プロセッサ群から受けた複数の部分データ列対を前記マージソート用並列プロセッサにそれぞれ割り当て、並列にマージ処理を行わせることを特徴とする並列マージソート処理装置。
【請求項２】
部分データ列の対を割り当てられた前記マージソート用並列プロセッサはそれぞれ独立にマージ処理を行いその結果を予め指示された出力域に出力する。これらの出力域の全体が最終マージ結果となるか、あるいは中間マージ結果として次段の並列マージに使われるように出力されることを特徴とする請求項１記載の並列マージソート処理装置。
【請求項３】
前記部分データ列対それぞれに対して２つのプロセッサが割り当てられ、第１のプロセッサは正順併合（前記部分データ列対のキー値の大きい側の端から小さい方に向かってマージ処理を行い、前記出力領域のキー値の大きい側の端から小さい方に向かって順に出力を書き込む）を行い、第２のプロセッサは逆順併合（前記部分データ列対のキー値の小さい側の端から大きい方に向かってマージ処理を行い、前記出力領域のキー値の小さい側の端から大きい方に向かって順に出力を書き込む）を行うことを特徴とする請求項２記載の並列マージソート処理装置。
【請求項４】
前記分割条件として、下記の項目を満たすことを特徴とする請求項１記載の並列マージソート処理装置。
◆以下ではｎ個のデータからなる整列済データ列Ｄを（Ｄ，ｎ）で表し、２つのデータ列を対にしたものを｛（Ｄ１，ｎ），（Ｄ２，ｎ）｝と表記する。
◆整列済データ列対：｛（Ｄ１，ｎ），（Ｄ２，ｎ）｝が、部分データ列対：｛（Ｄ１１，ｎ１１），（Ｄ２１，ｎ２１）｝と｛（Ｄ１２，ｎ１２），（Ｄ２２，ｎ２２）｝に２分割されたとき、（部分データ列Ｄ１１とＤ２１の末尾のデータのキー値の小さい方）
≧（部分データ列Ｄ１２とＤ２２の頭部のデータのキー値の大きい方）
が成立すると共に、
ｎ１１＋ｎ２１＝２ｘ，ｎ１２＋ｎ２２＝２（ｎ−ｘ）
が成立する。ここでｘはＤ１とＤ２の頭部から数えた領域対のデータ数の半分である。
【請求項５】
並列プロセッサを用いて並列マージソート処理を行うための方法であって、入力として、未整列の１つのデータ列、または２つの整列済部分データ列、あるいは３つ以上の整列済部分データ列のいずれかとその属性情報（種別・データの所在情報や個数など）を受け入れ、
整列対象が未整列データ列の場合はそのデータ列を分割して複数の未整列部分データ列を得る第１ステップと、
前記複数の部分データ列にそれぞれプロセッサを割り当てる第２ステップと、
割り当てられたプロセッサにより前記複数の部分データ列をそれぞれ独立に任意のアルゴリズム例えばクイックソート法で整列し、整列された部分データ列を得る第３ステップと、
第３ステップまたは第７ステップで得たか初期データとして入力された、任意の２つの整列済部分データ列でマージソート用入力データ列の対をつくり、その対を所定の分割条件のもとでそれぞれ要求された組数の部分データ列の対に分割する第４ステップと、
分割された複数の部分データ列対から並列マージソート用のジョブ情報を編集する第５ステップと、
得られた並列マージソート用ジョブにマージソート用プロセッサ群を割り当てる第６ステップと、
割り当てられたプロセッサによりマージ処理を行う第７ステップと、
マージ処理された整列済部分データ列を前記整列済部分データ列として前記第４ステップ乃至前記第７ステップを繰り返すステップとを備える並列マージソート処理方法。
但し、以上は１つの未整列データ列が与えられる場合に適用されるもので、２つ以上の整列済データ列が与えられる場合は第１ステップから第３ステップ迄は不要である。
また第４ステップ乃至前記第７ステップの繰り返しはマージ処理された整列済部分データ列が１つのデータ列になった段階で終る。特に２つの整列済データ列が与えられる場合は第４ステップから第７ステップは１回だけ行われ繰り返しは必要としない。
【請求項６】
前記第６ステップにおいて前記部分データ列の対に対して２つのプロセッサが割り当てられ、前記第７ステップにおいて第１のプロセッサは前記部分データ列のキー値の大きい側からの正順併合処理を、第２のプロセッサは同じ部分データ列のキー値の小さい側の端からの逆順併合処理を、それぞれ同時に行われるように第５ステップでジョブ制御情報を編集することを特徴とする請求項５記載の並列マージソート処理方法。
【請求項７】
前記第４ステップの分割条件として下記の項目を満たす機能をもつことを特徴とする請求項５記載の並列マージソート処理方法。
データ列の対（Ｄ１，ｎ）と（Ｄ２，ｎ）が、部分データ列対｛（Ｄ１１，ｎ１１），（Ｄ２１，ｎ２１）｝と、部分データ列：｛（Ｄ１２，ｎ１２），（Ｄ２２，ｎ２２）｝に２分割されたとき、（部分データ列Ｄ１１とＤ２１の末尾のデータのキー値の小さい方）
≧（部分データ列Ｄ１２とＤ２２の頭部のデータのキー値の大きい方）
が成立すると共に、ｎ１１＋ｎ２１＝２ｘ，ｎ１２＋ｎ２２＝２（ｎ−ｘ）が成立する。
ここでｘは部分データ列対｛（Ｄ１１，ｎ１１），（Ｄ２１，ｎ２１）｝のデータ数の半分の値であり、ｎ１１＝ｎ２１の場合のＤ１１とＤ２１のデータ数でもある。
【請求項８】
前記第４ステップとして下記の機能を備えることを特徴とする請求項５記載の並列マージソート処理方法。
（１）整列済データ列の対：｛（Ｄ１，ｎ），（Ｄ２，ｎ）｝をｋ組の区画対に分割する操作は、両データ列のキー値の大小を考慮してＤ１とＤ２の頭部から数えたデータ数の合計が２ｘとなる２分割操作を、ｘの値を変えてｋ−１通り行うことと等価となる。
この場合、整列済データ列対：｛（Ｄ１，ｎ），（Ｄ２，ｎ）｝のｋ組の区画対への細分割問題は、前述した請求項７を満たすデータ列の２分割問題に置き換えられる。
（２）データ列中のデータ位置は指標値で指定する。この値はデータ列Ｄ１またはＤ２の先頭データの指標値を０とし、順次１、２、・・・と増加する番号をつける。
また、請求項７のｘはデータの個数を表すものだが、ｘの値自体を指標値と見なすとデータ列の先頭から１，２，３と数えてｘ＋１番目のデータを指すことになる。
さらに請求項７でｎ１１＝ｎ２１の場合、データ数を表す式ｎ１１＝ｎ２１＝ｘは先頭から数えてｘ番目のデータ、指標値で言えばｘ−１のデータ位置がＤ１とＤ２の分割境界であることを表していると解釈することもできる。
（３）領域の分割機能
◆前記データ列Ｄ１とＤ２内の個々のデータを指定する指標変数ｉとｊに境界指標値の初期値として前記ｘを設定（例えば１００００個ずつのデータ列対を１０００個ずつのデータ列対１０区画に分割する場合、個数としてのｘ＝１０００、分割位置の初期指標には１０００，・・９０００を設定）するステップと、
◆データ列Ｄ１の指標変数ｉが指すデータのキー値とデータ列Ｄ２の指標変数ｊが指すデータのキー値を比較する比較ステップと、
◆最初の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値が等しくない場合、キー値の大きい方の指標変数に１を加え、小さい方の指標変数から１を引いた後、前記比較ステップに分岐するステップと、
◆２回目以降の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値との大小関係に変化がない場合、大きい方の指標変数に１を加え、小さい方の指標変数から１を引いた後、前記比較ステップに分岐するステップと、
◆最初の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値とが等しいとき、指標変数ｉが指すデータと指標変数ｊが指すデータをそれぞれ分割境界とするステップと、
◆Ｄ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値との間の大小関係が前回の大小関係から反転（２回目以降の比較では等しい場合も反転とみなす）したとき、前回の比較操作におけるＤ１のキー値とＤ２のキー値のうちの大きい方と、今回の比較操作におけるＤ１のキー値とＤ２のキー値の内の大きい方とを比較して、小さい方のキー値をもつデータを分割境界とすると共に、当該データの当初の比較相手を他方の境界とするステップ
とを備えることを特徴とする請求項５記載の並列マージソート処理方法。これは２分した下位データ列対の頭部の位置の決定に用いる。
【請求項９】
前記第４ステップとして下記の機能を備えることを特徴とする請求項５記載の並列マージソート処理方法。
（１）整列済データ列の対：｛（Ｄ１，ｎ），（Ｄ２，ｎ）｝をｋ組の区画対に分割する操作は、両データ列のキー値の大小を考慮してＤ１とＤ２の頭部から数えたデータ数の合計が２ｘとなる２分割操作を、ｘの値を変えてｋ−１通り行うことと等価となる。
このように見なすと、整列済データ列の対：｛（Ｄ１，ｎ），（Ｄ２，ｎ）｝のｋ組の区画対への細分割問題は、前述した請求項７の条件を満たすデータ列の２分割問題に置き換えられる。
（２）データ列中のデータ位置は指標値で指定する。この値はＤ１またはＤ２の先頭データの指標値を０とし、順次１、２、・・・と増加する。
また請求項７のｘはデータの個数だが、ｘの値自体を指標値と見なすとデータ列の先頭から１，２，３と数えてｘ＋１番目のデータを指すことになる。
さらに請求項７でｎ１１＝ｎ２１の場合、ｎ１１＝ｎ２１＝ｘは先頭から数えてｘ番目のデータ、指標値で言えばｘ−１のデータ位置にＤ１とＤ２の分割境界があることを表している。
（３）領域の分割機能
◆前記データ列Ｄ１とＤ２の個々のデータを指定する指標変数ｉとｊとに境界の指標値の初期値として前記ｘ−１を設定（例えば１００００個ずつのデータ列対を１０００個ずつのデータ列対１０区画に分割する場合、個数としてのｘには１０００、分割位置の初期指標には９９９，１９９９，・・８９９９を設定）するステップと、
データ列Ｄ１の指標変数ｉが指すデータのキー値とデータ列Ｄ２の指標変数ｊが指すデータのキー値を比較する比較ステップと、
◆最初の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値が等しくない場合、キー値の大きい方の指標変数に１を加え、小さい方の指標変数から１を引いた後、前記比較ステップに分岐するステップと、
◆２回目以降の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値との大小関係に変化がない場合、大きい方の指標変数に１を加え、小さい方の指標変数から１を引いた後、前記比較ステップに分岐するステップと、
◆最初の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値とが等しいとき、指標変数ｉが指すデータと指標ｊが指すデータをそれぞれ分割境界とするステップと、
◆Ｄ１の指標変数ｉが指すデータのキー値と領域Ｄ２の指標変数ｊが指すデータのキー値との間の大小関係が前回の大小関係から逆転（２回目の比較以降では等しい場合も反転とみなす）したとき、前回の比較操作におけるＤ１のキー値とＤ２のキー値のうちの小さい方と、今回の比較操作におけるＤ１のキー値とＤ２のキー値の内の小さい方とを比較して、大きい方のキー値をもつデータを分割境界とすると共に、当該データの当初の比較相手を他方の境界とするステップ
とを備えることを特徴とする請求項５記載の並列マージソート処理方法。これは２分した上位データ列対の末尾の決定に用いる。
【請求項１０】
２組の整列済データ列の対を複数の整列済データ列対に細分割して任意の並列度のマージソート操作で整列させる並列マージソート処理方法であって、
整列された第１のデータ列及び第２のデータ列の対を用意するステップと、
要求される並列度に応じて前記第１のデータ列及び第２のデータ列の対を複数の整列済部分データ列対に細分割する分割ステップと、
細分割された整列済部分データ列の対を並列にマージするステップとを備え、細分割した整列済部分データ列の対数に関係なく全体としてキーの並びに矛盾の無いデータ列の出力が可能な並列マージソート処理方法。
【請求項１１】
複数のプロセッサを含む並列プロセッサを用いて並列マージソート処理を行うためのプログラムであって、
入力として、未整列の１つのデータ列、または２つの整列済部分データ列、あるいは３つ以上の整列済部分データ列のいずれかとその属性情報（種別・データの所在情報や個数など）を受け入れ、
整列対象が未整列データ列の場合はそのデータ列を分割して複数の未整列部分データ列を得る第１ステップと、
前記複数の部分データ列にそれぞれプロセッサを割り当てる第２ステップと、
割り当てられたプロセッサにより前記複数の部分データ列についてそれぞれ独立に任意のアルゴリズム、例えばクイックソート法で整列処理を行う第３ステップと、
第３ステップまたは第７ステップで得たか初期データとして入力された、任意の２つの整列済部分データ列でマージソート用の入力データ列の対をつくり、所定の分割条件のもとでそれぞれ要求された分割数の部分データ列対に細分割する第４ステップと、
分割された部分データ列対をマージソートするためのジョブ情報を編集する第５ステップと、
得られたマージソートジョブに対してプロセッサ群を割り当てる第６ステップと、
割り当てられたプロセッサにより並列にマージ処理を行う第７ステップと、
マージ処理されたデータ列を前記部分データ列として前記第４ステップ乃至前記第７ステップを繰り返すステップと、を実行させるためのプログラム。
但し、以上は１つの未整列データ列が与えられる場合に適用されるもので、２つ以上の整列済データ列が与えられる場合は第１ステップから第３ステップ迄は不要である。
また第４ステップ乃至前記第７ステップの繰り返しはマージ処理された整列済部分データ列が１つのデータ列になった段階で終る。特に２つの整列済データ列が与えられる場合は第４ステップから第７ステップは１回だけ行われ繰り返しは必要としない。
【発明の詳細な説明】
技術分野
この発明の核心となる技術は、２つの整列済データ列を入力とするマージソート処理を任意数の並列度でできるように、２つの整列済データ列対（つい）をキー値の大小を考慮して複数の整列済部分データ列対に細分割する技術である。
それを用いた実施例として並列２分木マージソート法を取り上げる。まず未整列データ列を利用可能なプロセッサの数に対応する数に分割し並列にソート操作を行い、並列数だけの整列済部分データ列を生成する。次に、２組の整列済部分データ列を対にしてマージ操作を行うのだが、処理速度を高めるために、入力データ列対を必要な数だけのデータ列対に細分割し、それぞれ並列にマージ操作を行う。この出力は細分割せずに１つのマージ操作をした時と同じ結果になるように各マージ操作の実行時パラメータで出力域を指定する。本発明は、この操作を整列された単一のデータ列を得る迄繰り返し行うことを特徴とする並列マージソート処理装置及び方法並びにプログラムに関するものである。
背景技術
コンピュータを用いた基本的な処理の１つにデータの整列がある。整列（ソート）処理及び併合（マージ）処理は、入力されたデータ列を着目するフィールドの情報に関して昇順（小から大へ）又は降順（大から小へ）に整列して１系列のデータ列を得る操作である。併合操作は昇順（または降順）に整列された２系列以上のデータ（整列対象のデータまたはレコードの総称）列を受けて、昇順または降順に整列された１系列のデータ列を出力する。
入力系列の数は、２、３、４・・・と種々の場合が考えられるが、特に２の場合は１回の比較で１単位のデータの整列位置が確定するため効率が良い。
併合（マージ）処理に係る所要時間のオーダはデータ数（ｎ）に比例するため、ｎ２またはｎｌｏｇ２ｎに比例するソート操作に比べ有利である。しかしデータ数の増大と共に所要時間も増すので、より高速なアルゴリズム（算法）が求められている。また性能の高いアルゴリズムの開発により、マージソートの適用範囲がさらに広まる可能性もある。だが２つのキー値の比較という単純な操作であるため、時間短縮の要因が潜在する可能性は低い。本発明は従来技術ではなし得なかった２つの整列済部分データ列対を入力とするマージ処理の並列化を可能とするものである。
並列プロセッサを用いることにより多数のデータに対して同時並行的にマージ処理を行い、処理時間を短縮することが提案されている。しかしプロセッサ間の接続ネットワークに特殊なトポロジーを要するものや特殊な機能・構造のプロセッサを要するものが多く、主記憶を共有する密結合マルチプロセッサのような汎用的な計算機システムでは実現が困難である。本発明は構成や接続に特殊性を持たない汎用的な並列プロセッサで高い並列性をもつマージソート法を実現するものだが、そのような方法を用いないと非常に効率が低い処理方式の例を以下に示す。
汎用的な並列プロセッサシステムに適用可能な並列マージソート方法の一例として並列２分木マージソート算法をあげる。図１３はその概略フローチャートであり、図１４はプロセッサ数が８の場合の処理説明図である。
図１３を参照すると、処理対象の未整列データ列（入力データ）をプロセッサの数に対応するｐ組のデータ列（ただし、ｐ＝２ｑ、ｑは整数）に分割する（Ｓ１００）。ｐ個のプロセッサを用い、分割されたｐ組の未整列データ列を例えばクイックソート法によりそれぞれ独立かつ並行して整列する（Ｓ１０１）ことができる。整列されたｐ組の部分データ列に対してｑ段のマージ処理を施す（Ｓ１０２）ことにより、最終的に全体として整列された１組のデータ列を得ることができる（Ｓ１０３）。
図１４を参照してプロセッサの数が８の場合の処理について説明する。図中、丸はプロセッサを示し、四角はデータ列あるいはデータ列（Ｄ）が記憶される領域を示す。丸の中の記号はプロセッサが行う処理の内容を示し、Ｓは整列（ソート）処理、Ｍは併合（マージ）処理、Ｖは必要に応じてなされる他の記憶領域への転送処理を意味する。
入力領域に置かれた未整列のデータ列は８つの部分データ列に分割される。８つのプロセッサＰ１〜Ｐ８によりこれら部分について同時並行的にソート処理を行う。これらの処理結果は領域Ｄ１１〜Ｄ１８に置かれる。
次に、第１段のマージ処理を行う。プロセッサＰ１によりデータ列Ｄ１１とＤ１２が併合されて領域Ｄ２１に置かれ、プロセッサＰ３によりデータ列Ｄ１３とＤ１４が併合されて領域Ｄ２２に置かれ、プロセッサＰ５によりデータ列Ｄ１５とＤ１６が併合されて領域Ｄ２３に置かれ、プロセッサＰ７によりデータ列Ｄ１７とＤ１８が併合されて領域Ｄ２４に置かれる。なお、第１段においてプロセッサＰ２，Ｐ４，Ｐ６，Ｐ８は使用されない（プロセッサの割り当ては便宜上のものである。以下同じ）。
次に、第２段のマージソートを行う。プロセッサＰ１によりデータ列Ｄ２１とＤ２２が併合されて領域Ｄ３１に置かれ、プロセッサＰ５によりデータ列Ｄ２３とＤ２４が併合されて領域Ｄ３２に置かれる。なお、第２段においてプロセッサＰ２，Ｐ３，Ｐ４，Ｐ６，Ｐ７，Ｐ８は使用されない。
次に、第３段のマージソートを行う。プロセッサＰ１によりデータ列Ｄ３１とＤ３２が併合されて領域Ｄ４に置かれる。これでマージソートが完了する。なお、第３段においてプロセッサＰ２，Ｐ３，Ｐ４，Ｐ５，Ｐ６，Ｐ７，Ｐ８は使用されない。得られた結果Ｄ４は必要なら８つのプロセッサにより最終出力領域に転送される。
上述した従来の手法では、マージ処理段が進行につれ使われなくなるプロセッサが増加するためプロセッサの処理能力が無駄になっていた。上記の例では第１段のマージ処理ではプロセッサの５０％しか使用されず、第２段のマージ処理のプロセッサ使用率は２５％、第３段のマージ処理ではプロセッサ使用率は１２．５％となり、処理段が進むにつれて使用されないプロセッサの数が増える。これはマージ処理段がすすむにつれて整列済部分データ列の数が半減していくためである。
また、１台のプロセッサでマージするデータ数は後段になるに従って倍増するため、処理時間が増大する。高速処理を優先するシステムでは、プロセッサの使用率低下の問題以上に、１台のプロセッサが扱うデータ量の増大による処理時間の増大が問題となる。
この発明は、係る課題を解決するためになされたもので、並列プロセッサを用いたマージソート処理においてプロセッサの使用効率を高め、処理時間を短縮可能な並列マージソート処理装置及び方法並びにプログラムを提供することを目的とする。
発明の開示
（段落００１４）  本発明ではマージ処理の入力となる２つの整列済部分データ列の対を任意数のデータ列対に細分割して並列にマージ処理をすることにより、マージ処理の所要時間を短縮するものである。複数のプロセッサから共通にデータ群が参照されることから、主記憶を共有する複数のプロセッサを接続した並列プロセッサにおいて特に有効であるが、データ群が各プロセッサから参照できる環境にある如何なる並列プロセッサにも適用可能である。
並列２分木マージソート処理では、未整列の入力データ列を複数組に分割し、それぞれについてソート処理を行って整列済部分データ列を作る。以後は存在する整列済部分データ列を２組ずつ対にしてマージ処理を行い１組の整列済部分データ列を出力する処理段を、出力データ列の数が１つにまとまる迄繰り返すものである。各マージ処理段では入力となるデータ列対が複数ある限りマージ処理は並列に行われる。
１単位のジョブあるいはタスクであるマージ処理の並列化は従来技術では不可能なため、マージ処理段の進行と共に並列度は半減し処理時間は倍増する。
本発明によれば、マージ処理の入力となる２組の整列済部分データ列（図１４に示したソート処理やマージ処理によって得られた部分的な整列済データ列）の対を複数の整列済部分データ列の対に細分割することにより細分割した数だけのプロセッサを使用することができ、整列処理に要する時間を短縮できる。
また、並列度を高めるため以下に記載する方法を適用することもできる。すなわち、入力となる２組の整列済データ列の対に対し、２つのプロセッサを用いて、キー値の大きい側（始端）からマージ操作を始めて結果を出力域の始端から降順に出力する方法（正順併合または正順マージ）と、キー値の小さい側（終端）からマージ操作を始めて出力域の終端から昇順に出力する方法（逆順併合または逆順マージ）の両方のマージ操作を同時平行的に実行するのである。
この方式自体に起因する制約はないため、複数のタスクが並行に動作できる環境下では容易に実現できる。
以下の説明においては、説明の便宜上『一つのキーによる降順の整列』に限定する。整列に関連する用語には原則として『整列』と『併合』を用いるが、同義語的に『ソート』や『マージ』を用いることがある。
本発明に係る並列マージソート処理装置は、従来方式のマージ操作における２系列の入力データ列の対を複数組の２系列の入力データ列対に分割する機構と、それらの組に対して並列にマージ操作を行う機構を基本要素とする。
両機構に対しどのようにプロセッサ群を割り付けるかは任意である。すなわち、データ列対の細分割を複数のプロセッサにさせた後、マージ処理では改めてプロセッサを割り当て直すこともできるし、データ列の細分割操作とその後のマージ操作を同一プロセッサに担当させることもできる。
それぞれのマージ操作の出力はあたかも１つのマージ操作を行った場合と同じ結果でなければならない。このため、並行に動作する各マージ操作では、細分割した入力データ列対全体のキー値の大小に対応した領域に結果を出力する必要がある。
部分データ列の対を割り当てられた前記プロセッサ群は、それぞれマージ処理を行うと共に当該マージ処理の結果を予め指示された領域に出力する。このためには、例えばマージ処理の入力データ列対が格納されている領域の先頭メモリアドレスの対と処理すべきデータ数と出力域の先頭アドレスが管理プロセッサから指定されればよい。
前記部分データ列の対それぞれに対して２つのプロセッサが割り当てられ、第１のプロセッサは前記部分データ列の一方の端（キー値の大きい側）から正順にマージ処理を行い、第２のプロセッサは同じ部分データ列の他方の端（キー値の小さい側）から逆順にマージ処理を同時に行い、前記第１のプロセッサは前記部分データ列の一方の端から順にマージ処理の結果を書き込み、前記第２のプロセッサは前記領域の部分の他方の端から順にマージ処理の結果を書き込む。
（段落００２０）  段落００１４に記述したように１つのデータ列対を複数のデータ列対に細分割するが、細分割は指定されたデータ列対の始点から始めて指定数ｘのデータ数が存在するデータ列と残りのデータ列とに２分する操作をｘを変化させて反復する操作に分解できる。
従って細分割の基本はデータ列の２分操作であるが、その結果得られる２つの整列済部分データ列対が満たすべき条件は以下のように定式化される。
ｎ個のデータからなる整列済データ列Ｄを（Ｄ，ｎ）で表わし、２つのデータ列を対にしたものを｛（Ｄ１，ｎ），（Ｄ２，ｎ）｝と表記する。
整列済のデータ列の対：｛（Ｄ１，ｎ），（Ｄ２，ｎ）｝が、２つの部分データ列｛（Ｄ１１，ｎ１１），（Ｄ２１，ｎ２１）｝と、部分データ列｛（Ｄ１２，ｎ１２），（Ｄ２２．ｎ２２）｝に分割され、それらがマージ処理に使われて全体としてキー値の大小に矛盾のない出力をするためには下式が成立しなければならない。
部分データ列Ｄ１１とＤ２１の末尾のデータのキー値の小さい方
≧  部分データ列Ｄ１２とＤ２２の頭部のデータのキー値の大きい方
ｎ１１＋ｎ２１＝２分した上位データ列対に含まれるべきデータ数
この発明に係る並列マージソート処理方法は、複数のプロセッサを含む並列プロセッサを用いて並列マージソート処理を行うための方法であって、
入力として、未整列の１つのデータ列、または２つの整列済部分データ列、あるいは３つ以上の整列済部分データ列のいずれかとその属性情報（種別・データの所在情報や個数など）を受け入れ、
整列対象が未整列データ列の場合はそのデータ列を分割して複数の未整列部分データ列を得る第１ステップと、
前記複数のソート用部分データ列にそれぞれプロセッサを割り当てる第２ステップと、
割り当てられたプロセッサにより前記複数の部分データ列についてそれぞれ独立にソート処理を行い降順に整列された部分データ列を出力する第３ステップと、
第３ステップまたは第７ステップで得たか初期データとして入力された、任意の２つの整列済部分データ列でマージソート用の入力データ列の対をつくり、所定の分割条件の下でそれぞれ要求された数の細分された部分データ列の対に分割する第４ステップと、
細分した部分データ列対に対してマージ処理をするために必要なジョブ情報を編集する第５ステップと、
各マージ処理に対してプロセッサを割り当てる第６ステップと、
割り当てられたプロセッサによりマージ処理を行い整列された部分データ列を出力する第７ステップと、
出力データ列の数が１つになる迄前記第４ステップ乃至前記第７ステップを繰り返すステップとを備えるものである。
但し、以上は１つの未整列データ列が与えられる場合に適用されるもので、２つ以上の整列済データ列が与えられる場合は第１ステップから第３ステップ迄は不要である。
また第４ステップ乃至前記第７ステップの繰り返しはマージ処理された整列済部分データ列が１つのデータ列になった段階で終わる。特に２つの整列済データ列が与えられる場合は第４ステップから第７ステップは１回だけ行われ繰り返しは必要としない。
好ましくは、
前記第６ステップにおいて、前記部分データ列の対に対して２つのプロセッサが割り当てられ、
前記第７ステップにおいて、第１のプロセッサは前記部分データ列の一方の端（キー値の大きい側）から正順マージ処理を行い、第２のプロセッサは同じ部分データ列の他方の端（キー値の小さい側）から逆順マージ処理を同時に行う。
（２分した下位データ列対の頭部の位置決定）
段落００２０に記したデータ列対の２分方法を以下に記述する。
◆前記データ列Ｄ１とＤ２内の個々のデータを指定する指標変数ｉとｊを設け、それらへの初期値として前記ｘを設定（１００００個ずつのデータ列対を１０００個ずつのデータ列対１０区画に分割する場合、個数としてのｘ＝１０００、分割位置の初期指標には１０００，・・９０００を設定）するステップと、
◆データ列Ｄ１の指標変数ｉが指すデータのキー値とデータ列Ｄ２の指標変数ｊが指すデータのキー値を比較する比較ステップと、
◆最初の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値が等しくない場合、キー値の大きい方の指標変数に１を加え、小さい方の指標変数から１を引いた後、前記比較ステップに分岐するステップと、
◆２回目以降の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値との大小関係に変化がない場合、大きい方の指標変数に１を加え、小さい方の指標変数から１を引いた後、前記比較ステップに分岐するステップと、
◆最初の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値とが等しいとき、指標変数ｉが指すデータと指標ｊが指すデータをそれぞれ分割境界とするステップと、
◆Ｄ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値との間の大小関係が前回の大小関係から反転（２回目以降の比較では等しい場合も反転とみなす）したとき、前回の比較操作におけるＤ１のキー値とＤ２のキー値のうちの大きい方と、今回の比較操作におけるＤ１のキー値とＤ２のキー値の内の大きい方とを比較して、小さい方のキー値をもつデータを分割境界とすると共に、当該データの当初の比較相手を他方の境界とするステップ
とを実行する。なおこの処理は２分した後半のデータ列対｛（Ｄ１２，ｎ１２），（Ｄ２２，ｎ２２）｝の頭部の決定、換言すれば正順併合の開始点の決定に使われる。
（２分した上位データ列対の尾部の位置決定）
段落００２０に記したように２分する方法を以下に記述する。
◆前記データ列Ｄ１とＤ２の個々のデータを指定する指標変数ｉとｊとに境界の指標値の初期値として前記ｘ−１を設定（１００００個ずつのデータ列対を１０００個ずつのデータ列対１０区画に分割する場合、個数としてのｘには１０００、分割位置の初期指標には９９９，１９９９，・・８９９９を設定する）するステップと、
◆データ列Ｄ１の指標変数ｉが指すデータのキー値とデータ列Ｄ２の指標変数ｊが指すデータのキー値を比較する比較ステップと、
◆最初の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値が等しくない場合、キー値の大きい方の指標変数に１を加え、小さい方の指標変数から１を引いた後、前記比較ステップに分岐するステップと、
◆２回目以降の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値との大小関係に変化がない場合、大きい方の指標変数に１を加え、小さい方の指標変数から１を引いた後、前記比較ステップに分岐するステップと、
◆最初の比較でＤ１の指標変数ｉが指すデータのキー値とＤ２の指標変数ｊが指すデータのキー値とが等しいとき、指標変数ｉが指すデータと指標ｊが指すデータをそれぞれ分割境界とするステップと、
◆Ｄ１の指標変数ｉが指すデータのキー値と領域Ｄ２の指標変数ｊが指すデータのキー値との間の大小関係が前回の大小関係から逆転（２回目以降の比較では等しい場合も反転とみなす）したとき、前回の比較操作におけるＤ１のキー値とＤ２のキー値のうちの小さい方と、今回の比較操作におけるＤ１のキー値とＤ２のキー値の内の小さい方とを比較して、大きい方のキー値をもつデータを分割境界とすると共に、当該データの当初の比較相手を他方の境界とするステップ
とを実行する。なおこの処理は２分した前半のデータ列対｛（Ｄ１１，ｎ１１），（Ｄ２１，ｎ２１）｝の尾部の決定、換言すれば逆順併合の開始点の決定に用いる。
この発明は、マージソートの入力となる２組の整列済データ列の対をキー値の大小分布を考慮して複数のデータ列対に細分割することにより、任意の並列度のマージソート処理を可能とする並列マージソート処理方法であって、
整列されたデータからなる第１のデータ列と第２のデータ列を用意するステップと、
要求される並列度に応じて前記第１のデータ列及び前記第２のデータ列の対を両データ列の頭部からのキー値の大小を考慮して複数の整列済部分データ列対に細分割するステップと、分割された整列済部分データ列対を入力として並列にマージ処理を行うステップとを備えるものである。
この発明は、複数のプロセッサを含む並列プロセッサを用いて並列マージソート処理を行うためのプログラムであって、
入力として、未整列の１つのデータ列、または２つの整列済部分データ列、あるいは３つ以上の整列済部分データ列のいずれかとその属性情報（種別・データの所在情報や個数など）を受け入れ、
整列対象が未整列データ列の場合はそのデータ列を分割して複数の未整列部分データ列を得る第１ステップと、
前記複数のソート用部分データ列にそれぞれプロセッサを割り当てる第２ステップと、
割り当てられたプロセッサにより前記複数の部分データ列についてそれぞれ独立にソート処理を行い降順に整列された部分データ列を出力する第３ステップと、
第３ステップまたは第７ステップで得たか初期データとして入力された、任意の２つの整列済部分データ列でマージソート用の入力データ列の対をつくり、所定の分割条件の下でそれぞれ要求された数の細分された部分データ列の対に分割する第４ステップと、
細分した部分データ列対に対してマージ処理をするために必要なジョブ情報を編集する第５ステップと、
各マージ処理に対してプロセッサを割り当てる第６ステップと、
割り当てられたプロセッサによりマージ処理を行い降順に整列された部分データ列を
各マージ処理に対してプロセッサを割り当てる第６ステップと、
割り当てられたプロセッサによりマージ処理を行い降順に整列された部分データ列を出力する第７ステップと、
マージ処理されたデータ列を前記部分データ列として前記第４ステップ乃至前記第７ステップを出力データ列の数が１つになる迄繰り返すステップとを備えるものである。
但し第１ステップから第３ステップ迄は入力データ列が未整列の場合にのみ必要なものである。また第４ステップ乃至前記第７ステップの繰り返しはマージ処理された整列済部分データ列が１つのデータ列になった段階で終わる。特に２つの整列済データ列が与えられる場合は第４ステップから第７ステップは１回だけ行われ繰り返しは必要としない。
この発明に係るプログラムは、例えば、記録媒体に記録される。
媒体には、例えば、ＥＰＲＯＭデバイス、フラッシュメモリデバイス、フレキシブルディスク、ハードディスク、磁気テープ、光磁気ディスク、ＣＤ（ＣＤ−ＲＯＭ、Ｖｉｄｅｏ−ＣＤを含む）、ＤＶＤ（ＤＶＤ−Ｖｉｄｅｏ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭを含む）、ＲＯＭカートリッジ、バッテリバックアップ付きのＲＡＭメモリカートリッジ、フラッシュメモリカートリッジ、不揮発性ＲＡＭカートリッジ等を含む。
また、電話回線等の有線通信媒体、マイクロ波回線等の無線通信媒体等の通信媒体を含む。インターネットもここでいう通信媒体に含まれる。
媒体とは、何等かの物理的手段により情報（主にデジタルデータ、プログラム）が記録されているものであって、コンピュータ、専用プロセッサ等の処理装置に所定の機能を行わせることができるものである。要するに、何等かの手段でもってコンピュータにプログラムをダウンロードし、所定の機能を実行させるものであればよい。
発明を実施するための最良の形態
発明の実施の形態１．
発明の実施の形態に係る装置／方法について図面を参照して説明する。
図１は本装置の概略構成を示すものである。１は複数のプロセッサを含み、複数のタスクを同時並行的に実行可能なマージ処理用並列プロセッサである。２は２組の整列済データ列の対を所定数の部分データ列対に分割して管理用プロセッサ４に返す領域分割用並列プロセッサである。３は指定された領域に存在する未整列のデータ列をソートするソート処理用並列プロセッサである。また４は全体の制御を担当する管理プロセッサで、ジョブ開始に際して外部から受ける入出力データの場所やデータ数などの情報  ６を受けるほか、前記並列プロセッサ群に行わせるタスクに必要な情報の編集やタスクの起動、タスク終了報告の受け付けなどの処理を担当する。５は整列対象のデータを含むデータ記憶域である。
１と３は実装によっては同じ並列プロセッサを用いることもできるし、２のデータ列対分割用並列プロセッサについても同様である。
従来技術では一つのマージ処理用としてしか扱われない２つの整列済データ列の対を複数の部分データ列の対に分割することにより並列度を向上させる。後述の図３の例では、マージの入力となるデータ列Ｄ２１とＤ２２の対を２分割することにより２組の入力データ列対を得て、それぞれを正順マージと逆順マージを行うことによりプロセッサＰ１〜Ｐ４に同時に処理をさせることができ、データ列Ｄ３１、Ｄ３２の対を４分割することにより４組の入力データ列対を得て、それぞれを正順マージと逆順マージを行うことによりプロセッサＰ１〜Ｐ８に同時に処理をさせることができる。詳しくは後述する。
図２の概略フローチャートで示す並列２分木マージソート法では、整列の対象であるデータ列をｐ＝２ｑの関係をもつｐ組の未整列のデータ列に分割し、それぞれを独立に、例えばクイックソート法により整列させる。
Ｓ１〜Ｓ３は入力データ列を複数のデータ列に分割しｐ個のプロセッサに同時並行的にソート処理を行わせるための手順である。その後、以下のようにｑ段のマージソートを繰り返し、最終的に全体として整列された１組のデータ列を得る。
Ｓ１：整列処理の対象である未整列のデータ列をｐ組の未整列データ列に分割する。ここで、ｐ＝２ｑで、動員可能なプロセッサの数に相当し、ｑはマージの段数を表す数である。短い処理時間を望む場合はｐを大きくするが、ｌｏｇ２ｐの関係でｑも増加する。
また説明の便宜上用いるマージ段を表す変数ａを０に初期化する。
Ｓ２：ｐ個のプロセッサを分割されたｐ区画に割り当てる。
Ｓ３：それぞれ独立にソートする。
Ｓ４：マージ操作の入力となる整列済部分データ列の対を分割する。
（１）ａ＝ａ＋１
（２）２ｑ−ａ＋１組の整列済部分データ列を２つずつ組み合わせた２ｑ−ａ組の入力データ列対を作る。
各入力データ列対のそれぞれを２ａ−１組の細分化されたデータ列対に分割する。データ列対の分割の仕方については後述する。
Ｓ５：（２ｑ−ａ）×（２ａ−１）＝２ｑ−１組の細分されたデータ列対のそれぞれに正順併合と逆順併合用のプロセッサを割り当てる。
Ｓ６：各組についてそれぞれ２つのプロセッサを用いて正順併合と逆順併合を同時に行い２ｑ−ａ組の整列された部分データ列を得る。
Ｓ７：次に、ａ≠ｑならａに１を加え、Ｓ４〜Ｓ７の処理を繰り返す。
Ｓ８：以上の手順により、最終的に全体として整列された１組のデータ列を得ることができる。
図２の方法は、１段目のマージでは分割しないが、２段目において２分割し、３段目において４分割し、４段目において８分割し、・・・、ｑ段目において領域を２ｑ−１分割し、それぞれの領域に正順併合と逆順併合を適用する。図２の整列済データ列分割法を適用した並列２分木マージソート法では常にｐ並列の併合操作を行うことができる。
図３を参照してプロセッサの数が８の場合における並列２分木マージソート法の処理について説明する。図中、丸はプロセッサを示し、四角はデータ列あるいはデータ列（Ｄ）が記憶される領域を示す。丸の中の記号はプロセッサが行う処理の内容を示し、Ｓは整列（ソート）処理、Ｍは併合（マージ）処理、Ｖは転送処理を意味する。
入力領域に置かれたデータは８組の未整列データ列に分割する。８つのプロセッサＰ１〜Ｐ８によりこれら部分データ列について同時並行的にソート処理を行う。これらの処理結果は領域Ｄ１１〜Ｄ１８に置かれる。
次に、第１段目のマージソートを行う。プロセッサＰ１、Ｐ２によりデータ列Ｄ１１とＤ１２が併合されてＤ２１に置かれ、プロセッサＰ３、Ｐ４によりデータ列Ｄ１３とＤ１４が併合されてＤ２２に置かれ、プロセッサＰ５、Ｐ６によりデータ列Ｄ１５とＤ１６が併合されてＤ２３に置かれ、プロセッサＰ７、Ｐ８によりデータ列Ｄ１７とＤ１８が併合されてＤ２４に置かれる。
なお第１段目では正順併合と逆順併合が同時に行われるので、分割を行わなくても８台のプロセッサが使用される（プロセッサの割り当ては便宜上のものである。以下同じ）。
次に、第２段目のマージソートを行う。全てのプロセッサを使用するためにデータ列対を２分割する。すなわち、部分データ列Ｄ２１とＤ２２の対に対しキー値の大小を考慮して２分割し、Ｄ２１−１とＤ２２−１の対とＤ２１−２とＤ２２−２の対を作る。データ列Ｄ２３とＤ２４の対についても同様である。
そして、プロセッサＰ１、Ｐ２によりデータ列Ｄ２１−１とＤ２２−１が併合されてＤ３１の一方（キー値の大きい側）に置かれ、プロセッサＰ３、Ｐ４によりデータ列Ｄ２１−２とＤ２２−２が併合されてＤ３１の他方（キー値の小さい側）に置かれる。同様に、プロセッサＰ５〜Ｐ８によりデータ列Ｄ２３とＤ２４が併合されてＤ３２に置かれる。
次に、第３段目のマージソートを行う。第２段階目と同様に分割が行われる。すなわち、データ列Ｄ３１とＤ３２を対にし、キー値の大小を考慮して４分割し、Ｄ３１−１とＤ３２−１、Ｄ３１−２とＤ３２−２、Ｄ３２−３とＤ３２−３、Ｄ３１−４とＤ３２−４の各部分データ列対を作る。プロセッサＰ１、Ｐ２によりデータ列Ｄ３１−１とＤ３２−１が併合されてＤ４内の所定の位置に置かれ、プロセッサＰ３、Ｐ４によりデータ列Ｄ３１−２とＤ３２−２が併合されて領域Ｄ４内の所定の位置に置かれ、プロセッサＰ５、Ｐ６によりデータ列Ｄ３１−３とＤ３２−３が併合されて領域Ｄ４内の所定の位置に置かれ、そして、プロセッサＰ７、Ｐ８によりデータ列Ｄ３１−４とＤ３２−４が併合されて領域Ｄ４内の所定の位置に置かれる。これでマージソートが完了する。得られた結果Ｄ４は必要なら８台のプロセッサにより出力領域に転送される。
図３の処理の各段階において８つのプロセッサの全てが使用される。
図４〜図６を参照して図３の処理を模式的に説明する。
ｄ１０〜ｄ１３、ｄ２０〜ｄ２３の８つの部分データ列（各ブロックのデータ数＝３８０個）の合計３０４０組のデータをソートすることを考える。
（１）ｄ１０〜ｄ２３のそれぞれを８台のプロセッサを使いソートする。ソートされた状態は図４の中段のようにキー値が降順に並べられたものになる。図中、三角形は各ブロックのおけるキー値の大きさの分布を示す。
（２）別に一組の作業領域ｅ１０〜ｅ１３、ｄ２０〜ｄ２３を設けて図４の中段のように並列マージを実行する。その結果、下段のような結果が得られる。
（３）次に２段目のマージソートを行う。（ｅ１０、ｅ１１）と（ｅ２０、ｅ２１）を組み合わせ、キー値の大小を考慮して２分割して２組のマージ入力用データ列の対を作り４並列のマージ操作を実行する（図５上段）。同時に、（ｅ１２、ｅ１３）と（ｅ２２、ｅ２３）を組み合わせ、キー値の大小を考慮して２分割して２組のマージ入力用データ列対を作り４並列のマージ操作を実行する（図５下段）。結局、４並列のマージが２系統並列に実行される。
（４）次に３段目のマージソートを行う。ｄ１０〜ｄ１３とｄ２０〜ｄ２３を組み合わせてキー値の大小を考慮して４分割して４組のマージ入力対を作り、ｅ１０〜ｅ２３へ出力する。各領域は４分割され、それぞれ正順・逆順の処理がされるので、８つの処理が並列に実行される。
図３の各段階におけるマージソート処理についてさらに詳しく説明する。図７はその説明図である。入力領域（Ｄ１，ｎ）と（Ｄ２，ｎ）の入力データ列の対が与えられたとする。ここで（Ｄ１，ｎ）と（Ｄ２，ｎ）はｎ個のデータからなるデータ列Ｄ１とＤ２を意味する。図７の各領域において左側ほどキー値が大きく、右側ほどキー値が小さくなるようにソートされている。
（段落００４８）  図１に示すデータ列対分割部  ２により（Ｄ１，ｎ）と（Ｄ２，ｎ）の整列済部分データ列対がキー値の大小を考慮して分割（図７では２分割）され、（Ｄ１１、ｎ１１）と（Ｄ２１、ｎ２１）の対と（Ｄ１２、ｎ１２）と（Ｄ２２、ｎ２２）の対とに分けられたとする。
この分割では下記の式を満足しなければならない。
Ｄ１１の末尾のデータのキー値とＤ２１の末尾のデータのキー値の小さい方
≧Ｄ１２の頭部のデータのキー値とＤ２２の頭部のデータのキー値の大きい方
ｎ１１＋ｎ２１＝２ｘ、ｎ１２＋ｎ２２＝２（ｎ−ｘ）
ここで２ｘは、データ列対｛（Ｄ１１、ｎ１１），（Ｄ２１、ｎ２１）｝がもつデータ数である。
マージ操作の入力であるデータ列対（Ｄ１１，ｎ１１）と（Ｄ２１，ｎ２１）に対して、プロセッサＰ１で正順併合を行うとともに、プロセッサＰ２で逆順併合を行う。
図中の点線は併合の順序を示す。その結果を出力領域（Ｄ３，２ｎ）の部分である（Ｄ３１，ｎ３１）に順次出力する。
同様に、整列済データ列（Ｄ１２，ｎ１２）と（Ｄ２２，ｎ２２）の対に対して、プロセッサＰ３で正順併合を行うと共にプロセッサＰ４で逆順併合を行う。その結果を出力領域（Ｄ３．２ｎ）の部分である（Ｄ３２，ｎ３２）に順次出力する。
ここで、（Ｄ３１の末尾のデータのキー値）≧（Ｄ３２の頭部のデータのキー値）、
ｎ３１＋ｎ３２＝２ｎである。
以上のように入力データ列対を分割すると共に、分割されたデータ列対それぞれにプロセッサを割り当てることにより、複数のプロセッサによる同時並行処理が可能になる。なお、以上の説明はあくまで一例であり、本発明はこれに限定されない。
次に整列済データ列対への分割手順について説明する。図７の例からも明らかなように、マージソートが正しく行われるためには、（Ｄ３１の末尾のデータのキー値）≧（Ｄ３２の頭部のデータのキー値）でなければならない。Ｄ３１はＤ１１、Ｄ２１のマージソート結果であり、Ｄ３２はＤ１２、Ｄ２２のマージソート結果である。したがって、（Ｄ１１またはＤ２１に含まれるデータのキー値の最小値）≧（Ｄ１２またはＤ２２に含まれるデータのキー値の最大値）ということである。このことから本発明の領域分割の条件は次のようなものである。
前記分割条件では、予め整列された２つのデータ列の対（Ｄ１，ｎ）と（Ｄ２，ｎ）が、部分データ列（Ｄ１１，ｎ１１）と（Ｄ２１，ｎ２１）の対と、
部分データ列（Ｄ１２，ｎ１２）と（Ｄ２２，ｎ２２）の対に２分割されたとき、
（部分データ列Ｄ１１とＤ２１の末尾のデータのキー値の小さい方）
≧（部分データ列Ｄ１２とＤ２２の頭部のデータのキー値の大きい方）
が成立すると共に、
ｎ１１＋ｎ２１＝２ｘ，ｎ１２＋ｎ２２＝２ｎ−２ｘ
が成立しなければならない。ここでｘはＤ１とＤ２の頭部から数えたデータ列対のデータ数の半分の数である。
例えば、１０００個の整列済データ列対に対し、ｘ＝３００とｘ＝６００の２回の分割操作をすると、各データ列対の合計データ数が６００，６００，８００の３つのデータ列対｛（Ｄ１１，ｎ１１），（Ｄ２１，ｎ２１）｝｛（Ｄ１２，ｎ１２），（Ｄ２２，ｎ２２）｝｛（Ｄ１３，ｎ１３），（Ｄ２３，ｎ２３）｝に分割される。この場合、両データ列を合わせ、先頭から６００番目のデータのキー値（Ｄ１１とＤ２１の末尾のデータキー値の小さい方）と６０１番目のデータのキー値（Ｄ１２とＤ２２の頭部のキー値の大きい方）、１２００番目のデータのキー値と１２０１番目のデータのキー値に前記の大小関係が満たされねばならない。
以上の条件を満たす整列済データ列対分割の手法を説明する。以下の正順併合用の分割手法または逆順併合用の分割手法、あるいは両方の手法を用いることにより、上記条件を満たすデータ列対への分割が実現できる。
整列済データ列対の分割手法の具体的な手順の説明の前に、前提となる事項について説明する。それぞれｎ個のデータからなる２つの整列済データ列Ｄ１とＤ２を仮定し、両データ列を（ｎ／ｋ）組のデータを含むｋ組のデータ列対に均等に分割する。
個々のデータ列は０からｋ−１のデータ列番号で指定する。また各データの位置は、データ列頭部を０としデータ毎に１ずつ増加する指標値で指定する。この位置指定法はＤ１、Ｄ２全体のデータ位置指定のほか、分割した各データ列内の位置指定にも用いる。また、データ列の頭部あるいは尾部という表現で始端あるいは終端のデータ位置を指定する。
前述した均等分割後のＤ１とＤ２の部分データ列中、同一データ列番号のデータ列同志を仮の併合対象データ列対とする。
すなわち、データ列番号ｉ（ｉ＝０〜ｋ−１）のデータ列対を対象とする正順併合の始点は、Ｄ１とＤ２の始端から（ｎ／ｋ）（ｉ）組のデータを除いた残りのデータ列の始端、すなわち指標値が（ｎ／ｋ）（ｉ）の点とする。
またデータ列番号ｉ（ｉ＝０〜ｋ−１）のデータ列を対象とする逆順併合の始点は、Ｄ１とＤ２の始端からそれぞれ（ｎ／ｋ）（ｉ＋１）組のデータが存在するデータ列の末尾、換言すれば指標値が（ｎ／ｋ）（ｉ＋１）−１の点とする。
Ｄ１とＤ２内のキー値の分布は互いに独立である。このため、それぞれのデータ列内で整列済であっても、仮の開始点から併合操作をしたのでは、全体としてキー値の分布に矛盾のない整列結果を得ることはできない。そこで以下の手順により前記条件を満たす開始点（分割点）を求める。
＜正順併合の場合＞
それぞれ整列されたｎ個のデータからなる２つのデータ列、Ｄ１とＤ２とがある。段落００４８の条件を満たし、かつ、両データ列の先頭からのキー値の大小を考慮してデータ列の先頭からのデータ数が２（ｎ／ｋ）＋２、４（ｎ／ｋ）＋２、６（ｎ／ｋ）＋２、・・・２（ｋ−１）（ｎ／ｋ）＋２となるデータ列対を識別する。この境界はデータ数が２（ｎ／ｋ）、４（ｎ／ｋ）、６（ｎ／ｋ）、・・・２（ｋ−１）（ｎ／ｋ）のデータ列対を除いた残りのデータ列対の頭部の指標である。
図８を参照する。
Ｓ１０：境界初期値（あるいは仮の境界値）として（ｎ／ｋ）、２（ｎ／ｋ）、３（ｎ／ｋ）、・・・（ｋ−１）（ｎ／ｋ）の指標値をもつ点を選ぶ。
Ｓ１１：Ｄ１とＤ２域の作業用指標変数ｉとｊとに、Ｓ１０で定めた境界初期値の指標値を設定する。
Ｓ１２：下記の手順を大小関係が反転する迄繰り返す。ただし最初の比較を含め、キー値が等しい場合も反転とみなす。
Ｓ１２ａ：Ｄ１（ｉ）とＤ２（ｊ）のキー値を比較する。
Ｓ１２ｂ：大小関係を判別する。
（１）最初の比較で両者が等しいならＳ１３ａに分岐する。
（２）大小関係が逆転したらＳ１３ｂに分岐する。
（３）最初の比較で両者が等しくない場合、または２回目以降の比較で大小関係が反転しない場合、キー値の大きい方の指標値に１を加え、小さい方の指標値から１を引いた後、Ｓ１２に分岐する（Ｓ１２ｃ）。
Ｓ１３ａ：ｉとｊを境界点の指標とし処理を終わる。
Ｓ１３ｂ：大小関係が変化する直前と直後の比較操作の対象データ中、大きいキー値同志を比較し、その小さい方を境界のデータとする。他方の領域の境界データには今求めたデータの当初の比較相手を選ぶ。
＜逆順併合の場合＞
それぞれｎ個のデータを収容した２つのデータ列、Ｄ１とＤ２とがある。段落００４８の条件を満たし、かつ、両データ列のキー値の大小分布を考慮してデータ列先頭からのデータ数が２（ｎ／ｋ）、４（ｎ／ｋ）、６（ｎ／ｋ）、・・・２（ｋ−１）（ｎ／ｋ）となるデータ列の末尾を求める。以下では図９を参照する。
Ｓ２０：境界初期値（仮の境界値）として、それぞれ（ｎ／ｋ）−１、２（ｎ／ｋ）−１、３（ｎ／ｋ）−１、・・・（ｋ−１）（ｎ／ｋ）−１の指標値をもつ点を選ぶ。
Ｓ２１：Ｄ１とＤ２域の作業用指標変数ｉとｊとにＳ２０で定めた境界初期値の指標値を設定する。
Ｓ２２：下記の手順を大小関係が反転する迄繰り返す。ただし最初の比較を含め、キー値が等しい場合も反転とみなす。
Ｓ２２ａ：Ｄ１（ｉ）とＤ２（ｊ）のキー値を比較する。
Ｓ２２ｂ：大小関係を判別する。
（１）最初の比較で両者が等しいならＳ２３ａに分岐する。
（２）大小関係が反転したらＳ２３ｂに分岐する。
（３）最初の比較で両者が等しくない場合、または２回目以降の比較で大小関係が反転しない場合、キー値の大きい方の指標値に１を加え、小さい方の指標値から１を引いてＳ２２に分岐する。
Ｓ２３ａ：ｉとｊを境界点の指標とし処理を終わる。
Ｓ２３ｂ：大小関係が変化する直前と直後の比較操作の対象データ中、小さいキー値同志を比較し、その大きい方を境界のデータとする。また、他方の領域の境界のデータには上で求めたデータの当初の比較相手を選ぶ。
上記手順によるデータ列対の分割例について説明する。
図１０は降順に整列された、それぞれ１０個の数値を含む下記の２つのデータ列を示す。図１０（ａ）は正順併合の始点の決定手順の説明図、図１０（ｂ）は逆順併合の始点の決定手順の説明図、図１０（ｃ）は領域の分割結果を示す。
Ｄ１：（１９４８，１８６８，１８６２，１１４８，７４０，６２０，５８８，２５６，１１２，１００）
Ｄ２：（１９９６，１９９２，１９６６，１６９４，１５４４，１４４８，１１８２，４３２，２５４，３０）
（段落００５９）＜正順併合の始点の決定＞
（１）データ列頭部から５組のデータを除いたデータ列の頭部が仮の分割点となる。作業用指標ｉ，ｊにこの値を設定する。ｉ＝ｊ＝５となる。
（２）Ｄ１（ｉ＝５）＝６２０とＤ２（ｊ＝５）＝１４６６を比較する。１４６６が大きいので、ｉ＝ｉ−１＝４，ｊ＝ｊ＋１＝６とする。
（３）Ｄ１（ｉ＝４）＝７４０とＤ２（ｊ＝６）＝１１８２を比較する。１１８２が大きいので、ｉ＝ｉ−１＝３，ｊ＝ｊ＋１＝７とする。
（４）Ｄ１（ｉ＝３）＝１１４８とＤ２（ｊ＝７）＝４３２を比較する。１１４８が大きいので、ここで大小関係の反転を認識する。
（１）反転前後の比較で値の大きい１１４８と１１８２を比較し、その小さい方である１１４８の点を一方の境界とする。他方の境界は１１４８の当初の比較相手である４３２を得る。なお、一方の境界が判明すれば、次式（１）を用い２×５−３＝７として他方の境界指標値を求めることもできる。
他方の開始点の指標値  ＝  仮併合開始点の指標×２  −  既知の開始点の指標
＜逆順併合の始点の決定＞
（１）データ列頭部から５組のデータがある点が仮の分割点となる。作業用指標ｉ，ｊにこの値を設定する。ｉ＝ｊ＝４とする。
（２）Ｄ１（ｉ＝４）＝７４０とＤ２（ｊ＝４）＝１５４４とを比較すると、１５４４が大きいので、ｉ＝ｉ−１＝３，ｊ＝ｊ＋１＝５とする。
（３）Ｄ１（ｉ＝３）＝１１４８とＤ２（ｊ＝５）＝１４４６とを比較すると、１４４６が大きいのでｉ＝ｉ−１＝２，ｊ＝ｊ＋１＝６とする。
（４）Ｄ１（ｉ＝２）＝１８６２とＤ２（ｊ＝６）＝１１８２とを比較すると、１８６２が大きいので大小関係が反転したことになる。
（５）反転前後の比較で値の小さい１１４８と１１８２を比較し、大きい方の１１８２を一方の境界とする。他方の境界は１１８２の当初の比較相手のデータ１８６２を得る。段落００５９の式を用い、２×４−６＝２として他方の境界の指標値を求めることもできる。
他の例を図１１（ａ）（ｂ）に示す。図１１（ａ）は、ｎ＝１２，ｋ＝４，ｎ／ｋ＝３の場合である。図１１（ｂ）は、ｎ＝１０，ｋ＝５，ｎ／ｋ＝２の場合である。この例のように、分割後の部分データ列により併合する場合の出力データがＤ１またはＤ２の一方にのみ存在する場合（両方のデータ列にまたがっていない場合）であっても、前記条件を満たすことがわかる。
本発明の実施の形態に係る装置／方法において、分割する区画の数は使用可能な処理装置の数に応じて任意に決めることができる。
本発明に係る装置／方法において、マージソートの入力となる整列済部分データ列対を複数のデータ列対に分割する時間の全時間に占める割合を小さくするため、データ数が大きいほど効果も大きい。なお、複数のデータ列対に分割する処理のうち、実質的な併合開始点を決定する部分をマージソート作業を割り当てられたプロセッサ自身が実行すれば、より充実した並列処理が可能となり全処理時間に占める領域対分割にかかる時間の割合を削減できる。
（１）効果の大きい場合
データ列Ｄ１とＤ２のキー値の分布がほぼ同じ場合は短時間に大小関係が反転する。このためマージ入力となるデータ境界の決定に多くの時間を要しない。
（２）分割に時間のかかる場合
下記のケースが考えられる。
（ａ）分割対の確定に時間のかかる場合
ｋ区画に分割する場合で対象となるデータ列対の区画番号がｋ／２に近い場合で、Ｄ１またはＤ２の頭部や尾部、換言すればデータ列の端部近辺になってようやく大小関係が反転する場合、大小関係の反転までに時間がかかる。キーの分布がＤ１とＤ２とで偏りがある場合に発生するが、このようなケースが頻発することは少ないと考える。
（ｂ）キー値の価域に重複がない場合と大小関係が反転しない場合
大小関係の反転を求めて比較を続け、領域の頭部または端部に至っても反転しない場合である。このときは次のように扱うことができる。すなわち、頭部に達しても反転しない場合は頭部の外側に無限大のキーを仮定して強制的に反転させ、尾部に至っても反転しない場合は尾部の外に無限小のキーを仮定して反転させる。
なお、上記例ではデータ列Ｄ１とＤ２のデータ数は同数を仮定していた。本発明はこれに限定されない。整列タスクや併合タスクにおいてデータ数を指定しさえすればＤ１とＤ２のデータの数が異なる場合にも適用できる。
本発明は汎用的な技術であり、主記憶を共有する汎用的な並列プロセッサ方式の電子計算機に特に適合性が高い。しかし整列対象のデータ群が共通にアクセスできる環境にあればシステムの構成や処理形態を問わず適用できると考えられる。本発明は、並列プロセッサ方式の電子計算機のソフトウェア（ＯＳ）に組み込まれるプログラムのひとつとして実現されると考えられる。
発明の実施の形態２．
発明の実施の形態１の装置／方法は、図２に示すように正順併合と逆順併合を同時に用いるものであった。この発明は正順併合と逆順併合のいずれか一方しか用いない場合にも適用できる。図１２は並列２分木マージソート法に適用した場合のフローチャートである。この場合は初段のマージから２分割するので常にｐ個のプロセッサが動作する。マージ処理を行う並列プロセッサも正順併合か逆順併合のいずれかの機能を装備するだけでよいので実現は簡単になる。
実施形態２の処理内容は発明の実施の形態１の場合と同様であるので、その説明を省略する。なお、図１２が図２と異なる部分はＳ４ｂとＳ５ｂとＳ６ｂである。
本発明は、以上の実施の形態に限定されることなく、特許請求の範囲に記載された発明の範囲内で、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
また、本明細書において、手段とは必ずしも物理的手段を意味するものではなく、各手段の機能が、ソフトウェアによって実現される場合も包含する。さらに、一つの手段の機能が、二つ以上の物理的手段により実現されても、若しくは、二つ以上の手段の機能が、一つの物理的手段により実現されてもよい。
【図面の簡単な説明】
図１は、発明の実施の形態に係る並列マージソート処理装置の概要を示す図である。
図２は、発明の実施の形態１に係る処理フローチャートである。
図３は、発明の実施の形態に係る処理全体の説明図である。
図４は、発明の実施の形態に係る処理の説明図である。
図５は、発明の実施の形態に係る処理の説明図である。
図６は、発明の実施の形態に係る処理の説明図である。
図７は、発明の実施の形態に係る処理の一部の説明図である。
図８は、発明の実施の形態に係る領域分割のフローチャートである（正順併合）。
図９は、発明の実施の形態に係る領域分割のフローチャートである（逆順併合）。
図１０は、発明の実施の形態に係る領域分割の説明図である。
図１１は、発明の実施の形態に係る領域分割の例を示す図である。
図１２は、発明の実施の形態２に係る処理フローチャートである。
図１３は、従来の並列マージソート処理のフローチャートである。
図１４は、従来の並列マージソート処理の説明図である。
【図１】
2003091872.tif 000003
【図２】
2003091872.tif 000004
【図３】
2003091872.tif 000005
【図４】
2003091872.tif 000006
【図５】
2003091872.tif 000007
【図６】
2003091872.tif 000008
【図７】
2003091872.tif 000009
【図８】
2003091872.tif 000010
【図９】
2003091872.tif 000011
【図１０】
2003091872.tif 000012
【図１１】
2003091872.tif 000013
【図１２】
2003091872.tif 000014
【図１３】
2003091872.tif 000015
【図１４】
2003091872.tif 000016
【国際調査報告】
2003091872.tif 000017
2003091872.tif 000018