(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-10-11
(45)【発行日】2022-10-19
(54)【発明の名称】情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラム
(51)【国際特許分類】
G06F 7/00 20060101AFI20221012BHJP
【FI】
G06F7/00
(21)【出願番号】P 2018148475
(22)【出願日】2018-08-07
【審査請求日】2021-05-13
(73)【特許権者】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】阪本 卓也
(72)【発明者】
【氏名】土手口 正裕
(72)【発明者】
【氏名】荒川 敬
【審査官】佐賀野 秀一
(56)【参考文献】
【文献】国際公開第2003/084077(WO,A1)
【文献】特開平06-028309(JP,A)
【文献】特開平04-312160(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 7/00- 7/36
(57)【特許請求の範囲】
【請求項1】
第1要素データを複数含む第1データの第1サイズと、前記第1要素データ未満のサイズの第2要素データを複数含む第2データの第2サイズとの差が所定値以上の場合、前記第1要素データを
前記第2要素データよりも小さいサイズに分割して分割データを生成する分割制御部と、
前記分割制御部により生成された前記分割データを基に、前記第2要素データと同じサイズの第1拡張データを生成する変換部と、
前記第1拡張データと前記第2要素データとを結合させて結合データを生成する結合部と、
前記結合データを用いて行われた演算結果データを取得し、前記演算結果データを前記第2要素データのサイズに分けて、前記第1拡張データに対する第1演算結果及び前記第2要素データに対する第2演算結果を取得する分離部と、
前記第1演算結果を基に、前記第1要素データに対する演算結果を取得する復元部と
を備えたことを特徴とする情報処理装置。
【請求項2】
前記分割制御部は、前記第1サイズと前記第2サイズとの差が所定値未満の場合、前記第1要素データ及び前記第2要素データをそのまま維持し、
前記変換部は、前記分割制御部により生成された前記第2要素データを基に、前記第1要素データと同じサイズの第2拡張データを生成し、
前記結合部は、前記第2拡張データと前記第1要素データとを結合させて前記結合データを生成し
前記分離部は、前記演算結果データを前記第1要素データのサイズに分けて、前記第1要素データに対する第3演算結果及び前記第2拡張データに対する第4演算結果を取得し、
前記復元部は、前記第4演算結果を基に、前記第2要素データに対する演算結果を取得する
ことを特徴とする請求項
1に記載の情報処理装置。
【請求項3】
前記変換部は、前記分割データ及び前記第2要素データを受信し、前記分割データに対して所定処理を施して変換分割データを生成し、前記変換分割データに0のビット列を加えて前記第2要素データのサイズと同じサイズの前記第1拡張データを生成することを特徴とする請求項
1又は2に記載の情報処理装置。
【請求項4】
第1要素データを複数含む第1データの第1サイズと、前記第1要素データ未満のサイズの第2要素データを複数含む第2データの第2サイズとの差が所定値以上の場合、前記第1要素データを
前記第2要素データよりも小さいサイズに分割して分割データを生成し、
前記分割データを基に、前記第2要素データと同じサイズの第1拡張データを生成し、
前記第1拡張データと前記第2要素データとを結合させて結合データを生成し、
前記結合データを用いて行われた演算結果データを取得し、前記演算結果データを前記第2要素データのサイズに分けて、前記第1拡張データに対する第1演算結果及び前記第2要素データに対する第2演算結果を取得し、
前記第1演算結果を基に、前記第1要素データに対する演算結果を取得する
ことを特徴とする情報処理装置の制御方法。
【請求項5】
第1要素データを複数含む第1データの第1サイズと、前記第1要素データ未満のサイズの第2要素データを複数含む第2データの第2サイズとの差が所定値以上の場合、前記第1要素データを
前記第2要素データよりも小さいサイズに分割して分割データを生成し、
前記分割データを基に、前記第2要素データと同じサイズの第1拡張データを生成し、
前記第1拡張データと前記第2要素データとを結合させて結合データを生成し、
前記結合データを用いて行われた演算結果データを取得し、前記演算結果データを前記第2要素データのサイズに分けて、前記第1拡張データに対する第1演算結果及び前記第2要素データに対する第2演算結果を取得し、
前記第1演算結果を基に、前記第1要素データに対する演算結果を取得する
処理をコンピュータに実行させることを特徴とする情報処理装置の制御プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラムに関する。
【背景技術】
【0002】
近年、人工知能研究の1分野である機械学習は、深層学習と呼ばれる技術により画像認識の認識精度が飛躍的に向上したことから研究が盛んとなり、また、応用技術の開発の活発化が目覚ましい。深層学習に用いられる計算は、主に基本的な計算の膨大なループ処理である。そのため、深層学習では、多数のプロセッサやマルチコアプロセッサを用いて並列処理を行うことで、効率化が図られる。
【0003】
並列処理を行う装置としては、分散メモリ型の並列計算機が一般的である。分散メモリ型の並列計算機は、複数の計算ノード及びそれらを相互に結ぶ通信網を有する。各計算ノードは、他の計算ノードのメモリを直接参照することは行わず、計算ノード間でのメッセージの交換により他の計算ノードが保持するデータを取得する。このメッセージ交換は、メッセージパッシングと呼ばれる場合がある。メッセージパンシング用のライブラリ規格の1つとして、MPI(Message Passing Interface)が存在する。API(Application Programming Interface)が統一されていることから、MPIは、異なる並列計算機でのプログラム移植性が高く、並列計算機用のプログラムで良く使用される。
【0004】
MPIで使用される関数は、APIの標準化に伴い多数の動的な引数が用いられるようになった。そのため、MPIで使用される関数の処理では、引数検査や動的な領域確保などの処理が発生し、ソフトウェアオーバーヘッドが大きい。このようなソフトウェアオーバーヘッドは、集団通信関数と呼ばれる関数で顕著である。
【0005】
集団通信関数は、並列処理を実行する全ての計算ノードが通信と計算とを行うことで処理を進める関数であり、各計算ノード間のデータの送受信及び計算が終了するまで関数の読み出し基に戻らず待ち合わせる処理が発生する。集団通信関数では、ソフトウェアオーバーヘッドは全ての計算ノードで発生し、全体の処理効率を減少させる。そこで、集団通信関数の使用回数を減らすほど、全体の処理性能を向上させることができる。
【0006】
一般に、計算ノード間の通信回数を減少させる方法として、ピギーバックと呼ばれる手法がある。ピギーバックとは、2つのデータ領域を予め結合しておくことで、本来であれば2回の通信で転送されるデータ領域を1度の通信で転送する手法である。
【0007】
ここで、MPIにおける集団通信関数では、ノード間の通信に加えて、送信されたデータを用いた計算が同時に行われる。このため、2つの集団通信関数の間でピギーバックを行う場合、ピギーバックの対象となる2つの集団通信関数の計算のビット幅が異なっていると、正しい結果を得ることが困難となる。すなわち、集団通信関数では、ピギーバックの前後で計算に用いる要素のビット幅が一致することが好ましい。
【0008】
ここで、ピギーバックを用いた集団通信関数の処理について説明する。この場合の処理には以下の構成要素が含まれる。1つ目は、2つの領域の要素サイズが一致するように、要素サイズの小さい方の要素に0のビット列を付加する変換処理である。2つ目は、2つのデータ領域を連続領域に結合する結合処理である。3つ目は、結合されたデータ領域を使用して集団通信関数を呼び出し、各計算ノード間でデータを送受信し、各計算ノードでの計算を行う集団通信処理である。4つ目は、集団通信処理で処理されたデータ領域を基の2つの領域に分離する分離処理である。5つ目は、分離処理で分離された各データ領域に格納されたデータについて変換処理で付加された0ビット除去してデータを復元する復元処処理である。
【0009】
各計算ノードでは上述した5つの処理が次のように実行される。まず、計算ノードは、変換処理を実行し、ピギーバックを行う2つのデータ領域のうち要素サイズの小さな領域の要素に0のビット列を付加して2つのデータ領域の要素サイズを一致させる。次に、計算ノードは、結合処理を実行し、2つのデータ領域を1つの連続したデータ領域となるように片側の領域を転送し、2つのデータ領域を結合する。次に、計算ノードは、集団通信処理を実行し、結合されたデータ領域に対して集団通信関数を呼び出し集団通信によりデータ領域を転送する。次に、計算ノードは、分離処理を実行し、結合されたデータ領域を2つの領域に分離する。最後に、計算ノードは、復元処理を実行し、分離したデータ領域のうち変換領域で0のビット列を付加した方のデータ領域に対して、変換処理で付加した0のビット列を除去して元のデータの計算結果に復元する。
【0010】
なお、ゲート数が少なくコストパフォーマンスの高い高速乗算器を実現する目的で、入力データを分割しそれぞれのデータに計算繰り返して行い、各計算結果の桁合わせを行った後にそれぞれの値を順次加算し、最終的な計算結果を得る従来技術がある。
【先行技術文献】
【特許文献】
【0011】
【発明の概要】
【発明が解決しようとする課題】
【0012】
しかしながら、計算の入力となるデータ領域が特定の条件の場合、従来の処理方式ではかえって全体の処理効率が落ちるおそれがある。例えば、要素のビット幅の小さなデータ領域が要素のビット幅の大きなデータ領域に比べて非常に大きい場合である。
【0013】
この条件について、データ領域Aとデータ領域Bという2つのデータ領域がある場合を例に用いて詳細に説明する。ここでは、各データ領域のそれぞれの全体のサイズを領域サイズと言う。そして、各領域に含まれる個々の計算に用いる要素データのサイズを要素サイズと言う。ここで、データ領域Aの領域サイズは、データ領域Bの領域サイズに比べて非常に小さいが、要素サイズはデータ領域Aの方がデータ領域Bに比べて大きい。
【0014】
この場合、従来のピギーバックの処理方式では要素サイズの小さいデータ領域Bの要素データに0のビット列が付加される。しかし、データ領域Bの領域サイズが大きいので、0のビット列を付加するデータの変換処理を行う回数が多くなり、データの変換処理に時間が掛かる。さらに、データ変換後の領域サイズが大きくなることから集団通信関数におけるデータ通信量も増大する。したがって、処理全体の計算効率が低下するおそれがある。
【0015】
また、分割した入力データのそれぞれに計算繰り返して行い、各計算結果の桁合わせを行って順次加算する従来技術では、入力データの結合や分離は考慮されておらず、MPIにおける集団通信回数の使用回数を減少させることは困難である。
【0016】
開示の技術は、上記に鑑みてなされたものであって、処理全体の計算効率を向上させる情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラムを提供することを目的とする。
【課題を解決するための手段】
【0017】
本願の開示する情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラムの一つの態様において、分割制御部は、第1要素データを複数含む第1データの第1サイズと、前記第1要素データ未満のサイズの第2要素データを複数含む第2データの第2サイズとの差が所定値以上の場合、前記第1要素データを前記第2要素データよりも小さいサイズに分割して分割データを生成する。変換部は、前記分割制御部により生成された前記分割データを基に、前記第2要素データと同じサイズの第1拡張データを生成する。結合部は、前記第1拡張データと前記第2要素データとを結合させて結合データを生成する。分離部は、前記結合データを用いて行われた演算結果データを取得し、前記演算結果データを前記第2要素データのサイズに分けて、前記第1拡張データに対する第1演算結果及び前記第2要素データに対する第2演算結果を取得する。復元部は、前記第1演算結果を基に、前記第1要素データに対する演算結果を取得する。
【発明の効果】
【0018】
1つの側面では、本発明は、処理全体の計算効率を向上させることができる。
【図面の簡単な説明】
【0019】
【
図1】
図1は、並列計算機のハードウェア構成図である。
【
図2】
図2は、計算ノードの集団通信関数を実行する機能を表すブロック図である。
【
図3】
図3は、集団通信関数の計算に用いる2つのデータの一例を表す図である。
【
図4】
図4は、分割データ及び拡張データの生成を説明するための図である。
【
図5】
図5は、実施例1に係るデータの復元を説明するための図である。
【
図6】
図6は、集団通信関数実行時のデータ送信処理のフローチャートである。
【
図7】
図7は、集団通信関数実行時のデータ受信処理のフローチャートである。
【
図8】
図8は、アンダーフローを発生させないためのデータ変換を説明するための図である。
【
図9】
図9は、実施例2に係るデータの復元を説明するための図である。
【
図10】
図10は、実施例2に係る拡張データの生成処理のフローチャートである。
【発明を実施するための形態】
【0020】
以下に、本願の開示する情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラムの実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラムが限定されるものではない。
【実施例1】
【0021】
図1は、並列計算機のハードウェア構成図である。並列計算機100は、複数の計算ノード10を有する。
【0022】
各計算ノード10は、CPU(Central Processing Unit)11、メモリ12、NIC(Network Interface Card)13及びハードディスク14を有する。CPU11は、メモリ12、NIC13及びハードディスク14とバスを介して接続される。
【0023】
NIC13は、通信装置であり、他の計算ノード10と通信を行うためのインタフェースを有する。計算ノード10は、NIC13を介して互いに接続される。
【0024】
ハードディスク14は、補助記憶装置である。ハードディスク14は、ピギーバックを用いた集団通信関数の計算を実行するためのプログラムを含む各種プログラムを格納する。
【0025】
メモリ12は、主記憶装置である。メモリ12は、集団通信関数の計算に使用するデータを格納する入力データ領域を有する。メモリ12は、例えば、2つの入力データ領域を有する。また、メモリ12は、集団通信関数を実行することで得られる結果を格納する領域を有する。
【0026】
CPU11は、演算処理装置であり、集団通信関数を実行するプログラムを含む各種プログラムをハードディスク14から読み出し、メモリ12上に展開して実行することで、集団通信関数を実行する機能を実現する。CPU11は、メモリ12上の2つの入力データ領域に集団通信関数で使用する異なるデータを格納する。そして、CPU11は、2つの入力データ領域のそれぞれに格納されるデータ同士を結合し、集団通信関数を実行して結合したデータの集団通信関数による演算結果を取得する。その後、CPU11は、取得した演算結果から2つの入力データ領域に格納されたそれぞれのデータを用いた集団通信関数の演算結果を取得する。
【0027】
集団通信関数を実行する場合、例えば、計算ノード10の中のいずれか一つが演算を実行するノードとなる。演算を実行する計算ノード10は、各計算ノード10から集団通信関数で使用するデータを受信する。この時、演算を実行する計算ノード10は、演算に用いるデータの開始アドレス、データ長、格納先のアドレス及び演算内容の情報をデータとともに受信する。そして、演算を実行する計算ノード10は、取得したデータの指定されたビット毎に指定された演算を実行する。例えば、演算が16ビットの加算であれば、演算を実行する計算ノード10は、各計算ノード10から取得した各データの同じ位置に配置された16ビット単位のデータを全て加算する。その後、演算を実行する計算ノード10は、計算結果をデータの送信元の全ての計算ノード10へ送信する。このように、演算を実行する計算ノード10は、受信したデータに含まれるデータの内容を考慮せずに、所定の単位毎に演算を行い、演算結果を各計算ノード10へ返す。
【0028】
ここでは、メモリ12上の2つの入力データ領域に、それぞれに対して個別に集団通信関数が実行されるデータが格納される。以下では、それぞれのデータを「第1データ」及び「第2データ」と言う。そして、第1データと第2データとは、集団通信関数の計算のビット幅が異なる。例えば、第1データの計算のビット幅は32ビットであり、第2データの計算のビット幅は16ビットである。そして、第1データに含まれる計算のビット幅単位のデータを「第1要素データ」という。また、第2データに含まれる計算のビット幅単位のデータを「第2要素データ」という。すなわち、第1データは、第1要素データが複数連結されたデータである。また、第2データは、第2要素データが複数連結されたデータである。例えば、集団通信関数の計算が総和を求める演算であれば、各計算ノード10から送信された第1データの同じ位置に配置された第1要素データの総和がそれぞれ求められる。さらに、第1データ及び第2データのそれぞれの全体をデータ領域といい、そのデータサイズを領域サイズという。また、第1要素データ及び第2要素データのそれぞれのデータサイズを要素サイズという。第1要素データ及び第2要素データのそれぞれの要素サイズは、第1データ及び第2データのそれぞれの集団通信関数の計算のビット幅にあたる。
【0029】
次に、
図2を参照して、本実施例に係る集団通信関数の実行におけるデータの送受信について説明する。
図2は、計算ノードの集団通信関数を実行する機能を表すブロック図である。ここで、
図2における計算ノード10は、演算を実行する計算ノード10以外のノード、言い換えれば、演算を実行する計算ノード10へ演算に用いるデータを送信するノードである。また、演算を実行する計算ノード10は、
図2では、演算処理ノード20と表した。
【0030】
計算ノード10は、分割制御部101、変換部102、結合部103、送受信部104、分離部105及び復元部106を有する。以下の説明では、各部がそれぞれにおいてデータを保持しつつ処理を行うように説明するが、実際には、メモリ12上の2つの入力データ領域に格納されたデータに対して処理を行う。
【0031】
分割制御部101は、第1要素データの要素サイズと第2要素データの要素サイズとを比較し、要素サイズが大きい方を特定する。ここでは、第1要素データの要素サイズが、第2要素データの要素サイズより大きい場合で説明する。例えば、本実施例で用いる第1データ及び第2データは、
図3で表される。
図3は、集団通信関数の計算に用いる2つのデータの一例を表す図である。
図3では、データ201が第1データを表す。そして、第1データの中に、第1要素データ211~214を含む複数の第1要素データが含まれる。また、データ202が、第2要素データを表す。そして、第2データの中に、第2要素データ221~224を含む複数の第2要素データが含まれる。また、第1要素データ211~214のそれぞれの要素サイズは、第2要素データ221~224のそれぞれの要素サイズよりも大きい。
【0032】
次に、分割制御部101は、要素サイズが小さいデータである第2データのデータ領域が、要素サイズが大きいデータである第1データのデータ領域よりも非常に大きいか否かを判定する。以下では、要素サイズが小さいデータである第2データのデータ領域が、要素サイズが大きいデータである第1データのデータ領域よりも非常に大きい場合を「分割推奨状態」という。
【0033】
ここで、一方のデータ領域が他方のデータ領域よりも非常に大きいと判断する基準について説明する。一方のデータ領域が他方のデータ領域よりも非常に大きいとは、一方の要素データに“0”のビット列を付加して他方の要素サイズに合わせた場合に、データの変換数が多く且つ転送するデータサイズが大きくなる場合を指す。すなわち、一方のデータ領域が他方のデータ領域よりも非常に大きい場合とは、通常変換により集団通信関数を実行すると処理効率が低下する場合である。例えば、要素サイズが大きいデータである第1データの領域サイズがByte単位であり、要素サイズが小さいデータである第2データの領域サイズがGByte単位である場合を考える。ここで、第2要素データを第1要素データのサイズに合わせるように“0”のビット列を付加すると、GByteの単位で領域サイズが増大し、且つ、集団通信関数におけるデータ通信量もGByteの単位で増大する。このような場合が、第1データのデータ領域が第2データのデータ領域よりも非常に大きい場合にあたる。すなわち、分割推奨状態を判定する基準は、実際に運用に用いられる要素サイズや領域サイズの大きさに応じて決定されることが好ましい。
【0034】
より具体的に分割推奨状態の判定基準について説明する。例えば、一方のデータ領域と他方のデータ領域との差が予め決められた閾値よりも大きい場合に、一方のデータ領域が他方のデータ領域よりも非常に大きいと判断する。他にも、一方のデータ領域が、他方のデータ領域の所定倍以上の場合に、一方のデータ領域が他方のデータ領域よりも非常に大きいと判断する。このように、データ領域の差が所定倍以上や所定のデータサイズ以上のように、一方のデータ領域が他方のデータ領域よりも非常に大きいと判断されるデータ領域の差が、「一方のデータ領域と他方のデータ領域との差が所定値以上」の一例にあたる。例えば、
図3は、第2データの領域サイズが第1データの領域サイズに比べて非常に大きい状態であり、分割推奨状態を表す。
【0035】
分割推奨状態でない場合、分割制御部101は、要素サイズの小さい第2要素データに“0”のビット列を付加し第1要素データの要素サイズに合わせる処理の実行を変換部102に指示する。
【0036】
これに対して、分割推奨状態の場合、分割制御部101は、実行する演算の種類、分割した後のデータサイズ及び第2要素データの要素サイズから、演算を実行した場合に、オーバーフロー及びアンダーフローが回避可能か否かを判定する。ここでのオーバーフローとは、分割した後のデータに“0”のビット列を付加したデータの最高位の桁よりも高い桁に計算結果が値を有する場合を指す。また、ここでのアンダーフローとは、分割した後のデータに“0”のビット列を付加したデータの最下位の桁よりも低い桁に計算結果が値を有する場合を指す。ここで、本実施例では、分割したデータをさらに補正することは行わないので、分割制御部101は、分割したデータを用いた計算でオーバーフロー及びアンダーフローが発生するか否かにより、オーバーフロー及びアンダーフローが回避可能か否かを判定する。
【0037】
オーバーフロー又はアンダーフローが発生する場合、分割制御部101は、第1要素データを分割しての集団通信関数の計算は困難と判定する。そして、分割制御部101は、要素サイズの小さい第2要素データに“0”のビット列を付加し第1要素データの要素サイズに合わせる処理の実行を変換部102に指示する。
【0038】
これに対して、オーバーフロー及びアンダーフローが発生しない場合、分割制御部101は、第1要素データを第2要素データよりも小さいサイズに分割して分割データを生成する。
図4は、分割データ及び拡張データの生成を説明するための図である。ここでは、分割制御部101は、第1要素データa0を
図4に示す4つの分割データα0~α3に分割する。第1要素データの要素サイズをNとし、分割データのデータサイズをN’とし、分割要素データの順番をkと定義する。例えば、第1要素データa0の要素サイズが32ビットの場合、各分割データα0~α3のデータサイズは、8ビットとなる。この場合、N=32であり、N’=8であり、kは0≦k≦3を満たす整数となる。
【0039】
そして、分割制御部101は、分割データを第2要素データのデータサイズに合わせることを変換部102に指示する。ここで、分割するサイズは、分割データに“0”のビット列を付加して第2要素データの要素サイズに合わせたデータを用いて集団通信関数の計算を行った場合に、第2要素データの要素サイズを超えないデータサイズに収まるように決定されることが好ましい。
【0040】
変換部102は、“0”のビット列を付加の指示を分割制御部101から受ける。要素サイズの小さい第2要素データに“0”のビット列を付加して第1要素データの要素サイズに合わせる指示の場合、変換部102は、第2要素データに“0”のビット列を付加して拡張データを生成する。このとき、変換部102は、拡張データのデータサイズを第1要素データの要素サイズと一致させる。本実施例では、変換部102は、第2要素データの先頭側、すなわち、桁が高い側に“0”のビット列を付加する。
【0041】
そして、変換部102は、第1要素データと拡張データとの結合を結合部103に指示する。さらに、変換部102は、変換方式が分割を実行せずに要素サイズの小さい第2要素データに“0”のビット列を付加した通常変換であることを結合部103に通知する。この時生成される拡張データが、「第2拡張データ」の一例にあたる。
【0042】
これに対して、分割データに“0”のビット列を付加して第2要素データの要素サイズに合わせる指示の場合、変換部102は、分割データに“0”のビット列を付加して拡張データを生成する。このとき、変換部102は、拡張データのデータサイズを第2要素データの要素サイズと一致させる。この場合も、本実施例では、変換部102は、第2要素データの先頭側、すなわち、桁が高い側に“0”のビット列を付加する。この時生成される拡張データが、「第1拡張データ」の一例にあたる。
【0043】
例えば、
図4に示すように、第2要素データb0~b1の要素サイズが16ビットの場合、変換部102は、分割データα0に0の8ビット分のビット列を付加して第2要素データの要素サイズとデータサイズが一致する拡張データα’0を生成する。同様に、変換部102は、分割データα1~α3のそれぞれに0の8ビット分のビット列を付加して第2要素データb1~b3の要素サイズと一致する拡張データα’1~α’3を生成する。
【0044】
その後、変換部102は、拡張データと第2要素データとの結合を結合部103に指示する。さらに、変換部102は、変換方式が要素サイズの大きい第1要素データを分割した上で“0”のビット列を付加した分割変換であることを結合部103に通知する。
【0045】
結合部103は、結合データ生成の指示を分割制御部101から受ける。第1要素データと第2要素データの拡張データとの結合を指示された場合、結合部103は、第1要素データと第2要素データの拡張データとを結合して結合データを生成する。ここで、結合部103は、2つのデータを並べて1つのデータとすることで結合を行う。ここでは、結合部103は、第1要素データの後ろに第2要素データの拡張データを並べる。さらに、結合部103は、変換方式情報として通常変換を表す情報を結合データに付加する。そして、結合部103は、生成した結合データの送受信を送受信部104に指示する。
【0046】
これに対して、分割データの拡張データと第2要素データとの結合を指示された場合、結合部103は、分割データの拡張データと第2要素データとを結合して結合データを生成する。例えば、
図4に示す拡張データα’0~α’3であれば、結合部103は、それぞれを第2要素データb0~b3に結合させて結合データを生成する。ここでは、結合部103は、分割データの拡張データの後ろに第2要素データを並べる。さらに、結合部103は、変換方式情報として分割変換を表す情報を結合データに付加する。そして、結合部103は、生成した結合データの送受信を送受信部104に指示する。
【0047】
送受信部104は、結合データの送受信の指示を結合部103から受ける。そして、送受信部104は、結合データの開始アドレス、データ長、データの格納先のアドレス及び実行する演算の情報を演算処理ノード20へ通知して、DMA(Direct Memory Access)を用いて演算処理ノード20へ結合データを送信する。
【0048】
その後、送受信部104は、送信した結合データを用いた集団通信関数の計算結果を演算処理ノード20から受信する。そして、送受信部104は、取得した計算結果を分離部105へ出力する。この計算結果には、変換方式情報が付加されている。
【0049】
分離部105は、結合データの計算結果の入力を送受信部104から受ける。そして、分離部105は、計算結果に付加された変換方式情報を確認する。
【0050】
変換方式が通常変換の場合、分離部105は、計算結果を第1要素データの要素サイズで2分割する。これにより、分離部105は、第1要素データを用いた集団通信関数の計算結果及び第2要素データの拡張データを用いた集団通信関数の計算結果を取得する。そして、分離部105は、変換方式が通常変換であるとの通知とともに、第2要素データの拡張データを用いた集団通信関数の計算結果を復元部106へ出力する。
【0051】
これに対して、変換方式が分割変換の場合、分離部105は、計算結果を第2要素データの要素サイズで2分割する。これにより、分離部105は、分割データの拡張データを用いた集団通信関数の計算結果及び第2要素データを用いた集団通信関数の計算結果を取得する。そして、分離部105は、変換方式が分割変換であるとの通知とともに、分割データの拡張データを用いた集団通信関数の計算結果を復元部106へ出力する。
【0052】
復元部106は、通常変換の場合、第2要素データの拡張データを用いた集団通信関数の計算結果の入力を分離部105から受ける。そして、復元部106は、計算結果の先頭側、すなわち、最上位の桁側から“0”のビット列を除去し、第2要素データを用いた集団通信関数の計算結果を復元して取得する。
【0053】
これに対して、分割変換の場合、復元部106は、分割データの拡張データを用いた集団通信関数の計算結果の入力を分離部105から受ける。そして、復元部106は、1つの第1要素データを分割して生成した分割データの拡張データを用いた計算結果を集める。次に、復元部106は、集めた計算結果の前後に“0”のビット列を補完して第1要素データのサイズと同じサイズの補完データを生成する。
【0054】
ここで、例えば、補完データは以下のように生成される。復元部106は、各計算結果の末尾から補完データの末尾までのサイズが{N-N’×(k+1)}となるように、各計算結果を配置し、各計算結果の領域以外の領域に“0”のビット列を補完して補完データを生成する。
【0055】
ここで、分割データをデータαkとした場合、第1要素データa0と分割データαkとの間には、以下の数式(1)が成立する。
【0056】
【0057】
本実施例では、N=32であり、N’=8であり、kは0≦k≦3を満たす整数であるので、a0=α0×224+α1×216+α2×28+α3×20となる。
【0058】
そして、復元部106は、集めた計算結果を補完した補完データを加算して第1要素データの集団通信関数の計算結果を取得する。復元部106は、第1データに含まれる全ての第1要素データの集団通信関数の計算結果を同様の方法で取得し、取得した計算結果を並べることで、第1データの集団通信の計算結果を取得する。
【0059】
図5は、実施例1に係るデータの復元を説明するための図である。ここでは、1つの第1要素データa0が4分割され4つの分割データα0~α3が生成された場合で説明する。
図5では、各分割データα0~α3の拡張データα’0~α’3を用いた集団通信関数の計算結果がデータ#α’0~#α’3である。データ#α’0~#α’3のデータサイズは、拡張データα’0~α’3のデータサイズと一致する。
【0060】
復元部106は、データ#α’0の末尾から補完データ250の末尾までのサイズが{N―N’×(k+1)}={32―8×(0+1)}=24ビットとなるようにデータ#α’0を配置する。また、復元部106は、データ#α’1の末尾から補完データ251の末尾までのサイズが{N―N’×(k+1)}={32―8×(1+1)}=16ビットとなるように、データ#α’1を配置する。また、復元部106は、データ#α’2の末尾から補完データ252の末尾までのサイズが{N―N’×(k+1)}={32―8×(2+1)}=8ビットとなるように、データ#α’2を配置する。また、復元部106は、データ#α’3の末尾から補完データ253の末尾までのサイズが{N―N’×(k+1)}={32―8×(3+1)}=0ビットとなるように、データ#α’3を配置する。
【0061】
その後、復元部106は、データ#α’0~#α’3の前後に“0”のビット列を補完して全てのデータサイズを第1要素データのサイズに一致させる。これにより、復元部106は、データ250~253を生成する。
【0062】
その後、復元部106は、データ250~253を加算して、第1要素データa0の計算結果であるデータ#a0を算出する。ここで、第1データを用いて集団通信関数の計算を行う場合のビット幅は第1要素データの要素サイズであり、第1要素データの要素サイズ以上の桁はオーバーフローとなり計算結果に含まれない。そのため、復元部106は、データ#a0を第1要素データa0の要素サイズのデータとして求めればよい。
【0063】
ここで、集団通信関数の計算結果をデータ#α’kとし、第1要素データa0の計算結果をデータ#a0とした場合、データ#a0とデータ#α’kとの間には次の数式(2)が成立する。
【0064】
【0065】
復元部106では、数式(2)の右辺の各項にあたる補完データを生成し、それらの和を求めることで、左辺の計算結果である#a0を取得する。そのため、復元部106は、
図5に示すように、各計算結果の末尾から補完データの末尾までのサイズが{N-N’×(k+1)}となるように、データ#α’kを配置する。
【0066】
以上に説明した、分割制御部101、変換部102、結合部103、送受信部104、分離部105及び復元部106の機能は、
図1に示したCPU11が集団通信関数を実行するためのプログラムをメモリ12に展開して実行することで実現される。また、送受信部104によるデータの送受信はNIC13を介して行われる。
【0067】
図2に戻って説明を続ける。演算処理ノード20は、演算部21を有する。演算部21は、各計算ノード10からデータの入力を受ける。そして、演算部21は、入力されたデータを用いて集団通信関数の計算を実行する。その後、演算部21は、計算に用いたデータの入力元の計算ノード10へ計算結果を送信する。この演算部21の機能は、CPU11がプログラムを実行することで実現される。
【0068】
次に、
図6を参照して、集団通信関数実行時のデータ送信処理の流れについて説明する。
図6は、集団通信関数実行時のデータ送信処理のフローチャートである。ここでは、メモリ12が第1データ領域及び第2データ領域を有し、第1データ領域に格納されたデータを第1データとし、第2データ領域に格納されたデータを第2データとして説明する。
【0069】
分割制御部101は、第1データに含まれる第1要素データの要素サイズが、第2データに含まれる第2要素データの要素サイズより大きいか否かを判定する(ステップS11)。第1要素データの要素サイズが第2要素データの要素サイズよりも大きい場合(ステップS11:肯定)、分割制御部101は、ステップS13へ進む。
【0070】
これに対して、第1要素データの要素サイズが第2要素データの要素サイズ以下の場合(ステップS11:否定)、分割制御部101は、第1データ領域に格納されたデータと第2データ領域に格納されたデータを入れ替える(ステップS12)。
【0071】
次に、分割制御部101は、第2データの領域サイズが第1データの領域サイズより所定値以上大きいか否かを判定する(ステップS13)。
【0072】
第2データの領域サイズが第1データの領域サイズより所定値以上大きい場合(ステップS13:肯定)、分割制御部101は、第1要素データを分割して計算した場合に、オーバーフロー及びアンダーフローが回避可能か否かを判定する(ステップS14)。
【0073】
オーバーフロー及びアンダーフローが回避可能な場合(ステップS14:肯定)、分割制御部101は、分割変換の実行を決定する。そして、分割制御部101及び変換部102は、第1要素データの変換を行う(ステップS15)。
【0074】
一方、第2データの領域サイズが第1データの領域サイズより所定値以上大きくない場合(ステップS13:否定)及びオーバーフロー又はアンダーフローが発生する場合(ステップS14:否定)、分割制御部101は、通常変換の実行を決定する。そして、分割制御部101及び変換部102は、第2要素データの変換を行う(ステップS16)。
【0075】
その後、結合部103は、第1要素データから生成された拡張データと第2データとを結合して結合データを生成する(ステップS17)。
【0076】
さらに、結合部103は、生成した結合データに変換方式の情報を付加する(ステップS18)。
【0077】
その後、結合部103は、結合データを送受信部104へ出力する。送受信部104は、集団通信により結合部103から入力された結合データを演算処理ノード20へ送信する(ステップS19)。
【0078】
次に、
図7を参照して、集団通信関数実行時のデータ受信処理の流れについて説明する。
図7は、集団通信関数実行時のデータ受信処理のフローチャートである。ここでは、第1要素データが第2要素データに比べて要素サイズが大きい場合で説明する。
【0079】
送受信部104は、集団通信により送信した結合データを用いた集団通信関数の計算結果を演算処理ノード20から受信する(ステップS21)。そして、送受信部104は、受信した計算結果を分離部105へ出力する。
【0080】
分離部105は、計算結果の入力を送受信部104から受ける。次に、分離部105は、計算結果に付加された変換方式の情報を確認して、集団通信関数の計算に用いられた変換方式を取得する(ステップS22)。
【0081】
次に、分離部105は、計算結果のデータを2等分して2つに分離する(ステップS23)。
【0082】
次に、分離部105は、取得した変換方式から、変換されたのが第1要素データか第2要素データかを判定する(ステップS24)。すなわち、分離部105は、変換方式が分割変換の場合には第1要素データが変換されたと判定し、変換方式が通常変換の場合には第2要素データが変換されたと判定する。
【0083】
第1要素データが変換された場合(ステップS24:肯定)、分離部105は、分割変換された第1要素データの復元を復元部106に指示する。そして、復元部106は、分割変換された第1要素データの復元処理を実行する(ステップS25)。
【0084】
これに対して、第2要素データが変換された場合(ステップS24:否定)、分離部105は、通常変換された第2要素データの復元を復元部106に指示する。そして、復元部106は、通常変換された第2要素データの復元処理を実行する(ステップS26)。
【0085】
以上に説明したように、本実施例に係る並列計算機の各計算ノードは、要素サイズが小さいデータを変換して要素サイズが大きいデータのサイズに合わせてから結合して集団通信関数の実行した場合に、処理能力が低下するか否かを判定する。そして、処理能力が低下する場合、各計算ノードは、要素サイズが大きいデータを分割し、分割データを変換して要素サイズが小さいデータにサイズを合わせてから結合して集団通信関数を実行する。これにより、データを変換する処理を削減することができ、且つ、集団通信において送受信されるデータ量を低減することができるため、本実施例に係る並列計算機の処理能力が向上する。
【実施例2】
【0086】
次に、実施例2について説明する。本実施例に係る並列計算機の各計算ノードは、アンダーフローが発生する可能性がある場合に、アンダーフローの発生を回避するための変換をデータに施して集団通信関数による計算を実行することが実施例1と異なる。本実施例に係る計算ノードも
図2のブロック図で表される。以下の説明では、実施例1と同じ各部の機能については説明を省略する。
【0087】
分割制御部101は、集団通信関数の計算に用いる第1データ及び第2データが分離推奨状態にあるか否かを判定する。分離推奨状態であれば、分割制御部101は、オーバーフロー及びアンダーフローが回避可能か否かを判定する。本実施例では、例えば、集団通信関数の計算が加算、減算又は全体の平均を求める演算であれば、分割制御部101は、オーバーフロー及びアンダーフローが回避可能と判定する。そして、オーバーフロー及びアンダーフローが回避可能であれば、分割制御部101は、要素サイズの第1要素データを第2要素データよりも小さいサイズに分割して分割データを生成する。そして、分割制御部101は、分割データを第2要素データのデータサイズに合わせることを変換部102に指示する。
【0088】
変換部102は、分割データを第2要素データのデータサイズに合わせる指示を分割制御部101から受けた場合、アンダーフローが発生する可能性があるか否かを判定する。アンダーフローが発生する可能性がある場合、変換部102は、分割データをアンダーフローが発生しない値に変換して変換データを生成する。この分割データをアンダーフローが発生しない値に変換する処理が、「所定処理」の一例にあたる。変換部102は、生成した変換データに“0”のビット列を付加して第2要素データの要素サイズと同じデータサイズを有する拡張データを生成する。その後、変換部102は、生成した拡張データを送受信部104へ出力する。
【0089】
ここで、
図8を参照して、集団通信関数の計算が平均を求める演算である場合を例に、アンダーフローを発生させないためのデータ変換について説明する。
図8は、アンダーフローを発生させないためのデータ変換を説明するための図である。ここでは、集団通信関数を用いた計算を実行する計算ノード10がn台ある場合で説明する。
【0090】
変換部102は、第1要素データa0を分割した分割データα0~α3を分割制御部101から取得する。そして、変換部102は、集団通信関数の計算がn個のデータの平均を求める演算であることからアンダーフローが発生する可能性があると判定する。そして、変換部102は、分割データα0~α3のそれぞれにnを乗算して変換データを生成する。
図8では、分割データα0~α3のそれぞれの符号とnとを乗算する記載で、分割データα0~α3へのnの乗算を表した。さらに、変換部102は、生成した変換データに“0”のビット列を付加して第2要素データb0~b3の要素サイズと同じデータサイズを有する拡張データを生成する。
【0091】
ここで、n個のデータの平均を求める演算では計算前のデータより値が大きくならないため、生成した変換データを用いた集団通信関数の計算ではオーバーフローが発生しない。また、n個のデータの平均を求める演算ではnによる除算が発生するが、変換データは予めnが乗算されているので、nの除算によるアンダーフローは発生しない。このように、変換部102により生成された変換データを用いてn個のデータの平均を求める集団通信関数の計算を行うことで、オーバーフロー及びアンダーフローのいずれも発生しなくなる。
【0092】
復元部106は、変換方式が分割変換であるとの通知ともに、変換データから生成された拡張データを用いた集団通信関数の計算結果の入力を分離部105から受ける。そして、復元部106は、1つの第1要素データを分割して生成した分割データから生成された拡張データを用いた計算結果を集める。次に、復元部106は、集めた計算結果の前後に“0”のビット列を補完して第1要素データのサイズにnを乗算したサイズと同じサイズの補完データを生成する。補完データの具体的なサイズは{N+ceil(log2n)}となる。ceil(x)とは、x以上の最小の整数である。
【0093】
例えば、補完データは以下のように生成される。復元部106は、各計算結果の末尾から補完データの末尾までのサイズが{N-N’×(k+1)}となるように、各計算結果を配置し、各計算結果の領域以外の領域に“0”のビット列を補完して補完データを生成する。
【0094】
次に、復元部106は、集めた計算結果を補完した補完データを加算して第1要素データの集団通信関数の計算結果にnが乗算された値を取得する。そして、復元部106は、取得した値をnで除算して第1要素データの集団通信関数の計算結果を取得する。復元部106は、第1データに含まれる全ての第1要素データの集団通信関数の計算結果を同様の方法で取得し、取得した計算結果を並べることで、第1データの集団通信の計算結果を取得する。
【0095】
図9は、実施例2に係るデータの復元を説明するための図である。ここでは、1つの第1要素データa0が4分割され4つの分割データα0~α3が生成された場合で説明する。
図9では、各分割データα0~α3にnを乗算して算出した変換データから生成した拡張データα’0~α’3を用いた集団通信関数の計算結果がデータ#α’0~#α’3である。データ#α’0~#α’3のデータサイズは、拡張データα’0~α’3のデータサイズと一致する。
【0096】
復元部106は、データ#α’0の末尾から補完データ330の末尾までのサイズが{N―N’×(k+1)}={32―8×(0+1)}=24ビットとなるようにデータ#α’0を配置する。また、復元部106は、データ#α’1の末尾から補完データ331の末尾までのサイズが{N―N’×(k+1)}={32―8×(1+1)}=16ビットとなるように、データ#α’1を配置する。また、復元部106は、データ#α’2の末尾から補完データ332の末尾までのサイズが{N―N’×(k+1)}={32―8×(2+1)}=8ビットとなるように、データ#α’2を配置する。また、復元部106は、データ#α’3の末尾から補完データ333の末尾までのサイズが{N―N’×(k+1)}={32―8×(3+1)}=0ビットとなるように、データ#α’3を配置する。
【0097】
その後、復元部106は、データ#α’0~#α’3の前後に“0”のビット列を補完して全てのデータサイズを第1要素データのサイズにnを乗算した大きさに一致させる。これにより、復元部106は、データ330~333を生成する。
【0098】
その後、復元部106は、データ330~333を加算して、第1要素データa0の計算結果にnを乗算した値であるデータ334を算出する。
図9では、「#a0*n」によりデータ334が「第1要素データa0の計算結果にnを乗算した値」であることを表した。そして、復元部106は、データ334をnで除算することで第1要素データa0の計算結果を取得する。
【0099】
ここで、集団通信関数の計算結果をデータ#α’kとし、第1要素データa0の計算結果をデータ#a0とした場合、データ#a0とデータα’kとの間には、次の数式(3)が成立する。
【0100】
【0101】
復元部106は、数式(3)の右辺の各項にあたる補完データを生成し、それらの和を求めることで、左辺の計算結果である#a0を取得する。そのため、復元部106は、
図9に示すように、各計算結果の末尾から補完データの末尾までのサイズが{N-N’×(k+1)}となるように、各計算結果であるデータ#α’kを配置する。
【0102】
本実施例と実施例1との違いは、補完データのサイズである。実施例1における数式(2)と異なり、本実施例における数式(3)では、計算ノード数nが両辺にかけられている。そのため、本実施例における補完データのサイズはNではなく、{N+cell(log2n}となる。
【0103】
以上に説明した、分割制御部101、変換部102及び復元部106の機能も、
図1に示したCPU11が集団通信関数を実行するためのプログラムをメモリ12に展開して実行することで実現される。
【0104】
次に、
図10を参照して、実施例2に係る拡張データの生成処理の流れについて説明する。
図10は、実施例2に係る拡張データの生成処理のフローチャートである。
【0105】
分割制御部101は、アンダーフロー及びオーバーフローが回避可能な場合、第1要素データを分割する分割変換の実施を決定する。そして、分割制御部101は、第1要素データを分割し分割データを生成する(ステップS101)。その後、分割制御部101は、分割データの変換を変換部102に指示する。
【0106】
変換部102は、分割データの変換の指示を分割制御部101から受ける。そして、変換部102は、アンダーフロー発生の可能性があるか否かを判定する(ステップS102)。アンダーフロー発生の可能性が無い場合(ステップS102:否定)、変換部102は、ステップS104へ進む。
【0107】
これに対して、アンダーフロー発生の可能性がある場合(ステップS102:肯定)、変換部102は、分割データをアンダーフローが発生しない値に変換して変換データを生成する(ステップS103)。
【0108】
次に、変換部102は、分割データ又は変換データに対して“0”のビット列を付加して拡張データを生成する(ステップS104)。
【0109】
以上に説明したように、本実施例2では、回避可能なアンダーフローが発生する場合に、分割データをアンダーフローが発生しなくなる値に変換した変換データから拡張データを生成して第2要素データと結合させて集団通信関数の計算を実行する。これにより、アンダーフローが発生する場合にも、集団通信関数の計算を正確に行うことができる。
【0110】
また、以上の各実施例では、集団通信関数の計算が加算の場合及び平均を求める演算の場合について説明したが、分配法則が成立する演算であれば減算などの他の演算でもよい。分配法則が成立する演算としては、例えば、加算から派生する演算が含まれる。
【符号の説明】
【0111】
10 計算ノード
11 CPU
12 メモリ
13 NIC
14 ハードディスク
20 演算処理ノード
100 並列計算機
101 分割制御部
102 変換部
103 結合部
104 送受信部
105 分離部
106 復元部