以下、図面を用いて実施形態を説明する。
図1は、情報処理システム、情報処理装置および情報処理システムの制御方法の一実施形態を示す。図1に示す情報処理システム100は、ネットワークNWを介して相互に接続される複数の情報処理装置1を有する。なお、情報処理システム100に含まれる情報処理装置1の数は、2つに限定されない。情報処理装置1の各々は、演算処理装置2、主記憶装置3および制御装置4を有する。例えば、演算処理装置2、主記憶装置3および制御装置4は、共通のバスBUSを介して相互に接続される。
演算処理装置2は、例えば、積和演算等を実行する複数の演算器を有する。積和演算は、第1の演算の一例である。主記憶装置3は、演算処理装置2が実行する演算に使用するデータおよび後述する演算処理部5が実行する演算に使用するデータを記憶する。制御装置4は、複数の情報処理装置1間でのデータの転送を制御する。以下では、各情報処理装置1は、ノードとも称される。
制御装置4は、演算処理部5、バッファ部6および転送制御部7を有する。例えば、バッファ部6は、共通のバスBUS等を介することなく、転送制御部7および演算処理部5に接続される。演算処理部5は、例えば、複数の加算器と除算器とを有し、複数のデータ毎に平均値を算出する。加算器と除算器によりデータの平均値を算出する演算は、第2の演算の一例である。バッファ部6は、演算処理部5が実行する演算で使用するデータであって、主記憶装置3から転送されるデータを保持する。
転送制御部7は、自ノードの主記憶装置3から自ノードのバッファ部6にデータを転送する制御を実行するとともに、他ノードの主記憶装置3から自ノードのバッファ部6にデータを転送する制御を実行する。また、転送制御部7は、自ノードのバッファ部6に格納されたデータを使用して自ノードの演算処理部5が実行した演算の結果データを、自ノードの主記憶装置3と他ノードの主記憶装置3とに転送する制御を実行する。以下では、演算対象のデータを自ノードおよび他ノードから集め、集めたデータを使用して実行される演算は、リデュース演算とも称される。
図1に示す複数の情報処理装置1の各々は、自ノードおよび他ノードの主記憶装置3に保持されたデータを、自ノードのバッファ部6に格納し、バッファ部6に格納されたデータを使用して演算処理部5によりリデュース演算を実行する。そして、複数の情報処理装置1の各々は、演算処理部5によるリデュース演算で得られた結果データを自ノードおよび全ての他ノードに対して送信することにより、自ノードおよび全ての他ノードの主記憶装置3に当該結果データを格納する。すなわち、情報処理システム100は、オールリデュース処理を実行する。
図2は、図1に示す情報処理システム100の動作の一例を示す。各情報処理装置1は、図2に示すマスタの動作とスレーブの動作とを並列に実行する。すなわち、マスタの動作とスレーブの動作は、全ての情報処理装置1のそれぞれで実行される。
まず、各情報処理装置1は、演算処理装置2を動作させて主記憶装置3からデータを読み出し、積和演算等の演算処理を実行し、演算結果をリデュース演算に使用するデータとして、自ノードの主記憶装置3に格納する。全ての情報処理装置1の演算処理装置2での演算が完了したことに基づいて、マスタとして動作する情報処理装置1の転送制御部7は、他の情報処理装置1に読み出し要求を発行する(図2(a))。演算処理装置2での演算の完了に基づいて、他の情報処理装置1に発行される読み出し要求は、データの転送要求の一例である。また、転送制御部7は、自ノードの主記憶装置3に読み出し要求を発行し、主記憶装置3から読み出したデータをバッファ部6に格納する(図2(b)、(c))。
スレーブとして動作する情報処理装置1の転送制御部7は、他の情報処理装置1から読み出し要求を受けた場合、自ノードの主記憶装置3に読み出し要求を発行し、主記憶装置3からデータを読み出す(図2(d)、(e))。そして、転送制御部7は、主記憶装置3から読み出したデータを、マスタとして動作する情報処理装置1に出力する(図2(f))。マスタとして動作する情報処理装置1の転送制御部7は、スレーブとして動作する情報処理装置1から受けたデータをバッファ部6に格納する(図2(g))。以下の説明では、マスタとして動作する情報処理装置1の転送制御部7は、転送制御部7(マスタ)とも称される。
バッファ部6は、図1に示すバスBUS等を介することなく、転送制御部7に接続される。このため、転送制御部7からバッファ部6へのデータの転送時間を、転送制御部7から主記憶装置3へのデータの転送時間に比べて短縮することができる。
全ての情報処理装置1の主記憶装置3からバッファ部6へのデータの転送が完了した後、マスタとして動作する情報処理装置1の演算処理部5は、バッファ部6に保持されたデータを使用してリデュース演算を実行する(図2(h))。リデュース演算に使用するデータは、バッファ部6に格納されるため、リデュース演算に使用するデータを格納する記憶領域を主記憶装置3に確保することなく、リデュース演算を実行することができる。また、バッファ部6は、共通のバスBUS等を介することなく、演算処理部5に接続されるため、バッファ部6から演算処理部5へのデータの転送時間を、主記憶装置3から演算処理部5へのデータの転送時間に比べて短縮することができる。
演算処理部5が実行するリデュース演算は、例えば、複数の情報処理装置1の主記憶装置3からそれぞれ読み出されたデータの平均値を算出する演算である。各主記憶装置3からバッファ部6に転送されるデータは、例えば、複数の要素データを含む配列データである。演算処理部5は、複数の配列データから要素データをそれぞれ取り出して、取り出した要素データ毎に平均値を算出する。すなわち、演算処理部5は、複数のリデュース演算を繰り返し実行する。
リデュース演算は、演算処理部5がバッファ部6にアクセスすることで実行されるため、演算処理装置2を使用することなく実行され、かつ、主記憶装置3にアクセスすることなく実行される。このため、演算処理装置2は、演算処理部5がリデュース演算の実行中に、主記憶装置3にアクセスして他の演算処理を実行することができ、オールリデュース処理を実行する場合にも他の演算の処理性能が低下することを抑止することができる。また、リデュース演算は主記憶装置3にアクセスすることなく実行されるため、主記憶装置3へのアクセス効率がリデュース演算の実行により低下することを抑止することができる。
転送制御部7(マスタ)は、バッファ部6に保持されたデータを使用したリデュース演算の完了に基づいて、自ノードの主記憶装置3に書き込み要求を発行し、リデュース演算の結果データを主記憶装置3に格納する(図2(i))。また、転送制御部7(マスタ)は、スレーブとして動作する情報処理装置1に書き込み要求を発行する(図2(j))。書き込み要求を受けた転送制御部7は、自ノードの主記憶装置3に書き込み要求を発行し、マスタとして動作する情報処理装置1が実行したリデュース演算の結果データを主記憶装置3に格納する(図2(k))。
この後、情報処理システム100は、図2(a)から図2(k)に示す動作を繰り返し実行する。すなわち、転送制御部7(マスタ)は、他ノードの情報処理装置1と自ノードの主記憶装置3に読み出し要求を発行し、次のリデュース演算に使用するデータを全てのノードの主記憶装置3から読み出す。そして、転送制御部7は、読み出したデータをバッファ部6に格納する。マスタとして動作する情報処理装置1の演算処理部5は、バッファ部6に保持されたデータを使用してリデュース演算を実行する。転送制御部7(マスタ)は、リデュース演算の完了に基づいて、リデュース演算の結果データを自ノードと他ノードの主記憶装置3に格納する処理を実行する。
図3は、図1に示す情報処理システム100と異なる他の情報処理システムの動作の一例を示す。図2と同様の動作については、詳細な説明は省略する。図3に示す動作を実行する情報処理システムの各情報処理装置は、図1に示す演算処理部5およびバッファ部6を持たないことを除き、図1に示す情報処理装置1と同様の構成である。すなわち、情報処理装置の各々は、演算処理装置と、主記憶装置と、演算処理部5およびバッファ部6を持たない制御装置とを有する。各情報処理装置は、主記憶装置に保持されたデータを使用して、演算処理装置によりリデュース演算を実行する。
まず、図2と同様に、各情報処理装置は、演算処理装置を動作させて主記憶装置3からデータを読み出し、積和演算等の演算処理を実行し、演算結果を自ノードの主記憶装置に格納する。全ての情報処理装置の演算処理装置での演算が完了したことに基づいて、マスタとして動作する情報処理装置の転送制御部は、スレーブとして動作する情報処理装置に読み出し要求を発行する(図3(a))。
スレーブとして動作する情報処理装置の転送制御部は、マスタとして動作する情報処理装置から読み出し要求を受けた場合、自ノードの主記憶装置に読み出し要求を発行し、主記憶装置からデータを読み出す(図3(b)、(c))。そして、転送制御部は、主記憶装置から読み出したデータを、マスタとして動作する情報処理装置に出力する(図3(d))。マスタとして動作する情報処理装置の転送制御部は、スレーブとして動作する情報処理装置から受けたデータを主記憶装置に格納する(図3(e))。
マスタとして動作する情報処理装置の演算処理装置は、スレーブとして動作する情報処理装置の主記憶装置から自ノードの主記憶装置へのデータの格納が完了した後、主記憶装置に保持されたデータを使用してリデュース演算を開始する(図3(f))。演算処理装置は、リデュース演算の対象データの主記憶装置からのロードと、リデュース演算の結果データの主記憶装置へのストアとを繰り返し実行しながら、リデュース演算の処理を実行する。
転送制御部(マスタ)は、リデュース演算の実行の完了に基づいて、自ノードの主記憶装置に読み出し要求を発行し、リデュース演算の結果データを主記憶装置から読み出す(図3(g)、(h))。転送制御部(マスタ)は、スレーブとして動作する情報処理装置に書き込み要求を発行する(図3(i))。書き込み要求を受けた転送制御部は、自ノードの主記憶装置に書き込み要求を発行し、リデュース演算の結果データを主記憶装置に格納する(図3(j))。
この後、情報処理システムは、図3(a)から図3(j)に示す動作を繰り返し実行する。すなわち、転送制御部(マスタ)は、スレーブとして動作する情報処理装置に読み出し要求を発行し、次のリデュース演算に使用するデータを他ノードの主記憶装置から読み出し、読み出したデータを主記憶装置に格納する。マスタとして動作する情報処理装置の演算処理装置は、主記憶装置に保持されたデータを使用してリデュース演算を実行する。転送制御部(マスタ)は、リデュース演算の完了に基づいて、リデュース演算の結果データをスレーブとして動作する情報処理装置の主記憶装置に格納する処理を実行する。
図3に示す動作を実行する情報処理システムでは、主記憶装置は共通のバスを介して転送制御部に接続される。このため、転送制御部によるデータの主記憶装置への転送時間は、図1に示した転送制御部7によるデータのバッファ部6への転送時間に比べて長くなる。これにより、図3では、図2に比べて、リデュース演算の開始が遅れてしまう。また、リデュース演算で使用するデータの主記憶装置からの読み出し時間も、図1に示すバッファ部6からのデータの読み出し時間より長くなる。このため、リデュース演算の実行時間は、図2に比べて長くなる。さらに、リデュース演算の対象データが主記憶装置に格納されるため、図1に示す情報処理システム100に比べて、リデュース演算のために主記憶装置3内で使用する記憶領域が増加し、空き領域が減少する。
また、リデュース演算の結果データが主記憶装置に格納されるため、スレーブとして動作する情報処理装置へのデータの転送は、主記憶装置から結果データを読み出すことで実行される。これにより、図2に比べて、スレーブとして動作する情報処理装置に結果データを転送するタイミングが遅くなり、スレーブとして動作する情報処理装置からの次のリデュース演算の対象データを読み出すタイミングが遅くなる。さらに、演算処理装置は、リデュース演算を実行している間、他の演算を実行することができず、演算処理装置がリデュース演算のために主記憶装置にアクセスしている間、他の装置は、主記憶装置にアクセスできない。
この結果、図3に示す動作を実行する情報処理システムでは、図1に示す情報処理システム100に比べて、各情報処理装置による演算性能が低下する。
以上、図1および図2に示す実施形態では、リデュース演算は、演算処理装置2を使用することなく実行され、かつ、主記憶装置3にアクセスすることなく実行される。このため、演算処理装置2は、演算処理部5がリデュース演算を実行中に他の演算を実行することができ、オールリデュース処理により他の演算の処理性能が低下することを抑止することができる。また、リデュース演算は主記憶装置3にアクセスすることなく実行されるため、主記憶装置3へのアクセス効率がリデュース演算の実行により低下することを抑止することができる。
転送制御部7からバッファ部6へのリデュース演算の対象データの転送時間を、転送制御部7から主記憶装置3への対象データの転送時間に比べて短縮することができるため、図3に比べてリデュース演算を早く開始することができる。また、バッファ部6から演算処理部5への対象データの転送時間を、主記憶装置3から演算処理装置2への対象データの転送時間に比べて短縮することができるため、リデュース演算の実行時間を図3に比べて短縮することができる。
リデュース演算の結果データは、主記憶装置3に格納されることなくスレーブとして動作する情報処理装置1の主記憶装置3に転送される。アクセスレイテンシがバッファ部6に比べて大きい主記憶装置3を介さずに結果データを転送できるため、図3に比べて、次のリデュース演算に使用するデータのバッファ部6への転送を早く開始することができ、次のリデュース演算を早く開始することができる。
リデュース演算に使用するデータが、主記憶装置3でなく、バッファ部6に格納されるため、リデュース演算に使用するデータを格納する記憶領域を主記憶装置3に確保することなく、リデュース演算を実行することができる。
以上より、オールリデュース処理を実行する情報処理システム100の処理性能を、図3に比べて向上することができる。
図4は、情報処理システム、情報処理装置および情報処理システムの制御方法の別の実施形態を示す。図4に示す情報処理システム100Aは、4つのノードND(ND0、ND1、ND2、ND3)、ホストCPU10および記憶装置12を有する。ノードND0−ND3は、情報を処理する情報処理装置の一例である。
ホストCPU10は、情報処理システム100Aの全体の動作を制御し、例えば、ノードND0−ND3にディープラーニングを実行させる。記憶装置12は、ホストCPU10が実行する制御プログラムと、ノードND0−ND3が実行する学習に使用されるデータ等とを保持する。学習に使用するデータは、ホストCPU10の制御により、記憶装置12から各ノードND0−ND3のメモリ24に格納される。
各ノードND0−ND3は、互いに同じ構成であるため、以下では、ノードND0の構成が説明される。ノードND0は、演算ユニット20、メモリコントローラ22、メモリ24およびDMAエンジン26を有する。演算ユニット20は、演算処理装置の一例であり、メモリ24は、主記憶装置3の一例であり、DMAエンジン26は、複数のノードND0−ND3間でのデータの転送を制御する制御装置の一例である。
演算ユニット20、メモリコントローラ22およびDMAエンジン26は、共通のバスBUSにより相互に接続される。DMAエンジン26は、演算ユニット28、バッファ30A、30BおよびDMAユニット32を有する。演算ユニット28は、演算処理部の一例であり、バッファ30A、30Bは、バッファ部の一例であり、DMAユニット32は、転送制御部の一例である。特に限定されないが、演算ユニット20、メモリコントローラ22およびDMAエンジン26は、1つの半導体チップに含まれ、この半導体チップとメモリ24とが基板に実装される。
演算ユニット20は、例えば、浮動小数点用の複数の積和演算器等を有する。演算ユニット20は、ホストCPU10が実行するディープラーニングにおいて、学習用のデータ(例えば、画像データ)の特徴を抽出するための演算、および抽出した特徴データと正解データとの誤差を算出するための演算を実行する。演算ユニット20が実行する積和演算等は、第1の演算の一例である。
メモリ24は、演算ユニット20が使用するデータと、DMAエンジン26内の演算ユニット28が使用するデータとを記憶する。例えば、メモリ24は、HBM(High Bandwidth Memory)である。なお、メモリ24は、SDRAM(Synchronous Dynamic Random Access Memory)等を含むメモリモジュールでもよい。
演算ユニット28は、浮動小数点用の加算器および除算器等の複数の演算器を有する。そして、演算ユニット28は、自ノードND0内のデータおよび他ノードND2−ND3から集められたデータを用いて平均化処理等の演算を実行する。すなわち、DMAエンジン26は、複数のノードNDから集められたデータを束ねて処理するリデュース処理を実行する。リデュース処理は、他のノードND1−ND3のDMAエンジン26でも実行されるため、情報処理システム100Aの全体では、オールリデュース処理が実行される。オールリデュース処理の例は、図9から図14で説明される。
以下では、リデュース処理のために演算ユニット28が実行する演算は、リデュース演算とも称される。演算ユニット28が実行するリデュース演算は、第2の演算の一例である。バッファ30A、30Bは、リデュース演算で使用するデータをそれぞれ保持する。
演算ユニット28は、バッファ30A、30Bに保持されたデータを交互に使用してリデュース演算を実行する。これにより、バッファ30Aに保持されたデータのリデュース演算中に、次のリデュース演算用のデータをバッファ30Bに格納することができる。すなわち、リデュース演算の裏でデータ転送を実行することで、リデュース演算を連続して実行することができる。
バッファ30A、30Bのアクセスレイテンシは、メモリ24のアクセスレイテンシより小さい。このため、演算ユニット28は、メモリ24からデータを読み出す場合に比べて、バッファ30A、30Bからデータを高速に読み出すことができる。また、DMAユニット32は、メモリ24にデータを格納する場合に比べて、バッファ30A、30Bにデータを高速に格納することができる。
DMAユニット32は、ホストCPU10を介して記憶装置12と自ノードND0のメモリ24との間でデータを転送する機能を有する。また、DMAユニット32は、自ノードND0のメモリ24または他ノードND2−ND3のメモリ24から自ノードND0のバッファ30A、30Bにデータを転送する機能を有する。さらに、DMAユニット32は、リデュース演算により得られる結果データを、自ノードND0のメモリ24または他ノードND2−ND3のメモリ24に転送する機能を有する。なお、DMAユニット32は、自ノードND0のメモリ24に保持されたデータを他ノードND2−ND3のバッファ30A、30Bに転送する機能を有してもよい。
なお、各ノードND0−ND3は、リデュース演算を実行する他ノードNDに演算の対象データを転送するスレーブとして動作するとともに、リデュース演算を実行し、リデュース演算の結果データを他ノードNDに転送するマスタとして動作する。すなわち、各ノードND0−ND3は、スレーブによる処理とマスタによる処理とを混在して実行する。そして、4つのノードND0−ND3は、リデュース演算を並列に実行することにより、オールリデュース処理を実行する。以下では、説明を分かりやすくするために、マスタによる動作とスレーブによる動作とを区別して記載する場合がある。
図5は、図4に示すDMAユニット32の一例を示す。DMAユニット32は、ディスクリプタ保持部34、リクエスト管理部36、シーケンサ38、メモリアクセス制御部40、要求制御部42、応答制御部44、パケット送信部46およびパケット受信部48を有する。
ディスクリプタ保持部34は、オールリデュース処理の実行時に起動されるDMA転送の指示を含むディスクリプタを保持する複数のエントリを有する。例えば、ディスクリプタは、オールリデュース処理を実行する他ノードNDを識別する情報と、自ノードNDが実行するリデュース演算の対象データを保持するメモリ24の領域情報とを含む。また、ディスクリプタは、他ノードNDがそれぞれ実行するリデュース演算の対象データを保持する他ノードのメモリ24の領域情報を含む。なお、他ノードNDのメモリ24の領域情報を、自ノードNDのメモリ24の領域情報に基づいて間接的に求めることが可能な場合、他ノードのメモリ24の領域情報は、ディスクリプタに含まれなくてもよい。
例えば、ディスクリプタに含まれるメモリ24の領域情報は、リデュース演算の対象データを保持する記憶領域の先頭アドレスと対象データのサイズ(データ長)とを含む。なお、リデュース演算により得られる結果データを、リデュース演算前の対象データを保持するメモリ24の記憶領域とは別の記憶領域に格納する場合、ディスクリプタは、さらに、結果データを格納する記憶領域を示す情報を含む。
ディスクリプタ保持部34に格納されるディスクリプタは、図4に示す記憶装置12に保持される。そして、ディスクリプタは、DMAユニット32がホストCPU10に発行する転送要求パケットに応答して、ホストCPU10を介して記憶装置12からDMAユニット32に転送され、ディスクリプタ保持部34に格納される。
例えば、DMAユニット32は、複数のディスクリプタを記憶装置12からディスクリプタ保持部34に予め転送する。そして、DMAユニット32は、ディスクリプタで指示される所定サイズのデータのリデュース演算が完了する毎に、新たなディスクリプタを記憶装置12からディスクリプタ保持部34に転送する。例えば、所定サイズは、DMAユニット32によるデータの最大転送単位である16MB(メガバイト)である。なお、DMAユニット32によるデータの最大転送単位は、16MBに限定されず、所定サイズは、DMAユニット32によるデータの最大転送単位より小さくてもよい。
リクエスト管理部36は、所定量のデータのリデュース演算を実行するためにシーケンサ38を起動する場合、ディスクリプタ保持部34から対象のディスクリプタを取り出し、取り出したディスクリプタをシーケンサ38に出力する。
シーケンサ38は、リクエスト管理部36からのディスクリプタの受信に基づいて起動される。シーケンサ38は、ディスクリプタで指示された所定サイズのデータのリデュース演算が完了するまで、リデュース演算に使用するデータの転送と、リデュース演算と、リデュース演算により得られた結果データの転送とを制御する。例えば、ディスクリプタで指示される所定サイズが16MBであり、メモリ24のアクセスの単位(後述するパケットの最大データサイズ)が2KB(キロバイト)であるとする。この場合、記憶装置12から各ノードNDのメモリ24に16MBのデータが転送される毎に、リデュース演算とリデュース演算の前後のデータ転送とが、2KB単位で実行される。なお、メモリ24にアクセスする単位は、後述するパケットで転送可能な最大データサイズ(最大ペイロードサイズ)に依存して決められ、2KBに限定されない。
シーケンサ38は、自ノードND内でデータの転送を制御する場合、メモリアクセス制御部40にメモリ24のアクセス要求を発行し、自ノードNDから他ノードNDへのデータの転送を制御する場合、要求制御部42に各種要求を発行する。シーケンサ38が実行するデータ転送の制御の例は、図6に示される。なお、シーケンサ38は、バッファ30A、30Bを交互に使用して、演算ユニット28にリデュース演算を実行させる。このため、シーケンサ38は、フェッチ要求等に基づいてメモリ24からデータが読み出されるタイミングに合わせて、バッファ30A、30Bのいずれかを制御してデータを受信させる。また、シーケンサ38は、各バッファ30A、30Bから出力されるデータの格納状況を示す情報に基づいて、バッファ30A、30Bのいずれかにリデュース演算の対象データの格納が完了したことを確認する。そして、シーケンサ38は、対象データの格納が完了したバッファ30A、30Bのいずれかに、リデュース演算の開始指示を出力する。リデュース演算の開始の指示を受信したバッファ30A、30Bのいずれかは、リデュース演算の対象データと演算の開始指示とを演算ユニット28に出力する。
演算ユニット28は、バッファ30A、30Bのいずれかから受けたデータを用いてリデュース演算を実行する。演算ユニット28は、リデュース演算の結果データをストアバッファ40cとパケット送信部46の送信バッファ46aとに格納する。また、演算ユニット28は、リデュース演算の完了を示す完了情報をシーケンサ38に出力する。シーケンサ38は、完了情報に基づいて、リデュース演算の結果データを自ノードNDのメモリ24に格納するために、メモリ24のアクセス要求をメモリアクセス制御部40に出力する。また、シーケンサ38は、完了情報に基づいて、リデュース演算の結果データを他ノードNDのメモリ24に格納するために、後述するリデュースBC(broadcast)要求またはリデュースBC&Get要求を要求制御部42に出力する。
メモリアクセス制御部40は、フェッチ要求管理部40a、ストア要求管理部40bおよびストアバッファ40cを有する。ストアバッファ40cには、自ノードNDの演算ユニット28が実行したリデュース演算の結果データが格納される。フェッチ要求管理部40aおよびストア要求管理部40bの動作の例は、図6に示される。
要求制御部42は、シーケンサ38から受信する各種要求をパケット送信部46に出力し、パケット受信部48から受信する各種要求をメモリアクセス制御部40に出力する。応答制御部44は、他ノードNDが発行した自ノードNDのメモリ24へのアクセス要求に対応して、自ノードのメモリ24からデータを受信した場合、応答を生成してパケット送信部46に出力する。応答制御部44は、他ノードNDが発行した応答に含まれるデータをパケット受信部48から受けた場合、受けたデータをバッファ30A、30Bのいずれかに格納する。また、応答制御部44は、自ノードNDが他ノードNDに発行した各種要求に対応する応答をパケット受信部48から受けた場合、応答を他ノードNDから受信したことを示す情報をシーケンサ38に出力する。
パケット送信部46は、他ノードNDのそれぞれに対応して、他ノードNDに送信するパケットが格納される複数の送信バッファ46aを有する。各送信バッファ46aは、複数のパケットを格納する複数のエントリを有する。パケット送信部46は、要求制御部42および応答制御部44から受ける各種要求と情報とに基づいて、パケットを生成し、生成したパケットを宛先毎に送信バッファ46aに格納する。パケット送信部46は、送信バッファ46aに格納されたパケットを順次発行する。
パケット受信部48は、他ノードNDのそれぞれに対応して、他ノードNDから受けるパケットが格納される複数の受信バッファ48aを有する。各受信バッファ48aは、複数のパケットを格納する複数のエントリを有する。パケット受信部48は、受信バッファ48aに格納された要求パケットに基づいて、各種要求を要求制御部42に出力し、受信バッファ48aに格納された応答パケットに基づいて、各種応答を応答制御部44に出力する。
なお、メモリコントローラ22は、メモリアクセス制御部40からのフェッチ要求パケットに基づいて、メモリ24にメモリアクセス要求(リード)を発行する。メモリコントローラ22は、メモリアクセス制御部40からのストア要求パケットに基づいて、メモリ24にメモリアクセス要求(ライト)を発行する。メモリアクセス要求は、例えば、2KBのデータを読み出し、または書き込むまで繰り返し発行される。
図6は、図5に示すDMAユニット32の動作の一例を示す。図6(A)は、自ノードにデータの転送要求を発行する場合の動作の例を示す。図6(B)は、他ノードにデータの転送要求を発行する場合の動作の例を示す。図6(C)は、他ノードからデータの転送要求が発行される場合の動作の例を示す。破線の矢印は、データの転送を示す。例えば、メモリアクセス制御部40は、メモリコントローラ22へのアクセス要求をパケット形式で出力し、パケット送信部46は、他ノードNDへの各種要求および各種要求をパケット形式で出力する。
図6(A)において、シーケンサ38は、自ノードNDのメモリ24からデータを読み出してバッファ30A、30Bのいずれかに格納する場合、フェッチ要求管理部40aにフェッチ要求を出力する(図6(a))。フェッチ要求管理部40aは、シーケンサ38からフェッチ要求を受けた場合、フェッチ要求パケットを生成してメモリコントローラ22に発行する(図6(b))。メモリコントローラ22は、フェッチ要求パケットに基づいてメモリ24にアクセスする。メモリ24から読み出されたデータは、バッファ30A、30Bに格納される。
また、シーケンサ38は、自ノードNDのメモリ24にリデュース演算の結果データ等を書き込む場合、ストア要求管理部40bにストア要求を出力する(図6(c))。ストア要求管理部40bは、シーケンサ38からストア要求を受けた場合、ストアバッファ40cに保持されたデータを含むストア要求パケットを生成してメモリコントローラ22に発行する(図6(d))。メモリコントローラ22は、ストア要求パケットに基づいてメモリ24にアクセスし、データをメモリ24に書き込む。
シーケンサ38は、自ノードNDのメモリ24へのリデュース演算の結果データの書き込みに続いて、次のリデュース演算に使用するデータをメモリ24から読み出す場合、フェッチ要求管理部40aにストア&Nextフェッチ要求を出力する(図6(e))。例えば、フェッチ要求管理部40aは、シーケンサ38からストア&Nextフェッチ要求を受けた場合、ストア&Nextフェッチ要求パケットをメモリコントローラ22に発行する(図6(f))。
メモリコントローラ22は、ストア&Nextフェッチ要求パケットに基づいてメモリ24にデータを書き込んだ後、次のリデュース演算に使用するデータをメモリ24から読み出して出力する。メモリ24から読み出されたデータは、バッファ30A、30Bに格納される。なお、ストア&Nextフェッチ要求パケットは、ストア要求管理部40bから発行されてもよい。例えば、リデュース演算の結果データは、メモリ24において、リデュース演算に使用した元のデータを保持する記憶領域に上書きされる。次のリデュース演算の対象データを保持する記憶領域の先頭アドレスは、リデュース演算の結果データを上書きした記憶領域の最終アドレスの次のアドレスである。
なお、実際には、フェッチ要求パケットに基づいて、図示しないフェッチ応答パケットがメモリコントローラ22から発行され、ストア要求パケットに基づいて、図示しないストア応答パケットがメモリコントローラ22から発行される。また、ストア&Nextフェッチ要求パケットに基づいて、図示しないストア&Nextフェッチ応答パケットがメモリコントローラ22から発行される。
図6(B)において、シーケンサ38は、他ノードNDのメモリ24からデータを読み出し、読み出したデータを自ノードNDのバッファ30A、30Bのいずれかに格納する場合、要求制御部42にリデュースGet要求を出力する(図6(g))。要求制御部42は、シーケンサ38からリデュースGet要求を受けた場合、受けたリデュースGet要求をパケット送信部46に出力する(図6(h))。パケット送信部46は、要求制御部42からのリデュースGet要求に基づいてリデュースGet要求パケットを生成し、生成したリデュースGet要求パケットを他ノードNDに出力する(図6(i))。リデュースGet要求パケットを受信した他ノードNDは、後述する図6(r)−図6(w)に示す動作を実行する。
パケット受信部48は、他ノードNDからのリデュースGet応答パケット(データ)の受信に基づいて、リデュースGet応答を応答制御部44に出力する(図6(j))。応答制御部44は、他ノードNDからのリデュースGet応答パケットに含まれるデータをバッファ30A、30Bのいずれかに格納する(図6(k))。データをバッファ30A、30Bのいずれに格納するかは、リデュースGet応答パケットの元となるリデュースGet要求の発行時にシーケンサ38により決められる。
シーケンサ38は、自ノードNDのメモリ24に格納されたリデュース演算の結果データを他ノードNDに転送する場合、要求制御部42にリデュースBC要求(またはリデュースPut要求)を出力する(図6(l))。リデュースBC要求は、共通のデータを複数の他ノードNDのメモリ24に格納する場合に使用される。要求制御部42は、シーケンサ38からリデュースBC要求(またはリデュースPut要求)を受けた場合、受けたリデュースBC要求(またはリデュースPut要求)をパケット送信部46に出力する(図6(m))。
パケット送信部46は、要求制御部42からのリデュースBC要求に基づいてリデュースBC要求パケットを他ノードNDに発行し、要求制御部42からのリデュースPut要求に基づいてリデュースPut要求パケットを他ノードNDに発行する(図6(n))。なお、リデュースBC要求またはリデュースPut要求が他ノードNDに発行される場合、他ノードNDに格納するデータが送信バッファ46aに予め格納される。リデュースBC要求またはリデュースPut要求を受信した他ノードNDは、後述する図6(x)−図6(z)に示す動作を実行する。
シーケンサ38は、他ノードNDのメモリ24へのリデュース演算の結果データの書き込みに続いて、次のリデュース演算の対象データを他ノードNDから読み出す場合、要求制御部42にリデュースBC&Get要求を出力する(図6(o))。要求制御部42は、シーケンサ38からリデュースBC&Get要求を受けた場合、受けたリデュースBC&Get要求をパケット送信部46に出力する(図6(p))。パケット送信部46は、要求制御部42からのリデュースBC&Get要求に基づいてリデュースBC&Get要求パケットを生成し、生成したリデュースBC&Get要求パケットを他ノードNDに出力する(図6(q))。リデュースBC&Get要求パケットを受信した他ノードNDは、後述する図6(z1)−図6(z4)に示す動作を実行する。リデュースBC&Get要求に対応してリデュースBC&Get応答パケットを他ノードNDから受信した場合のDMAユニット32の動作は、リデュースGet応答パケットに基づく動作と同様である。
図6(C)において、パケット受信部48は、リデュースGet要求パケットを他ノードNDから受信した場合、リデュースGet要求を要求制御部42に出力する(図6(r))。要求制御部42は、リデュースGet要求をフェッチ要求管理部40aに出力する(図6(s))。フェッチ要求管理部40aは、要求制御部42からリデュースGet要求を受けた場合、フェッチ要求パケットを生成してメモリコントローラ22に発行する(図6(t))。メモリコントローラ22は、フェッチ要求パケットに基づいてメモリ24からデータを読み出す。メモリ24から読み出されたデータは、フェッチ応答として応答制御部44に出力される(図6(u))。応答制御部44は、フェッチ応答に基づいて、リデュースGet応答をパケット送信部46に出力する(図6(v))。パケット送信部46は、応答制御部44からのリデュースGet応答に基づいてリデュースGet応答パケットを生成して、リデュースGet要求パケットの発行元のノードNDに出力する(図6(w))。
パケット受信部48は、リデュースBC要求パケット(またはリデュースPut要求パケット)を他ノードNDから受信した場合、リデュースBC要求(またはリデュースPut要求)を要求制御部42に出力する(図6(x))。要求制御部42は、リデュースBC要求(またはリデュースPut要求)をフェッチ要求管理部40aに出力する(図6(y))。フェッチ要求管理部40aは、要求制御部42からのリデュースBC要求(またはリデュースPut要求)に基づいて、ストア要求パケットを生成してメモリコントローラ22に発行する(図6(z))。メモリコントローラ22は、ストア要求パケットに基づいて、リデュースBC要求パケット(またはリデュースPut要求パケット)に含まれるデータをメモリ24に書き込む。なお、実際には、リデュースBC要求パケット(またはリデュースPut要求パケット)に基づいて、図示しないリデュースBC応答パケット(またはリデュースPut応答パケット)がメモリコントローラ22から発行される。
パケット受信部48は、リデュースBC&Get要求パケットを他ノードNDから受信した場合、リデュースBC&Get要求を要求制御部42に出力する(図6(z1))。要求制御部42は、リデュースBC&Get要求をフェッチ要求管理部40aに出力する(図6(z2))。フェッチ要求管理部40aは、要求制御部42からリデュースBC&Get要求を受けた場合、ストア&Nextフェッチ要求パケットを生成してメモリコントローラ22に発行する(図6(z3))。メモリコントローラ22は、ストア&Nextフェッチ要求パケットに基づいてメモリ24にデータを書き込んだ後、次のリデュース演算に使用するデータをメモリ24から読み出してストア&Nextフェッチ応答パケットとして出力する(図6(z4))。ストア&Nextフェッチ要求が他ノードNDから発行された場合、メモリ24から読み出されたデータは、ストア&Nextフェッチ応答パケットとして応答制御部44に出力される。応答制御部44は、ストア&Nextフェッチ応答をパケット送信部46に出力する。そして、パケット送信部46は、リデュースBC&Get応答パケットを、リデュースBC&Get要求パケットの発行元のノードNDに発行する(図6(z5))。
図7は、図4に示す情報処理システム100Aで使用されるパケットのフォーマットの一例を示す。図7に示すリデュース系パケットは、バッファ30A、30Bに対してデータを読み書きするパケットと、リデュース演算の結果データをメモリ24に格納するパケットとを含む。
図7において、パケットタイプの欄には、要求パケットまたは応答パケットを識別する情報が格納される。要求パケットのREQ_IDの欄には、要求パケットの発行元がパケット毎に割り当てた番号(シーケンス番号等)が格納される。応答パケットのREQ_IDの欄には、対応する要求パケットのREQ_IDの欄に格納された番号と同じ番号が格納される。
DIST_IDの欄は、パケットの宛先のノードNDを識別する番号が格納され、SRC_IDの欄は、パケットを発行するノードNDを識別する番号が格納される。例えば、応答パケットのDIST_IDの欄には、対応する要求パケットのSRC_IDが格納され、応答パケットのSRC_IDの欄には、対応する要求パケットのDIST_IDが格納される。
DIST_ADRSの欄には、メモリ24において、データを読み書きする記憶領域の先頭アドレスが格納される。例えば、リデュースGet要求パケットのDIST_ADRSの欄には、メモリ24においてデータを読み出す記憶領域の先頭アドレスが格納される。リデュースBC&GetパケットおよびリデュースBC要求のDIST_ADRSの欄には、メモリ24においてデータを書き込む記憶領域の先頭アドレスが格納される。なお、パケットの名称に含まれる”BC”は、複数のノードNDに共通のデータを転送するブロードキャストを示す。
ペイロードの欄には、データが格納される。例えば、リデュースBC&Get要求パケットのペイロードには、スレーブのメモリ24に書き込むデータ(リデュース演算の結果データ)が格納される。リデュースGet応答パケットおよびリデュースBC&Get応答パケットのペイロードには、スレーブのメモリ24から読み出されたリデュース演算に使用するデータが格納される。例えば、図7に示すパケットのペイロードには、2KBのデータが格納される。
リデュースBC&Get要求パケットのオフセットの欄には、DIST_ADRSの欄に格納されるアドレスからの相対値が格納される。リデュースBC&Get要求パケットを受けたスレーブは、DIST_ADRSの欄に格納されたアドレスにオフセットの欄に格納された相対値を加えたアドレスで示されるメモリ24の記憶領域から順にデータを読み出す。例えば、オフセットの欄には、”2KB”のデータを保持する記憶領域に相当するアドレスの範囲を示すアドレス値が格納される。これにより、スレーブは、マスタに送信するデータを、メモリ24において、ペイロードに格納されたデータを格納した記憶領域の次の領域から読み出す。なお、オフセットを”2KB”のデータに相当するアドレス値に固定する場合、オフセットの欄は未使用にされてもよい。
図8は、図4に示す情報処理システム100Aで使用されるパケットのフォーマットの一例(図7の続き)を示す。パケットタイプ、REQ_ID、DIST_ID、SRC_ID、DIST_ADRSおよびペイロードの欄は、図7と同じ用途である。図8に示すノード内パケットは、自ノードNDが自ノードNDのメモリ24にデータを読み書きするパケットを含む。図8に示す通常パケットは、例えば、2つのノードNDのメモリ24間でデータを転送する場合に使用される。
ノード内パケットにおいて、フェッチ要求パケットのADRSの欄には、データを読み出すメモリ24の記憶領域の先頭アドレスが格納される。ストア要求パケットとストアNextフェッチ要求パケットのADRSの欄には、ペイロードのデータを格納するメモリ24の記憶領域の先頭アドレスが格納される。ストアNextフェッチ要求パケットのNextADRSの欄には、データを読み出すメモリ24の記憶領域の先頭アドレスが格納される。NextADRSの欄に格納されるアドレスは、例えば、図5に示したメモリアクセス制御部40により算出される。
通常パケットにおいて、Get要求パケットのDIST_ADRSの欄には、メモリ24においてデータを読み出す記憶領域の先頭アドレスが格納される。Get要求パケットのデータ長の欄には、メモリ24から読み出すデータのサイズが格納される。Put要求パケットのDIST_ADRSの欄には、メモリ24においてデータを書き込む記憶領域の先頭アドレスが格納される。Put要求パケットのデータ長の欄には、メモリ24に書き込むデータのサイズが格納される。なお、特に限定されないが、図4に示すホストCPU10と各ノードND0−ND3の間でのデータ転送では、図8の通常パケットと同様のパケットが使用される。
図9は、図4に示すDMAエンジン26の動作の概要を示す。例えば、図9に示す動作は、記憶装置12から各ノードNDにリデュース演算の対象の16MBのデータが転送される毎に、各ノードNDで並列に実行される。
まず、DMAユニット32は、自ノードNDのメモリ24に保持されたリデュース演算の対象データ(例えば、2KB)を自ノードNDのバッファ30A、30Bのそれぞれに格納する。また、DMAユニット32は、他の3つのノードNDのメモリ24に保持されたリデュース演算の対象データ(例えば、2KB)を自ノードNDのバッファ30A、30Bのそれぞれに格納する(図9(a)、(b))。
なお、各バッファ30A、30Bには、合わせて8KBのデータが格納されるため、各ノードNDには、8KB以上の記憶容量を有するバッファ30A、30Bが設けられる。換言すれば、各バッファ30A、30Bの記憶容量は、図7および図8に示したパケットのペイロードに格納されるデータの最大サイズに基づいて決められる。
例えば、バッファ30A、30Bの記憶容量は、1つのパケットで転送可能なデータの最大サイズ(2KB)に、オールリデュース処理を実行するノードNDの数(4つ)を乗じた値に設定される。バッファ30A、30Bの記憶容量を、パケットのペイロードのサイズに基づいて設定することで、バッファ30A、30Bの規模を最小限にすることができる。この結果、DMAエンジン26にバッファ30A、30Bを設ける場合にも、DMAエンジン26の回路規模の増加を最小限にすることができる。
次に、演算ユニット28は、バッファ30Aに格納されたデータを用いてリデュース演算を順次実行し、リデュース演算により得られた結果データをバッファ30Aに上書きする(図9(c))。結果データを、リデュース演算に使用したデータを保持したバッファ30Aの記憶領域に上書きすることで、リデュース処理に使用するバッファ30Aの記憶容量を最小限にすることができる。なお、結果データは、バッファ30Aの空き領域に格納されてもよい。この場合、10KB以上の記憶容量を有するバッファ30A、30Bが設けられる。
次に、演算ユニット28は、バッファ30Bに格納されたデータを用いてリデュース演算を順次実行し、リデュース演算により得られた結果データをバッファ30Bに上書きする(図9(d))。DMAユニット32は、バッファ30Aに保持された結果データを、自ノードNDのメモリ24に格納するとともに、自ノードNDのメモリ24からリデュース演算を実行する次の対象データを読み出してバッファ30Aに格納する。また、DMAユニット32は、バッファ30Aに保持された結果データを、他ノードNDのメモリ24に格納するとともに、他ノードNDのメモリ24からリデュース演算を実行する次の対象データを読み出してバッファ30Aに格納する(図9(e))。DMAユニット32による自ノードNDおよび他ノードNDのメモリ24とバッファ30Aとの間でのデータの転送は、演算ユニット28がリデュース演算を実行する裏で実行される。
次に、演算ユニット28は、バッファ30Aに格納されたデータを用いてリデュース演算を順次実行し、リデュース演算により得られた結果データをバッファ30Aに上書きする(図9(f))。DMAユニット32は、演算ユニット28がリデュース演算を実行する裏で、バッファ30Bに保持された結果データをメモリ24に格納し、リデュース演算を実行する次の対象データをメモリ24から読み出してバッファ30Bに格納する(図9(g))。
この後、演算ユニット28は、データを読み出すバッファ30A、30Bを交互に切り替え、リデュース演算を実行し、DMAユニット32は、データを転送するバッファ30A、30Bを交互に切り替える。そして、バッファ30A、30Bを交互に使用して、リデュース演算とメモリ24に対するデータ転送とが繰り返し実行され、メモリ24に格納された16MBのデータのリデュース処理が実行される。図9に示す例では、バッファ30A、30Bを使用することで、リデュース演算とメモリ24に対するデータ転送とを並列に実行することができる。この結果、リデュース演算を連続して絶え間なく実行することができ、リデュース演算とメモリ24に対するデータ転送とを交互に実行する場合に比べて、リデュース処理の実行時間を短縮することができる。
図10は、図4に示す各ノードNDのメモリ24に格納されるデータと、リデュース演算の担当ノードNDとの関係の一例を示す。ノードND0のメモリ24には、自ノードND0および他ノードND1−ND3で実行するリデュース演算に使用するデータが保持される。ノードND1のメモリ24には、自ノードND1および他ノードND0、ND2、ND3で実行するリデュース演算に使用するデータが保持される。同様に、ノードND2、ND3のメモリ24にも、4つのノードND0−ND3で実行するリデュース演算に使用するデータが保持される。
図10に示すメモリ24に保持されたリデュース演算の対象データにおいて、先頭の数字は、データを保持するメモリ24のノードNDの番号を示す。”−”の後に続く2桁の数字において、上位の値はリデュース演算を実行するノードNDの番号を示し、下位の値は、データの番号を示す。図10に示すように、メモリ24に保持されるデータのうち、”−”の後に続く上位の値が”0”のデータは、ノードND0に集められ、”−”の後に続く上位の値が”1”のデータは、ノードND1に集められる。”−”の後に続く上位の値が”2”のデータは、ノードND2に集められ、”−”の後に続く上位の値が”3”のデータは、ノードND3に集められる。
そして、各ノードND0−ND3は、集められた4つのデータ毎にリデュース演算を実行する。例えば、ノードND0は、データ”0−00”、”1−00”、”2−00”、”3−00”のリデュース演算を実行し、結果データ”0−00’”を算出する。また、ノードND0は、データ”0−01”、”1−01”、”2−01”、”3−01”のリデュース演算を実行して、結果データ”0−01’”を算出する。ノードND1は、データ”0−10”、”1−10”、”2−10”、”3−10”のリデュース演算を実行し、結果データ”0−10’”を算出する。また、ノードND1は、データ”0−11”、”1−11”、”2−11”、”3−11”のリデュース演算を実行して、結果データ”0−11’”を算出する。
図10には示していないが、各ノードND0−ND3が算出した結果データは、全てのノードND0−ND3に分配される。例えば、ノードND0が算出した結果データ”0−00’”、”0−01’”は、自ノードND0のメモリ24と、他ノードND1−ND3のメモリ24にそれぞれ格納される。ノードND1が算出した結果データ”0−10’”、”0−11’”は、自ノードND1のメモリ24と、他ノードND0、ND2、ND3のメモリ24にそれぞれ格納される。
図11は、図4に示す情報処理システム100Aにおいて、各ノードNDがデータを収集し、リデュース演算を並列に実行する動作の概要を示す。図11では、図4に示す演算ユニット28は、マスタとして動作し、図4に示すDMAユニット32は、マスタまたはスレーブとして動作する。
各ノードNDにおいて、マスタとして動作するDMAユニット32は、自ノードNDで実行するリデュース演算の対象データをメモリ24から読み出し、自ノードNDのバッファ30A(または30B)に格納する(図11(a)、(b)、(c)、(d))。また、各ノードNDにおいて、スレーブとして動作するDMAユニット32は、他ノードNDで実行するリデュース演算の対象データを自ノードNDのメモリ24から読み出す(図11(e)、(f)、(g)、(h))。
そして、スレーブとして動作するDMAユニット32は、メモリ24から読み出したデータを、他ノードNDのバッファ30A(または30B)に転送する(図11(i)、(j)、(k)、(l))。例えば、ノードND0−ND3が、他ノードNDに転送するデータ量は、互いに等しい。そして、各ノードNDにおいて、マスタとして動作する演算ユニット28は、バッファ30A(または30B)に格納されたデータを用いてリデュース演算を並列に実行し、結果データを算出する。
図12は、図9において各ノードNDが並列に実行したリデュース演算の結果データを分配する動作の概要を示す。各ノードNDにおいて、マスタとして動作するDMAユニット32は、リデュース演算により算出された結果データを、自ノードNDのメモリ24に格納する(図12(a)、(b)、(c)、(d))。
また、各ノードNDにおいて、スレーブとして動作するDMAユニット32は、リデュース演算により算出された結果データを、他ノードNDに転送する(図12(e)、(f)、(g)、(h))。他ノードNDは、受けた結果データをメモリ24に格納する(図12(i)、(j)、(k)、(l))。すなわち、各ノードNDの演算ユニット28で算出された結果データは、自ノードNDおよび他ノードNDに分配される。例えば、ノードND0−ND3が、他ノードNDに転送するデータ量は、互いに等しい。
結果データは、メモリ24において、リデュース演算の対象データが保持された記憶領域に上書きされる。なお、結果データは、メモリ24において、自ノードNDにおけるリデュース演算の対象データが保持された記憶領域とは別の領域に格納されてもよい。
図13および図14は、図4に示す情報処理システム100Aの動作の一例を示す。各ノードND0−ND3は、図13および図14に示すマスタの動作とスレーブの動作とを並列に実行する。すなわち、図11および図12に示したように、マスタの動作とスレーブの動作は、全てのノードND0−ND3のそれぞれで実行される。なお、図13および図14は、説明を分かりやすくするために、ノードND0のマスタとしての動作と、ノードND1のスレーブとして動作を示す。
まず、ノードND0−ND3は、演算ユニット20を動作させ、メモリ24に保持されたデータを使用して積和演算等の演算処理を並列に実行し、演算結果をメモリ24に格納する処理を繰り返す。演算ユニット20による演算の結果(図11に示した”0−00”、”0−01”等)は、リデュース演算に使用するデータとしてメモリ24に格納される。
そして、ノードND0−ND3は、バリア同期等により演算処理の完了を待ち合わせる。ノードND0のDMAユニット32は、自ノードND0および他ノードND1−ND3の演算ユニット20による演算処理の完了に基づいて、リデュース演算を実行するためにDMA処理(リデュースDMA)を起動する(図13(a))。
ノードND0のDMAユニット32は、自ノードのメモリ24からリデュース演算に使用するデータを読み出すためにフェッチ要求を発行する(図13(b))。リデュース演算の実行を開始する前、バッファ30A、30Bには、以前に実行されたリデュース演算の結果データ等の無効なデータが格納されている。このため、DMAユニット32は、バッファ30A、30Bのそれぞれにデータを格納するために、フェッチ要求を2回発行する。ノードND0のメモリ24からのフェッチ応答に含まれるデータは、バッファ30A、30Bにそれぞれ格納される(図13(c))。なお、メモリ24から読み出したデータをバッファ30A、30Bのいずれに格納するかは、図5に示すシーケンサ38の制御により決められる。
ノードND0のDMAユニット32は、他ノードND1−ND3のメモリ24からリデュース演算に使用するデータを読み出すために、他ノードND1−ND3の各々にリデュースGet要求を発行する(図13(d))。リデュースGet要求は、データの転送要求の一例である。バッファ30A、30Bのそれぞれに格納するデータを各ノードから転送させるため、リデュースGet要求は、各ノードND1−ND3毎に2回発行される。
他ノードND1−ND3のDMAユニット32は、ノードND0からのリデュースGet要求に基づいて、自ノードのメモリ24にフェッチ要求を発行する(図13(e))。他ノードND1−ND3のDMAユニット32は、自ノードのメモリ24からのフェッチ応答に含まれるデータを受信する(図13(f))。他ノードND1−ND3のDMAユニット32は、フェッチ応答に含まれるデータをノードND0(マスタ)に転送するため、リデュースGet応答をそれぞれ発行する(図13(g))。
なお、実際の動作では、フェッチ要求は、図5に示すメモリコントローラ22に発行される。フェッチ要求を受けたメモリコントローラ22は、メモリ24からデータを読み出し、読み出したデータを含むフェッチ応答をDMAユニット32に出力する。後述するストア&Nextフェッチ要求もメモリコントローラ22に発行され、メモリコントローラ22からストア&Nextフェッチ応答が出力される。
ノードND0のDMAユニット32は、他ノードND1−ND3のメモリ24からのリデュースGet応答に含まれるデータを、バッファ30A、30Bのそれぞれに格納する(図13(h))。各ノードND0−ND3によるマスタおよびスレーブとしての動作により、各ノードND0−ND3のメモリ24は、図11に示す状態になる。
マスタとして動作するノードND0が、リデュースDMAを起動し、リデュースGet要求を他ノードND1−ND3に発行することで、ノードND0は、他ノードND1−ND3からのリデュースGet応答を待つことができる。これにより、マスタとして動作するノードND0のシーケンサ38は、既存のシーケンサと同様の制御をすることで、他ノードND1−ND3のメモリ24に保持されたリデュース演算の対象データを収集することができる。
各ノードND0−ND3のメモリ24からバッファ30A、30Bへのデータの格納が完了した後、ノードND0の演算ユニット28は、例えば、バッファ30Aに保持されたデータを使用して、リデュース演算を実行する(図13(i))。演算ユニット28は、バッファ30Aからデータを取り出してリデュース演算を実行し、リデュース演算により得られた結果データを図5に示すストアバッファ40cおよび送信バッファ46aに転送する処理を繰り返し実行する。バッファ30A、30Bは、メモリ24に比べてアクセスレイテンシが小さいため、演算対象のデータの読み出しを高速に実行することができる。なお、演算ユニット28は、リデュース演算により得られた結果データを、演算の対象データを取り出したバッファ30Aに転送(上書き)する処理を繰り返し実行してもよい。
ノードND0のDMAユニット32は、バッファ30Aに保持された全てのデータのリデュース演算の完了に基づいて、ストア&Nextフェッチ要求を発行する(図13(j))。ストア&Nextフェッチ要求には、ストアバッファ40cに格納されたリデュース演算の結果データが含まれる。なお、リデュース演算の結果データがバッファ30Aに格納される場合、ストア&Nextフェッチ要求には、バッファ30Aに格納されたリデュース演算の結果データが含まれる。メモリコントローラ22は、ストア&Nextフェッチ要求に基づいて、ストア&Nextフェッチ要求に含まれる結果データをメモリ24に格納する。
また、メモリコントローラ22は、ストア&Nextフェッチ要求に基づいて、次のリデュース演算に使用するデータをメモリ24から読み出し、読み出したデータを含むストア&Nextフェッチ応答を出力する。ストア&Nextフェッチ応答に含まれるデータは、シーケンサ38による制御に基づいて、リデュース演算の結果データを出力済みのバッファ30Aに格納される(図13(k))。
さらに、ノードND0のDMAユニット32は、リデュース演算の結果データを他ノードND1−ND3のメモリ24に格納するため、他ノードND1−ND3にリデュースBC&Get要求を発行する(図13(l))。リデュースBC&Get要求には、送信バッファ46aに格納されたリデュース演算の結果データが含まれる。なお、リデュース演算の結果データがバッファ30Aに格納される場合、リデュースBC&Get要求には、バッファ30Aに格納されたリデュース演算の結果データが含まれる。リデュースBC&Get要求は、格納読出要求の一例である。
図12で説明したように、各ノードNDで実行されたリデュース演算の結果データは、他ノードNDにそれぞれ転送される。換言すれば、リデュース演算の結果データを含むパケットにおいて、宛先と格納アドレス以外の情報は共通である。このため、リデュースBC&Get要求により、リデュース演算の結果データをブロードキャストすることで、各ノードND1−ND3に送信するパケットをそれぞれ生成する場合に比べて、DMAユニット32の送信制御を簡易にすることができる。
他ノードND1−ND3のDMAユニット32は、ノードND0からのリデュースBC&Get要求に基づいて、自ノードのメモリ24にストア&Nextフェッチ要求を発行する(図13(m))。他ノードND1−ND3におけるストア&Nextフェッチ要求に基づく動作は、上述したノードND0におけるストア&Nextフェッチ要求に基づく動作と同様である。他ノードND1−ND3のDMAユニット32は、メモリ24からのフェッチ応答に含まれるデータを受信する(図13(n))。
他ノードND1−ND3のDMAユニット32は、ストア&Nextフェッチ応答に含まれるデータをノードND0(マスタ)に転送するため、リデュースBC&Get応答を発行する(図13(o))。リデュースBC&Get応答に含まれるデータは、シーケンサ38による制御に基づいて、リデュース演算の結果データを出力済みのバッファ30Aに格納される(図13(p))。
リデュース演算を実行していないデータがメモリ24に残っている場合、リデュースBC&Get要求を発行することで、リデュース演算の結果データのメモリ24への格納と次のリデュース演算用のデータの読み出しとを1つのパケットで処理することができる。同様に、ストア&Nextフェッチ要求を発行することで、リデュース演算の結果データのメモリ24への格納と次のリデュース演算用のデータの読み出しとを1つのパケットで処理することができる。
ノードND0の演算ユニット28は、バッファ30Aへのデータの格納処理中に、バッファ30Bに保持されたデータを使用して、リデュース演算を実行する(図13(q))。換言すれば、バッファ30Aへのデータの転送は、演算ユニット28によるリデュース演算の裏で実行される。演算ユニット28は、バッファ30Bからデータを取り出して演算し、演算により得られた結果データを図5に示すストアバッファ40cおよび送信バッファ46aに格納する処理を繰り返し実行する。
次に、図14において、ノードND0のDMAユニット32は、演算ユニット28によるリデュース演算の実行により得られた結果データを自ノードのメモリ24に格納するため、ストア&Nextフェッチ要求を発行する(図14(a))。
メモリコントローラ22は、ストア&Nextフェッチ要求に含まれる結果データをメモリ24に格納し、次のリデュース演算に使用するデータをメモリ24から読み出し、読み出したデータを含むストア&Nextフェッチ応答を出力する(図14(b))。ストア&Nextフェッチ応答に含まれるデータは、シーケンサ38による制御に基づいて、バッファ30Bに格納される(図14(b))。すなわち、シーケンサ38は、複数のストア&Nextフェッチ応答に含まれるデータをバッファ30A、30Bに交互に格納する。
また、ノードND0のDMAユニット32は、リデュース演算の結果データを他ノードND1−ND3のメモリ24に格納するため、他ノードND1−ND3にリデュースBC&Get要求を発行する(図14(c))。リデュースBC&Get要求に基づく他ノードND1−ND3の動作は、図13(l)、(m)、(n)で説明した動作と同様である。リデュースBC&Get応答に含まれるデータは、シーケンサ38による制御に基づいてバッファ30Bに格納される(図14(d))。
ノードND0の演算ユニット28は、バッファ30Bへのデータの格納処理中に、バッファ30Aに保持されたデータを使用して、リデュース演算を実行する(図14(e))。この後、バッファ30A、30Bの一方に保持されたデータを交互に使用してリデュース演算が実行され、リデュース演算の裏で、リデュース演算に使用されないバッファ30A、30Bの他方に新たなデータが転送される。
ノードND0のDMAユニット32は、例えば、バッファ30Aに保持されたデータを使用した最後のリデュース演算が実行された後、自ノードのメモリ24に結果データを格納するためにストア要求を発行する(図14(f))。メモリコントローラ22は、ストア要求に含まれる結果データをメモリ24に格納する。また、ノードND0のDMAユニット32は、他ノードND1−ND3にリデュースBC要求を発行する(図14(g))。他ノードND1−ND3のDMAユニット32は、ノードND0からのリデュースBC要求に基づいて、自ノードのメモリ24に結果データを格納するためにストア要求を発行する(図14(h))。そして、バッファ30Aに保持されたデータを使用した最後のリデュース演算の結果データが各ノードND0−ND3のメモリ24に格納される。
バッファ30Aに保持されたデータを使用した最後のリデュース演算の結果データを自ノードND0−ND3のメモリ24に転送中、ノードND0の演算ユニット28は、バッファ30Bに保持されたデータを使用して、リデュース演算を実行する(図14(i))。ノードND0のDMAユニット32は、例えば、バッファ30Bに保持されたデータを使用した最後のリデュース演算が実行された後、自ノードへのストア要求と、他ノードND1−ND3へのリデュースBC要求を発行する(図14(j)、(k))。そして、バッファ30Bに保持されたデータを使用した最後のリデュース演算の結果データが各ノードND0−ND3のメモリ24に格納される。なお、図14では、ストア要求に基づいて発行されるストア応答と、リデュースBC要求に基づいて発行されるリデュースBC応答との記載は省略される。
なお、図13および図14において、リデュースBC&Get要求の代わりに、リデュースBC要求と複数のリデュースGet要求とが順次発行されてもよく、他ノードND1−ND3に、リデュースPut要求とリデュースGet要求とが発行されてもよい。また、図14において、ストア&Nextフェッチ要求の代わりに、ストア要求とフェッチ要求とが順次発行されてもよい。
図15は、図13および図14に示すマスタの動作フローの一例を示す。図15に示す動作フローは、全てのノードND0−ND3の演算ユニット20が実行する積和演算等の演算処理の完了に基づいて開始される。
まず、ステップS10において、マスタは、リデュース演算の対象データを自ノードのメモリ24と他ノードのメモリ24から自ノードのバッファ30A、30Bのいずれかに転送する。次に、ステップS12において、マスタは、バッファ30Aに保持されたデータのリデュース演算を実行する。この後、マスタは、バッファ30Aに対するデータの転送動作およびバッファ30Bに保持されたデータのリデュース演算と、バッファ30Bに対するデータの転送動作およびバッファ30Aに保持されたデータのリデュース演算とを並列に実行する。すなわち、マスタは、ステップS20、S22、S24、S26の動作と、ステップS30、S32、S34、S36の動作とを並列に実行する。
ステップS20において、マスタは、バッファ30Aに保持されたデータを使用したリデュース演算の結果データを自ノードのメモリ24と他ノードのメモリ24に格納する処理を実行する。次に、ステップS22において、マスタは、メモリ24に保持されたデータのバッファ30Aを使用したリデュース演算が完了していない場合、動作をステップS24に移行させる。一方、マスタは、メモリ24に保持されたデータのバッファ30Aを使用したリデュース演算が完了した場合、バッファ30Aを使用したリデュース演算の処理を完了する。
ステップS24において、マスタは、次のリデュース演算の対象データを自ノードのメモリ24と他ノードのメモリ24から自ノードのバッファ30Aに転送する。次に、ステップS26において、マスタは、バッファ30Aに保持されたデータのリデュース演算を実行し、動作をステップS20に移行させる。
一方、ステップS30において、マスタは、バッファ30Bに保持されたデータのリデュース演算を実行する。次に、ステップS32において、マスタは、バッファ30Bに保持されたデータを使用したリデュース演算の結果データを自ノードのメモリ24と他ノードのメモリ24に格納する処理を実行する。次に、ステップS34において、マスタは、メモリ24に保持されたデータのバッファ30Bを使用したリデュース演算が完了していない場合、動作をステップS36に移行させる。一方、マスタは、メモリ24に保持されたデータのバッファ30Bを使用したリデュース演算が完了した場合、バッファ30Bを使用したリデュース演算の処理を完了する。
ステップS36において、マスタは、次のリデュース演算の対象データを自ノードのメモリ24と他ノードのメモリ24から自ノードのバッファ30Bに転送し、動作をステップS30に移行させる。
図16は、図13および図14に示すスレーブの動作フローの一例を示す。図16に示す動作フローは、所定の頻度で開始される。
まず、ステップS40において、スレーブは、他ノードからデータの格納要求を受信した場合、動作をステップS42に移行し、他ノードからデータの格納要求を受信していない場合、動作をステップS44に移行させる。ここで、データの格納要求は、図13および図14に示すリデュースBC&Get要求またはリデュースBC要求である。
ステップS42において、スレーブは、他ノードから受信したデータをメモリ24に格納し、動作をステップS44に移行する。ステップS44において、スレーブは、他ノードからデータの転送要求を受信した場合、動作をステップS46に移行し、他ノードからデータの転送要求を受信していない場合、動作を終了する。ここで、データの転送要求は、図13および図14に示すリデュースGet要求またはリデュースBC&Get要求である。ステップS46において、スレーブは、転送する対象データをメモリ24から読み出して転送要求の発行元に出力し、動作を終了する。
図17は、図4に示す情報処理システム100Aが実行するディープラーニングの一例を示す。図17に示す処理は、各ノードND0−ND3で並列に実行される。すなわち、ノードND0がマスタとして動作する場合、ノードND1−ND3がスレーブとして動作し、ノードND1がマスタとして動作する場合、ノードND0、ND2、ND3がスレーブとして動作する。ノードND2がマスタとして動作する場合、ノードND0、ND1、ND3がスレーブとして動作し、ノードND3がマスタとして動作する場合、ノードND0−ND2がスレーブとして動作する。以下では、ノードND0がマスタとして動作し、ノードND1−ND3がスレーブとして動作する例が説明される。
まず、ノードND0(マスタ)は、演算ユニット20を使用して、複数の画像データ等の学習データL00と、予め算出されたパラメータP0との演算を実行することで、学習データL00の特徴を抽出する。ノードND0は、演算ユニット20を使用して、抽出した特徴を正解データと比較することで誤差データE00を抽出する(図17(a))。
他のノードND1−ND3(スレーブ)は、学習データL00−L30とパラメータP0とに基づいて学習データの特徴を抽出し、抽出した特徴を正解データと比較することで誤差データE10−E30をそれぞれ抽出する(図17(b)、(c)、(d))。学習データL00、L10、L20、L30は、ノードND0−ND3毎に異なり、パラメータP0および正解データは、ノードND0−ND3に共通である。
各ノードND0−ND3が抽出した誤差データE00、E10、E20、E30は、図11に示したように、各ノードND0−ND3のメモリ24に格納される。図11において、データ”0−00”、”0−01”等は、誤差データの要素をそれぞれ示す。誤差データE00、E10、E20、E30は、互いに異なる学習データL00、L10、L20、L30に基づいて算出されるため、誤差データE00、E10、E20、E30の値はばらつく。このため、次の学習用のパラメータの更新に使用するために、誤差データE00、E10、E20、E30を平均化する平均化処理が実行される。
すなわち、ノードND0は、自ノードが抽出した誤差データE00と、ノードND1−ND3が抽出した誤差データE10、E20、E30とを収集する(図17(e))。誤差データE00、E10、E20、E30は、図11に示したように、DMAユニット32の動作により、各ノードND0−ND3のメモリ24からノードND0(マスタ)のバッファ30Aまたは30Bに転送される。そして、ノードND0は、演算ユニット28を使用して、バッファ30Aまたは30Bに転送された誤差データE00、E10、E20、E30の各要素を平均化する処理を実行する(図17(f))。すなわち、リデュース演算が実行される。
ノードND0は、平均化により得られたデータ(リデュース演算の結果データ)を、図12に示したように、ノードND0−ND3のメモリ24に転送する(図17(g))。平均化により得られたデータは、図12に示す”0−00’”、”0−01’”等である。図11に示したように、ノードND1−ND3の各々は、ノードND0による誤差データE00−E30の平均化処理の実行中に、他の誤差データの平均化処理を実行し、平均化した誤差データを他のノードNDに分配する。
この後、各ノードND0−ND3は、演算ユニット20を使用して、自ノードNDおよび他ノードNDで平均化した誤差データに基づいてパラメータを更新する処理を実行する(図17(h)、(i)、(j)、(k))。そして、各ノードND0−ND3は、次の学習データL01(またはL11、L12、L13のいずれか)と、更新されたパラメータP1との演算を実行することで、新たな誤差データE01(またはE11、E12、E13のいずれか)を抽出する。この後、図17(e)、(f)、(g)と同様に、誤差データE01、E11、E21、E31の収集、平均化処理および平均化された誤差データの分配が実行される。このように、パラメータに基づいて学習データの特徴を抽出する処理と、抽出した特徴を正解データと比較して誤差データを抽出する処理と、抽出した誤差データを使用してパラメータを更新する処理とを繰り返し実行することで、学習度が習熟していく。
図18は、図4に示す情報処理システム100Aと異なる他の情報処理システムの一例を示す。図4と同一の要素については、同じ符号を付し、詳細な説明は省略する。図18に示す情報処理システム100Bは、各ノードND(ND0−ND3)の構成が、図4に示す各ノードND(ND0−ND3)の構成と相違する。
各ノードNDは、演算ユニット20B、メモリコントローラ22、メモリ24およびDMAユニット32Bを含むDMAエンジン26Bを有する。DMAエンジン26Bは、図4に示す演算ユニット28およびバッファ30A、30Bを持たない。DMAユニット32Bは、自ノードNDのメモリ24、他ノードNDのメモリ24および記憶装置12の間でのデータの転送を制御する。
図18に示す情報処理システム100Bでは、各ノードNDは、DMAユニット32Bを使用して、リデュース演算に使用するデータを他ノードNDのメモリ24から自ノードNDのメモリ24に転送する。各ノードNDは、演算ユニット20Bを動作させて、メモリ24に保持されたデータのリデュース演算を実行し、リデュース演算により得られた結果データを自ノードNDのメモリ24に格納する。リデュース演算は、DMAユニット32Bによるデータの転送単位(例えば、16MB)で実行される。そして、各ノードNDは、DMAユニット32Bを使用して、リデュース演算の結果データを他ノードNDのメモリ24に分配する。
図19は、図18に示すDMAエンジン26Bの動作の概要を示す。まず、DMAユニット32Bは、他ノードNDのメモリ24に保持されたリデュース演算の対象データ(例えば、4MB)を自ノードNDのメモリ24に転送することで、16MBのデータをメモリ24に収集する(図19(a))。次に、演算ユニット20Bは、メモリ24に保持されたデータを使用してリデュース演算を実行し、実行により得られた結果データをメモリ24に格納する。次に、DMAユニット32Bは、結果データを他ノードNDのメモリ24に分配する。
図20は、図18に示す情報処理システム100Bの動作の一例を示す。図13および図14と同様の動作については、詳細な説明は省略する。各ノードND0−ND3は、マスタの動作とスレーブの動作とを並列に実行する。図20では、説明を分かりやすくするために、ノードND0のマスタとしての動作と、ノードND1のスレーブとして動作を示す。また、図13および図14と同様に、メモリコントローラ22の動作は省略される。
まず、図13と同様に、ノードND0−ND3は、演算ユニット20Bを動作させて積和演算等の演算処理を並列に実行し、バリア同期等により演算処理の完了を待ち合わせる。演算ユニット20Bの動作により、リデュース演算に使用するデータがメモリ24に格納される。ノードND0のDMAユニット32Bは、自ノードND0および他ノードND1−ND3の演算ユニット20による演算処理の完了に基づいて、リデュース演算を実行するため、以下に説明するDMAを起動する(図20(a))。
ノードND0のDMAユニット32Bは、ノードND1−ND3のメモリ24からリデュース演算に使用するデータを読み出すために、ノードND1−ND3の各々にGet要求を発行する(図20(b))。例えば、各Get要求で指定されるデータの転送長は4MBである。
ノードND1のDMAユニット32Bは、ノードND0からのGet要求に基づいて、自ノードのメモリ24にフェッチ要求を発行する(図20(c))。ノードND1のDMAユニット32Bは、メモリ24からのフェッチ応答に含まれるデータを受信する(図20(d))。ノードND1のDMAユニット32Bは、フェッチ応答に含まれるデータをノードND0(マスタ)に転送するため、Get応答を発行する(図20(e))。ノードND2、ND3のDMAユニット32Bも、図20(c)、図20(d)に示す処理と同じ処理を実行する。
ノードND0のDMAユニット32Bは、ノードND1−ND3のメモリ24からのGet応答に含まれるデータを、メモリ24に格納するために、各ノードND1−ND3からのデータの受信に基づいてストア要求を発行する(図20(f))。
リデュース演算の対象データがメモリ24に転送された後、ノードND0の演算ユニット20Bは、メモリ24に保持されたデータをロードしてリデュース演算を実行し、リデュース演算の実行により得られた結果データをメモリ24にストアする(図20(g))。そして、データのメモリ24からのロードと、リデュース演算と、結果データのメモリ24へのストアとが、16MBのデータに対して繰り返し実行される。
ノードND0のDMAユニット32Bは、メモリ24に保持された全ての対象データのリデュース演算の実行が完了した場合、DMAを起動し、自ノードNDのメモリ24から他ノードNDのメモリ24に、結果データ(4MB)を転送する。すなわち、ノードND0のDMAユニット32Bは、自ノードNDのメモリ24にフェッチ要求を発行し、自ノードNDのメモリ24からのフェッチ応答に含まれる結果データを受信する(図20(h)、(i))。そして、ノードND0のDMAユニット32Bは、受信した結果データを含むリデュースBC要求をノードND1−ND3に発行する(図20(j))。
ノードND1のDMAユニット32Bは、リデュースBC要求に含まれる結果データを自ノードNDのメモリ24に格納するために、ストア要求を発行する(図20(k))。ノードND2、ND3のDMAユニット32Bも、図20(k)と同様にストア要求を発行する。そして、ノードND0で実行されたリデュース演算の結果データが、ノードND1−ND3に分配される。
図18に示す情報処理システム100Bでは、リデュース演算の対象データがメモリ24に格納されるため、図4に示す情報処理システム100Aに比べて、メモリ24内の記憶領域の使用量が増大する。リデュース演算の対象データのメモリ24への転送とリデュース演算とは、互いに重複することなく、異なるタイミングで実行される。このため、図4に示す情報処理システム100Aに比べて、積和演算等の演算処理の完了後にDMAを起動してから、所定量のリデュース演算の結果データの他ノードNDへの分配が完了するまでのレイテンシが大きくなる。
また、リデュース演算の実行毎にメモリ24がアクセスされるため、図4に示す情報処理システム100Aに比べて、メモリ24のアクセス頻度が高くなる。このため、演算ユニット20Bが実行する他の演算によるメモリ24のアクセスのスループットが圧迫される。さらに、リデュース演算が演算ユニット20Bで実行されるため、演算ユニット20Bは、リデュース演算を実行中に、他の演算を実行できない。メモリ24のアクセスのスループットの圧迫と、演算ユニット20Bでのリデュース演算の実行とにより、図4に示す情報処理システム100Aに比べて、各ノードND0−ND3の演算性能が低下する。
以上、図4から図17に示す実施形態においても、図1に示す実施形態と同様の効果を得ることができる。例えば、リデュース演算を実行する演算ユニット28を演算ユニット20とは別に設けることで、演算ユニット20は、演算ユニット28によるリデュース演算の動作の影響を受けることなく、リデュース演算の対象データを生成する演算等を実行することができる。すなわち、演算ユニット28が実行するオールリデュース処理により、他の演算の処理性能が低下することを抑止することができる。また、演算ユニット28は、演算ユニット20によるリデュース演算の対象データを生成する演算の動作の影響を受けることなく、リデュース演算を実行することができる。さらに、リデュース演算は主記憶装置3にアクセスすることなく実行されるため、主記憶装置3へのアクセス効率がリデュース演算の実行により低下することを抑止することができる。
リデュース演算の対象データは、メモリ24に比べてアクセスレイテンシが小さいバッファ30A、30Bに転送されるため、対象データをメモリ24に転送する場合に比べて、対象データの転送時間を短縮することができる。これにより、リデュース演算を早く開始することができる。また、バッファ30A、30Bからの対象データの読み出しを、メモリ24からの対象データの読み出しに比べて高速に実行できる。これにより、リデュース演算の実行期間を短縮でき、結果データの転送を早く開始することができる。この結果、次のリデュース演算の対象データをバッファ30A、30Bに早く転送することができ、次のリデュース演算を早く開始することができる。
さらに、図4から図17に示す実施形態では、バッファ30A、30Bを使用することで、リデュース演算とメモリ24に対するデータ転送とを並列に実行することができる。この結果、リデュース演算を連続して絶え間なく実行することができ、リデュース演算とメモリ24に対するデータ転送とを交互に実行する場合に比べて、リデュース処理の実行時間を短縮することができる。
マスタとして動作するノードND0が、リデュースDMAを起動し、リデュースGet要求を他ノードND1−ND3に発行することで、ノードND0は、他ノードND1−ND3からのリデュースGet応答を待つことができる。これにより、マスタとして動作するノードND0のシーケンサ38は、既存のシーケンサと同様の制御により、他ノードND1−ND3のメモリ24に保持されたリデュース演算の対象データを収集することができる。
リデュース演算を実行していないデータがメモリ24に残っている場合、リデュースBC&Get要求を発行することで、リデュース演算の結果データのメモリ24への格納と次のリデュース演算用のデータの読み出しとを1つのパケットで処理することができる。同様に、ストア&Nextフェッチ要求を発行することで、リデュース演算の結果データのメモリ24への格納と次のリデュース演算用のデータの読み出しとを1つのパケットで処理することができる。
リデュースBC&Get要求等のブロードキャスト用のパケットを用いてリデュース演算の結果データを他ノードNDに転送することで、他ノードNDへのパケットを個別に生成する場合に比べて、DMAユニット32の転送制御を簡易にすることができる。
バッファ30A、30Bの記憶容量を、パケットのペイロードのサイズに基づいて設定することで、バッファ30A、30Bの規模を最小限にすることができる。この結果、DMAエンジン26にバッファ30A、30Bを設ける場合にも、DMAエンジン26の回路規模の増加を最小限にすることができる。
以上より、オールリデュース処理を実行する情報処理システム100Aの処理性能を向上することができる。
図21は、情報処理システムの別の実施形態における動作の一例を示す。図4から図20に示す実施形態で説明した要素と同一または同様の要素については、同一の符号を付し、詳細な説明は省略する。図21に示す動作を実行する情報処理システムの構成および機能は、図5に示すシーケンサ38の制御の一部が相違することを除き、図4および図5に示す情報処理システム100Aの構成および機能と同様である。図21では、図13と同様に、ノードND0のマスタとしての動作と、ノードND1のスレーブとして動作とが示される。
まず、ノードND0−ND3は、演算ユニット20を動作させて積和演算等の演算処理を並列に実行し、バリア同期等により演算処理の完了を待ち合わせる。演算ユニット20の動作により、図11に示したように、リデュース演算に使用するデータがメモリ24に格納される。
まず、ノードND0のDMAユニット32は、図13と同様に、各ノードND0−ND3の演算ユニット20による演算処理の完了に基づいて、リデュースDMAを起動する(図21(a))。ノードND0のDMAユニット32は、自ノードのメモリ24からリデュース演算に使用するデータを読み出すためにフェッチ要求を発行する(図21(b))。DMAユニット32は、バッファ30A、30Bのそれぞれにデータを格納するために、フェッチ要求を2回発行する。フェッチ応答に含まれるデータは、バッファ30A、30Bにそれぞれ格納される(図21(c))。
一方、ノードND1のDMAユニット32は、各ノードND0−ND3の演算ユニット20による演算処理の完了に基づいて、リデュース演算の対象データを読み出すために、メモリ24にフェッチ要求を発行する(図21(d))。フェッチ要求は、ノードND0、ND2、ND3のバッファ30A、30Bに対応して6回発行される。
ノードND1のDMAユニット32は、メモリ24からのフェッチ応答に含まれるデータを受信する(図21(e))。ノードND1のDMAユニット32は、フェッチ応答に含まれるデータをノードND0、ND2、ND3のそれぞれに転送するため、各ノードND0、ND2、ND3に対してリデュースPut要求を2回ずつ発行する(図21(f))。ノードND2、ND3は、ノードND1と同様に動作し、リデュース演算の対象データをノードND0に転送するために、リデュースPut要求を2回ずつ発行する(図21(g))。これ以降の動作は、図13および図14と同じである。
スレーブとして動作するノードND1−ND3は、マスタとしても動作するため、マスタとしての自ノードのメモリ24のフェッチ要求の発行に基づいて、リデュースPut要求用のフェッチ要求を発行することができる。図21では、図13に示したマスタからのリデュースBC&Get要求を待たずに、メモリ24からリデュース演算の対象データを取り出してマスタに転送できる。このため、図13に比べて、リデュース演算の対象データのバッファ30A、30Bへの格納が完了するタイミングを早くすることができ、最初のリデュース演算を早く開始することができる。この結果、図4に示す情報処理システム100Aに比べて、オールリデュース処理に掛かる時間を短縮することができる。例えば、図17に示したディープラーニングにおいて、誤差データE01、E11、E21、E31の収集、平均化処理および平均化された誤差データの分配に掛かる時間を短縮することができる。
以上、図21に示す実施形態においても、図1から図20に示す実施形態と同様の効果を得ることができる。さらに、図21に示す実施形態では、積和演算等の演算処理の完了に基づいて、スレーブが自発的にリデュース演算の対象データをマスタに転送することで、オールリデュース処理に掛かる時間を短縮することができる。
図22は、情報処理システムの別の実施形態における動作の一例を示す。図13と同一または同様の動作については、詳細な説明は省略する。図4から図20に示す実施形態で説明した要素と同一または同様の要素については、同一の符号を付し、詳細な説明は省略する。図22に示す動作を実行する情報処理システムの構成および機能は、図5に示すシーケンサ38の制御の一部が相違することを除き、図4および図5に示す情報処理システム100Aの構成および機能と同様である。図22では、図13と同様に、ノードND0のマスタとしての動作と、ノードND1のスレーブとして動作とが示される。
この実施形態では、各ノードND0−ND3の演算ユニット20による演算処理の完了に基づいて、図13と同様に、各ノードND0−ND3のメモリ24からバッファ30Aへのリデュース演算に使用するデータの転送が実行される(図22(a))。但し、各ノードND0−ND3のメモリ24からバッファ30Bへのリデュース演算に使用するデータの転送は、この時点では実行されない。図22において、バッファ30Bへのデータの転送処理を除く動作は、図13と同じである。
ノードND0のDMAユニット32(マスタ)は、演算ユニット28がバッファ30Aに保持されたデータを使用してリデュース演算を実行中に、バッファ30Bにデータを格納するためのフェッチ要求を発行する(図22(b))。フェッチ応答に含まれるデータは、リデュース演算を実行中にバッファ30Bに格納される(図22(c))。
また、ノードND0のDMAユニット32は、演算ユニット28がバッファ30Aに保持されたデータを使用してリデュース演算を実行中に、他ノードND1−ND3に、バッファ30Bにデータを格納するためのリデュースGet要求を発行する(図22(d))。他ノードND1−ND3のDMAユニット32(スレーブ)は、バッファ30Bにデータを格納するためのリデュースGet要求に基づいて、メモリ24にフェッチ要求を発行する(図22(e))。
他ノードND1−ND3のDMAユニット32は、フェッチ応答によりメモリ24から読み出したデータを含むリデュースGet応答をノードND0に発行する(図22(f))。そして、演算ユニット28がバッファ30Aに保持されたデータを使用してリデュース演算を実行中に、他ノードND1−ND3から転送されたデータがバッファ30Bに格納される(図22(g))。
図22に示す動作に続いて、図14に示す動作が実行される。図22に示す動作では、演算ユニット20による演算処理の完了に基づいて、バッファ30Aにデータが転送され、バッファ30Aに転送されたデータを使用してリデュース演算の実行中に、バッファ30Bにデータを格納するためのフェッチ要求およびリデュースGet要求が発行される。演算ユニット20による演算処理の完了に基づいて、バッファ30Aにデータを格納するためのDMA動作を集中して実行することで、バッファ30Aへのデータの格納を図13に比べて早く完了することができる。この結果、図13に比べて、最初のリデュース演算を早く開始することができ、オールリデュース処理の効率を向上することができる。
以上、図22に示す実施形態においても、図1から図20に示す実施形態と同様の効果を得ることができる。さらに、図22に示す実施形態では、DMAユニット32は、演算ユニット20による演算処理の完了後のバッファ30Bへの最初のデータの転送を、演算ユニット28によるバッファ30Aに保持されたデータのリデュース演算中に実行する。バッファ30Aにデータを格納するためのDMA動作を集中して実行することで、バッファ30Aへのデータの格納を図13に比べて早く完了することができる。この結果、図13に比べて、最初のリデュース演算を早く開始することができ、オールリデュース処理の効率を向上することができる。
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずである。したがって、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。