(57)【特許請求の範囲】
【請求項１】
少なくとも１つ以上のプロセッサをそれぞれ有する複数のノードと、上記複数のノードの間でメッセージを交換するための上記ノードを相互に接続するネットワークとからなる並列計算機において、
該複数のノードにより利用可能な少なくとも１つの資源と、その資源を複数のノードに分割して格納する手段を有し、
その資源に対してアクセス要求を行うノードは、その資源を分割格納している複数のノードに対して一連のアクセス要求を行うときに、該一連のアクセス要求に対してアクセス結果が返答されたか否かを示すフラグ情報を格納するフラグ格納領域を有し、
前記アクセス要求を受け付けたノードは、該アクセス要求に対してアクセス結果を返答するときに、前記アクセス要求を行うノードのフラグ格納領域に対して自ノードがアクセス結果を返したことを記録するために、フラグ格納領域のアドレスを指定する手段と、該フラグ格納領域に対する記録方法を指定する手段と、前記アクセス結果のデータに指定されたフラグ格納領域のアドレスと指定された記録方法とが少なくとも付帯する送信メッセージを形成して送信する手段を有し、
アクセス要求を行ったノードは、前記送信メッセージを受け取ったときに、前記アクセス結果のデータに付帯する前記フラグ格納領域のアドレスに、前記アクセス結果のデータに付帯する記録方法で指定される方法で記録を行い、記録により形成されるフラグ情報が、全てのノードから返答があったことを示すか否かを判定する手段と、全てのノードから返答があったと判定された場合に該プロセッサに割込を発生する回路を有することを特徴とする並列計算機。
【請求項２】
少なくとも１つ以上のプロセッサをそれぞれ有する複数のノードと、上記複数のノードの間でメッセージを交換するための上記ノードを相互に接続するネットワークとからなる並列計算機において、
該並列計算機は該複数のノードにより利用可能な少なくとも一つの資源を有し、
該ノードには、その資源を直接アクセスする手段を有する第１のノードと、直接アクセスできない第２のノードがあり、
前記第２のノードは、該資源をアクセスする場合に、複数のアクセス結果のデータを順次格納する循環バッファを有し、
前記第１のノードは、前記第２ノード内の前記循環バッファのうちの空きバッファの数を格納するレジスタと、前記アクセス結果のデータを該第２のノードに返答するときに、前記レジスタに格納された前記空きバッファの数を減少させる回路を有し、
前記第２のノードは、前記循環バッファに格納されたアクセス結果のデータを利用し、利用した該アクセス結果のデータを循環バッファから解放した場合に、該題のノードの循環バッファのうちの空きバッファの数が増加したことを示すメッセージを前記第１のノードに送信する回路を有し、
前記第１のノードは、前記メッセージを受けて前記レジスタに格納された前記空きバッファの数を増加させる回路と、前記第２のノードの前記循環バッファに空きバッファがあるか否かを前記レジスタに格納された空きバッファの数により判定する回路と、該空きの判定の結果が空きバッファがない場合に前記第２のノードからの要求により実行した前期資源へのアクセス結果のデータの返答を遅延させる手段をさらに有することを特徴とする並列計算機。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、複数のプロセッサを有する計算機システムにおいて、これらのプロセッサにより共有されている資源を持つ並列計算機に関し、特にそれぞれプロセッサを有する複数のノードがネットワークを介して結合されている並列計算機において資源を複数のノードに分散配置する並列計算機の構成方法に関する。
【０００２】
【従来の技術】
大量のメディア情報を供給するメディアサーバとしては、複数のプロセッサから構成される並列計算機かまたは複数の計算機からなるクライアント・サーバ型の分散処理システムが知られている。本明細書では、並列計算機を構成する複数のプロセッサとクライアント・サーバ型の分散処理システムを構成する複数の計算機とを区別することなく言及するするために、分散処理システムの分散処理を実行する計算機要素を「ノード」と呼ぶ。
【０００３】
メディア情報は並列計算機内の複数のディスク装置に分散して保持されることが多く、ユーザからのアクセス処理要求は複数のノードの協調動作により処理される。
【０００４】
たとえば、メディアサーバの例としては、映画などの大量の映像情報を格納し、複数のユーザに映像情報を供給するビデオオンデマンドサーバがある。映像情報は供給時間が延びてしまうと画像の途切れや画面のちらつきが発生するという特徴をもつ。このため、遅延時間の短縮は重要な課題である。
【０００５】
ところで、ビデオオンデマンド処理に関しては遅延時間の短縮に関して考慮しなければならないことがある。それは、メディア情報へのアクセスパターンである。つまり、ビデオオンデマンドサーバは、複数のユーザが同時に異なるタイトルをアクセスする場合と、同一のタイトルをアクセスするいずれの場合においても、高速に映像情報を提供しなければならない。
【０００６】
前者の課題を解決するためには、映像情報をタイトル毎に複数のノードに分散配置すればよい。これにより、複数のノードに負荷を分散させることができる。ユーザは自分の見たいタイトルを格納しているノードと交信し、映像データを供給して貰えばよい。ユーザにより同時に要求される複数のタイトルが均等に複数ノードに分散されていれば、処理負荷を分散させることができる。
【０００７】
しかし、この構成では後者の課題を解決できない。上記のシステム構成において、同一タイトルにアクセスが集中した場合、分散システムを構成するノード数が大きい場合でも負荷はそのタイトルを格納しているノードのみにかかってしまう。これでは１ノードからなるシステムと性能が変わらない。
【０００８】
そこで、一つの映像タイトルを複数のセルデータに分割し、セルデータをハッシュ関数等の分配条件にしたがって、複数のディスクに分散配置を行う方法がよく用いられる。これは「ストライピング」と呼ばれる。例えば、参考文献１：「日経エレクトロニクス」６０２号、１９９４．２．２８号、第１３頁〜第１４頁参照。このストライピングをディスクからノードに拡張し、同一タイトルを複数のノードに分散配置することを「ノード間ストライピング」と呼ぶ。これにより、たとえ同一タイトルに対して複数のユーザからアクセスがあった場合にでも、複数ノードに負荷を分散させることができ、分散システムの処理性能を向上させることができる。
【０００９】
【発明が解決しようとする課題】
しかしながら、従来のノード間ストライピング方法をビデオオンデマンドサーバに適用した場合には、次ぎの問題が生じる。
【００１０】
一人のユーザに対して映像データを供給するノード（インターフェスノードと呼ぶ）は映像データの連続性保証や順序保証を行わなければならず、ノード間ストライピングにより分散格納されたセルデータを集めてからユーザに供給する必要がある。
【００１１】
ところが、分散処理システムでよく用いられるデータ交換方法としてＴＣＰ／ＩＰを用いた場合には、転送されたセルデータを格納するメッセージが到着するたびに割込やアクノリッジ返送などのソフトウエア処理が必要である。このソフトウエア処理はインタフェースノードが本来行っているユーザインタフェース処理を邪魔してしまう。また、このオーバヘッドはノード間ストライピングを行うノード数に比例して増加するため、性能を向上するためデータ供給ノードを増やすとかえってインタフェースノードはセルの到着確認に忙殺され、ユーザインタフェース処理がますます邪魔され、ユーザサービスの質が低下する。
【００１２】
また、映像情報は大規模であるため、例えば２時間の映画を見る場合にはデータを格納しているノードからインターフェスノードへのデータ供給性能は、ユーザに映像の途切れを感じさせない程度に速くなければならない。このためにデータを格納しているノードからインタフェースノードへ連続的にデータを供給する必要がある。（以下、ストリーム処理と呼ぶ。）このストリーム処理を実現するためにはデータの受取り側と送り手側でフロー制御を行う必要がある。
【００１３】
フロー制御方法としてＴＣＰ／ＩＰではパケットを受信する毎に割込を発生し、ＯＳ（オペレーティングシステム）が受信バッファの容量を計算してアクノリッジとして返送する。参考文献２：「ＵＮＩＸ  ４．３ＢＳＤの設計と実装」第３７４頁〜第３９７頁、Ｓ．Ｊ．Ｌｅｆｆｌｅｒ他著（１９９１）。
【００１４】
しかし、このようなフロー制御方法では次の問題が起る。ノード間ストライピングにより１つのインタフェースノードが相手をしなければならないデータ供給ノードの数が増えるにしたがって、フロー制御情報を送信ノードに返送する回数が増大し、本来の処理であるユーザインタフェース処理が邪魔されてしまう。
【００１５】
そこで、本発明の第１の目的は、複数ノードに分散している資源（映画情報等のデータ等、またプロセス等もデータと考える）をアクセスする場合に、分割されたデータが集まったことを高速に確認することができる並列計算機を提供することである。
【００１６】
そして、本発明の第２の目的は、ノード間でのデータの転送に関して高速なフロー制御のできる並列計算機を提供することである。
【００１７】
【課題を解決するための手段】
第１の目的を実現するために、本発明の並列計算機は、少なくとも１つ以上のプロセッサをそれぞれ有する複数のノードと、上記複数のノードの間でメッセージを交換するための上記ノードを相互に接続するネットワークとからなる並列計算機において、該複数のノードにより利用可能な少なくとも１つの資源と、その資源を複数のノードに分割して格納する手段を有し、その資源に対してアクセス要求を行うノードは、その資源を分割格納している複数のノードに対して一連のアクセス要求を行うときに、該一連のアクセス要求に対してアクセス結果が返答されたか否かを格納する手段（フラグと呼ぶ）を有し、該アクセス要求を受け付けたノードは、該アクセス要求に対してアクセス結果を返答するときに、アクセス結果とともに該フラグに対して自ノードがアクセス結果を返したことを記録するために、該フラグを指定する手段と、該フラグに対する記録方法を指定する手段とを有し、アクセス要求を行ったノードは、該アクセス結果を受け取ったときに、付帯する該フラグを指定する手段で示されるフラグに対して、該フラグに対する記録方法で指定された手段で記録を行い、そのフラグが全てのノードから返答があったことを示すか否かを判定する手段と、全てのノードから返答があったと判定された場合に該プロセッサに割込を発生する回路を有する。
【００１８】
また第２の目的を実現するために、本発明の並列計算機は、少なくとも１つ以上のプロセッサをそれぞれ有する複数のノードと、上記複数のノードの間でメッセージを交換するための上記ノードを相互に接続するネットワークとからなる並列計算機において、該並列計算機は該複数のノードにより利用可能な少なくとも一つの資源を有し、該ノードには、その資源を直接アクセスする手段を有する第１のノードと、直接アクセスできない第２のノードがあり、該第２のノードは、該資源をアクセスする場合に、複数のアクセス結果を格納する手段を有し、該第１のノードは、該アクセス結果格納手段の空き数を格納する手段と、該アクセスに対する結果を第２のノードに返答するときに、上記格納手段に格納された該空き数を減少させる回路を有し、該第２のノードは、該アクセス結果を利用することにより、該アクセス結果格納手段を解放した場合に、該第１のノードにある該空き数を格納する手段に納められた空き数を増加させる回路を有し、該第１のノードは、該第２のノードの該アクセス結果格納手段に空きがあるか否かを判定する回路と、該空きの判定の結果が空きがない場合にアクセス結果の返答を遅延させる手段を有する。
【００１９】
【発明の実施の形態】
以下、本発明にかかわる並列計算機を図面に示した実施の態様を参照してさらに詳細に説明する。なお、以下においては、同じ参照番号は同じものもしくは類似のものを表わすものとする。なお、以下では実施の態様の１つの例を実施例と呼ぶ。
【００２０】
（１）実施例
図１に本実施例１による並列計算機を示す。この並列計算機では、複数のノード２はネットワーク１により結合され、各ノード２は、少なくとも一つのプロセッサ２４と、ディスク装置２５を含み、このディスク装置２５内に、ノード間ストライピングにより分散されたデータが保持されている。各データは、それを保持するノード（データ供給ノード）のみからアクセス可能であり、このデータをアクセスしたい他のノード（データ消費ノード）は、このデータ供給ノードにデータ供給要求を行う。
【００２１】
なお、この並列計算機では、全てのノードは同じ構成をとり、同一の処理を行うことができが、本実施例では説明をわかりやすくするために図１において、ノード＃０、ノード＃１をデータ供給ノード、ノード＃２をデータ消費ノードと位置付ける。そして、ノード＃２がノード＃０、ノード＃１に分散配置されたデータをアクセスする場合について説明する。
【００２２】
本実施例１ではノード＃０、ノード＃１のディスク装置２５に分散格納されたデータ３５をノード＃２が読み出すときに、ノード＃０が転送したデータとノード＃１が転送したデータの両方が揃ったことを高速に判定することが第１の特徴である。そして、データ消費ノードではデータ供給ノードから連続的にデータを受信できる様に循環バッファ３８を有している。この循環バッファ３８の空き容量をデータ供給ノードが高速に判定できることが第２の特徴である。これら２つのためにノード２にはイベント制御回路５００と、循環バッファへのデータの到着を示すフラグ３７とこのフラグを操作するためのフラグレジスタ５８とフロー制御レジスタ群５２が設けられている。循環バッファ３８はデータ供給ノードからのデータ転送と、データ消費ノードが転送されたデータを用いてユーザにサービスを提供する処理を並行して行うために設けられ、図２に示すような構成をとる。すなわち、ノード＃０、ノード＃１からそれぞれ転送されたデータを格納するバッファエリア、ノード＃０用［ｍ］，ノード＃１用［ｍ］と、これらが到着しているか否かを示すフラグ［ｍ］である。データ供給ノードはｍ＝０から順番にデータをデータ消費ノードに転送し、データ消費ノードはｍ＝０から順番に消費していく。
【００２３】
フラグレジスタ５８はノード２がメッセージ１１を受信したときにローカルメモリ上のフラグ３７を一時的に格納するレジスタである。
【００２４】
また、フロー制御レジスタ群５２は循環バッファ３８の空き容量を管理するレジスタでデータ供給ノードで用いられる。データを転送すべきノード、ここではデータ消費ノードの循環バッファ３８の空き容量を格納する。本実施例では、データ供給ノードがデータをデータ消費ノードに転送した場合に該当するフロー制御レジスタを減少させ、データ消費ノードが転送されたデータを処理し終えたら、データ供給ノードの該当フロー制御レジスタを増加させることに特徴がある。これにより、データ供給ノードは該当するフロー制御レジスタが０より大きければ、データを転送することができると判断可能であるとともに、データ消費ノードはメッセージの到着した時ではなく、データを消費する時にフロー制御を行うことができる。したがって、データ消費ノードでは、ユーザへのサービス処理への無駄な割込が防止できる。
【００２５】
以下、本実施例の回路とその動作の詳細を説明する。
【００２６】
（ノード２）
図１に示すように各ノード２は、データ供給プログラム３１やデータ消費プログラム３２を実行するプロセッサ２４と、ローカルメモリ２３と、ノードに分散されたデータ３５を格納するディスク装置２５と、本実施例で特徴的な高速フロー制御処理を行うための送信制御回路２１と、受信制御回路２２とから構成される。この並列計算機は、いわゆる分散メモリ型並列計算機で、ローカルメモリ２３は他のノードからはアクセスできず、そのローカルメモリの属するノードのみアクセス可能である。そして、ローカルメモリ２３にはそのノードで実行されるプログラムやそのプログラムが使用あるいは生成するデータを格納する。さらに、本実施例ではデータ供給ノードではディスク装置２５から読み出したデータ３５が一時的に格納された転送データ３６が置かれる。一方、データ消費ノードではデータを受け取るための循環バッファ３８とそのフラグ３７が置かれる。
【００２７】
また、このノード内の各回路は、システムバス２６に接続され、メモリマップドＩＯ方法により、プロセッサ２４からロード命令やストア命令などのメモリアクセス命令でローカルメモリ２３と区別することなくアクセスすることができる。
【００２８】
送信制御回路２１はメッセージ生成回路４１と、送信パラメータ格納レジスタ４２と送信状態レジスタＳＴ４３から構成される。受信制御回路２２は入力バッファ５１と、メモリアクセス回路６０とフロー制御レジスタ群５２とから構成される。メモリアクセス回路６０はネットワークから受信したデータをローカルメモリ２３に書き込んだり、フラグ３７を読み出してこれを更新して書き戻す。イベント制御回路５００は、２つの入力が同一か否かを判定する一致制御回路５３と、２つの入力の大小を比較する大小判定回路５４と、２つの入力の加算、減算、ビットセット、ビットリセット、を行なう演算回路５６と、セレクタ５５、５７、６１と、アンド回路５９とからなる。
【００２９】
（ネットワーク１）
ネットワーク１は、形態は特に規定しないがメッセージ１１のノード番号Ｎａｄで示されるノードにメッセージを伝達する。例えば、特願平６−５３４０５号明細書に記載されたものと同じでよい。
【００３０】
以下では、ノード＃０、ノード＃１のディスクに格納されたメディアデータ３５をノード＃２が読み出す手順を説明する。
【００３１】
（フロー制御レジスタ群５２の初期化）
各ノード２はシステムの起動時にフロー制御レジスタ群５２を０に初期化する。
【００３２】
（循環バッファ３８の初期化）
ノード＃２はメディアデータを読み出すための循環バッファ３８とその読み出し完了を表すフラグ３７をローカルメモり２３に確保し、フラグ３７には初期値として０を書き込む。この循環バッファ３８は図２に示すようにノード＃０用のデータ領域とノード＃１用のデータ領域とそのフラグを１組として（ｍ＋１）組ある。後から述べるようにノード＃０、ノード＃１はこの循環バッファ３８の先頭からデータ転送の宛先として用い、（ｍ＋１）組目まで進む。そして、次は０組目へと循環して用いる。このように循環して用いることにより、循環バッファ３８よりも大きなメディアデータを読み出して、例えば表示装置に表示するなどの処理を行なうことができる。
【００３３】
（ノード＃０、ノード＃１への読み出しリクエスト）
ノード＃２はノード＃０へ読み出すべきメディアデータのタイトルと、受信する循環バッファ３８のノード＃０用のエリアのアドレスと、フラグのアドレスと、循環バッファ３８の大きさ（ｍ＋１）と、フロー制御に用いるフロー制御レジスタのＩＤであるＲ＃を、ネットワークを介して伝える。図１には記載されていないが、これはイーサネットなどの従来技術を用いても構わない。同様にノード＃１へも読み出しリクエストを伝える。さらに本実施例で特徴的なノード間ストライプ数をノード＃２はノード＃０とノード＃１に伝達する。ここではノード＃０とノード＃１への２分割であるため２である。一般的にｎ台のノードに分割されている場合にはｎである。またこの時、用いるフロー制御レジスタには０が設定されている。これは、ノード＃０のデータ供給プログラム３１からは循環バッファ３８に空きがないことと等価にみえる。このため、ノード＃０、ノード＃１はデータの供給を停止して、フロー制御レジスタが０より大きくなることを待つ。
【００３４】
（ノード＃０、ノード＃１への読み出し開始指示）
この段階ではノード＃０およびノード＃１はノード＃２の循環バッファ３８に空きがない状態であると認識しているため待機している。そこで、ノード＃２は自ノードのデータ消費プログラム３２の準備が完了したところでノード＃０およびノード＃１に読み出し開始指示を次の手順にしたがって行う。この開始指示はより具体的にはノード＃０およびノード＃１のフロー制御レジスタに循環バッファ３８の空き容量を設定することである。
【００３５】
すなわち、システムバス２６を介してプロセッサ２４は送信パラメタ格納レジスタ４２に次の値を設定し、メッセージをノード＃０、ノード＃１に送信する。
【００３６】
Ｎａｄ：＝ノード＃０またはノード＃１の識別子
ＣＴＬ（Ｒ）：＝１［フロー制御レジスタ群宛のメッセージであることを示す］
ＣＴＬ（Ｒ＃）：＝宛先のフロー制御レジスタ識別子
Ｄａｄ：＝０［このメッセージでは参照されない］
Ｄｌｎ：＝０［このメッセージでは参照されない］
Ｆａｄ：＝０［このメッセージでは参照されない］
Ｉｎｔ：＝０［このメッセージでは参照されない］
Ｄ０：＝０［このメッセージでは参照されない］
Ｄ１：＝（ｍ＋１）［循環バッファ３８の容量］
Ｃｔ０：＝０［このメッセージでは参照されない］
Ｃｔ１：＝値設定を表すコード
Ｔａｄ：＝０［このメッセージでは参照されない］
このように送信パラメタを設定することにより、メッセージ生成回路４１はメッセージ１１を生成し、ネットワーク１へ送出する。そして、送信状態レジスタＳＴ４３に送信完了を表すコードを書き込む。
【００３７】
ネットワーク１はメッセージ１１のＮａｄが示すノード、ここではノード＃０またはノード＃１へメッセージを配送する。
【００３８】
次に上記メッセージを受信したノード＃０およびノード＃１の動作について説明する。
【００３９】
ノード２ではネットワーク１から受信したメッセージ１１を一時的に入力バッファ５１に格納し、各フィールドの切出しを行う。本メッセージはＣＴＬ（Ｒ）＝１であることから本メッセージはフロー制御レジスタに対する更新要求であると判断する。また、Ｃｔ１が「値設定」であることから、イベント制御回路５００はセレクタ５７にＤ１を選択するように制御し、フロー制御レジスタ群５２からＣＴＬ（Ｒ＃）で示されるレジスタに対し、Ｄ１に格納された（ｍ＋１）を書き込む。
【００４０】
これによりフロー制御レジスタ［Ｒ＃］には循環バッファ５８の空き容量として（ｍ＋１）が設定された。
【００４１】
（データ供給ノードからのデータ転送）
一方ノードのプロセッサ２ではデータ供給プログラム３１がシステムバス２６を介してフロー制御レジスタ［Ｒ＃］を監視し、０より大きくなるまで待機している。上記ノード＃２からの読み出しリクエストによりフロー制御レジスタ［Ｒ＃］は（ｍ＋１）になっているため、データ供給プログラム３１はデータ転送処理を次の手順に従い行う。
【００４２】
プロセッサ２４はディスク装置２５からデータ３５をシステムバス２６を介して読みだし、ローカルメモリ２３に転送データ３６として格納する。そして、このデータをノード＃２に転送する。
【００４３】
すなわち、プロセッサ２４はシステムバス２６を介して送信パラメタ格納レジスタ４２に次のようにパラメタを設定する。
【００４４】
Ｎａｄ：＝ノード＃２の識別子
ＣＴＬ（Ｒ）：＝０［フロー制御レジスタ宛ではなく、メモリ宛であることを示す］
Ｄａｄ：＝ノード＃０（またはノード＃１）用データ格納領域［ｉ］の先頭アドレス、一番最初はｉ＝０である。
Ｄｌｎ：＝データ長［上記データ格納領域［ｉ］の容量と同一］
Ｆａｄ：＝フラグ格納領域［ｉ］の先頭アドレス、一番最初はｉ＝０である。
Ｉｎｔ：＝１［割込を発生させることを示す］
Ｄ０：＝２［データのノード間ストライプ数］
Ｄ１：＝１［フラグの増分を表す］
Ｃｔ０：＝０［一致判定を選択することを表す］
Ｃｔ１：＝加算を表すコード
Ｔａｄ：＝転送データ３６の先頭アドレス
これらのパラメタをプロセッサが書き込むことで、メッセージ生成回路４１はメッセージ１１を生成し、ネットワーク１へ送出する。このとき、メッセージ１１の転送データフィールドにはＴａｄに格納された先頭アドレス、すなわち転送データ３６がパッキングされる。
【００４５】
（データ供給ノードでのフロー制御レジスタの更新）
データを一つデータ消費ノードに転送し終えると、データ供給ノードではフロー制御レジスタの更新を行う。即ち、プロセッサ２４はシステムバス２６を介してフロー制御レジスタ［Ｒ＃］から１を引く。この結果が０に場合、データ供給プログラム３１は待機状態になる。さらにデータ供給プログラム３１は次にデータを転送すべき循環バッファ３８のアドレスをデータ用はノード＃０（またはノード＃１）用のデータ格納領域［ｉ＋１］、フラグアドレスをフラグ領域［ｉ＋１］に更新する。もしも、これらのアドレスがそれぞれデータ格納領域［ｍ］、フラグ領域［ｍ］より大きい場合には循環バッファの先頭アドレスであるデータ格納領域［０］、フラグ領域［０］に更新する。そして、タイトルで指定されたデータを全てノード＃２に転送し終えるまで、こららの動作を繰り返す。
【００４６】
（データ消費ノードでのデータの受信）
次に上記メッセージを受信したノード＃２の動作について説明する。
【００４７】
ノード２ではネットワーク１から受信したメッセージ１１を一時的に入力バッファ５１に格納し、各フィールドの切出しを行う。本メッセージはＣＴＬ（Ｒ）＝０であることから本メッセージはローカルメモリ２３へのデータ転送であると判断する。メッセージ１１のＤｌｎで示される長さの転送データを、メモリアクセス回路６０はシステムバス２６を介してＤａｄが示す循環バッファ３８のデータ格納領域の先頭アドレスへ書き込む。次にフラグの更新を行うが、これは本実施例で特徴的な動作である。メモリアクセス回路６０はメッセージ１１のＦａｄで示されるアドレスからフラグ格納領域［ｉ］の内容を読みだし、フラグレジスタ５８に格納する。
【００４８】
（フラグに該当する領域に対するデータ転送が始めての場合）
この場合、フラグ領域［ｉ］に格納されたフラグは初期値０である。イベント制御回路５００は、ＣＴＬ（Ｒ）が０であることからセレクタ６１でフラグレジスタ５８を選択し、演算回路５６の一方に入力する。そして、演算回路５６のもう一方の入力にはＤ１すなわちここでは１を入力する。イベント制御回路５００はＣｔ１が加算を表すコードであることから演算回路５６とセレクタ５７を制御してセレクタ５７の出力に演算回路５６の二つの入力の加算結果を出力する。ここでは０＋１＝１である。そして、フラグレジスタ５８に書き戻す。次に、イベント制御回路５００はＣｔ０＝０すなわち、一致判定を示すコードであることから、一致判定回路５３の一方の入力にＤ０、ここでは２を、他方にはセレクタ６１で選択されている更新済のフラグレジスタ５８の内容、ここでは１を、入力する。一致判定回路５３は２つの入力線が不一致であるため、出力に０を出す。このため、セレクタ５５で選ばれた出力は０になりアンド回路５９の出力は０になる。したがって、プロセッサ２４に対して割込を発生しない。すなわち、データが片側しか到着していなければプロセッサ２４に無駄な割込を発生しない。これにより、データ消費プログラムの実行を阻害しない効果が実現できる。
【００４９】
そして、メモリアクセス回路６０はフラグレジスタ５８に格納された更新済みのフラグの値１をＦａｄが示すフラグ格納領域［ｉ］へシステムバス２６を介して書き戻す。
【００５０】
（フラグに該当する領域に対するデータ転送が２つ目の場合）
同様にフラグの更新を行うが、今回はローカルメモリ２３のフラグ格納領域［ｉ］から読み出されたフラグの値は１である。したがって、演算回路５６で１を加算されたフラグの値は２になり、この値がフラグレジスタ５８に格納される。そして、一致判定回路５３の２つの入力は今回はどちらも２になるため、一致判定回路５３の出力は１になる。そして、アンド回路５９の２つの入力はＩｎｔが１であるため、出力に１を出す。これにより、イベント制御回路５００はプロセッサ２４に割込をかけることができ、プロセッサは使用可能なデータを受信したことを無駄なく知ることができる。
【００５１】
そして、メモリアクセス回路６０はフラグレジスタ５８に格納された更新済みのフラグの値２をＦａｄが示すフラグ格納領域［ｉ］へシステムバス２６を介して書き戻す。
【００５２】
（ノード＃２によるデータの消費）
ノード＃２はイベント制御回路５００から受け取ったデータ受信完了割込により、データの受信を知らされると次の手順でデータを消費する。すなわち、循環バッファ３８のフラグ３７をシステムバス２６を介して読み、フラグ３７の値が２のエントリを探索する。ここで値が２とはノード＃０、ノード＃１に分割されたデータを正しく受信できたことを示す。データ消費プログラム３２は正しく受信できたデータ格納領域からデータを取りだし、表示装置へ表示するなどの処理を行う。そして、このエントリに格納されたデータを消費し切ると次の手順で領域の解放を行う。すなわち、プロセッサ２４はシステムバス２６を介してローカルメモリ２３に格納された上記エリアに対応するフラグ格納領域に０を書き込む。これは該当するエリアには有効なデータが存在しないこと、すなわちこの領域が空き領域であることを表す。そして、循環バッファ３８の空き領域が増えたことをノード＃０およびノード＃１に伝えるために次の手順でメッセージを送信する。
【００５３】
（ノード＃２による循環バッファ３８の空き領域増加の伝達）
すなわち、システムバス２６を介してプロセッサ２４は送信パラメタ格納レジスタ４２に次の値を設定し、メッセージをノード＃０、ノード＃１に送信する。
【００５４】
Ｎａｄ：＝ノード＃０またはノード＃１の識別子
ＣＴＬ（Ｒ）：＝１［フロー制御レジスタ群宛のメッセージであることを示す］
ＣＴＬ（Ｒ＃）：＝宛先のフロー制御レジスタ識別子
Ｄａｄ：＝０［このメッセージでは参照されない］
Ｄｌｎ：＝０［このメッセージでは参照されない］
Ｆａｄ：＝０［このメッセージでは参照されない］
Ｉｎｔ：＝０［このメッセージでは参照されない］
Ｄ０：＝０［このメッセージでは参照されない］
Ｄ１：＝１［循環バッファ３８の空き容量の増分］
Ｃｔ０：＝０［このメッセージでは参照されない］
Ｃｔ１：＝加算を表すコード
Ｔａｄ：＝０［このメッセージでは参照されない］
このように送信パラメタを設定することにより、メッセージ生成回路４１はメッセージ１１を生成し、ネットワーク１へ送出する。そして、送信状態レジスタＳＴ４３に送信完了を表すコードを書き込む。
【００５５】
ネットワーク１はメッセージ１１のＮａｄが示すノード、ここではノード＃０またはノード＃１へメッセージを配送する。
【００５６】
次に上記メッセージを受信したノード＃０およびノード＃１の動作について説明する。
【００５７】
ノード２ではネットワーク１から受信したメッセージ１１を一時的に入力バッファ５１に格納し、各フィールドの切出しを行う。本メッセージはＣＴＬ（Ｒ）＝１であることから本メッセージはフロー制御レジスタに対する更新要求であると判断する。また、Ｃｔ１が「加算」であることから、イベント制御回路５００は演算回路５６とセレクタ５７、６１を制御してＤ１に格納された値１をフロー制御レジスタ［Ｒ＃］に格納された値に加算した結果をセレクタ５７の出力に出す。そして、この出力結果をフロー制御レジスタ［Ｒ＃」に書き戻す。また、このときＩｎｔは０であることから、アンド回路５９の出力は０であり、プロセッサ２４に対してイベント制御回路５００は割込を発生しない。
【００５８】
これにより、フロー制御レジスタに格納された循環バッファ５８の空き容量は１つ増えたことになる。
【００５９】
（読み出しの終了）
タイトルで指定されたデータを全て読み終えたデータ供給プログラム３１は次にデータの読み出しリクエストが来るまで待機する。
【００６０】
他方、データ消費プログラムは最後のデータを消費すると、次の手順にしたがって、データ供給ノードのフロー制御レジスタの値を初期値０に戻す。すなわち、システムバス２６を介してプロセッサ２４は送信パラメタ格納レジスタ４２に次の値を設定し、メッセージをノード＃０、ノード＃１に送信する。
【００６１】
Ｎａｄ：＝ノード＃０またはノード＃１の識別子
ＣＴＬ（Ｒ）：＝１［フロー制御レジスタ群宛のメッセージであることを示す］
ＣＴＬ（Ｒ＃）：＝宛先のフロー制御レジスタ識別子
Ｄａｄ：＝０［このメッセージでは参照されない］
Ｄｌｎ：＝０［このメッセージでは参照されない］
Ｆａｄ：＝０［このメッセージでは参照されない］
Ｉｎｔ：＝０［このメッセージでは参照されない］
Ｄ０：＝０［このメッセージでは参照されない］
Ｄ１：＝０［初期値］
Ｃｔ０：＝０［このメッセージでは参照されない］
Ｃｔ１：＝値設定を表すコード
Ｔａｄ：＝０［このメッセージでは参照されない］
このように送信パラメタを設定することにより、メッセージ生成回路４１はメッセージ１１を生成し、ネットワーク１へ送出する。そして、送信状態レジスタＳＴ４３に送信完了を表すコードを書き込む。
【００６２】
ネットワーク１はメッセージ１１のＮａｄが示すノード、ここではノード＃０またはノード＃１へメッセージを配送する。
【００６３】
次に上記メッセージを受信したノード＃０およびノード＃１の動作について説明する。
【００６４】
ノード２ではネットワーク１から受信したメッセージ１１を一時的に入力バッファ５１に格納し、各フィールドの切出しを行う。本メッセージはＣＴＬ（Ｒ）＝１であることから本メッセージはフロー制御レジスタに対する更新要求であると判断する。また、Ｃｔ１が「値設定」であることから、イベント制御回路５００はセレクタ５７にＤ１を選択するように制御し、フロー制御レジスタ群５２からＣＴＬ（Ｒ＃）で示されるレジスタに対し、Ｄ１に格納された０を書き込む。
【００６５】
これによりフロー制御レジスタ［Ｒ＃］には循環バッファ５８の空き容量として０が設定された。これにより、再びこのフロー制御レジスタを利用してフロー制御を行う場合に、読み出し開始要求が来るまでデータ供給プログラムが待機することを保証する。
【００６６】
以上の動作を行うことにより、データ消費ノード（ノード＃２）では分割されたデータが全て整ったときにのみ本来の処理であるデータ消費プログラム３２に割込がかかり、メッセージの受信処理を行えば良い。これにより、データ消費プログラムが邪魔されて、たとえば表示装置への表示処理が途切れて、画像が乱れることを防止できる。
【００６７】
また、循環バッファの空き容量の管理に関しては、メッセージが到着するごとにデータ消費プログラムが邪魔されることがなく、実際にバッファを解放したときにのみ空き容量をデータ供給プログラム３１へ伝達すればよい。本実施例の説明では循環バッファの１つのエントリを消費した場合について述べたが、データ消費プログラム３２の構造上の理由により、複数エントリを一括して消費しても構わない。この場合、データ消費ノードからデータ供給ノードに伝えられる循環バッファ３８の空き容量の増分は１より大きくなる。
【００６８】
そして、データ供給ノードではデータ供給プログラム３１はローカルに配置されたフロー制御レジスタの値を調べることにより、送信先の循環バッファ３８の空き容量を知ることができる。
【００６９】
このようにそれぞれのプログラムがローカルな情報に基づいて動作をできるため、並行処理を行うことができ、並列計算機の性能を向上させることができる。
【００７０】
（２）変形例
次に、上記で示した実施例１の変形例を示す。上記実施例１では分割されたデータの到着確認にデータ分割数を利用した。また上記実施例１では２分割であったため２であった。変形例では到着しているデータと到着していないデータを判別できるように上記実施例を変形して実現する。
【００７１】
変形例ではフラグ３７に格納される値の各ビットに対してデータ供給ノードからデータ到着済という意味を与える。
【００７２】
例えば、ノード＃０にはフラグのビット０を割り当て、ノード＃１にはビット１を割り当てる。
【００７３】
以下、このビット割り当てに基づき実施例１との相違点のみを説明する。
【００７４】
（ノード＃２による読みだしリクエスト）
実施例１では分割数２を知らせた代わりに変形例１では２＾０＋２＾１＝３、すなわちノード＃０とノード＃１の両方からデータが正しく到着したときのフラグの期待値を知らせる。ここで「＾」はべき乗を表す。さらに、ノード＃０に対しては、データを書き込むときに２＾０＝１をフラグに加算するように伝え、ノード＃１には２＾１＝２を加算するように伝える。
【００７５】
（データ供給ノードからのデータ転送）
データ供給ノードではデータをノード＃２に転送するときに送信パラメタ格納レジスタの値を実施例１とは異なり以下のように設定する。
【００７６】
Ｎａｄ：＝ノード＃２の識別子
ＣＴＬ（Ｒ）：＝０［フロー制御レジスタ宛ではなく、メモリ宛であることを示す］
Ｄａｄ：＝ノード＃０（またはノード＃１）用データ格納領域［ｉ］の先頭アドレス
一番最初はｉ＝０である。
【００７７】
Ｄｌｎ：＝データ長［上記データ格納領域［ｉ］の容量と同一］
Ｆａｄ：＝フラグ格納領域［ｉ］の先頭アドレス
一番最初はｉ＝０である。
【００７８】
Ｉｎｔ：＝１［割込を発生させることを示す］
Ｄ０：＝３［両方のデータ到着した時のフラグの期待値＝２＾０＋２＾１］
Ｄ１：＝２＾０＝１（ノード＃０の場合）または２＾１＝２（ノード＃１の場合）［フラグの増分を表す］
Ｃｔ０：＝０［一致判定を選択することを表す］
Ｃｔ１：＝加算を表すコード
Ｔａｄ：＝転送データ３６の先頭アドレス
（フラグに該当する領域に対するデータ転送が始めての場合）
この場合、フラグ領域［ｉ］に格納されたフラグは初期値０である。イベント制御回路５００は、ＣＴＬ（Ｒ）が０であることからセレクタ６１でフラグレジスタ５８を選択し、演算回路５６の一方に入力する。そして、演算回路５６のもう一方の入力にはＤ１すなわちここでは１または２を入力する。イベント制御回路５００はＣｔ１が加算を表すコードであることから演算回路５６とセレクタ５７を制御してセレクタ５７の出力に演算回路５６の二つの入力の加算結果を出力する。ここでは１または２である。そして、フラグレジスタ５８に書き戻す。次に、イベント制御回路５００はＣｔ０＝０すなわち、一致判定をしめすコードであることから、一致判定回路５３の一方の入力にＤ０、ここでは３を他方にはセレクタ６１で選択されている更新済のフラグレジスタ５８の内容、ここでは１または２を入力する。一致判定回路５３は２つの入力線が不一致であるため、出力に０を出す。このため、セレクタ５５で選ばれた出力は０になりアンド回路５９の出力は０になる。したがって、プロセッサ２４に対して割込を発生しない。すなわち、データが片側しか到着していなければプロセッサ２４に無駄な割込を発生しない。これにより、データ消費プログラムの実行を阻害しない効果が得られる。
【００７９】
そして、メモリアクセス回路６０はフラグレジスタ５８に格納された更新済みのフラグの値１または２をＦａｄが示すフラグ格納領域［ｉ］へシステムバス２６を介して書き戻す。
【００８０】
これによりデータ消費プログラム３２はフラグ格納領域［ｉ］を読み出すことにより、この値が０であればどちらも受信していないことを判別できる。そして、１であればノード＃０からだけデータを受信したことを判別できる。そして、２であればノード＃１からだけデータを受信したことを判別できる。３であれば、両方を受信していることを判別できる。
【００８１】
（フラグに該当する領域に対するデータ転送が２つ目の場合）
同様にフラグの更新を行うが、今回はローカルメモリ２３のフラグ格納領域［ｉ］から読み出されたフラグの値は１または２である。したがって、もう一方のデータを受信すると演算回路５６で２または１を加算されるため、フラグの値はどちらの場合も３になり、この値がフラグレジスタ５８に格納される。そして、一致判定回路５３の２つの入力は今回はどちらも３になるため、一致判定回路５３の出力は１になる。そして、アンド回路５９の２つの入力はＩｎｔが１であるため、出力に１を出す。これにより、イベント制御回路５００はプロセッサ２４に割込をかけることができ、プロセッサは使用可能なデータを受信したことを無駄なく知ることができる。
【００８２】
【発明の効果】
ノードは、一連のデータを分散されたノードへアクセスした際、分散されたノードから一連のデータの全体を受信したときに割り込みを発生するので、一連のデータの個々のデータを受信した時と比べ、割り込み回数を減らすことができ、当該ノードでの本来の処理を中断する回数が縁、ノードの処理効率を高めることができる。
【００８３】
また、ノードアクセス時にノードにあるアクセス結果を格納する空き数に応じてアクセス結果の応答を遅延させる手段を有するので、フロー制御信号をノード間で送受信する場合と比べ、フロー制御信号を送受信する必要が無く、ノード間の信号送受信に新たな負荷をかけることなく、高速なフロー制御を行うことができる。
【図面の簡単な説明】
【図１】本発明による並列計算機の構成図である。
【図２】図１の循環バッファ３８の詳細構成図である。
【符号の説明】
１  ネットワーク
２  ノード
２１  送信制御回路、
２２  受信制御回路、
２３  ローカルメモリ、
２４  プロセッサ、
２５  ディスク装置、
３８  循環バッファ、
４２  送信パラメタ格納レジスタ、
５００  イベント制御回路。
【図１】
0003789011.tif 000002
【図２】
0003789011.tif 000003