最初に、バリア同期と、リダクション演算とについて簡単に説明する。
バリア同期においては、図16に示すように、バリア同期を行なう複数のプロセス#0〜#3の各々は、その処理が同期をとるポイントつまりバリアポイントに到着した場合、自身の処理を停止する。即ち、複数のプロセス#0〜#3の各々は処理がバリアポイントに到達した場合、他のプロセスがバリアポイントに到着するのを待ち合わせる。複数のプロセス#0〜#3は、各々、バリア同期を行なう全てのプロセス#0〜#3がバリアポイントに到着した時点で、即ち、バリア同期が成立した時点で、待ち合わせ状態を解除し、停止した処理を再開する。これにより、並列処理されている複数のプロセス間で、並列処理の同期をとることができる。
このようなバリア同期を実現するアルゴリズムの一つに、バタフライ演算がある。以下、バタフライ演算を単に「バタフライ」と称する。バタフライにおいては、処理を複数のステージに分割し、ステージ毎に他のプロセスとバリア同期メッセージの通信を行なう。この例においては、バリア同期のアルゴリズムとして、バタフライが用いられる。
図17(A)は、4個のプロセス#0〜#3の間において、バタフライによるバリア同期を行なう例を示す。図17(A)における個々のプロセスは、図17(B)に示すように表される。図17(B)において、左上の数字は送信元プロセスを表し、左下の数字は送信元プロセスを表し、中央の数字は自プロセスを表し、右上の数字は送信先プロセス又は宛先プロセスを表し、右下の数字は送信先プロセス又は宛先プロセスを表す。プロセスは、プロセスを識別する識別情報であるプロセス番号で表される。
各々のステージにおけるバリアポイントに到着した旨を表すバリア同期メッセージ(以下、単に「メッセージ」と省略する場合がある)の送信先は、ステージ番号をk、自プロセス又は自ノード1のプロセス番号をiとすると、i XOR 2^(k−1)となる。XORは、排他的論理和演算を表す。ステージ数は、プロセス数Nが2のべき乗のとき、log(N)となる。
図18(A)は、4個のプロセス#0〜#3の間において、バタフライによるバリア同期を利用してリダクション演算を行なう例を示す。リダクション演算は、図17(A)に示すバタフライによるバリア同期を利用して実行される。従って、図18(A)は、基本的には、図17(A)と同様の処理の流れを示す。
図18(A)における個々のプロセスは、図18(B)に示すように表される。図18(B)は、基本的には図17(B)と同様の記号を表すが、さらに、リダクション演算の演算途中データを含む点のみが図17(B)と異なる。図18(B)において、中央の自プロセスを表すプロセス番号の下部に、演算途中データが示される。バリアポイント到着時のデータ及びバリア同期成立時のデータも、演算途中データとして表される。
以下、主として、バタフライによるバリア同期について説明する。
例えば、図17(A)において、プロセス#0に着目すると、以下のように送信先が予め定められる。即ち、ステージ#1において、バリアポイント到着を示すメッセージの送信先はプロセス#1である。ステージ#2において、プロセス#0からのバリアポイント到達を示すメッセージの受信元はプロセス#1であり、プロセス#0からのバリアポイント到達を示すメッセージの送信先はプロセス#2である。
これらのメッセージの送信先及び受信元は、設定条件において、バリア同期のアルゴリズム及び実行条件つまりプロセスの構成が定まることにより、一意に定めることができる。この例においては、バリア同期のアルゴリズムはバタフライであり、実行条件は4個のプロセスであるので、前述したように定めることができる。
各プロセスは、ステージ毎に他のプロセスとの間で同期メッセージを通信し合う。例えば、最初のステージ#1において、各プロセスは、バリア同期ポイントに到着する。到着のタイミングは、各プロセスで異なる。この場合、各プロセスは、バタフライネットワーク上における次ステージの予め設定されたプロセスに同期メッセージを送る。
次のステージ#2において、各プロセスは、バタフライネットワークの前のステージ#1の予め設定されたプロセスからの同期メッセージを待ち合わせる。各プロセスは、他のプロセスから同期メッセージを受信した場合、次のステージ#3の予め設定されたプロセスに同期メッセージを送る。
最後のステージ#3において、各プロセスは、前ステージ#2の予め設定されたプロセスからの同期メッセージを待ち合わせる。各プロセスが他のプロセスからの同期メッセージを受けると、全てのプロセス#0〜#3がバリアポイントに到着した後にバリア同期が成立した事を知る。この後、各プロセスは、バリア同期が成立したので、次の処理を開始する。
なお、リダクション演算においては、同期メッセージに代えて、同期メッセージ及びリダクション演算の演算対象である演算途中データが、各プロセスの間において送受信され、待ち合わせられる。演算途中データを受信したプロセスは、リダクション演算を実行して、リダクション演算により算出したデータを演算途中データとする。バリア同期の成立により、リダクション演算も完了する。
ここで、図19に示すように、4個のプロセス#0〜#3の各々が、異なる4個のノード101の上でそれぞれ動作しているとする。この場合において、例えばノード#0上で動作するプロセス#0に着目すると、プロセス#0のステージ#2は、自ノード#0のステージ#1からの同期メッセージと、他ノード#1のステージ#1からの同期メッセージとを、受信する。
自ノード#0のステージ#1からの同期メッセージは、例えばノード#0のバリア同期装置106内で送受信されるので、異なるノード間で同期メッセージを送受信する場合よりも短時間でプロセス#0のステージ#2に到達する。一方、他ノード#1のステージ#1からの同期メッセージは、自ノード#0と他ノード#1との間を、ネットワーク102を介して送受信されるので、自ノード#0のステージ#1からの同期メッセージよりも遅れてプロセス#0のステージ#2に到達する。他のノード101の他のステージについても、ネットワーク102を経由する同期メッセージは、バリア同期装置106内で送受信される同期メッセージに対して遅れる。従って、複数のノード#0〜#3の各ステージの間において、各プロセスからの同期メッセージの到着時間がばらつくことにより、同期の成立が各ノード間でばらつき、このばらつきがグローバルクロックにおいて位相差を生じる原因となる。
開示の並列計算機システム、同期装置、並列計算機システムの制御方法は、バリア同期において、複数のノードの間における同期の成立のばらつきをほぼ無くす。
図1は、バリア同期装置を含むノードを複数有するコンピュータネットワーク、換言すれば、並列計算機システムの構成の一例を示す。
並列計算機システムは、複数のノードつまりコンピュータ1と、これらのノードを接続するネットワーク2とを含む。図1の例においては、4個のノード#0〜ノード#3が並列計算機システムに設けられる。複数のノード1は、例えば、相互結合網であるネットワーク2を介して、相互に接続される。ネットワーク2により接続された複数のノード1は、並列演算を実行する。複数のノード1は、各々、並列演算におけるバリア同期のために、バリア同期装置6を含む。換言すれば、並列計算機システムは、複数のバリア同期装置6を含む。バリア同期装置6は高速でバリア同期を行う。
図1の並列計算機システムは、複数のノード1が相互に接続される一例として、ノード#0が、ノード#1〜ノード#3の各々と接続された状態を示す。また、図1においては、個々のノード1が、CPU3とバリア同期装置6とを含むことを、模式的に表している。
図2は、バタフライによりバリア同期を行うバリア同期装置を含むノードの構成の一例を示す。
ノード1は、CPU3と、メモリ4と、システム制御部5と、バリア同期装置6と、IO(Input Output)インタフェース部7と、ネットワークインタフェース部9とを含む。システム制御部5はノード1を制御する。即ち、システム制御部5は、CPU3、メモリ4、バリア同期装置6、IO(Input Output)装置11を制御する。CPU3は、設定処理部31を含む。システム制御部5は、IOインタフェース部7を介して、IO装置11に接続される。IOインタフェース部7は、システム制御部5に設けられるようにしても良い。バリア同期装置6は、ネットワークインタフェース部9を介して、ネットワーク2に接続される。ネットワークインタフェース部9は、バリア同期装置6に設けられるようにしても良い。
設定処理部31は、システム制御部5及びIOインタフェース部7を介して、IO装置11との間において、必要なデータの送受信を行う。これにより、IO装置11は、バリア同期のアルゴリズムと実行条件とを含む設定条件を、CPU3の設定処理部31に入力する。また、IO装置11は、必要に応じて、設定処理部31から出力されたデータを出力する。
設定処理部31は、システム制御部5を介して、バリア同期装置6に対してバリアポイント到達のメッセージを送信し、また、バリア同期装置6からバリア同期成立のメッセージを受信する。これにより、設定処理部31は、IO装置11から入力された設定条件に従って、バリア同期装置6における第1のバリア同期メッセージの送信先及び第2のバリア同期メッセージの送信先を、バリア同期装置6に設定する。バリア同期装置6は、設定条件に従って、ネットワーク2及びネットワークインタフェース部9を介して、他ノード1のバリア同期装置6との間で通信を行ない、当該通信に基づいて、バリア同期を行なう。
バリア同期装置6は、バタフライによるバリア同期を実行する。換言すれば、バリア同期装置6は、受けるデータの待ち合わせを行ない、前記待ち合わせたデータが揃った場合にデータを送信することにより同期を行う。具体的には、図1の並列計算機システムにおいて、複数のバリア同期装置6のうち、同期を行う第1の複数のバリア同期装置6の組の各々の間で、同期が実行される。更に、第1の複数の同期装置の組の各々の間で同期を完了した後、第1の複数の同期装置の組とは異なる第2の複数のバリア同期装置6の組の各々の間で、同期が実行される。
CPU3は、システム制御部5を介して、メモリ4との間において、必要なデータの送受信を行う。これにより、CPU3は、メモリ4にデータを書き込み、また、設定制御部31はメモリ4からデータを読み出す。このデータは、例えば、後述するリダクション演算に用いられるデータである。
図3は、バリア同期装置の構成の一例を示す。
バリア同期装置6は、受信装置61と、同期装置62と、送信装置63とを含む。従って、並列計算機システムは、複数の同期装置62を含む。同期装置62は、バリア同期装置6の主要部であるが、バリア同期装置6と区別するために、以下の説明においては、「同期部62」と言うこととする。
同期部62は、制御部621と、複数の制御レジスタ622と、ループ経路623と、遅延部624とを含む。制御部621は、チェック回路6211と、シーケンス回路6212と、レジスタアクセス回路6213と、遅延計算回路6214とを含む。複数の制御レジスタ622の各々は、後述するように、更に、図3に示す、複数のレジスタを含むレジスタ群である。
ループ経路623は、制御部621から送信された自ノード1へのデータを制御部621へ戻す通信経路である。遅延部624は、データを所定時間だけ遅延させる遅延回路であり、ループ経路623に設けられる。従って、制御部621は、自ノード1へのデータを送信する場合、ループ経路623及び遅延部624を介して、データを送信する。
複数の制御レジスタ622は、例えば、n個の同期メッセージの組#0〜#n−1に対応するように、n個設けられる。換言すれば、1個の制御レジスタ622は、1個のプロセスの1個のステージに対応する。複数の制御レジスタ622を含むことにより、各々の演算毎に同期メッセージを制御レジスタ622に保持し、バリア同期を実行することが可能となる。従って、1組の演算がn個の第1の同期メッセージで構成される場合、同期部62は、各々がn個の第1の同期メッセージで構成される複数の組について、各々、バリア同期を実行する。この場合、1個のノード1上で複数のプロセスが動作する。
図2の例においては、1個のノード1上で複数のプロセスが動作し、また、1組の演算が実行され、この1組の演算についてバリア同期を実行することができる。また、図2の例においては、1個のノード1上で複数のプロセスが動作する実施態様に代えて、1個のノード1上で1個のプロセスを動作させることができる。この場合、プロセスとノード1とは同様に取り扱っても良い。
図3に戻って、各々の制御レジスタ622は、シグナルレジスタ6221と、宛先レジスタ6222とを含む。宛先レジスタ6222は、実際には、複数のレジスタを含むレジスタ群である。例えば、各々の制御レジスタ622には、受信状態レジスタ、換言すれば、シグナルレジスタ6221と、宛先レジスタ6222とが含まれる。
制御部621は、同期を行う2以上の同期装置からの同期情報を、シグナルレジスタ6221に保持する。同期を行う2以上のバリア同期装置6は、自ノード1を含む。制御部621は、シグナルレジスタ6221に同期を行う2以上のバリア同期装置6からの同期情報を全て保持した場合に、自ノード1を含む同期を行う2以上のバリア同期装置6へのデータを送信する。換言すれば、制御部621は、制御レジスタ622に受信装置61により抽出された同期情報と自制御部621からの同期情報とが揃った場合(全ての同期情報が揃った場合)に、他ノード1へのデータを送信装置63に送信させ、自ノード1へのデータを遅延部624を介して自制御部621へ戻す。
具体的には、制御部621は、シグナルレジスタ6221に保持された同期情報に基づき、同期を行う2以上の同期装置のうち、他ノード1へのデータを送信装置63に送信させる。また、制御部621は、シグナルレジスタ6221に保持された同期情報に基づき、同期を行う2以上の同期装置のうち、自ノード1へのデータを、遅延部624を介することにより他ノード1へのデータに対して所定時間だけ遅延させて、自制御部へ戻す。
制御部621は、チェック回路6211において、各プロセスが受信したパケットの整合性のチェック処理を実行する。チェック回路6211は、受信装置61からの同期メッセージ及び宛先情報を取り込んで、これらに基づいて、パケットの整合性のチェック処理を実行する。チェック回路6211は、パケットの整合性のチェック結果を、シーケンス回路6212に入力する。例えば、チェック回路6211は、同期メッセージ及び宛先情報に基づいて、受信したパケットのシーケンス番号が正しいか否かを判断する。シーケンス番号が正しい場合にのみ、実際に、シグナルレジスタ6221に同期メッセージが保持される。チェック回路6211は、シーケンス番号が正しい場合に、バリア同期が成立しているか否かを判断する判断処理の実行を、シーケンス回路6212へ指示する。
制御部621は、シーケンス回路6212において、バリア同期のメッセージの送信指示を送信装置63へ出力する。これにより、送信装置63は、バリア同期のメッセージを、例えば他のノード1へ送信する。シーケンス回路6212は、レジスタアクセス回路6213による制御レジスタ622の参照結果と、CPU3からのバリア発行指示とを取り込んで、両者に基づいて、バリア同期が成立しているか否かを判断する。制御部621は、シーケンス回路6212において、バリア同期が成立している場合、バリア同期のメッセージの送信指示を送信装置63へ出力し、バリア同期の成立通知をCPU3へ送信する。
また、制御部621は、シーケンス回路6212において、バリア同期が成立している場合、バリア同期のメッセージの送信指示を、ループ経路623及び遅延部624を介して、自制御部へ戻す、換言すれば、再入力する。これにより、制御部621は、バリア同期のメッセージを自ノード1へ送信する。シーケンス回路6212は、レジスタアクセス回路6213による制御レジスタ622の参照結果と、CPU3からのバリア発行指示とを取り込んで、両者に基づいて、バリア同期のメッセージを自己に送信する。
シーケンス回路6212は、バリア同期のメッセージを自ノード1へ送信する場合、遅延計算回路6214へ遅延値の算出を指示する。この時、レジスタアクセス回路6213は、シーケンス回路6212の指示に従って、制御レジスタ622の参照結果を遅延計算回路6214へ送信する。
制御部621は、レジスタアクセス回路6213において、制御レジスタ622の宛先レジスタ6222に設定情報を設定する。設定情報は、ライトデータとしてCPU3の設定処理部31から入力される。設定情報を設定する制御レジスタ622は、ライトアドレスを含むライト制御信号としてCPU3の設定処理部31から入力される。
制御部621は、レジスタアクセス回路6213において制御レジスタ622を参照し、制御レジスタ622の参照結果に基づいてシーケンス回路6212においてバリア同期のための同期メッセージを送信する。レジスタアクセス回路6213は、シーケンス回路6212において制御レジスタ622を参照する。同期メッセージの送信は、実際には、シーケンス回路6212の指示により、送信装置63が行う。制御レジスタ622において、シグナルレジスタ6221は、以下に説明する制御レジスタ622に対応するプロセス又はノードから同期メッセージを受信したか否かを示す同期情報を格納する。換言すれば、シグナルレジスタ6221は、同期メッセージの待ち合わせ状況を示す同期情報を格納する。宛先レジスタ6222は、制御レジスタ622が同期メッセージを送信すべき宛先であるプロセス又はノードを示す送信先情報と、制御レジスタ622に対応し同期メッセージを送信する送信元であるプロセス又はノードを示す送信元情報と、を含む設定情報を格納する。換言すれば、宛先レジスタ6222は、同期成立の後に同期メッセージの送信先及び送信元を示す情報を格納する。
同期情報は、同期メッセージに含まれる同期信号に基づいて定まる同期の状態を示す情報であり、シグナルレジスタ6221に保持される情報である。同期メッセージに含まれる同期信号は、バリア同期のメッセージに含まれる情報であって、図5を参照して後述するように、例えば、タイプ、宛先ノードアドレス、送信元ノードアドレス、送信元ステージ番号、宛先ステージ番号、シーケンス番号である。同期信号は、バリア同期のメッセージに含まれた形態で送受信される。従って、同期信号の送受信を行うことは、同期信号を含むバリア同期のメッセージの送受信を行うことである。バリア同期のメッセージに含まれた同期信号は、バリア同期のメッセージから抽出される。
宛先レジスタ6222は、設定情報を格納する。具体的には、宛先レジスタ6222は、「宛先ノードアドレス」「宛先ステージ番号」「送信元ノードアドレス」「送信元ステージ番号」を含む設定情報を格納する。なお、宛先レジスタ6222において、「宛先ノードアドレス」及び「宛先ステージ番号」を格納するレジスタを「Dest.」と表示し、「送信元ノードアドレス」及び「送信元ステージ番号」を格納するレジスタを「Address」と表示している。宛先ノードアドレス等については、図5を参照して後述する。設定情報を指定することにより、1個のノード1における1個の制御レジスタ622が定まる。
宛先レジスタ6222は、同期メッセージの送信先が自ノード1である場合、自プロセス又は自ノード1の制御レジスタ622を指定する設定情報を格納する。
バリア同期の実行に先立って、IO装置11から設定処理部31に、設定条件が入力される。この例においては、設定条件において、バリア同期のアルゴリズムはバタフライとされ、実行条件は例えば4個のプロセスとされる。これに加えて、実行条件として、当該演算つまりバリア同期におけるステージ数kと、各々のプロセス自身つまり自ノード1のプロセス番号iも入力される。
なお、設定処理部31への設定条件の入力は、これに限られない。例えば、いずれか1個のノード1が、ネットワーク2を介して、他ノード1に各々の設定条件を入力するようにしても良い。また、ネットワーク2に接続された管理用のコンピュータが、ネットワーク2を介して、全てのノード1に各々の設定条件を入力するようにしても良い。
また、バリア同期の実行に先立って、CPU3の設定処理部31は、制御部621を介して、制御レジスタ622に、設定条件に基づいて、前述の設定情報を設定する。前述したように、設定条件は、バリア同期のアルゴリズムと実行条件とを含む。
この設定の後、設定処理部31が、制御部621にバリア同期開始信号を送信することにより、バリア同期が開始される。プロセスの最後のステージにおいて同期が成立した場合、同期部62は、バリア同期成立、つまりバリア同期完了を示す信号を設定処理部31に送る。
制御部621は、遅延計算回路6214において、シーケンス回路6212の指示に従って、レジスタアクセス回路6213からの制御レジスタ622の参照結果に基づいて、遅延値を算出する。遅延計算回路6214は、算出した遅延値を遅延部624に送信する。
算出した遅延値は、遅延部624における遅延の実時間である。
遅延計算回路6214は、以下のようにして、遅延値を算出する。
例えば、並列計算機システムが、図4に示すように、論理的に2次元トーラス結合された複数のノード1を含むコンピュータネットワーク100を含むとする。複数のノード1の間はネットワーク2により接続される。図4の並列計算機システムにおいて、論理的に隣接するノード1の間の距離が「1ホップ」である。1ホップ当りの通信遅延時間が「Td」であるものとする。通信遅延時間Tdは、バリア同期装置6が、他ノード1のバリア同期装置6へのデータ、換言すれば、バリア同期のメッセージの送信に要する時間に等しい時間であり、経験的に予め知ることができる。
図4に示すように、並列計算機システムにおいて、論理ネットワーク上の自ノードアドレスが(X,Y)=(2,5)であり、宛先ノードアドレスが(X,Y)=(2,7)であるとする。ここで、X及びYは、各々、2次元の論理ネットワークにおけるネットワークアドレスのx座標及びy座標である。
この場合、自ノード1と宛先ノード1との間における、X軸方向のホップ数は、2−2=0である。また、自ノード1と宛先ノード1との間における、Y軸方向のホップ数は、7−5=2である。従って、自ノード1と宛先ノード1との間におけるホップ数は、Y軸方向に「2ホップ」である。これにより、図4の例における、自ノード1と宛先ノード1との間における遅延値は、(ホップ数)×(1ホップ当りの通信遅延時間)=2Tdとなる。
遅延計算回路6214は、バリア同期のメッセージに含まれる自ノードアドレス及び宛先ノードアドレスに基づいて自ノード1と宛先ノード1との間におけるホップ数を算出する。更に、遅延計算回路6214は、算出したホップ数に1ホップ当りの通信遅延時間を乗じて、遅延値を算出し、算出した遅延値を遅延部624に設定する。
なお、並列計算機システムは、3次元メッシュ結合されたコンピュータネットワークのように、論理的に隣接するノード1のみが接続されるn次元のコンピュータネットワークであって良い。ここで、nは2以上の整数である。
受信装置61は、ネットワーク2及びネットワークインタフェース部9を介して他ノード1と接続される受信部である。受信装置61は、並列計算機システムにおける複数のバリア同期装置6のうち、自ノード1と同期を行う他ノード1のバリア同期装置6からのデータを受信し、受信した他ノード1のバリア同期装置6からのデータから同期情報を抽出する。
具体的には、受信装置61は、他ノード1からのバリア同期のためのパケット、換言すれば、バリア同期のためのデータを受信する。受信装置61は、バリア同期のアルゴリズムと実行条件とを含む設定条件に従ってその送信先が予め設定された第1のバリア同期メッセージを受信した場合、受信した第1のバリア同期メッセージを同期部62に送信する。このため、受信装置61は、ネットワーク2を介して、他ノード1のバリア同期装置6から、バリア同期のためのパケットを受信する。
一方、前述したように、自ノード1からのバリア同期のためのパケット、換言すれば、バリア同期のためのデータは、ループ経路623及び遅延部624を介して送受信される。従って、受信装置61は、自ノード1からのバリア同期のためのパケットを受信しない。
パケットを受信した場合、受信装置61は、受信したパケットに基づいて、同期信号及び宛先情報を生成して、同期部62に送信する。具体的には、受信装置61は、受信したパケットに含まれる同期信号及び宛先情報を取り出し、同期部62に送信する。同期信号及び宛先情報については、図5を参照して後述する。
なお、送信元のノードが複数存在する場合において、受信装置61が送信元となるノード1の数に対応した数だけのネットワークインタフェース部9を含む場合、複数の受信装置61を用いて複数のノードから送信されるパケットを同時に受信することができる。これは送信装置63においても同様である。
図5は、パケットのフォーマットを示す図である。
プロセス#0〜プロセス#3の間において相互に送受信されるパケットは、例えば、図5に示すようなフォーマットを有する。パケットは、例えば、ヘッダCRC(Cyclic Redundancy Check)、ルーティングヘッダ、タイプ、宛先ノードアドレス、送信元ノードアドレス、送信元ステージ番号、宛先ステージ番号、シーケンス番号、パケットCRC(Cyclic Redundancy Check)を含む。パケットに含まれる同期信号は、例えば、タイプ、宛先ノードアドレス、送信元ノードアドレス、送信元ステージ番号、宛先ステージ番号、シーケンス番号である。宛先情報は、例えば、宛先ノードアドレス、宛先ステージ番号である。
ヘッダCRCは、ルーティングヘッダ用の誤り検出符号である。ルーティングヘッダは、ルータが、パケットの送信において、次の宛先を決定するための情報である。ルータは、ネットワーク2において、パケットの転送を実行するネットワークインタフェースに含まれる中継装置である。
タイプは、パケットのタイプを示す情報である。換言すれば、タイプがバリアを示すタイプである場合に、パケットがバリア同期のメッセージであることを示す。
宛先ノードアドレスは、パケットの宛先ノード1のネットワーク2上のアドレスを示す。バリア同期装置6が、各ステージでバリアパケットを送信する際に、バリア同期装置6の設定情報レジスタに予め設定されている宛先ノードアドレスをパケットに埋め込む。
送信元ノードアドレスは、パケットの送信元ノード1のネットワーク2上のアドレスを示す。バリア同期装置6が、各ステージでバリアパケットを送信する際に、自ノードアドレスをパケットに埋め込む。パケットを受信したバリア同期装置6(の制御部621)が、本フィールドの値と、バリア同期装置6の設定情報レジスタに予め設定されている送信元ノードアドレスとを比較して、パケットの受信可/不可の判定に使用される。
送信元ステージ番号は、パケット送信元ノード1のバリア同期装置6でのステージ番号である。バリア同期装置6が、各ステージでバリア同期メッセージに対応するバリアパケットを送信する際に、ステージ番号を送信元ステージ番号としてパケットに埋め込む。パケットを受信したバリア同期装置6(の制御部621)が、本フィールドの値と、バリア同期装置6の設定情報レジスタに予め設定されている送信元ステージ番号とを比較して、パケットの受信可/不可の判定に使用される。
送信先ステージ番号は、パケット送信先ノードバリア同期装置6でのステージ番号を示す。バリア同期装置6が、各ステージでバリア同期メッセージに対応するバリアパケットを送信する際に、バリア同期装置6の設定情報レジスタに予め設定されている宛先ステージ番号をパケットに埋め込む。パケットを受信したバリア同期装置6(の制御部621)が、本フィールドの値を参照して、設定情報レジスタの選択(ステージ選択)に使用される。
シーケンス番号は、バリア同期装置6が各ステージでバリア同期メッセージに対応するバリアパケットを送信する際に付加する番号である。
パケットCRCは、パケット全体の誤り検出符号である。
図3に戻って、同期部62は、受信装置61及び自ノード1の制御部621からの同期信号及び宛先情報に基づいて、バリア同期の処理を行なう。このために、同期部62は、複数組の同期信号(バリア同期メッセージ)の待ち合わせを行ない、各組で同期成立の後、同期信号としてのバリア同期のメッセージを宛先情報により指定された送信先に送信する。これにより、バリア同期を行なうアルゴリズムにおいて、ステージ毎にバリアポイント到着の信号の送信先を変更する処理を高速に行なうことができる。同期信号(バリア同期メッセージ)の各組に対しては、一意に定まる設定情報が割り当てられる。同期部62は、同期信号としてのバリア同期のメッセージを受信し、同期が成立した組について、対応する同期信号を出力する。
例えば、同期部62は、各々の同期信号(バリア同期メッセージ)の組について、設定条件に従って予め設定されたn(nは正の整数)個の第1のバリア同期メッセージについての同期を取る。各組において、n個のバリア同期メッセージが入力された場合、同期成立となる。同期部62は、同期成立の後に、第2のバリア同期メッセージの送信を送信装置63に指示する。第2のバリア同期メッセージは、m(mは正の整数)個とされ、各々について設定条件に従ってその送信先が予め設定される。
同期が成立した場合、同期部62は、各組について、予め設定された送信先にバリア同期メッセージを送信する。送信先は、他ノード1の同期部62、又は、自ノード1の制御部621である。バリア同期メッセージの送信先が他ノード1である場合、送信先ノード1の宛先ノードアドレスを含む設定情報が同期部62に予め設定されている。この場合、同期部62は、送信装置63にパケットの送信指示の信号を送る。同期部62からのパケット送信指示を受けた送信装置63は、ネットワーク2を介して、宛先ノードアドレスで指定される他ノード1のバリア同期装置6に、バリア同期のためのパケットを送信する。
一方、バリア同期メッセージの送信先が自ノードである場合、同期部62には自ノード1の制御部621を指示する設定情報が予め設定されている。同期部62は、自プロセス又は自ノード1の制御部621の指定された制御レジスタ622にバリア同期メッセージを送信する。自ノード1の制御部621へのバリア同期メッセージの送信が実行されると、バリア同期メッセージは、実際には、制御部621からループ経路623を介して遅延部624へ送信される。これにより、バリア同期メッセージが制御部621へ入力されるまでの時間が、所定時間だけ遅延される。自ノード1へのバリア同期メッセージは、例えば、図5のパケットにおける同期信号の部分のみを含む。
なお、同期部62は、CPU3の設定処理部31からバリア同期開始の信号を受信した場合、指定された送信先に対してバリア同期メッセージを送る。同期部62は、バリア同期メッセージの最後の組で同期が成立した場合、バリア同期完了の信号をCPU3の設定処理部31に通知する。
送信装置63は、ネットワーク2及びネットワークインタフェース部9を介して他ノード1と接続される送信部である。送信装置63は、並列計算機システムにおける複数のバリア同期装置6のうち、自ノード1と同期を行う他ノード1のバリア同期装置6へのデータを送信する。同期を行う2以上のバリア同期装置6には、自ノード1のバリア同期装置6が含まれる。
具体的には、送信装置63は、他ノード1へのバリア同期のためのパケット、換言すれば、バリア同期のためのデータを送信する。送信装置63は、バリア同期のアルゴリズムと実行条件とを含む設定条件に従ってその送信先が予め設定された第1のバリア同期メッセージを送信した場合、送信した第1のバリア同期メッセージを同期部62に送信する。このため、送信装置63は、ネットワーク2を介して、他ノード1のバリア同期装置6へ、バリア同期のためのパケットを送信する。
また、送信装置63は、自ノード1のバリア同期装置6の制御部621へ、バリア同期のためのパケット、換言すれば、バリア同期のためのデータを送信する。この場合、バリア同期のためのパケットは、前述したように、ループ経路623及び遅延部624を介して、送受信される。従って、前述したように、送信装置63が自ノード1へのバリア同期のメッセージを送信することはない。
送信装置63は、同期部62からの送信の指示を受信した場合、予め設定されたm個の送信先に、第2のバリア同期メッセージを送信する。このため、送信装置63は、同期部62からパケット送信指示の信号を受け取り、指定された送信先に基づいて、パケットを生成して、ネットワーク2を介して、他ノード1に送信する。前述したように、送信先となるノード1は、設定情報に基づいて定められる。
図6は、遅延部の構成の一例を示す図である。
遅延部624は、1個の遅延回路6241を含む。遅延回路6241は、同期信号記憶部6242と、タイマ部6243とを含む。同期信号記憶部6242は、制御部621から自ノード1宛てのバリア同期のメッセージを受信し、受信したバリア同期のメッセージを一時的に記憶するレジスタである。タイマ部6243は、制御部621から指示された遅延値をカウントする。
例えば、同期信号記憶部6242は、制御部621から自ノード1宛てのバリア同期のメッセージを受信する。自ノード1宛てのバリア同期のメッセージを受信した同期信号記憶部6242は、バリア同期のメッセージの受信通知をタイマ部6243に出力すると共に、自ノード1宛てのバリア同期のメッセージを一時的に記憶する。受信通知を受信したタイマ部6243は、カウントを開始して、カウント値が遅延値に達すると、バリア同期のメッセージの送信指示を同期信号記憶部6242に出力する。タイマ部6243は、カウント値が遅延値に達すると、カウント値が再度「0」とされる。
バリア同期のメッセージの送信指示を受信した同期信号記憶部6242は、一時的に記憶している自ノード1宛てのバリア同期のメッセージを、制御部621に出力する。この出力の後、同期信号記憶部6242は、一時的に記憶している自ノード1宛てのバリア同期のメッセージを消去する。
遅延部624の構成は、図6の構成に限られず、種々の構成とすることができる。
例えば、図7に示すように、遅延部624’が、1個の入力回路6244と、複数の遅延回路6241と、1個の出力回路6245とを含むようにしても良い。各々の遅延回路6241は、同期信号記憶部6242と、タイマ部6243とを含む。
図7において、複数の遅延回路6241の各々は、複数の制御レジスタ622の各々に対応するように設けられる。入力回路6244は、受信したバリア同期のメッセージに基づいて、受信したバリア同期のメッセージを処理する制御レジスタ622に対応する遅延回路6241を選択し、選択した遅延回路6241に受信したバリア同期のメッセージを入力する。出力回路6245は、複数の遅延回路6241から出力されたバリア同期のメッセージをマルチプレクスして、制御部621に出力する。
これにより、1個のノード1上において複数のプロセスが動作する場合において、複数のプロセスの各々について、プロセス毎に異なる遅延値を用いてプロセス毎に適した遅延処理を実現することができる。この結果、複数のノードの間における同期の成立のばらつきをほぼ無くすことができる。
遅延部624は、同期部62の内部以外に設けるようにしても良い。例えば、遅延部624は、制御部621の内部に設けても良い。また、遅延部624は、同期部62の外部であって、バリア同期装置6の内部に設けても良い。
図8は、図3のバリア同期装置が実行する、バタフライによるバリア同期処理の処理フローを示す。
CPU内に設定された設定処理部31は、バリア同期を開始する前に、バリア同期のアルゴリズムと設定条件とに基づいて、各々の制御レジスタ622の宛先レジスタ6222に、バタフライでの次ステージに対応した宛先ノードアドレスと宛先ステージ番号を設定する(ステップS11)。宛先ノードアドレスと宛先ステージ番号を設定することにより、前述したように、1個のプロセスの1個のステージに対応する1個の制御レジスタ622が定まる。
このために、設定処理部31は、宛先ノードアドレス及び宛先ステージ番号を設定すべき制御レジスタ622の宛先ステージ番号を、ライトアドレスとして同期部62に入力する。また、設定処理部31は、制御レジスタ622の宛先レジスタ6222に設定すべき宛先ノードアドレスと宛先ステージ番号とを、ライトデータとして同期部62の制御部621に入力する。ライトアドレス及びライトデータは、制御レジスタ622毎に入力される。これに応じて、制御部621は、入力されたライトデータである宛先ノードアドレス及び宛先ステージ番号を、ライトアドレスにより指定された制御レジスタ622の宛先レジスタ6222に格納する。ライトデータの格納は、実際には、設定処理部31からのライトアドレス及びライトデータを受信した制御部621により実行される。一方、これとは別に、シグナルレジスタ6221の初期値は、例えば予め「0」とされる。
宛先ノードアドレスと宛先ステージ番号との設定は、例えば以下のように行われる。ノード数が2のべき乗である場合、バタフライにおいては、同期成立の後、自プロセス又は自ノードの次ステージと、他ノードでの次ステージの2箇所に対して、バリア同期メッセージが送信される。従って、宛先レジスタ6222に指定する宛先は、自プロセス又は自ノードの宛先ステージ番号、又は、他ノードの宛先ノードアドレス及び宛先ステージ番号のいずれかである。
最初のステージにおいては、バリア同期メッセージの待ち合わせを行なわないので、シグナルレジスタ6221は使用しない。一方、最後のステージにおいては、宛先レジスタ6222は使用しない。従って、最初のステージと最後のステージにおいて、使用するレジスタは重複しない。そのため、最初と最後のステージにおいては同一の制御レジスタ622が指定される。なお、最初のステージと最後のステージにおいて使用するレジスタが重複しない場合でも、最初と最後のステージにおいて異なる制御レジスタ622が指定されるようにしても良い。
ノード数が2のべき乗でない場合、ノード数を2のべき乗にするためにネットワーク2に追加される追加ノードが持つ制御レジスタ622を、他のノードに持たせる。例えば、図9でノード#0〜#3でバリア同期を取りたい場合は、ノードの持つ制御レジスタ622をノード#0〜#3のいずれかに持たせる。この場合、必要となるのは中継ステージに相当する制御レジスタのみであるので、中継ステージに相当する制御レジスタ#2をノード#1〜#3のいずれかのノードに持たせる。更に、最初のステージにおいて、制御レジスタの送信先のシグナルレジスタ6221の値を予め「1」に設定する。最後のステージにおいて、制御レジスタの送信元の宛先レジスタ6222から最初のステージの制御レジスタを外す。
設定処理部31は、プロセスがバリアポイントに到達した場合、バリア同期装置6の同期部62に対しバリア同期開始の信号を送る(ステップS12)。バリア同期開始信号は最初のステージに対応する制御レジスタ622の番号を含む。最初のステージにおいては、他のプロセスからバリア同期メッセージを含むパケットを受信することは無いので、受信装置61から同期信号及び宛先が制御部621に送信されることも無い。
同期部62の制御部621は、バリア同期開始の信号を受信すると、バリア同期開始信号にて指定された番号に対応する制御レジスタ622の宛先レジスタ6222の値「Destination」を読む(ステップS13)。この読取のために、制御部621は、バリア同期開始信号にて指定された宛先ステージ番号をリードアドレスとして用いて、当該アドレスの制御レジスタ622の宛先レジスタ6222の値をリードデータとして読み出す。最初のステージに対応する制御レジスタ622のシグナルレジスタ6221は使用されず、従って、バリア同期メッセージの待ち合せも行われない。
制御部621は、宛先レジスタ6222の値の中の他ノード1の制御レジスタ622を指定する値に基づいて、送信装置63に対しパケット送信指示の信号を出すと共に、宛先レジスタ6222の値の中の自ノード1の制御レジスタ622を指定する値に基づいて、遅延部624へバリア同期メッセージを送信する(ステップS14)。パケット送信指示は、他ノード1を指示する宛先レジスタ6222の値を含む。
送信装置63は、制御部621からのパケット送信指示で指定された宛先ノードアドレスおよび宛先ステージ番号に基づいて、パケットを生成し、パケットをネットワーク2へ送信する。このパケットは、他ノード1宛のバリア同期のメッセージ、換言すれば、同期信号を含む同期メッセージである。このパケットの送信先は、指定された宛先ノードアドレスおよび宛先ステージ番号である。一方、制御部621が遅延部624へ送信する同期信号は、自ノード1宛のバリア同期のメッセージに相当する。例えば、制御部621が遅延部624へ送信する同期信号は、図5のパケットから、ヘッダCRC、ルーティングヘッダ、パケットCRCを除いたものである。
遅延部624は、制御部621から受信した遅延値に相当する時間だけ、制御部621から受信した同期信号の送信を保留し(ステップS15)、遅延値に相当する時間、換言すれば、遅延時間が経過したか否かを判断する(ステップS16)。遅延時間が経過しない場合(ステップS16 No)、遅延部624は、ステップS15を繰り返す。遅延時間が経過した場合(ステップS16 Yes)、遅延部624は、保持している同期信号を、制御部621へ送信する(ステップS17)。
制御部621は、宛先レジスタ6222の値の中の自ノードの制御レジスタ622を指定する値に基づいて、宛先レジスタ6222において指定された制御レジスタ622のシグナルレジスタ6221の値を読む(ステップS18)。換言すれば、自ノードの次ステージにおける制御レジスタ622のシグナルレジスタ6221の値「signal」が読み出される。これは、自ノードの同期部62に同期信号を送り、自ノードでの同期の待ち合わせを行うためである。
続いて、制御部621が、次ステージのシグナルレジスタ6221に同期状態を示す「1」が設定されているか否かを調べる(ステップS19)。シグナルレジスタ6221に「1」が設定されている場合(ステップS19 Yes)、同期成立となる。一方、シグナルレジスタ6221に「1」が設定されていない場合(ステップS19 No)、同期は成立していない。
同期が成立していない場合(ステップS19 No)、同期部62が、次ステージの制御レジスタ622のシグナルレジスタ6221の値Signalを「1」に設定し、これ以後、パケットの受信を待ち合わせる(ステップS110)。この設定のために、制御部621は、読み出した宛先レジスタ6222の値の中の自ノードを指定する値をライトアドレスとして用いて、当該アドレスの制御レジスタ622のシグナルレジスタ6221に「1」をライトデータとして書き込む。これにより、待ち合わせすべき同期信号の一方を受信したことが示される。
この後、受信装置61は、パケットを受信した場合、受信したパケットに基づいて、同期信号と宛先となる宛先ノードアドレスと宛先ステージ番号とを取り出し、同期部62に送信する(ステップS111)。
同期部62の制御部621は、受信装置61からの信号を受信した場合、指定された制御レジスタ622のシグナルレジスタ6221の値を読み取る(ステップS112)。この後、ステップS19を繰り返す。例えば、制御部621は、受信装置61からの同期信号と宛先とを受信すると、受信した宛先ステージ番号に基づいて、制御レジスタ622のシグナルレジスタ6221の値を読取る。この読取のために、制御部621は、指定された宛先ステージ番号をリードアドレスとして用いて、当該アドレスの制御レジスタ622のシグナルレジスタ6221の値を、リードデータとして読み出す。
一方、ステップS19において同期が成立している場合(ステップS19 Yes)、制御部621は、更に、制御レジスタ622が最後のステージに対応したものか否かを調べる(ステップS113)。例えば、先にステップS110が実行された後に再度ステップS19が実行された場合には、制御レジスタ622のシグナルレジスタ6221の値は、「1」である。従って、この場合、同期が成立する。
最後のステージに対応する制御レジスタ622で同期が成立した場合(ステップS113 Yes)、制御部621は、バリア同期成立の信号をCPUの設定処理部31に送る(ステップS114)。設定処理部31は、制御部621からのバリア同期成立の信号を受け取り、バリア同期成立を知る(ステップS115)。
ステップS113において制御レジスタ622が最後のステージに対応したものでない場合(ステップS113 No)、制御部621は、ステップS14を繰り返す。
図9は、図8のバタフライによるバリア同期処理における各ステージ間での同期メッセージの流れを示す。
図9において、ノード#0に着目すると、以下のように同期メッセージが流れる。例えば、ステージ#1において、ノード#0は、バリアポイントに到達した場合、バリア同期開始信号の入力により同期開始を指示される。これに応じて、ノード#0は、ステージ#1において、予め指示された宛先であるノード#0及びノード#1に、同期メッセージを送信する。ノード#0はノード#0にとって自ノード1であり、ノード#1はノード#0にとって他ノード1である。
ここで、ノード#0のステージ#1から、他ノード1、換言すれば、ノード#1のステージ#2に送信される同期メッセージは、ネットワーク2を介して、ノード#2のステージ#2に到達する。これに対して、ノード#0のステージ#1から、自ノード1、換言すれば、ノード#1のステージ#2に送信されるバリア同期メッセージは、遅延部624を介して、ノード#1のバリア同期装置6の内部で送受信される。
また、ノード#1のステージ#1からノード#1のステージ#2に送信される同期メッセージ、ノード#2のステージ#1からノード#2のステージ#2に送信される同期メッセージ、ノード#3のステージ#1からノード#3のステージ#2に送信される同期メッセージも、各々の遅延部624を介して、自ノード1のバリア同期装置6の内部で送受信される。
ステージ#2において、自己の同期信号を受信したノード#0は、予め指示されたノード#1からのバリア同期メッセージを待ち合わせる。ノード#0のステージ#2において待ち合わせられるバリア同期メッセージは、ノード#1がバリアポイントに到達した後に、同様にして、ノード#1からノード#0に到達する。ノード#1からのバリア同期メッセージが到達した場合、ノード#0において、自己の同期信号と、ノード#1からのバリア同期メッセージに含まれる同期信号との待ち合わせつまり2つの信号の同期が成立する。
この時、前述したように、自己の同期信号はネットワーク2と同等の遅延を生じる遅延部624を介して受信され、他ノード1からのバリア同期メッセージはネットワーク2を介して受信される。これにより、ノード#0〜ノード#3のステージ#2の各々において、同時に同期が成立する。この結果、バリア同期において、複数のノードの間における同期の成立のばらつきをほぼ無くすことができる。
ステージ#2において同期が成立すると、ノード#0は、予め指示された宛先であるノード#0に同期信号を送信し、ノード#2にバリア同期メッセージを送信する。
ここで、ノード#0のステージ#2から、ノード#2のステージ#3に送信されるバリア同期メッセージは、ネットワーク2を介して、ノード#2のステージ#3に到達する。これに対して、ノード#0のステージ#2から、ノード#0のステージ#3に送信される同期信号は、遅延部624を介して、ノード#0のバリア同期装置6の内部で送受信される。ノード#1のステージ#2からノード#1のステージ#3に送信される同期信号、ノード#2のステージ#2からノード#2のステージ#3に送信される同期信号、ノード#3のステージ#2からノード#3のステージ#3に送信される同期信号も、各々の遅延部624を介して、自ノード1のバリア同期装置6の内部で送受信される。
ステージ#3において、自己の同期信号を受信したノード#0は、予め指示されたノード#2からのバリア同期メッセージを待ち合わせる。ノード#0のステージ#3において待ち合わせられるバリア同期メッセージは、ノード#2がバリアポイントに到達し、かつ、バリアポイントに到達したノード#4からのバリア同期メッセージを受信した後に、同様にして、ノード#2からノード#0に到達する。ノード#2からのバリア同期メッセージが到達した場合、ノード#0において、自己の同期信号と、ノード#2からのバリア同期メッセージとの同期が成立する。
この時、前述したように、自己の同期信号はネットワーク2と同等の遅延を生じる遅延部624を介して受信され、他ノード1からのバリア同期メッセージはネットワーク2を介して受信される。これにより、ノード#0〜ノード#3のステージ#2の各々において、同時に同期が成立する。この結果、バリア同期において、複数のノードの間における同期の成立のばらつきをほぼ無くすことができる。
ステージ#3において同期が成立すると、ノード#0は、バリア同期が成立したと判定して、バリア同期成立信号を出力する。
ノード#1〜3においても、同様にして、ステージ#3において、バリア同期が成立し、バリア同期成立信号が出力される。これにより、バタフライによるバリア同期が実行される。
次に、バタフライによりバリア同期を行いつつリダクション演算を行うリダクション演算装置を含む並列計算機について説明する。
図10は、バタフライによりバリア同期を行いつつリダクション演算を行うリダクション演算装置を含むノードの構成の一例を示す。図11は、図10のリダクション演算装置の構成の一例を示す。
図10のリダクション演算装置8は、図1に示す並列計算機システムを構成するノード1に設けられる。図10の例において、ノード1は、図2に示すノード1のバリア同期装置6を、リダクション演算装置8で置き換えた構成を含む。即ち、図10の例のノード1は、バリア同期装置6以外は、図2に示すノード1と同様の構成を含む。以下、図2〜図6にも示される要素については、図示又は説明を省略する場合がある。また、図11において、リダクション演算装置8をバリア・リダクション演算装置8と表記している。
リダクション演算装置8は、バリア同期を取りつつリダクション演算を行う。リダクション演算装置8は、受信装置81と、同期装置82と、送信装置83と、演算装置84と、ループ経路823とを含む。同期装置82は、制御部821と、制御レジスタ822とを含む。なお、以下の説明において、同期装置82を「同期部82」と言い、演算装置84を「演算部84」と言うこととする。また、制御部821は、図3の制御部621と同様の構成を有するが、図示を省略する。
リダクション演算装置8は、図11に示すように、演算部84と演算部84の周辺回路である入力データレジスタ841及び出力データレジスタ842以外は、バリア同期装置6と同様の構成を含む。演算部84を含むので、リダクション演算装置8は、バリア同期開始の信号に代えてリダクション演算開始の信号を入力され、また、バリア同期成立の信号に代えてリダクション演算完了の信号を出力する。
また、演算部84を含むので、リダクション演算装置8は、ネットワーク2との間で、パケットの送受信に加えて、データの送受信も行い、また、CPU3の設定処理部31との間で、制御信号に加えて、データの送受信も行う。
また、演算部84を含むので、リダクション演算装置8は、リダクション演算の対象データを外部から入力され、また、リダクション演算の結果を外部に出力する。具体的には、受信装置81は、受信した2以上の同期装置からのデータから演算対象データを抽出し、演算部84に入力する。演算部84は、抽出された演算対象データに対して演算を行い、演算結果データを送信装置83へ出力する。送信装置83は、同期を行う2以上の同期装置へのデータに、演算結果データを含めてそれぞれ送信する。
リダクション演算の第1の対象データは、CPU3の設定処理部31から、ライトデータとして入力データレジスタ841に入力され、入力データレジスタ841から演算部84に入力される。リダクション演算の第2の対象データは、ネットワーク2から受信装置81を介してパケットとして入力され、パケットから取出されて、演算部84に入力される。
一方、リダクション演算の結果は、演算部84から、出力データレジスタ842に出力され、リードデータとして出力データレジスタ842からCPU3の設定処理部31に出力される。また、リダクション演算の結果は、演算部84から送信装置83に出力され、送信装置83からネットワーク2へパケットとして送信される。
入力データレジスタ841及び出力データレジスタ842は、複数設けられる。入力データレジスタ841は、各々、制御レジスタ822と対応する。出力データレジスタ842も同様である。
ライトデータを書き込むべき入力データレジスタ841は、設定処理部31からライトアドレスにより指定される。リードデータを読み出すべき入力データレジスタ841は、制御部821からリードアドレスにより指定される。入力データレジスタ841のリードアドレスは、例えば受信装置81が受信したパケットにおける宛先情報が指示する制御レジスタ822に対応し、指示された制御レジスタ822の設定情報に基づいて生成される。ライトデータを書き込むべき出力データレジスタ842は、制御部821からライトアドレスにより指定される。出力データレジスタ842のライトアドレスは、ライトデータのリダクション演算に用いられる制御レジスタ822に対応し、指示された制御レジスタ822の設定情報に基づいて生成される。リードデータを読み出すべき出力データレジスタ842は、設定処理部31からリードアドレスにより指定される。
リダクション演算を実行するために、設定処理部31は、IO装置11から入力された設定条件に従って、リダクション演算装置8における第1のバリア同期メッセージの送信先及び第2のバリア同期メッセージの送信先を、リダクション演算装置8に設定する。
また、設定処理部31は、システム制御部5を介して、リダクション演算の開始時にリダクション演算装置8に対して演算対象のデータを送信し、また、リダクション演算装置8からリダクション演算結果を受信する。リダクション演算装置8は、ネットワーク2を介して、他ノード1のリダクション演算装置との間で通信を行ない、当該通信に基づいて、リダクション演算を行なう。
更に、リダクション演算を実行するために、リダクション演算装置8が含む同期部82は、同期成立の後に、第2のバリア同期メッセージの送信を送信装置83に指示(図示「他ノード宛て同期メッセージ送信指示」)すると共に、予め定められたリダクション演算を演算部84に指示する。また、送信装置83は、第2のバリア同期メッセージ送信の指示を受信した場合、第2のバリア同期メッセージと共に、演算部84におけるリダクション演算の結果をネットワーク2に送信する。
また、同期部82の制御部821は、演算種類情報を保持する。演算種類情報は、演算部84におけるリダクション演算の制御のために、演算の種類を示す情報である。演算種類情報は、CPU3から入力データレジスタを介して制御部821に入力される。演算種類情報も、設定条件の一部として、IO装置11から入力される。
図10の例におけるリダクション演算は、以下のように行われる。
設定処理部31は、バリア同期装置6と同様にして、同期部82におけるリダクション演算の各組に対応する制御レジスタ822に、設定条件に基づいて、設定情報を設定する。この後、設定処理部31は、入力データを入力データレジスタ841に入力して、リダクション同期開始信号を同期部82に送信する。これにより、演算部84によるリダクション演算が開始される。最後のステージに対応した制御レジスタ822において同期が成立した場合、リダクション演算装置8は、演算結果とリダクション演算完了の信号とを、設定処理部31に送る。
受信装置81はネットワーク2を介してパケットを受信し、受信したパケットに基づいて、同期信号及び宛先情報を同期部82に送信し、パケットとして受信したデータを演算部84に送信する。
演算部84において、入力データレジスタ841は、CPU3から送信されたリダクション演算の対象である入力データを一時格納し、制御部821からの指示に応じて、格納したデータを演算部84に入力する。CPU3からのデータは、前述したように、リダクション演算の開始時に入力される。
演算部84は、同期が成立した場合、制御部821からの演算指示に従って、第1のデータと第2のデータとについて、所定のリダクション演算を行なう。第1のデータは、例えば、自ノード1のデータ、換言すれば、演算部84が前ステージで行なった演算結果である。第2のデータは、例えば、他ノード1から受信したデータ、換言すれば、受信装置81が受信したパケットからのデータである。演算の種類は、制御部821からの演算装置制御により指示される。
演算部84は、制御部821からの制御に従って、演算結果を保持し、また、送信装置83に入力する。具体的には、演算結果は、リダクション演算が完了する以前には、送信装置83に出力するようにされ、これ以外の場合には、出力データレジスタ842に出力するようにされる。
出力データレジスタ842は、リダクション演算の結果を、CPU3に出力する。出力データレジスタ842から出力されるリダクション演算結果は、リダクション演算完了時にCPU3に入力される。
送信装置83は、演算部84から演算結果を受信し、制御部821から送信指示を受信した場合、これらに基づいて、パケットを生成し、生成したパケットをネットワーク2へ送信する。
同期部82は、バリア同期装置6の同期部62と同様にして、ステージ毎に演算の中間結果の送信先を変更する処理を行う。同期部82の制御部821は、同期信号及び設定情報を受信装置81から受信した場合、受信した設定情報に対応する制御レジスタ822に同期信号を送る。
制御部821は、同期が成立した場合、送信装置83へ同期信号、換言すれば、他ノード1宛てのバリア同期のメッセージの送信指示を出す。この時、制御部821は、自プロセス又は自ノード1の同期部82内の指定された制御レジスタ822に同期信号を送信することに加えて、演算部84を制御する。例えば、制御部821は、演算部84に入力されたデータと、保持している前ステージにおける演算結果との間で、リダクション演算を行なわせる。一方、同期が成立していない場合、制御部821は、演算部84にデータを保持させる。
自プロセス又は自ノード1の同期部82の指定された制御レジスタ822に同期信号を送信した場合において、同期が成立した場合、制御部821は、更に、演算結果と演算部84内の記憶部で待ち合わせているデータとの演算を繰り返すよう演算部84を制御する。一方、同期が成立しない場合、制御部821は、演算結果を演算部84内の記憶部に送信する。
制御部821は、設定処理部31からリダクション演算開始の信号を受け取ると、指定された組つまり制御レジスタ822の送信先に、同期信号と設定処理部31から入力されたデータとを送信する。この後、最後の組で同期が成立した場合、制御部821は、演算結果とリダクション演算完了の信号とを、設定処理部31に送信する。
図12及び図13は、一体となって、図10のリダクション演算装置8が実行する、バタフライによるバリア同期を行いつつリダクション演算を行う処理の処理フローを示す。
このリダクション演算はバリア同期を利用する。従って、図13の処理フローは、リダクション演算対象のデータの送受信及びリダクション演算を含むこと以外は、図8の処理フローとほぼ同一である。
設定処理部31は、リダクション演算を開始する前に、リダクション演算を行なうノード数から使用する制御レジスタ822の数を決定し、各制御レジスタ822の宛先レジスタ8222にバタフライでの次ステージに対応した宛先ノードアドレスと宛先ステージ番号とを設定し、また、各制御レジスタ822の所定のレジスタに演算種類を設定する(ステップS21)。レジスタの設定は、バリア同期におけるレジスタの設定と同様に行われる。
設定処理部31は、リダクション演算を開始するため、リダクション演算のタイプを入力データレジスタ841に設定し、演算データを入力データレジスタ841に設定する(ステップS22)。
設定処理部31は、プロセスがバリアポイントに到達した場合、バリア同期装置8の同期部82に対しバリア同期及びリダクション演算開始の信号を送る(ステップS23)。バリア同期及びリダクション演算開始信号は、入力レジスタ番号と、最初のステージに対応した宛先ステージ番号とを含む。
同期部82の制御部821は、バリア同期及びリダクション演算開始の信号が送られると、リダクション演算信号で指定された制御レジスタ822の宛先レジスタ8222の値を読む(ステップS24)。
更に、同期部82の制御部821は、演算部84にリダクション演算を指示する。これに応じて、演算部84は、リダクション演算を実行し、演算結果を送信装置83に出力する。また、制御部821は、宛先レジスタ8222の値の中の他ノード1の制御レジスタ822を指定する値に基づいて、送信装置83に対しパケット送信指示の信号を出すと共に、宛先レジスタ8222の値の中の自ノード1の制御レジスタ822を指定する値に基づいて、遅延部824へ同期信号を送信する(ステップS25)。パケット送信指示は、他ノード1を指示する宛先レジスタ8222の値を含む。
送信装置83は、制御部821からのパケット送信指示で指定された宛先ノードアドレスおよび宛先ステージ番号に基づいて、パケットを生成し、パケットをネットワーク2へ送信する。このパケットは、他ノード1宛のバリア同期及びリダクション演算のメッセージ、換言すれば、同期信号を含むバリア同期メッセージである。このパケットの送信先は、指定された宛先ノードアドレスおよび宛先ステージ番号である。一方、制御部821が遅延部824へ送信する同期信号は、自ノード1宛のバリア同期及びリダクション演算のメッセージである。例えば、制御部821が遅延部824へ送信する同期信号は、図5のパケットから、ヘッダCRC、ルーティングヘッダ、パケットCRCを除いたものである。
遅延部824は、制御部821から受信した遅延値に相当する時間だけ、制御部821から受信した同期信号の送信を保留し(ステップS26)、遅延値に相当する時間、換言すれば、遅延時間が経過したか否かを判断する(ステップS27)。遅延時間が経過しない場合(ステップS27 No)、遅延部824は、ステップS26を繰り返す。遅延時間が経過した場合(ステップS27 Yes)、遅延部824は、保持している同期信号を、制御部821へ送信する(ステップS28)。
制御部821が、宛先レジスタ8222の値の中の自ノードの制御レジスタ822を指定する値に基づいて、宛先レジスタ8222において指定された制御レジスタ822のシグナルレジスタ8221の値を読む(ステップS29)。続いて、制御部821が、シグナルレジスタ8221に「1」が設定されているか否かを調べる(ステップS210)。シグナルレジスタ8221に「1」が設定されている場合(ステップS210 Yes)、同期成立となる。一方、シグナルレジスタ8221に「1」が設定されていない場合(ステップS210 No)、同期は成立していない。
同期が成立していない場合、制御部821は、シグナルレジスタ8221に「1」を設定し(ステップS211)、データを演算部84の記憶装置において制御レジスタ822に対応するアドレスに格納する。データは、制御レジスタ822が最初のステージである場合には入力データレジスタの値であり、後続のステージである場合には前ステージの演算結果である。
この後、制御部821は、他のプロセスからのパケットの受信を待ち合わせ、受信装置81は、他のプロセスからパケットを受信した場合、受信したパケットに基づいて、データ、同期信号、宛先となる宛先ステージ番号を取り出し、演算部84、同期部82へ対応する情報を送信する(ステップS212)。
同期部82は、受信装置81から同期信号、宛先ステージ番号を受信した場合、指定された制御レジスタ822のSignalの値を読取る(ステップS213)。この後、ステップS210を繰り返す。
一方、ステップS210において同期が成立している場合(ステップS210 Yes)、制御部821は、制御レジスタ822が最後のステージに対応したものか否かを調べる(ステップS214)。
最後のステージに対応する制御レジスタ822で同期が成立した場合(ステップS214 Yes)、制御部821は、演算結果を出力データレジスタ842に格納し、設定処理部31にリダクション演算完了の信号を送信する(ステップS215)。設定処理部31は、制御部821からのリダクション演算完了の信号を受け取り、出力データレジスタ842から演算結果を読み取る(ステップS216)。
ステップS214において制御レジスタ822が最後のステージに対応したものでない場合(ステップS214 No)、制御部821は、ステップS25を繰り返す。
図10のリダクション演算装置8は、前述したように、図2のバリア同期装置6と同様にしてバリア同期を実行しつつ、リダクション演算を実行する。従って、図10のリダクション演算装置8によれば、図9のバタフライによるバリア同期処理における各ステージ間での同期メッセージの流れと同様にして、図18に示す同期メッセージとリダクション演算の演算途中データとが送受信される。換言すれば、自ノード1における同期メッセージ及び演算途中データの送受信はネットワーク2と同等の遅延を生じる遅延部624を介して実行され、他ノード1との間の同期メッセージ及び演算途中データの送受信はネットワーク2を介して実行される。これにより、ノード#0〜ノード#3のステージ#2の各々において、同時に同期が成立する。この結果、バリア同期において、複数のノードの間における同期の成立のばらつきをほぼ無くすことができる。
図14は、バリア同期装置を含むノードの構成の他の一例を示す図である。
図14の例は、遅延計算回路6214が遅延値を算出する場合における基準となる値を制御レジスタ622に格納する例である。具体的には、図14に示すように、複数の制御レジスタ622の各々において、シグナルレジスタ6221及び宛先レジスタ6222と共に、遅延時間レジスタ6223が設けられる。図14において、遅延時間レジスタ6223は、符号Delay1 を付して表す。
遅延時間レジスタ6223は、遅延値の計算の基準となる値を格納する。遅延値の計算の基準となる値は、例えば、ネットワーク2上における通信遅延時間、又は、その補正係数である。例えば、論理ネットワークアドレスにおいてノード1間の距離が「1ホップ」であっても、実際の通信における通信遅延時間が大きく異なる場合がある。この場合、1ホップ当りの通信遅延時間Tdを、遅延時間レジスタ6223に格納された基準値を適切な値に変更又は補正することができる。
これにより、各ノード1の間における通信時間がネットワーク2の状態に依存して大きく異なる場合において、複数のプロセスの各々について、プロセス毎に遅延値を補正してプロセス毎に適した遅延処理を実現することができる。この結果、複数のノードの間における同期の成立のばらつきをほぼ無くすことができる。
図15は、バリア同期装置を含むノードの構成の更に他の一例を示す図である。
図15の例は、遅延計算回路6214を省略して、遅延値を制御レジスタ622に格納する例である。具体的には、図15に示すように、複数の制御レジスタ622の各々において、シグナルレジスタ6221及び宛先レジスタ6222と共に、遅延値レジスタ6224が設けられる。図15において、遅延値レジスタ6224は、符号Delay2 を付して表す。
遅延値レジスタ6224は、遅延値を格納する。例えば、ネットワーク2によっては、実際の通信における通信遅延時間を予め知ることができる場合がある。この場合、予め知った通信遅延時間Tdを、遅延時間レジスタ6224に遅延値として格納することができる。
これにより、各ノード1の間における通信時間がネットワーク2に依存して予め知ることができる場合において、複数のプロセスの各々について、プロセス毎に遅延値を予め設定してプロセス毎に適した遅延処理を実現することができる。この結果、複数のノードの間における同期の成立のばらつきをほぼ無くすことができる。
以上に説明した並列計算機システムにおいては、バリア同期のアルゴリズムはバタフライ演算によるアルゴリズムによるが、並列計算機システムにおけるバリア同期は、バタフライによるバリア同期に限られない。
例えば、バリア同期のアルゴリズムは、ディスエミネーションであっても良い。これにより、プロセス数が2のべき乗でない場合であっても、並列計算機システムにおいて、ディスエミネーションによるバリア同期処理を実行することができ、また、ディスエミネーションによるバリア同期によるリダクション演算処理を実行することができる。
また、例えば、バリア同期のアルゴリズムは、ペアワイズエクスチェンジウィズリカーシブダブリング(Pairwise exchange with recursive doubling)であっても良い。これにより、プロセス数が2のべき乗でない場合であっても、並列計算機システムにおいて、ペアワイズエクスチェンジウィズリカーシブダブリングによるバリア同期処理を実行することができ、また、ペアワイズエクスチェンジウィズリカーシブダブリングによるバリア同期によるリダクション演算処理を実行することができる。
また、以上に説明した並列計算機システムにおいては、バリア同期装置は各々のノード、換言すれば、プロセッサに設けられるが、これに限られない。
例えば、マルチプロセッサ(マルチプロセッサコア)により構成される並列計算機システムにおいて、バリア同期装置は、各々のノード、換言すれば、プロセッサコアに設けられるのではなく、プロセッサコアとは独立に設けられるようにしても良い。換言すれば、1個のバリア同期装置が、複数のプロセッサコアに共通に設けられるようにしても良い。また、マルチプロセッサにより構成される並列計算機システムにおいて、リダクション演算装置は、各々のノード、換言すれば、プロセッサコアに設けられるのではなく、プロセッサコアとは独立に設けられるようにしても良い。換言すれば、1個のリダクション演算装置が、複数のプロセッサコアに共通に設けられるようにしても良い。