本発明は、大量のデータを処理する情報処理方法及び情報処理装置に係わり、特に、並列コンピュータのアーキテクチャを採用した情報処理方法及び情報処理システムに関する。
従来、大量の情報を蓄積し、蓄積された情報を検索、集計するデータ処理が行われている。これらのデータ処理は、例えば、CPUと、メモリと、周辺機器インタフェースと、ハードディスクのような補助記憶装置と、ディスプレイ及びプリンタのような表示装置と、キーボード及びマウスのような入力装置と、電源ユニットとがバスを介して接続された周知のコンピュータシステムで使用され、特に、市場で容易に入手可能なコンピュータシステムで動作可能なソフトウェアとして提供される。上記の検索・集計等のデータ処理を行うため、特に、大量のデータを蓄積する各種データベースが知られている。大量のデータの中でも、特に、表形式で表現され得るデータを処理したいという要求は強い。
大量のデータを効率よく検索、集計できるか否かは、大量のデータを格納する形式に依存する。従来、一般的な格納技術として、所謂「行単位」格納技術及び「項目単位」格納技術が知られている。行単位格納技術の場合、レコード番号毎に構成された性別、年齢及び職業の項目値の組がレコード番号順に、論理的アドレスが増加する順番でディスク上に格納されている。一方、項目単位格納技術の場合、項目毎にレコード番号順に、項目値が、論理的アドレスが増加する方向にディスク上に格納されている。
上記の従来技術の場合、全てのレコード番号の全ての項目に対する項目値が、そのまま、(レコード番号の1次元と、それ以外の項目値の1次元とからなる)2次元のデータ構造に格納されている。以下、このようなデータ構造を特に「データ表」と称する。従来技術の場合、蓄積されたデータを検索、集計する際には、このデータ表をアクセスすることにより行われている。
また、項目の値をそのまま項目値として格納する方法の他に、値をコード変換して、項目値としてコードを格納する方法も知られている。この場合でも、コード変換されたコードが項目値としてデータ表に格納されている点に変わりはない。
上記従来技術のデータ表タイプのデータ構造を用いて格納された大量のデータを検索、集計する場合、このようなデータ表をアクセスするためのアクセス時間に起因して検索、集計の処理時間が長くなるという問題点がある。
また、データ表には少なくとも以下に述べる本質的な欠点がある。
(1)データ表はサイズが巨大化しやすく、しかも例えば項目毎等に(物理的に)分割することが困難である。実際上、集計・検索のためにデータ表をメモリなどの高速な記憶装置上に展開することは困難である。
(2)データ表は、各項目値を同時にソートした形で保持できない。
(3)データ表には、同一値が何度も出現する。
これに対して、本願発明者は、大量のデータの検索・集計のスピードを大幅に向上させるため、従来のデータ表の機能を有すると共に、データ表に基づくデータ構造の上記問題点が解決されたデータ管理機構を設けることにより、表形式データを検索・集計・ソートする方法及びその方法を実施する装置を提案している(例えば、特許文献1を参照。)。
提案された表形式データを検索・集計する方法及び装置は、通常のコンピュータシステムで使用可能な新規のデータ管理機構を導入する。このデータ管理機構は原則として値管理テーブルと、値管理テーブルへのポインタ配列とを有する。
図1は、従来のデータ管理機構の説明図である。同図には、値管理テーブル110と値管理テーブルへのポインタ配列120とが示されている。値管理テーブル110とは、表形式データの各項目に対し、その項目に属する項目値が順序付け(整数化)された項目値番号の順番に、上記項目値番号に対応した項目値(符号111参照)と、上記項目値に関連した分類番号(符号112参照)とが格納されたテーブルである。値管理テーブルへのポインタ配列120とは、表形式データのある列(即ち、項目)の項目値番号、即ち値管理テーブル110へのポインタが表形式データのレコード番号順に格納された配列である。
値管理テーブルへのポインタ配列120と値管理テーブル110とを組み合わせることにより、あるレコード番号が与えられたとき、所定の項目に関する値管理テーブルへのポインタ配列120からそのレコード番号に対応して格納された項目値番号を取り出し、次に、値管理テーブル110内でその項目値番号に対応して格納された項目値を取り出すことにより、レコード番号から項目値を得ることができる。したがって、従来のデータ表と同様に、レコード番号(行)と項目(列)という座標を用いて全てのデータ(項目値)を参照することができる。
このように表形式データの項目中のある項目に対して生成された値管理テーブルと、値管理テーブルへのポインタ配列とを含むデータ管理機構は、以下の説明では、特に情報ブロックと呼ぶ場合がある。
従来のデータ表は、レコードに対応した行と、項目に対応した列とからなる座標を用いて全てのデータを一体的に管理しているのに対して、この情報ブロックは、表形式の列、即ち、項目毎にデータを完全に分離している点に特徴がある。このデータ管理機構によれば、大量のデータが項目毎に分離されているので、検索・集計に必要な項目に関するデータのみをメモリ等の高速な記憶装置上に取り込むことが可能であり、その結果としてデータへのアクセス時間が短縮されるので、検索・集計の処理が高速化され、項目数が非常に多いデータの場合でも、パフォーマンスを低下させることなく取り扱えるようになる。
また、この情報ブロックの場合、項目値は値管理テーブルに格納され、値が存在する位置を示すレコード番号は値管理テーブルへのポインタ配列に関連付けられているので、項目値がレコード番号順に並べられている必要がない。したがって、検索・集計に適するようにデータを項目値に関してソートすることができるようになる。これにより、目的の値と一致する項目値がデータ中に存在するか否かの判定が高速に行えるようになる。その上、項目値は項目値番号と対応しているので、項目値が長いデータや文字列等であっても整数として取り扱うことができる。
さらに、このデータ管理機構によれば、値管理テーブル110の全ての項目値番号は異なる項目値と対応しているので、特定の値を有する項目値を含むレコードを抽出する場合に必要とされる特定の値と項目値との比較の回数は、最大で項目値の種類の数、即ち、項目値番号の個数であり、比較演算の回数が著しく低減され、検索・集計の高速化が図られる。その際には、ある項目値が該当するかどうかを調べた結果を格納する場所が必要であるが、例えば分類番号112をその格納場所として使用することができる。
図2には、項目値を格納した項目値配列211と、分類番号を格納した分類番号配列212と、存在数を格納した存在数配列214とからなる値管理テーブル210を含む情報ブロックが示されている。存在数配列214には、ある項目に関する各項目値が全データ中に何個ずつ存在するかを示す数、換言すれば、所定の項目値を有するレコードの個数が格納される。このような存在数配列214を値管理テーブル210に準備しておくことにより、検索・ソート・集計の際に必要とされる「どのようなデータが(いくつ)存在するか?」、「このデータは上から何番目のデータであるか?」、或いは、「上から○○番目のデータは何か?」というような情報を直ちに得ることができるようになり、検索・ソート・集計の高速化が図れる。
しかし、このようなデータ管理機構においても、レコード数が増大するのにしたがって、上記値リストやポインタ配列、特に、ポインタ配列は非常に大きくなるが、処理可能なデータ量は、利用されるハードウェア資源によって制限される。
大規模データの処理は、上記のような表形式データの情報処理以外の分野でも要求されている。社会全体のさまざまな場所にコンピュータが導入され、インターネットをはじめとするネットワークが浸透した今日では、そこここで、大規模なデータが蓄積されるようになった。このような大規模データを処理するには、膨大な計算が必要で、そのために並列処理を導入しようと試みるのは自然である。
並列処理アーキテクチャは「共有メモリ型」と「分散メモリ型」に大別される。前者(「共有メモリ型」)は、複数のプロセッサが1つの巨大なメモリ空間を共有する方式である。この方式では、プロセッサ群と共有メモリ間のトラフィックがボトルネックとなるので、百を越えるプロセッサを用いて現実的なシステムを構築することは容易ではない。したがって、例えば10億個の浮動小数点変数の平方根を計算する際、単一CPUに対する加速比は、せいぜい100倍ということになる。経験的には、30倍程度が上限である。
後者(「分散メモリ型」)は、各プロセッサがそれぞれローカルなメモリを持ち、これらを結合してシステムを構築する。この方式では、数百〜数万ものプロセッサを組み込んだハードウェアシステムの設計が可能である。したがって、上記10億個の浮動小数点変数の平方根を計算する際の単一CPUに対する加速比を、数百〜数万倍とすることが可能である。
国際公開第WO00/10103号パンフレット
しかしながら、「分散メモリ型」の並列処理アーキテクチャにもいくつかの課題が存在する。
[第1の課題:巨大配列の分掌管理]
「分散メモリ型」の第1の課題は、データの分掌管理の問題である。
巨大なデータ(一般的には配列なので、以降、配列で説明する)は、1つのプロセッサの所有するローカルメモリに収容できるものではなく、必然的に複数のローカルメモリに分掌管理される。効率的かつ柔軟な分掌管理メカニズムを導入しないと、プログラムの開発および実行に際してさまざまな障害を抱え込むことになることは明らかである。
[第2の課題:プロセッサ間通信の効率の低さ]
分散メモリ型システムの各プロセッサが、巨大配列にアクセスしようとすると、自己の所有するローカルメモリ上の配列要素に対しては速やかにアクセスできるものの、他のプロセッサが所有する配列要素へのアクセスはプロセッサ間通信を必須とする。このプロセッサ間通信はローカルメモリとの通信に比べ、極端にパフォーマンスが低く、最低でも100クロックかかると言われている。このため、ソート実施時には、巨大配列全域にわたる参照が実施され、プロセッサ間通信が多発するため、パフォーマンスが極端に低下する。
この問題点につき、より具体的に説明を加える。1999年現在、パソコンは、1〜数個のCPUを用いて、「共有メモリ型」として構成されている。このパソコンに使用される標準的なCPUは、メモリバスの5〜6倍程度の内部クロックで動作し、その内部に自動的な並列実行機能やパイプライン処理機能が装備されており、およそ1データを1クロック(メモリバス)で処理できる。
このため、「分散メモリ型」のマルチプロセッサシステムでは、プロセッサ数は多いのに、シングルプロセッサ(共有メモリ型)よりも100倍遅くなることになりかねない。
[第3の課題:プログラムの供給]
「分散メモリ型」の第3の課題は、多数のプロセッサにどうやってプログラムを供給するか、という問題である。
非常に多数のプロセッサに、別々のプログラムをロードし、全体を協調動作させる方式(MIMD:Multiple Instruction Stream, Multiple Data Stream)では、プログラムの作成、コンパイル、配信のために多大な負荷を要する。
その一方、多数のプロセッサを同一のプログラムで動作させる方式(SIMD:Single Instruction Stream, Multiple Data Stream)では、プログラムの自由度が減少し、所望の結果をもたらすプログラムが開発できない事態も想定される。
したがって、上記の従来の分散メモリ型の並列アーキテクチャに基づく情報処理技術では、プロセッサ間通信ができるだけ少なくなるように、大規模データをプロセッサ間で共有することなく、大規模データを個々のプロセッサ内に保持したまま、大規模データの処理を実現することが求められている。
そこで、本発明は、並列コンピュータのアーキテクチャを採用して大量のデータを情報処理する際に、複数のプロセッサ間でのデータ処理を少ない通信量で高速に実現するための情報処理方法の提供を目的とする。
更に、本発明は、上記の情報処理方法を実現する情報処理システムの提供を目的とする。
また、本発明は、上記の情報処理方法を実現するためコンピュータによって実行されるプログラムの提供を目的とする。
本発明は、表形式データの実体的要素である値リスト及びポインタ配列を個々の処理モジュールにローカルに保存し、複数の処理モジュール間では、データ自体ではなく、データの順序番号(又は、順位)という指標がグローバルに保持されるという分散メモリ型の並列処理アーキテクチャを採用している。また、本発明は、単一命令により種々のメモリに記憶されたデータを入出力し処理するように、処理と通信が統合されたアルゴリズムを採用している。
上記目的を達成するため、本発明によれば、値のリストを格納しているメモリをそれぞれに有する複数の処理モジュールが論理的に環状に接続されている情報処理システムにおいて、複数の処理モジュール間で相互にデータを通信し処理する情報処理方法は、請求項1に記載されるように、
各処理モジュールが、自処理モジュールのメモリに格納されている値のリストである第1のリストを情報処理システム内の他の処理モジュールへ送信するステップと、
各処理モジュールが、他の処理モジュールから自処理モジュールへ送信された値のリストである少なくとも一つの第2のリストを受信するステップと、
各処理モジュールが、前記第2のリスト中の値と、前記第1のリスト中の値を比較するステップと、
前記第2のリスト中の値が前記第1のリスト中の値と一致した場合に、各処理モジュールが、前記第1のリスト中の前記一致した値に対応したカウンタを1ずつ増やすステップと、
を有する。これにより、複数の処理モジュール間に重複のある整数、文字列、浮動小数点などの値が分散して存在している場合に、それらの値を処理モジュール間で相互に交換することによって、マッチングした値の出現数を計数することが可能になる。
また、上記目的を達成するため、本発明によれば、値のリストを格納しているメモリをそれぞれに有する複数の処理モジュールが論理的に環状に接続されている情報処理システムにおいて、複数の処理モジュール間で相互にデータを通信し処理する情報処理方法は、請求項2に記載されるように、
各処理モジュールが、自処理モジュールのメモリに格納されている値と該値の個数の対のリストである第1のリストを前記情報処理システム内の他の処理モジュールへ送信するステップと、
各処理モジュールが、他の処理モジュールから自処理モジュールへ送信された値と該値の個数の対のリストである少なくとも一つの第2のリストを受信するステップと、
各処理モジュールが、前記第2のリスト中の値と、前記第1のリスト中の値を比較するステップと、
前記第2のリスト中の値が前記第1のリスト中の値と一致した場合に、各処理モジュールが、前記第1のリスト中の前記一致した値に対応したカウンタを、前記第2のリスト中の前記一致した値に対応した該値の個数分ずつ増やすステップと、
を有する。これにより、複数の処理モジュール間に重複のある整数、文字列、浮動小数点などの値が分散して存在している場合に、それらの値、及び、各処理モジュール内に存在するそれらの値の個数を処理モジュール間で相互に交換することによって、マッチングした値の出現数を計数する際に、データ交換に要する通信量を削減することが可能になる。
また、上記目的を達成するため、本発明によれば、値のリストを格納しているメモリをそれぞれに有する複数の処理モジュールが論理的に環状に接続されている情報処理システムにおいて、複数の処理モジュール間で相互にデータを通信し処理する情報処理方法は、請求項3に記載されるように、
各処理モジュールが、自処理モジュールのメモリに格納されている値のリストである第1のリストを情報処理システム内の他の処理モジュールへ送信するステップと、
各処理モジュールが、他の処理モジュールから自処理モジュールへ送信された値のリストである少なくとも一つの第2のリストを受信するステップと、
各処理モジュールが、前記第2のリスト中の値と、前記第1のリスト中の値を比較するステップと、
前記第2のリスト中の値よりも後に順位付けされる値が前記第1のリスト中に存在する場合、各処理モジュールが、前記第2のリスト中の値の直後に順位付けされる前記第1の
リスト中の値に対応したカウントを1ずつ増やすステップと、
を有する。これにより、複数の処理モジュール間に重複のある整数、文字列、浮動小数点などの値が分散して存在している場合に、それらの値を処理モジュール間で相互に交換することによって、累計数を算出し、値を順序付けることが可能になる。
また、上記目的を達成するため、本発明によれば、値のリストを格納しているメモリをそれぞれに有する複数の処理モジュールが論理的に環状に接続されている情報処理システムにおいて、複数の処理モジュール間で相互にデータを通信し処理する情報処理方法は、請求項4に記載されるように、
各処理モジュールが、自処理モジュールのメモリに格納されている値と該値の個数の対のリストである第1のリストを情報処理システム内の他の処理モジュールへ送信するステップと、
各処理モジュールが、他の処理モジュールから自処理モジュールへ送信された値と該値の対のリストである少なくとも一つの第2のリストを受信するステップと、
各処理モジュールが、前記第2のリスト中の値と、前記第1のリスト中の値を比較するステップと、
前記第2のリスト中の値よりも後に順位付けされる値が前記第1のリスト中に存在する場合、各処理モジュールが、前記第2のリスト中の値の直後に順位付けされる前記第1のリスト中の値に対応したカウントを、前記第2のリスト中の前記値に対応した前記値の個数分ずつ増やすステップと、
を有する。これにより、複数の処理モジュール間に重複のある整数、文字列、浮動小数点などの値が分散して存在している場合に、それらの値、及び、各処理モジュール内に存在するそれらの値の個数を処理モジュール間で相互に交換することによって、累計数を算出し、値を順序付ける際に、データ交換に要するデータ量を削減することが可能になる。
また、上記目的を達成するため、本発明によれば、値のリストを格納しているメモリをそれぞれに有する複数の処理モジュールが論理的に環状に接続されている情報処理システムにおいて、複数の処理モジュール間で相互にデータを通信し処理する情報処理方法は、請求項5に記載されるように、
各処理モジュールが、自処理モジュールのメモリに格納されている値のリストである第1のリストを情報処理システム内の他の処理モジュールへ送信するステップと、
各処理モジュールが、他の処理モジュールから自処理モジュールへ送信された値のリストである少なくとも一つの第2のリストを受信するステップと、
各処理モジュールが、前記第2のリスト中の値が前記第1のリスト中に存在する場合に、前記第2のリスト中の前記値を消去し、二つ以上の前記第2のリスト中に同じ値が重複して出現する場合に、後から出現した方の第2のリスト中の該値を消去するステップと、
各処理モジュールが、前記第2のリスト中の値よりも後に順位付けされる値が前記第1のリスト中に存在する場合に、前記第2のリスト中の値の直後に順位付けされる前記第1のリスト中の値に対応したカウントを1ずつ増やすステップと、
を有する。これにより、複数の処理モジュール間に重複のある整数、文字列、浮動小数点などの値が分散して存在している場合に、それらの値を処理モジュール間で相互に交換することによって、それらの値に複数の処理モジュール間で共通の順序番号を付与することが可能になる。
請求項1乃至5に記載された情報処理方法において、請求項6に記載されるように、
前記各処理モジュールは、情報の項目に対応した項目値を含むレコードの配列として表される表形式データを、項目値に対応した項目値番号の順序に該項目値が格納されている値リスト、及び、レコードの順番に項目値番号を指定する情報が格納されたポインタ配列の形式でメモリに記憶し、前記値のリストは前記表形式データを構成する前記値リストである。これにより、リスト内のデータが予め昇順若しくは降順に並べられるので、比較のための演算を高速に行うことが可能になる。
また、上記目的を達成するため、本発明によれば、値のリストを格納しているメモリをそれぞれに有する複数の処理モジュールと、複数の処理モジュールを論理的に環状に接続する接続路と、を含み、複数の処理モジュール間で相互にデータを通信し処理する情報処理システムは、請求項7に記載されるように、
各処理モジュールが、
自処理モジュールのメモリに格納されている値のリストである第1のリストを情報処理システム内の他の処理モジュールへ送信する手段と、
他の処理モジュールから自処理モジュールへ送信された値のリストである少なくとも一つの第2のリストを受信する手段と、
前記第2のリスト中の値と、前記第1のリスト中の値を比較する手段と、
前記第2のリスト中の値が前記第1のリスト中の値と一致した場合に、各処理モジュールが、前記第1のリスト中の前記一致した値に対応したカウンタを1ずつ増やす手段と、
を有する。これにより、複数の処理モジュール間に重複のある整数、文字列、浮動小数点などの値が分散して存在している場合に、それらの値を処理モジュール間で相互に交換することによって、マッチングした値の出現数を計数することが可能になる。
また、上記目的を達成するため、本発明によれば、値のリストを格納しているメモリをそれぞれに有する複数の処理モジュールと、複数の処理モジュールを論理的に環状に接続する接続路と、を含み、複数の処理モジュール間で相互にデータを通信し処理する情報処理システムは、請求項8に記載されるように、
各処理モジュールが、
自処理モジュールのメモリに格納されている値と該値の個数の対のリストである第1のリストを前記情報処理システム内の他の処理モジュールへ送信する手段と、
他の処理モジュールから自処理モジュールへ送信された値と該値の個数の対のリストである少なくとも一つの第2のリストを受信する手段と、
前記第2のリスト中の値と、前記第1のリスト中の値を比較する手段と、
前記第2のリスト中の値が前記第1のリスト中の値と一致した場合に、前記第1のリスト中の前記一致した値に対応したカウンタを、前記第2のリスト中の前記一致した値に対応した該値の個数分ずつ増やす手段と、
を有する。これにより、複数の処理モジュール間に重複のある整数、文字列、浮動小数点などの値が分散して存在している場合に、それらの値、及び、各処理モジュール内に存在するそれらの値の個数を処理モジュール間で相互に交換することによって、マッチングした値の出現数を計数する際に、データ交換に要する通信量を削減することが可能になる。
また、上記目的を達成するため、本発明によれば、値のリストを格納しているメモリをそれぞれに有する複数の処理モジュールと、複数の処理モジュールを論理的に環状に接続する接続路と、を含み、複数の処理モジュール間で相互にデータを通信し処理する情報処理システムは、請求項9に記載されるように、
各処理モジュールが、
自処理モジュールのメモリに格納されている値のリストである第1のリストを情報処理システム内の他の処理モジュールへ送信する手段と、
他の処理モジュールから自処理モジュールへ送信された値のリストである少なくとも一つの第2のリストを受信する手段と、
前記第2のリスト中の値と、前記第1のリスト中の値を比較する手段と、
前記第2のリスト中の値よりも後に順位付けされる値が前記第1のリスト中に存在する場合、前記第2のリスト中の値の直後に順位付けされる前記第1のリスト中の値に対応したカウントを1ずつ増やす手段と、
を有する。これにより、複数の処理モジュール間に重複のある整数、文字列、浮動小数点などの値が分散して存在している場合に、それらの値を処理モジュール間で相互に交換することによって、累計数を算出し、値を順序付けることが可能になる。
また、上記目的を達成するため、本発明によれば、値のリストを格納しているメモリをそれぞれに有する複数の処理モジュールと、複数の処理モジュールを論理的に環状に接続する接続路と、を含み、複数の処理モジュール間で相互にデータを通信し処理する情報処理システムは、請求項10に記載されるように、
各処理モジュールが、
自処理モジュールのメモリに格納されている値と該値の個数の対のリストである第1のリストを情報処理システム内の他の処理モジュールへ送信する手段と、
他の処理モジュールから自処理モジュールへ送信された値と該値の対のリストである少なくとも一つの第2のリストを受信する手段と、
前記第2のリスト中の値と、前記第1のリスト中の値を比較する手段と、
前記第2のリスト中の値よりも後に順位付けされる値が前記第1のリスト中に存在する場合、前記第2のリスト中の値の直後に順位付けされる前記第1のリスト中の値に対応したカウントを、前記第2のリスト中の前記値に対応した前記値の個数分ずつ増やす手段と、
を有する。これにより、複数の処理モジュール間に重複のある整数、文字列、浮動小数点などの値が分散して存在している場合に、それらの値、及び、各処理モジュール内に存在するそれらの値の個数を処理モジュール間で相互に交換することによって、累計数を算出し、値を順序付ける際に、データ交換に要するデータ量を削減することが可能になる。
また、上記目的を達成するため、本発明によれば、値のリストを格納しているメモリをそれぞれに有する複数の処理モジュールと、複数の処理モジュールを論理的に環状に接続する接続路と、を含み、複数の処理モジュール間で相互にデータを通信し処理する情報処理システムは、請求項11に記載されるように、
各処理モジュールが、
自処理モジュールのメモリに格納されている値のリストである第1のリストを情報処理システム内の他の処理モジュールへ送信する手段と、
他の処理モジュールから自処理モジュールへ送信された値のリストである少なくとも一つの第2のリストを受信する手段と、
前記第2のリスト中の値が前記第1のリスト中に存在する場合に、前記第2のリスト中の前記値を消去し、二つ以上の前記第2のリスト中に同じ値が重複して出現する場合に、後から出現した方の第2のリスト中の該値を消去する手段と、
前記第2のリスト中の値よりも後に順位付けされる値が前記第1のリスト中に存在する場合に、前記第2のリスト中の値の直後に順位付けされる前記第1のリスト中の値に対応したカウントを1ずつ増やす手段と、
を有する。これにより、複数の処理モジュール間に重複のある整数、文字列、浮動小数点などの値が分散して存在している場合に、それらの値を処理モジュール間で相互に交換することによって、それらの値に複数の処理モジュール間で共通の順序番号を付与することが可能になる。
請求項7乃至11に記載された情報処理方法において、請求項12に記載されるように、
前記各処理モジュールは、情報の項目に対応した項目値を含むレコードの配列として表される表形式データを、項目値に対応した項目値番号の順序に該項目値が格納されている値リスト、及び、レコードの順番に項目値番号を指定する情報が格納されたポインタ配列の形式で記憶するメモリを具備し、前記値のリストは前記表形式データを構成する前記値リストである。これにより、リスト内のデータが予め昇順若しくは降順に並べられるので、比較のための演算を高速に行うことが可能になる。
更に、上記目的を達成するため、本発明のプログラムは、請求項13乃至18に記載されているように、上記本発明の情報処理方法の各ステップをコンピュータに実行させ、或いは、上記本発明の情報処理システムの各機能をコンピュータに実現させる。これにより、本発明の様々な機能をコンピュータに実現させるためのプログラムを提供することができる。このプログラムは、通信回線や記録媒体を用いてコンピュータに提供することが可能である。
更に、請求項18に係る発明は、請求項13乃至17のうちいずれか1項記載のプログラムを記録したコンピュータ読み取り可能な記録媒体を提供する。
本発明によれば、分散メモリ型の並列処理アーキテクチャに基づいて、新規のデータ構造及び並列処理アルゴリズムを採用することにより、著しく高速な並列処理を実現可能な情報処理方法及び情報処理システムを提供することが可能となる。
[ハードウェア構成]
以下、添付図面を参照して、本発明の実施の形態につき説明を加える。図3は、本発明の実施の形態にかかる情報処理システムの概略を示すブロックダイヤグラムである。この実施形態では、処理モジュールは、プロセッサ付きメモリモジュール(以下、「PMM」と称する)により構成される。図3に示すように、この実施の形態においては、複数の処理モジュールを論理的に環状に接続するため、複数のプロセッサ付きメモリモジュールPMM32−0、PMM32−1、PMM32−2、・・・がリング状に配置され、隣接するメモリモジュール間を、時計回りにデータを伝達する第1のバス(たとえば、符号34−0、34−1参照)、および、反時計回りにデータを伝達する第2のバス(たとえば、符号36−0、36−1参照)が接続している。第1のバスおよび第2のバスでは、PMM間のパケット通信が実行される。本実施の形態において、このパケット通信が実行される伝送路(パケット伝送路)を、第1のバスおよび第2のバスと称する。
本実施の形態では、PMMを、一方が時計回りにパケットを伝送する第1のバス(第1の伝送路)、他方が反時計回りにパケットを伝送する第2のバス(第2の伝送路)にて、リング状に接続している。このような構成は、パケット伝送の遅延時間などを均一化することができるため有利である。
尚、処理モジュール間の物理的な接続形態は、本実施の形態に示されるような形態に限定されるものではなく、処理モジュールを論理的に環状に接続できる形態であればどのような形態でもよく、例えば、バス型、スター型などの種々の接続形態を採用することができる。
図4は、PMM32の構造の一例を示す図である。図4に示すように、各PMM32−iは、PMM間で共通の命令にしたがって、メモリのアクセス、演算の実行などを制御する制御回路40と、バスインタフェース(I/F)42と、メモリ44とを備えている。
メモリ44は、複数のバンクBANK0、1、・・・、n(符号46−0、・・・、n)を有し、それぞれに、後述する所定の配列を記憶できるようになっている。また、制御回路40は、外部の他のコンピュータ等とのデータ授受が可能である。また、他のコンピュータが、バスアービトレーションにより、メモリの所望のバンクにアクセスできるようにしても良い。
[処理の対象]
本実施の形態における情報処理の一例は集計処理である。集計とは、例えば、情報の項目に対応した項目値を含むレコードの配列として表される表形式データから、ある項目(次元)のある項目値(次元値)毎に、別の項目の項目値(メジャー)を集計することである。メジャーの集計とは、メジャーの個数をカウントしたり、メジャーの総和を算出したり、メジャーの平均値を算出したりすることである。また、次元数は、2次元以上でも構わない。例えば、図5は、ある保育園における園児の性別・年齢・身長の論理的な表形式データである。ここで、性別の人数を求める処理や、性別・年齢別に身長の合計値を求める処理は、本実施の形態における情報処理の一例としての集計処理である。
[従来のデータの記憶構造]
図5に示された表形式データは、上述の国際公開第WO00/10103号に提案したデータ管理機構を用いることにより、単一コンピュータ内では図6に示されるようなデータ構造として記憶される。図5に示すように、表形式データの各レコードの並び順の番号と、内部データの並び順の番号を対応付ける配列601(以下、この配列を「OrdSet」のように略記する。)には、表形式の各レコード毎に内部データの並び順番号が値として配置される。この例では、すべての表形式データが内部データとして表されるため、表形式データのレコード番号と内部データの並び順番号とは一致する。
例えば、性別に関しては、表形式データのレコード0に対応する内部データの並び順番号は、配列OrdSet601から「0」であることがわかる。並び順番号が「0」であるレコードに関する実際の性別の値、即ち、「男」又は「女」は、実際の値が所定の順序に従ってソートされた値リスト603(以下、値リストを「VL」のように略記する。)へのポインタ配列602(以下、ポインタ配列を「VNo」のように略記する。)を参照することによって取得できる。ポインタ配列602は、配列OrdSet601に格納されている並び順番号の順に従って、実際の値リスト603中の要素を指し示すポインタを格納している。これにより、表形式データのレコード「0」に対応する性別の項目値は、(1)配列OrdSet601からレコード「0」に対応する並び順番号「0」を取り出し、(2)値リストへのポインタ配列602から並び順番号「0」に対応する要素「1」を取り出し、(3)値リスト603から、値リストへのポインタ配列602から取り出された要素「1」によって指し示される要素「女」を取り出すことにより取得できる。
他のレコードに対しても、また、年齢及び身長に関しても同様に項目値を取得することができる。
このように表形式データは、値リストVLと、値リストへのポインタ配列VNoの組合せにより表現され、この組合せを、特に、「情報ブロック」とも称する。図6には、性別、年齢及び身長に関する情報ブロックがそれぞれ情報ブロック608、609及び610として示されている。
単一のコンピュータが、単一のメモリ(物理的には複数であっても良いが、単一のアドレス空間に配置されアクセスされるという意味で単一のメモリ)であれば、当該メモリに、順序集合の配列OrdSet、各情報ブロックを構成する値リストVLおよびポインタ配列VNoとを記憶しておけばよい。しかしながら、大量のレコードを保持するためには、その大きさに伴ってメモリ容量も大きくなるため、これらを分散配置できるのが望ましい。また、処理の並列化の観点からも、分散配置された情報を分掌把握できるのが望ましい。そこで、本実施の形態においては、複数のPMMが、重なることなくレコードのデータを分掌把握し、PMM同士のパケット通信により、高速な集計を実現している。
[本実施の形態によるデータ記憶構造]
図7は、本実施の形態によるデータ記憶構造の説明図である。同図では、図5及び図6によって示された表形式のデータが、一例として、PMM−0、PMM−1、PMM−2及びPMM−3の4個の処理モジュールに分散配置され、分掌把握されている。説明の便宜上、処理モジュールの個数は4個であるが、本発明は処理モジュールの個数によって限定されるものではない。
本実施の形態では、各PMMで分掌把握されているレコードを、PMM−0からPMM−3までの4個のPMMで掌握されているすべてのレコードの中で一意に順序付けることができるようにするため、各レコードにはグローバル・レコード番号が一意に割り当てられている。図7では、グローバル・レコード番号は「GOrd」として表されている。このグローバル・レコード番号GOrdは、各PMM内の配列OrdSetの各要素が、すべてのレコード中で何番目であるかを示している。ここで、配列OrdSetは、データ全体から各PMM内部への順序保存写像となるように定められているので、GOrdは昇順にすることができる。また、各PMM内において、GOrd配列(=グローバル順序集合配列)のサイズはOrdSet配列(順序集合配列)のサイズと一致している。
更に、本実施の形態では、各PMMで分掌把握されている項目値、即ち、値リストVL中の各値が、すべてのPMMで掌握されている項目値の中で何番目の位置にあるかを示すためのグローバル項目値番号が設けられる。図7では、このグローバル項目値番号は「GVNo」として示されている。値リストVLは値の順(例えば、昇順又は降順)に並べられているので、グローバル項目値番号GVNoも昇順(又は降順)に設定される。配列GVNoのサイズは、配列VLのサイズと一致している。各処理モジュールで個別に掌握されている項目値が全体の中で何番目であるかを識別することにより、各処理モジュールでの集計結果を全体として一つに統合することが可能になる。
尚、図7において、各PMMに割り当てられている値OFFSETは、当該PMMが分掌する先頭のレコードが、図6に示された一体的なレコードの中の何番目のレコードに対応しているかを示すためのオフセット値である。上述のように、各PMMの配列OrdSetは、データ全体から各PMM内部への順序保存写像となるように定められているので、このオフセット値OFFSETと当該PMMにおける配列OrdSetの要素の値を合計した値は、グローバル・レコード番号GOrdと一致する。好ましくは、このオフセット値が各PMMに通知され、各PMMはこのオフセット値OFFSETに基づいてグローバル・レコード番号を決定することができる。
各PMMのグローバル・レコード番号GOrd及びグローバル項目値番号GVNoは、予め各PMMの外部で計算して各PMMに設定することができるが、後述のコンパイル処理によって各PMM自体が設定することも可能である。
[グローバル集合配列Gordとグローバル項目値番号配列GNoについて]
次に、本実施の形態にて導入した配列GOrdおよび配列GVNoの意義について説明する。グローバル順序集合配列GOrdは、各PMMが掌握するローカルな表形式データを集合させたグローバルな表形式データ中、各PMMの掌握する表形式データの各レコードの位置(順位)を示している。即ち、本実施の形態では、グローバル順序集合配列GOrd及び順序集合配列OrdSetにより、レコードの位置情報を、グローバルな成分とローカルな成分とに分離し、これにより、グローバルな表形式データを扱うことが可能となるとともに、各PMMが単独で処理を実行することも可能となる。
以下の実施例の説明では、PMMが各項目の情報ブロックを保持するように構成されているが、PMMが表形式データをそのまま保持するような場合でも、上記GOrdは同様に機能する。
例えば、以下の実施例においてコンパイルが終了した状態で、グローバル順序集合配列GOrdの値の順序で、各項目の項目値を取り出していくことにより、表形式データ全体のビューを作成することができる。
[集計処理]
次に、本実施の形態による集計処理を説明する。実施例1による集計アルゴリズムは、すべての処理モジュールで同じ処理を実行できるように構成されている。また、この集計アルゴリズムは、単一の集計処理命令を複数の処理モジュールへ与えることにより、複数の処理モジュールが並列に動作して集計処理を実行できるように構成されている。すべての処理モジュールは、同じ動作を実行するので、一つのプログラムを作成するだけで、並列処理を実現できる。
実施例1の集計アルゴリズムは、集計のための次元値にすべての処理モジュール間で共通のグローバル次元値番号を付与し、各処理モジュール内で次元値番号毎にメジャーを集計し、最後に、グローバルに、即ち、すべての処理モジュール間で共通にメジャーを集計する。このため、実施例1の集計アルゴリズムによれば、値リスト、及び、値リストへのポインタ配列は、各処理モジュールでローカルに保持される。また、この集計アルゴリズムによれば、値リスト及びポインタ配列は、複数の処理モジュール間で共通に保持されるのではなく、次元値の順番という基準が複数の処理モジュール間でグローバルに保持される。その結果として、複数の処理モジュールが集計に必要なデータを取得するために相互にメモリへアクセスすることが回避され、次元値の順番を決定するために必要なデータだけが処理モジュール間で通信されるので、通信量が削減され処理の高速化が図られる。
図8は、実施例1による集計処理のフローチャートである。図8に示されるように、最初に、各処理モジュールに分掌管理された表形式データを準備する(ステップ801)。より具体的には、各処理モジュールは、自処理モジュール内のレコードに対して複数の処理モジュール間で一意に割り当てられたグローバル・レコード番号と、自処理モジュール内の項目値に対して複数の処理モジュール間で順序付けられたグローバル項目値番号とをメモリに記憶する。
次に、各処理モジュールは、自処理モジュール内で、少なくとも1次元以上の指定された項目のグローバル項目値番号の組の番号順にレコードをソートする(ステップ802)。
更に、各処理モジュールは、レコードに対応したグローバル項目値番号の組を、ソートされたレコードの順番に次元値番号を付与してメモリに格納する(ステップ803)。
次に、各処理モジュールは、他の処理モジュールからグローバル項目値番号の組を相互に取得し、自処理モジュール内のグローバル項目値番号の組よりも前に順序付けられる組の個数をカウントし、自処理モジュール内のグローバル項目値番号の組の次元値番号をカウントされた個数分だけ引き上げることにより、グローバル項目値番号の組に対して、複数の処理モジュール間で共通のグローバル次元値番号を付ける(ステップ804)。
続いて、各処理モジュールは、グローバル項目値番号の組毎に、所定の情報の項目の項目値を所定の規則に従って集計することによりローカル集計値を算出する(ステップ805)。最後に、各処理モジュールは、他の処理モジュールからグローバル項目値番号の組毎のローカル集計値を取得し、取得された集計値をグローバル項目値番号の組毎に集計することにより集計値を算出する(ステップ806)。
また、各処理モジュールは、集計値を算出するステップ806の後に、グローバル項目値番号の組から項目値の組を復元し、項目値の組、及び、項目値の組に対応した集計値を含む結果テーブルを生成することができる(ステップ807)。この結果テーブル自体は、テーブルの形で保持されているので、このテーブルをさらに集計することにより、別の次元に関する集計を簡単に得ることができる。例えば、性別・年齢別で得られた集計結果から性別の集計結果を簡単に作成することができる。
図5に示した表形式データに基づいて、実施例1による集計処理をより詳細に説明する。例えば、図5に示されるような表形式データを複数の処理モジュールで分掌管理し、上述のステップ801を実行すると、図7に示されるようなデータの記憶構造が得られる。
ここで、図7に示されたようなデータに対して、「性別・年齢別に人数を求める」という集計処理や、「性別・年齢別に身長の合計値を求める」という集計処理を適用することができる。ここで、性別及び年齢はディメンジョン(次元)であり、人数や身長はメジャー(測度)である。人数は、マッチングする次元に対応するカウントを指定数だけ増加させることにより集計することができ、身長の合計値は、マッチングする次元に対応した身長の項目値を加算することにより集計することができる。実施例1では、この「性別・年齢別に身長の合計値を求める」個数付きカウント処理について説明する。
ステップ802では、図7に示されたデータに対して、各処理モジュール、即ち、各ローカル環境において、次元「年齢」と次元「性別」の2次元に関して、各ローカル環境のレコードをソートする。2次元以上でソートする場合には、適当な次元の順にソートを段階的に行うことになる。一般的には、項目値の種類の個数が多いほどソートに伴う順番の入れ替えが頻繁に生じるので、項目値の種類の個数の多い次元から順番にソートする方が効率的である。本例では、性別と年齢を比べると、性別の項目値の種類(男と女の2個)よりも年齢の項目値の種類(1歳、2歳及び3歳の3個)の方が多いので、年齢、性別の順にソートを行う。
本実施の形態では、ローカル環境下でのソートは、並び順番号の配列OrdSetの要素の順番を入れ替えることに相当する。例えば、初期の並び順番号の配列の要素が0(即ち、レコード0)、1(即ち、レコード1)、2(即ち、レコード2)であり、レコード0の年齢の値が3歳、レコード1の年齢の値が1歳、レコード2の年齢の値が2歳である場合を考える。年齢の若い順にレコードを並べ替えると、レコード1、レコード2、レコード3の順番になる。このときのソート結果は、並び順番号の配列を1、2、0の順番に入れ替えることによって表される。並び順番号の配列OrdSetには、後の処理のため、このローカル・ソート後の順番を設定しておく。
図9は、図7で示されたデータに対して、各処理モジュール内で年齢によるソートと性別によるソートを順次適用した結果を示す図である。尚、図9では、簡単のため、身長に関する情報ブロックは示されていない。年齢によるソートは年齢の若い順に行われ、性別によるソートは、男性、女性の順に行われる。このローカル・ソートによって、PMM−0内のレコードは、レコード1(男性、1歳、82cm)、レコード2(女性、2歳、69cm)、レコード0(女性、3歳、78cm)の順に順序付けされ、PMM−1内のレコードは、レコード1(男性、3歳、91cm)、レコード0(女性、1歳、82cm)の順に順序付けされ、PMM−2内のレコードは、レコード0(女性、1歳、76cm)、レコード1(女性、1歳、78cm)、レコード2(女性、2歳、84cm)の順に順序付けされ、PMM−3内のレコードは、レコード0(男性、3歳、87cm)、レコード1(女性、3歳、80cm)の順に順序付けされる。このローカル・ソートについては、後述する。
ステップ803では、各処理モジュールは、ローカル・ソートされたレコード順(即ち、入れ替え後の並び順番号の配列OrdSetの要素の順)に、選択された次元(本例では、性別及び年齢)の項目値番号の組に順序番号を付ける。図10は、本例における順序番号付与の説明図である。簡単のため、身長に関する情報ブロックは省略されている。
PMM−0のレコード1に関して説明すると、性別の値番号は、「0」であり、値番号「0」に対応したグローバル項目値番号は「0」である。また、年齢の値番号は、「0」であり、年齢の値番号「0」に対応したグローバル項目値番号は「0」である。よって、PMM−0内のレコード1に対応した項目値番号の組は、(0,0)であり、この(0,0)にローカル・ソートされたレコード順に順序番号が付けられる。項目値番号の組に順序番号を付与することは、内部的には、性別のグローバル値項目値番号と年齢のグローバル項目値番号に同一の順序番号「0」を与えることによって実現できる。本例では、PMM−0内のレコード1はローカル・ソートされた1番目のレコードであるため、対応した項目値番号の組(0,0)に対して、順序番号「0」が付与される。PMM−0内のレコードは、レコード1、レコード2、レコード0の順に順序付けられているので、以下、レコード2に対応したグローバル項目値番号の組(1,1)に順序番号「1」を与え、レコード0に対応したグローバル項目値番号の組(1,2)に順序番号「2」を与える。
順序番号は、レコードに対応して設定されるので、PMM内に次元値が一致するレコードが2個以上存在する場合には、レコード毎に別々の順序番号が付与されている。例えば、図10において、PMM−2内のレコード0とレコード1は、共に、性別が女性であり、年齢が1歳であるため、グローバル項目値番号の組は、どちらも(0,1)である。検索やソートが目的である場合には、グローバル値番号の組が一致していても、異なるレコードは別個に取り扱う必要がある。例えば、グローバル項目値番号の組と、グローバル・レコード番号GOrdとを組み合わせて使用することによって、すべてのレコードを別個に取り扱うことができる。しかし、本例のように集計を目的とする場合、グローバル項目値番号の組が一致するレコード、即ち、次元値が一致するレコードは、同じ次元として取り扱う方が都合がよい。そのため、本実施の形態では、グローバル項目値番号の組が一致するレコードには、同じ番号が付与されるように順序番号を付与し直す。このように付け直された順序番号を、以下では、ローカル次元値番号LDimNoと称する。ローカル次元値番号は、グローバル項目値番号の組が異なる場合に初めて1ずつインクリメントされるような番号である。図11は、このようなローカル次元値番号付与の説明図である。本例では、PMM−0、PMM−1及びPMM−3内では、順序番号とローカル次元値番号は同じであるが、PMM−2内では、ローカル次元値番号は、ソートされたレコードの順に、「0」、「0」、「1」のようになる。
次に、ステップ804において、各処理モジュールは、グローバル項目値番号の組に対して付与されたローカル次元値番号LDimNoを、複数の処理モジュール間で共通のグローバル次元値番号GDimNoに変換することにより、次元値に対してグローバルな順位付けを行う。次元値にグローバルな順位付けがなされると、後述のように、各処理モジュール内で次元値毎に集計を行った後、その集計結果を統合することにより、全体の集計結果を得ることができるようになる。
図12はグローバル次元値番号付与の説明図である。このグローバル次元値番号付与は、各処理モジュール内で順位付けされたグローバル項目値番号の組を、複数の処理モジュール間で共通に順位付けすることである。そのため、各処理モジュールは、グローバル次元値番号GDimNoの領域を確保し、ローカル次元値番号LDimNoからグローバル次元値番号GDimNoの初期値を生成する。同じローカル次元値番号LDimNoが割り当てられているレコードに対しては、一つのグローバル次元値番号GDimPosの領域だけを確保する。そのため、グローバル次元値番号GDimNoからローカル次元値番号LDimNoへの対応表GDimPosも同時に作成する。
次に、他の処理モジュールからグローバル項目値番号の組を相互に取得し、自処理モジュール内のグローバル項目値番号の組よりも前に順序付けされる組の個数をカウントし、自処理モジュール内のグローバル項目値番号の組のグローバル次元値番号をカウントされた個数分だけ引き上げることにより、グローバル項目値番号の組に対して、複数の処理モジュール間で共通のグローバル次元値番号を付ける。このように、各処理モジュールで個別に順序付けされている値、即ち、ローカル次元値番号に、複数の処理モジュール間で共通の順序番号、即ち、グローバル次元値番号を付与する方法は、同一の値に別個のグローバル次元値番号が付与されないように、同一の値の重複を排除する必要がある。この順序番号付与方法については後述する。
図13は、図12の例による処理モジュールPMM−0からPMM−3内における、ローカル次元値番号LDimNo、性別のグローバル項目値番号GVNo1、年齢のグローバル項目値番号GVNo2、及び、グローバル次元値番号GDimNoをまとめた図表である。同図からわかるように、グローバル次元値番号GDimNoは、性別のグローバル項目値番号GVNo1を上位の桁とし、年齢のグローバル項目値番号GVNo2を下位の桁としたときのグローバル項目値番号の組の番号順に0,1,2,4の番号が割り当てられている。
ステップ805において、各処理モジュールは、自処理モジュール内で、グローバル項目値番号の組毎に、即ち、グローバル次元値番号毎に項目値を集計する。本例では、PMM−0からPMM−3は、各モジュール内で性別・年齢別に身長の値を合計する。
図14及び15は、各処理モジュール内でグローバル次元値番号毎に項目値を集計する処理の説明図である。最初に、図14に示されるように、メジャーを格納するための領域として、グローバル次元値番号GDimNoの配列と同じサイズの配列GMsrを作成する。本例では、身長の合計を集計するので、浮動小数点又は整数のような格納領域を作成する。次に、図15に示されるように、各処理モジュール内で、例えば、グローバル次元値番号の組の順に入れ替えられた配列OrdSetの要素の順に、集計すべき項目値を取り出し、メジャー配列GMsrに集計する。
例えば、PMM−0では、並び順番号の配列OrdSetの先頭の要素が「1」番(即ち、レコード1)であることが分かるので、身長の情報ブロック内の値リストへのポインタ配列VNoのインデックス「1」の内容を参照する。ポインタ配列には、値「2」が格納されているので、PMM−0のレコード0に関する身長の値は、値リストVLのインデックス「2」の内容を獲得することにより、「82」として得られる。この値「82」がメジャー配列GMsrに集計されるべき値である。本例では、集計値は合計値であるので、この値「82」が加算される。
次に、この値「82」を、メジャー配列GMsrのどの要素に加算すべきであるか、即ち、メジャー配列GMsrのインデックスを特定する必要がある。上述のように、ローカル次元値番号LDimNoの配列は、グローバル次元値番号の組の順に並べられているので、並び順番号の配列OrdSetとローカル次元値番号の配列LDimNoの要素の並び順、即ち、インデックスは対応している。そのため、配列OrdSetの先頭に関するメジャーは、配列LDimNoの先頭によって示されるメジャー配列GMsrの格納領域に集計すればよい。図15の例では、配列OrdSetの先頭に対応した配列LDimNoの先頭の要素は「0」であるので、値「82」は、メジャー配列GMsrのインデックス「0」で示される場所に加算される。
PMM−1、PMM−2及びPMM−3についても同様に配列OrdSetの先頭の要素について身長の値「91」、「76」及び「87」を取得し、メジャー配列GMsrの先頭の領域に集計する。以下、PMM−0からPMM−3に関して、配列OrdSetの2番目以降の要素についても同様に項目値を取得してメジャー配列GMsrに集計する。
尚、PMM−2では、配列OrdSetの先頭の要素「0」と2番目の要素「1」に対して、ローカル次元値番号LDimNoが共に「0」であるため、対応した身長の値「76」と「78」は、共に、メジャー配列GMsrの先頭の領域に集計されるので、配列GMsrの先頭の集計結果は、76+78=154になる。
続いて、ステップ806では、各処理モジュールは、他の処理モジュールからグローバル項目値番号の組毎のローカル集計値を取得し、取得された集計値をグローバル項目値番号の組毎に集計することにより集計値を算出する。このグローバルな集計は、処理モジュール間の物理的な伝送路の構成に応じて、例えば、次の2通りの方法で実現できる。
第1のグローバル集計方法では、各処理モジュールは、グローバル次元値番号GDimNoと、グローバル次元値番号GDimNoに対応して集計されたメジャーGMsrの組を他の処理モジュールへ送信する。この方法は、処理モジュール間に複数の伝送路を確保できる場合に適している。図16は、第1のグローバル集計方法の説明図である。PMM−0(符号1600)、PMM−1(符号1601)、PMM−2(符号1602)及びPMM−3(符号1603)の4台の処理モジュールは、全体として1604で表される伝送路を介して接続されている。
例えば、処理モジュールPMM−0は、図15で示されるようなローカル環境下での集計結果として、グローバル次元値番号GDimNoとメジャーGSMsrの3個の組、即ち、
(0,82)
(3,69)
(4,78)
を他の処理モジュールPMM−1、PMM−2及びPMM−3へ送信する。また、処理モジュールPMM−0は、処理モジュールPMM−1から送信された2個の組、
(1,91)
(2,82)
と、処理モジュールPMM−2から送信された2個の組、
(2,154)
(3,84)
と、処理モジュールPMM−3から送信された2個の組、
(1,87)
(4,80)
を伝送路1604を介して受け取る。処理モジュールPMM−1、PMM−2及びPMM−3についても同様に自処理モジュールのローカル集計結果を他のモジュールへ送信すると共に、他の処理モジュールからローカル集計結果を受信する。
各処理モジュールは、相互に交換したローカル集計結果を、各処理モジュール内でグローバル次元値番号毎に加算して、グローバル集計結果を算出する。図17は、グローバル集計結果算出の説明図である。各処理モジュールが他の処理モジュールから受信したローカル集計結果の中で、実際に各処理モジュール内でグローバル集計に利用されるデータは、各処理モジュールのローカル集計結果のグローバル次元値番号と一致するグローバル次元値番号を含むデータだけである。図17では、各処理モジュールが他の処理モジュールから受信したデータの中で、実際のグローバル集計に利用されないデータが二重取消線で示されている。そして、各処理モジュールは、他の処理モジュールから受信したメジャーを並列的に加算することも可能である。これにより、全体的な処理速度が高速化できる。
ローカル集計結果の加算により、図17に示されるように、各処理モジュールには、グローバル集計結果が得られる。例えば、グローバル次元値番号「0」は、元々、PMM−0だけに存在していたので、グローバル次元値番号「0」についての集計結果は、PMM−0だけに現れる。一方、グローバル次元値番号「3」は、PMM−0とPMM−2の2個の処理モジュールにおいてローカル集計されていたので、グローバル次元値番号「3」に対応するグローバル集計結果は、PMM−0とPMM−2の2個の処理モジュールに現れている。もちろん、グローバル次元値番号「3」に関するPMM−0とPMM−2の両方のグローバル集計値は、同じ値「153」をとる。
このような重複したグローバル集計結果は削除しておいた方が後の処理のために都合がよい。そのため、処理モジュールに予め順位を割り当てておき、各処理モジュールは、自処理モジュールよりも上位の処理モジュールが自処理モジュールで保持しているグローバル次元値番号についてのグローバル集計値と同じグローバル集計値を保持している場合には、自処理モジュールで保持しているグローバル集計値を削除するように構成することができる。図18は、このようなグローバル集計値の重複を排除するための処理の説明図である。同図において、二重取消線は、グローバル集計値の重複の排除を表している。この処理を加えることにより、すべての処理モジュールを通じて、各グローバル次元値番号に対して1個のグローバル集計値が保持されることになる。
最後に、ステップ807では、最終的なグローバル集計値を保持している処理モジュールは、グローバル項目値番号の組から項目値の組を復元し、項目値の組、及び、項目値の組に対応した集計値を含む結果テーブルを生成する。図19は、結果テーブル生成の説明図である。集計結果をこのような結果テーブルの形で表現することにより、更なる集計処理に利用できるという利点が得られる。図18の例では、最終的なグローバル集計値は、処理モジュールPMM−0とPMM−1に保持されているので、処理モジュールPMM−0とPMM−1において、結果テーブルを作成すればよい。
例えば、処理モジュールPMM−0において、グローバル次元値番号「0」のグローバル集計結果は「82」である。グローバル次元値番号GDimNo「0」に対するローカル次元値番号LDimNoは、図12を参照して説明したグローバル次元値番号からローカル次元値番号への対応表GDimPosを用いることにより獲得することができる。図19の例では、GDimNo「0」に対するGDimPosの値は「0」であるため、配列LDimNoの先頭の要素「0」がローカル次元値番号である。ローカル次元値番号「0」には、性別のグローバル項目値番号「0」と年齢のグローバル項目値番号「0」が対応している。性別のグローバル項目値番号「0」に対応する項目値、即ち、次元値は「男」であり、年齢のグローバル項目値番号「0」に対応する項目値、即ち、次元値は「1」である。よって、グローバル次元値番号「0」に対して、性別の次元値「男」と、年齢の次元値「1」と、集計値(=身長の合計値)「82」を得ることができる。処理モジュールPMM−0の他のグローバル次元値番号と、処理モジュールPMM−1のグローバル次元値番号に対しても同様の処理を適用することにより、結果テーブルを得ることができる。図20は、このようにして作成された結果テーブルの説明図である。処理モジュールPMM−0とPMM−1は、性別次元値・年齢次元値・集計値の結果テーブルを生成する。処理モジュールPMM−2とPMM−3は、結果テーブルを生成しない。
図16乃至18では、第1のグローバル集計方法について説明したが、本実施の形態の変形例では、第2のグローバル集計方法が実施される。図21は、第2のグローバル集計方法の説明図である。この集計方法は、処理モジュールに予め順位を割り当てておき、ローカル集計結果である配列GMsrを上位の処理モジュールから下位の処理モジュールへ順次送る。2番目以降の処理モジュールでは、前の処理モジュールから受信した集計結果配列GMsrに自処理モジュール内でのローカル集計結果を合算し、合算後の集計結果配列GMsrを次の処理モジュールへ送信する。このように、集計結果を合算しながら集計結果配列GMsrを後続の処理モジュールへ順送りすることにより、処理モジュールの連なりを一巡して最初の最上位の処理モジュールへ戻される集計結果配列は、すべてのグローバル次元値番号に関するグローバル集計結果を格納した配列である。
図21の例では、最初に、最上位の処理モジュールPMM−0から次の処理モジュールPMM−1へ集計結果配列(82,−,−,69,78)が送信される。ここで、「−」は、ローカル集計結果が存在しないことを表す。処理モジュールPMM−1は、受信した集計結果配列(82,−,−,69,78)に自処理モジュール内のローカル集計結果(−,91,82,−,−)を合わせて更なる集計結果配列(82,91,82,69,78)を生成し、次の処理モジュールPMM−2へ送信する。PMM−2も同様に、受信した集計結果配列に、自処理モジュール内のローカル集計結果(−,−,154,84,−)を合わせて更なる集計結果配列(82,91,236,153,78)を生成し、次の処理モジュールPMM−3へ送信する。PMM−3も同様に、受信した集計結果配列に、自処理モジュール内のローカル集計結果(−,87,−,−,80)を合わせて、更なる集計結果配列(82,178,236,153,158)を生成する。PMM−3は、最下位の処理モジュールであるため、PMM−3から出力される集計結果配列は、最終的な集計結果である。
[順序番号付与処理]
本実施の形態による情報処理システムのように、順序付きの値のリストを格納しているメモリをそれぞれに有する複数の処理モジュールが論理的に環状に接続されている情報処理システムでは、各処理モジュールで個別に順序付けされている値に複数の処理モジュール間で共通の順序番号を付与する情報処理方法、即ち、順序番号付与方法が必要である。
例えば、図12を参照して説明したように、グローバル次元値番号を付与する際には、各処理モジュールで個別に順序付けされている値に、複数の処理モジュール間で共通の順序番号を付与する順序番号付与処理が使用される。また、この順序番号付与処理は、グローバル次元値番号を付与する場合の他に、後述のコンパイル処理において、グローバル項目値番号を設定する場合にも使用される。この順序番号付与処理は、同一値には唯一の番号しか付与しないことを特徴としている。したがって、このタイプの順序番号付与処理は、特に、同一値消去型の順序番号付与処理と称する。
図22は、実施例1における順序番号付与方法のフローチャートである。同図に示されるように、各処理モジュールは、自処理モジュール内の値のリスト中の各値の順序番号の初期値をメモリに格納する(ステップ2201)。
次に、各処理モジュールは、自処理モジュールのメモリに格納されている値のリストを論理的に次の段に接続された処理モジュールへ送信する(ステップ2202)。更に、各処理モジュールは、自処理モジュール内の値のリスト中の各値に対し、論理的に前の段に接続された処理モジュールから受信した値のリストの中から上記各値よりも前に順序付けされる値の個数をカウントし、自処理モジュール内の値のリスト中の各値の順序番号をカウントされた個数分だけ引き上げることにより、自処理モジュール内の値のリスト中の各値の順序番号を更新し、更新された順序番号をメモリに格納する(ステップ2203)。
次に、各処理モジュールは、受信した値のリスト中の値から自処理モジュール内の値のリスト中の値と一致する値を除いた更なる値のリストを論理的に次の段に接続された処理モジュールへ送信し(ステップ2204)、各処理モジュールは、自処理モジュール内の値のリスト中の各値に対し、論理的に前の段に接続された処理モジュールから受信した更なる値のリストの中から上記各値よりも前に順序付けされる値の個数をカウントし、自処理モジュール内の値のリスト中の各値の順序番号をカウントされた個数分だけ引き上げることにより、自処理モジュール内の値のリスト中の各値の順序番号を更新し、更新された順序番号をメモリに格納する(ステップ2205)。
続いて、各処理モジュールは、送信ステップ2202において論理的に次の段に接続された処理モジュールへ送信した値のリストが、論理的に環状に接続された他の処理モジュールを介して、論理的に前の段に接続された処理モジュールによって受信されるまで、ステップ2204とステップ2205を繰り返し実行する(ステップ2206)。
この順序番号付与方法によれば、各処理モジュールは、他の処理モジュールが保持する値のリストを重複無く受け取り、自処理モジュールが保持する値にグローバルな順序番号を付与することができる。上述のように、各処理モジュールが予め順序付きの値のリストを保持している場合には、非常に効率的にグローバルな順序番号を付与することが可能である。なぜならば、値のリストが予め順序付けされている場合には、昇順(又は降順)の一方向に順序を比較するだけでよいからである。もちろん、各処理モジュールの保持する値のリストが順序付きでない場合でも同様の結果を得ることができる。その場合には、例えば、各処理モジュールは、他の処理モジュールから受信した値のリスト中の値と、自処理モジュールが保持している値のリスト中の値を、すべての組合せについて順番に比較して、各値よりも前に、即ち、上位に、順序付けされる値の個数をカウントして、各値の順序番号を更新すればよい。
本実施の形態の順序番号付与方法では、各処理モジュールは、他の処理モジュールから受信した値のリストを保存する必要はなく、自処理モジュールが保持している値のリストに順序を付けるだけで、すべての処理モジュールに共通の順序番号を付与することができる。また、この順序番号付与方法は、他の処理モジュールからの値のリストの受信順に影響されないので、処理モジュール間の物理的な接続形態に全く依存しない。したがって、伝送路と順序番号更新回路を多重化することによって、更なる高速化を実現することができる。
図23及び図24は、順序番号付与処理の説明図である。図23は、各PMMが次の段に接続されたPMMへ送信する値のリストがステップ毎に示されている。図24は、各ステップで、PMMが前の段に接続されたPMMから受信した値のリストが示されている。この例では、初期状態として、PMM−0が値のリスト[18,21,24]を保持し、PMM−1が値のリスト[16,28]を保持し、PMM−2が値のリスト[16,20,33]を保持し、PMM−3が値のリスト[18,24]を保持している。
ステップ3の終了時点で、各PMMは、他のすべての処理モジュールからの値のリストを受信することができる。この時点で、自処理モジュールが保持している値のリストと、受信した値のリストを合わせることにより、すべての値の順序を決めることができる。更に、ステップ4の終了時点では、すべての値を重複無く受信できることが分かる。
[コンパイル処理]
コンパイル処理は、各処理モジュールでデータを管理するために使用するグローバル・レコード番号GOrdとグローバル項目値番号GVNoを設定するための処理である。グローバル・レコード番号GOrdは、上述のオフセット値OFFSETを使用することにより簡単に設定することができる。一方、グローバル項目値番号GVNoは、各処理モジュールが個別に保持している値リストに基づいて、すべての処理モジュール間で共通に順序付けされる番号である。
したがって、各処理モジュールは、上述の順序番号付与処理を用いることによってグローバル項目値番号GVNoを設定することが可能である。
実施例2では、図5に示した表形式データに基づいて、「性別・年齢別に人数を求める」個数付きカウント処理を行う集計を説明する。実施例2においても、実施例1と同様に、図8に示したフローチャートに沿って集計処理が行われる。
例えば、図5に示されるような表形式データを複数の処理モジュールで分掌管理し、上述のステップ801を実行すると、図7に示されるようなデータの記憶構造が得られる。ステップ802では、図7に示されたデータに対して、各処理モジュール、即ち、各ローカル環境において、次元「年齢」と次元「性別」の2次元に関して、各ローカル環境のレコードをソートする。実施例2におけるステップ802は、実施例1におけるステップ1と同様である。
ステップ803では、各処理モジュールは、ローカル・ソートされたレコード順(即ち、入れ替え後の並び順番号の配列OrdSetの要素の順)に、選択された次元(本例では、性別及び年齢)の項目値番号の組に順序番号を付ける。実施例2におけるステップ803は、実施例1におけるステップ803と同様である。
次に、ステップ804において、各処理モジュールは、グローバル項目値番号の組に対して付与されたローカル次元値番号LDimNoを、複数の処理モジュール間で共通のグローバル次元値番号GDimNoに変換することにより、次元値に対してグローバルな順位付けを行う。実施例2におけるステップ804は、実施例1におけるステップ804と同様である。
続いて、ステップ805において、各処理モジュールは、自処理モジュール内で、グローバル項目値番号の組毎に、即ち、グローバル次元値番号毎に項目値を集計する。本例では、PMM−0からPMM−3は、各モジュール内で性別・年齢別に人数をカウントする。
図25及び26は、各処理モジュール内でグローバル次元値番号毎に項目値を集計する処理の説明図である。最初に、図25に示されるように、メジャーを格納するための領域として、グローバル次元値番号GDimNoの配列と同じサイズの配列GMsrを作成する。本例では、人数を集計するので、整数の格納領域を作成する。次に、図26に示されるように、各処理モジュール内で、例えば、グローバル次元値番号の組の順に入れ替えられた配列OrdSetの要素の順に、集計すべき値を取り出し、メジャー配列GMsrに集計する。
本例では、集計すべき値は、「1」である。次に、この値「1」を、メジャー配列GMsrのどの要素に加算すべきであるか、即ち、メジャー配列GMsrのインデックスを特定する必要がある。上述のように、ローカル次元値番号LDimNoの配列は、グローバル次元値番号の組の順に並べられているので、並び順番号の配列OrdSetとローカル次元値番号の配列LDimNoの要素の並び順、即ち、インデックスは対応している。そのため、配列OrdSetの先頭に関するメジャーは、配列LDimNoの先頭によって示されるメジャー配列GMsrの格納領域に集計すればよい。図26の例では、配列OrdSetの先頭に対応した配列LDimNoの先頭の要素は「0」であるので、値「1」は、メジャー配列GMsrのインデックス「0」で示される場所に加算される(インクリメントされる)。
PMM−1、PMM−2及びPMM−3についても同様に、メジャー配列GMsrの先頭の領域をインクリメントする。以下、PMM−0からPMM−3に関して、配列OrdSetの2番目以降の要素についても同様にメジャー配列GMsrをインクリメントする。
尚、PMM−2では、配列OrdSetの先頭の要素「0」と2番目の要素「1」に対して、ローカル次元値番号LDimNoが共に「0」であるため、対応した人数は、共に、メジャー配列GMsrの先頭の領域に集計されるので、配列GMsrの先頭の集計結果は、1+1=2になる。
続いて、ステップ806では、各処理モジュールは、他の処理モジュールからグローバル項目値番号の組毎のローカル集計値を取得し、取得された集計値をグローバル項目値番号の組毎に集計することにより集計値を算出する。本例では、人数を指定数だけ増やすので個数付きカウント処理を行うことになる。このグローバルな集計は、実施例1と同様に、処理モジュール間の物理的な伝送路の構成に応じて、例えば、次の2通りの方法で実現できる。
第1のグローバル集計方法では、各処理モジュールは、グローバル次元値番号GDimNoと、グローバル次元値番号GDimNoに対応して集計されたメジャーGMsrの組を他の処理モジュールへ送信する。この方法は、処理モジュール間に複数の伝送路を確保できる場合に適している。図27は、第1のグローバル集計方法の説明図である。PMM−0(符号2700)、PMM−1(符号2701)、PMM−2(符号2702)及びPMM−3(符号2703)の4台の処理モジュールは、全体として2704で表される伝送路を介して接続されている。
例えば、処理モジュールPMM−0は、図26で示されるようなローカル環境下での集計結果として、グローバル次元値番号GDimNoとメジャーGSMsrの3個の組、即ち、
(0,1)
(3,1)
(4,1)
を他の処理モジュールPMM−1、PMM−2及びPMM−3へ送信する。また、処理モジュールPMM−0は、処理モジュールPMM−1から送信された2個の組、
(1,1)
(2,1)
と、処理モジュールPMM−2から送信された2個の組、
(2,2)
(3,1)
と、処理モジュールPMM−3から送信された2個の組、
(1,1)
(4,1)
を伝送路2704を介して受け取る。処理モジュールPMM−1、PMM−2及びPMM−3についても同様に自処理モジュールのローカル集計結果を他のモジュールへ送信すると共に、他の処理モジュールからローカル集計結果を受信する。
各処理モジュールは、相互に交換したローカル集計結果を、各処理モジュール内でグローバル次元値番号毎に加算して、グローバル集計結果を算出する。図28は、グローバル集計結果算出の説明図である。各処理モジュールが他の処理モジュールから受信したローカル集計結果の中で、実際に各処理モジュール内でグローバル集計に利用されるデータは、各処理モジュールのローカル集計結果のグローバル次元値番号と一致するグローバル次元値番号を含むデータだけである。図28では、各処理モジュールが他の処理モジュールから受信したデータの中で、実際のグローバル集計に利用されないデータが二重取消線で示されている。そして、各処理モジュールは、他の処理モジュールから受信したメジャーを並列的に加算することも可能である。これにより、全体的な処理速度が高速化できる。
ローカル集計結果の加算により、図28に示されるように、各処理モジュールには、グローバル集計結果が得られる。例えば、グローバル次元値番号「0」は、元々、PMM−0だけに存在していたので、グローバル次元値番号「0」についての集計結果は、PMM−0だけに現れる。一方、グローバル次元値番号「3」は、PMM−0とPMM−2の2個の処理モジュールにおいてローカル集計されていたので、グローバル次元値番号「3」に対応するグローバル集計結果は、PMM−0とPMM−2の2個の処理モジュールに現れている。もちろん、グローバル次元値番号「3」に関するPMM−0とPMM−2の両方のグローバル集計値は、同じ値「2」をとる。
このような重複したグローバル集計結果は削除しておいた方が後の処理のために都合がよい。そのため、処理モジュールに予め順位を割り当てておき、各処理モジュールは、自処理モジュールよりも上位の処理モジュールが自処理モジュールで保持しているグローバル次元値番号についてのグローバル集計値と同じグローバル集計値を保持している場合には、自処理モジュールで保持しているグローバル集計値を削除するように構成することができる。図29は、このようなグローバル集計値の重複を排除するための処理の説明図である。同図において、二重取消線は、グローバル集計値の重複の排除を表している。この処理を加えることにより、すべての処理モジュールを通じて、各グローバル次元値番号に対して1個のグローバル集計値が保持されることになる。
最後に、ステップ807では、最終的なグローバル集計値を保持している処理モジュールは、グローバル項目値番号の組から項目値の組を復元し、項目値の組、及び、項目値の組に対応した集計値を含む結果テーブルを生成する。図30は、結果テーブル生成の説明図である。集計結果をこのような結果テーブルの形で表現することにより、更なる集計処理に利用できるという利点が得られる。図29の例では、最終的なグローバル集計値は、処理モジュールPMM−0とPMM−1に保持されているので、処理モジュールPMM−0とPMM−1において、結果テーブルを作成すればよい。
例えば、処理モジュールPMM−0において、グローバル次元値番号「0」のグローバル集計結果は「1」である。グローバル次元値番号GDimNo「0」に対するローカル次元値番号LDimNoは、図12を参照して説明したグローバル次元値番号からローカル次元値番号への対応表GDimPosを用いることにより獲得することができる。図30の例では、GDimNo「0」に対するGDimPosの値は「0」であるため、配列LDimNoの先頭の要素「0」がローカル次元値番号である。ローカル次元値番号「0」には、性別のグローバル項目値番号「0」と年齢のグローバル項目値番号「0」が対応している。性別のグローバル項目値番号「0」に対応する項目値、即ち、次元値は「男」であり、年齢のグローバル項目値番号「0」に対応する項目値、即ち、次元値は「1」である。よって、グローバル次元値番号「0」に対して、性別の次元値「男」と、年齢の次元値「1」と、集計値(=人数)「1」を得ることができる。処理モジュールPMM−0の他のグローバル次元値番号と、処理モジュールPMM−1のグローバル次元値番号に対しても同様の処理を適用することにより、結果テーブルを得ることができる。図31は、このようにして作成された結果テーブルの説明図である。処理モジュールPMM−0とPMM−1は、性別次元値・年齢次元値・集計値の結果テーブルを生成する。処理モジュールPMM−2とPMM−3は、結果テーブルを生成しない。
図27乃至29では、第1のグローバル集計方法について説明したが、本実施の形態の変形例では、第2のグローバル集計方法が実施される。図32は、第2のグローバル集計方法の説明図である。この集計方法は、処理モジュールに予め順位を割り当てておき、ローカル集計結果である配列GMsrを上位の処理モジュールから下位の処理モジュールへ順次送る。2番目以降の処理モジュールでは、前の処理モジュールから受信した集計結果配列GMsrに自処理モジュール内でのローカル集計結果を合算し、合算後の集計結果配列GMsrを次の処理モジュールへ送信する。このように、集計結果を合算しながら集計結果配列GMsrを後続の処理モジュールへ順送りすることにより、処理モジュールの連なりを一巡して最初の最上位の処理モジュールへ戻される集計結果配列は、すべてのグローバル次元値番号に関するグローバル集計結果を格納した配列である。
図32の例では、最初に、最上位の処理モジュールPMM−0から次の処理モジュールPMM−1へ集計結果配列(1,−,−,1,1)が送信される。ここで、「−」は、ローカル集計結果が存在しないことを表す。処理モジュールPMM−1は、受信した集計結果配列(1,−,−,1,1)に自処理モジュール内のローカル集計結果(−,1,1,−,−)を合わせて更なる集計結果配列(1,1,1,1,1)を生成し、次の処理モジュールPMM−2へ送信する。PMM−2も同様に、受信した集計結果配列に、自処理モジュール内のローカル集計結果(−,−,2,1,−)を合わせて更なる集計結果配列(1,1,3,2,1)を生成し、次の処理モジュールPMM−3へ送信する。PMM−3も同様に、受信した集計結果配列に、自処理モジュール内のローカル集計結果(−,1,−,−,1)を合わせて、更なる集計結果配列(1,2,3,2,2)を生成する。PMM−3は、最下位の処理モジュールであるため、PMM−3から出力される集計結果配列は、最終的な集計結果である。
尚、実施例1で得られた集計値(=身長の合計)を実施例2で得られた集計値(=人数)で除算することにより、平均身長という集計値を得ることができる。
実施例1、2では、個数付きカウント処理を使用する集計処理について説明したが、マッチングした値の出現数を数えるカウント処理は、分散メモリ型の並列アーキテクチャに基づいて、プロセッサ間通信ができるだけ少なくなるように、大規模データをプロセッサ間で共有することなく、大規模データを個々のプロセッサ内に保持したまま、大規模データの処理を実現するために必要なプロセッサ間の最も基本的な情報処理技術である。
このカウント処理を用いることにより、一つのモジュールには高々1個しか存在しない値が全体で何個存在しているかを知ることができる。
例えば、ある組立工場がある製品Aを製造するための多数の部品を多数の部品工場のうちのいずれかの部品工場から仕入れる場合に、部品工場毎に供給可能な部品の種類が異なることがある。このとき、ある部品について、その部品に不足が生じないようにするため、その部品を供給可能な部品工場の数を把握する際に、出現数を数えるカウント処理を利用することができる。即ち、各部品工場に各処理モジュールを対応させ、部品の型番を項目値に対応させると、指定した型番にマッチングする項目値の個数をカウントすることにより、その部品を供給可能な部品工場の数を獲得することができる。
図33は、各工場が供給可能な部品の型番を表す表形式データがPMM−0からPMM−3に分掌管理されている様子を示す図である。簡単のために、型番以外の項目(例えば、部品価格)などは図示されていない。また、型番のVNoに対応してカウント値を格納するための作業領域が設けられ、初期値として1が設定される。
図34は、各処理モジュールが、複数の伝送路を利用して、自処理モジュール内の項目値を他の処理モジュールへ送信することによって、マッチングする個数をカウントする処理の説明図である。
PMM−0(符号3400)、PMM−1(符号3401)、PMM−2(符号3402)及びPMM−3(符号3403)の4台の処理モジュールは、全体として3404で表される伝送路を介して接続されている。例えば、処理モジュールPMM−0は、図30で示されるようなローカル環境下での型番のグローバル項目値番号GVNoの組、即ち、
(0,1,2)
を他の処理モジュールPMM−1、PMM−2及びPMM−3へ送信する。また、処理モジュールPMM−0は、処理モジュールPMM−1、PMM−2、及び、PMM−3から送信されたグローバル項目値番号の組、即ち、
(1,3)
(0,2,3)
及び
(0,3)
を伝送路3404を介して受け取る。処理モジュールPMM−1、PMM−2及びPMM−3についても同様に自処理モジュールの項目値番号の組を他のモジュールへ送信すると共に、他の処理モジュールから項目値番号の組を受信する。
例えば、処理モジュールPMM−0のカウント値格納領域の初期値は、
GVNo「0」の格納領域:「1」
GVNo「1」の格納領域:「1」
GVNo「2」の格納領域:「1」
である。GVNo「3」のための格納領域は存在しない。
ここで、処理モジュールPMM−0は、処理モジュールPMM−1から(1,3)を受信すると、カウント値格納領域を、
GVNo「0」の格納領域:「1」
GVNo「1」の格納領域:「1」→「2」
GVNo「2」の格納領域:「1」
のようにカウントアップする。次に、処理モジュールPMM−0は、処理モジュールPMM−2から(0,2,3)を受信すると、カウント値格納領域を、
GVNo「0」の格納領域:「1」→「2」
GVNo「1」の格納領域:「2」
GVNo「2」の格納領域:「1」→「2」
のようにカウントアップする。次に、処理モジュールPMM−0は、処理モジュールPMM−3から(0,3)を受信すると、カウント値格納領域を、
GVNo「0」の格納領域:「2」→「3」
GVNo「1」の格納領域:「2」
GVNo「2」の格納領域:「2」
のようにカウントアップする。
処理モジュールPMM−1、PMM−2及びPMM−3についても、同様に、他の処理モジュールから項目値番号の組を受信し、自処理モジュール内に存在する項目値番号とマッチングする項目値に対応するカウントを1ずつインクリメントすると、
処理モジュールPMM−1のカウント値領域として、
GVNo「1」の格納領域:「2」
GVNo「3」の格納領域:「3」
処理モジュールPMM−2のカウント値領域として、
GVNo「0」の格納領域:「2」
GVNo「2」の格納領域:「2」
GVNo「3」の格納領域:「3」
処理モジュールPMM−3のカウント値領域として、
GVNo「0」の格納領域:「3」
GVNo「3」の格納領域:「3」
が得られる。
この段階では、重複したカウント結果が得られているので、例えば、重複部分を削除することによって、最終的に、
GVNo「0」のカウント結果:「3」
GVNo「1」のカウント結果:「2」
GVNo「2」のカウント結果:「2」
GVNo「3」のカウント結果:「3」
が得られる。
上記の例では、処理モジュールPMM−0は、順次カウントアップを行っているが、各処理モジュールから他の処理モジュールへの項目値の組の送受信と、各処理モジュール内でのカウントアップを並列的に実行することが可能である。例えば、GVNo「0」〜GVNo「3」までのカウント値を、(GVNo「0」のカウント,GVNo「1」のカウント,GVNo「2」のカウント,GVNo「3」のカウント)のようにベクトル表記すると、処理モジュールPMM−0では、自モジュール内でのカウント値を表すベクトル(1,1,1,0)と、処理モジュールPMM−1から受信したカウント値を表すベクトル(0,1,0,1)と、処理モジュールPMM−2から受信したカウント値を表すベクトル(1,0,1,1)と、処理モジュールPMM−3から受信したカウント値を表すベクトル(1,0,0,1)を加算することによって、最終的なカウント値(3,2,2,3)を得ることができる。
また、図35は、処理モジュールに予め順位を割り当てておき、各処理モジュールのカウント値を、上位の処理モジュールから下位の処理モジュールへ順次送る。2番目以降の処理モジュールでは、前の処理モジュールから受信したカウント値に自処理モジュール内でのカウント値を合算し、合算後のカウント値を次の処理モジュールへ送信する。このように、カウント値を合算しながら合算後のカウント値を後続の処理モジュールへ順送りすることにより、処理モジュールの連なりを一巡して最初の最上位の処理モジュールへ戻されるカウント値は、最終的なカウント値(3,2,2,3)である。
実施例1から3では、マッチングする項目値に対応する個数をカウントしているが、大規模データ処理の分野では、データの順位付けが必要になることも多い。例えば、学力テストの科目毎の点数が表形式データとして得られている状況で、合計点を集計し、合計点の高い方から順位を付ける場合などが考えられる。
本実施例でも、処理モジュールPMM0〜PMM3が多数の受験者のデータを分掌管理している場合を考える。ある受験者の成績は、同一の処理モジュールで管理されているならば、各受験者の合計点は、処理モジュール毎にローカルに算出することができる。そこで、本例では、各受験者の合計点が算出された後に合計点で順位付けをする処理について説明する。
図36は、本発明の実施例4による表形式データの記憶構造の一例の説明図である。同図に示されるように、新たに算出された合計点は、この表形式データの新しい項目として追加される。新しい項目「合計点」については、通常、PMM間コンパイル処理によってグローバル項目値番号GVNoが割り当てられるが、本実施例では、グローバル項目値番号GVNoの他に、順位を表すランク(rank)が割り当てられる。グローバル項目値番号の付与は、値が同一の項目値に対しては同じ番号が割り当てられるという点で「同一値を消去する」タイプの順序付けであり、一方、ランクの付与は、値が同じ項目値であってもグローバル順序集合配列Gordの値が異なるので(本例では、別々の受験者であるので)、同一値を考慮してランク付けが行われる。
グローバル項目値番号は、上述のコンパイル処理によって付与することができる。そこで、以下では、ランクを付与するための単純順序付け処理について説明する。
図37A〜Dは、それぞれ、本発明の実施例4による処理モジュールPMM−0のランク及びグローバル項目値番号を付与する順序付け処理の説明図である。図37Aは、処理モジュールPMM−0の初期状態を示し、図37Bは、処理モジュールPMM−1から項目値440,410を受信した後の状態を示し、図37Cは、処理モジュールPMM−2から項目値420,410,380を受信した後の状態を示し、図37Dは、処理モジュールPMM−3から項目値450,440を受信した後の状態を示している。
グローバル項目値番号GVNoは、例えば、図22〜24を参照して説明した順序番号付与方法に従って付与することができる。
図38は、実施例4におけるランク付与方法のフローチャートである。同図に示されるように、各処理モジュールは、自処理モジュール内の合計点のリスト中の各値のランクの初期値をメモリに格納する(ステップ3801)。
次に、各処理モジュールは、自処理モジュールのメモリに格納されている値(本例では、合計点)のリストを論理的に次の段に接続された処理モジュールへ送信する(ステップ3802)。更に、各処理モジュールは、自処理モジュール内の値のリスト中の各値に対し、論理的に前の段に接続された処理モジュールから受信した値のリストの中から上記各値よりも前に順序付けされる値の個数をカウントし、自処理モジュール内の値のリスト中の各値のランクをカウントされた個数分だけ引き上げることにより、自処理モジュール内の値のリスト中の各値のランクを更新し、更新されたランクをメモリに格納する(ステップ3803)。
次に、各処理モジュールは、受信した値のリスト中の値を論理的に次の段に接続された処理モジュールへ送信し(ステップ3804)、各処理モジュールは、自処理モジュール内の値のリスト中の各値に対し、論理的に前の段に接続された処理モジュールから受信した更なる値のリストの中から上記各値よりも前に順序付けされる値の個数をカウントし、自処理モジュール内の値のリスト中の各値のランクをカウントされた個数分だけ引き上げることにより、自処理モジュール内の値のリスト中の各値のランクを更新し、更新されたランクをメモリに格納する(ステップ3805)。
続いて、各処理モジュールは、送信ステップ3802において論理的に次の段に接続された処理モジュールへ送信した値のリストが、論理的に環状に接続された他の処理モジュールを介して、論理的に前の段に接続された処理モジュールによって受信されるまで、ステップ3804とステップ3805を繰り返し実行する(ステップ3806)。
このランク付与方法によれば、各処理モジュールは、他の処理モジュールが保持する値のリストを重複無く受け取り、自処理モジュールが保持する値にグローバルな順序番号を付与することができる。上述のように、各処理モジュールが予め順序付きの値のリストを保持している場合には、非常に効率的にグローバルなランクを付与することが可能である。なぜならば、値のリストが予め順序付けされている場合には、昇順(又は降順)の一方向に順序を比較するだけでよいからである。もちろん、各処理モジュールの保持する値のリストが順序付きでない場合でも同様の結果を得ることができる。その場合には、例えば、各処理モジュールは、他の処理モジュールから受信した値のリスト中の値と、自処理モジュールが保持している値のリスト中の値を、すべての組合せについて順番に比較して、各値よりも前に、即ち、上位に、順序付けされる値の個数をカウントして、各値のランクを更新すればよい。
本実施例4のランク付与方法では、各処理モジュールは、他の処理モジュールから受信した値のリストを保存する必要はなく、自処理モジュールが保持している値のリストに順序を付けるだけで、すべての処理モジュールに共通のランクを付与することができる。また、このランク付与方法は、他の処理モジュールからの値のリストの受信順に影響されないので、処理モジュール間の物理的な接続形態に全く依存しない。したがって、伝送路とランク付与更新回路を多重化することによって、更なる高速化を実現することができる。
実施例4では、ランク付与処理は、グローバル項目値番号を付与する順序番号付与処理と類似した手順で行われている。しかし、処理モジュール間の通信を並列に行う場合には、より好適には、順序付け処理は、処理モジュール間の通信を並列に行って個数をカウントする処理と、個数を累計数化する処理の2段階で実行される。例えば、図36に示された表形式データの記憶構造の一例に基づく合計点のランク付け処理は、図39A〜Eに示された本発明の実施例5によるランク付与処理によってランク付けされる。図40は、本発明の実施例5による順序付け処理のフローチャートである。
ステップ4001:処理モジュールPMM−0は、自処理モジュールで算出された合計点の値440、400及び370を値のリスト(440,400,370)として保持する。また、個数をカウントするための作業領域rank0、rank1、rank2及びrank3を初期化する。rank0は、自処理モジュールの値のリスト(440,400,370)のランクの初期値(0,1,2)を保持する。rank1、rank2及びrank3は、(0,0,0)のように初期化する。図39Aは、処理モジュールPMM−0の初期状態を示している。
ステップ4002:処理モジュールPMM−0は、自処理モジュールの値のリスト(440,400,370)を他の処理モジュールPMM−1、PMM−2及びPMM−3へ送信する。
ステップ4003:処理モジュールPMM−0は、他の処理モジュールPMM−1、PMM−2及びPMM−3からそれぞれの処理モジュールの値リストを受信する。本例では、図39B、図39Cおよび図39Dに示されているように、処理モジュールPMM−0は、処理モジュールPMM−1、PMM−2及びPMM−3からそれぞれの値のリスト(410,440)、(380,410,420)及び(440,450)を受信する。
ステップ4004:処理モジュールPMM−0は、他の処理モジュールPMM−1、PMM−2及びPMM−3から受信した値のリストと自処理モジュールが保持している値のリストを比較して、個数をカウントするための作業領域rank1、rank2及びrank3を更新する。例えば、図39Bは、処理モジュールPMM−0が処理モジュールPMM−1から値のリスト(410,440)を受信したときの処理を示している。
合計点の値のリストは降順であるため、処理モジュールPMM−1からの値410は、処理モジュールPMM−0が保持している値440よりも下位であり、処理モジュールPMM−0が保持している値400よりも上位である。この場合、値410は、値400の直前に挿入されるので、処理モジュールPMM−0は、値400に対応したカウント(即ち、rank1の上から2番目)を1だけインクリメントする。また、処理モジュールPMM−1からの値440は、処理モジュールPMM−0が保持する値440と一致し、値400の直前に挿入されるので、処理モジュールPMM−0は、値400に対応したカウントを更に1だけインクリメントする。この結果として、処理モジュールPMM−0の処理モジュールPMM−1から受信した値のリストに対するカウントの結果は、図39Bのrank1に示されるように、(0,2,0)となる。
処理モジュールPMM−0は、図39Cに示されるように、処理モジュールPMM−2から受信した値のリスト(380,410,420)と自処理モジュールの値のリスト(440,400,370)を比較し、処理モジュールPMM−2からの値が挿入される直後の自処理モジュールのカウントrank2を1ずつインクリメントする。例えば、処理モジュールPMM−0は、処理モジュールPMM−2からの値380に対し、自処理モジュールの値370のカウントを1だけインクリメントし、処理モジュールPMM−2からの値410に対し、自処理モジュールの値400のカウントを1だけインクリメントし、処理モジュールPMM−2からの値420に対し、自処理モジュールの値400を1だけインクリメントする。その結果として、rank2は、(0,2,1)のようになる。
更に、処理モジュールPMM−0は、図39Dに示されるように、処理モジュールPMM−3から受信した値のリスト(440,450)と自処理モジュールの値のリスト(440,400,370)を比較し、処理モジュールPMM−3からの値が挿入される直後の自処理モジュールのカウントrank3を1ずつインクリメントする。例えば、処理モジュールPMM−0は、処理モジュールPMM−3からの値440に対し、自処理モジュールの値400のカウントを1だけインクリメントし、処理モジュールPMM−3からの値450に対し、自処理モジュールの値440のカウントを1だけインクリメントする。その結果として、rank3は、(1,1,0)のようになる。
ステップ4005:処理モジュールPPM−0は、次に、処理モジュールPMM−1、PMM−2及びPMM−3から受信したすべての値のリストによって自処理モジュールPMM−0に保持されている値のリストのランクの変化を算出するため、rank1、rank2及びrank3を加算する。本例では、図39Eに示されるように、rank1=(0,2,0)と、rank2=(0,2,1)と、rank3=(1,1,0)を加算することにより、(1,5,1)を得る。
ステップ4006:処理モジュールPPM−0は、次に、加算結果を累計数化する。本例では、加算結果=(1,5,1)を累計数化することにより、累計数=(1,6,7)が得られる。加算結果=(1,5,1)は、処理モジュールPMM−0の値のリスト中の1番目の値440の前に1個の値が存在し、1番目の値440と2番目の値400の間に5個の値が存在し、2番目の値400と3番目の値370の間に1個の値が存在することを表している。したがって、値440は、処理モジュールPMM−1、PMM−2及びPMM−3からの値のリストの挿入により、1ランク下がり、値400は、6(=1+5)ランク下がり、値370は、7(=6+1)ランク下がっていることが分かる。
ステップ4007:処理モジュールPPM−0は、最後に、値440、400及び370のランクの初期値rank0=(0,1,2)にステップ4006で得られたランクの低下数=(1,6,7)を加算することにより、値のリスト=(440,400,370)に対する最終的なランクrank=(1,7,9)を算出する。
上記のステップ4001〜4007は、他の処理モジュールPPM−1、PPM−2及びPPM−3においても並列に実行可能であり、処理モジュールPMM−1の値のリスト=(410,440)に対してランクrank=(5,1)が得られ、処理モジュールPMM−2の値のリスト=(380,410,420)に対してランクrank=(8,5、4)が得られ、処理モジュールPMM−3の値のリスト=(440,450)に対してランクrank=(1,0)が得られる。本例では、同じ値、例えば、値440には同じランク1が付与され、値440は3個存在するので、値440の次に大きい値420には、ランク4(=1+3)が付与される。
以上の処理によって、ランク付与処理が終了する。
尚、実施例5の説明では、他の処理モジュールから受信する値のリストは、昇順又は降順の順序付けがされていないが、例えば、本例では、他の処理モジュールから受信する値のリストが降順にされているならば、値のリストの比較をより効率的に行うことができる。
また、合計点の値がPMM間コンパイルを用いて既にグローバル項目値番号化されている場合には、合計点の値そのものを処理モジュール間で送受信するのではなく、各値に対応したグローバル項目値番号を処理モジュール間で送受信してもよい。この場合には、値のリストの比較は、グローバル項目値番号を比較することによって実現される。
実施例5では、ある処理モジュールに値のリストが存在する場合に、その処理モジュールに対して別の処理モジュールから別の値のリストが送信され、その処理モジュールにおいて値のリスト中の値にランクを付与する処理(順序付け処理)を説明した。例えば、実施例5の例において、処理モジュールPMM−2に保持されている合計点の値が380と420と420である場合、上記の例では、値のリストとして、(380,420,420)が送信されるが、同じ値が多数回に亘って送信されるような場合には、値と個数のペアのリストを送信した方が効率的である。即ち、(値1,値2,・・・)のような値のリストを送信する代わりに、[(値1,値1の個数),(値2,値2の個数),・・・]のような値と値の個数のペアのリストを送信する。
そこで、実施例6では、処理モジュール間で値と値の個数のペアのリストを送信して、値にランクを付与する。図41A〜Eは、それぞれ、図39A〜Eで示した例において、処理モジュール間では値と値の個数のペアのリストが送信され、かつ、処理モジュールPMM−2から、[(380,1),(420,2)]が送信されるように変更した例を示す図である。図42は、本発明の実施例6による順序付け処理のフローチャートである。
ステップ4201:処理モジュールPMM−0は、自処理モジュールで算出された合計点の値440、400及び370を値のリスト(440,400,370)として保持する。また、個数をカウントするための作業領域rank0、rank1、rank2及びrank3を初期化する。rank0は、自処理モジュールの値のリスト(440,400,370)のランクの初期値(0,1,2)を保持する。rank1、rank2及びrank3は、(0,0,0)のように初期化する。図41Aは、処理モジュールPMM−0の初期状態を示している。
ステップ4202:処理モジュールPMM−0は、自処理モジュールの値と個数のリスト[(440,1),(400,1),(370,1)]を他の処理モジュールPMM−1、PMM−2及びPMM−3へ送信する。
ステップ4203:処理モジュールPMM−0は、他の処理モジュールPMM−1、PMM−2及びPMM−3からそれぞれの処理モジュールの値リストを受信する。本例では、図41B、図41Cおよび図41Dに示されているように、処理モジュールPMM−0は、処理モジュールPMM−1、PMM−2及びPMM−3からそれぞれの値と個数のリスト[(410、1),(440,1)]、[(380,1),(420,2)]及び[(440,1),(450,1)]を受信する。
ステップ4204:処理モジュールPMM−0は、他の処理モジュールPMM−1、PMM−2及びPMM−3から受信した値と個数のリストと自処理モジュールが保持している値のリストを比較して、個数をカウントするための作業領域rank1、rank2及びrank3を更新する。例えば、図41Bは、処理モジュールPMM−0が処理モジュールPMM−1から値と個数のリスト[(410,1),(440,1)]を受信したときの処理を示している。
合計点の値のリストは降順であるため、処理モジュールPMM−1からの値410は、処理モジュールPMM−0が保持している値440よりも下位であり、処理モジュールPMM−0が保持している値400よりも上位である。この場合、値410は、値400の直前に挿入されるので、処理モジュールPMM−0は、値400に対応したカウント(即ち、rank1の上から2番目)を値410の個数分(本例では1)だけ増やす。また、処理モジュールPMM−1からの値440は、処理モジュールPMM−0が保持する値440と一致し、値400の直前に挿入されるので、処理モジュールPMM−0は、値400に対応したカウントを更に個数分(本例では1)だけ増やす。この結果として、処理モジュールPMM−0の処理モジュールPMM−1から受信した値のリストに対するカウントの結果は、図41Bのrank1に示されるように、(0,2,0)となる。
処理モジュールPMM−0は、図41Cに示されるように、処理モジュールPMM−2から受信した値と個数のリスト[(380,1),(420,2)]と自処理モジュールの値のリスト(440,400,370)を比較し、処理モジュールPMM−2からの値が挿入される直後の自処理モジュールのカウントrank2を挿入される値の個数分ずつ増やす。例えば、処理モジュールPMM−0は、処理モジュールPMM−2からの値380に対し、自処理モジュールの値370のカウントを1だけ増やし、処理モジュールPMM−2からの値420に対し、自処理モジュールの値400のカウントを2だけ増やす。その結果として、rank2は、(0,2,1)のようになる。
更に、処理モジュールPMM−0は、図41Dに示されるように、処理モジュールPMM−3から受信した値のリスト[(440,1),(450,1)]と自処理モジュールの値のリスト(440,400,370)を比較し、処理モジュールPMM−3からの値が挿入される直後の自処理モジュールのカウントrank3を挿入される値の個数分ずつ増やす。例えば、処理モジュールPMM−0は、処理モジュールPMM−3からの値440に対し、自処理モジュールの値400のカウントを1だけ増やし、処理モジュールPMM−3からの値450に対し、自処理モジュールの値440のカウントを1だけ増やす。その結果として、rank3は、(1,1,0)のようになる。
ステップ4205:処理モジュールPPM−0は、次に、処理モジュールPMM−1、PMM−2及びPMM−3から受信したすべての値のリストによって自処理モジュールPMM−0に保持されている値のリストのランクの変化を算出するため、rank1、rank2及びrank3を加算する。本例では、図41Eに示されるように、rank1=(0,2,0)と、rank2=(0,2,1)と、rank3=(1,1,0)を加算することにより、(1,5,1)を得る。
ステップ4206:処理モジュールPPM−0は、次に、加算結果を累計数化する。本例では、加算結果=(1,5,1)を累計数化することにより、累計数=(1,6,7)が得られる。加算結果=(1,5,1)は、処理モジュールPMM−0の値のリスト中の1番目の値440の前に1個の値が存在し、1番目の値440と2番目の値400の間に5個の値が存在し、2番目の値400と3番目の値370の間に1個の値が存在することを表している。したがって、値440は、処理モジュールPMM−1、PMM−2及びPMM−3からの値のリストの挿入により、1ランク下がり、値400は、6(=1+5)ランク下がり、値370は、7(=6+1)ランク下がっていることが分かる。
ステップ4207:処理モジュールPPM−0は、最後に、値440、400及び370のランクの初期値rank0=(0,1,2)にステップ4006で得られたランクの低下数=(1,6,7)を加算することにより、値のリスト=(440,400,370)に対する最終的なランクrank=(1,7,9)を算出する。
上記のステップ4201〜4207は、他の処理モジュールPPM−1、PPM−2及びPPM−3においても並列に実行可能であり、処理モジュールPMM−1の値のリスト=(410,440)に対してランクrank=(5,1)が得られ、処理モジュールPMM−2の値のリスト=(380,410,420)に対してランクrank=(8,5、4)が得られ、処理モジュールPMM−3の値のリスト=(440,450)に対してランクrank=(1,0)が得られる。本例では、同じ値、例えば、値440には同じランク1が付与され、値440は3個存在するので、値440の次に大きい値420には、ランク4(=1+3)が付与される。以上の処理によって、ランク付与処理が終了する。
尚、実施例6の説明では、他の処理モジュールから受信する値と個数のリストは、昇順又は降順の順序付けがされていないが、例えば、本例では、他の処理モジュールから受信する値と個数のリストが値に関して降順にされているならば、値のリストの比較をより効率的に行うことができる。
また、合計点の値がPMM間コンパイルを用いて既にグローバル項目値番号化されている場合には、合計点の値そのものを処理モジュール間で送受信するのではなく、各値に対応したグローバル項目値番号と個数のリストを処理モジュール間で送受信してもよい。例えば、上記の例では、処理モジュールPMM−0が他の処理モジュールへ送信する値440、400及び370は、グローバル項目値番号1、4及び6に対応しているので、処理モジュールPPM−0は、[(440,1),(400,1),(370,1)]の代わりに、[(1,1),(4,1),(6,1)]を送信する。この場合には、値の比較は、グローバル項目値番号を比較することによって実現される。
更に、値がグローバル項目値番号化されている場合には、各処理モジュールは、自処理モジュールに保持されている値と値の個数のリスト、或いは、グローバル項目値番号と個数のリストを送信するのではなく、グローバル項目値番号の順に値の個数を並べた「個数のリスト」を送信してもよい。上記の例では、処理モジュールPMM−0は、(0,1,0,0,1,0,1)を送信する。この場合、非零の値がリストの何番目に出現しているかを検出することによって、対応したグローバル項目値番号を取得することができるので、グローバル項目値番号の比較を簡単に行うことができる。
最後に、上記の実施例1〜6の説明では詳細に記述していない事項について解説する。
[ローカル・ソート処理]
ローカル・ソート処理は、実施例1の図9を参照して説明したように、グローバルな集計処理の一部として、或いは、グローバルなソート処理の一部として実行される処理である。本実施の形態では、ローカル・ソート処理が各処理モジュールで独立に行われるので、このローカル・ソート処理を高速化することにより、集計処理の処理速度を高速化することができる。
以下、このローカル・ソート処理について説明する。尚、ローカル・ソート処理は、図43に示されるように、コンパイル処理が終了した状態から処理が開始されるものとして説明する。図44は、ローカル・ソート処理のフローチャートである。図44に示すように、各PMMは、ソートすべき項目に関する値リストVLと同一のサイズの、存在数配列の領域を生成し(ステップ4401)、領域中の各値に初期値「0」を与える(ステップ4402)。図45は、「年齢」という項目について、それぞれのPMMにおいて、値リストVLと同一のサイズを有する領域が作られ、それぞれに初期値「0」が与えられた状態を示す。
次いで、各PMMは、存在数配列のそれぞれに対するカウントアップ処理を実行する(ステップ4403)。より詳細には、各PMMは、順序集合配列OrdSetの値を参照して、ソートすべき項目のポインタ配列VNoの値を特定する(ステップ4411)。次いで、各PMMは、存在数配列中、当該ポインタ配列VNoの値に示される位置の値をカウントアップする(ステップ4412)。このような処理が、順序集合配列OrdSetの末尾まで繰り返される(ステップ4413、4414参照)。
図46は、各PMMにおけるカウントアップの一例を示す図である。たとえば、PMM−0において、順序集合配列OrdSetの要素「0」が示す位置の、年齢のポインタ配列VNoの値は「0」である。したがって、存在数配列の「第0番目」の位置、つまり、先頭の位置にある値を、「0」から「1」にカウントアップする。他のPMMにおいても、同様の処理が実行されていることが理解できるであろう。
カウントアップ処理が終了すると、図47に示すように、各PMMは、存在数配列の要素を累計して、当該存在数配列を累計数配列に変換する(ステップ4701)。累計数配列の要素である累計数は、項目値を指し示すレコードの数を示す存在数を考慮して、当該累計数が配置されている位置の項目値を指し示すレコードの先頭の位置を示すようになっている。具体的には、各PMMが、配列の位置を示すパラメータ「i」を初期化して(ステップ4711)、パラメータが示す存在数配列中の値を取り出し(ステップ4712)、パラメータ「i」が示す位置より、後ろの位置、つまり、「i+1」、「i+2」、・・・の位置の存在数配列の値に、ステップ4712で取り出された値を、それぞれ加算する(ステップ4713)。ステップ4712、4713に示す処理を、値リストVLの要素(項目値)の個数だけ繰り返せばよい(ステップ4714、4715参照)。
このようにして、たとえば、図48に示すような累計数配列を得ることができる。さらに、各PMMは、後でPMM全体における順位を格納するための配列GVNo、GOrd’及びOrdSet’のための領域も作られる(ステップ4702)。これら配列のサイズは、それぞれ、値リストVLのサイズと一致する。
次に、各PMMにおけるローカルなソート処理が実行される。図49に示すように、各PMMは、順序集合配列OrdSetの値を取り出し(ステップ4901)、次いで、ポインタ配列VNo中、配列OrdSetの値が指し示す位置の値(ポインタ値)を特定する(ステップ4902)。その後、各PMMは、ソートすべき項目のグローバル項目値番号配列GVNo中、ポインタ配列VNoの値が示す位置の値を取得する(ステップ4903)。この値は、後述する値の格納処理に利用される。その一方、上記累計数配列においても、ポインタ配列VNoが示す位置の値が取得される(ステップ4904)。この値は、後述する値の格納処理において、配列中の位置を指定するために利用される。
次に値の格納処理が実行される。各PMMは、先に生成した配列GVNo中、ステップ4904で取得された累計数配列の値が示す位置に、ステップ4902で取得された、ソートすべき項目に関するGVNoの値を配置する(ステップ4905)。また、各PMMは、配列GOrd’、OrdSet’中、ステップ4904で取得された累計数配列の値が示す位置に、グローバル順序集合配列GOrd及び順序集合配列OrdSetの値を、それぞれ配置する(ステップ4906)。次いで、処理に用いられた累計数配列の値がインクリメントされる(ステップ4907)。
上記ステップ4901〜4907の処理が、配列OrdSet中の全ての値について、順次実行される(ステップ4908、4909参照)。
図50及び図51は、各PMMにおいてローカルなソート処理が実行されている状態の例を示す図である。たとえば、PMM−0に関して、図50においては、配列OrdSetの値「0」の取り出し(ステップ4901参照)、当該OrdSetの値「0」が示す位置の、配列VNoの値「0」の特定(ステップ4902参照)、当該配列VNoの値「0」が示す位置の、配列GVNoの値「1」の取得(ステップ4903)、および、配列VNoの値「0」が示す位置の、累計数配列の値「0」の取得(ステップ4904)が実行されていることが理解できるであろう。また、累計数配列の取得の後、当該累計数配列の値が、「0」から「1」になっていることもわかる(ステップ4907参照)。
また、PMM−0に関して、図51において、ステップ4103で取得された累計数配列の値の示す位置における、配列GVNo、GOrd’及びOrdSet’への、項目「年齢」に関する配列GVNoの値「1」、並びに、配列GOrdの値「0」及び配列OrdSetの値「0」の配置(ステップ4905、4906)が示されていることが理解できるであろう。他のPMMについても、図50及び51において、同様にステップ4901〜4905に示す処理が実行されていることがわかる。
以上のローカルな(つまり各PMMにおける)ソート処理により、図52に示すような配列を得ることができる。尚、図50乃至52において、図中の「昇順2」とは、グローバル・レコード番号GOrd'は、グローバル項目値番号GVNo'が同一値である範囲内で「昇順」になるということを意味する。
ここで説明したローカル・ソート処理は、比較演算を行わないという優れた性質がある。一般的に、比較を行うソートは、データ数をnとするとき、O(n*log(n))の処理量が発生し、比較を行わないソートでは、処理量はO(n)である。比較を行わないカウンティングソートは、数え上げ、累計数化、及び、転送のおよそ3つの段階を含む。処理ステップは、全てのデータが異なる場合、3nになる。そこで、n個の重複しないデータがあって、m台のコンピュータがある場合、n個のデータをm分割して、各分割部分をローカルにソートし、それをグローバル・ソートで統合するモデルでは、グローバル・ソートのおおよそのステップは
(m−1)*(2*n/m)
になる。最初の項(m−1)は、各コンピュータが他のコンピュータから受け取って処理しなければならない回数を表し、2番目の項(2*n/m)は、n/m個の2つの昇順リストを比較する際に、平均的に発生する比較の回数である。mが大きければ、
2*n
となり、グローバル・ソートのステップ数は、O(n)になる。即ち、比較を行うソートO(n*log(n))よりも効率がよい。これは、昇順のリストを比較することにより、効率化されたためと考えることができる。一方、mが消えていることは、コンピュータの台数が増えても、グローバル・ソートにおける1台あたりの処理量は変わらないことを意味している。
[ローカル・ソート処理の他の実施形態]
上述のローカル・ソート処理は、各処理モジュールを並列に動作させ得る点で優れている。しかし、ローカル・ソート処理は、他の方式でも実現できる。例えば、コンピュータの台数mがデータの個数nに匹敵する場合には、上述の順序番号付与処理の考え方を用いてローカル・ソート処理を実現してもよい。
例えば、図9を参照して説明した「年齢」と「性別」でソートする例に関して、この他の実施形態によるローカル・ソート処理を説明する。年齢と性別でソートする例では、各PMMにおいて、レコード毎に性別GVNo、年齢GVNo、及び、GOrdの3次元の配列を作り、この3次元の配列に一気に順序番号を付与すれば、上述のローカル・ソート処理と同じ結果が得られる。図53A〜Fは、それぞれ、順序番号付与処理を使用するローカル・ソート処理の説明図である。
最初に、図53Aに示されるように、OrdSetの各要素について、性別のGVNo、年齢のGVNo及びGOrdからなる3次元配列を作成する。以下の説明では、OrdSet=iの3次元配列を、A[i]=(a,b,c)のように表現することにする。本例では、
A[0]=(1,2,0)
A[1]=(0,0,1)
A[2]=(1,1,2)
である。
次に、図53Bに示されるように順序番号を初期化する。
次に、図53Cに示されるように、順序番号を付与する。本例では、A[0]をOrdSet1へ送り、A[1]をOrdSet2へ送り、A[2]をOrdSet0へ送り、自分の保持する3次元配列と送られてきた配列を比較し、順序番号を付与する。
更に、図53Dに示されるように、A[0]をOrdSet2へ送り、A[1]をOrdSet0へ送り、A[2]をOrdSet1へ送り、自分の保持する3次元配列と送られてきた配列を比較し、順序番号を付与する。
このような順序番号付与処理の結果として、図53Eに示されるような結果が得られる。図53Fには、順序番号の順に入れ替えた結果が示されている。図53Fに示されている結果は、図9に示されているローカル・ソートの結果と一致している。
[SIMD型並列処理]
並列化のアルゴリズムが稚拙である場合、SIMDを採用して所望の結果を得るためのプログラムの開発が困難であり、開発できたとしても、そのプログラムの自由度は低い。そこで、SIMDを採用するためには、SIMDに適した優れたアルゴリズムを開発する必要がある。この点、本実施の形態によるアルゴリズムは、
(1)処理の実行にあたって条件分岐がない。但し、検索処理の場合には、条件分岐が行われる可能性があるが、単純な条件分岐である。
(2)昇順のリストを相互に比較するなど、1つの命令で実行できる処理(ステップ数、クロック数)の占める割合が高い。
(3)すべての処理モジュールが平等に同じ役割を持つ。処理モジュール毎に違う役割があると、単一命令で処理を実現できない。
という点でデータ構造及びアルゴリズムが優れている。したがって、本実施の形態では、SIMDを採用する際にプログラムが簡単化され、プログラムの開発の容易性やプログラムの高い自由度を確保することができる。
[システム構成]
本発明にかかる情報処理システムは、例えば、フロントエンドとなる端末装置と、リング状のチャネルを介して接続され、端末装置からの命令を、それぞれのPMMが受理することにより、PMMにおいて、上述したコンパイル、ソート、集計の処理が実行できる。また。各PMMはパケットを何れかのバスを利用して送出すればよく、PMM間の同期等を外部から制御する必要もない。
また、制御装置には、コンパイル、ソートなどの繰り返し演算のためのハードウェア構成を備えたアクセラレータチップのほか、これに加えて、汎用CPUを含めても良い。汎用CPUは、端末装置からチャネルを介して伝達された命令を解釈し、アクセラレータチップに必要な指示を与えることができる。
さらに、制御装置、特に、その中のアクセラレータチップには、順序集合配列、グローバル順序集合配列など作業に必要な種々の配列を収容するためのレジスタ群が設けられているのが望ましい。これにより、いったん、メモリからレジスタ上に処理に必要な値をロードしてしまえば、コンパイル、ソート、及び、集計にかかる上述した処理演算中には、制御装置はメモリにアクセスすることなく、レジスタから値を読み出し、或いは、レジスタに値を書き込めばよい。これにより、メモリアクセスの回数を著しく減じる(演算処理前のロード、および、処理結果の書き込み)ことができ、処理時間を著しく短縮することが可能となる。
本発明は、以上の実施の形態に限定されることなく、特許請求の範囲に記載された発明の範囲内で、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
前記実施の形態においては、PMMを、一方が時計回りにパケットを伝送する第1のバス(第1の伝送路)、他方が反時計回りにパケットを伝送する第2のバス(第2の伝送路)にて、リング状に接続している。このような構成により、パケット伝送の遅延時間などを均一化することができるため有利である。しかしながら、これに限定されず、バス型など他の形態の伝送路を採用しても良い。
また、本実施の形態においては、メモリ、インタフェースおよび制御回路を有するPMMを利用しているが、これに限定されるものではなく、パーソナルコンピュータ、サーバなどを、ローカルな表形式データを分掌する情報処理ユニットとして、PMMの代わりに利用しても良い。或いは、単一のパーソナルコンピュータやサーバが、複数の情報処理ユニットを保持するような構成を採用しても良い。これらの場合でも、情報処理ユニットが、レコードの順位を示す値を受理し、グローバル順序集合配列GOrdを参照することにより、レコードを特定することができる。また、グローバル値番号配列を参照することにより、項目値を特定することも可能である。
また、情報処理ユニット間の伝送路も、いわゆるネットワーク型やバス型を採用しても良い。
単一のパーソナルコンピュータに複数の情報処理ユニットを設けるような構成を採用することで、以下のように、本発明を利用することができる。たとえば、札幌支社、東京支社、福岡支社の3つの表形式データを用意し、通常は、各支社の単位で、検索、集計、ソートなどを実行する。さらに、3つの支社を統合したグローバルな表形式データを考えて、各支社の表形式データが、全体表のうちの部分表であるとみなし、グローバルな表形式データに関する検索、ソートおよび集計を実現することができる。
無論、複数のパーソナルコンピュータをネットワークにて接続した場合にも、同様に、パーソナルコンピュータにて分掌されるローカルな表形式データに関する処理、および、グローバルな表形式データに関する処理を実現することもできる。
本発明は、特に、大量のデータを管理するシステム、たとえば、データベース、データウェアハウスに適用することができる。より具体的には、大規模な科学技術計算、受発注管理や証券取引などの基幹業務管理、事務管理に利用可能である。
図1は、従来のデータ管理機構の説明図である。
図2は、従来のデータ管理機構の説明図である。
図3は、本発明の実施の形態にかかる情報処理システムの概略を示すブロックダイヤグラムである。
図4は、本発明の実施の形態にかかるPMMの構造の一例を示す図である。
図5は、表形式データの一例の説明図である。
図6は、従来の表形式データの記憶構造の説明図である。
図7は、本発明の実施の形態にかかる表形式データの記憶構造の一例の説明図である。
図8は、本発明の実施の形態にかかる集計処理のフローチャートである。
図9は、ローカル・ソート処理の結果の説明図である。
図10は、本発明の実施の形態にかかる順序番号付与処理の説明図である。
図11は、本発明の実施の形態にかかるローカル次元値番号付与処理の説明図である。
図12は、本発明の実施にかかるグローバル次元値番号付与処理の説明図である。
図13は、グローバル次元値番号付与処理の結果の説明図である。
図14は、本発明の実施例1によるローカル集計処理の説明図である。
図15は、本発明の実施例1によるローカル集計処理の説明図である。
図16は、本発明の実施例1による第1のグローバル集計方法の説明図である。
図17は、本発明の実施例1によるグローバル集計結果算出の説明図である。
図18は、本発明の実施例1によるグローバル集計値の重複排除処理の説明図である。
図19は、本発明の実施例1による結果テーブル生成処理の説明図である。
図20は、本発明の実施例1による結果テーブルの説明図である。
図21は、本発明の実施例1による第2のグローバル集計方法の説明図である。
図22は、本発明の実施例1による順序番号付与方法のフローチャートである。
図23は、本発明の実施例1による順序番号付与方法の説明図である。
図24は、本発明の実施例1による順序番号付与方法の説明図である。
図25は、本発明の実施例2によるローカル集計処理の説明図である。
図26は、本発明の実施例2によるローカル集計処理の説明図である。
図27は、本発明の実施例2による第1のグローバル集計方法の説明図である。
図28は、本発明の実施例2によるグローバル集計結果算出の説明図である。
図29は、本発明の実施例2によるグローバル集計値の重複排除処理の説明図である。
図30は、本発明の実施例2による結果テーブル生成処理の説明図である。
図31は、本発明の実施例2による結果テーブルの説明図である。
図32は、本発明の実施例2による第2のグローバル集計方法の説明図である。
図33は、本発明の実施例3による表形式データの記憶構造の一例の説明図である。
図34は、本発明の実施例3によるカウント処理の説明図である。
図35は、本発明の実施例3による他のカウント処理の説明図である。
図36は、本発明の実施例4による表形式データの記憶構造の一例の説明図である。
図37A〜Dは、それぞれ、本発明の実施例4による順序付け処理の説明図である。
図38は、本発明の実施例4による順序付け処理のフローチャートである。
図39A〜Eは、それぞれ、本発明の実施例5によるランク付与処理の説明図である。
図40は、本発明の実施例5による順序付け処理のフローチャートである。
図41A〜Eは、それぞれ、本発明の実施例6によるランク付与処理の説明図である。
図42は、本発明の実施例6による順序付け処理のフローチャートである。
図43は、コンパイル処理終了時の状態の一例の説明図である。
図44は、本発明の実施の形態にかかるローカル・ソート処理のフローチャートである。
図45は、ローカル・ソート処理の初期状態の一例の説明図である。
図46は、各PMMにおけるカウントアップ処理の一例の説明図である。
図47は、累計数配列作成処理の一例の説明図である。
図48は、累計数配列の一例の説明図である。
図49は、ローカル・ソート処理の詳細なフローチャートである。
図50は、各PMMにおけるローカル・ソート処理の実行状態の一例の説明図である。
図51は、各PMMにおけるローカル・ソート処理の実行状態の一例の説明図である。
図52は、各PMMにおけるローカル・ソート処理の結果の一例の説明図である。
図53A〜Fは、それぞれ、ローカル・ソート処理の他の実施形態の説明図である。
符号の説明
32 PMM
34 第1のバス
36 第2のバス
40 制御回路
42 バスI/F
44 メモリ
46 バンク