(57)【要約】【課題】処理全体の計算効率を向上させる情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラムを提供する。【解決手段】分割制御部１０１は、第１要素データを第１要素データ未満のサイズの第２要素データよりも小さいサイズに分割して分割データを生成する。変換部１０２は、分割制御部１０１により生成された分割データに０のビット列を加えて第２要素データと同じサイズの第１拡張データを生成する。結合部１０３は、第１拡張データと第２要素データとを結合させて結合データを生成する。分離部は、結合データを用いて行われた演算結果データを取得し、前記演算結果データを第２要素データのサイズに分けて、第１拡張データに対する第１演算結果及び第２要素データに対する第２演算結果を取得する。復元部１０６は、第１演算結果を基に、第１要素データに対する演算結果を取得する。【選択図】図２
2020024552.tif 000002
【特許請求の範囲】
【請求項１】
第１要素データを前記第１要素データ未満のサイズの第２要素データよりも小さいサイズに分割して分割データを生成する分割制御部と、
前記分割制御部により生成された前記分割データを基に、前記第２要素データと同じサイズの第１拡張データを生成する変換部と、
前記第１拡張データと前記第２要素データとを結合させて結合データを生成する結合部と、
前記結合データを用いて行われた演算結果データを取得し、前記演算結果データを前記第２要素データのサイズに分けて、前記第１拡張データに対する第１演算結果及び前記第２要素データに対する第２演算結果を取得する分離部と、
前記第１演算結果を基に、前記第１要素データに対する演算結果を取得する復元部と
を備えたことを特徴とする情報処理装置。
【請求項２】
前記分割制御部は、複数の前記第１要素データを含む第１データの第１サイズと複数の前記第２要素データを含む第２データの第２サイズとの差が所定値以上の場合、前記分割データを生成することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記分割制御部は、前記第１サイズと前記第２サイズとの差が所定値未満の場合、前記第１要素データ及び前記第２要素データをそのまま維持し、
前記変換部は、前記分割制御部により生成された前記第２要素データを基に、前記第１要素データと同じサイズの第２拡張データを生成し、
前記結合部は、前記第２拡張データと前記第１要素データとを結合させて前記結合データを生成し
前記分離部は、前記演算結果データを前記第１要素データのサイズに分けて、前記第１要素データに対する第３演算結果及び前記第２拡張データに対する第４演算結果を取得し、
前記復元部は、前記第４演算結果を基に、前記第２要素データに対する演算結果を取得する
ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記変換部は、前記分割データ及び前記第２要素データを受信し、前記分割データに対して所定処理を施して変換分割データを生成し、前記変換分割データに０のビット列を加えて前記第２要素データのサイズと同じサイズの前記第１拡張データを生成することを特徴とする請求項１〜３のいずれか一つに記載の情報処理装置。
【請求項５】
第１要素データを前記第１要素データ未満のサイズの第２要素データよりも小さいサイズに分割して分割データを生成し、
前記分割データを基に、前記第２要素データと同じサイズの第１拡張データを生成し、
前記第１拡張データと前記第２要素データとを結合させて結合データを生成し、
前記結合データを用いて行われた演算結果データを取得し、前記演算結果データを前記第２要素データのサイズに分けて、前記第１拡張データに対する第１演算結果及び前記第２要素データに対する第２演算結果を取得し、
前記第１演算結果を基に、前記第１要素データに対する演算結果を取得する
ことを特徴とする情報処理装置の制御方法。
【請求項６】
第１要素データを前記第１要素データ未満のサイズの第２要素データよりも小さいサイズに分割して分割データを生成し、
前記分割データを基に、前記第２要素データと同じサイズの第１拡張データを生成し、
前記第１拡張データと前記第２要素データとを結合させて結合データを生成し、
前記結合データを用いて行われた演算結果データを取得し、前記演算結果データを前記第２要素データのサイズに分けて、前記第１拡張データに対する第１演算結果及び前記第２要素データに対する第２演算結果を取得し、
前記第１演算結果を基に、前記第１要素データに対する演算結果を取得する
処理をコンピュータに実行させることを特徴とする情報処理装置の制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラムに関する。
【背景技術】
【０００２】
近年、人工知能研究の１分野である機械学習は、深層学習と呼ばれる技術により画像認識の認識精度が飛躍的に向上したことから研究が盛んとなり、また、応用技術の開発の活発化が目覚ましい。深層学習に用いられる計算は、主に基本的な計算の膨大なループ処理である。そのため、深層学習では、多数のプロセッサやマルチコアプロセッサを用いて並列処理を行うことで、効率化が図られる。
【０００３】
並列処理を行う装置としては、分散メモリ型の並列計算機が一般的である。分散メモリ型の並列計算機は、複数の計算ノード及びそれらを相互に結ぶ通信網を有する。各計算ノードは、他の計算ノードのメモリを直接参照することは行わず、計算ノード間でのメッセージの交換により他の計算ノードが保持するデータを取得する。このメッセージ交換は、メッセージパッシングと呼ばれる場合がある。メッセージパンシング用のライブラリ規格の１つとして、ＭＰＩ（Message  Passing  Interface）が存在する。ＡＰＩ（Application  Programming  Interface）が統一されていることから、ＭＰＩは、異なる並列計算機でのプログラム移植性が高く、並列計算機用のプログラムで良く使用される。
【０００４】
ＭＰＩで使用される関数は、ＡＰＩの標準化に伴い多数の動的な引数が用いられるようになった。そのため、ＭＰＩで使用される関数の処理では、引数検査や動的な領域確保などの処理が発生し、ソフトウェアオーバーヘッドが大きい。このようなソフトウェアオーバーヘッドは、集団通信関数と呼ばれる関数で顕著である。
【０００５】
集団通信関数は、並列処理を実行する全ての計算ノードが通信と計算とを行うことで処理を進める関数であり、各計算ノード間のデータの送受信及び計算が終了するまで関数の読み出し基に戻らず待ち合わせる処理が発生する。集団通信関数では、ソフトウェアオーバーヘッドは全ての計算ノードで発生し、全体の処理効率を減少させる。そこで、集団通信関数の使用回数を減らすほど、全体の処理性能を向上させることができる。
【０００６】
一般に、計算ノード間の通信回数を減少させる方法として、ピギーバックと呼ばれる手法がある。ピギーバックとは、２つのデータ領域を予め結合しておくことで、本来であれば２回の通信で転送されるデータ領域を１度の通信で転送する手法である。
【０００７】
ここで、ＭＰＩにおける集団通信関数では、ノード間の通信に加えて、送信されたデータを用いた計算が同時に行われる。このため、２つの集団通信関数の間でピギーバックを行う場合、ピギーバックの対象となる２つの集団通信関数の計算のビット幅が異なっていると、正しい結果を得ることが困難となる。すなわち、集団通信関数では、ピギーバックの前後で計算に用いる要素のビット幅が一致することが好ましい。
【０００８】
ここで、ピギーバックを用いた集団通信関数の処理について説明する。この場合の処理には以下の構成要素が含まれる。１つ目は、２つの領域の要素サイズが一致するように、要素サイズの小さい方の要素に０のビット列を付加する変換処理である。２つ目は、２つのデータ領域を連続領域に結合する結合処理である。３つ目は、結合されたデータ領域を使用して集団通信関数を呼び出し、各計算ノード間でデータを送受信し、各計算ノードでの計算を行う集団通信処理である。４つ目は、集団通信処理で処理されたデータ領域を基の２つの領域に分離する分離処理である。５つ目は、分離処理で分離された各データ領域に格納されたデータについて変換処理で付加された０ビット除去してデータを復元する復元処処理である。
【０００９】
各計算ノードでは上述した５つの処理が次のように実行される。まず、計算ノードは、変換処理を実行し、ピギーバックを行う２つのデータ領域のうち要素サイズの小さな領域の要素に０のビット列を付加して２つのデータ領域の要素サイズを一致させる。次に、計算ノードは、結合処理を実行し、２つのデータ領域を１つの連続したデータ領域となるように片側の領域を転送し、２つのデータ領域を結合する。次に、計算ノードは、集団通信処理を実行し、結合されたデータ領域に対して集団通信関数を呼び出し集団通信によりデータ領域を転送する。次に、計算ノードは、分離処理を実行し、結合されたデータ領域を２つの領域に分離する。最後に、計算ノードは、復元処理を実行し、分離したデータ領域のうち変換領域で０のビット列を付加した方のデータ領域に対して、変換処理で付加した０のビット列を除去して元のデータの計算結果に復元する。
【００１０】
なお、ゲート数が少なくコストパフォーマンスの高い高速乗算器を実現する目的で、入力データを分割しそれぞれのデータに計算繰り返して行い、各計算結果の桁合わせを行った後にそれぞれの値を順次加算し、最終的な計算結果を得る従来技術がある。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開平０３−２６５９２５号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
しかしながら、計算の入力となるデータ領域が特定の条件の場合、従来の処理方式ではかえって全体の処理効率が落ちるおそれがある。例えば、要素のビット幅の小さなデータ領域が要素のビット幅の大きなデータ領域に比べて非常に大きい場合である。
【００１３】
この条件について、データ領域Ａとデータ領域Ｂという２つのデータ領域がある場合を例に用いて詳細に説明する。ここでは、各データ領域のそれぞれの全体のサイズを領域サイズと言う。そして、各領域に含まれる個々の計算に用いる要素データのサイズを要素サイズと言う。ここで、データ領域Ａの領域サイズは、データ領域Ｂの領域サイズに比べて非常に小さいが、要素サイズはデータ領域Ａの方がデータ領域Ｂに比べて大きい。
【００１４】
この場合、従来のピギーバックの処理方式では要素サイズの小さいデータ領域Ｂの要素データに０のビット列が付加される。しかし、データ領域Ｂの領域サイズが大きいので、０のビット列を付加するデータの変換処理を行う回数が多くなり、データの変換処理に時間が掛かる。さらに、データ変換後の領域サイズが大きくなることから集団通信関数におけるデータ通信量も増大する。したがって、処理全体の計算効率が低下するおそれがある。
【００１５】
また、分割した入力データのそれぞれに計算繰り返して行い、各計算結果の桁合わせを行って順次加算する従来技術では、入力データの結合や分離は考慮されておらず、ＭＰＩにおける集団通信回数の使用回数を減少させることは困難である。
【００１６】
開示の技術は、上記に鑑みてなされたものであって、処理全体の計算効率を向上させる情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１７】
本願の開示する情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラムの一つの態様において、分割制御部は、第１要素データを前記第１要素データ未満のサイズの第２要素データよりも小さいサイズに分割して分割データを生成する。変換部は、前記分割制御部により生成された前記分割データを基に、前記第２要素データと同じサイズの第１拡張データを生成する。結合部は、前記第１拡張データと前記第２要素データとを結合させて結合データを生成する。分離部は、前記結合データを用いて行われた演算結果データを取得し、前記演算結果データを前記第２要素データのサイズに分けて、前記第１拡張データに対する第１演算結果及び前記第２要素データに対する第２演算結果を取得する。復元部は、前記第１演算結果を基に、前記第１要素データに対する演算結果を取得する。
【発明の効果】
【００１８】
１つの側面では、本発明は、処理全体の計算効率を向上させることができる。
【図面の簡単な説明】
【００１９】
【図１】図１は、並列計算機のハードウェア構成図である。
【図２】図２は、計算ノードの集団通信関数を実行する機能を表すブロック図である。
【図３】図３は、集団通信関数の計算に用いる２つのデータの一例を表す図である。
【図４】図４は、分割データ及び拡張データの生成を説明するための図である。
【図５】図５は、実施例１に係るデータの復元を説明するための図である。
【図６】図６は、集団通信関数実行時のデータ送信処理のフローチャートである。
【図７】図７は、集団通信関数実行時のデータ受信処理のフローチャートである。
【図８】図８は、アンダーフローを発生させないためのデータ変換を説明するための図である。
【図９】図９は、実施例２に係るデータの復元を説明するための図である。
【図１０】図１０は、実施例２に係る拡張データの生成処理のフローチャートである。
【発明を実施するための形態】
【００２０】
以下に、本願の開示する情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラムの実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する情報処理装置、情報処理装置の制御方法及び情報処理装置の制御プログラムが限定されるものではない。
【実施例１】
【００２１】
図１は、並列計算機のハードウェア構成図である。並列計算機１００は、複数の計算ノード１０を有する。
【００２２】
各計算ノード１０は、ＣＰＵ（Central  Processing  Unit）１１、メモリ１２、ＮＩＣ（Network  Interface  Card）１３及びハードディスク１４を有する。ＣＰＵ１１は、メモリ１２、ＮＩＣ１３及びハードディスク１４とバスを介して接続される。
【００２３】
ＮＩＣ１３は、通信装置であり、他の計算ノード１０と通信を行うためのインタフェースを有する。計算ノード１０は、ＮＩＣ１３を介して互いに接続される。
【００２４】
ハードディスク１４は、補助記憶装置である。ハードディスク１４は、ピギーバックを用いた集団通信関数の計算を実行するためのプログラムを含む各種プログラムを格納する。
【００２５】
メモリ１２は、主記憶装置である。メモリ１２は、集団通信関数の計算に使用するデータを格納する入力データ領域を有する。メモリ１２は、例えば、２つの入力データ領域を有する。また、メモリ１２は、集団通信関数を実行することで得られる結果を格納する領域を有する。
【００２６】
ＣＰＵ１１は、演算処理装置であり、集団通信関数を実行するプログラムを含む各種プログラムをハードディスク１４から読み出し、メモリ１２上に展開して実行することで、集団通信関数を実行する機能を実現する。ＣＰＵ１１は、メモリ１２上の２つの入力データ領域に集団通信関数で使用する異なるデータを格納する。そして、ＣＰＵ１１は、２つの入力データ領域のそれぞれに格納されるデータ同士を結合し、集団通信関数を実行して結合したデータの集団通信関数による演算結果を取得する。その後、ＣＰＵ１１は、取得した演算結果から２つの入力データ領域に格納されたそれぞれのデータを用いた集団通信関数の演算結果を取得する。
【００２７】
集団通信関数を実行する場合、例えば、計算ノード１０の中のいずれか一つが演算を実行するノードとなる。演算を実行する計算ノード１０は、各計算ノード１０から集団通信関数で使用するデータを受信する。この時、演算を実行する計算ノード１０は、演算に用いるデータの開始アドレス、データ長、格納先のアドレス及び演算内容の情報をデータとともに受信する。そして、演算を実行する計算ノード１０は、取得したデータの指定されたビット毎に指定された演算を実行する。例えば、演算が１６ビットの加算であれば、演算を実行する計算ノード１０は、各計算ノード１０から取得した各データの同じ位置に配置された１６ビット単位のデータを全て加算する。その後、演算を実行する計算ノード１０は、計算結果をデータの送信元の全ての計算ノード１０へ送信する。このように、演算を実行する計算ノード１０は、受信したデータに含まれるデータの内容を考慮せずに、所定の単位毎に演算を行い、演算結果を各計算ノード１０へ返す。
【００２８】
ここでは、メモリ１２上の２つの入力データ領域に、それぞれに対して個別に集団通信関数が実行されるデータが格納される。以下では、それぞれのデータを「第１データ」及び「第２データ」と言う。そして、第１データと第２データとは、集団通信関数の計算のビット幅が異なる。例えば、第１データの計算のビット幅は３２ビットであり、第２データの計算のビット幅は１６ビットである。そして、第１データに含まれる計算のビット幅単位のデータを「第１要素データ」という。また、第２データに含まれる計算のビット幅単位のデータを「第２要素データ」という。すなわち、第１データは、第１要素データが複数連結されたデータである。また、第２データは、第２要素データが複数連結されたデータである。例えば、集団通信関数の計算が総和を求める演算であれば、各計算ノード１０から送信された第１データの同じ位置に配置された第１要素データの総和がそれぞれ求められる。さらに、第１データ及び第２データのそれぞれの全体をデータ領域といい、そのデータサイズを領域サイズという。また、第１要素データ及び第２要素データのそれぞれのデータサイズを要素サイズという。第１要素データ及び第２要素データのそれぞれの要素サイズは、第１データ及び第２データのそれぞれの集団通信関数の計算のビット幅にあたる。
【００２９】
次に、図２を参照して、本実施例に係る集団通信関数の実行におけるデータの送受信について説明する。図２は、計算ノードの集団通信関数を実行する機能を表すブロック図である。ここで、図２における計算ノード１０は、演算を実行する計算ノード１０以外のノード、言い換えれば、演算を実行する計算ノード１０へ演算に用いるデータを送信するノードである。また、演算を実行する計算ノード１０は、図２では、演算処理ノード２０と表した。
【００３０】
計算ノード１０は、分割制御部１０１、変換部１０２、結合部１０３、送受信部１０４、分離部１０５及び復元部１０６を有する。以下の説明では、各部がそれぞれにおいてデータを保持しつつ処理を行うように説明するが、実際には、メモリ１２上の２つの入力データ領域に格納されたデータに対して処理を行う。
【００３１】
分割制御部１０１は、第１要素データの要素サイズと第２要素データの要素サイズとを比較し、要素サイズが大きい方を特定する。ここでは、第１要素データの要素サイズが、第２要素データの要素サイズより大きい場合で説明する。例えば、本実施例で用いる第１データ及び第２データは、図３で表される。図３は、集団通信関数の計算に用いる２つのデータの一例を表す図である。図３では、データ２０１が第１データを表す。そして、第１データの中に、第１要素データ２１１〜２１４を含む複数の第１要素データが含まれる。また、データ２０２が、第２要素データを表す。そして、第２データの中に、第２要素データ２２１〜２２４を含む複数の第２要素データが含まれる。また、第１要素データ２１１〜２１４のそれぞれの要素サイズは、第２要素データ２２１〜２２４のそれぞれの要素サイズよりも大きい。
【００３２】
次に、分割制御部１０１は、要素サイズが小さいデータである第２データのデータ領域が、要素サイズが大きいデータである第１データのデータ領域よりも非常に大きいか否かを判定する。以下では、要素サイズが小さいデータである第２データのデータ領域が、要素サイズが大きいデータである第１データのデータ領域よりも非常に大きい場合を「分割推奨状態」という。
【００３３】
ここで、一方のデータ領域が他方のデータ領域よりも非常に大きいと判断する基準について説明する。一方のデータ領域が他方のデータ領域よりも非常に大きいとは、一方の要素データに“０”のビット列を付加して他方の要素サイズに合わせた場合に、データの変換数が多く且つ転送するデータサイズが大きくなる場合を指す。すなわち、一方のデータ領域が他方のデータ領域よりも非常に大きい場合とは、通常変換により集団通信関数を実行すると処理効率が低下する場合である。例えば、要素サイズが大きいデータである第１データの領域サイズがＢｙｔｅ単位であり、要素サイズが小さいデータである第２データの領域サイズがＧＢｙｔｅ単位である場合を考える。ここで、第２要素データを第１要素データのサイズに合わせるように“０”のビット列を付加すると、ＧＢｙｔｅの単位で領域サイズが増大し、且つ、集団通信関数におけるデータ通信量もＧＢｙｔｅの単位で増大する。このような場合が、第１データのデータ領域が第２データのデータ領域よりも非常に大きい場合にあたる。すなわち、分割推奨状態を判定する基準は、実際に運用に用いられる要素サイズや領域サイズの大きさに応じて決定されることが好ましい。
【００３４】
より具体的に分割推奨状態の判定基準について説明する。例えば、一方のデータ領域と他方のデータ領域との差が予め決められた閾値よりも大きい場合に、一方のデータ領域が他方のデータ領域よりも非常に大きいと判断する。他にも、一方のデータ領域が、他方のデータ領域の所定倍以上の場合に、一方のデータ領域が他方のデータ領域よりも非常に大きいと判断する。このように、データ領域の差が所定倍以上や所定のデータサイズ以上のように、一方のデータ領域が他方のデータ領域よりも非常に大きいと判断されるデータ領域の差が、「一方のデータ領域と他方のデータ領域との差が所定値以上」の一例にあたる。例えば、図３は、第２データの領域サイズが第１データの領域サイズに比べて非常に大きい状態であり、分割推奨状態を表す。
【００３５】
分割推奨状態でない場合、分割制御部１０１は、要素サイズの小さい第２要素データに“０”のビット列を付加し第１要素データの要素サイズに合わせる処理の実行を変換部１０２に指示する。
【００３６】
これに対して、分割推奨状態の場合、分割制御部１０１は、実行する演算の種類、分割した後のデータサイズ及び第２要素データの要素サイズから、演算を実行した場合に、オーバーフロー及びアンダーフローが回避可能か否かを判定する。ここでのオーバーフローとは、分割した後のデータに“０”のビット列を付加したデータの最高位の桁よりも高い桁に計算結果が値を有する場合を指す。また、ここでのアンダーフローとは、分割した後のデータに“０”のビット列を付加したデータの最下位の桁よりも低い桁に計算結果が値を有する場合を指す。ここで、本実施例では、分割したデータをさらに補正することは行わないので、分割制御部１０１は、分割したデータを用いた計算でオーバーフロー及びアンダーフローが発生するか否かにより、オーバーフロー及びアンダーフローが回避可能か否かを判定する。
【００３７】
オーバーフロー又はアンダーフローが発生する場合、分割制御部１０１は、第１要素データを分割しての集団通信関数の計算は困難と判定する。そして、分割制御部１０１は、要素サイズの小さい第２要素データに“０”のビット列を付加し第１要素データの要素サイズに合わせる処理の実行を変換部１０２に指示する。
【００３８】
これに対して、オーバーフロー及びアンダーフローが発生しない場合、分割制御部１０１は、第１要素データを第２要素データよりも小さいサイズに分割して分割データを生成する。図４は、分割データ及び拡張データの生成を説明するための図である。ここでは、分割制御部１０１は、第１要素データａ０を図４に示す４つの分割データα０〜α３に分割する。第１要素データの要素サイズをＮとし、分割データのデータサイズをＮ’とし、分割要素データの順番をｋと定義する。例えば、第１要素データａ０の要素サイズが３２ビットの場合、各分割データα０〜α３のデータサイズは、８ビットとなる。この場合、Ｎ＝３２であり、Ｎ’＝８であり、ｋは０≦ｋ≦３を満たす整数となる。
【００３９】
そして、分割制御部１０１は、分割データを第２要素データのデータサイズに合わせることを変換部１０２に指示する。ここで、分割するサイズは、分割データに“０”のビット列を付加して第２要素データの要素サイズに合わせたデータを用いて集団通信関数の計算を行った場合に、第２要素データの要素サイズを超えないデータサイズに収まるように決定されることが好ましい。
【００４０】
変換部１０２は、“０”のビット列を付加の指示を分割制御部１０１から受ける。要素サイズの小さい第２要素データに“０”のビット列を付加して第１要素データの要素サイズに合わせる指示の場合、変換部１０２は、第２要素データに“０”のビット列を付加して拡張データを生成する。このとき、変換部１０２は、拡張データのデータサイズを第１要素データの要素サイズと一致させる。本実施例では、変換部１０２は、第２要素データの先頭側、すなわち、桁が高い側に“０”のビット列を付加する。
【００４１】
そして、変換部１０２は、第１要素データと拡張データとの結合を結合部１０３に指示する。さらに、変換部１０２は、変換方式が分割を実行せずに要素サイズの小さい第２要素データに“０”のビット列を付加した通常変換であることを結合部１０３に通知する。この時生成される拡張データが、「第２拡張データ」の一例にあたる。
【００４２】
これに対して、分割データに“０”のビット列を付加して第２要素データの要素サイズに合わせる指示の場合、変換部１０２は、分割データに“０”のビット列を付加して拡張データを生成する。このとき、変換部１０２は、拡張データのデータサイズを第２要素データの要素サイズと一致させる。この場合も、本実施例では、変換部１０２は、第２要素データの先頭側、すなわち、桁が高い側に“０”のビット列を付加する。この時生成される拡張データが、「第１拡張データ」の一例にあたる。
【００４３】
例えば、図４に示すように、第２要素データｂ０〜ｂ１の要素サイズが１６ビットの場合、変換部１０２は、分割データα０に０の８ビット分のビット列を付加して第２要素データの要素サイズとデータサイズが一致する拡張データα’０を生成する。同様に、変換部１０２は、分割データα１〜α３のそれぞれに０の８ビット分のビット列を付加して第２要素データｂ１〜ｂ３の要素サイズと一致する拡張データα’１〜α’３を生成する。
【００４４】
その後、変換部１０２は、拡張データと第２要素データとの結合を結合部１０３に指示する。さらに、変換部１０２は、変換方式が要素サイズの大きい第１要素データを分割した上で“０”のビット列を付加した分割変換であることを結合部１０３に通知する。
【００４５】
結合部１０３は、結合データ生成の指示を分割制御部１０１から受ける。第１要素データと第２要素データの拡張データとの結合を指示された場合、結合部１０３は、第１要素データと第２要素データの拡張データとを結合して結合データを生成する。ここで、結合部１０３は、２つのデータを並べて１つのデータとすることで結合を行う。ここでは、結合部１０３は、第１要素データの後ろに第２要素データの拡張データを並べる。さらに、結合部１０３は、変換方式情報として通常変換を表す情報を結合データに付加する。そして、結合部１０３は、生成した結合データの送受信を送受信部１０４に指示する。
【００４６】
これに対して、分割データの拡張データと第２要素データとの結合を指示された場合、結合部１０３は、分割データの拡張データと第２要素データとを結合して結合データを生成する。例えば、図４に示す拡張データα’０〜α’３であれば、結合部１０３は、それぞれを第２要素データｂ０〜ｂ３に結合させて結合データを生成する。ここでは、結合部１０３は、分割データの拡張データの後ろに第２要素データを並べる。さらに、結合部１０３は、変換方式情報として分割変換を表す情報を結合データに付加する。そして、結合部１０３は、生成した結合データの送受信を送受信部１０４に指示する。
【００４７】
送受信部１０４は、結合データの送受信の指示を結合部１０３から受ける。そして、送受信部１０４は、結合データの開始アドレス、データ長、データの格納先のアドレス及び実行する演算の情報を演算処理ノード２０へ通知して、ＤＭＡ（Direct  Memory  Access）を用いて演算処理ノード２０へ結合データを送信する。
【００４８】
その後、送受信部１０４は、送信した結合データを用いた集団通信関数の計算結果を演算処理ノード２０から受信する。そして、送受信部１０４は、取得した計算結果を分離部１０５へ出力する。この計算結果には、変換方式情報が付加されている。
【００４９】
分離部１０５は、結合データの計算結果の入力を送受信部１０４から受ける。そして、分離部１０５は、計算結果に付加された変換方式情報を確認する。
【００５０】
変換方式が通常変換の場合、分離部１０５は、計算結果を第１要素データの要素サイズで２分割する。これにより、分離部１０５は、第１要素データを用いた集団通信関数の計算結果及び第２要素データの拡張データを用いた集団通信関数の計算結果を取得する。そして、分離部１０５は、変換方式が通常変換であるとの通知とともに、第２要素データの拡張データを用いた集団通信関数の計算結果を復元部１０６へ出力する。
【００５１】
これに対して、変換方式が分割変換の場合、分離部１０５は、計算結果を第２要素データの要素サイズで２分割する。これにより、分離部１０５は、分割データの拡張データを用いた集団通信関数の計算結果及び第２要素データを用いた集団通信関数の計算結果を取得する。そして、分離部１０５は、変換方式が分割変換であるとの通知とともに、分割データの拡張データを用いた集団通信関数の計算結果を復元部１０６へ出力する。
【００５２】
復元部１０６は、通常変換の場合、第２要素データの拡張データを用いた集団通信関数の計算結果の入力を分離部１０５から受ける。そして、復元部１０６は、計算結果の先頭側、すなわち、最上位の桁側から“０”のビット列を除去し、第２要素データを用いた集団通信関数の計算結果を復元して取得する。
【００５３】
これに対して、分割変換の場合、復元部１０６は、分割データの拡張データを用いた集団通信関数の計算結果の入力を分離部１０５から受ける。そして、復元部１０６は、１つの第１要素データを分割して生成した分割データの拡張データを用いた計算結果を集める。次に、復元部１０６は、集めた計算結果の前後に“０”のビット列を補完して第１要素データのサイズと同じサイズの補完データを生成する。
【００５４】
ここで、例えば、補完データは以下のように生成される。復元部１０６は、各計算結果の末尾から補完データの末尾までのサイズが｛Ｎ−Ｎ’×（ｋ＋１）｝となるように、各計算結果を配置し、各計算結果の領域以外の領域に“０”のビット列を補完して補完データを生成する。
【００５５】
ここで、分割データをデータαｋとした場合、第１要素データａ０と分割データαｋとの間には、以下の数式（１）が成立する。
【００５６】
【数１】
2020024552.tif 000003
【００５７】
本実施例では、Ｎ＝３２であり、Ｎ’＝８であり、ｋは０≦ｋ≦３を満たす整数であるので、ａ０＝α０×２２４＋α１×２１６＋α２×２８＋α３×２０となる。
【００５８】
そして、復元部１０６は、集めた計算結果を補完した補完データを加算して第１要素データの集団通信関数の計算結果を取得する。復元部１０６は、第１データに含まれる全ての第１要素データの集団通信関数の計算結果を同様の方法で取得し、取得した計算結果を並べることで、第１データの集団通信の計算結果を取得する。
【００５９】
図５は、実施例１に係るデータの復元を説明するための図である。ここでは、１つの第１要素データａ０が４分割され４つの分割データα０〜α３が生成された場合で説明する。図５では、各分割データα０〜α３の拡張データα’０〜α’３を用いた集団通信関数の計算結果がデータ＃α’０〜＃α’３である。データ＃α’０〜＃α’３のデータサイズは、拡張データα’０〜α’３のデータサイズと一致する。
【００６０】
復元部１０６は、データ＃α’０の末尾から補完データ２５０の末尾までのサイズが｛Ｎ―Ｎ’×（ｋ＋１）｝＝｛３２―８×（０＋１）｝＝２４ビットとなるようにデータ＃α’０を配置する。また、復元部１０６は、データ＃α’１の末尾から補完データ２５１の末尾までのサイズが｛Ｎ―Ｎ’×（ｋ＋１）｝＝｛３２―８×（１＋１）｝＝１６ビットとなるように、データ＃α’１を配置する。また、復元部１０６は、データ＃α’２の末尾から補完データ２５２の末尾までのサイズが｛Ｎ―Ｎ’×（ｋ＋１）｝＝｛３２―８×（２＋１）｝＝８ビットとなるように、データ＃α’２を配置する。また、復元部１０６は、データ＃α’３の末尾から補完データ２５３の末尾までのサイズが｛Ｎ―Ｎ’×（ｋ＋１）｝＝｛３２―８×（３＋１）｝＝０ビットとなるように、データ＃α’３を配置する。
【００６１】
その後、復元部１０６は、データ＃α’０〜＃α’３の前後に“０”のビット列を補完して全てのデータサイズを第１要素データのサイズに一致させる。これにより、復元部１０６は、データ２５０〜２５３を生成する。
【００６２】
その後、復元部１０６は、データ２５０〜２５３を加算して、第１要素データａ０の計算結果であるデータ＃ａ０を算出する。ここで、第１データを用いて集団通信関数の計算を行う場合のビット幅は第１要素データの要素サイズであり、第１要素データの要素サイズ以上の桁はオーバーフローとなり計算結果に含まれない。そのため、復元部１０６は、データ＃ａ０を第１要素データａ０の要素サイズのデータとして求めればよい。
【００６３】
ここで、集団通信関数の計算結果をデータ＃α’ｋとし、第１要素データａ０の計算結果をデータ＃ａ０とした場合、データ＃ａ０とデータ＃α’ｋとの間には次の数式（２）が成立する。
【００６４】
【数２】
2020024552.tif 000004
【００６５】
復元部１０６では、数式（２）の右辺の各項にあたる補完データを生成し、それらの和を求めることで、左辺の計算結果である＃ａ０を取得する。そのため、復元部１０６は、図５に示すように、各計算結果の末尾から補完データの末尾までのサイズが｛Ｎ−Ｎ’×（ｋ＋１）｝となるように、データ＃α’ｋを配置する。
【００６６】
以上に説明した、分割制御部１０１、変換部１０２、結合部１０３、送受信部１０４、分離部１０５及び復元部１０６の機能は、図１に示したＣＰＵ１１が集団通信関数を実行するためのプログラムをメモリ１２に展開して実行することで実現される。また、送受信部１０４によるデータの送受信はＮＩＣ１３を介して行われる。
【００６７】
図２に戻って説明を続ける。演算処理ノード２０は、演算部２１を有する。演算部２１は、各計算ノード１０からデータの入力を受ける。そして、演算部２１は、入力されたデータを用いて集団通信関数の計算を実行する。その後、演算部２１は、計算に用いたデータの入力元の計算ノード１０へ計算結果を送信する。この演算部２１の機能は、ＣＰＵ１１がプログラムを実行することで実現される。
【００６８】
次に、図６を参照して、集団通信関数実行時のデータ送信処理の流れについて説明する。図６は、集団通信関数実行時のデータ送信処理のフローチャートである。ここでは、メモリ１２が第１データ領域及び第２データ領域を有し、第１データ領域に格納されたデータを第１データとし、第２データ領域に格納されたデータを第２データとして説明する。
【００６９】
分割制御部１０１は、第１データに含まれる第１要素データの要素サイズが、第２データに含まれる第２要素データの要素サイズより大きいか否かを判定する（ステップＳ１１）。第１要素データの要素サイズが第２要素データの要素サイズよりも大きい場合（ステップＳ１１：肯定）、分割制御部１０１は、ステップＳ１３へ進む。
【００７０】
これに対して、第１要素データの要素サイズが第２要素データの要素サイズ以下の場合（ステップＳ１１：否定）、分割制御部１０１は、第１データ領域に格納されたデータと第２データ領域に格納されたデータを入れ替える（ステップＳ１２）。
【００７１】
次に、分割制御部１０１は、第２データの領域サイズが第１データの領域サイズより所定値以上大きいか否かを判定する（ステップＳ１３）。
【００７２】
第２データの領域サイズが第１データの領域サイズより所定値以上大きい場合（ステップＳ１３：肯定）、分割制御部１０１は、第１要素データを分割して計算した場合に、オーバーフロー及びアンダーフローが回避可能か否かを判定する（ステップＳ１４）。
【００７３】
オーバーフロー及びアンダーフローが回避可能な場合（ステップＳ１４：肯定）、分割制御部１０１は、分割変換の実行を決定する。そして、分割制御部１０１及び変換部１０２は、第１要素データの変換を行う（ステップＳ１５）。
【００７４】
一方、第２データの領域サイズが第１データの領域サイズより所定値以上大きくない場合（ステップＳ１３：否定）及びオーバーフロー又はアンダーフローが発生する場合（ステップＳ１４：否定）、分割制御部１０１は、通常変換の実行を決定する。そして、分割制御部１０１及び変換部１０２は、第２要素データの変換を行う（ステップＳ１６）。
【００７５】
その後、結合部１０３は、第１要素データから生成された拡張データと第２データとを結合して結合データを生成する（ステップＳ１７）。
【００７６】
さらに、結合部１０３は、生成した結合データに変換方式の情報を付加する（ステップＳ１８）。
【００７７】
その後、結合部１０３は、結合データを送受信部１０４へ出力する。送受信部１０４は、集団通信により結合部１０３から入力された結合データを演算処理ノード２０へ送信する（ステップＳ１９）。
【００７８】
次に、図７を参照して、集団通信関数実行時のデータ受信処理の流れについて説明する。図７は、集団通信関数実行時のデータ受信処理のフローチャートである。ここでは、第１要素データが第２要素データに比べて要素サイズが大きい場合で説明する。
【００７９】
送受信部１０４は、集団通信により送信した結合データを用いた集団通信関数の計算結果を演算処理ノード２０から受信する（ステップＳ２１）。そして、送受信部１０４は、受信した計算結果を分離部１０５へ出力する。
【００８０】
分離部１０５は、計算結果の入力を送受信部１０４から受ける。次に、分離部１０５は、計算結果に付加された変換方式の情報を確認して、集団通信関数の計算に用いられた変換方式を取得する（ステップＳ２２）。
【００８１】
次に、分離部１０５は、計算結果のデータを２等分して２つに分離する（ステップＳ２３）。
【００８２】
次に、分離部１０５は、取得した変換方式から、変換されたのが第１要素データか第２要素データかを判定する（ステップＳ２４）。すなわち、分離部１０５は、変換方式が分割変換の場合には第１要素データが変換されたと判定し、変換方式が通常変換の場合には第２要素データが変換されたと判定する。
【００８３】
第１要素データが変換された場合（ステップＳ２４：肯定）、分離部１０５は、分割変換された第１要素データの復元を復元部１０６に指示する。そして、復元部１０６は、分割変換された第１要素データの復元処理を実行する（ステップＳ２５）。
【００８４】
これに対して、第２要素データが変換された場合（ステップＳ２４：否定）、分離部１０５は、通常変換された第２要素データの復元を復元部１０６に指示する。そして、復元部１０６は、通常変換された第２要素データの復元処理を実行する（ステップＳ２６）。
【００８５】
以上に説明したように、本実施例に係る並列計算機の各計算ノードは、要素サイズが小さいデータを変換して要素サイズが大きいデータのサイズに合わせてから結合して集団通信関数の実行した場合に、処理能力が低下するか否かを判定する。そして、処理能力が低下する場合、各計算ノードは、要素サイズが大きいデータを分割し、分割データを変換して要素サイズが小さいデータにサイズを合わせてから結合して集団通信関数を実行する。これにより、データを変換する処理を削減することができ、且つ、集団通信において送受信されるデータ量を低減することができるため、本実施例に係る並列計算機の処理能力が向上する。
【実施例２】
【００８６】
次に、実施例２について説明する。本実施例に係る並列計算機の各計算ノードは、アンダーフローが発生する可能性がある場合に、アンダーフローの発生を回避するための変換をデータに施して集団通信関数による計算を実行することが実施例１と異なる。本実施例に係る計算ノードも図２のブロック図で表される。以下の説明では、実施例１と同じ各部の機能については説明を省略する。
【００８７】
分割制御部１０１は、集団通信関数の計算に用いる第１データ及び第２データが分離推奨状態にあるか否かを判定する。分離推奨状態であれば、分割制御部１０１は、オーバーフロー及びアンダーフローが回避可能か否かを判定する。本実施例では、例えば、集団通信関数の計算が加算、減算又は全体の平均を求める演算であれば、分割制御部１０１は、オーバーフロー及びアンダーフローが回避可能と判定する。そして、オーバーフロー及びアンダーフローが回避可能であれば、分割制御部１０１は、要素サイズの第１要素データを第２要素データよりも小さいサイズに分割して分割データを生成する。そして、分割制御部１０１は、分割データを第２要素データのデータサイズに合わせることを変換部１０２に指示する。
【００８８】
変換部１０２は、分割データを第２要素データのデータサイズに合わせる指示を分割制御部１０１から受けた場合、アンダーフローが発生する可能性があるか否かを判定する。アンダーフローが発生する可能性がある場合、変換部１０２は、分割データをアンダーフローが発生しない値に変換して変換データを生成する。この分割データをアンダーフローが発生しない値に変換する処理が、「所定処理」の一例にあたる。変換部１０２は、生成した変換データに“０”のビット列を付加して第２要素データの要素サイズと同じデータサイズを有する拡張データを生成する。その後、変換部１０２は、生成した拡張データを送受信部１０４へ出力する。
【００８９】
ここで、図８を参照して、集団通信関数の計算が平均を求める演算である場合を例に、アンダーフローを発生させないためのデータ変換について説明する。図８は、アンダーフローを発生させないためのデータ変換を説明するための図である。ここでは、集団通信関数を用いた計算を実行する計算ノード１０がｎ台ある場合で説明する。
【００９０】
変換部１０２は、第１要素データａ０を分割した分割データα０〜α３を分割制御部１０１から取得する。そして、変換部１０２は、集団通信関数の計算がｎ個のデータの平均を求める演算であることからアンダーフローが発生する可能性があると判定する。そして、変換部１０２は、分割データα０〜α３のそれぞれにｎを乗算して変換データを生成する。図８では、分割データα０〜α３のそれぞれの符号とｎとを乗算する記載で、分割データα０〜α３へのｎの乗算を表した。さらに、変換部１０２は、生成した変換データに“０”のビット列を付加して第２要素データｂ０〜ｂ３の要素サイズと同じデータサイズを有する拡張データを生成する。
【００９１】
ここで、ｎ個のデータの平均を求める演算では計算前のデータより値が大きくならないため、生成した変換データを用いた集団通信関数の計算ではオーバーフローが発生しない。また、ｎ個のデータの平均を求める演算ではｎによる除算が発生するが、変換データは予めｎが乗算されているので、ｎの除算によるアンダーフローは発生しない。このように、変換部１０２により生成された変換データを用いてｎ個のデータの平均を求める集団通信関数の計算を行うことで、オーバーフロー及びアンダーフローのいずれも発生しなくなる。
【００９２】
復元部１０６は、変換方式が分割変換であるとの通知ともに、変換データから生成された拡張データを用いた集団通信関数の計算結果の入力を分離部１０５から受ける。そして、復元部１０６は、１つの第１要素データを分割して生成した分割データから生成された拡張データを用いた計算結果を集める。次に、復元部１０６は、集めた計算結果の前後に“０”のビット列を補完して第１要素データのサイズにｎを乗算したサイズと同じサイズの補完データを生成する。補完データの具体的なサイズは｛Ｎ＋ｃｅｉｌ（ｌｏｇ２ｎ）｝となる。ｃｅｉｌ（ｘ）とは、ｘ以上の最小の整数である。
【００９３】
例えば、補完データは以下のように生成される。復元部１０６は、各計算結果の末尾から補完データの末尾までのサイズが｛Ｎ−Ｎ’×（ｋ＋１）｝となるように、各計算結果を配置し、各計算結果の領域以外の領域に“０”のビット列を補完して補完データを生成する。
【００９４】
次に、復元部１０６は、集めた計算結果を補完した補完データを加算して第１要素データの集団通信関数の計算結果にｎが乗算された値を取得する。そして、復元部１０６は、取得した値をｎで除算して第１要素データの集団通信関数の計算結果を取得する。復元部１０６は、第１データに含まれる全ての第１要素データの集団通信関数の計算結果を同様の方法で取得し、取得した計算結果を並べることで、第１データの集団通信の計算結果を取得する。
【００９５】
図９は、実施例２に係るデータの復元を説明するための図である。ここでは、１つの第１要素データａ０が４分割され４つの分割データα０〜α３が生成された場合で説明する。図９では、各分割データα０〜α３にｎを乗算して算出した変換データから生成した拡張データα’０〜α’３を用いた集団通信関数の計算結果がデータ＃α’０〜＃α’３である。データ＃α’０〜＃α’３のデータサイズは、拡張データα’０〜α’３のデータサイズと一致する。
【００９６】
復元部１０６は、データ＃α’０の末尾から補完データ３３０の末尾までのサイズが｛Ｎ―Ｎ’×（ｋ＋１）｝＝｛３２―８×（０＋１）｝＝２４ビットとなるようにデータ＃α’０を配置する。また、復元部１０６は、データ＃α’１の末尾から補完データ３３１の末尾までのサイズが｛Ｎ―Ｎ’×（ｋ＋１）｝＝｛３２―８×（１＋１）｝＝１６ビットとなるように、データ＃α’１を配置する。また、復元部１０６は、データ＃α’２の末尾から補完データ３３２の末尾までのサイズが｛Ｎ―Ｎ’×（ｋ＋１）｝＝｛３２―８×（２＋１）｝＝８ビットとなるように、データ＃α’２を配置する。また、復元部１０６は、データ＃α’３の末尾から補完データ３３３の末尾までのサイズが｛Ｎ―Ｎ’×（ｋ＋１）｝＝｛３２―８×（３＋１）｝＝０ビットとなるように、データ＃α’３を配置する。
【００９７】
その後、復元部１０６は、データ＃α’０〜＃α’３の前後に“０”のビット列を補完して全てのデータサイズを第１要素データのサイズにｎを乗算した大きさに一致させる。これにより、復元部１０６は、データ３３０〜３３３を生成する。
【００９８】
その後、復元部１０６は、データ３３０〜３３３を加算して、第１要素データａ０の計算結果にｎを乗算した値であるデータ３３４を算出する。図９では、「＃ａ０＊ｎ」によりデータ３３４が「第１要素データａ０の計算結果にｎを乗算した値」であることを表した。そして、復元部１０６は、データ３３４をｎで除算することで第１要素データａ０の計算結果を取得する。
【００９９】
ここで、集団通信関数の計算結果をデータ＃α’ｋとし、第１要素データａ０の計算結果をデータ＃ａ０とした場合、データ＃ａ０とデータα’ｋとの間には、次の数式（３）が成立する。
【０１００】
【数３】
2020024552.tif 000005
【０１０１】
復元部１０６は、数式（３）の右辺の各項にあたる補完データを生成し、それらの和を求めることで、左辺の計算結果である＃ａ０を取得する。そのため、復元部１０６は、図９に示すように、各計算結果の末尾から補完データの末尾までのサイズが｛Ｎ−Ｎ’×（ｋ＋１）｝となるように、各計算結果であるデータ＃α’ｋを配置する。
【０１０２】
本実施例と実施例１との違いは、補完データのサイズである。実施例１における数式（２）と異なり、本実施例における数式（３）では、計算ノード数ｎが両辺にかけられている。そのため、本実施例における補完データのサイズはＮではなく、｛Ｎ＋ｃｅｌｌ（ｌｏｇ２ｎ｝となる。
【０１０３】
以上に説明した、分割制御部１０１、変換部１０２及び復元部１０６の機能も、図１に示したＣＰＵ１１が集団通信関数を実行するためのプログラムをメモリ１２に展開して実行することで実現される。
【０１０４】
次に、図１０を参照して、実施例２に係る拡張データの生成処理の流れについて説明する。図１０は、実施例２に係る拡張データの生成処理のフローチャートである。
【０１０５】
分割制御部１０１は、アンダーフロー及びオーバーフローが回避可能な場合、第１要素データを分割する分割変換の実施を決定する。そして、分割制御部１０１は、第１要素データを分割し分割データを生成する（ステップＳ１０１）。その後、分割制御部１０１は、分割データの変換を変換部１０２に指示する。
【０１０６】
変換部１０２は、分割データの変換の指示を分割制御部１０１から受ける。そして、変換部１０２は、アンダーフロー発生の可能性があるか否かを判定する（ステップＳ１０２）。アンダーフロー発生の可能性が無い場合（ステップＳ１０２：否定）、変換部１０２は、ステップＳ１０４へ進む。
【０１０７】
これに対して、アンダーフロー発生の可能性がある場合（ステップＳ１０２：肯定）、変換部１０２は、分割データをアンダーフローが発生しない値に変換して変換データを生成する（ステップＳ１０３）。
【０１０８】
次に、変換部１０２は、分割データ又は変換データに対して“０”のビット列を付加して拡張データを生成する（ステップＳ１０４）。
【０１０９】
以上に説明したように、本実施例２では、回避可能なアンダーフローが発生する場合に、分割データをアンダーフローが発生しなくなる値に変換した変換データから拡張データを生成して第２要素データと結合させて集団通信関数の計算を実行する。これにより、アンダーフローが発生する場合にも、集団通信関数の計算を正確に行うことができる。
【０１１０】
また、以上の各実施例では、集団通信関数の計算が加算の場合及び平均を求める演算の場合について説明したが、分配法則が成立する演算であれば減算などの他の演算でもよい。分配法則が成立する演算としては、例えば、加算から派生する演算が含まれる。
【符号の説明】
【０１１１】
１０  計算ノード
１１  ＣＰＵ
１２  メモリ
１３  ＮＩＣ
１４  ハードディスク
２０  演算処理ノード
１００  並列計算機
１０１  分割制御部
１０２  変換部
１０３  結合部
１０４  送受信部
１０５  分離部
１０６  復元部
【図１】
2020024552.tif 000006
【図２】
2020024552.tif 000007
【図３】
2020024552.tif 000008
【図４】
2020024552.tif 000009
【図５】
2020024552.tif 000010
【図６】
2020024552.tif 000011
【図７】
2020024552.tif 000012
【図８】
2020024552.tif 000013
【図９】
2020024552.tif 000014
【図１０】
2020024552.tif 000015