以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
まず、いくつかの実施形態について説明する前に、前提として本出願人が通常考え得る技術およびその技術における課題について説明する。
分散システムにおける情報集約の例として、例えば、次のような場合に、割当て時点に十分近い時点での各システム資源の状態が、割当て制御を行うノードに集約されている必要がある。例えば、ジョブへのノード割当て時点で、ジョブの予想実行時間やアクセスする予定のハードウェア資源に合わせた最適化を行う場合である。あるいは例えば、実行開始後に、チェックポイント間隔やマイグレーション先を決定する場合である。さらに例えば、各ノード自体の構成部品の状態、ファイルサーバの負荷分散、さらにはサーバにアクセスする通信経路の予想負荷などを考慮して、割り当てを行う場合である。
また、各ハードウェア資源の状態や負荷を継続的に監視し、随時適切に変更するためには、短い間隔での情報集約が望ましい。
状態情報の集約以外にも、並列計算機の環境において、複数ノードで並列に一部分を計算した結果を、ある時点で特定の1ノードに集約する場合や、複数ノード間で互いの計算結果を共有する必要が、しばしば生ずる。このような情報集約型の通信は、並列計算全体のボトルネック、ないしクリティカルパスになりやすい。
情報集約型の通信では、ネットワーク上の送受信に伴う通信量または伝送時間が問題になる。近年の計算機システムは各ノードを構成するコンピュータの処理速度に比べ、ノード間のネットワークの通信速度が格段に遅いため、ネットワーク上を伝送される管理対象の状態情報の通信量が、情報集約システム全体の負荷の大きさを決める主要因となる。従って,データ量に比例する部分だけではなく、データ量に関わらず送受信動作1回あたりに必要な時間の大きさが無視できない。
俣、情報集約型の通信では、ネットワーク上の送受信に伴う伝送時間だけでなく、情報を集約するノードでの処理負荷も問題になる。近年の計算機システムはCPU の演算処理の速度に比べ、メモリへのアクセス速度が数桁のオーダで遅いため、アクセスすべきメモリの量が、ノードでの負荷の大きさを決める主要因となる。
情報集約型の通信に固有の課題は、情報拡散型の通信の典型である「同報通信」と対比すると明確になる。
多数ノードに対しての同報通信の場合は、同報通信機構を持つハードウェアを利用する事で、送信側ノードの負荷が1ノードへの送信と同じオーダまで改善される。ただし、状態情報の通知や並列計算への適用では、動画配信等の同報通信と異なりデータのビット化けやパケット欠落への厳密な対策を含むリライアブルマルチキャスト(reliable multicast)の実現が必要になり、単純にハードウェアの同報通信機構を使うだけでは実現できない場合も多い。しかし、各システム環境で利用できる同報通信機能を利用したreliable multicast の実現方法が複数知られている。これらの技術により送信側ノードの負荷はノード数をパラメタとしてO(1)となり、通信の実所要時間に関する要件も、比較的満たしやすい。
ここでO() は「ランダウの記号」で、一般にある量が() 内で指定される量と同じオーダで増加あるいは減少する事(記号で言及された量と() 内で指定された量の比の極限が定数である事)を示す。O(1) とは、「比較の基準となる量(あるいはパラメタ)が変化しても、一定である事」を意味する。
複数ノードから特定1ノードへ情報を集約する通信は、例えばメッセージパッシングインタフェース(Message Passing Interface(MPI))規格では、MPI_gather というAPI として規定されている。一方、最終的には参加した全てのノードが通信対象データを共有する場合のMPIでの通信API はMPI_Allgather と呼ばれている。以下の説明では、MPI で規定されたAPI を使用しない場合も通信パターンが共通である場合、gather あるいはallgather と呼ぶ。
gather の所要時間削減について、例えば、以下の動作(この動作を実現するための通信ハードウェア機能を含む)に基づく技術が知られている。
Write RDMA (Write Remote Direct Memory Access:ライトリモートDMA)という「送信側でのコマンドのみで通信を開始し、受信側メモリの所定領域を更新する」事を特徴とする通信機能を利用する技術。この技術により、受信側が通信コマンドを発行するオーバヘッドが削減される。
個々の通信毎の割り込み動作を抑制する技術。この技術においては、複数のノードからのデータを受信する際、個々のデータでは受信割り込みを起こさず、送信側全ノードのデータ送信完了を送信側全ノードと受信側ノードとのバリア同期などによる別の手段で知る。特に大規模システムで、仮に送信側ノード数に比例した割り込みが発生するとすれば、コンテキスト切り替えによるオーバヘッドが非常に大きくなる。従って、この技術による割り込み回数の削減は、性能改善に有効である。
gather に関する、上記従来技術の組み合わせによる受信側ノードのオーバヘッド削減には、以下の要因(1), (2) による限界が存在する。
(1) 個々のノードから受信する1回のデータ量は、少なくとも「最小パケット長」以上になる。
write RDMA に対し(より一般にread を含めたRDMA に対しても)、パケット長の最小値とは別に、メモリアクセス単位としてサポートされる最小データ長(以下L と書く(単位は通常はバイト))が存在する。
(2) 通信相手のノード数N に伴って受信すべきデータ量はO(N) で増加する。
前述したwrite RDMA により個々のノードから所定形式のデータを受信する場合、N*Lバイト以上の領域が必要になる。ただし、受信に要する時間は、各ノードからのデータが比較的小さい場合(すなわち、通信時間に対する通信遅延時間(latency)項の寄与が大きい場合)は、O(log(N)) となる。一方、データが比較的大きく、通信時間が「データの大きさ/バンド幅」で評価できる場合は、O(N) となる。一般に数十ノード以上からの受信の場合は、何段階かの中継ノードを設定する事で、「(中継段数)×(中継を含む受信側ノード毎の通信相手ノード数)」に比例する時間が必要になる。
各中継段で受信側ノード毎の通信相手ノード数a が一定とすると、中継段数はa を底とする対数に比例する。送信元ノード数をN として、通信所要時間は、ほぼ「a×log(N)/log(a)」となる。中継処理をノード上で行う場合、ここでのa は、2 ないし3 程度の比較的小さい値にする事が大規模システムでは有利な事が、理論モデル、シミュレーションや実測に基づく裏付けを伴った研究により、広く知られている。ここで、log(N)/log(a) は「a を底とするN の対数」を「標準の固定値」を底とする対数によって表す式である。対数の底となる「標準の固定値」は文脈により異なるが、どの場合でも、式の形は同じである。「標準の固定値」には、以下のような値が使われる。
- 「常用対数」の場合10
- 「自然対数」の場合e (Napier's constant ; ネイピアの定数)
- コンピュータ科学の多くの文献の場合2
以下、「a を底とするx の対数」を表記する際、log_a(x) という記法も用いる。例えば、log_a(x) = log_10(x)/log_10(a) = log_e(x)/log_e(a) = log_2(x)/log_2(a) となる。
中継に際して、一段前のノードからのWrite RDMA による転送が全て完了するのを待ってから受信したデータを含む領域全体を上位にRDMA 一回で転送すれば、中継に要するCPU の処理時間は、必ずしもノード数に依存しないようにする事ができる。しかしながら、通信にかかる実時間全体がノード数に伴って増加する事自体は避けられない。
ここで、後述するいくつかの実施形態が比較対象として想定する技術は、上述してきたgather による情報集積である。図1(a)は後述するいくつかの実施形態が比較対象として想定する本出願人が通常考える技術の方式を示す図である(図1(b)については後述する)。想定される通常考える技術は、図1(a)に示されるように、1つ以上のノード102内の1つ以上の管理対象101から受信側ノード103に情報を集約する方式104が、gather による情報集積であるものである。gather による情報集積の方式104は例えば、情報を、管理対象101の識別子と、管理対象101についての各1ビットの情報(所定の状態なら:1、そうでないなら:0)で表す方式である。
後述するいくつかの実施形態が比較対象として想定する通常考える技術は、「管理対象に所定の状態が発生した事を感知したノードから割り込み処理を伴う通信を行い、そうでないノードは何も通知しない」という方法(X) ではない。この理由は、以下の通りである。
方法(X) は、管理対象で所定の状態が発生する割合が想定通り少数ノードであれば、受信側の負荷は十分小さくなるはずなので、一見、自然な監視方法に見えるかも知れない。しかし、方法(X) は大規模システムでの安定的な動作の観点から見て以下の(A)および(B)の問題がある。
(A) 「管理対象が所定の状態にないため、管理担当ノードからメッセージが送られない」場合と「ノードに深刻な異常が発生したためメッセージを送信できない状態にある」場合の区別がつかない。
後者の状態については別に監視が行われているとすれば、ノードの状態は、最終的には、適切に検知されるかも知れない。しかし、管理対象の状態に対し誤認が発生し記録されてしまう事の回避や、その誤認の影響からの回復は必ずしも容易ではない。
(B) 多くのノードで同時に所定の状態が発生した場合に、受信側ノードが過負荷になる恐れがある。図2(a)は、大規模システムでの割り込み集約処理の必要性の説明図である。図2(a)に示されるように、受信側ノード202内のNIC(Network Information Controller)203が、各送信側ノード201からのメッセージを受信する毎にIO割り込みを発生させた場合を考える。この場合、NIC203からのIO割り込みに基づいてCPU204が受信側のコンテクスト205を切り替えて、割り込みハンドラを起動し、プロセスを起動する。この場合の割り込み回数の最悪値は、送信側ノード201のノード数に比例してしまう。また、NIC203に接続されるネットワーク上のトラフィックも、送信側ノード201の数に応じて増加為てしまい、ネットワーク上の通信量が増加する。
割り込みを伴う通信は、図2(a)に示されるように、必ず割り込みに対応するためのコンテキスト切り替え処理のオーバヘッドを生ずる。このため、大規模システムで通常時より桁違いに多くのノードからの受信割り込みを処理しようとすれば、受信側ノード202における過負荷の発生は避けがたい。
k 個のメッセージを受信した時点で、受信側ハードウェアの機能として割り込みを停止する事が、受信側ノードの過負荷対策として考えられるが、この場合、割り込みを発生する状態に戻すタイミングを適切に決定する事は容易ではない。さらに、受信側ハードウェア仕様上の割り込み停止指定可能範囲が、ネットワーク・インターフェース毎ないしポート毎の場合、割り込みを停止する事は、同じネットワーク・インターフェースや上ポートを利用する通信を妨げる事になる。この場合、そのネットワーク装置による他の用途での通信での必要性の観点からは、割り込みを停止するとシステム運用上の支障を生じるため、割り込みの停止が不都合な場合も考えられる。
ここでの問題は「送信側ノードで、ある時点で特定状態のノードが全体でいくつあるか」は「送信前に決まっている情報」ではないので、通知情報の種類に対応するパケット属性に応じた(送信側の)指定で割り込みの発生の有無を決める」手法は使えない事である。
以上の考察により、受信時に割り込みを伴う通信を使用する場合、一斉に多数のノードからの通知を受ける場合を想定すると、次のような対策が必要となる。図2(b)の206に示されるように、システム内の送信側ノード201(管理対象)の数に応じた階層化などすることにより、ネットワーク上のトラフィックを削減し、また各ノードでの負荷分散を行い、かつ、最大負荷を想定してシステム資源を用意する必要がある。
さらに、不定期の割り込み発生は並列計算時の「集団通信」性能を劣化させる事が知られている。つまり、このような監視情報を受信するノードは、並列計算を行うノードと別にするか、少なくとも、各ノードで上記割り込みを処理するシステム資源を並列計算用のシステム資源と分けて別に持たないと、システムの並列計算性能が著しく劣化する。
しかし、そのように、目的別に独立のシステム資源を通常時の処理には過剰な程度に余裕を見て用意しておく方法は、システムコストの大幅な増加につながる。
以上の考察により、管理対象の状態分布が想定通りである場合と、そうでない場合との間で、受信側ノードの負荷に大差がない監視方法が大規模システムでは極めて望ましい事が分かる。「所定の状態が発生した時のみ割り込みを伴う通信を行う」方法(X) は、この条件を満たさない。
後述するいくつかの実施形態が解決すべき課題を要約すると、次の3つの技術課題となる。
技術課題1:
情報集約型通信で、受信側ノードが各ノードからのメッセージ毎に最小メッセージサイズの領域を参照せざるを得ない事によるネットワーク上の通信量の増加および各ノードでのメモリアクセス負荷の削減限界を超える事。
技術課題2:
情報集約型通信で、受信側ノードがアクションを起こす必要がないノードからの情報にも全てアクセスせざるを得ない事によるネットワーク上の通信量の増加および各ノードでのメモリアクセス負荷の削減限界を超える事。
技術課題3:
情報集約型通信で、事前に設定した閾値を越えた数の管理対象が「監視中の状態」となった場合「閾値を越えた」事のみを認識すればよいという条件下で、全管理対象の状態を識別する必要がある場合よりも小さいネットワーク上の通信量および各ノードでのメモリアクセス負荷を実現する事。
これらの技術課題全てに共通する前提は「ある1つのノードが、多数のノードから、それと同数、ないし、より多数の管理対象についての情報を、各々について1ビットずつ受信する」という状況における通常考えられる情報集約技術の通信効率およびメモリ使用効率の低さが、システム全体の通信性能を制限している事である。
また、技術課題2と技術課題3に共通する前提は、上記の共通前提の下で「受信するビットの大多数が0 (1 であるビットが少数)」という状況における通常考えられる情報集約技術の通信効率およびメモリアクセス効率の低さが、システム全体の通信性能を制限している事である。図3は、疎な(ほとんど全てのビットが0の)ビット列の例を示す図である。これを見れば、大多数が0である情報列に対しても、各ビットごとに通信を行わねばならず、かつ各ノードにおいてメモリ領域を割り当てなければならず、通信効率およびメモリアクセス効率が悪いことが理解できる。
以下では、本出願人が通常考える技術との関連を含めて、上述の3つの課題についてさらに詳細に説明する。
大規模なシステムでの一斉受信時には、一般的な情報受信に共通の課題と、「例外的な状態」が発生した場合の情報受信に特有の課題がある。
まず、大規模システムでの多数ノードからの情報受信に共通の課題を説明する。
情報の中継が行われるには、管理ノード、あるいは各段の個々の中間ノードの通信相手ノード数と中継段数の間に次のトレードオフがあるため、通信遅延を大きく削減する事は難しい。
各段での通信相手ノード数を減らすと、中継段数が増加する。
各段での通信相手ノード数を増やすと、受信用のメモリ領域が増加する。
受信処理時に必要なメモリ領域が増加し、かつ、受信(あるいは中継)処理に伴うオーバヘッドが、各段の通信相手ノード数に比例して増加する。
ノードでの中継動作を伴う通信は、中継段数の増加に伴い通信遅延時間(latency) が、少なくとも「ノード数の対数」に比例して増加する。通信遅延時間の短縮は、各段の「中継動作」の所要時間削減で達成せざるを得ず、そのために、通信データ量と中継の各段での処理時間の各々を削減する必要がある。
多数ノードからの情報集積の処理性能を支配する要素としては、受信側ノードでの処理時間、特に、受信側ノードでのメモリアクセスの所要時間の占める割合も大きい。
メモリアクセスの所要時間はアクセスすべきメモリ量の増加関数となるため、アクセスすべきメモリ量の削減が性能改善の鍵となるが、以下の要因により削減の下限が規定されてしまう。この問題が前述した「技術課題1」である。
1ビットの受信時にも、少なくとも最小パケットサイズのメモリ領域は必要である。
受信時の割り込み処理によるCPUオーバヘッドを減らすため、割り込みを抑止したままで全ノードのパケットを受信しようとした場合、ノード数×最小パケットサイズのメモリがメッセージ保存用に必要になる。なぜならば、全メッセージを受信するまでメモリを解放できないためである。
次に、「管理対象に例外的な状態が発生した場合」の情報受信に特有の課題を説明する。
ここで、「例外的な状態」は、「異常な状態」と言い換えられる場合が多いが、「正常な状態で、単に稀であるだけ」の場合もある。「異常ではないが例外的」な状態としては、例えば大規模な疎行列の積を並列計算する際、「大部分の成分が0 である事」が分かっていれば、0 でない成分は「例外的」と考えられる。疎行列は、全ての成分に1つの領域を割り当てるのではなく、「「0 でない成分の位置」と「その位置の値」の対」として表現される場合が多く、入力データや(最終的な)出力データとしては、各成分を直接管理対象とする事は少ない。ただし、演算を並列処理する際に大多数のノードの分担部分が0 になる事はある。しかしながら、分かりやすさの観点から以下では「異常な状態」が発生する場合の状態監視の場合を例にして説明する。
一般に大規模な並列システムを構成する個々のハードウェア部品の故障率は非常に低いので、システム上で複数のノードあるいは複数の部品に共通する原因箇所がある場合を除き、複数のノードないし部品が同時に故障する確率は、1つが故障する確率に比べて何桁も小さい。なぜならば、各ノードあるいは部品の異常が「独立事象」とすれば、複数の管理対象が同時に異常な状態になる確率は、1つが異常な状態になる確率の積になるためである。
このため、全管理対象の状態を受信した後で個々の管理対象の状態を確認する場合は、大半の管理対象についての状態を「読み飛ばす」事になる。言い換えれば、ほとんど全ての管理対象に対しては受信側がアクションを起こす必要はないにも関わらず、多くの管理対象の状態を通信およびメモリを参照するための負荷自体は発生する。この問題が、前述した技術課題2である。
こうした場合、異常があったノード全てを識別する処理が不要な場合がある事に注意する。
例えば、1つの並列ジョブに割り当てたノード全ての異常を監視するシステムにおいて、異常があるノード数が事前に定めた閾値以下の場合と閾値を越えた場合では、次のような異なる対応を行うとする。
閾値以下の場合は、ただちに代替ノードの割当てジョブを継続する。
閾値を越えた場合は、いったんジョブを打ち切る。
このようなシステムでは、前者の場合は、異常が発生したノードを識別する必要があるが、後者の場合、「異常なノードの数が閾値を越えた」事が分かれば、当面の処理自体は可能と考えられるので、異常が発生したノードを識別する必要はない。
より一般に、信頼性確保のために用意された冗長資源の数を越えた異常が発生した場合は、冗長資源数の決定根拠が妥当だとすれば、同時に異常が発生した場合それらの異常が独立な事象である可能性は低い。従って、仮に冗長資源の数を多くしておいても、回復可能であるかは不確実である。想定していない「単一の故障原因箇所(single point of failre)」が存在する場合、冗長資源割当てによる処理継続は不可能なので処理を打ち切らざるを得ない。この状況では、個々の異常箇所の特定は、処理打ち切りの後で必要に応じて行なえばよいと考えられる。
ここで、通常考える技術である、複数ノードからのWrite RDMA により受信側ノードに情報を集める方法を使用する場合を考える。この場合、受信オーバヘッド削減のためデータが全て送信された後で受信を確認する限り、「閾値を越えた数のノードから所定の(通常は異常な)状態を受信した」事は、受信後の全データへの探索処理で定める事になる。
このようなケースにおいて、最悪の場合は、「ノード数×最小パケットサイズ」のメモリ全体へのアクセスとなる。平均的にも、少なくとも半分程度のメモリへのアクセスが必要になる。その理由は、異常な状態の個々のノードに対応する領域がアクセス順で先頭から数えて1/2 の地点の前にあるか後にあるかの確率が等しいとすると、1つの異常状態に対応するノードを検出するまでにアクセスするメモリ量の平均は全メモリ量の1/2 だからである。閾値をk として、その閾値k を越える数が発見されるまで探索を続けるとすれば、探索すべき平均メモリ量はk の増加関数になる。
以上により、通常考える技術では、例えばk = 1 で通常時には1つの管理対象の状態を見ればよい場合も、管理対象の総数に比例する通信量およびメモリアクセスが必要になり、かつ管理対象ごとに最小パケットサイズの通信量およびメモリ領域が必要になる。このための通信量の増加および処理負荷は少なくない。
しかし、所定の状態の分布状況が想定と異なる場合でも、想定より多くの管理対象が所定の状態にある事を検出した時点で処理を切り替える事は常に可能なので、処理時間に大きな差はない。すなわち、所定状態にある管理対象毎に割り込みを伴う通信を行う方法(前述した方法(X))が想定外の状況で処理時間が増大してしまうのに対して、想定外の場合も安定した動作を実現しやすいという利点はある。
従って、「通常時には所定の状態にある管理対象が、閾値k 以下と想定される」状況下で、「想定外の状態での処理時間が通常時の場合の処理時間に較べて大差ない」事の利点を保ったまま、ネットワーク上の通信量および各ノードでの処理時にアクセスが必要なメモリ量を削減する事が課題となる。これが、後述するいくつかの実施形態が解決すべき、前述した技術課題3である。
以下の説明において、次のような監視方法は、「分解能がk である」と定義する。それは、特定の閾値k を越える数の管理対象に共通する特定の状態(通常は異常状態)に対しては個々の管理対象を必ずしも識別しないが、特定の状態の管理対象の数が閾値k 以下の場合は管理対象を識別する監視方法である。
なお、分解能がk の監視中にk より多くの管理対象について監視条件が成立した際の監視システムの挙動について、次の2つの考え方がある。どちらの考え方が適切であるかは状況に依存する。
(1) k 個より多くの対象も識別できる場合が多い方がよい。
例えば、計算された集団識別子が所定の大きさの領域に収まるため、全ての場合は無理だとしても、k 個より多くの個別識別子を分解できる場合が多いほど好ましい場合である。裏返せば、k 個より多くの管理対象が所定の状態にあって本来は個別識別子を知る必要がない場合に、集団識別子から個別識別子を求める計算を実行してしまう事が多くなる(この事が望ましくない場合もありうる)。
(2) k 個より多くの対象を識別する処理が不要ないし軽い場合が多い方がよい。
例えば、集団識別子の大きさだけからk 個より多くの個別識別子を含むと判定可能な場合(リダクション途中の演算のオーバーフローで判定可能な場合を含む)が多い方が好ましい場合である。裏返せば、k 個より多くの個別識別子が分かる場合は少ない(この事が望ましくない場合もありうる)。
例えば、ある管理対象の集合S を固定して、次のような処理を行うなら、分解能が上限kで制限されているコード化が使用できる。
Sのうちk 個より多くの管理対象で問題としている事象が発生した場合、S の使用自体をいったん取りやめる。
S の中で事象が発生したノードがk 個以下であれば個々のノードに対し何らかの措置を講じてS の使用を続行する。
あるノード全体の状態だけではなく、「あるノードの構成部品」や「あるノードが管理する一連の機器」等の状態の管理にも同じ方法が利用できるので、以下しばらく「管理対象」という一般的な表現を使用する。また、以下に説明する実施形態においては、「ノード」の管理という表現を使う場合もある。つまり、通知は、管理を担当するノードにより、各管理対象毎に行われる。
<全ての実施形態に共通の技術的要素>
図1(b)は、後述するいくつかの実施形態において1つ以上のノード102内の1つ以上の管理対象101から受信側ノード103に情報を集約する方式105を説明する図である。図1(b)に示されるように、管理対象101が所定の状態である場合には、コード化されたデータ(後述する個別識別子)が通知され、この通知に対してリダクションの演算が実行されてデータ量が削減されたデータ(後述する集団識別子)が受信側ノード103に通知される。また、管理対象101が所定の状態でない場合には、使用するリダクションの演算の単位元が通知され、この通知に対してリダクションの演算が実行される。すなわち、単位元が通知されることにより、この単位元を入力としたリダクションの演算結果は変化しない。
後述するいくつかの実施形態は、メモリを共有しない分散環境での情報集約手法に関するものであり、図1(b)に示されるように、情報の管理対象101が情報通知元のノード102と一致している場合が、典型例である。すなわち、ノード102全体の(ある観点での)「状態」をノード102自身が通知する場合、管理対象101が、そのノード102自体と考える。しかし、ノード102を構成する特定種類の複数の部品に関する情報集約の場合に適用した場合など、より一般的な状況を考えて、管理対象101と通知元ノード102を概念上は区別する。
しかし、管理対象101がノード102自体で集団識別子の通知処理がノード102間で階層化されている場合と、ノード102上の複数の管理対象101についての情報の集約は、情報集約技術としては同等なので、分かりやすさを重視する場合、管理対象101が情報通知元ノード102自体と想定しても差し支えない場合が多い。
<第1の実施形態>
図4は、情報集約システムを構成する計算機の第1の実施形態のブロック図である。第1の実施形態は、以下に示す(1)から(6)の技術内容を有する。
(1) 分散システム内の複数の管理対象に対して定められた通知対象事象に対し、当該事象が発生した対象のコード化された識別子を情報として集約する事で、システム全体としての状態を管理する仕組みである。個々の管理対象に対応するコード化された識別子を、以下では「個別識別子」と呼ぶ。
(2) 「対象のコード化された識別子(個別識別子)を情報として集約する仕組み」を、以下では、「識別子集約機構401」と呼ぶ。個別識別子は識別子集約機構401への入力となる。
(3) 識別子集約機構401において、識別子の集約を、集団通信の一形態である「リダクション404」によって行う。このリダクション404は、ネットワーク上の通信量を削減すること、および、集約された情報を受信するノード(図1(b)の103)上の、受信に必要なメモリ量および受信に必要なCPU 時間(メモリアクセス時間を含む)を削減することを目的とする。
本実施形態における識別子集約機構401は、管理対象を個別識別子にコード化する機能である「識別子のコード化体系403」と「リダクション404」との組み合わせを、計算機システム上で具体化したものと言える。
ここでリダクション404は分散並列システム上の集団通信(collective communication)の一種で、「複数ノード(図1(b)の102)に分散配置されたデータを入力とし、演算結果を、それらのノードの1つあるいは全てに出力として返す操作を指す。すなわち、リダクション404は、ノード間の一連の通信と演算の組み合わせである。本実施形態では、リダクション404の「メカニズム」としての仕組みは、従来から知られている手法を利用する。リダクション404についての本実施形態での独自の追加部分は、どういうデータを、どのように「リダクション」の対象とするかという点に関するポリシーにある。
例えば、リダクション通信でのパケットフォーマットの詳細は、本実施形態では問わない。
「識別子のコード化体系403」により定まる個別識別子から、リダクション404により計算された結果を、以下では「集団識別子」と呼ぶ。リダクション404が集団通信(collective communication) の典型である事を意識し、英語で(collective identifier) と呼ぶ意図で、リダクション404の計算結果を「集団識別子」と呼ぶ。
集団識別子の計算に使用された個別識別子を、以下では(その集団識別子の)「生成因子」あるいは単に「因子」と呼ぶ。演算が乗法の場合は、普通の数学用語としての「因子(factor)」に一致する。ただし、本出願ではbitwise or (ビット単位の論理和演算)や加法などの、乗法以外の演算をリダクション404に使う場合に対しても、「生成因子」あるいは「因子」という用語を使用する。
(4) 上記の目的(3) を達成するための「識別子のコード化体系とコード化された識別子への演算方法」が、本実施形態の技術的要素である。その技術的要素には、次の2つの側面がある。
識別子(のコード体系)、および各コードに対するアルゴリズムの面での技術。
システムに固有の「ノード間演算装置」(リダクション404の実現に使用される特別なネットワーク、ないしネットワークに接続された特別な装置)の利用方法に関する技術。
(5) リダクション404により、個別識別子から識別子集約機構401により複数の管理対象に対応する集団識別子を計算する際、情報通知を担当するノード(図1(b)の101に対応)は、「送信側ノード」と呼ぶ。また、情報の集約を担当するノード(図1(b)の103に対応)は、「受信側ノード」と呼ぶ。
図5は、第1の実施形態における送信側ノードにおける識別子集約機構401(図4)の処理の例を示すフローチャートである。図5のフローチャートの処理は、後述する図7の送信起点ノード701のCPU701−1または中継ノードとして機能する受信・中継ノード702のCPU702−1によって実行される。また、入力パラメタ1また2等の作業領域は、送信起点ノード701のメモリ701−2または受信・中継ノード702のメモリ702−2に記憶される。
まず、自ノードが通信の起点ノードであるか否かが判定される(ステップS501)。
ステップS501の判定がNO(図中「n」)であるならば、受信済みの値を格納する入力パラメタ1に、受信済みの値(集団識別子)が格納される(ステップS502)。
ステップS501の判定がYES(図中「y」)ならば、受信済みの値は無いため、入力パラメタ1に、既定値が格納される(ステップS503)。ここで、既定値は、リダクション404に使用する演算の単位元が好ましい。例えば、演算が加法演算またはbitwise or演算であれば、既定値は0が好ましい。演算が乗法演算であれば、既定値は1が好ましい。自ノードが通信の起点ノードであって、受信済みの値がなければ、入力パラメタ1に単位元が格納されることにより、入力パラメタ1がリダクション404の演算に影響を与えないようにされる。
次に、自ノードが管理する管理対象において通知すべき条件が成立したか否かが判定される(ステップS504)。
ステップS504の判定がYESならば、自ノードの状態を格納する入力パラメタ2に、自ノードにおける管理対象(または自ノードそのもの)に対応する個別識別子が格納される(ステップS505)。
ステップS504の判定がNOならば、入力パラメタ2に、既定値が格納される(ステップS506)。ここでの既定値も、ステップS503の場合と同様に、リダクション404に使用する演算の単位元が好ましい。自ノードが管理する管理対象において通知すべき条件が成立していなければ、入力パラメタ2に単位元が格納されることにより、入力パラメタ2がリダクション404の演算に影響を与えないようにされる。
その後、リダクション404に使用する2項演算が、入力パラメタ1および入力パラメタ2に対して実行される(ステップS507)。2項演算の詳細については、後述するいくつかの実施形態において詳述する。
最後に、ステップS507での演算結果が、次の転送先への送信内容である集団識別子とされて出力される(ステップS508)。その後、図5のフローチャートで例示される送信側ノードにおける識別子集約機構401の処理が終了する。
第1の実施形態における識別子集約機構401の効果は、計算される集団識別子に必要な通信量およびメモリ量がそれぞれ、通知担当ノードから情報が集約されるノードに個別に情報を通知する際に必要な通信量およびメモリ量の合計のそれぞれより少ない事に由来する部分が大きい。
なお、どのノードも情報通知を担当し、かつ情報を集約する場合もある。すなわち送信側ノード、受信側ノードは、必ずしも物理的に特定のノードを指すとは限らず、単にシステム内の役割に対する呼び方である。
集団通信用語では、どのノードも情報通知と情報集約の両方を担当する場合は、単純に情報をそのまま集めるならAllgather、リダクション404を行うなら、Allreduce と呼ぶ。Allreduce の実現方法は大別して次の2つある。第1の実現方法は、特定ノードへの集約(reduce)と複数ノードへの放送(broadcast: 同じ内容のデータの一対多通信)を組み合わせる方法である。なお、同じ内容のデータの一対多通信は、文脈によっては一般的な場合をmulticastと呼び、broadcast という用語が「ネットワークの物理的な1セグメント内の全ノードへの一斉通信」という特殊な場合に対してのみ使われる場合もある。第2の実現方法は、集約の過程でノード間が情報を相互に交換する事により、通信処理終了後に集約に参加したノード間で情報が共有されるようにする方法である。例えば、情報集約過程が「各段階で2ノードずつ互いに持っている情報を交換する」事で実現されている場合である。これらの実現方法は、通信メカニズム上の区別であるため、本実施形態では、どちらが用いられていてもよい。
(6) 受信した集団識別子から監視中の状態にある管理対象を特定する仕組みを「識別子分析機構402」と呼ぶ。識別子分析機構402は、次の2つの部分からなる(図4参照)。第1の部分は、受信した集団識別子から(図4の識別子のコード化体系403に基いて)「生成因子」である個別識別子を特定し復元する処理である。第2の部分は、個別識別子から、その管理対象(図1(b)の101)を特定する処理である。
図6は、第1の実施形態における受信側ノードにおける識別子分析機構402(図4)の処理の例を示すフローチャートである。図6のフローチャートの処理は、受信側ノードとして機能する後述する図7の受信・中継ノード702のCPU702−1によって実行される。また、作業領域W等は、受信・中継ノード702のメモリ702−2に記憶される。
まず、ノード間のリダクション404における集団識別子が受信される(ステップS601)。
次に、集団識別子が作業領域Wに格納される(ステップS602)。
次に、作業領域Wが示す値がリダクション404の演算における単位元となったか否かが判定される(ステップS603)。
ステップS603の判定がNOならば、集団識別子から個別識別子が1つ特定される(ステップS604)。この特定の具体的な手法としては、図4の識別子のコード化体系403に依存して例えば以下の手段を用いる。
bit(ビット)操作演算
素因数分解
「集団識別子と(その生成因子である)個別識別子の対照表」の検索
対照表の検索が必要な範囲を限定する事で検索を高速化する「ハッシュ関数」
集団識別子から(その生成因子である)個別識別子を少なくとも1つ求める「完全ハッシュ関数」
これらの手段の詳細については、後述するいくつかの実施形態において詳述する。
その後、ステップS604で特定された個別識別子に対応する管理対象が処理(特定)される(ステップS605)。この特定の具体的な手法としては、図4の識別子のコード化体系403に依存して例えば以下の手段を用いる。
bit 操作演算
「個別識別子と管理番号の対照表」の検索
対照表の検索が必要な範囲を限定する事で検索を高速化する「ハッシュ関数」
個別識別子から管理対象番号を求める「完全ハッシュ関数」
次に、リダクション404に使用した演算の逆演算で、ステップS604において作業領域Wから特定された個別識別子が取り外される(ステップS606)。その後、ステップS603の処理に戻って、上述のステップS603からステップS606までの処理が繰り返し実行される。
ステップS603の判定がYESになると、図6のフローチャートで例示される受信側ノードにおける識別子分析機構402の処理が終了する。
本実施形態は、上述の(1)-(6) を骨子とする仕組みを、例えば図7の構成を備える情報集約システム上で実現する。本実施形態を実現する情報集約システムの最小限の要件は、「CPU、メモリおよびネットワーク・インターフェースを持つ個々の計算機(ノード)がネットワークにより相互結合された構成」である。すなわち、図7から図10に示されるように、送信起点ノード701と受信・中継ノード702が、スイッチまたはルータである中継装置703と通信線704を含むネットワークにより相互接続されている。なお、図7は、第1の実施形態に従った計算機システムの例示であり、このシステムに含まれるノード701、702または中継装置703の数は、任意であってよい。そして、送信起点ノード701は、CPU701−1、メモリ701−2、およびネットワーク・インターフェースであるNIC701−3を備える。また、受信・中継ノード702は、CPU702−1、メモリ702−2、およびNIC702−3を備える。なお、受信・中継ノード702は、メモリ702−2の記憶領域の使用形態によって、タイプ1(集団識別子の受信領域)またはタイプ2(集団識別子の受信領域と識別子の表の記憶領域)に分類される。
図7において、送信起点ノード701は、図1のノード102に対応し、図1の管理対象101を含む。または、送信起点ノード701そのものが管理対象101であってもよい。
図8は、このようなノードにより管理される管理対象の説明図である。ノードにより管理される管理対象は、図8(a)に示されるように当該ノードの状態であってよく、図2(b)に示されるように当該ノードの各構成部品の状態であってよい。また、ノードにより管理される管理対象は、図2(c)に示されるように当該ノードの構成部品以外の管理対象物であってよく、図2(d)に示されるように当該ノードのメモリ内の特定データであってよい。図2(b)〜図2(d)に示されるように、状態が管理される管理対象は、情報通信元のノードとは概念上区別され得る。しかしながら、情報通信元のノードにより管理される複数の管理対象の状態情報が後述のリダクション404(図4)の処理と同様の情報集約処理によって情報通信元のノードおいて集約されるならば、図2(a)に示されるように両者を概念上一致させた場合と同様に説明し得る。そこで、説明を明確にするために、ノードにより管理される管理対象を便宜的に図2(a)に示されるような当該ノードの状態であるものとして、以下では説明する。
送信起点ノード701において、CPU701−1は、それが内蔵する制御プログラムを実行することにより、メモリ701−2を作業領域として使用しながら、図5のフローチャートで例示される識別子集約機構401の処理を実行する。この結果、送信起点ノード701は、自ノードで発生した個別識別子(または前述した単位元)に対するリダクション404(図4)の演算結果を、集団識別子として次の受信・中継ノード702に転送する。ステップS506の説明で前述したように、自ノードが管理する管理対象において通知すべき条件が成立していなければ入力パラメタ2に単位元が格納されてリダクション404の演算が実行される。この結果、この場合にはリダクション404の演算の出力は入力から変化せず、集団識別子は変化しないで次の受信・中継ノード702に転送される。
図7において、受信・中継ノード702は、中継ノードとして動作するときは、送信起点ノード701ともなり得る。この場合、受信・中継ノード702は、送信起点ノード701または中継ノードとして機能する他の受信・中継ノード702から集団識別子を受信する。そして受信・中継ノード702において、CPU702−1は、それが内蔵するプログラムを実行することにより、メモリ702−2を作業領域として使用しながら、図5のフローチャートで例示される識別子集約機構401の処理を実行する。この結果、受信・中継ノード702は、受信した集団識別子と自ノードで発生した個別識別子に対するリダクション404(図4)の演算結果を、新たな集団識別子として次の受信・中継ノード702に転送する。
受信・中継ノード702は、受信ノードとして動作するときは、図1のノード103に対応し、他の送信起点ノード701または受信・中継ノード702から集団識別子を受信する。そして、受信・中継ノード702において、CPU702−1は、それが内蔵するプログラムを実行することにより、メモリ702−2を作業領域として使用しながら、図6のフローチャートで例示される識別子分析機構402の処理を実行する。この結果、受信・中継ノード702は、受信した集団識別子から、個別識別子およびそれに対応する管理対象を特定する。
第1の実施形態の最も基本的なポイントは、次の2点である。
本実施形態での管理対象の個別識別子とは、通し番号などではなく、特定の方法でコード化されたデータである事。
受信側に送信されるデータが個々の個別識別子自体ではなく、条件が成立している管理対象に対応する個別識別子を入力として、リダクションにより計算される集団識別子である事。
これらは、図5のフローチャートで例示される図4に示される識別子集約機構401の処理によって実現される。図9は、管理対象を図4の識別子のコード化体系403によって個別識別子にコード化し、その個別識別子と状態とから図4のリダクション404により集団識別子を計算する動作の説明図である。図9において、定数の前の0bは2進数表記である事を意味する。
図4の識別子のコード化体系403は、図9(a)に示されるように、個々の管理対象に対応する各個別識別子を、当該管理対象に対応する位置のbitがonにされたデータによってコード化する。すなわち、所定の条件を満たす管理対象に対しては、その管理対象に対応する個別識別子がリダクションの入力として与えられ、そうでない管理対象に対しては、全てのビットフィールドに0が入力された単位元が個別識別子として与えられる。
また、図4の「リダクション404」は、図9(a)に示されるように、コード化された個別識別子を入力としてbitwise orにより集団識別子を演算する。ただし、この計算に使用する演算機能は、「各ノードからの入力データが高々1 bitのみonであり、他はoffである」という条件を満足すればよい。したがって、乗法(図9(b))、bitwise exclusive or(ビット単位の排他論理和演算)、整数の加法、または浮動小数点の加法(ただし、仮数部の桁数の範囲での整数加算として使用する)が、集団識別子の計算に使用されてもよい。また、入力データ全てに対してbit反転(bitwise not)を各ノードが施しておくことでbitwise andを使用して集団識別子が計算されてもよい。この場合、受信側ノードにおいて最終結果をbit反転するか、bit のon/off の意味を逆にしてデータを解釈すればよい。
このようにして、第1の実施形態では、「複数のノードからの情報を、1つのパケット/メッセージ内にたたみ込む」事により、前述した「技術課題1」が解決される。すなわち、集団識別子を用いて各ノードからの状態情報がリダクションされる。これによって、ネットワーク(図7の通信線704)上での通信量は、各送信側ノード(図7の送信起点ノード701等)からの状態情報を単に集約して受信する場合と比較して、大幅に削減され得る。同様に、情報を集約する受信側ノード(図7の受信・中継ノード702)において受信に必要なメモリ量および通信処理時間は、各送信側ノード(図7の送信起点ノード701等)からの状態情報を単に集約して受信する場合と比較して、大幅に削減され得る。図10は、リダクションによる情報集積でのメモリ使用量削減の効果の説明図である。図10(a)は、本出願人が通常考える、状態情報を受信側ノードが単に各送信側ノードから集約して受信する場合の説明図である。これに対して図10(b)は、集団識別子を用いてリダクションされた状態情報を受信側ノードが各送信側ノードから集約して受信する場合の説明図である。状態情報を受信側ノードが単に各ノードから集約して受信する場合(図10(a))、各管理対象の状態情報を受信するために受信側ノードに必要とされるメモリ量は、最小書き込みサイズ(2 bits)×管理対象(4つ)となる。一方、集団識別子を用いてリダクションされた状態情報を受信側ノードが各送信側ノードから集約して受信する場合(図10(b))は、次のようになる。各管理対象の状態情報を受信するために受信側ノードに必要とされるメモリ量は、最小書き込みサイズ(4 bits)×管理対象数(4つ)/領域内のビット数(4 bits)で足りる。
本実施形態ではさらに、場合に応じて、メッセージに含める情報の内容に工夫する事、つまり、図4の識別子のコード化体系403により、メッセージに使用されるネットワーク上での通信効率およびメモリ領域の使用効率を高めることができる。以下にコード化方法についての基本的な考え方について説明する。
通知対象事象の性質に適したコード化の工夫によって、ネットワーク上での通信に必要な通信量、ならびに、情報集約ノードでの受信に必要なメモリ量および通信処理時間の改善度を大きくすることができる。下記に定義する意味の「分解能」は、コード化に際して考慮すべき「通知対象事象の性質」として特に重要である。
正の整数k に対し「通知対象事象が同じ時点で発生した管理対象の数がk 以下の時、かつ、その時に限り、図4の識別子分析機構402が受信した集団識別子から通知対象事象が発生したノードを特定する事ができる」場合を仮定する。この仮定が成立するとき、識別子分析機構402の(識別子集約機構401、個別識別子、集団識別子を含む「システム」としての)「分解能」がk であると定義する。通知対象事象が発生しうる管理対象の数をN とするとN ≧ k となる。
以下の説明においてさらに、
N = k の場合、識別子分析機構402は「分解能」が「完全」
(あるいは制限がない)。
N > k の場合、識別子分析機構402の「分解能」が(上限k で)制限されている。
という表現も用いる事にする。分解能が制限される場合、所定の長さのメッセージ内で伝達すべき情報に「全管理対象についての監視すべき状態の成立、不成立の区別」全てを含める必要がない。このため、同じ長さのメッセージ領域に他の情報、具体的には、監視すべき状態が成立した対象の識別子の一部についての情報を含めれば、なにかしら判別できる情報を送ることができる。複数の情報が入っている(1列に2ビット以上立っている)ときは、監視状態にある管理対象のうちのどれかで異常が発生したかがわかればよいような場合に対応できる。図11は、集団識別子の分解能の概念の説明図である。集団識別子の分解能が完全な場合、図11(a)に示されるように、全ての状態の組み合わせに対し監視状態にある管理対象とそうでない対象が特定される。集団識別子の分解能が制限されている場合、図11(b)に示されるように、監視状態にある対象数が上限を越えない場合は、対象が特定される。一方、監視状態にある対象数が上限を越えた場合は、対象が特定されない。
図12は、分解能が完全な場合と制限されている場合における、リダクションによる情報集積での通信量およびメモリ使用量削減の効果の説明図である。例えば図12(a)に示されるように、N個(図中では3個)の管理対象について、分解能を制限せずに各管理対象での監視状態の成立/不成立という1ビットの情報を受取るには、少なくともN ビット(図中では3ビット)が必要である。しかし、例えば図12(b)に示されるように、分解能k が制限されている(k < N) 場合には、N bit より小さい領域で、N 個より多くの管理対象からの監視状態に関する情報を受信する事が原理上可能である。図12(b)では、分解能に上限1 を設定して3 bits の領域で5 個の管理対象の状態を受信する場合を示している。本実施形態は、主として図4の識別子のコード化体系403の工夫により、実際にそれを実現する。
本実施形態では、分解能が制限される場合に、「ある領域に格納可能な識別子の集合の数値としての特性」を情報圧縮に利用している。
本実施形態では、分解能が制限される場合には、後述する第5から第9の実施形態等による図4の識別子のコード化体系403の工夫により、前述した技術課題2を解決している。また、完全な分解能が必要なケースにおいては、第4または第10の実施形態で後述するように、管理対象を(必要なら複数の階層に)グループ分けしたものを新たな管理対象と見なすことにより、前述した技術課題2を解決している。
以上のようにして、第1の実施形態によれば、情報集約型通信の所要時間を削減することが可能となる。特に、受信あるいは中継に必要なネットワーク上の通信量、及び、各ノードでのメモリ領域アクセス量とメモリアクセスに伴うオーバヘッドが大幅に削減される。
また、第1の実施形態によれば、中継ノードおよび受信ノードでの参照メモリ領域が小さくなる事で、システム全体として見たメモリバス帯域やキャッシュの使用量も削減されると、状態監視+状態の共有処理に関連する負荷が下がる。これにより、システム全体でのスループットが向上する効果もある。
第1の実施形態によれば、集団識別子の使用により、ネットワーク上での通信量、及び、情報集約ノードで受信に必要なメモリ量および通信処理時間は、各ノードからの状態情報を単に集約して受信する場合と比較して、大幅に削減される。
第1の実施形態により、特に必要な「分解能」に上限がある場合、図12(b)で説明した考え方により、通信量およびメモリ使用量を削減することが可能となる。
さらに、受信に必要なメモリ量の削減は、受信と並行して行われる(受信と独立の)計算処理によるメモリアクセスと受信時のメモリアクセスの競合を減らす事を通じて、計算処理と受信処理がオーバラップして実行されるシステムでの総合的な性能を改善する事による、派生的な効果も大きい。
図4の識別子のコード化体系403の詳細については、後述するいくつかの実施形態で詳細に説明する。
<第2の実施形態>
次に、第2の実施形態について説明する。
第2の実施形態の基本的な機能構成は、図4で説明した第1の実施形態に係る構成と同じである。また、第2の実施形態の全体的なシステム構成も、図7で説明した第1の実施形態に係る構成と同じである。さらに、第2の実施形態における識別子のコード化体系403およびリダクション404(ともに図4参照)の基本的な機能も、図9で説明した第1の実施形態に係る機能と同様である。
第1の実施形態で図8(a)を用いて説明したように、図4の識別子のコード化体系403は、個々の管理対象に対応する各個別識別子を当該管理対象に対応する位置のbitがonにされたデータによってコード化する。この場合の個々の管理対象に対応するbit位置は、例えば以下の(1)〜(5)のように定められる。
(1)管理対象(ノード、サブシステム、ジョブ...)数がN個である情報集約システム内でのbit単位の情報共有に際して、N bitsの連結なメモリ領域、又は区分的に連結な領域を用意する。連結な領域が用意される場合、1回のbit操作命令の適用対象となる大きさs bits(多くの場合、CPU(の演算器)がサポートする整数の大きさ)ごとに連結な領域が区分して扱われるならば、x番目の領域は、先頭からs×x bits (s×x/9 bytes)目として特定される。区分的に連結な領域の場合に、1回のbit 操作命令の適用対象となる大きさs bits毎に連結な領域が区分して扱われるならば、まずx番目の領域の先頭アドレスを(ポインタを格納した表等により)特定する。
(2)前述のN bitsのメモリ領域をreduction或いはatomic operationによる更新単位m bits 毎に分割する。分割後のbit領域数をnとする。例えば、1024個のノードに対応する1024 bitsに対し、atomic operationが128 bits単位でしか行えない場合、8個の128 bitsの領域を用意する。なお、atomic operationについてのアラインメント制約が16 bytes(=128 bits)単位でもある場合、16 byte境界にある領域を使用する。Nがmの整数倍でない場合には、領域末尾にダミービットを追加してmの整数倍にする。
(3)i番目(iは、1〜Nの整数)の個別識別子をiとし、m bit毎に分割後のn個のbit領域の番号j及び各m bitsの領域内のbit番号をkとして、iと(j,k)とを1対1に対応付ける。例えば、連結領域の場合、j = ((i-1)/m)+1, k = i-j*m というように対応付ける。この場合、逆写像は、i = (j-1)*m + kとして得られる。情報集約システム内での個別識別子と管理対象番号とは、「下位の桁を取る」等の代数的な変換により行うか、管理対象番号と個別識別子との対応表を作成することに対応付けられる。
(1)〜(3)での処理を図13を用いてさらに説明する。図13は、管理対象番号と受信側ノードのメモリ領域内の集団識別子格納領域のbit位置との対応関係の説明図である。図13に示すように、情報集約システム内で管理対象とされるノードは、整数領域s内のbit数以下の数のノードの集合に分割され、ノードの集合と整数領域とが対応付けられる。また、N bitsのメモリ領域は、m bitsのビットフィールドに分割され、ノードの集合内の管理対象番号(ノード番号)と整数領域内のビット番号とが対応付けられる。管理対象番号と個別識別子とは対応付けられるため、個別識別子とメモリ領域内の所定位置の1 bitとが対応付けられる。
(1)〜(3)の上述の処理は、情報集約システムの運用開始前に計算機により予め実行される。図14は、管理対象とbit位置とを対応付ける計算機の構成例を示す図である。図14に示すように、計算機は、CPU1401、メモリ1402、入力装置1403、表示装置1404、外部記憶装置1405、記録媒体1409にデータを書き込み可能な記録媒体書き込み装置1406、及び通信インタフェース1407を含む。これらはバス1408により相互に接続される。管理対象とbit位置とを対応付けは、CPU1401により実行され、実行結果は、表示装置1404に表示され、記録媒体書き込み装置1406を介して記録媒体1409に記録される。記録媒体1409に記録された上述の対応関係を示すデータは、図7のシステム構成で管理対象の識別を必要とする送信起点ノード701や受信・中継ノード702のメモリ701−2や702−2内に、特には図示しない記録媒体読み取り装置を介して記録され得る。
図15は、演算が乗法の場合における受信側ノードが持つ個別識別子表の例を示す図である。(a)から(d)が使用される素数または素数冪であり、(e)と(f)が対応関係を示す表である。また、(g)は管理対象番号とガウス整数での「素数」(素元)の実部および虚部との対応関係、(h)は管理対象番号とアイゼンシュタイン整数での「素数」(素元)の1の係数およびωの係数との対応関係を示す表である。
図16は、演算が加法の場合における受信側ノードが持つ識別子表の例を示す図である。図16は、図4のリダクション404の機能で使用する演算は加法、分解能の上限は2、識別子のフィールド長は7ビットである場合の例示である。(a)は、個別識別子と管理対象番号の対照表である。(b)は、集団識別子とその生成因子である個別識別子のビットマップとの対照表である。このビットマップでは、監視条件が成立するときに値が1、不成立のときに値が0をとる。(c)は、集団識別子と「生成因子として含まれる最大の個別識別子」の対照表である。(d)は、集団識別子と「生成因子として含まれる最小の個別識別子」の対照表である。
上記図15および図16ともに、各識別子表は、図4の識別子のコード化体系403を実現するものであり、各識別子表を表すデータは、図7において受信側ノードとして機能する受信・中継ノード702のメモリ702−2上に展開される。
図4の識別子分析機構402が加法を演算として図16の対照表を使用する場合、「受信した集団識別子の生成因子である個別識別子」を得るためには、集団識別子と生成因子である個別識別子の少なくとも1つ、あるいは(ビットマップ、配列、連結されたリストなどで表現された)複数の個別識別子と対応付ける図16(c)または(d)のような対照表が必要になる。
分解能が2 以上の場合、対照表のエントリ数が個別識別子の数より大きくなるため、対照表全体を保持するために必要なメモリ702−2(図7)の記憶容量は大きくなる。従って、ハードディスク記憶装置などの二次記憶媒体が必要になる事もありうる。しかし、本実施形態における識別子の検索(集団識別子から生成因子の個別識別子を求める処理や、個別識別子から管理対象の番号を求める処理)1回あたりのメモリ参照量は例えば、後述する実施形態で説明する「ハッシュ関数」の手法により抑えることが可能である。
(4)図7の送信起点ノード701や受信・中継ノード702のCPU701−1や702−1が実現する図4の識別子のコード化体系403の機能は、次のような処理を実行する。識別子のコード化体系403は、m bits毎に区分された第j領域に対して第k bitをonにするデータを、必要に応じて(例えばある管理対象の状態フラグがonのときに)、ReductionないしAtomic Operationへの引数として与える。例えば、1024個の管理対象に対応する1024 bitsに対して、atomic operationが128 bits単位でしかデータ処理を行えない場合、ノード番号130のノードは、2番目の128 bits領域へのbitwise or演算を第2 bitをonにしたデータで行う。これにより、識別子のコード化体系403は、当該ノードでの管理対象についての条件成立を通知する。ここで、m bitsに区分された領域内でのbit番号は、どちらから数えてもよい。特に、m bitsが使用する計算機のword長として、その計算機アーキテクチャのEndianでの番号の付け方とbit 番号の付け方とが同じである必要はない。例えば、受信側ノードで集団識別子から個別識別子を特定する処理(の高速化)に都合がよい方が選ばれてよい。
図17は、第2の実施形態における送信側ノードにおける識別子集約機構401(図4)による処理の例を示すフローチャートである。
ここでは、
集団識別子={全てのリダクション演算結果格納済ビットフィールドの値}
個別識別子=(ビットフィールド番号, ビットフィールド内のビット位置)
であるとする。
識別子集約機構401の処理が開始されると、図7の送信起点ノード701または受信・中継ノード702のCPU701−1は、当該ノードが管理する管理対象のビットフィールド番号をビットフィールド番号に入力する(ステップS1701)。
当該ノードが図7の送信起点ノード1701(送信側ノード)である場合(ステップS1702の判定がYES)、図7のCPU701−1は、ビットフィールドの初期値として0(ゼロ)を入力する(ステップS1703)。一方、当該ノードが通信の起点ノードではない、すなわち中継ノードとして機能する図7の受信・中継ノード702である場合(ステップS1702の判定がNO)、次の処理が実行される。CPU702−1は、ビットフィールドの初期値として前段のノードから受信した値を入力する(ステップS1704)。
自ノードが管理する管理対象において通知すべき条件が成立した場合(ステップS1005の判定がYES)、CPU701−1または702−1は、ステップS1703又はステップS1704で入力されたビットフィールド値と管理対象に対応するビットとをor演算する(ステップS1706)。一方、当該ノードが管理する管理対象において通知すべき条件が成立しない場合(ステップS1705の判定がNO)、CPU701−1または702−1は、ステップS1707の処理へ進む。CPU701−1または702−1は、NIC701−3または702−3を介して、演算結果を集団識別子として次の転送先のノードへの送信内容として送信し(ステップS1707)、一連の識別子集約機構401の処理を終了する。
(5)中継ノード又は受信ノードは、受信されたN bits(n個のm bits領域)を参照することにより、管理対象(システム、サブシステム、ジョブ、装置等)の全体の情報を得る。なお、情報を集約する全ノードが所定の領域を更新したことを確認するには、例えば、各ノードが情報を更新した後でバリア同期が実行されるか、同期機能を含むreduction操作が行われればよい。
上述した(1)〜(5)の処理によって、各ノードは、管理対象毎に1 bitの状態情報を集団識別子に含めて受信側ノードに通知できる。また、任意長のデータは、ビット列に分解して通知できる。ただし、reductionの演算対象となるデータ領域のbit数をmとすると、m bitsより大きいデータについては、m bits単位に分けて処理される。
図18は、第2の実施形態における受信側ノードにおける識別子分析機構402(図4)の集団識別子全体に渡る受信処理の例を示すフローチャートである。識別子分析機構402の処理が開始されると、図7の受信・中継ノード702のCPU702−1は、ビットフィールド番号の初期値として1を入力する(ステップS1801)。現在のビットフィールド番号がビットフィールド数以下である場合(ステップS1802の判定がYES)、CPU702−1は、自ノードにより受信された集団識別子内の当該ビットフィールド番号のビットフィールドに対する処理が実行される(ステップS1803)。
ステップS1803での処理が終了すると、CPU702−1は、ビットフィールド番号に1を加算し(ステップS1804)、ステップS1802での処理に戻る。
ビットフィールド番号がビットフィールド数を超えた場合(ステップS1802の判定がNO、CPU702−1は、一連の識別子分析機構402の処理を終了する。
図19は、図18のステップS1803の詳細処理である、第2の実施形態における受信側ノードにおける識別子分析機構402による集団識別子を構成する個々のビットフィールドの受信処理の例を示すフローチャートである。
所定のビットフィールド番号のビットフィールドに対する処理が開始されると、CPU702−1は、所定のビットフィールド番号のビットフィールドの値を取り出し、取り出されたビットフィールド値をメモリ702−2内の作業領域Wに格納する(ステップS1901)。
作業領域Wに格納された値が0(ゼロ)ではない場合(ステップS1902の判定がNO、CPU702−1は、個別識別子内の1が現れるビットBを作業領域WからLeading Zero Count(LZC)又はTrailing Zero Count(TZC)の次のビット位置を見て特定する(ステップS1903)。ここで、LZCとは、Number of Leading Zero(NLZ)を求める操作であり、NLZとは、Most Significant Bit(MSB)から最初に1が現れるまで数えた0の数を指す。また、TZCとは、Number of Trailing Zero(NTZ)を求める操作であり、NTZとは、Least Significant Bit(LSB)から最初に1が現れるまで数えた0の数を指す。
CPU702−1は、特定された個別識別子に対応する管理対象番号を特定し、特定された管理対象番号の管理対象に対して事前に定められた処理を実行する(ステップS1904)。CPU702−1は、ステップS1903で特定されたビットBの値を0(ゼロ)にオフし(ステップS1905)、ステップS1902での処理に戻る。
作業領域Wに格納された値が0(ゼロ)になった場合(ステップS1902の判定がYES)、CPU702−1は、所定のビットフィールド番号のビットフィールドに対する一連の処理を終了し、図18のステップS1803の処理を終了する。集団識別子は、単位元=0(図17のステップS1704参照)の状態からビット単位のor演算によって個別識別子が順次追加されてゆく(図17のステップS1706)。従って、図19のフローチャートでは、ビット単位or演算の逆演算(ステップS1903)によって個別識別子が順次特定されてそのビットがオフにされてゆき(ステップS1905)、最後は単位元=0にもどる。よって、ステップS1902の判定がYESになると、図19のフローチャートの処理が終了する。
各ノードのデータを表すビット列を有限体GF(2)のベクトルと見なし、複数ノードのデータを表すベクトルの集合から行列を作ると、第2の実施形態に従った送信側ノードのデータ送信は、次のような仮想的な転置行列に基づく通信方法にあたる。
本出願人が通常考えるデータ集約通信では、各送信側ノードに対応するデータを、下記のように、受信側ノードが元のまま「各ノード毎に一つ」の形で、受け取る。
node01 | b11 b12 ... b1m (node01 に対応する「行ベクトル」)
node02 | b21 b22 ... b2m (node02 に対応する「行ベクトル」)
... ... ...
node0N | bN1 bN2 ... bNm (node0N に対応する「行ベクトル」)
一方、第2の実施形態に従った受信側ノードは、全ての送信側ノードから送信されたデータの「同じ種類のデータの同じ位置のビットをノード順に並べたもの」を受信する。個々のノードからbitデータのまとまりを受信側ノードが読む場合、再び下記のような行列と見なした時の各行を見ることによって(リダクションによる送信結果の)転置後の行列から転置前の行列の各列を再現できる。
第1bit | b11 b21 ... bN1 (第1bitに対応する「列ベクトル」)
第2bit | b12 b22 ... bN2 (第2bitに対応する「列ベクトル」)
...
第mbit | b1m b2m ... bNm (第mbitに対応する「列ベクトル」)
第2の実施形態に従った情報集約システムによれば、第1の実施形態の場合と同様に、情報集約型通信の通信量および所要時間を削減できる。さらに、受信あるいは中継に必要な各ノードでのメモリ領域のアクセス量とメモリアクセスに伴うオーバヘッドが大幅に削減される。中継ノードおよび受信ノードでの参照メモリ領域が小さくなることで、システム全体として見たメモリバス帯域やキャッシュの使用量も削減されると、状態監視及び状態の共有処理に関連する負荷が下がり、システム全体でのスループットが向上する効果も得られる。
さらに、受信側ノードが各送信側ノードからの1 bitの状態情報を集積して、所定の状態が発生した管理対象に対してのみ特定の処理を行う場合、次のような技術的効果が得られる。所定の状態が発生した管理対象に対してのみ特定の処理を実行する場合、gatherによって各ノードから集めたデータを直接使用する方法よりも、整数領域のbit演算によるreduction により、bit 位置をノードに対応させたデータを参照して処理する方が高速である。なぜなら、gather により管理対象の状態情報を受信側ノードに集積した場合、各々の管理対象の情報は、最小パケット長ないしwrite RDMA の最小長程度に離れた領域にある。このため、受信側ノードは、各管理対象が所定の状態にあることの判定に際して、load命令を管理対象毎に発行する必要がある。一方、実施形態に従ったリダクションを伴う集積方法に従えば、整数を表す領域をm bitsとすると、m個の管理対象の状態が予め1つの整数に統合されている。このため、load命令発行回数が1/mになり、単位時間あたりのキャッシュミスの発生率が大幅に抑えられ、処理が高速化される。
また、複数bits の情報を集積する場合も含めた技術的効果を、使用するメモリ領域の大きさを中心に更に詳述する。第2の実施形態のように、リダクション操作が可能な大きさの領域のビット全てを有効利用すれば、「個々のノードからのパケットに送信元のノードの情報全てを入れてwrite RDMA を使う」場合に比べ、受信用のメモリ領域を小さくし得る。
まず、各ノードから通知すべき情報が1 bitとし、write RDMAで書き込める最小単位をW bitsとし、送信側ノード数をNとする。各ノードがwrite RDMAで情報を書き込む方法では、受信側ノードでは、NW bitsのメモリ領域が必要になる。一方、本実施形態での所要領域は、N = qm + r (0≦r<W) と書くとき、(qm) bits 以上((q+1)m) bits未満、すなわち、Nbits 以上(N+m) bits 未満となる。N、W、及びmは、正の整数であり、Wとmは、同程度の大きさである。N>1であれば、常にN+W < NWである。したがって、1 bitの通知(ある事象発生の有無)での第2の実施形態におけるメモリ効率は、各ノードからwrite RDMAで通知を行う場合と比較してNW/(N+W)倍であり、N >> Wならば、W倍程度となる。Wは、数十bits から百数十bits 程度であり得るので、千ノードより大規模な情報集約システムでは、N >> Wと考えてよい。
各ノードから通知すべき情報がX bitsである場合、各ノードがwrite RDMAで情報を書き込む方法では、W bits単位に見て有効利用されていない部分がY bits あれば、YN bits が冗長になるので、一般に冗長ビット数のオーダは、Nの程度で、ランダウの記号でO(N)と書かれる。特にX = 1の場合、Y = W-1であり、(W-1)N bits が冗長となる。一方、第2の実施形態において各ノードから通知すべき情報がX bits の場合、1bit の通知に必要な領域をX組用意することになる。冗長ビット数が最大になるのは、各bitの転送毎に見るとNをmで割った余りrが1になる場合である(m-1) bitsであるから、X 組使う場合は、X(m-1) bitsである。すなわち、第2の実施形態では、ノード数Nが増加しても冗長ビット領域を一定の大きさ以下に止めておく効果があり、N >> X ならば、各ノードがwrite RDMAで情報を書き込む方法と比較して所要メモリ領域を著しく小さくできる。仮に、N及びXが同程度の数である場合であっても、第2の実施形態に従えば、冗長ビット数が少なくなり、メモリ効率が良くなり得る。なぜなら、Nがmで割り切れる場合、1 bitを転送する際の冗長ビット数は、0であり、従って、任意のX > 1 についてX bitsを転送する際の冗長ビットも0になる。Nをmで割った余りrがmに近い場合、1 bitを転送する際の冗長ビット数は、m-rとなり、各ノードがwrite RDMAで情報を書き込む方法における冗長ビット数と第2の実施形態の冗長ビット数との比は、((W-1)/N) / X(m-r)となる。したがって、(m-r) < (X(W-1)/N) であれば、((W-1)/N) / (X(m-r))) > 1となり、第2の実施形態の方が所要メモリ領域が小さくなる。例えばN = Xの場合には、m-r < W-1ならばよい。
<第3の実施形態>
次に、第3の実施形態について説明する。
第3の実施形態の基本的な機能構成は、図4で説明した第1の実施形態に係る構成と同じである。
第3の実施形態に従った情報集約システムは、第2の実施形態に従った情報集約システムと同様に、各管理対象に対応する個別識別子を管理対象の通し番号に対応するビットとする。しかしながら、第3の実施形態に従った情報集約システムでは、第1または第2の実施形態に係る図7とは、構成が異なる。第3の実施形態では、図20、図21、図22に示されるように、図4のリダクション404におけるbit演算を、ノード内のCPU701−1や702−1ではなく、Atomic Operationやネットワークのreduction機能等のノード間演算装置を用いて実現する。
図20は、第3の実施形態に従った情報集約システムの第1の構成例を示す図である。図21は、第3の実施形態に従った情報集約システムの第2の構成例を示す図である。図22は、第3の実施形態に従った情報集約システムの第3の構成例を示す図である。
図20、図21、または図22の情報集約システムの構成例において、図7の場合と同じ機能を有する部分には、同じ番号を付してある。
図20、図21、または図22に示すように、第3の実施形態に従った情報集約システムでは、第1または第2の実施形態に従った情報集約システムとは異なって、送信起点ノード701のCPU701−1や受信・中継ノード702のCPU702−1には、図4の識別子集約機構401や識別子分析機構402が含まれない。一方、第3の実施形態に従った情報集約システムでは、個別識別子を集団識別子にまとめる識別子集約機構401を実行する独立筐体型のノード間演算装置2001が、図20に示されるようにノード外の中継装置703に接続され得る。また、図21に示すように、ノード間演算装置2101または2102が、送信起点ノード701または受信・中継ノード702内の各構成要素とは別個に、各ノード内に実装され得る。さらに、図22に示すように、ノード間演算機能が、送信起点ノード701または受信・中継ノード702内のNIC2201または2202と一体化されて実装され得る。
図4のリダクション404の機能は、例えば、Message Passing Interface(MPI)規格でMPI_reduceという名のAPI で定義される処理を指し、個別のデータを指定した2項演算の反復により演算前と同じ型の1つのデータに縮約することを指す。例えば、指定する2項演算が加法であれば、対応するリダクションの結果は、全ノードのデータの総和となる。MPI規格では、MPI_reduceによるリダクションで指定可能な演算として、加法以外にも乗法、bitwise or、「最大値と場所の対」等を指定するマクロが定義されている。
分散メモリシステムの環境における上記のリダクション404の性能は、ノード間の通信時間によって決まり、演算の所要時間は、無視できる割合になる。しかしながら、システム規模の増大に伴って、リダクション404は、入力情報を持つ全ノード間での、複数段階の中継動作を伴う処理になり得る。
ノード間の通信時間の相当部分は、ネットワーク装置の主記憶装置へのアクセスオーバヘッド、すなわち、IOバスをデータが通過する時間と、IO処理を制御し演算を行うためのCPU時間である。CPU上で演算を行うためには、まずメモリに格納された演算対象のデータをCPUに取り込む必要があり、演算結果をメモリに再び格納する必要がある。さらに、ネットワーク上で複数段の中継処理をしながらリダクション404の演算をCPU上で行う場合には、IOバスとメモリバスをデータが各段の中継について2回通過することになる。これに対し、ノード間演算機能を有するネットワーク装置の内部で演算が行われれば、IOバスとメモリバスをデータが通過することによるオーバヘッドは削減され、リダクション性能は、大幅に向上する。
第3の実施形態に従った情報集約システムにおいて、識別子の集約処理の手順は、bit演算がノード間演算装置により実行される点を除いて第1の実施形態と同様である。ただし、ノード間演算装置で利用可能な演算の種類は、CPU上のソフトウェアによって演算が実行される場合と比較して限定されるため、ノード間演算装置で利用可能な機能を用いて演算処理を実現するように工夫を要する。
以下に示す文献[1]から[5]は、上述ような機能を持つ装置に関する技術である。
[1] A. Gara et al,"Overview of the Blue Gene/L system architecture",IBM Journal of Research and Development VOL. 49 NO. 2/3 March/May 2005, p.7-8.
この文献[1]では、「複数ノード上のデータに対する演算を CPUとは独立に行う装置」の例であるBlue Gene/Lの Collective Network の機能が開示されている。ノード間演算機能は、各ノードの「Collective Network 用ネットワーク・インターフェース」に内蔵されている。
[2] 石畑宏明,「高機能・高性能システムインターコネクト技術の開発」 p.3 [平成26年4月1日検索]、インターネット
(URL: http://ngarch.isit.or.jp/psi/images/event/hiroaki_ishihata_20061220.pdf)
[3] 清水俊幸,「コレクティブ通信をサポートする高機能スイッチの開発」 p.2,p10 [平成26年4月1日検索]、インターネット
(URL:http://ngarch.isit.or.jp/psi/images/event/toshiyuki_shimizu_20080218.pdf)
上記文献[2],[3]では、「複数ノード上のデータに対する演算をCPUとは独立に行う通信装置」の中で「独立筐体型のノード間演算装置」の一例である「高機能スイッチ」の機能と内部構造が開示されている。
[4] Y. Ajima, S. Sumimoto, T. Shimizu,"Tofu: A 6d mesh/torus interconnect for exascale computers",IEEE Computer, Vol. 42, No. 11, pp.36-40 (2009)
[5] Y. Ajima, T. Inoue, S. Hiramoto, T. Shimizu, Y. Takagi,"The Tofu Interconnect",IEEE Micro, Vol. 32, Issue 1, p.21-31(2012)
上記文献[4],[5]では、スーパコンピュータ「京」(The K computer) 独自のネットワークであるTorus fusion (tofu)のICC(InterConnect Controller:ネットワーク・インターフェースとルータを兼ねる)のTBI(Torus Barrier Interface)の機能が開示されている。TBIは、本出願における図22のノード間演算機能を内蔵したNIC2201または2202の例である。文献[2],[3]での「高機能スイッチ」と実現形態は異なるが、機能的には同等である旨が文献[4]で述べられている。
第3の実施形態では、上記文献[1]から[5]に開示されているようなハードウェア機構を、ノード間演算装置2001(図20)、2101または2102(図21)、NIC2201または2202(図22)として利用できる。
reduction機能をサポートするネットワーク装置(ノード間演算装置)は、整数の加法、乗法、bitwise {and, or, exclusive or}、max, min、浮動小数点の加法等の比較的多様な種類の演算機能を持つ場合が多い。しかしながら、サポートされる演算の種類、対応されているデータ型、及び一度に操作できるデータの大きさや個数は、ネットワーク装置の種類によって異なる。サポートされるデータの大きさやデータ数の範囲内ではAtomic Operationやreductionが実現できない場合、階層化、複数領域の使用、及び反復使用等によって適用範囲を広げる必要があり得る。そこで、第2の実施形態で説明した、使用可能な演算のいずれかで、ネットワーク装置がサポートしている演算を使用する。
また、並列処理でのreductionに関するAPI標準であるMPI規格でのリダクション機能は、同期機能を含意するため、並列処理環境のネットワーク装置が提供するリダクション機能には、完了時の同期機能が含まれる場合が多い。この場合、受信側ノードは、全ての送信側ノードからのデータが揃った事を同期完了により知ることができる。
一方、例えばInfiniBandのFetch and Addのように、他のノードが行った演算の完了が通知されないノード間演算機能が用いられる場合には、送信側の全ノードのデータが揃ったタイミングを別の方法で知る必要がある。そこで、送信側ノードと受信側ノードとの間では、次の(a)又は(b)のような同期手続きが行われる。
(a)全送信側ノードと受信側ノードとの間で、次のようにバリア同期を実行する。すなわち、送信側ノードは、自ノードからの個別識別子コードの送信完了後、バリア同期を開始する。受信側ノードは、バリア同期を最初から開始しておく。
(b)受信側ノードが送信側ノードの更新する特定の領域を監視する。すなわち、送信側ノードは、自ノードからの個別識別子コードの送信完了後、受信側ノード上の領域(初期値は0)に対し、Fetch and Andで、自ノードが情報通知を担当する管理対象の数を加える。受信側ノードは、送信側ノードがFetch and Addで更新する領域を監視し、領域内のデータが管理対象の数に一致したら終了と判定する。
なお、送信側の全ノードが直接受信側ノードの領域にFetch and Add を実行する事は(カウンタがオーバーフローする事がなくても)性能的に得策とは限らないので、Fetch and Add による同期を複数階層に分けて段階的に実施した方が有利な場合もある。この階層化はソフトウェアよって行われるが、各階層の演算をネットワーク側のハードウェアが割り込みによるCPU への通知に伴うオーバヘッドなしでデータが集約される事、およびこれらの機構を使わずにCPU 上のソフトウェアがでリダクションを行う場合と比較すれば、1階層で集約可能なノード数を大きくとれる事も、第3の実施形態における性能上の利点となる。なぜならば、ノード間演算機構やFetch and Add を使わない場合は、1階層あたりのノード数と同じ回数、情報集約に関しての上位ノード側が通信処理を反復する必要があるため、大規模なシステムでは、各段での遅延が大きくなり過ぎる事を防ぐため、1階層での集約ノード数を2や3などの小さい数にせざるを得ず、中継段数が増える傾向になるからである。
第3の実施形態に従った情報集約システムによれば、第1または第2の実施形態に従った情報集約システムと同様の前述した技術的効果が得られる。また、第3の実施形態に従った情報集約システムによれば、通信完了までの実時間が短縮され、受信側ノード(階層的な処理をする場合の中間ノードを含む)の負荷が軽減できる。
<第4の実施形態>
次に第4の実施形態について説明する。
本実施形態は、第1、第2,第3の実施形態を前提に、受信側ノードが集団識別子を受信した後の処理の高速化に関する実施形態である。
各管理対象のデータは1 bit で代表される。対応する管理対象が所定の状態にある場合、管理対象に対応する位置のbit がon (1) であり、そうでない場合off (0) とする。
受信のための集団識別子の記憶領域は、各々が「整数」として処理できる複数のm bits領域から構成されるとする。
「所定の状態にある管理対象に対し特定の処理を行う」場合「各mbits 領域中のbit を全て順に見て、1ならば処理を行い、0 ならば次に進む」という処理が、よく行われる。
しかし、この方法では、第1の実施形態において説明した図3のように、ほとんど全てのビットが0の疎なbit列で示されるように、比較的少数のノードが所定の状態にある場合に、多くの条件判定とbit 参照を、結局は処理を行わないノードに対応するbit に対しても行う事になる。
すなわち、このような種類の処理では、所定の状態にある管理対象が比較的少数である時、結局は処理を行わない管理対象に対応する領域を多く参照するために、キャッシュミスと引き続くメモリ参照が多発して、受信側ノードの処理時間が大きくなる。
所定の状態にある管理対象が比較的少数の場合、「予め管理対象のグループに対応する複数の領域のlogical or を取り、結果が0 となるグループは飛ばして処理する」事でbit 操作回数が減って高速化される可能性がある。しかし、この方法では全管理対象に対応する領域へのload 命令が発行されるという点では変わりがないので、大幅な高速化は期待できない。
そこで、例えば、各グループ毎に代表のノードで「取りまとめ」を行うことを考える。例えば、前述した第3の実施形態のように、InfiniBand 等のFetch and Add を利用するリダクションを使用する実施形態において、もともと「取りまとめ」ノードが存在する場合には、この方法を使用する際に追加で必要になるシステム資源は少ないため、この方法も考えられる。
本実施形態では、管理対象を(必要なら複数の階層で)グループ分けしたものを新たな管理対象と見なす。図23は、管理対象(ノード)のグループ化の階層の説明図である。また、図24は、管理対象のグループ化階層と各サブグループに対して「割当てられた識別子」の対応関係の説明図である。また、図25は、図24の具体例である。本実施形態では送信側ノードで予めグループ内の管理対象に対してlogical or を実行しておく。すなわち、図23に示されるように、管理対象を階層的にグループに分ける。次に、図24および図25の具体例に示されるように、「グループ内に一つでも所定の状態にある管理対象がある」場合、そのグループを管理するノードが、グループに対応するbit位置をon、他のbit 位置(他のグループに対応するbit 位置)をoffにしたデータを作る。そして、このようなデータを入力として、元々の管理対象の状態通知とは別にreduction を行う。
以上の処理は、「管理対象のグループ」を「(仮想的な)上位の管理対象」に設定した事に他ならず、送信側ノードでの処理手順には、一部のノードでの管理対象が増える以外には、グループ分けをしない第1、第2,または第3の実施形態場合と同様の処理が実行される。すなわち、第4の実施形態では、集団識別子を格納すべき記憶領域に、グループ用の領域を指定するのみでよい。
受信側ノードは、各グループ(上位の管理対象)に対応する領域内のbit のon / off に基いて、グループ内の(下位の)管理対象に対する領域参照の必要性を判定し、参照不要な領域を飛ばして処理を行う。すなわち、図25の具体例に示されるように、各階層の管理領域でbit on の位置を枝とした木構造として扱う。
特に、最下層の識別子領域の探索の高速化のみを目的にグループ分けを行う場合には、後述するように、この木構造に対し深さ優先探索を行う事で、探索中に保持すべきメモリ領域の大きさを節約する事ができる。
図26は、階層的なグループ分けで疎なビット列の0でないビットの検索範囲を限定する際の送信メッセージと受信領域の例を示す図である。図26において、定数の前の0xは16進数表記である事を意味する。図26に示されるように、階層ごとに、
第n階層領域アドレス|領域内のビット
という識別子送信メッセージフォーマットで、集団識別子の送信パケットを生成すればよい。「第n階層」は、第1階層、第2階層、第3階層、・・・を示す。「第n階層領域アドレス」は、受信側ノードにおけるメモリ(例えば、図7の受信・中継ノード702のメモリ702−1)における、集団識別子の記憶領域の第n階層に対応するアドレスを示す。「領域内のビット」は、「第n階層領域アドレス」は、第n階層に対応する集団識別子のビット列である。あとは、各階層ごとに、第1、第2、または第3の実施形態で説明したようにして、自ノードの管理対象に関する個別識別子のビット情報をセットすればよい。
図27は、第4の実施形態における送信側ノードにおける識別子集約機構401(図4)による階層的にグループ化された集団識別子の送信処理の例を示すフローチャートである。機能ブロックおよびシステム構成は、第1の実施形態における図4および図7を例として説明する。もちろん、図20、図21、図22等のシステム構成が採用されてもよい。図4の識別子集約機構401の処理が開始されると、図7の送信起点ノード701または中継ノードとして機能する受信・中継ノード702のCPU701−1または702−1は、グループ階層番号の初期値として1を入力する(ステップS2701)。現在のグループ階層番号が既定のグループ階層数以下である場合(ステップS2702の判定がYES)、CPU701−1または702−1は、自ノードにより受信された「グループ階層番号」が示す現グループ階層での個別識別子から図4のリダクション404により集団識別子を求める(ステップS2703)。
ステップS2703での処理が終了すると、CPU701−1または702−1は、グループ階層番号を1増やして(ステップS2704)、ステップS2702での処理に戻る。
グループ階層番号が既定のグループ階層数を超えた場合(ステップS2702の判定がYES、CPU701−1または702−1は、一連の識別子集約機構401の処理を終了し、グループ階層化された集団識別子を送信する(ステップS2705)。
図28は、第4の実施形態における受信側ノードにおける識別子分析機構402(図4)による深さ優先探索を伴う受信処理の例を示すフローチャートである。「深さ優先探索」とは、木構造の階層構造において、階層ごとに横方向に探索するのではなく、階層の最下層まで行ったら最下層管理対象の処理を行い、その後また第1階層に戻り次の最下層の探索を行う処理である。機能ブロックおよびシステム構成は、第1の実施形態における図4および図7を例として説明する。もちろん、図20、図21、図22等のシステム構成が採用されてもよい。図4の識別子分析機構402の処理が開始されると、図7の受信・中継ノード702のCPU702−1は、グループ階層番号の初期値として1を入力する(ステップS2801)。現在のグループ階層番号が既定のグループ階層数以下である場合(ステップS2802の判定がYES)、CPU702−1は、自ノードにより受信された「グループ階層番号」が示す現グループ階層の次階層にゼロでない領域があるか否かを判定する(ステップS2803)。
ステップS2803の判定がYESならば、CPU702−1は、図29で後述する「下層識別子領域の探索」の処理により、現グループ階層の1つ下の階層のゼロでない領域を求める(ステップS2804)。
その後、グループ階層番号を1増やして(ステップS2805)、ステップS2802の処理に戻る。
グループ階層番号がグループ階層数に達して最下層となり、ステップS2802の判定がNOになると、CPU702−1は、ステップS2804により最下層から取り出されている個別識別子より、管理対象を抽出する処理を実行する(ステップS2806)。その後、CPU702−1は、ステップS2801の処理に戻り、他のグループ階層に対する探索を続行する。
図29は、図28のステップS2804の下層識別子領域の探索の処理の詳細処理の例を示すフローチャートである。
まず、CPU702−1は、図28のグループ階層番号によって指定されたグループ階層(これを「g」とする)に対応する指定された領域番号のビットフィールドの値を取り出し、メモリ702−2の作業領域 W(g) に格納する(ステップS2901)。
次に、CPU702−1は、作業領域W(g)の内容が0(ゼロ)であるか否かを判定する(ステップS2902)。ステップS2902の判定がYESならば、CPU702−1は、後述するS2906の処理に移行する。
ステップS2902の判定がNOならば、CPU702−1は、個別識別子内の1が現れるビットBを作業領域W(g)からLZC又はTZC(図19のステップS1903の説明を参照)の次のビット位置を見て特定する(ステップS2903)。
次に、CPU702−1は、グル―プ階層番号、階層内の識別子領域番号、およびBから次の階層の識別子領域番号 rを求める(ステップS2904)。
その後、CPU702−1は、ステップS2903で特定されたビットBの値を0(ゼロ)にオフする(ステップS2905)。
ステップS2905の処理の後またはステップS2902の判定がNOの場合、CPU702−1は、次の階層の識別子領域番号 rと作業領域W(g)の内容を呼び出し元のプログラム(図28)に通知する(ステップS2906)。その後、CPU702−1は、図29のフローチャートの処理を終了し、図28のステップS2804の処理を終了する。
第4の実施形態において、以上の動作に加えて、各階層の管理対象に対応する一つのm bits の(整数として扱う)領域内のbit 参照に際して「1 が比較的少ない」場合の高速化を目的とする処理について説明する。この処理の詳細については、下記文献[6]に開示されている。
[6] Henry S. Warren,"Hacker's Delight (2nd Edition)",2012/9/14
この文献は、指定された整数領域内のbitの数え上げ(Population Count) や、整数領域の先頭ないし末尾にある0 であるbits の数え上げLZCやTZCおよび3, 5, 7 など特定の定数での除法について、現在知られている高速なアルゴリズムを開示している。このアルゴリズムは、一般的な計算機で実現することができる。
整数データ領域内で、次のようなbit 演算を高速に実行する手段が知られている。
(a) 整数領域内の1 (bit on) の数を調べる。
(b) 整数領域の末尾(LSB: Least Significant Bit)から数えて最初に1 が現れるbit 位置を求める。
(c) 整数領域の先頭(MSB: Most Significat Bit) から数えて最初に1 が現れるbit位置を求める。
なお、最初に1 が現れるbit 位置を求める事は、最初に1 が現れるまでの0 の数を求める事と同等である事に注意しておく。関連する用語、略語を定義しておく。
Population Count: 領域内の1 の数を調べる操作
NTZ: Number of Trailing Zero: LSB から最初に1 が現れるまで数えた0の数
TZC: Trailing Zero Count: NTZ を求める操作
NLZ: Number of Leading Zero: MSB から最初に1 が現れるまで数えた0 の数
LZC: Trailing Zero Count: NLZ を求める操作
なお、前述の手段(a)の高速演算を手段(b)の高速演算の実現に利用する場合などもある。例えば、32 bits 整数領域内の1 の数は、判定やループを含まない、下記のような5回の代入の繰り返し演算が知られている。ここでbits は32 bits の整数領域、= は代入、& はbitwise and、「a>>b」はaのb bitsのshift(ビットシフト処理)を表し、定数の前の0xは16進数表記である事を意味する。
bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
bits = (bits & 0x0000ffff) + (bits >>16 & 0x0000ffff);
また、CPU が「所定の整数領域内の1 の数を求める命令」(例えば、Intel 社製CPU のSSE 命令の一つであるPOPCNT 命令など)を備える場合、その命令を使用する事で領域内の1 の数は高速に求められる。
前述の手段(b)は、現在の一般的なCPUでの負の数の表現形式が「2の補数」に基づくため、例えば「((x & (-x))-1)」に対するpopulation countにより、NTZを求める事ができる。
前述の手段(c)は手段(b)に比べると、多くのCPUが備える一般的な命令で高速実行する事が難しいとされている。例えばSun Microsystemsが開発し現在SPARC International Inc. が登録商標を保有するSPARC64 IXfx などのCPU が備えるLZC 命令を使用する方法がある。
また、整数とIEEE754 で規定された浮動小数点数の変換がレジスタ間で直接行えるCPUでは、浮動小数点形式への変換での指数部が「2を底とする対数の整数部分」である事を利用した比較的高速な計算方法が知られている。
第2の実施形態の手順(4)で説明した「個別識別子の特定処理(の高速化)に都合が良い方を選ぶ」とは、例えば、受信側ノードがLZC命令を備えるならLSBから、そうでない場合MSBから、管理対象の番号とbitを対応させていく事を指す。
1であるbitが比較的少ない場合、「LZCないしTZCを利用して、1であるbitを順次求めて管理対象を特定する」方法は、「1 bitずつ参照位置をずらし、そのbitが1か否か判定するループ」による方法と比較すれば、いずれにせよ高速である。
LZCを使うかTZCを使うかを、受信側ノードでどちらが高速に実行できるかを基準に選択する事は、システムとしての最適化の一環としての意味を持つ。
以上説明した第4の実施形態によれば、「所定の状態の管理対象」の割合が少なく、m bits の整数領域単位で見て、1であるbitが1つも存在しない領域が多いと想定される場合、管理対象を階層的にグループ化して、「上位の管理対象」についての判定を先に行う事で、処理を高速化することが可能となる。
<第5の実施形態>
次に、第5の実施形態について説明する。本実施形態では、個別識別子のコード化方法について説明する。機能ブロックおよびシステム構成は、第1の実施形態における図4および図7を例として説明する。もちろん、図20、図21、図22等のシステム構成が採用されてもよい。
図4の「リダクション404」で使用する演算は、第1の実施形態において図9(b)を用いて説明したように、乗法演算により、素数だけでなく、「素数冪の数で、冪の指数自体が再び素数冪である数」を使って、個別識別子の割当てを行う。特に、「冪の指数自体が2の冪」の場合が、「所定の大きさ以下の個別識別子」の数を増やす観点からは、最も効率がよい。
本実施形態は、第1の実施形態で説明した分解能が完全である必要がない(固定の上限k より多くの管理対象が所定の状態になった場合は、それらの管理対象を識別する必要がない)事を前提とする。
乗法による「リダクション」でコード化された個別識別子から計算された集団識別子からは、例えば各個別識別子による除法により、その個別識別子が乗法の因子として含まれているか否かを判定することができる。例えば、個別識別子を「互いに素な整数」ないし「全て異なる素数」を選んでおく事で、集団識別子から個別識別子を乗法の因子として取り出すことが可能となる。
個別識別子の割当てについては、第1の実施形態で図9(b)、図12(b)、図8の(a)、(b)、(c)、(d)を用いて説明した場合と同様である。
まず、分かりやすい例として、次の条件を満たすような整数を個別識別子として割り当てる場合を考察する(より一般的な割当て方法については後述する)。
「異なる管理対象に対応する整数は、共通の素因数を持たない。」
この条件は、次のように言い換える事もできる。
「異なる管理対象に対応する整数は、互いに素である。」
例えば、異なる管理対象に異なる素数を割り当てれば、上記の条件は満たされる。
ここで、所定の状態にある管理対象には個別識別子を対応させ、そうでない管理対象に1を対応させておいて、集団識別子は乗法によるリダクション404で与える。なお、格納用の領域は任意の個別識別子k 個以下の積についてはオーバーフローしない大きさにする。例えば、大きい順にk個の個別識別子を取り、それらの積を格納可能な大きさにする。
「個別識別子が共通の素因数を持たない」という条件は、集団識別子となった積でオーバーフローが起きていない場合に、「ある管理対象の所定の事象を通知した」事が「管理対象の個別識別子が集団識別子を割り切る」事で判定可能である事を保証する。
このように、分解能が上限k で制限されている場合、k 個より多くの識別子に対する演算がオーバーフローする可能性を許容して、k 個以下での演算結果からは入力となった識別子を復元できる演算、例えば整数の乗法によるリダクションや整数あるいは浮動小数点数の加算を利用する。なお「オーバーフロー」は、通常の計算での発生時は計算手順の誤りを示す場合が多いが、本実施形態では、「複数の管理対象の状態を一括して受け取る情報通知経路」の一つとして、「オーバーフロー」を積極的に活用していることになる。
本実施形態は、分解能に関する制約条件がある(完全である必要がない)事を利用して、同じ大きさの領域で、第1から第4の実施形態の場合に比べて、多くの管理対象に対応する(あるいは同数の管理対象に対して、より小さい領域で対応する)。
例えば、k = 2 、管理対象数が54 として、各管理対象に小さい順に素数を対応させた場合、53番目の素数は241,54番目の素数は251 で、241*251<(256*256)-1=2^16-1(「^」は冪乗を表す)に注意すると、格納用領域は、16ビットで十分である。k=1とすると、16 bit領域で2^16-1より小さい素数の個数=6542個の管理対象に対応できる。
第1から第3の実施形態では、16bitで対応可能な管理対象は16個である。16<54<6542であるのは、kが小さくなるほど「複数の対象についての情報の、より少ない一部」しか送信する必要がないためである。例えば「2個以上の管理対象が所定の状態にある」事と「1個だけが所定の状態にある」事を区別する必要もないとして、「分解能がk=1」よりも条件を緩和すると、さらに多くの管理対象に対応できる事になる。例えば16 bit領域に格納できる0以外の任意の整数を個別識別子として、所定の状態にある管理対象は個別識別子、そうでない管理対象には0(ゼロ)を対応させて「最大値」でのリダクションを実行する事で、16bit領域で2^16-1=65535個の管理対象に対応できる。
図30は、第5の実施形態における送信側ノードにおける識別子集約機構401(図4)の処理の例を示すフローチャートである。図30は、第1の実施形態に係る図5のフローチャートにおいて、リダクション404の演算が加法から乗法に置き換えられたものである。機能ブロックおよびシステム構成は、第1の実施形態における図4および図7を例として説明する。もちろん、図20、図21、図22等のシステム構成が採用されてもよい。図4の識別子集約機構401の処理が開始されると、図7の送信起点ノード701のCPU701−1または中継ノードとして機能する受信・中継ノード702のCPU702−1が実行する。入力パラメタ1または2等の作業領域は、送信起点ノード701のメモリ701−2または受信・中継ノード702のメモリ702−2に記憶される。
まず、自ノードが通信の起点ノードであるか否かが判定される(ステップS3001)。
ステップS3001の判定がNOであるならば、受信済みの値を格納する入力パラメタ1に、受信済みの値(集団識別子)が格納される(ステップS3002)。
ステップS3001の判定がYESならば、受信済みの値は無いため、入力パラメタ1に、乗法演算の単位元の値1が格納される(ステップS3003)。自ノードが通信の起点ノード(図7の送信起点ノード701)であって、受信済みの値がなければ、入力パラメタ1に単位元が格納されることにより、入力パラメタ1がリダクション404の演算に影響を与えないようにされる。
次に、自ノードが管理する管理対象において通知すべき条件が成立したか否かが判定される(ステップS3004)。
ステップS3004の判定がYESならば、自ノードの状態を格納する入力パラメタ2に、自ノードにおける管理対象(または自ノードそのもの)に対応する個別識別子が格納される(ステップS3005)。
ステップS3004の判定がNOならば、入力パラメタ2に、単位元の値1が格納される(ステップS3006)。自ノードが管理する管理対象において通知すべき条件が成立していなければ、入力パラメタ2に単位元が格納されることにより、入力パラメタ2がリダクション404の演算に影響を与えないようにされる。
その後、リダクション404に使用する乗法演算が、入力パラメタ1および入力パラメタ2に対して実行される(ステップS3007)。
最後に、ステップS3007での演算結果が、次の転送先への送信内容である集団識別子とされて出力される(ステップS3708)。その後、図30のフローチャートで例示される送信側ノードにおける識別子集約機構401の処理が終了する。
図31は、第5の実施形態における受信側ノードにおける識別子分析機構402(図4)の処理の例を示すフローチャートである。図31は、第1の実施形態に係る図6のフローチャートにおいて、リダクション404の演算が加法から乗法に置き換えられたものである。機能ブロックおよびシステム構成は、第1の実施形態における図4および図7を例として説明する。もちろん、図20、図21、図22等のシステム構成が採用されてもよい。図4の識別子分析機構402の処理が開始されると、受信側ノードとして機能する図7の受信・中継ノード702のCPU702−1が実行する。また、作業領域WやX等は、受信・中継ノード702のメモリ702−2に記憶される。
まず、ノード間のリダクション404における集団識別子が受信される(ステップS3101)。
次に、集団識別子においてオーバーフロー(図中「overflow」)が発生しているか否かが判定される(ステップS3102)。ステップS3102の判定がYESならば、受信処理は実質的に何も行われずに、図31で例示される受信側ノードにおける識別子分析機構402の処理が終了する。
次に、ステップS3102の判定がNOならば、集団識別子が作業領域Wに格納される(ステップS3103)。
次に、作業領域Wが示す値がリダクション404の乗法演算における単位元の値1となったか否かが判定される(ステップS3104)。
ステップS3104の判定がNOならば、集団識別子から個別識別子が1つ特定され、その結果が作業領域Xに格納される(ステップS3105)。具体的には、集団識別子が各個別識別子で割り切れるかを判定して、割り切れた場合、その個別識別子の表す対象で所定の事象が発生したと判定して、その個別識別子を特定する。
その後、ステップS3105で作業領域Xに格納された個別識別子に対応する管理対象が処理(特定)される(ステップS3106)。この特定の具体的な手法は、第1の実施形態に係る図6のステップS605の場合と同様である。
次に、リダクション404に使用した乗法演算の逆演算すなわち除法演算で、ステップS3105において作業領域Wから特定され作業領域Xに格納された個別識別子が取り外される(ステップS3107)。すなわち、W/Xという除法演算が実行され、その結果が再び作業領域Wに格納される。その後、ステップS3104の処理に戻って、上述のステップS3104からステップS3107までの処理が繰り返し実行される。
作業領域Wが示す値がリダクション404の乗法演算における単位元の値1となった結果、ステップS3104の判定がYESになると、図31のフローチャートで例示される受信側ノードにおける識別子分析機構402の処理が終了する。集団識別子は、単位元=1(図30のステップS3003参照)の状態から乗法演算によって個別識別子が順次追加されてゆく(図30のステップS3007)。従って、図31のフローチャートでは、乗法の逆演算である除法演算(ステップS3107)によって個別識別子が順次取り去られてゆき、最後は単位元=1にもどる。よって、ステップS3104の判定がYESになると、図31のフローチャートの処理が終了する。
以上の第5の実施形態の動作において、「各ノードの識別子が互いに素」という条件と「整数論」という分野の数学でよく知られた「素因数分解の一意性」という事実により、判定の正しさが保証される。
ここまで、個別識別子は互いに素ないし全て素数としたが、より一般的な条件で個別識別子の割当てが可能な事を説明する(「互いに素」あるいは「素数」としたのは、説明を簡略にするためである)。
すなわち、任意の個別識別子a と集団識別子b に対し「a がb を割り切る」事と「a がb を計算する乗算の過程で使われた」事が互いに他の必要十分条件になればよい。後者が前者の十分条件である事は明らかなので、後者が前者の必要条件であればよい。
複数の個別識別子a1 とa2 が素因数p を共有しても、a1 がp を1つだけ、a2 がp を2つ含む(つまり、p^2 で割り切れ、p^3 では割り切れない)とし、他には素因数p を持つ個別識別子がないとする。素因数p がb に何回含まれるかによりa1 とa2 がb を計算する過程で使われたかどうかは、図32の表のように決まるので、後者が前者の必要条件となる。
同様に、複数の個別識別子に共有されている素因数に対し、それぞれの個別識別子が素因数を含む個数が「任意の個別識別子の積の組み合わせの積を含む集団識別子から個別識別子を決定可能な数になっていれば、個別識別子が「互いに素」である必要はない。
例えば、素因数p に対して整数q の冪からなる集合Q={q^a|a=0,1,2,...}があって、「素因数p を共有する個別識別子の各々がp を含む回数」が、互いに異なるQ の要素であるならば、「集団識別子がp を含む回数」をq 進法で表したときの0 でない桁の任意の1つをa として、「素因数p をq^a回含む個別識別子」が、集団識別子の生成因子であると判定できる。
図33から図36は、図31のステップS3105の個別識別子を特定する処理の、上述の理論に基づく詳細処理例を示すフローチャートである。
まず、図33のフローチャートの処理について説明する。このフローチャートは、集団識別子からの素数冪の個別識別子成分の抽出の機能(A)を実現するものである。
作業領域Wに、受信された集団識別子の成分が格納される(ステップS3301)。
次に、作業領域L に、個別識別子の成分リストが格納される(ステップS3302)。
次に、作業領域Lの先頭位置が、作業領域Xに格納される(ステップS3303)。
次に、ステップS3305で作業領域Xの値が作業領域Lの末端位置になったと判定されるまで、ステップS3307で作業領域L内の次の位置が順次作業領域Xに格納されながら、ステップS3306とS3307の処理が繰返し実行される。
すなわち、ステップS3306では、作業領域L内の作業領域Xが示す位置の個別識別子の成分が、作業領域Qに格納される。
そして、ステップS3307では、作業領域Qの値が作業領域Wの値を割り切るか否かが判定される。
ステップS3307の判定がYESであれば、処理を終了する。
ステップS3307の判定がNOであれば、ステップS3308で作業領域Xが示す作業領域L内の位置が更新されて、ステップS3305の処理に戻る。
以上の繰返し動作の結果、作業領域Xの値が作業領域Lの末端位置になりステップS3305の判定がYESとなると、処理を終了する。
上記フローチャートの処理において、作業領域Lのリストの探索結果は作業領域Qの値で区別できる。作業領域Qの値が0(ゼロ)でないということは、個別識別子が作業領域Lのリスト内で見つかったということを示している。
次に、図34のフローチャートの処理について説明する。このフローチャートは、集団識別子からの素数冪の個別識別子成分の抽出の機能(B)を実現するものである。
作業領域Wに、受信された集団識別子の成分が格納される(ステップS3401)。
次に、作業領域pに、作業領域Wの素因数の1つが格納される(ステップS3402)。
次に、作業領域pの値が格納される(ステップS3403)。
次に、作業領域fに、値1が格納される(ステップS3404)。
次に、作業領域Wの値を作業領域pの値で除算した結果が、作業領域Vに格納される(ステップS3405)。
次に、ステップS3406で作業領域pの値が作業領域Vの値を割り切らなくなったと判定されるまで、ステップS3407からS3409の処理が繰り返し実行される。
すなわち、作業領域pの値が作業領域Vの値を割り切った結果ステップS3406の判定がYESになると、ステップS3407で、作業領域Vの値を作業領域pの値で除算した結果が、作業領域Vに格納される。
次に、ステップS3408で、作業領域pの値に作業領域qの値を乗算した結果が作業領域qに格納される。この作業領域qの値は、作業領域Wに含まれる作業領域pの素数についての最大冪因子である。つまり、W/qが素数pの因子を含まず、fを指数として、q=p^fである。
そして、ステップS3409で、作業領域fの値が+1される。
以上の繰返し処理の結果、作業領域pの値が作業領域Vの値を割り切らなくなった結果ステップS3407の判定がNOになると、処理を終了する。
次に、図35のフローチャートの処理について説明する。このフローチャートは、図34のフローチャートに引き続いて実行され、集団識別子からの素数冪の個別識別子成分の抽出の機能(C)を実現するものである。
まず、作業領域gに図34における作業領域fの値が格納される(ステップS3501)。
次に、個別識別子になる素数冪因子の値が作業領域Xに格納される(ステップS3502)。
次に、作業領域gの値であるか否かが判定される(ステップS3503)。
ステップS3503の判定がYESであれば、ステップS3502に戻って、個別識別子になる次の素数冪因子の値が作業領域Xに格納される。
ステップS3503の判定がNOになると、処理を終了する。
上述の図35のフローチャートで示される処理の代わりに、LZC(g)(gへのleading zero count)をdとして MSBから数えた(d+1) ビット目を0にする手順が実行されてもよい。
次に、図36のフローチャートの処理について説明する。このフローチャートは、集団識別子からの素数冪の個別識別子成分の抽出の機能(D)を実現するものである。
まず、TZC(g)の値が作業領域cに格納される(ステップS3601)。ここで、TZC(g)は作業領域gの値へのtrailing zero count(g内でLSB(Least Siginificant Bit)から数えた)連続してbitが0の数)である。作業領域gは、図35のフローチャートでセットされたものである。TZC(g)の代わりに、LZC(g)(leading zero cunt)が用いられてもよい。
次に、p^(c+1)(素因数pを作業領域cの値に+1して得られる値で冪乗した値)が作業領域Xに格納される(ステップS3602)。
そして、作業領域gにおいて、LSBから数えて(c+1)ビット目の値が0(ゼロ)に変更される(ステップS3603)。
ここで述べた一般化された個別識別子の取り方の中で、領域の大きさを固定にして分解能kを大きくする際は、上記q を2 とした場合の{全ての素数ないし素数の冪で指数が2の冪である数}、記号で書けば、{p^(2^a)|pは素数、a=0,1,2,...}を個別識別子の成分の集合に使う事が有利である。第1の実施形態の説明した図9(b)および図15の(C)、(D)は、この場合を例示している。
一方、分解能k を固定し、k より多くの管理対象が所定の状態になった場合、なるべく早くオーバーフローが起こるようにするには「k 個までの積ではオーバーフローしない範囲の数」の中から、素数の冪以外の数も含めて大きい順に、必要な個数、個別識別子の集合に含めていく事が有利である。
以上のようにして、第5の実施形態によれば、必要な分解能k が比較的小さい場合、第1から第4の実施形態に比べ、メモリ領域を削減することが可能となる。
<第6の実施形態>
次に、第6の実施形態について説明する。
本実施形態は、第5の実施形態の発展形である。本実施形態での個別識別子の割当ては、第1の実施形態の説明において示した図15の(e)および(f)に従う。
本実施形態では、第5の実施形態と同一のシステム構成で各ノードに複数の整数からなる順序付けられた組を対応させる。i,j をノード番号とし各ノードにm 個の数の組を対応させる。
すなわち、以下に示されるような、m 個の整数を要素とするベクトルを、管理対象の個別識別子とする。
Z(i) = (zi1, zi2, ..., zim)
Z(j) = (zj1, zj2, ..., zjm)
i≠j ならば、m 個の組の中で、少なくとも一つの場所の数が異なるとする。すなわち、「∨」で、論理式としてのor を表すと、
i ≠j ⇔ (zi1 ≠ zj1 ∨ zi1 ≠ zj1 ∨ ... ∨ zim ≠ zjm)
である。
ここで、ベクトルの各成分毎に、使われる整数の集合は同じであっても異なっていてもよいが、それぞれの集合毎に、異なる要素は互いに素であるとする。すなわち、
S1 = {ベクトルの第1成分用の整数の集合}
...
Sm = {ベクトルの第m成分用の整数の集合}
とする、S1, ..., Sm は、全て異なる2要素が互いに素であるような整数の集合である。
全ての成分が1 の場合を除いて、成分には1 が現れてもよい。
以下の説明において、一般にx 個の互いに素な整数の集合に現れる素因数の数は、x 以上であり、素因数の数がx 個になるのは、x 個の数全てが素数である場合に限る。
また、第5および第6の実施形態において、ノードの識別のための因数分解は、事前に定めた数の集合の要素により、reduction の結果が割れるかを順次試行していく処理に他ならない。
本実施形態は単一の数を使って管理対象を識別する第5の実施形態に比べ、使用するフィールド数は増加するが同一管理対象数のシステムに対して、比較的少数かつ大きさも小さい数からなる集合でノードの識別が可能になる。よって、各要素の因数分解を高速に行う事が可能になり、ノードの特定の処理時間が第5の実施形態に比べて、短縮される。
第5の実施形態で使用する数の集合S の要素数はノード数N 以上である必要があるが、本実施形態で使用する集合S1 ... Sm の要素数はN/m を越える最小の自然数でよい。どちらの実施形態でも、必要な除算の最大回数および平均回数は等しい。なぜならば、本実施形態では、各成分の因数分解をm 回繰り返すことになるが、各成分に必要な除算回数は1/m になるためである。
なお、ここまでの個別識別子の整数を互いに素としているが、第5の実施形態と同様「指数自体が素数冪であるような素数冪」の数を素因数に含むような、より一般的な割当て方法が可能である(ここまで「互いに素」としたのは、説明を簡略にするためである)。
ここで、これから後に説明他の実施形態と共通する基本原理について言及しておく。
第5および第6の実施形態は共に、「自然数についての素因数分解の一意性」という共通の原理に基づく。相違点は、「各ノードに割り当てる識別子が単一の数か、複数の数の組か」のみである。
0 と負の数を含めた(通常の意味の)整数全体についても、0 を分解の対象から除外して、「+1,-1は素因数と見なさない(言い換えれば、負の数の積での符号の各因数への付き方の違いでは異なる分解と見なさない)」事に注意すると、素因数分解の一意性が成立する。
一般的な集合で定義された「乗算」で、整数の場合と同様な意味での「一意的」な「素因数分解」が可能な場合、その集合での「素数」に関する条件を第5および第6の実施形態と同様に設定して、識別子をコード化する事ができる。(一般に、1や-1のような、「逆数も整数である数」は「素因数」には含めない)。
整数の場合と同様な意味で「一意的」な「素因数分解」が可能な集合の例としては、任意の「体」の要素を係数とする多項式のなす集合がある。多項式の集合において「既約多項式」が「素数」に相当する。
ここで、「体」とは、四則演算が定義され、加法、乗法共に交換法則と結合法則を満たし、0, 1 を含み、0 以外の全要素に対し「掛けて1 になる数」である「逆元」が存在する集合を指す。
「体」としては「有理数全体」、「実数全体」、あるいは「複素数全体」、有限体GF(q)(ただしq は集合としての要素数)などがある。なお、「有理数全体」、「実数全体」、あるいは「複素数全体」の集合が「体」である事を強調する際「有理数体」、「実数体」、あるいは「複素数体」と呼ぶ。
「素因数分解の一意性」の成り立つ乗法を持つ集合は、整数や「体」係数の多項式以外にもある。そのような集合の一種である「代数的整数」を利用した実施形態については、第7の実施形態の説明で後述する。
図37は、上述の理論に基づく、第6の実施形態における送信側ノードにおける識別子集約機構401(図4)の処理の例を示すフローチャートである。このフローチャートにおける処理の基本的な考え方は、前述した図5(第1の実施形態)、図17(第2の実施形態)、図30(第5の実施形態)などと同様である。図37は、第1の実施形態に係る図5のフローチャートにおいて、リダクション404の演算が加法から乗法に置き換えられ、かつ上述の理論に基づいて個別識別子および集団識別子がベクトル化されたものである。機能ブロックおよびシステム構成は、第1の実施形態における図4および図7を例として説明する。もちろん、図20、図21、図22等のシステム構成が採用されてもよい。図4の識別子集約機構401の処理が開始されると、図7の送信起点ノード701のCPU701−1または中継ノードとして機能する受信・中継ノード702のCPU702−1が実行する。入力ベクトル1または2等の作業領域は、送信起点ノード701のメモリ701−2または受信・中継ノード702のメモリ702−2に記憶される。
本実施例での識別子は整数の順序付けられた集合である。ここでは、「順序付けられた集合」を「ベクトル」と呼び、「順序つけられた集合」の要素である整数を成分と呼ぶ。識別子がベクトルである事を強調する際は、「個別識別子ベクトル」、「集団識別子ベクトル」、さらに両者を合わせ「識別子ベクトル」と呼ぶ。識別子ベクトル間の演算は、対応する位置の成分間の演算で定める。
図37において、まず、自ノードが通信の起点ノードであるか否かが判定される(ステップS3701)。
ステップS3701の判定がNOであるならば、受信済みの値を格納する入力ベクトル1に、受信済みの集団識別子ベクトルが格納される(ステップS3702)。
ステップS3701の判定がYESならば、受信済みの値は無いため、入力ベクトル1の全成分に、乗法演算の単位元の値1が格納される(ステップS3703)。
次に、自ノードが管理する管理対象において通知すべき条件が成立したか否かが判定される(ステップS3704)。
ステップS3704の判定がYESならば、自ノードの状態を格納する入力ベクトル2に、自ノードにおける管理対象(または自ノードそのもの)に対応する個別識別子ベクトルが格納される(ステップS3705)。
ステップS3704の判定がNOならば、入力ベクトル2の全成分に、単位元の値1が格納される(ステップS3706)。
その後、入力ベクトル1,2の全成分の間で、リダクション404に使用する乗法演算が実行される(ステップS3707)。
最後に、ステップS3707での演算結果が、次の転送先への送信内容である集団識別子ベクトルとされて出力される(ステップS3708)。その後、図37のフローチャートで例示される送信側ノードにおける識別子集約機構401の処理が終了する。
図38は、上述の理論に基づく、第6の実施形態における受信側ノードにおける識別子分析機構402(図4)の処理の例を示すフローチャートである。このフローチャートにおける処理の基本的な考え方は、前述した図6(第1の実施形態)、図18(第2の実施形態)、図31(第5の実施形態)などと同様である。図38は、第1の実施形態に係る図5のフローチャートにおいて、リダクション404の演算が加法から乗法に置き換えられ、かつ上述の理論に基づいて個別識別子および集団識別子がベクトル化されたものである。機能ブロックおよびシステム構成は、第1の実施形態における図4および図7を例として説明する。もちろん、図20、図21、図22等のシステム構成が採用されてもよい。図4の識別子分析機構402の処理が開始されると、受信側ノードとして機能する図7の受信・中継ノード702のCPU702−1が実行する。また、作業領域ベクトルWやX等は、受信・中継ノード702のメモリ702−2に記憶される。
まず、ノード間のリダクション404における集団識別子ベクトルが受信される(ステップS3801)。
次に、集団識別子ベクトルにおいてオーバーフロー(図中「overflow」)が発生しているか否かが判定される(ステップS3802)。ステップS3802の判定がYESならば、受信処理は実質的に何も行われずに、図38で例示される受信側ノードにおける識別子分析機構402の処理が終了する。
次に、ステップS3802の判定がNOならば、集団識別子ベクトルが作業領域ベクトルWに格納される(ステップS3803)。
次に、作業領域ベクトルWの全成分値がリダクション404の乗法演算における単位元の値1となったか否かが判定される(ステップS3804)。
ステップS3804の判定がNOならば、集団識別子ベクトルから個別識別子ベクトルが1つ特定され、その結果が作業領域ベクトルXに格納される(ステップS3805)。
その後、ステップS3805で作業領域ベクトルXに格納された個別識別子ベクトルに対応する管理対象が処理(特定)される(ステップS3806)。
次に、リダクション404に使用した乗法演算の逆演算すなわち除法演算が作業領域ベクトルWと作業領域ベクトルXの各成分に適用され、ステップS3805において作業領域ベクトルWから特定され作業領域ベクトルXに格納された個別識別子が取り外される(ステップS3807)。その後、ステップS3804の処理に戻って、上述のステップS3804からステップS3807までの処理が繰り返し実行される。
ステップS3804の判定がYESになると、図38のフローチャートで例示される受信側ノードにおける識別子分析機構402の処理が終了する。
一般に、除算を実行するには被除数と除数をメモリからfetch する必要があり、実施形態5では、成分の集合を全て同じにすれば、メモリからfetch すべき除数の数が1/m になり、N >> m (N がm に比べて十分大きい)となる大規模システムでは除数がキャッシュヒットする回数が多くなる利益の方が、被除数が1 個からm 個になる事により、キャッシュミス回数が多くなる損失を上回る。よって、N >> m であれば、本実施形態の方が計算処理時間の面で第5の実施形態よりも有利である。
また、N が十分大きい場合、使用メモリ量に関しても、本実施形態は不利にならない。なぜならば、「x 以下の素数の数」を表す関数をπ(x) と書くと、整数論で「素数定理」と呼ばれる事実によりπ(x) と(x/log(x)) の比はx→∞のとき1 に収束する事が知られているからである。
つまり、「素数の密度」(π(x) /x )が対数関数の逆数1/log(x) 程度になる(ここでの対数は自然対数)。すなわち、ノード数が多くなって成分の素因数として使える素数を追加する場合、平均的には指数関数的に大きくする必要がある。このため、オーバーフローせずに格納するために必要なメモリ領域のビット数は、本実施形態で比較的小さな素数ないし素数の冪の複数の組による個別識別子の集合を使う方が、単一の素数ないし素数の冪による第5の実施形態に比べて小さくなる場合が増えていく。
<第7の実施形態>
次に、第7の実施形態について説明する。
整数の乗法以外でも、ある集合内の演算が「複数要素の演算結果から元の要素を復元できる」という意味で整数の乗法と共通する性質を持つなら、その演算を図4の機能の実現に利用することができる。特に、「素因数分解の一意性」が成立する乗法を持つ集合を使って、通常の整数での乗法を使用する場合と、ほぼ同じ方法で図4の機能の各演算を実施できる。
第7の実施形態での個別識別子の割当ては、第1の実施形態の説明において示した図15の(g)および(h)に従う。
任意の「体」について、その「体」を「係数体」とする「ベクトル空間」が、要素である「ベクトル」の間に交換法則、結合法則を満たす加法と、指定した体の要素をスカラーとする「スカラー倍」の演算を持つ集合として定義される。
有理数体を含む体で、ベクトル空間として有限次元である体K は「(有限次元)代数体」(algebraic number field) 呼ばれる(以下では「有限次元」を省略する)。K に含まれる「代数的整数」全体をO_K と書く。(ここで「代数的整数」とは最高次の係数が1の整数係数の既約多項式をf(x) として、方程式f(x) = 0 の根になる複素数の事を指す)。
O_K は加法、減法、乗法について閉じている集合になる事が知られているので、O_K にの中で、「素数」の役割を果たす数をp|ab → p|a ∨ p|b (ここで「x | y」はx はyを割り切る事、「→」は「ならば」、「∨」は「または」の意味である)で定義する。
この定義により、O_K での「素因数分解の一意性」が成り立つ条件や実例が、「代数的整数論」と呼ばれる数学の一分野で、良く知られている。よって「素因数分解の一意性」が成り立つ任意のO_K を使って、第5または第6の実施形態と類似した方法で、図4の機能の各演算を実施できる。
その際のポイントは、代数体K が有理数体上有限次元である。従って、その次元をn として、K からn 個の要素k1,k2,...,knを適切に選んで、任意のK の要素を、有理数係数の線形結合{c1*k1+c2*k2+...cn*kn|ciは有理数、ki∈K (i=1,2,...n)}として表せるので格納用の領域を固定長にできる事である。さらに、O_K の要素係数が全て整数になるk1,...,knを選んでn 個の整数の組とO_K の要素を1対1対応させる。代数体K は有理数体に1つの代数的整数α(および、その冪)を付け加えて得られる事が知られている。従って、このようなk1,...,knは、「最高次の係数が1の整数係数の既約多項式f(x)」を1つ取り、f(α)=0を満たすをαを使って、k1=1,k2=α,...,kn=α^(n-1)として定めればよい。
ここで、k1,...,knは(有理数体上のベクトル空間として)、K の基底である。なお、n 個のK の要素が基底である事の必要十分条件は、有理数体上のベクトル空間の要素として「線形独立」である事なので、{k1,...,kn}の選び方は1通りではない。特に断らなければ、K に含まれる代数的整数αにより、{1,α,...,α^(n-1)}としておく。
以下では、n=2 であるような例を2つ示す。一般のn についても原理は同じである。
まず、虚数単位i はx^2+1=0の根なので、代数的整数である。有理数体に虚数単位i を追加して得られる体Q[i]は、有理数体上、2次元のベクトル空間となる。
集合Z[i]={実部と虚部の係数が共に整数である複素数}を「ガウス整数」という。ガウス整数は、K=Q[i]に対する上述したO_K の例である。ガウス整数について「素因数分解の一意性」が成立する事が知られている。
例えば、「ガウス整数」中では、2=(1+i)×(1-i)のように2 は2つのガウス整数の積として表されるので、2 は「ガウス整数としての素数」ではない。しかし、1+i,1-iは(実数部、虚数部の絶対値を考えれば明らかなように)「ガウス整数の中での「素数」」になる。そして、2 を「ガウス整数の中での素数」に分解する方法は、この2つのガウス整数の積への分解に限られる。
ガウス整数を実数部と虚数部に分けて2つの通常の整数用の領域に格納し、各管理対象の個別識別子を、「ガウス整数の中での「素数」」についての条件で第5、第6の実施形態での素数についての条件を置き換えて設定する。そうすると、「ガウス整数としての積(複素数としての積)」を2項演算とするリダクションにより、集団識別子を求める事ができる。なぜならば、2つのガウス整数A,Bに対し、あるガウス整数C を取ってA=B×Cとできるか否かは、B の複素数としての逆数Dを取ってD×Aの係数が実部、虚部ともに整数であるか否かで判定できるからである。前述したガウス整数内での素因数分解の一意性により、どの個別識別子の積で生成されたかの判定も、第5,第6の実施形態と同様に実行できる。
なお、ガウス整数同士の間では、商と余りを生成する除法が定義され、この除法での余りが0 か否かで、集団識別子(の成分)が個別識別子(の成分)で割り切れるか否かで判定する事も可能である事が知られている。
次に、ω=(-1+i√3)/2 (i は虚数単位)とおくと、ωはx^2+x+1=0 の根なので代数的整数である。ωを有理数体に追加した体Q(ω) は、有理数体上2次元のベクトル空間になる。なぜならば、加法と乗法について Q[ω]={A+Bω|A,Bは有理数}が閉じている事は明らかなので、除法についても閉じていれば、Q(ω)=Q[ω]となるので有理数体上2次元である事が分かるからである。特に逆数について閉じていればよい。a+bω≠0である任意の2つの有理数a,b に対し、1/(a+bω)=(a+bω^2)/(a^2-ab+b^2)=((a-b)-ω)/(a^2-ab+b^2)∈ Q[ω]と確認できる。
集合Z[ω]={a+bω|a,bは通常の整数}を「アイゼンシュタイン整数」という。
(a + bω)*(c + dω) = ac + (bc+ad)ω + bdω^2
にω^2=-1-ωを代入すると、以下のように計算できる。
(a + bω)*(c + dω) = (ac-bd) + (bc+ad-bd)ω
従って、「アイゼンシュタイン整数」同士の積は「2つの整数の組」の間の演算として表せるので、2つの通常の整数用の領域によって「アイゼンシュタイン整数」1つを保持しておき、「アイゼンシュタイン整数」を個別識別子とする事ができる。
2つのアイゼンシュタイン整数A,B に対し、あるアイゼンシュタイン整数C が存在してA=B×CであるかはB の複素数での逆数D に対しD × A がアイゼンシュタイン整数であるかにより判定される。下記等式から任意のアイゼンシュタイン整数B の逆数D に対し、あるアイゼンシュタイン整数E と通常の整数Z の組によりD=(E/Z)と表せるので、A=B×Cと書けるか否かはE×Aの係数がZ で割り切れるか否かにより判定できる。
(a + bω)*(a + bω^2) = a^2 -ab + b^2
∴1/(a + bω) = (a + bω^2)/(a^2 -ab + b^2 )
「アイゼンシュタイン整数」の中でも「素因数分解の一意性」が成立する。
また、「アイゼンシュタイン整数」の中で商と余りを生成する除法が定義され、この除法での余りが0 か否かでも「割り切れるか否か」の判定ができる事が知られている。
以上から「アイゼンシュタイン整数」(ないし、その組)を個別識別子とし、積によるリダクションで集団識別子を求めることにより、図4の演算機能を実現する事ができる。
一般のn 次代数体でも、最高次の係数が1のn 次既約多項式f(x) についてf(x)=0の根をαとして、O_K の要素を{1,α,α^2,...,α^(n-1)}の整数係数の線形結合として表しておく。これにより、O_K の要素同士の積は、f(α)=0によりα^n をαのn 次より小さい冪の線形結合で置き換える事で、「n 個の整数の組」の間の演算として表現できる事が分かる。
任意のn 次代数体K と、その中の代数的整数の集合O_K に対し、下記(a),(b)を満たす(「(γの)ノルム」と呼ばれる)関数N(γ)が存在する事が知られている。
(a) K の任意の要素に対して、(1),(2)が成り立つ。
(1) K の任意の要素γに対し、N(γ)は有理数となる。
(2) K の任意の2要素γ1,γ2に対し、N(γ1×γ2)=N(γ1)×N(γ2)
(b) O_K の任意の要素βに対しては、(a)に加えて、次の(1),(2)も成り立つ。
(1) N(β)は整数となる。
(2) βの逆数δは、あるO_K の要素εによりδ = (ε / N(β)) と表される。
例えば、ガウス整数a+biに対してはN(a+bi)=a^2+b^2、アイゼンシュタイン整数a+bωに対しては、N(a+bω)=a^2-ab+b^2である。
よって、一般のn 次代数体K についても、その中の代数的整数全体O_K に対して素因数分解の一意性が成立すれば、O_K の要素(ないし、その組)を個別識別子として積によるリダクションで集団識別子を求めて、図4の演算機能を実現する事ができる。ここで、ノルムの性質(b)-(2)により「個別識別子が集団識別子を割り切る」事を判定する。素因数分解の一意性により、個別識別子に含まれる素因数の性質を第5,第6の実施形態と同様に選べば、「割り切れる」事によって、「その個別識別子が集団識別子を計算する過程で使われた」事が保証される。
ただし、一般のn 次代数体K の中の代数的整数O_K について素因数分解の一意性は成立するとは限らない。また、O_K の中では、商と余りを生成する除法を定義して、その除法の余りが0 である事によって割り切れるか否かを判定できるとは限らない。
しかし、代数的整数O_K について素因数分解の一意性が成立するための必要十分条件は、よく知られている。「素因数分解の一意性」が成立する任意のO_K から、第5,第6の実施形態と同様の「素数」についての条件により、個別識別子の集合を定める事ができる。
図39から図41は、第7の実施形態の処理の例を示すフローチャートである。
第5または第6の実施形態において図4の識別子集約機構401のリダクション404を実現するリダクション演算は、図30のステップS3007または図37のステップS3707)で実行されている。これらのリダクション演算では、個別識別子が「普通の整数としての素数か素数ベキ」である。これに対して、本実施形態における個別識別子は、有理数体でない代数体が1つ固定され、その代数体の中での「素元」(代数的整数としての素数)になっている。具体的には、ガウス整数としての素数などが用いられる。これらの関係より、第5の実施形態における「普通の整数の積、商」であるところが、本実施形態における「代数的整数の積、商」になる。これらを踏まえて、本実施形態における図9は、例えば第5の実施形態における図30のステップS3007または第6の実施形態における図37のステップS3707の処理を置き換えるものである。
また、第5または第6の実施形態において図4の識別子分析機構402の「集団識別子から生成因子の個別識別子を復元する処理」は、図31のステップS3107または図38のステップS3807で実行されている。本実施形態における図40は、これらの処理を置き換えるものである。
さらに、本実施形態における図41は、図40の処理を、別の形態で一般化したフローチャートである。
まず、図39のフローチャートの処理の前提として、代数体K の基底が以下の性質を満たす代数的整数αにより、{1,α,α^2,…,α^(n-1)}として与えられている。
f(x)=x^n+a_(n-1)×x^(n-1)+....a_k*x×k+...+a_0
f(α)=0
そして、代数的整数β,γを、αの多項式で次式のように表しておく。
g(x)=b_m^x^m+b_(m-1)*x^(m-1)+....b_1*x+b_0
β=g(α)
h(x)=c_l^x^l+b_(l-1)*x^(l-1)+....c_1*x+c_0
γ=h(α)
以上のようにして定義される代数的整数β,γを用いて、図39のフローチャートが動作する。
まず、代数的整数βの係数ベクトルが作業領域Bに格納される(ステップS3901)。
次に、代数的整数γの係数ベクトルが作業領域Cに格納される(ステップS3902)。
さらに、代数的整数1,2の積の係数ベクトルが演算され、その係数ベクトルが作業領域Dに格納される(ステップS3903)。
以上の図39のフローチャートにより、例えば第5の実施形態における図30のステップS3007または第6の実施形態における図37のステップS3707の処理が置き換えられる。
次に、図40のフローチャートの処理について説明する。
まず、被除数の係数ベクトルが作業領域bに格納される(ステップS4001)。次に、除数の係数ベクトルが作業領域cに格納される(ステップS4002)。
さらに、dの逆数がe/N(c)の形で表される(eはKの代数的整数、N(c)はcのノルム)(ステップS4003)。
次に、e×b の係数ベクトルが作業領域fに格納される(ステップS4004)。
そして、作業領域fのベクトル成分がN(c)の各成分で割り切れるか否かが判定される(ステップS4005)。
以上の図40のフローチャートにより、例えば第5の実施形態における図31のステップS3107または図38のステップS3807の処理が置き換えられる。
次に、図41のフローチャートの処理について説明する。このフローチャートでは、iの値が、ステップS4101で0(ゼロ)にリセットされた後、ステップS4110で+1ずつインクリメントされながら、ステップS4103でmに達したと判断されるまで、0からmまで変化させられる。また、iの1つの値ごとに、jの値が、ステップS4102で0にリセットされた後、ステップS4109で+1ずつインクリメントされながら、ステップS4104でlに達したと判断されるまで、0からlまで変化させられる。
このようにして変化するiとjを用いて、ステップS4105でi+jの値がn以上であると判定されると、ステップS4106で、代数的整数αに対してi+jの値を冪乗とする演算結果α^(i+j)の係数が作業領域dに格納される。
そして、ステップS4107で、α^(i+j)の中のα^nがf(α)=0の関係式でαのn-1次以下の冪の項で置き換えられる。
その後、ステップS4108で、α^(i+j)の項からの係数が乗算結果係数格納用領域Dの各項に加えられる。
以上の処理がiとjがインクリメントされながら繰返し実行される。
コード化された識別子に対する演算を効率的に行うためには、識別子をCPU やノード間演算装置がサポートする、特定の固定長の領域、ないし、それらの領域の組に格納しておく必要がある。「ガウス整数」や「アイゼンシュタイン整数」などの代数的整数の中での「素数」(素元)は、係数の大きさが一定の範囲で比較すると通常の素数より多数ある。従って、本実施形態により、代数的整数を使用すると、同じ大きさの領域を使って分解能k を大きくするような個別識別子の割当てが比較的容易になる。
さらに、「整数用領域を2つ使って2進数での桁数が2倍の整数を表わす」方法と比較すると、「ガウス整数」や「アイゼンシュタイン整数」(のような有理数体上2次元の代数体の中の代数的整数)の集合では、比較的絶対値が小さい数の範囲内で両方の領域が有効に使える。2つの整数領域で桁数が2倍の整数を表す場合、上位桁を表すために使う領域は片方の領域だけでは表せない大きさの整数を使わない限り個別識別子の格納に使用されない。このため、「ガウス整数」や「アイゼンシュタイン整数」を個別識別子とする方が、同じ程度の計算量を前提としたメモリ効率の比較で、桁数2倍の領域で通常の整数を個別識別子とするより有利である。
同様の事が、有理数体上n次元の代数体の中の代数的整数をn個の整数用領域を使って表す方法と、「整数用領域をn 個使って2進数での桁数がn 倍の整数を表わす」方法と比較する場合にも成り立つ。
<第8の実施形態>
次に、第8の実施形態について説明する。
乗法を演算とするリダクションの利用のために図4の識別子のコード化体系403があれば、各識別子の対数を使って乗法を加法に変換する事で、加法をサポートするノード間演算装置を使って実現する事、およびそれによる高速化が可能である。ただし、個別識別子として利用する数の選定に際して、以下のような注意、工夫が必要になる。以下に、その詳細について説明する。
「最も近い整数を選んで因数分解する場合に浮動小数点演算での誤差の累積による誤判定がない事を、事前に検証するか、精度保証付き演算などで保証する。対数を取る際にデータは浮動小数点形式になるので、その後の計算では整数での計算における「等しい」事の判定は、「誤差が事前に定めた値(例えば「machine epsilon」と呼ばれる値)より小さい」事で置き換える必要がある。データを伝送上の都合に従って、そのまま、ないし固定小数点形式(整数形式)に変換して和を取り、その結果を浮動小数点形式に戻したものを指数関数への入力とする事で、対数を取る前の積を復元する、という一連の処理の各過程で誤差が累積する。
浮動小数点形式での演算での桁落ち誤差の影響を小さくするためには、元の(対数を取る前の)数を、「同じ程度の大きさ」にしておく事が有効である。この場合、個別識別子の範囲を「最大値を決めて降順に定める」方針が有利である。
本実施形態も、第5から第7の実施形態と同様に、分解能が正の整数k を上限として制限される場合に適用される。
本実施形態では個別識別子の対数を利用するが、複素数の対数関数を利用する場合の記述は、原理的に共通点が多いとは言え煩雑になるため、以下、個別識別子は通常の正の整数とする。
第5、第6の実施形態で整数の乗法で実現した機能を、本実施形態では加法により実現する。ただし、浮動小数点の加法を使用する場合と整数(固定小数点)の加法を使用する場合の両方がある。
第5の実施形態は第6の実施形態で成分の数が1の場合と見なす事ができる。一方、第6の実施形態は、第5の実施形態をベクトルの複数の成分に対して実施したと見なすことができる。本実施形態では記述を簡略化するため、以下では1つの成分について説明する。
第5,第6の実施形態と同様に、各管理対象(例えば各ノード)に対し個別識別子を割当て、集団識別子を第5,第6の実施形態の場合と同様に「整数の乗法でのリダクション結果」と定義する。ただし、本実施形態は「整数の乗法でのリダクション結果」を、対数を経由する加法でのリダクション操作を使用して求める(「積の対数」が「対数の和」である事に基づく)。
ただし、対数の底の冪である数以外の対数は整数ではないので、浮動小数点形式にする際に誤差が生じ、さらに、対数の浮動小数点数での加法を計算する際にも誤差が生ずる事を考慮すると、識別子の割当て時に工夫を要する。
集団識別子から個別識別子を求める計算手順自体は、「積の対数」が「対数の和」である事を利用する事を除き、第5、第6の実施形態と同様である。個別識別子の対数の計算を個別識別子割当時に行っておき、通知する側のノードが対数値を記憶しておく事により、情報通知時には対数計算を不要にできる。個別識別子の値の対数への変換後、あるいは、対数への変換後さらに定数倍して整数形式にした変換後の値は、「変形個別識別子」と呼んで本来の個別識別子と区別する。同様に「変形個別識別子」に対するリダクション(総和)の結果は、「変形集団識別子」と呼んで本来の集団識別子と区別する。
(a) 浮動小数点の加法を使用する場合
(1) 情報を通知する各ノードで管理対象の個別識別子の対数を取るか、予め記憶しておいた個別識別子の対数をリダクションへの入力として用意する。後者の方法では、送信側ノードで対数を計算する必要がない。情報を集約するノードが管理対象の個別識別子の対数の加法によるリダクション結果を受け取るようにリダクション操作を行う。
(2) 情報を集約するノードは対数の総和から、個別識別子の積を復元する。元データは整数なので、指数関数によって対数から復元した結果に最も近い整数を取る事で、集団識別子を求める。
(3) 集団識別子を割り切る個別識別子を求める。
(b) 整数の加法を使用する場合
(1) 情報を通知する各ノードで管理対象の個別識別子の対数を取る、あるいは予め記憶済の個別識別子の対数をリダクションへの入力として用意する。ここで「用意」とは、浮動小数点形式の個別式識別子の対数を定数倍して整数に変換するあるいは、予め定数倍して整数に変換しておいたデータ入力にする事を意味する。後者の方法では、送信側ノードが浮動小数点演算を行う必要がない。
(2) 情報を集約するノードが「管理対象の個別識別子の対数を定数倍し、整数に変換した数」の加法によるリダクション結果を受け取るようにリダクション操作を行う。ここでは、「ある桁までの固定小数点形式とした後、小数点以下の桁数m に対し2^m を掛けて、「対数の近似値を整数形式で表現する」事を「整数に変換する」と呼んでいる。
(3) 情報を集約するノードは(2) のリダクション結果を浮動小数点形式に戻し、(2) で整数形式への変換で使用した大きさ調整用の定数2^m で割って、大きさも元に戻す。
(4) 情報を集約するノードは、浮動小数点形式に戻した「個別識別子の対数の総和」から、元の個別識別子の積である集団識別子を復元する。元データは整数なので、指数関数によって復元した結果に最も近い整数を取る事により、集団識別子を求める。
(5) 集団識別子を割り切る個別識別子を求める。
本実施形態のポイントは、対数を取る操作自体、および結果を有限桁数で表現する事に伴う誤差による誤判定を排除する事にある。言い換えれば誤差の大きさを判定結果に及ぼさない程度に小さくする事が、高速な実現の鍵になる。(「多倍長計算」を使用すれば、誤差をいくらでも小さくできるが、メモリ領域の所要量や通知する側のノードを含めてメモリアクセス量が増加するため、固定長領域での演算による実現が、性能上有利である)。
「精度保証付き演算」により誤差の範囲を制限する手法もあるが、より単純な方法は予め定めておく個別識別子の集合に対し、上記(a), (b) の手順で所定の状態にある個別識別子を復元可能な事を実際に計算して確認しておく事である。この計算は、個別識別子の集合を定める際に行えばよい。例えば事前に十分多くの要素を持つ個別識別子の集合を用意しておけば、上記の精度確認計算はシステムが動作する際の性能には悪影響を及ばさない。
動的に管理対象を増やす必要があるシステムにおいても、使用可能な個別識別子のプールから切り出して使う事で、運用時に精度確認計算する事は避けられる。
確認計算は、例えば、分解能k の場合、個別識別子を大きい方からk 個とった積をU(k) として、U(k) を越えない積を与える個別識別子の組合わせ全てについて、(a), (b) の手順での誤差によって誤判定が起こらない事を確認しておけばよい。
ここで、上記の精度確認計算で誤判定となる場合が検出された場合、個別識別子の集合を取り替えるか、その組み合わせでの集団識別子の値を、正しい個別識別子の組と合わせて「例外値リスト」に格納しておき、集団識別子から個別識別子を計算する際に例外値リストを確認する処理を最初に行う事で対応する。
大きさが極端に違う浮動小数点形式の数の加算では、桁落ちにより有効数字が失われやすい事を考慮すると、浮動小数点形式の数の加算を使う場合の本実施形態では、個別識別子の大きさを、可能な範囲内で、なるべく揃える事が望ましい。
また、計算量が比較的大きい除算を行う必要がない数値の大きさで判定できる場合を多くするためには、全ての個別識別子を条件を満たす範囲で、なるべく大きく取る方が有利であるため、例えば「個別識別子になりうる数の中から大きい順に個別識別子を選ぶ」事が有効である。
例えば、用意された領域に格納できる最大の整数をz として、z のk 乗根をz^(1/k)=yとおき、y から降順に、個別識別子とする数(あるいは、個別識別子の候補としてプールしておく数)を取り出す。
一方、「分解能k より多くの個別識別子を区別する場合を多くしたい」場合は、個別識別子をなるべく小さく取る方が有利であるため、例えば「必要な個数の個別識別子を、区間の最大値から出来るだけ離す」事が有効である。
ただし、対数をとる前の整数の候補から小さい順に選ぶと、「誤差を小さくするため大きさを揃える」観点からの条件を満たしにくい。例えば、必要な個別識別子の個数から定まる区間の端点となる数(最小と最大)の桁数の差が浮動小数点ないし定数倍をかけて整数(固定小数点)に変換する際の有効数字の桁数の範囲より小さくなるように選ぶ。
誤差が大きくなる組み合わせを含む数を個別識別子として使用しない事により、例外値リストへの登録数を減らす事も可能である。さらに、受信時の個別識別子の探索処理の高速化の観点からは、例外値リストの大きさ(要素数)は、なるべく小さい方が有利である(例外値リストの大きさが結果的に0 の場合(すなわち、例外値リストが必要なくなる場合)も、論理的にはありうる)。
図42は、上述の理論に基づく、第8の実施形態における送信側ノードにおける識別子集約機構401(図4)の処理の例を示すフローチャートである。このフローチャートにおける処理の基本的な考え方は、前述した図5(第1の実施形態)、図17(第2の実施形態)、図30(第5の実施形態)、図37(第6の実施形態)などと同様である。図37は、第5、第6の実施形態に係る図30または図37のフローチャートにおいて、リダクション404の演算が乗法から対数の加法に置き換えられ、かつ第6の実施形態の場合と同様に、個別識別子および集団識別子がベクトル化されたものである。機能ブロックおよびシステム構成は、第1の実施形態における図4および図7を例として説明する。もちろん、図20、図21、図22等のシステム構成が採用されてもよい。図4の識別子集約機構401の処理が開始されると、図7の送信起点ノード701のCPU701−1または中継ノードとして機能する受信・中継ノード702のCPU702−1が実行する。入力ベクトル1または2等の作業領域は、送信起点ノード701のメモリ701−2または受信・中継ノード702のメモリ702−2に記憶される。
なお、本実施例での識別子は整数の順序付けられた集合である。ただし、送信側ノードが保持しているのは必ずしも本来の個別識別子自体ではなく対数あるいは対数と定数倍後の整数への変換を行った変形個別識別子であり、受信側ノードは受信した変形集団識別子から本来の集団識別子を復元して個別識別子を取り出す。ここでは、「順序付けられた集合」を「ベクトル」と呼び、「順序つけられた集合」の要素である整数を成分と呼ぶ。本来の個別識別子と本来の集団識別子の総称が「識別子」であり、変形個別識別子と変形集団識別子の総称が「変形識別子」である。識別子ベクトルあるいは変形識別子間の演算は、対応する位置の成分間の演算で定める。
図42において、まず、自ノードが通信の起点ノードであるか否かが判定される(ステップS4201)。
ステップS4201の判定がNOであるならば、受信済みの値を格納する入力ベクトル1に、受信済みの変形集団識別子ベクトルが格納される(ステップS4202)。
ステップS4201の判定がYESならば、受信済みの値は無いため、入力ベクトル1の全成分に、対数加法演算の単位元の値0が格納される(ステップS4203)。
次に、自ノードが管理する管理対象において通知すべき条件が成立したか否かが判定される(ステップS4204)。
ステップS4204の判定がYESならば、自ノードの状態を格納する入力ベクトル2に、自ノードにおける管理対象(または自ノードそのもの)に対応する変形個別識別子ベクトルが格納される(ステップS4205)。
ステップS4204の判定がNOならば、入力ベクトル2の全成分に、単位元の値0が格納される(ステップS4206)。
その後、入力ベクトル1,2の全成分の間で、リダクション404に使用する対数加法演算が実行される(ステップS4207)。
最後に、ステップS4207での演算結果が、次の転送先への送信内容である変形集団識別子ベクトルとされて出力される(ステップS4208)。その後、図42のフローチャートで例示される送信側ノードにおける識別子集約機構401の処理が終了する。
図43は、上述の理論に基づく、第8の実施形態における受信側ノードにおける識別子分析機構402(図4)の処理の例を示すフローチャートである。このフローチャートにおける処理の基本的な考え方は、前述した図6(第1の実施形態)、図18(第2の実施形態)、図31(第5の実施形態)、図38(第6の実施形態)などと同様である。図43は、第5、第6の実施形態に係る図31または図38のフローチャートにおいて、リダクション404の演算が乗法から対数の加法に置き換えられ、かつ第6の実施形態の場合と同様に個別識別子および集団識別子がベクトル化されたものである。機能ブロックおよびシステム構成は、第1の実施形態における図4および図7を例として説明する。もちろん、図20、図21、図22等のシステム構成が採用されてもよい。図4の識別子分析機構402の処理が開始されると、受信側ノードとして機能する図7の受信・中継ノード702のCPU702−1が実行する。また、作業領域ベクトルWやX等は、受信・中継ノード702のメモリ702−2に記憶される。
まず、受信された変形集団識別子ベクトルにおいてオーバーフロー(図中「overflow」)が発生しているか否かが判定される(ステップS4301)。ステップS4301の判定がYESならば、受信処理は実質的に何も行われずに、図43で例示される受信側ノードにおける識別子分析機構402の処理が終了する。
次に、ステップS4301の判定がNOならば、変形集団識別子ベクトルが作業領域ベクトルVに格納される(ステップS4302)。
次に、作業領域ベクトルVの各要素が例外値に含まれるか否かが判定される(ステップS4303)。
ステップS4303の判定がNOならば、作業領域ベクトルVの各要素値ごとに、指数演算が実行され(これを「exp(V)」と表記する)、その演算結果に最も近い整数が、作業領域ベクトルWの対応する要素に格納される(ステップS4304)。
作業領域ベクトルVのいずれかの要素についてステップS4303の判定がYESならば、その要素について例外値での誤差を補正した値が、作業領域ベクトルWの対応する要素に格納される(ステップS4305)。このステップで必要な例外値リストの作成処理について、図44から図46のフローチャートを用いて後述する。
次に、作業領域ベクトルWの全成分値が、リダクション404の対数加法演算領域から乗法演算領域に戻された状態(ステップS4304参照)での単位元の値1となったか否かが判定される(ステップS4306)。
ステップS4306の判定がNOならば、集団識別子ベクトルから個別識別子ベクトルが1つ特定され、その結果が作業領域ベクトルXに格納される(ステップS4307)。
その後、ステップS4307で作業領域ベクトルXに格納された個別識別子ベクトルに対応する管理対象が処理(特定)される(ステップS4308)。
次に、リダクション404に使用した対数変換前の乗法演算の逆演算すなわち除法演算が作業領域ベクトルWと作業領域ベクトルXの各成分に適用され、ステップS4307において作業領域ベクトルWから特定され作業領域ベクトルXに格納された個別識別子が取り外される(ステップS4309)。その後、ステップS4306の処理に戻って、上述のステップS4306からステップS4309までの処理が繰り返し実行される。
ステップS4306の判定がYESになると、図43のフローチャートで例示される受信側ノードにおける識別子分析機構402の処理が終了する。
図44および図45は、図43のステップS4305での補正処理に必要な例外値リストの作成処理の例を示すフローチャートである。
まず、整列済の個別識別子成分リストが作業領域Lに格納される(ステップS4401)。
次に、誤差チェックが必要な個識別子の成分個数の上限値が算出され、作業領域Kに格納される(ステップS4402)。この処理の詳細については、図46のフローチャートを用いて後述する。
次に、作業領域Lの要素からK個を取り出す組み合わせのリストが作成され、作業領域Uに格納される(ステップS4403)。
次に、作業領域Uの先頭位置が作業領域Xに格納される(ステップS4404)。
次に、ステップS4405で作業領域Xが作業領域Uの末端位置と判定されるまで、図45のステップS4413で作業領域Xに作業領域Uの次の位置が順次格納されながら、図44のステップS4406から図45のステップS4412までの処理が実行される。
まず、ステップS4405の判定がNOになると、作業領域U内の作業領域Xが示す現在の位置の個別識別子の組が、作業領域Tに格納される(ステップS4406)。
次に、作業領域Tに対応する変形個別識別子の組(要素が対数)が、作業領域Sに格納される(ステップS4407)。
次に、作業領域Tに対応する集団識別子が作業領域tに格納される(ステップS4408)。
次に、作業領域Sの順序を変えた和のうち最小値を取った値min(Σ(S))に対し、指数関数で変換が実行されることにより、対数の効果がキャンセルされ、その演算結果が作業領域sに格納される(図45のステップS4409)。
ステップS4409の演算結果がオーバーフローしたか否かが判定される(ステップS4410)。
ステップS4410の判定がYESならば、S4413へ移行する。
ステップS4410の判定がNOならば、作業領域sの値に最も近い整数は作業領域tの値か否かが判定される(ステップS4411)。
ステップS4411の判定がYESならば、S4413へ移行する。
ステップS4411の判定がNOならば、作業領域sの値と作業領域T の値の対が、例外値リストに登録される(ステップS4412)。
その後、作業領域U内の次の位置が作業領域Xに格納され(ステップS4413)、ステップS4405に戻る。
以上のステップS4405からステップS4413までの繰返し処理の結果、ステップS4405の判定がYESになったら、例外値リストの作成処理が終了する。
図46は、図44のステップS4402の、誤差チェックが必要な個識別子の成分個数の上限値を算出して作業領域Kに格納する処理の詳細例を示すフローチャートである。
まず、整列済の個別識別子成分リストが作業領域Lに格納される(ステップS4601)。ここで、作業領域Lは、最小要素が先頭になるように整列される。
次に、分解能の上限値が作業領域kに格納される(ステップS4602)。
次に、作業領域Lの先頭位置が作業領域Yに格納される(ステップS4603)。
次に、作業領域fに値1が格納される(ステップS4604)。
次に、作業領域Kに、作業領域kの値が初期値として格納される(ステップS4605)。
次に、作業領域Yの位置が作業領域Lの末端位置になったか否かが判定される(ステップS4606)。
ステップS4606の判定がNOならば、作業領域L内の作業領域Yが示す現在位置の要素が作業領域gに格納される(ステップS4607)。
次に、作業領域fの値に作業領域gの値を乗算した結果が作業領域fに格納される(ステップS4608)。
ステップS4608の演算結果がオーバーフローしたか否かが判定される(ステップS4609)。
ステップS4609の判定がYESならば、処理が終了する。
ステップS4609の判定がNOならば、作業領域Kの値が+1インクリメントされる(ステップS4610)。
作業領域L内の次の位置が作業領域Yに格納され(ステップS4611)、ステップS4606の処理に戻る。
以上のステップS4606からステップS4611までの繰返し処理の結果、ステップS4606の判定がYESになると、図46のフローチャートの処理が終了し、作業領域Kに誤差チェックが必要な個識別子の成分個数の上限値が格納され、図44のステップS4402の処理が終了する。
以上説明した第8の実施形態は、ノード間演算機構(Reduction あるいはAtomic Operation 機能)として加法のみ利用できる場合に特に有効である。ノード間演算機構を使わずに、各ノードがCPU 上で演算を行う場合と比較すると、第3の実施形態で説明したように、ノード間演算機構を使う方が、性能的に有利であるからである。
なお、各ノードの個別識別子の対数は、予め計算して各ノードに配布しておく事が可能であるため、指数関数や対数関数の計算、および例外値リストの表を引く操作は、受信側で実行できればよく、送信側ノードでは、そのための演算装置や表を格納するメモリは不要である。
<第9の実施形態>
次に、第9の実施形態について説明する。
上述した第8の実施形態では、集団識別子を求めるリダクションは加法で行い、個別識別子を取り出す際に(対数関数の逆関数である指数関数によって変換した後)除法を使用したが、本実施形態では、加算結果を元に表を引く事で個別識別子を取り出す。
いわば、本実施形態の計算方法は、第8の実施形態で全ての集団識別子を「例外値リスト」に登録した場合に相当する。ただし、本実施形態での個別識別子は、「第5,第6の実施形態での個別識別子」から求めたものである必要はなく、例えば、次の条件(P) かつ(Q) を満たす「加算が定義された集合」の要素であればよい。
(P) 所定の大きさの領域での計算でオーバーフローしない個別識別子の組み合わせによる和は全て異なる
(Q) k 個より多くの個別識別子の和は全て特定の数より大きく、k 個以下の個別識別子の和は全て異なる。
例えば、整数の加算に対して上記性質を持つ集合は、識別子を格納する領域に格納可能な数の上限をa として、次のように選ぶ事ができる。
k = 1 の場合: a/2 以上a 以下の整数全ての集合を個別識別子の集合として使用できる。
k ≧ 2 の場合: a/k 以下の範囲で、以下のように集合S の要素を大きい方から追加する。こうして求めたS の任意の部分集合は個別識別子の集合として使用できる。
(1) 集合S を{[a/k]+1} という1要素の集合とする。ここでの記号[x] は、「ガウスの記号」で、x を越えない最大の整数を意味する。a がm bits 領域とすると、a=2^m-1と表される。[a/k]+1から降順に連続してk 個の整数を選んで和をとってもオーバーフローしない(すなわち、和がa 以下である)事は、容易に確かめられる。
(2) 集合S の最小値をb として、b 未満の正の整数c でS∪{c}が前述の条件(P) かつ(Q) を保つか否かをb-1 から始めて降順に試していく。条件を保つ整数c が見つかれば、S∪{c}を改めてS とおき(2) を繰り返す。必ずしもb-1 以下の正の整数全てを試す必要はなく、事前に定めた大きさ、あるいは事前に定めた個数の個別識別子候補が見つかった時点で処理を終了してもよい。例えば、「k+1 個の和ではオーバーフローする」大きさでの打ち切りや(システムの管理対象の数より十分大きい)必要な数の個別識別子が得られた時点での打ち切りなど。
k≧2の場合、a が「m bit 領域に格納可能な整数」とするとき、分解能が完全な場合は、管理対象数の上限であるm 個より多くの管理対象に使用できるためには、S の要素数がmより大きい事も確認する必要がある。
例えば、分解能の上限k=2として、7bits 領域での{64,63,62,60,57,52,44,35}という集合は8 要素であり、条件を満たす。(上記の手順(1),(2)でa=127)
まず、第1の実施形態の説明で示した図16(b)を見れば、「2要素の和」が全て異なる事が確かめられる。また、3要素以上の和が全て7 bits 領域ではオーバーフローする事は35+44+52=131>127つまり、小さい方からの3要素の和が7 bits 領域ではオーバーフローする事から明らかである。
上記の例で降順に調べている理由は「k 個を越える数の和がオーバーフローする範囲では、k個以下の組み合わせの和を計算するだけでよい」事を利用して、確認の計算量を減らす事を意図している。ただし、個別識別子の集合を用意するのは、システムが運用される時ではなくシステムの設計時点であるため、個別識別子の集合を決定するための計算時間はシステム運用時の性能には影響を及ぼさない。
集団識別子の生成時に使用された個別識別子を調べるための表、あるいはハッシュ関数では、ある集団識別子を生成する個別識別子の中の少なくとも1つを与えれば、改めて表を引く、あるいはハッシュ関数を適用しなおして、残りの個別識別子も順次求める事ができる。例えば、ある集団識別子を生成する個別識別子のうち最大の数を与える表かハッシュ関数を事前に用意しておけば、受信した集団識別子を生成した個別識別子を全て求める事ができる。
図47は、上述の理論に基づく、第9の実施形態における送信側ノードにおける識別子集約機構401(図4)の処理の例を示すフローチャートである。図47は、第1の実施形態に係る図5のフローチャートの場合と同様にして、リダクション404の演算として加法が使用され、かつ個別識別子および集団識別子がベクトル化されたものである。ただし、本実施形態における加法演算は、前述した条件(p)および(q)を満たすものである。機能ブロックおよびシステム構成は、第1の実施形態における図4および図7を例として説明する。もちろん、図20、図21、図22等のシステム構成が採用されてもよい。図4の識別子集約機構401の処理が開始されると、図7の送信起点ノード701のCPU701−1または中継ノードとして機能する受信・中継ノード702のCPU702−1が実行する。入力ベクトル1または2等の作業領域は、送信起点ノード701のメモリ701−2または受信・中継ノード702のメモリ702−2に記憶される。
本実施例での識別子は整数の順序付けられた集合である。ここでは、「順序付けられた集合」を「ベクトル」と呼び、「順序つけられた集合」の要素である整数を成分と呼ぶ。識別子ベクトル間の演算は、対応する位置の成分間の演算で定める。
図47において、まず、自ノードが通信の起点ノードであるか否かが判定される(ステップS4701)。
ステップS3401の判定がNOであるならば、受信済みの値を格納する入力ベクトル1に、受信済みの集団識別子ベクトルが格納される(ステップS4702)。
ステップS4701の判定がYESならば、受信済みの値は無いため、入力ベクトル1の全成分に、加法演算の単位元の値0が格納される(ステップS4703)。
次に、自ノードが管理する管理対象において通知すべき条件が成立したか否かが判定される(ステップS4704)。
ステップS4704の判定がYESならば、自ノードの状態を格納する入力ベクトル2に、自ノードにおける管理対象(または自ノードそのもの)に対応する個別識別子ベクトルが格納される(ステップS4705)。
ステップS4704の判定がNOならば、入力ベクトル2の全成分に、単位元の値0が格納される(ステップS4706)。
その後、入力ベクトル1,2の全成分の間で、リダクション404に使用する加法演算が実行される(ステップS4707)。
最後に、ステップS4707での演算結果が、次の転送先への送信内容である集団識別子ベクトルとされて出力される(ステップS4708)。その後、図47のフローチャートで例示される送信側ノードにおける識別子集約機構401の処理が終了する。
図48は、上述の理論に基づく、第9の実施形態における受信側ノードにおける識別子分析機構402(図4)の処理の例を示すフローチャートである。このフローチャートにおける処理の基本的な考え方は、受信側ノードは集団識別子をキーとする個別識別子(成分)構成表を引いて、個別識別子(成分)を取り出すという点である。個別識別子および集団識別子は前述したようにベクトル化されている。機能ブロックおよびシステム構成は、第1の実施形態における図4および図7を例として説明する。もちろん、図20、図21、図22等のシステム構成が採用されてもよい。図4の識別子分析機構402の処理が開始されると、受信側ノードとして機能する図7の受信・中継ノード702のCPU702−1が実行する。また、作業領域ベクトルWやX等は、受信・中継ノード702のメモリ702−2に記憶される。
まず、ノード間のリダクション404における集団識別子ベクトルが受信される(ステップS4801)。
次に、集団識別子ベクトルにおいてオーバーフロー(図中「overflow」)が発生しているか否かが判定される(ステップS4802)。ステップS4802の判定がYESならば、受信処理は実質的に何も行われずに、図48で例示される受信側ノードにおける識別子分析機構402の処理が終了する。
次に、ステップS4802の判定がNOならば、集団識別子ベクトルが作業領域ベクトルWに格納される(ステップS4803)。
そして、作業領域ベクトルWの各成分について、図16(b)に例示されるような、集団識別子と生成因子である個別識別子のビットマップとの対照表を引いて、個別識別子が特定される(ステップS4804)。この対照表は、例えば受信・中継ノード702のメモリ702−2に保持されている。
その後、図48のフローチャートで例示される受信側ノードにおける識別子分析機構402の処理が終了する。
図49および図50は、第9の実施形態において、加法のリダクションで集団識別子の成分を求めた場合の、受信側ノードで使用する個別識別子成分の対応リストの作成処理の例を示すフローチャートである。この処理は、図7の受信・中継ノード702以外の計算機によって実行されてよい。
まず、整列済の個別識別子成分リストが、作業領域Lに格納される(ステップS4901)。
次に、各成分での誤差チェックが必要な個識別子の成分個数の上限値が算出され、作業領域Kに格納される(ステップS4902)。この処理の詳細については、図51のフローチャートを用いて後述する。
次に、作業領域Lの要素からK個を取り出す組み合わせとそのK個の要素の総和の対のリストが、作業領域Uに格納される(ステップS4903)。
次に、作業領域Uが、その要素の和について先頭を最小にするように整列される(ステップS4904)。
次に、作業領域Uの先頭位置が、作業領域Xに格納される。
図50のフローチャートに移り、作業領域Xが示す位置が作業領域Uの末端位置であるか否かが判定される(ステップS4906)。
ステップS4906の判定がNOならば、作業領域Xの値が作業領域Zに格納される。
次に、作業領域U内の次の位置が、作業領域Xに格納される(ステップS4908)。
次に、作業領域Xの値が示す位置の要素の和が算出され、作業領域S(X)に格納される(ステップS4909)。
次に、作業領域Zの値が示す位置の要素の和が算出され、作業領域S(Z)に格納される(ステップS4910)。
作業領域S(X)と作業領域S(Z)の値が等しいか否かが判定される(ステップS4911)。
ステップS4911の判定がYESならば、作業領域Xの値が示す作業領域Uの値U(X)と作業領域Zの値が示す作業領域Uの値U(Z)の2組が相互に識別不可能と判明した場合に対して、予め定められている処理が実行される(ステップS4912)。例えば、対照となる値の対照表への登録が禁止される。
ステップS4911の判定がNOならば、ステップS4912の処理はスキップされる。
その後、ステップS4906の処理に戻り、作業領域Xの値が示す次の位置に対する処理が続行される。
作業領域Xが示す位置が作業領域Uの末端位置に到達した結果ステップS4906の判定がYESになると、図49および図50のフローチャートの処理を終了して、対照表の作成を終了する。
図51は、図49のステップS4902の、各成分での誤差チェックが必要な個識別子の成分個数の上限値を算出して作業領域Kに格納する処理の詳細例を示すフローチャートである。このフローチャートは、第8の実施形態において対数の加法による乗算を利用する場合の例外値リストの作成処理において前述した図46のフローチャートの処理と、ほとんどの処理が同じである。すなわち、ステップS46・・・で始まる処理は、図46の場合と同じ処理である。図51が図46と異なるのは、図46のステップS4608に対応する図51のステップS5101で、作業領域fの値と作業領域gの値とを、乗算ではなく加算して、新たな作業領域fの値を算出する点である。これは、第9の実施形態におけるリダクション404の演算が乗算ではなく加算であるからである。その他の上限値算出のアルゴリズムは図46の場合と同じである。
上述した図49から図51のフローチャートをベースとして、前述した図16(b)の対照表を作成する具体的な手順について、以下に説明する。
<処理フロー>
初期集合を、
S={64}
とする。
64+63=127
なのでオーバーフローしない。ゆえに、
S={64,63}
としてもよい。
ここで、Sの最小値63を取る。
64+63,64+62,63+62はすべて異なるので、
(P) 所定の大きさの領域での計算でオーバーフローしない個別識別子の組み合わせによる和は全て異なる
(Q) k 個より多くの個別識別子の和は全て特定の数より大きく、k 個以下の個別識別子の和は全て異なる。
という条件が満たされる。このため、62を追加可能である。ゆえに、
S={64,63,62}
としてもよい。ただし、
S={64,63,62,61}とはできない。なぜならば、
64+61=63+62
であるからである。よって、61がスキップされる。
S={64,63,62,60}
としてもよい事は、以下のように確認できる。
前の3要素のなす部分集合に2つとも入っている場合は、確認済である。最小の和は下から2つの和、
63+62=125
である。少なくとも1つはみ出す場合、一方の要素は60である。最大の要素64との和が 124なので、前の3つの中からどれを選んで和をとっても、前の3つから2つとったものの和より小さいので、一致しない。また、前のものとの和は全部異なる。
一般に前の要素との差が1以上なので、
S={64,63,62,60,59}
とできない事は、
63+59=62+60
から明らかである。よって、59がスキップされる。
S={64,63,62,60,58}
とできない事は、
64+58=62+60
から明らかである。よって、58もスキップされる。
S={64,63,62,60,57}
とできる事は、前の4要素のなす部分集合に2つとも入っている場合は、確認済である。少なくとも1つはみ出す場合、一方の要素は57である。最大の要素64との和が121なので、前の3つの中からどれを選んで和をとっても、前の3つから2つとったものの和より小さいので、一致しない。また、前のものとの和は全部異なる。
以下、同様の処理が実行されることにより、図16(b)の対照表ができあがる。
以上説明した第9の実施形態は、ノード間演算機構(Reduction あるいはAtomic Operation 機能)として加法のみ利用できる場合に特に有効である。ノード間演算機構を使わずに、各ノードがCPU 上で演算を行う場合と比較すると、第3の実施形態で説明したように、ノード間演算機構を利用する方が、性能的に有利であるためである。
<第10の実施形態>
次に、第10の実施形態について説明する。
第5から第8の実施形態では、送信側ノードから受信側ノードに送るデータは「分解能が上限k を持つ」という条件により、第2から第4の実施形態に比べて、小さい領域で多数の管理対象の情報を受信できる。分解能が完全である第2から第4の実施形態の方法では、管理対象と同数のbit 数が必要となる。
しかし、第5から第8の実施形態では、集団識別子から個別識別子を求める際に別途識別子の表を参照する必要があるため、何らかの方法でとりうる個別識別子の範囲を限定しないと、識別すべき管理対象と対応しない個別識別子の領域を含め、識別子の表のメモリ領域へのアクセスが増える。
本実施形態では、識別子の集合を複数のグループに分けておき、各ノードは管理対象の識別子が所属するグループを別のリダクションで管理対象自体の識別子とは別に通知する。ここまでの基本的な考え方は第4の実施形態と同様であり、グループを上位の(仮想的な)管理対象として、各グループ(管理用の、仮想的な)の個別識別子を別途設定する。本実施形態ではさらに、以下の処理を実行する。
グループの識別に際して、同一グループに属する管理対象には「同じ領域の同じ位置のビットがon である個別識別子」を割当てれば、bitwise or 演算により「グループ内の少なくともどれか1つの管理対象が監視している状態にある」事を、リダクションにより通知できる。すなわち、複数の管理対象の状態のlogical or を通知できる。
bitwise and (ビット単位の論理積演算)ないし乗法を使用する場合、「not ( A and B) ←→ (not A) or (not B)」というド・モルガンの法則を利用すればよい。すなわち、条件が成立する管理対象に対して0 を入力とし、そうでない場合は1 を入力としてbitwise and ないし乗法を行った結果をbit 反転すればよい。
加法を使用する場合は、単に「グループ用の集団識別子の格納領域」を別に持てばよい。(個別識別子が全て正なら足し算するだけで値が入ったか(変化したか)どうかが分かり、初期値0 として結果が0 でない値になるかオーバーフローした場合、少なくとも1つの入力が0 でない事が分かるので、「グループ用の個別識別子」を個々の管理対象の識別子と別に定める必要もない。「グループ用の個別識別子」は「グループ用の集団識別子の格納領域」を見るためのものであり、上記の場合、「グループ用の個別識別子」を与えなくても「グループ用の集団識別子の格納領域」は演算可能である。
グループの集団識別子の計算では管理対象数が小さくなるため、全ての管理対象の識別子を順次試すより、平均的な参照範囲を減らす事ができる。
グループの集団識別子としては、第2,第3の実施形態のものを使用する方法(第4の実施形態と全く同様)でもよく、第5から第9の実施形態を適用してもよい。なお、第2、第3の実施形態に対するグループの識別子についても、第5から第8の実施形態の方法を適用することは可能である。
図52は、本実施形態において、bitwise or 演算で階層的にグループ化された識別子の送信処理の例を示すフローチャートである。
まず、各グループ階層の個別識別子からbitwise or 演算でのリダクションでグループの集団識別子が求められる(ステップS5201)。
次に、最下層での(本来の管理対象の)個別識別子について乗法によるリダクションの集団識別子が求められる(ステップS5202)。
そして、両方の集団識別子が、次の転送先に送信される(ステップS5203)。
図53は、本実施形態において、bitwise or 演算で階層的にグループ化された識別子の受信処理の例を示すフローチャートである。
まず、各グループ階層の集団識別子から深さ優先探索により最下層の乗法を演算とする個別識別子成分のリストが特定される(ステップS5301)。深さ優先探索を伴う受信処理の具体的なアルゴリズム例は、第4の実施形態において図28のフローチャートを用いて前述した。
そして、特定された個別識別子成分のリストに基いて、乗法でのリダクションの集団識別子から個別識別子(の成分)が特定される(ステップS5302)。
図54は、本実施形態において、乗法演算で階層的にグループ化された識別子の送信処理の例を示すフローチャートである。
まず、各グループ階層の個別識別子からグループの集団識別子が求められる(ステップS5401)。
そして、各階層の集団識別子が、次の転送先に送信される(ステップS5402)。
図55は、本実施形態において、乗法演算で階層的にグループ化された識別子の受信処理の例を示すフローチャートである。
まず、現在処理する階層を示す作業領域gに値1が格納される(ステップS5501)。
次に、作業領域gが示す階層の集団識別子(成分)が、作業領域W(g)に格納される(ステップS5502)。
次に、作業領域gが示す階層の値が、グループ階層数よりも大きくなったか否かが判定される(ステップS5503)。
ステップS5503の判定がNOならば、作業領域W(g)が1(乗法演算の単位元)でないか否かが判定される(ステップS5504)。
ステップS5504の判定がYES(W(g)が値1でない)ならば、作業領域W(g)内の個別識別子成分の1つが、作業領域qに格納される(ステップS5505)。
次に、作業領域gが示す階層の値がグループ階層数に等しいか否か、すなわち最下層であるか否かが判定される(ステップS5506)。
ステップS5506の判定がYESならば、最下層識別子に固有の処理、すなわち、最下層から取り出されている個別識別子より管理対象を抽出する処理が実行される(ステップS5507)。
ステップS5506の判定がNOば、ステップS5507の処理はスキップされる。
その後、作業領域W(g)を作業領域qで除算した結果が、新たに作業領域W(g)に格納される(ステップS5508)。
最後に、作業領域gの値が+1インクリメントされる(ステップS5509)。その後、ステップS5502の処理に戻り、次の階層に対する受信処理が実行される。
作業領域gが示す階層の値がグループ階層数よりも大きくなった結果ステップS5503の判定がYESになると、受信処理が終了する。
以上説明した第10の実施形態によれば、任意の分解能k に対して、個別識別子の探索範囲を限定してメモリアクセスに伴う処理時間を短縮することが可能となる。
<第11の実施形態>
次に、第11の実施形態について説明する。
集団識別子から個別識別子を特定する過程で表を引く場合、ないし個別識別子から管理対象を特定する処理で表を検索する場合に、検索処理の高速化が課題となる。
特に、「分解能が上限k で制限される場合」でかつ演算を乗法とする際の基本的アイデアは、「素因数分解の一意性」を利用して、乗法でのリダクションで計算された集団識別子から、個別識別子を取り出す事である。従って、「素因数分解」の所要時間がシステムの処理性能の高速化に際して重要な因子となる。
「素因数分解の一意性」が成立する集合として、通常の意味の整数ではなく「代数的整数」を使用する事で、係数が同じ大きさの範囲内で個別識別子として使用できる数を増やして、同じ分解能k を実現するために必要なメモリ使用量を削減する。ここで、普通の整数以外の集合(例えば「代数的整数」の集合)での「素数(に相当する要素)」は、関連する数学の文献において「素元」と呼ばれ、それらの集合での「素因数分解」は「素元分解」と呼ばれる事が多いが、本出願では「ある集合における「素数」」という呼び方を主に使用している。学術的な厳密性よりも分かりやすさを重視したためである。
本実施形態では、brute force method(因数となりうる数で順次割っていく事による因数分解の方法)を使う場合に、現れる素因数の範囲を別途通知する方法や整数での除算での余りの計算を利用して、「因数となりうる数」の集合を小さくして、その集合の要素を含む表を引くためのメモリアクセスに伴う処理時間を削減する。なお、brute force method では、因数となりうる数の表を引く過程で、管理対象の番号も合わせて求める事ができる。管理対象の番号自体を表の「主キー」にするか、表の各エントリに管理対象の番号を含めておく。また、割り算による余りをハッシュ値として、ハッシュ値毎に「因数となりうる数」の表を分割する事で、引くべき表の大きさを小さくすることができる。個別識別子の集合から規定される「集団識別子内の素因数の数の上限」の範囲内で、「集団識別子の除算での余り」に基いて、「個別識別子の余りの組み合わせ」を限定する事で、個別識別子を求めるために引くべき表を限定することができる。さらに、複数の数での割り算による余りの組み合わせにより、「因数となりうる数」の表を細分する事により、引くべき表の大きさを、さらに小さくすることができる。割り算の余りによる条件は、除数を互いに素にする事で「独立な条件」となるので、「互いに素な複数の除数による余りの組み合わせ」毎の表を作る事で細分できる。
以下に説明する本実施形態では、識別子から管理対象の番号を求める操作において、割り算による余りをハッシュ値とし、ハッシュ値毎に「因数となりうる数」の表を分割する事で、引くべき表の大きさを小さくする。すなわち、本実施形態では、「ハッシュ関数」を利用する事で、検索処理に際して参照が必要なメモリ領域の量を限定する。リダクション演算に乗法を使用し、集団子識別子の生成因子を「素因数分解」で求める場合は、使用する個別識別子全体の集合が「予め分かっている素因数の候補」なので、個別識別子全体の集合の個数をN として、O(N) 以下である。N が数万から数十万程度でも、システムによっては「許容範囲内」にできる。除算の剰余を利用したハッシュ関数で、O(N) のままでも、「定数係数」を小さくする事で「許容範囲内」にできる場合がある。
個別識別子から管理対象の番号を求める際に「個別識別子に使われる素数の表」を引く場合、大きさ順に表を整列して(線形探索(Linear Search)でなく2分探索(binary search)を使用して)表の大きさNに対しての探索時間をlog_2(N) 程度に抑えられる。
さらに、逆引きできる表や計算式(ハッシュ関数)、ないし、それらの組み合わせにより、探索範囲を狭める事もできる。以下では、本実施形態で利用可能なハッシュ関数の例を挙げておく。
例えば、ハッシュ関数として個別識別子領域の下位4 bits ないし下位8 bitsの値を使い、予め個別識別子に使う素数を下位4 bits あるいは8 bits 毎に別の表にしておく事ができる。
各ハッシュ値(下位4 bits ないし8 bits の値)毎の表の大きさが平均化されるように個別識別子に使う素数の集合を選んでおけば、探索すべき表の大きさを1/15 、ないし1/255 程度に小さくできる。
第5,第6の実施形態で、k=2として、32 bit 領域を使用する場合に、個別識別子を2^16-1より小さく2^(32/3) より大きい素数(例えば、1627以上の素数)を個別識別子とすると、3個以上の個別識別子の積はオーバーフローするので、集団識別子の数が2個以下であるとしてよい。
また、1627^2>2^16-1なので、集団識別子の大きさによって、2個の個別識別子が含まれる場合と、1個の個別識別子しか含まない場合を区別できる。
1個の個別識別子しか含まないと判れば、k=1の場合と同様な手法により探索範囲を減らす事ができる。
2個の個別識別子を含む場合、集団識別子の平方根r を計算する。個別識別子の一方はr より大きく他方はr より小さいので、どちらかの一方の範囲で探索すればよい。
さらに、個別識別子の大きさを出来るだけ揃えておくと、含まれる個別識別子は集団識別子の平方根に近くなるので、最初に割り切れるか試す素数は「平方根になるべく近い素数」として、大きさで昇順、ないし降順に試していく方法が有効になる。
任意の分解能k とm bits 領域の組み合わせについて、2^(m/k) を下限とする範囲の素数を個別識別子に使い、少なくとも1つの個別識別子が集団識別子のk 乗根より大きいあるいは小さい事を利用して探索範囲を限定できる。個別識別子の大きさを揃えておく事の効果も、k=2の場合と同様である。
また、奇数の素数だけを個別識別子とし、さらに下位2 bits を参照して4 で割った余りが1 の素数と3 の素数について個別に表を作成しておく事で個別識別子の表の探索範囲を限定する事が、次のようにして可能である。
集団識別子を4 で割った余りが3 の場合、一方の素数を4 で割った余りが3,他方を4 で割った余りが1 なので、素数の表を「4 で割った余り」を基準に2つ分けておけば、どちらの表にも必ず個別識別子が含まれるので、片方の表の範囲内を最初に探索する事で探索範囲が半分程度になる。集団識別子を4 で割った余りが1 の場合は、片方の表の範囲内を最初に探索する方法では、その表に個別識別子が含まれない場合の探索時間が大きくなるので、最初から全個別識別子候補を含む表を探索する方が、探索時間が平均化される。
なお、個別識別子を4 で割った余りがどちらかを、各ノードがlogical or のリダクションを並行して通知しておけば、2つの個別識別子を4 で割った余りが一致している場合も余りがどちらかが判定できるので、探索範囲が半分程度になる。これは、第4の実施形態で説明した方法の一例である)。
2の冪以外で割った余りによって、個別識別子を分けておく事もできる。例えば、3で割った余り、5で割った余り、7で割った余りなどで分けておく。個別識別子の素因数となる素数の分布は、例えば各余りについて均等にする、あるいは、逆に特定の余りになる素数だけを個別識別子の素因数にするなどの条件を、個別識別子の探索手順に合わせて付加しておく事ができる。
例えば3で割った余りは1 または2 で、2つの数の積の余りが1 の場合は元の2つの余りが等しい事が分かるだけだが、2 の場合は、少なくとも一方の余りが1で他方が2と分かるので、どちらか一方を検索すれば、必ず素因数が見つかる事になる。従って、探索範囲が半分程度になる。
2つの数を4で割った余りによるハッシュ値と3で割った余りによるハッシュ値のどちらも同じになる確率は(各々の余りを持つ個別識別子の割合を均等にすれば)1/4 程度となり、3で割った余りによるハッシュ関数と併用すれば、3/4 程度の割合で探索時間が半分程度になる。他の数の余りによるハッシュ値も併用すれば、さらに大きな割合で探索時間を減らすことも出来る。
一般に演算器による計算の命令あたり(時間の観点での)コストはメモリ参照コストに比べて数桁小さいため、演算器による計算が必要な処理を追加して、メモリ参照コストを減らす事で高速になる場合がしばしばある。除算は、演算器を使用する処理の中では比較的コストが高いが、例えば3, 5, 7 での除算に対しては、第4の実施形態で引用した文献[6]などで開示されている比較的高速なアルゴリズムが知られている。このため、除算(ないし余りを求める)処理の時間は、探索範囲を減らす効果に較べて、十分小さいと期待できる。
他の数の除算での余りについても、同様に試行済の除算での余りについての条件から探索範囲を狭められる場合がある。すなわち、個別識別子の集合をQ={q_1,q_2,...,q_i}としてQ-{q_1}={q_2,...,q_i}の各要素をq_1 で割った余りで分類し、Q_1,Q_2,...,Q_jとしておくと、q_1 での集団識別子の除算の余りについての条件からQ_1,Q_2,...,Q_jの中で、集団識別子の生成因子を含まないものを特定できる場合がある。
さらに、個別識別子の集合を、ハッシュ関数による探索範囲の削減効果が大きくなるように、事前に調整する事が可能である。あるハッシュ関数の値で「衝突」が起こって探索が必要になる個別識別子の表から「衝突」の多い方から順に個別識別子の候補を、実際に使用する個別識別子の表から除外していけば、「衝突」の減少により、平均探索範囲は減少する。
図56は、本実施形態における個別識別子リストの探索処理の例を示すフローチャートであり、ハッシュ値で個別識別子表を限定して検索する一般的な処理の例を示す。
まず、個別識別子のハッシュ値が、作業領域hに格納される(ステップS5601)。
次に、作業領域hが示すハッシュ値に対応する個別識別子の表が、作業領域Lに格納される(ステップS5602)。
そして、個別識別子あ作業領域L内で検索され、管理対象の番号が求められる(ステップS5603)。
図57は、本実施形態における個別識別子リストの探索処理の例を示すフローチャートであり、集団識別子のハッシュ値で個別識別子のハッシュ値の範囲を限定して個別識別子の表を限定する処理の例を示す。
まず、集団識別子のハッシュ値が作業領域Hに格納される(ステップS5701)。
次に、作業領域Hにより定まる個別識別子表の候補リストが、作業領域Gに格納される(ステップS5702)。
次に、作業領域Gから先頭の個別識別子表が取り出され、作業領域Xに格納される(ステップS5703)。
次に、作業領域X内で集団識別子に含まれる個別識別子が探索される(ステップS5704)。
個別識別子が見つかったか否かが判定される(ステップS5705)。
ステップS5705の判定がNOならば、探索処理が終了する。
ステップS5705の判定がYESならば、作業領域Gの内容が空か否かが判定される(ステップS5706)。
ステップS5706の判定がNOならば、探索処理が終了する。
ステップS5706の判定がYESならば、作業領域Gから次の個別識別子リストが取り出され(ステップS5707)、ステップS5704に戻って次の探索が続行される。
図58は、本実施形態における個別識別子リストの探索処理の例を示すフローチャートであり、集団識別子のハッシュ値による個別識別子表候補リストの作成処理の例を示す。
まず、個別識別子表を定めるインデックスの組のリストJが、空リストで初期化される(ステップS5801)。
次に、除数リストが、作業領域Qに格納される(ステップS5802)。
次に、集団識別子のハッシュ値リストが、作業領域Hに格納される(ステップS5803)。
次に、作業領域Qまたは作業領域Hが、空であるか否かが判定される(ステップS5804)。
ステップS5804の判定がNOならば、作業領域Q、Hから除数とハッシュ値の対が取り出され、作業領域の対(q,h)に格納される(ステップS5805)。
次に、qを法として、積の剰余がhの場合に、因子となりうる数のqに関する剰余の対のリストが、作業領域X(q,h)に格納される(ステップS5806)。
最後に、全ての組合わせでJの各要素の末尾に、作業領域X(q,h)の各要素が追加されたリストが、改めてJとされる(ステップS5807)。
その後、ステップS5804に戻って、処理が続行される。
最後に、ステップS5804の判定がYESになると、処理が終了する。
図59は、第11の実施形態における個別識別子リストの探索処理の例を示すフローチャートであり、識別子のハッシュ値リストとして複数の除数による剰余の組を使用する例を示す。
まず、除数リストが、作業領域Qに格納される(ステップS5901)。
次に、作業領域Qが空か否かが判定される(ステップS5902)。
ステップS5902の判定がNOならば、作業領域Qから除数qが取り出され、識別子のqに関する剰余rが求められ、そのrがハッシュ値リストに追加される(ステップS5903)。
その後、ステップS5902に戻って、処理が続行される。
最後に、ステップS5902の判定がYESになると、処理が終了する。
探索処理の具体例を以下に示す。
k=2 に固定し、使用する素数は5より大きい奇数とし、ハッシュ値を 「4 で割った余り」、「3 で割った余り」とします。適当な素数の集合を決めて、「4で割った余り」と「3で割った余り」の組み合わせで、4等分されるようにしておく。そうすると、2つの素数の積=集団識別子の余りについては、以下のようになる。
(積の余り)
積を4で割った余りが 3 なら、一方の素数は4で割って余り1,
他方の素数は4で割って余り3
積を4で割った余りが 1 なら、どちらの素数も4で割った余りが同じ。
積を3で割った余りが2なら、一方の素数は3で割って余り1,
他方の素数は3で割って余り2
積を3で割った余りが 1 なら、どちらの素数も3で割った余りが同じ。
上記の積を3で割った場合、4で割った場合の余りの組み合わせ条件で分類した表に分けておけば、表の検索時間が 1/4 になる。
図58のフローチャートの処理では、Q={3,4}(除数)、H={5,7,11,13,17}(素数)とすると、左が3で割った余り、右が4で割った余りを示すものとして、以下の出力を得る処理となる。
(出力)
5 -> (2,1)
7 -> (1,3)
11 -> (2,3)
13 -> (1,1)
17 -> (2,1)
図59のフローチャートの処理では、Q={3,4}(除数)から以下4つのグループを作成する処理になる。
1.3で割ると1余り、4で割ると1余る
2.3で割ると2余り、4で割ると1余る
3.3で割ると1余り、4で割ると3余る
4.3で割ると2余り、4で割ると3余る
素数5と11を掛け合わせた数55(=5×11)は、3で割ると1余り、4で割ると3余る数であり、上記の3のグループに属する事になる。
以上説明した第11の実施形態によれば、第10の実施形態の場合と同様に、個別識別子の探索範囲を限定することが可能となる。
また、必要に応じて第10の実施形態と併用する場合を含め、第10の実施形態での「グループ(管理用/仮想的な)個別識別子」のリダクションに必要な通信を不要にするか、減少させる事により、図7の受信・中継ノード702のシステム資源所要量を、第10の実施形態(単独)での場合に比べて、減らすことが可能となる。
本実施形態では通信データ量が増加せず、追加される計算のコストは、メモリアクセスのコスト(ここでは「メモリアクセスに伴う処理遅延」の意味)に比べて小さい範囲内に留まる。このため、特に複数ハッシュ関数の組み合わせを使う事で、メモリアクセスコストが大幅に削減される。
<第12の実施形態>
次に、第12の実施形態について説明する。
第11の実施形態の場合と同様にして、集団識別子から個別識別子を特定する過程で表を引く場合、ないし個別識別子から管理対象を特定する処理で表を検索する場合を考える。第11の実施形態で言及したハッシュ法の特別な場合として、次のデータの組に対して「回帰分析」あるいは「離散フーリエ変換」を適用して求めた近似式を利用することが可能である。
{個別識別子の集合}と{管理対象の番号の集合}
{集団識別子の集合}と{個別識別子の集合}
本実施形態では、「回帰分析」や「離散フーリエ変換」を利用して、識別子に関する検索処理での探索範囲を狭め、これによりメモリアクセス量を制限し高速化する。本実施形態も「ハッシュ関数」を使う方法の一種と考える事ができるが、第11の実施形態の中で言及したハッシュ関数とは性質が大きく異なる。浮動小数点による計算を使用する点でも、整数演算による第11の実施形態と異なる。
第10の実施形態はリダクション404(図4)の際に使用する演算を乗法に限定したが、本実施形態はリダクション404に使用する演算が加法の場合も対象とする。本実施形態は、以下の探索範囲に適用することができる。
個別識別子(の成分)から管理対象の番号を求める際の探索範囲。目的変数(従属変数)の管理対象番号と説明変数(独立変数)の個別識別子の間の対応は1対1対応であり、原理上は「完全ハッシュ関数」もありうる。
集団識別子(の成分)から個別識別子(の成分)の探索範囲。集団識別子と個別識別子の対応は1対1でないため、例えば個別識別子間の順序関係により最小、最大その他の「代表の一つ」を決める事にすれば、その個別識別子に対して、集団識別子の関数として回帰分析を適用できる。個別識別子(の成分)間の順序関係は、例えば以下のような関係で定められる。数としての大小関係である。成分毎の大小関係と数成分間の辞書式順序による全体での大小関係である。および、代数的整数の「ノルム」、係数の間の大小関係と各係数に対応する(ベクトル空間としての「基底」に対する)辞書式順序による大小関係である。一般に1対1対応でない場合(逆関数が存在しない場合)一変数の一次式での回帰分析だけでは、有効な近似式は得られないため、非線形回帰分析を使用する。例えば、大きさの範囲ごとに複数の区間に分けると、各区間では1対1対応になり、線形の近似式が有効になる場合がありうる。離散フーリエ変換や、(周期関数や単調増加ではない関数で変換した変数を加えた)重回帰分析(による非線形の回帰分析式)は、1対1対応でない場合にも有効である。
本実施形態の説明に際し、第6の実施形態のように個別識別子が複数の成分を持つ場合を、成分が1つしかない第5の実施形態の場合と同じ計算法で取り扱う事ができる。そのために、個別識別子の成分には(管理対象の番号自体ではなく)管理対象番号を、各次元が対応する成分の集合の要素数に等しい多次元配列に格納し、個別識別子の成分と多次元配列のインデックスを対応させる。第5の実施形態で(1次元の)個別識別子と管理対象番号を対応させる処理と、第6の実施形態での個別識別子の各成分と多次元配列のインデックスの対応を求める処理は同等になる。
以下では、説明を簡単にするため、特に断らない限り、第5の実施形態の(成分数が1)として説明する。上述した同じ計算法になる言及により、こうしても一般性は損なわれない。
まず、個別識別子として使用する数を管理対象の番号と対応させる際、各々の表を大きさ順に整列し、2つの番号n1, n2 と対応する個別識別子p1, p2 に対し、次のどちらかが成立するようにしておく。
(1) n1 < n2 の時には常にp1 < p2
(2) n1 < n2 の時には常にp1 > p2
ここで、管理対象の番号と個別識別子の間で「回帰分析」を実行して、一次近似式を作成する。例えば、個別識別子を得た時に番号を知りたい場合、回帰分析で説明変数を個別識別子とする一次近似式を作る。
一次近似式がn = A*p + B として、この近似式での誤差が最大になる場合の誤差の絶対値をE とすると、個別識別子p が判明した時に対応する番号を得る際の探索範囲は、近似式から得た値に最も近い整数をz とすると区間[z-E-1,z+E+1]の内側に限定される。誤差の符号を考慮して「過小」である場合の最大誤差をE、「過小」である場合の最大誤差をF として探索範囲を区間[z-E-1,z+F+1] の内側に限定される。p の範囲をs 個の区間に区分して、各区間で符号を考慮した最大誤差{(-E1,F1),...(-Ei,Fi),...(-Es,Fs)}を求めれば、第i 区間での番号の探索範囲は[z-Ei-1,z+Fi+1]の内側に限定される。
以下のような手段(組み合わせ含む)により、上記の誤差を小さくする事ができる。
近似式で誤差が大きくなる数を取り除く。番号に抜けが許されない場合は、番号を振りなおして回帰分析をやり直す。
個別識別子をグループに分けて各グループごとに別の一次近似式を使用する(回帰分析の用語で、非線型回帰分析の一種である「局所線形モデル」の使用に相当する)。例えば、大きさで整列して大きさが近いものでグループ化する。
個別識別子と番号に、一次式以外の関数による非線形回帰分析を行う。例えば、一方ないし両方の集合の要素(あるいは、要素の成分)を累乗、対数関数、指数関数、三角関数、あるいはそれらの和などの式で変換した数の集合の一次式での回帰分析は、元のデータ集合間の非線形回帰分析になる。各々の変数を一次式以外の関数で1つないし複数の関数で変換し、それらを新たな変数として追加した「重回帰分析」を行い、元の変数の間の関係式に戻せば、必ず当てはまりが改善された近似式を得る事ができる。説明変数を増やせば、常に当てはまりが改善された式が得られる(最悪でも、追加した変数の係数を0 とすれば、当てはまりが悪化する事はあり得ない)ため。個別識別子の集合は「設計時に選べるデータ」であって、本来の意味で統計的データではなく、統計的データの処理の場合のような「モデルへの変数追加の妥当性」を考慮する必要はない。本実施形態では、単に式の当てはまりを改善できればよい。
線形の回帰分析と離散フーリエ変換を組み合わせて非線形回帰分析を行う。例えば、線形回帰分析で求めた一次近似式の誤差項に対して離散フーリエ変換を行って、誤差項を三角関数の和で近似する式を作り、元の一次近似式に加える。
なお、加法によるリダクションを利用する場合に集団識別子から個別識別子を検索する場合の手順は、最終的な対応が一般には1対1でない事以外は、個別識別子から管理対象の番号を検索する場合の手順と同様になる。なぜならば、一次近似式を使う場合、最終的に同じ個別識別子に対応する組み合わせで近似式の値が異なる場合は、単に一方の誤差が大きいと見なされる。また、離散フーリエ変換を使う場合では、近似式上でも異なる変数に対応して同じ値が現れてもよいため、特に問題はない。
図60から図65は、本実施形態での個別識別子と管理対象番号の対応付けの高速化処理の例を示すフローチャートである。
図60は、第12の実施形態での個別識別子と管理対象番号の対応付けの高速化処理の例を示すフローチャートであり、回帰分析による管理対象番号と個別識別子の間の一次近似式作成処理の例である。
まず、管理対象番号の整列済リストが、作業領域Xに格納される(ステップS6001)。
次に、個別識別子の整列済リストが、作業領域Yに格納される(ステップS6002)。
次に、XとYに対して回帰分析が実行され、互いに他を入力とした一次式での近似式が算出される(ステップS6003)。
さらに、回帰分析で求めた近似式の各入力に対する誤差リストが、各項で近似値から実際の値が引かれて算出される(ステップS6004)。
そして、誤差リストの要素が整列され、元のリストの要素としての番号と対応付けた別のリスト、すなわち、誤差リストと管理対象番号の整列のリストとを対応付けた表が作成される(ステップS6005)。
図61は、第12の実施形態での個別識別子と管理対象番号の対応付けの高速化処理の例を示すフローチャートであり、誤差が大きい箇所を除く事による一次近似式の精度向上の例である。
まず、一次近似式の誤差が規定値より大きい項の個別識別子が、リストから除かれる(ステップS6101)。
次に、管理対象番号に飛びがあってもよいか否かが判定される(ステップS6102)。
ステップS6102の判定がYESなら、そのまま処理が終了する。
ステップS6102の判定がNOなら、個別識別子を取り除いた箇所で番号を詰めて回帰分析が再実行される(ステップS6103)。その後、処理が終了する。
図62は、第12の実施形態での個別識別子と管理対象番号の対応付けの高速化処理の例を示すフローチャートであり、局所線形モデルによる近似式の精度向上の例である。
まず、誤差が規定値より大きい箇所が、誤差の大きさで整列した誤差項リストから選ばれる(ステップS6201)。
次に、誤差が規定値より大きい箇所の番号を境界として、データの集合が分割される(ステップS6202)。
そして、分割したデータの集合の各々に対し改めて回帰分析が実行されて、各集合ごとの一次近似式が求められる(ステップS6203)。
図63は、第12の実施形態での個別識別子と管理対象番号の対応付けの高速化処理の例を示すフローチャートであり、誤差の離散フーリエ変換による近似式の精度向上の例である。
まず、線形回帰分析で得た誤差項のリストに離散フーリエ変換が行われ、誤差項の近似式が作成される(ステップS6301)。
次に、元の一次近似式と誤差項の近似式が加えられて、非線形近似式が得られる(ステップS6302)。
図64は、第12の実施形態での個別識別子と管理対象番号の対応付けの高速化処理の例を示すフローチャートであり、重回帰分析による非線形近似式の作成処理(一般)の例である。
まず、管理対象番号の整列済リストが、作業領域Xに格納される(ステップS6401)。
次に、個別識別子の整列済リストが、作業領域Yに格納される(ステップS6402)。
次に、XおよびXを1つまたは複数の非線形関数で変換したリストからなる「リストのリスト」が、作業領域XXに格納される(ステップS6403)。
同様に、YおよびYを1つまたは複数の非線形関数で変換したリストからなる「リストのリスト」が、作業領域YYに格納される(ステップS6404)。
続いて、XとYYに対し重回帰分析が行われて、XのYYの各リストの値を格納する変数を入力とした近似式が求められる(ステップS6405)。
同様に、YとXXに対し重回帰分析が行われて、YのXXの各リストの値を格納する変数を入力とした近似式が求められる(ステップS6406)。
そして、重回帰分析で求められた近似式の各入力に対する誤差リストが、各項で近似値から実際の値の値が引かれて求められる(ステップS6407)。
最後に、誤差リストの要素が整列させられ、元のリストの要素としての番号と対応付けた別のリストが作成される(ステップS6408)。
図65は、第12の実施形態での個別識別子と管理対象番号の対応付けの高速化処理の例を示すフローチャートであり、回帰分析により作成した近似式f(x) をハッシュ関数とする検索処理の例である。
まず、個別識別子と管理対象番号の対応表が、作業領域Tに格納される(ステップS6501)。
次に、誤差リストによる探索範囲の下限が、作業領域aに格納される(ステップS6502)。
次に、誤差リストによる探索範囲の上限が、作業領域bに格納される(ステップS6503)。
また、探索の対象となる識別子または番号が、作業領域xに格納される(ステップS6504)。
さらに、作業領域aの値と作業領域bの値の平均値(a+b)/2に最も近い整数が、作業領域cに格納される(ステップS6505)。
その後、ステップS6506で作業領域iに初期値0(ゼロ)が格納された後、ステップS6508で+1ずつインクリメントされながら、ステップS6507でxとf(c)の対がTに含まれると判断されるまで、下記の処理が繰り返し実行される。
すなわち、まず作業領域cの値が、作業領域aの値と作業領域bの値の平均値(a+b)/2以下であるか否かが判定される(ステップS6509)。
そして、ステップS6509の判定がNOならばステップS6510で作業領域cの値にiが加算され、ステップS6509の判定がYESならばステップS6511で作業領域cの値からiが減算される。
以上の繰返し動作の結果、xとf(c)の対がTに含まれその結果ステップS6507の判定がYESになると検索処理が終了する。
以上説明した第12の実施形態において、例えば、前述した{1627以上2^16-1未満の素数}の集合のように、上述の回帰分析による一次近似式の当てはまりが元々よい場合は、関数による変換は行わず、必要に応じて誤差の大きい方から素数を個別識別子の集合から除外する事で、一次近似式の当てはまりが比較的容易に改善される。
{1627以上2^16-1未満の素数}の集合の要素数は6000より多い上に、第6の実施形態により複数(a 個)の32 bits 領域を使う事で、対応できる管理対象の数は、1つの領域で対応できる数のa 乗に出来る。このため、仮に1つの領域内で使用する素数の数を数百程度に絞っても32bits 領域2つなら数万から数十万の管理対象に対応できる。このように第6の実施形態を前提にする場合、使用する素数に別の特徴を付けても、第2,第3の実施形態と比較して、「小さいか同等の大きさの領域で、より多くの管理対象に対応可能」という特徴は、容易に保つ事ができる。
さらに、大きさにより複数の範囲に分ける事によっても、一次近似式の当てはまりは確実に改善できる。
関数による変換は、一次近似式では当てはまりが悪い場合(番号と個別識別子の各々の集合の間の統計的な関係の非線形性が大きい場合)に、大きさで個別識別子の集合を分割する数を減らし、番号を求める際の条件判定処理のオーバヘッドを削減できる。
なお、本実施形態ではデータが整数なので、近似式が全ての入力データに対し「誤差が0.5より小さい」という条件を満たせば、近似式の整数部を取る事により「完全ハッシュ関数」を得ることができる。
「完全ハッシュ関数」にはならないとしても、探索範囲を「近似値周辺の固定幅」の範囲に限定する事ができる。すなわち、メモリ参照量を固定値の範囲内に収められる。
<第13の実施形態>
次に、第13の実施形態について説明する。
本実施形態は、第11の実施形態と同様、第5または第6の実施形態における集団識別子(の成分)から個別識別子を求める計算の高速化に関する工夫を含む実施形態である。第11の実施形態でも説明したように、「分解能が上限k で制限される場合」でかつ演算を乗法とする際の基本的アイデアは、「素因数分解の一意性」を利用して、乗法でのリダクションで計算された集団識別子から、個別識別子を取り出す事である。従って、「素因数分解」の所要時間がシステムの処理性能の高速化に際して重要な因子となる。
例えば、個別識別子の成分に、管理対象の番号を格納する多次元配列のインデックスを対応させる事により、第6の実施形態のように個別識別子が複数の成分を持つ場合を、成分が1つしかない第5の実施形態の場合と同様に取り扱う事ができる。以下では、特に断らない限り、成分数が1として説明する。
第11の実施形態では、集団識別子から個別識別子を求める際、個別識別子の集合(ないし、その成分)の要素を順次選んで集団識別子(ないし、その成分)への除法を順次実行する事を前提として、その枠内での高速化手法を利用した。従って、特に個別識別子(の成分)が素数の場合は「因数になりうる素数で順次割る方法」( brute force method )が前提となる。
本実施形態では、例えば以下のようなbrute force method 以外の素因数分解アルゴリズムの一つまたは複数の組み合わせを使用する(組み合わせる際はbrute force method との組み合わせを含めてもよい)。これらのアルゴリズムに共通する特徴(すなわち、brute force method との相違点)は、「因数になりうる素数の集合」を入力として使用しない事である。
ρ method (「擬似乱数列」を使用する方法)
p-1 method (素数p に対し、p-1 が比較的小さい素因数を持つ場合に有効な方法)
p+1 method (素数p に対し、p+1 が比較的小さい素因数を持つ場合に有効な方法)
Fermat's method (素因数が元の数の平方根に近い場合に有効な方法)
連分数法(Continued Fraction Method)
複数多項式二次ふるい法(MPQS: Multiple Polynomial Quadratic Sieve Method)
楕円曲線法(ECM: Elliptic Curve Method)
これらのアルゴリズム自体は、例えば下記文献[7]に示されるように、「整数論」という数学の分野での命題、あるいは計算機科学での基本的なアルゴリズムとして、広く知られている。
[7] Donald E. Knuth,"The Art of Computer Programming, Volume 2"
ただし、「整数論」の問題としての「素因数分解」として、すなわち「素数か否か分かっているとは限らない任意の整数を入力として与えられた、素因数を少なくとも1つ求める操作」としては、あまり使われないアルゴリズムもある。それは、「特定少数の場合以外は遅い」、ないし「特定少数の場合以外、素因数を求められない」アルゴリズムは、「素因数分解の対象となる数が任意に選ばれる」という一般的な状況には適さないためである。
しかし、本実施形態においては、個別識別子(の成分)の集合を「使用するアルゴリズムで、高速に素因数が少なくとも1つ求められる」ように選んでおく事で目的が達せられるため、通常の整数論の問題としての素因数分解のアルゴリズムとしては一般性に乏しいとされる方法(p-1 method, p+1 method, Fermat's method など) も効果的に使用できる。例えば、Fermat's method は、素因数が元の数の平方根に近い場合に限り高速である事が知られているので、分解能k = 2 の場合に個別識別子(の成分)の大きさを可能な限り揃えておく事で有効に利用できる。
なお、brute force method 以外の素因数分解アルゴリズムでは、素因数を求めた後、管理対象の番号は別途取得される。
図66は、brute force method 以外のアルゴリズムにより、所与の整数の素因数を少なくとも1つ求める処理の例を示すフローチャートである。
まず、作業領域Lに、空リストが格納される(ステップS6601)。
次に、作業領域Xに、集団識別子が格納される(ステップS6602)。
次に、作業領域pに、作業領域Xの値の素因数の1つが格納される(ステップS6603)。
そして、ステップS6604で作業領域iに初期値1が格納された後(ステップS6604)、ステップS6607で作業領域iの値が+1ずつインクリメントされながら、ステップS6606で作業領域pの値が作業領域Xの値を割りきらなくなったと判定されるまで、ステップS6605からステップS6607までの一連の処理が繰り返し実行される。
この繰返し処理において、まず、作業領域Xの値を作業領域pの値で除算した結果(X/p)が、新たに作業領域Xに格納される(ステップS6605)。
次に、作業領域pの値が作業領域Xの値を割りきったか否かが判定される(ステップS6606)。
ステップS6606の判定がYESならば、作業領域iの値が+1インクリメントされ、ステップS6605が再度実行される。
以上の繰返し処理の結果、ステップS6606の判定がNOになると、作業領域Lに、集団識別子の素因数と指数の対(p,i)が要素として追加される(ステップS6608)。
その後、作業領域Xの値が、乗法演算の単位元1に等しくなったか否かが判定される(ステップS6609)。
ステップS6609の判定がNOならば、ステップS6603の処理に戻り、作業領域Xの次の素因数の1つについて処理が繰り返される。
ステップS6609の判定がYESになると、図66のフローチャートの処理が終了する。
以上のようにして、第13の実施形態において、「因数になりうる素数の集合」を入力として使用しない素因数分解のアルゴリズムの利用により、個別識別子から集団識別子を求める際に、「因数になりうる数の表」を参照する方法に比べてメモリ参照量が削減できる。特に分解能k あるいは個別識別子の成分に使われる素数の一方ないし両方が大きいために「因数分解すべき集団識別子」が大きい場合に、高速化と処理負荷の軽減の両面で有効である。
<第14の実施形態>
最後に、第14の実施形態について説明する。
本実施形態は、第11の実施形態および第13の実施形態と同様に、第5または第6の実施形態における集団識別子から個別識別子を求める計算の高速化に関する工夫を含む実施形態である。
例えば、個別識別子の成分に、管理対象の番号を格納する多次元配列のインデックスを対応させる事により、第6の実施形態のように個別識別子が複数の成分を持つ場合を、成分が1つしかない第5の実施形態の場合と同様に取り扱う事ができる。以下では、特に断らない限り、成分数が1として説明する。
本実施形態は「量子コンピュータ(量子ビット(qubit) による計算を行う演算装置を備える計算機)」が受信側ノードであるシステム構成を前提とする。
第5、第6の実施形態での集団識別子(の成分)からの個別識別子(の成分)の特定を、ショアのアルゴリズム(Shor's algorithm) による素因数分解を利用して行うために、量子ビットを使用した計算を行う演算装置を使用する。下記の文献[8]には、「多項式時間で(=従来の計算機では不可能な程度に高速な時間)」で素因数分解を量子計算機上で行う「ショアのアルゴリズム」が開示されている。
[8] Peter W. Shor,"Polynomial-Time Algorithms for Prime Factorization and Discrete Logarithms on a Quantum Computer",SIAMJournal on Computing Volume 26 Issue 5, Oct. 1997, Pages 1484-1509
添付資料の "5 Prime factorization" を含むページ。
図67は、第13および第14の実施形態の相違点の説明図である。第13の実施形態は、通常のbitを操作する一般的なCPUとメモリとを備える通常の計算機を用いて、図67(a)に示されるような、brute force method 以外の素因数分解アルゴリズムを実行する計算機が、図4の識別子集約機構401または識別子分析機構402を実現する。一方、第14の実施形態は、通常のbitを操作する一般的なCPUとメモリに加えて、量子bit(Qubit)を操作する演算装置である量子計算機を搭載し、この量子計算機が、図4の識別子集約機構401または識別子分析機構402を実現する。
ここでの「量子計算機」は、独立した計算機であってもよいし、図67(b)に示されるように、「「ショアのアルゴリズム」による素因数分解を実行する機能しか持たない補助プロセッサ」としての演算装置であってもよい。
なお、「ショアのアルゴリズム」は、素因数分解の過程で「因数となりうる数」の表を引くわけではないので、求めた素因数から管理対象の番号を求める手順は別途実行される。
以上説明した第14の実施形態により、量子コンピュータでショアのアルゴリズムをも散ることにより、「(素因数分解の対象となる数の大きさに対して)多項式時間」で素因数分解を行う事ができる。すなわち、素因数分解の処理時間が、一般に素因数分解の対象となる数の大きさを変数とする多項式で表せる程度の大きさに留まる。
既知の量子コンピュータを使用しない方法での素因数分解は、全て「準指数時間」かかる(入力データの大きさを引数とする指数関数と同じ程度の割合で計算時間が増加する)。
しかし、因数分解の対象となる数が知られている他の方法で現実的な処理時間で素因数分解できない大きさの場合でも、量子コンピュータでショアのアルゴリズムを使えば、現実的な処理時間で素因数分解を行う事が可能となる。
従って、本実施形態は「集団識別子から個別識別子を求める処理」が、「因数分解すべき集団識別子の成分」が他の実施形態で現実的な処理時間内には扱えないほど大きい場合」を現実的な処理時間内に扱える。すなわち、第5、第6の実施形態で扱える管理対象の数を桁違いに大きくできるほか、分解能k も大きくできる。例えば、大規模疎行列の分散並列計算への図4の識別子集約機構401と識別子分析機構402の適用では、状態監視への適用に比べて大きな分解能k が必要な場合が多いと考えられるため、本実施形態は特に有効である。
現在、素因数分解の実用的応用として、公開鍵暗号系での鍵交換において、大きな2つの素数の組p,q に対し、積pq を公開してもp,q は従来型のコンピュータでは容易に計算できないため「秘密鍵」と見なせる事が利用されている。この応用は、量子コンピュータでのショアのアルゴリズムを使う素因数分解が普及すれば価値を失う。一方、本実施形態では、量子コンピュータによる素因数分解の高速実行は、適用可能な範囲の拡大につながる。
<その他の実施形態>
前述したように、第1から第14の各実施形態は、必ずしも相互に排他的ではなく、必要に応じて組み合わせることが可能である。
前述したように、図4の識別子集約機構401および識別子分析機構402は、図7、図20、図21、または図22の情報集約システムを構成するノード701または702のCPU701−1または702−1のソフトウェア処理によって実現できる。この場合、図7の各ノード701または702あるい中継装置703に記録媒体読み取り装置を備えて、磁気ディスク、光ディスク、光磁気ディスク、及びUSBメモリ等の記録媒体に含まれる制御プログラムを読み出させる。記録媒体読み取り装置により読み出された制御プログラムは、直接、あるいは中継装置703から通信線704を介して、所定のノード701または702のメモリ701−2または702−2に記録される。CPU701−1または702−1は、メモリ701−2または702−2に記録された制御プログラムを実行することで、第1〜第14の実施形態に従った図4の識別子集約機構401および識別子分析機構402の機能を実現する。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
送信側ノードに設けられ、情報の通知元に固有の個別識別子と、前記情報の通知元からの前記個別識別子による通知を集約して集団識別子とを生成して送信する識別子集約機構と、
受信側ノードに設けられ、前記集団識別子を受信し前記個別識別子を復元する処理と、前記個別識別子から前記情報の通知元を特定する処理を実行する識別子分析機構と、
を備えることを特徴とする情報集約システム。
(付記2)
前記識別子集約機構は、前記送信側ノードが管理する前記情報の通知元にて前記情報を通知すべき条件が成立したときに前記通知元に固有の個別識別子を生成し、前記送信側ノードが前記ネットワーク上の起点ノードでない場合に他の前記送信側ノードが送信した集団識別子を受信し、生成した前記個別識別子と受信した前記集団識別子とに対してリダクション演算を実行することにより前記個別識別子と前記集団識別子とが集約された新たな前記集団識別子を生成して前記ネットワーク上のノードに送信し、
前記識別子分析機構は、前記送信側ノードが送信した集団識別子を受信し、受信した前記集団識別子から前記集団識別子の生成因子である1つ以上の前記個別識別子を復元し、復元したそれぞれの前記個別識別子から前記通知元の通知を復元する、
ことを特徴とする付記1に記載の情報集約システム。
(付記3)
前記識別子集約機構は、前記送信側ノードが前記ネットワーク上の起点ノードである場合には、前記リダクション演算において前記集団識別子の代わりに第1の既定値を入力し、前記送信側ノードが管理する前記情報の通知元にて前記情報を通知すべき条件が成立していないときには、前記リダクション演算において前記個別識別子の代わりに第2の既定値を入力する、
ことを特徴とする付記2に記載の情報集約システム。
(付記4)
前記第1の既定値および前記第2の既定値は、前記リダクション演算における単位元である、
ことを特徴とする付記2または3に記載の情報集約システム。
(付記5)
前記識別子集約機構に、ネットワークまたは当該ネットワークに接続されたノードの通信装置上に具備されるノード間演算機構を用い、
前記集団識別子の送信と受信に対してバリア同期を実行する同期機構をさらに備える、
ことを特徴とする付記1ないし4のいずれかに記載の情報集約システム。
(付記6)
送信側で予めグループ内の管理対象に対して論理和を実行しておく、
ことを特徴とする付記1ないし5のいずれかに記載の情報集約システム。
(付記7)
前記送信側ノードに、複数の整数からなる順序付けられた組を対応させる、
ことを特徴とする付記1ないし6のいずれかに記載の情報集約システム。
(付記8)
前記識別子集約機構は、前記個別識別子の割当てに、代数的整数の素因数分解の一意性と乗法を利用する、
ことを特徴とする付記1ないし7のいずれかに記載の情報集約システム。
(付記9)
前記識別子集約機構は、前記個別識別子の割当てに、代数的整数の素因数分解の一意性と加法を利用する、
ことを特徴とする付記1ないし7のいずれかに記載の情報集約システム。
(付記10)
前記識別子分析機構は、前記代数的整数の加算を用いて、受信した前記集団識別子から前記個別識別子を復元する、
ことを特徴とする付記9に記載の情報集約システム。
(付記11)
識別子の集合を複数のグループに分ける、
ことを特徴とする付記1ないし10のいずれかに記載の情報集約システム。
(付記12)
回帰分析または離散フーリエ変換を利用して、前記識別子に関する検索処理での探索範囲を絞り込む、
ことを特徴とする付記11に記載の情報集約システム。
(付記13)
前記識別子分析機構は、因数になりうる素数の集合を入力として使用しない素因数分解アルゴリズムを用いて、前記集団識別子から前記個別識別子を復元する、
ことを特徴とする付記1ないし7に記載の情報集約システム。
(付記14)
前記受信側ノードが量子コンピュータである、
ことを特徴とする付記1ないし7に記載の情報集約システム。
(付記15)
ネットワークに接続され情報の通知を行う送信側ノードのコンピュータに、
前記送信側ノードが管理する前記情報の通知元にて前記情報を通知すべき条件が成立したときに前記通知元に固有の個別識別子を生成する処理と、
前記送信側ノードが前記ネットワーク上の起点ノードでない場合に他の前記送信側ノードが送信した集団識別子を受信する処理と、
生成した前記個別識別子と受信した前記集団識別子とに対してリダクション演算を実行することにより前記個別識別子と前記集団識別子とが集約された新たな前記集団識別子を生成して前記ネットワーク上のノードに送信する処理と、
を実行させるためのプログラム。
(付記16)
ネットワークに接続され情報の集約を行う受信側ノードのコンピュータに、
送信側ノードが送信した集団識別子を受信する処理と、
受信した前記集団識別子から前記集団識別子の生成因子である1つ以上の前記個別識別子を復元する処理と、
復元したそれぞれの前記個別識別子から前記通知元の通知を復元する処理と、
を実行させるためのプログラム。
(付記17)
送信側ノードにて、情報の通知元に固有の個別識別子と、前記情報の通知元からの前記個別識別子による通知を集約して集団識別子とを生成して送信する識別子集約処理を実行し、
受信側ノードにて、前記集団識別子を受信し前記個別識別子を復元する処理と、前記個別識別子から前記情報の通知元を特定する処理を実行する識別子分析処理を実行する、
ことを特徴とする情報集約方法。
(付記18)
前記識別子集約処理において、前記送信側ノードが管理する前記情報の通知元にて前記情報を通知すべき条件が成立したときに前記通知元に固有の個別識別子を生成し、前記送信側ノードが前記ネットワーク上の起点ノードでない場合に他の前記送信側ノードが送信した集団識別子を受信し、生成した前記個別識別子と受信した前記集団識別子とに対してリダクション演算を実行することにより前記個別識別子と前記集団識別子とが集約された新たな前記集団識別子を生成して前記ネットワーク上のノードに送信し、
前記識別子分析処理において、前記送信側ノードが送信した集団識別子を受信し、受信した前記集団識別子から前記集団識別子の生成因子である1つ以上の前記個別識別子を復元し、復元したそれぞれの前記個別識別子から前記通知元の通知を復元する、
ことを特徴とする付記17に記載の情報集約方法。