以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の並列計算機を示す図である。並列計算機1は、複数のノードを有し、各ノードを用いて演算処理を並列に実行する。並列計算機1は、3次元のFFT演算を高速に処理する機能を提供する。ここで、複数のノードは、ノード10,10a,10bを含む(更に多数のノードを含み得る)。ノード10は、記憶部11および演算部12を含む。
記憶部11は、キャッシュメモリやRAM(Random Access Memory)などの記憶装置である。演算部12は、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)などを含み得る。演算部12はプログラムを実行するプロセッサであってもよい。「プロセッサ」は、複数のプロセッサの集合(マルチプロセッサ)も含み得る。他のノードもノード10と同様に、記憶部および演算部を含む。演算部12は、演算処理をプロセスと呼ばれる単位で管理し得る。演算部12は、ノード10において複数のプロセスを起動できる。
並列計算機1は、FFT演算の対象とする入力データを複数に分割して、各ノードに入力する。入力データは、例えば3次元の配列で表される。3次元は、X軸、Y軸、Z軸の3つの軸で表される。例えば、ノード10には、入力データを分割したうちの1つである配列Aが入力される。ノード10は、配列Aの軸毎にFFT演算を実行する。例えば、X軸、Y軸、Z軸の順に実行する場合、Y軸に関してFFT演算を実行する場合はX軸に関するFFT演算結果を用いることになり、Z軸に関してFFT演算を実行する場合はX,Y軸に関するFFT演算結果を用いることになる。ある軸に対して入力データが分割されている場合、該当の軸に関して各ノード上のプロセスで並行してFFT演算を行えるよう各プロセスは通信し、保持データを組み替える。並列計算機1が実行するFFT演算の処理の流れは次の通りである。
(1)演算部12は、配列AのうちFFT処理対象である軸方向の一部の情報を転置して送信バッファに格納する(転置in処理)。(2)演算部12は、送信バッファに格納されたデータを他のプロセス(他のノード上のプロセスでもよい)に送信する(第1送信処理)。(3)演算部12は、他のプロセスからデータを受信し、受信バッファに格納する(組み替え後のデータを受信バッファに格納する)(第1受信処理)。(2)、(3)の通信処理は、並列計算機1における各プロセス間(ある軸方向のFFT演算を行う1つのプロセスグループに属するプロセス間)で同期して実行される。第1送信処理および第1受信処理は、プロセス間のall‐to‐all通信あるいは集団通信と呼ばれることもある。
次いで、(4)演算部12は、組み替え後のデータに対してFFT演算を実行する(FFT演算処理)。(5)演算部12は、FFT演算後のデータを他のプロセスに送信する(第2送信処理)。(6)演算部12は、FFT演算後のデータを他のプロセスから受信し、受信バッファに格納する(元の順序に組み替え後のデータを受信バッファに格納する)(第2受信処理)。第2送信処理および第2受信処理は、プロセス間のall‐to‐all通信と呼ばれることがある。(7)演算部12は、受信バッファのデータを転置して元の配列Aに格納する(転置out処理)。
演算部12は、配列Aを更に細かく区分化した複数の区分データに対して、上記(1)〜(7)の処理の流れ(ストリーム)を2つ並行して実行する。1つ目の処理の流れを「処理流れR1」とする。2つ目の処理の流れを「処理流れR2」とする。例えば、処理流れR1,R2それぞれは異なるプロセスによって実行され得る。処理流れR1,R2それぞれは、あるプロセスにおける異なるスレッドによって実行されると考えてもよい。
記憶部11は、第1記憶領域11a、第2記憶領域11bおよび第3記憶領域11cを有する。第1記憶領域11a、第2記憶領域11bおよび第3記憶領域11cは、上記(1)〜(7)の一連の手順を実行するための作業領域である。第1記憶領域11a,第2記憶領域11bおよび第3記憶領域11cのサイズとしては、区分データのサイズ分が確保されていればよい。すなわち、第1記憶領域11a,第2記憶領域11bおよび第3記憶領域11cの合計サイズは、区分データの3倍程度のサイズとなる。
処理流れR1,R2それぞれは、配列Aを区分化した複数の区分データそれぞれに対するFFT演算の一連の手順に相当する。例えば、配列Aは、FFT演算対象の軸における処理位置の小さい方(例えば、座標の小さい方)から順に所定サイズに区分化される。処理位置の小さい方から順に、第1区分データ、第2区分データ、第3区分データ、・・・と呼ぶことにする。すると、例えば、処理流れR1により第1区分データが処理され、処理流れR2により第2区分データが処理され、処理流れR1により第3区分データが処理され、・・・というように、順にFFT演算が実行される。この例の場合、奇数番目の区分データが処理流れR1に、偶数番目の区分データが処理流れR2により処理されることになる。
演算部12は、第1記憶領域11a、第2記憶領域11bおよび第3記憶領域11cを次のように使用することで、処理流れR1,R2におけるFFT演算とプロセス間通信とをオーバーラップして実行する。ここで、図1では、第1記憶領域11a、第2記憶領域11bおよび第3記憶領域11cの用途を、図の上側から下側へ向かう時系列に沿って図示している(なお、記憶領域が何れの処理用途にも用いられない期間には、ハイフン記号“−”を付している)。
まず、演算部12は、処理流れR1の転置in処理では、第1区分データを転置して第1記憶領域11aに格納する。
次に、処理流れR1の第1送信処理では第1記憶領域11aを送信バッファとして、第1区分データを他のプロセスへ送信する。このとき、処理流れR1の第1受信処理では、他のプロセスによる第1送信処理で送られた区分データを受信して、第2記憶領域11b(受信バッファとして使用)に格納する。
そして、処理流れR1のFFT演算処理では、第2記憶領域11bに格納されたデータに対してFFT演算を実行する。
処理流れR1の第2送信処理では、第2記憶領域11bに格納されたFFT演算の結果を他のプロセスに送信する(第2記憶領域11bを送信バッファとして使用)。このとき、処理流れR1の第2受信処理では他のプロセスによる第2送信処理で送られたFFT演算後の区分データを受信して、第3記憶領域(受信バッファとして使用)に格納する。更にこのとき、演算部12は、第1記憶領域11aを用いて、第2区分データに対する処理流れR2の転置in処理を実行する。すなわち、当該処理流れR2の転置in処理では、第2区分データを転置して、第1記憶領域11aに格納する。
以後、演算部12は、処理流れR1,R2それぞれに対して、以降の手順を繰り返し実行する。
処理流れR1では第3記憶領域11cを用いて、第1区分データに対する転置out処理を実行し、その後、第3区分データに対する転置in処理を実行する。このとき、処理流れR2では、第1記憶領域11a(送信バッファ)および第2記憶領域11b(受信バッファ)を用いて、第1送信処理および第1受信処理を実行する。
次に、処理流れR1では、第3記憶領域11c(送信バッファ)および第1記憶領域11aを用いて、第1送信処理および第1受信処理を実行する。このとき、処理流れR2では、第2記憶領域11bを用いてFFT演算処理を実行する。
次に、処理流れR1では、第1記憶領域11aを用いてFFT演算処理を実行する。このとき、処理流れR2では、第2記憶領域11b(送信バッファ)および第3記憶領域11c(受信バッファ)を用いて、第2送信処理および第2受信処理を実行する。
次に、処理流れR1では、第1記憶領域11a(送信バッファ)および第2記憶領域11b(受信バッファ)を用いて、第2送信処理および第2受信処理を実行する。このとき、処理流れR2では、第3記憶領域11cを用いて、第2区分データに対する転置out処理を実行し、その後、第4区分データに対する転置in処理を実行する。このように、処理流れR1,R2は、第1記憶領域11a,第2記憶領域11bおよび第3記憶領域11cの用途を切り替えながら、配列Aの区分データに対するFFT演算を順番に実行していく。こうして、作業用の記憶領域を、第1記憶領域11a,第2記憶領域11bおよび第3記憶領域11cに制限しながら、2つの処理流れのFFT演算と通信とをオーバーラップさせ、FFT演算を高速化することができる。1つの具体例として、Z方向のFFT演算と通信のオーバーラップを説明する(ただし、X方向、Y方向も同様の説明となる)。
図2は、Z方向のFFT演算と通信のオーバーラップの例を示す図である。例えば、3次元配列の入力データを分割したうちの一部である3次元の配列a1,a2,a3が、それぞれノード10,10a,10bに入力される。例えば、ノード10,10a,10bそれぞれで動作するプロセス同士が同期して、複数本の処理流れR1をそれぞれのノード上で実行し、他の一部のプロセス同士が同期して、複数本の処理流れR2をそれぞれのノード上で実行し得る。例えば、ノード10の1つのプロセスが配列a1を担当する。図2では、あるタイミングにおける記憶部11の3つの記憶領域(第1記憶領域11a、第2記憶領域11bおよび第3記憶領域11c)の用途も図示されている。具体的には、配列a1のある区分データに対して処理流れR1のFFT演算用バッファが設けられている。また、配列a1の当該区分データに後続する区分データに対して、処理流れR2の送信バッファと受信バッファとが設けられている。このように、処理流れR1でFFT演算を実行している最中に、処理流れR2におけるall‐to‐all通信をオーバーラップして(重複して)実行することができる。
次のタイミングでは、記憶部11の送信バッファは、処理流れR1の第2受信処理の受信バッファに切り替わる。また、記憶部11の受信バッファは、処理流れR2のFFT演算用バッファに切り替わる。更に、記憶部11のFFT演算用バッファは、処理流れR1の第2送信処理の送信バッファに切り替わる。次のタイミングでも、処理流れR2でFFT演算を実行している最中に、処理流れR1におけるall‐to‐all通信をオーバーラップして実行することができる。
すなわち、演算部12は、第1プロセスにより第1記憶領域を用いてFFT演算を実行している間に、第2プロセスにより第2記憶領域に格納された計算済みのFFT計算結果の他のプロセスへの送信、および、他のプロセスから受信したFFT演算結果の第3記憶領域への格納を実行する。こうして、ある処理流れに対してFFT演算を行いつつ、別の処理流れでプロセス間の集団通信を行い、FFT演算結果の組み替えを行えるようになり、FFT演算を高速化できる。
また、3つの記憶領域の用途(送信バッファ、受信バッファおよびFFT演算用など)を切り替えながら処理を行うことで、メモリ消費量を抑えられる。例えば、前述のように、各記憶領域のサイズは、区分データのサイズに応じて定めることができる。このため、3つの記憶領域が、例えばL2(Level 2)キャッシュに収まる程度に区分データのサイズを決定することで、省メモリ化を図りながら、演算を高速化できる。
次に、大規模な科学技術計算に用いられる並列計算機を例示して、上記のFFT演算の高速化の手法をより詳細に説明する。
[第2の実施の形態]
図3は、第2の実施の形態の並列計算機の例を示す図である。第2の実施の形態の並列計算機50は、計算ノード100,100a,100b,100c,・・・および管理ノード200を含む。計算ノード100,100a,100b,100c,・・・および管理ノード200は、ネットワーク51に接続されている。ネットワーク51は、MeshやTorusなどの直接網でもよい。あるいは、ネットワーク51は、通信スイッチを介して接続されるFat−treeやcross−barなどの間接網でもよい。並列計算機50は、複数のノードを用いて、各種の演算を並列に実行する。並列計算機50は、スーパーコンピュータシステムまたはHPC(High Performance Computing)システムなどと呼ばれてもよい。
計算ノード100,100a,100b,100c,・・・それぞれは、1つまたは複数のCPUを有し、各CPUによりメモリを共有する処理機構の単位である。
管理ノード200は、計算ノード100,100a,100b,100c,・・・に実行させるジョブを管理する。例えば、管理ノード200は、ユーザによるジョブの実行を受け付け、計算ノード100,100a,100b,100c,・・・に対するジョブの投入を行う。また、管理ノード200は、計算ノード100,100a,100b,100c,・・・に実行させるプログラムの計算ノード100,100a,100b,100c,・・・への配置も行う。
管理ノード200は、ネットワーク30にも接続されている。ネットワーク30は、LAN(Local Area Network)でもよいし、WAN(Wide Area Network)やインターネットなどでもよい。管理ノード200は、ネットワーク30に接続されたデータ格納サーバ300から、各計算ノードに実行させるプログラムや、各計算ノードの処理に用いられるデータを取得し、各計算ノードに提供することもできる。データ格納サーバ300は、プログラムやデータを配布するサーバコンピュータである。
図4は、計算ノードのハードウェア例を示す図である。計算ノード100は、CPU110,120、RAM130および通信インタフェース140を有する。各ユニットは計算ノード100のバスに接続されている。計算ノード100a,100b,100c,・・・および管理ノード200も計算ノード100と同様のユニットを用いて実現できる。
CPU110は、計算ノード100の情報処理を制御する。CPU110は、キャッシュ111、制御コア112および計算コア113,114,115,116,117を有する。
キャッシュ111は、制御コア112および計算コア113,114,115,116,117の処理に使用されるキャッシュメモリである。キャッシュ111は、例えば、L1(Level 1)キャッシュやL2キャッシュなどのように階層化される。
制御コア112は、プロセス間通信を担当する制御用のコアである。計算コア113,114,115,116,117は、FFT演算を実行する演算用のコアである。
CPU120もCPU110と同様に、キャッシュ121、制御コア122および計算コア123,124,125,126,127を有する。
RAM130は、計算ノード100の主記憶装置である。RAM130は、CPU110,120によって共有される共有メモリである。RAM130は、CPU110,120に実行させるプログラムの少なくとも一部を一時的に記憶する。RAM130は、CPU110,120による処理に用いられる各種データを記憶する。
通信インタフェース140は、ネットワーク51を介して他のノードと通信を行う。
図5は、ネットワークの例を示す図である。ネットワーク51は、例えば、Tofu(登録商標)と呼ばれる6次元メッシュ/トーラスの直接網として実現される。Tofuでは、12個の計算ノードを1ユニット(3次元トーラスユニット)とし、各ユニットを3次元トーラス構造で接続する。Tofuでは、3次元プロセス形状を適切なノードに対応させることにより、各軸方向の通信データの輻輳が発生しにくいため、後述するFFT演算における多軸分散方式との適合性が高い。
図6は、データ格納サーバのハードウェア例を示す図である。データ格納サーバ300は、プロセッサ301、RAM302、HDD(Hard Disk Drive)303、画像信号処理部304、入力信号処理部305、媒体リーダ306および通信インタフェース307を有する。各ユニットはデータ格納サーバ300のバスに接続されている。
プロセッサ301は、データ格納サーバ300の情報処理を制御する。プロセッサ301は、マルチプロセッサであってもよい。プロセッサ301は、例えばCPU、DSP、ASICまたはFPGAなどである。プロセッサ301は、CPU、DSP、ASIC、FPGAなどのうちの2以上の要素の組み合わせであってもよい。
RAM302は、データ格納サーバ300の主記憶装置である。RAM302は、プロセッサ301に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、RAM302は、プロセッサ301による処理に用いる各種データを記憶する。
HDD303は、データ格納サーバ300の補助記憶装置である。HDD303は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。HDD303は、OSのプログラム、アプリケーションプログラム、および各種データを記憶する。データ格納サーバ300は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
画像信号処理部304は、プロセッサ301からの命令に従って、データ格納サーバ300に接続されたディスプレイ31に画像を出力する。ディスプレイ31としては、CRT(Cathode Ray Tube)ディスプレイや液晶ディスプレイなどを用いることができる。
入力信号処理部305は、データ格納サーバ300に接続された入力デバイス32から入力信号を取得し、プロセッサ301に出力する。入力デバイス32としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
媒体リーダ306は、記録媒体33に記録されたプログラムやデータを読み取る装置である。記録媒体33として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)を使用できる。また、記録媒体33として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ306は、例えば、プロセッサ301からの命令に従って、記録媒体33から読み取ったプログラムやデータをRAM302またはHDD303に格納する。
通信インタフェース307は、ネットワーク30を介して他の装置(例えば、管理ノード200)と通信を行う。通信インタフェース307は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
ここで、FFT演算の一般的な処理方法について説明する。まず、FFT演算の分類として、データの分散という観点での分類が考えられる。データの分散という観点での分類とは、3次元形状のFFT計算対象の入力データ全体を1つの仮想的グローバル配列(以下、単にグローバル配列という)とみなし、グローバル配列を、複数プロセスにあるローカル配列にどのように分配するかという観点での分類である。具体的には、1軸分散(板状分散)、2軸分散(柱状分散)、3軸分散という分類がある。1軸分散は、slab decompositionとも呼ばれる。2軸分散は、pencil-wiseまたはcolumn-wise decompositionとも呼ばれる。3軸分散は、volumetric decompositionとも呼ばれる。分割軸を増やすことで、プロセス数の増大に対応しやすくなる。このため、多次元直接網の通信ネットワークが採用される場合には、通信トポロジ形状とデータ分散形状を整合させやすいなどの理由から、近年は2軸または3軸分散方式が利用される傾向にある。
以降の説明では、3次元FFT計算対象であるグローバル配列のサイズをN1,N2,N3とし、各軸方向の分割数をそれぞれP1,P2,P3とする。ここで、N1は、グローバル配列のX軸方向のデータ要素数である。N2は、グローバル配列のY軸方向のデータ要素数である。N3は、グローバル配列のZ軸方向のデータ要素数である。また、P1は、X軸方向の分割数である。P2は、Y軸方向の分割数である。P3は、Z軸方向の分割数である。
グローバル配列を分割したローカル配列のサイズをN1P,N2P,N3Pとして示す。N1Pは、ローカル配列のX軸方向のデータ要素数である。N2Pは、ローカル配列のY軸方向のデータ要素数である。N3Pは、ローカル配列のZ軸方向のデータ要素数である。そして、自然数NをPで割った時の余りがゼロで割り切れることをmod(N,P)=0と表記する。
更に、X,Y,Z軸の順にメモリ上で連続にデータが格納されているものとする。3次元FFT計算では、X,Y,Z方向それぞれのFFTを行う。このとき、各方向のFFTを行う際に、一旦、処理対象の方向のデータをプロセス間の通信により1つのプロセス内に集めて計算を行うことになる。X,Y,Z方向の計算は、任意の順序で行える。
図7は、1軸分散の例を示す図である。図7では、N1×N2×N3のサイズのグローバル配列を、4つのプロセスに割り当てる例を示している。例えば、まず、Y,Z方向のFFTに関してプロセス内のデータを対象としている条件下では、通信を行わずに処理できる。分割格納されたX方向のFFTに関してはプロセス間でMPI(Message Passing Interface)におけるall‐to‐all通信と呼ばれる集団通信を行い、X方向のFFT対象データをプロセス内に集める。こうして、各プロセスにおいて、X方向のFFT演算を並列に行える。入力データの分散方法と同じX方向に分割したデータ配置に戻すためには同じall‐to‐all通信を行う(ただし、後述するように戻す通信を省略する場合もある)。
ここで、FFT演算に要するバッファ領域および通信演算オーバーラップ化について検討する。通信を行うには、送信バッファと受信バッファと呼ばれる作業領域をメモリ上に設けることになる。通常のアルゴリズムのままの場合、入力データが格納されたローカル配列をそのまま送信バッファとして利用するとして、送信バッファと同じサイズの受信バッファを用いることになる。Y,Z方向のFFT計算と1回の集団通信(all‐to‐all通信)とX方向のFFT計算の順にデータ依存関係があるので、通信と計算とを同時に進めることはできない。通信および演算する範囲をZ方向に小直方体形状に区分化することで、通信と演算とのオーバーラップ化が可能となる。Z方向のFFT処理は全体に対して行っておき、Y方向FFTについては部分的に先行して行い、部分的処理が済んだ範囲のデータに対して通信を行い、X方向のFFTデータをプロセス内に集める。当該通信と同時に、次のY方向FFTの部分的処理を進めれば、通信演算オーバーラップを行える。あるいは、次の区分の通信時に先行部分のX方向FFTを進めることでの通信演算オーバーラップも可能である。X方向FFTまで完了したデータを保持しておくことになるため、入力データが格納されたローカル配列と同じサイズの別配列に出力するのが1つの方法として考えられる。
1軸分散の問題の一つは、問題規模がN^3ならNノード以上あってもデータを分配できないため並列台数効果が見込めない点である。Nの大きさとしては数千程度までが実際に利用される標準的なサイズであるのに対して、近年の大規模な並列計算機では数万ノードを擁する。また、直接網ネットワークとの適合性やメッセージ長による性能への影響もあり、複数軸での分割が望まれる傾向が強まっている。1軸分散では集団通信を行うプロセスグループが一つであるために1グループ内のプロセス数が多くなりメッセージ長が短くなる。このため、処理区分化による通信演算オーバーラップ方式の適用が、後述の2軸、3軸分散よりも不利である。また、上述の方法でZ方向FFT計算を通信と重ね合わせることはできない。
図8は、2軸分散の例を示す図である。図8では、4×3プロセス形状に対する2軸分散の例を示している。この方法ではグローバル配列を柱状にローカル配列に分割するデータ分散方式が用いられる。例えば、X方向に対して、まず各プロセスにより柱方向のFFT計算を行う(図8(A))。次に、XY面に分けられたプロセスグループに属するプロセス間でall‐to‐all通信を行うことで、各プロセスでY方向に柱上に分割したデータ分散方式に持ち直して、Y方向のFFT計算を行う(図8(B))。更に、YZ面に分けられたプロセスグループに属するプロセス間でall‐to‐all通信を行うことで、各プロセスでZ方向に柱上に分割したデータ分散方式に持ち直して、Z方向のFFT計算を行う(図8(C))。この場合は、入力データがX方向の柱状分割であったのに対して出力データはZ方向の柱状分割になる。出力データもX方向の柱状分割としたい場合には、並べ替えの通信を別途行うことになる。
2軸分散の場合のバッファ領域および通信演算オーバーラップ化について検討する。all‐to‐all通信の効率的利用のためには、別プロセスに送信するデータ領域は連続した部分領域となっていることが求められる。このため、Y,Z方向FFTを行う前の通信においては、それぞれY,Z方向が連続になるように並べ替えを行って送信バッファに格納してからall‐to‐all通信を行う関数に渡すことになる。また、一般には通信前後の配置でデータ数が割り切れる条件を満たしているとも限らないため、空き領域を加えて等分割化してall‐to‐all通信機能を用いることもある。この場合は入力データが格納されたローカル配列をそのまま送信バッファあるいは受信バッファとして利用できない。すなわち、通信演算オーバーラップのために各ローカル配列を小直方体形状に区分化したとして、バッファ領域は(データ配置を元に戻す通信を略さずにin-place化した条件の想定下で)少なくとも区分サイズの約4つ分(送信バッファと受信バッファがオーバーラップ処理のために2つずつ)必要となる。
図9は、3軸分散の例を示す図である。3軸分散では、グローバル配列を全ての方向に分割してローカル配列に格納するデータ分散方式が用いられる。3軸分散の場合、X,Y,Zの何れの方向についてもFFT対象のデータが一つのプロセスに収まっていない。このため、各方向のFFT計算において通信を行うことになる。元のデータ配置に戻す通信を略さないならば、分散された各軸方向のFFT計算を行うことはどの方向でも同様の処理になるため、Z次元方向のFFTについて説明する。ここで、図9において、ランク番号は、トーラス空間上におけるプロセスの位置を示す番号である。
Z次元方向の1つのプロセスグループのみを考えるならば、Z次元方向に分散した1軸分散のZ軸方向のFFT処理を行うことに相当する。ただし、ここでは1軸分散の例で示した板形状への単純分割よりも少し一般的な条件としておく。例えば、あるプロセスグループに属するXY面で示されるZ方向のFFT多重度を、P3個のプロセスで分配するという方式を採用する。その多重度はN1P×N2P=(N1/P1)×(N2/P2)である。プロセス間での通信後にデータ要素数が不均一とならないように、以下の3つの制約条件が課せられている。1つ目の条件は、mod(N1P×N2P,P3)=0である。2つ目の条件は、mod(N2P×N3P,P1)=0である。3つ目の条件は、mod(N3P×N1P,P2)=0である。
ここで、3軸分散の場合のバッファ領域および通信演算オーバーラップ化について検討する。まず、各次元方向のFFT処理が1軸分散の特定次元方向のFFT処理を行うことに相当しているといっても、前述の1軸分散での通信演算オーバーラップ化で説明した前段FFT計算とのオーバーラップを適用することはできない。前段FFT計算の手続き中においても通信が含まれるためである。更に、単純な直方体区分でない一般的条件下での通信および演算する範囲の区分化方法は、前述の1軸分散と比べて複雑になる。例えば、サイズが100×60×80のグローバル配列に対して、2×2×5のプロセスグリッドで3軸分散FFTを行う模式的なケースを考える。Z次元方向の1プロセスグループに注目すると、当該1プロセスグループに属する5つのプロセスを用いて、50×30×80のローカル配列のデータに対し、Z方向80個の要素のFFTを50×30=1500本の計算を行うことになる。通信演算オーバーラップ化のためには区分化が必要であり、例えば4区分とするならば、1区分あたりのFFT本数は1500/4=375本となり、1プロセスは375/5=75本を担当する。
図10は、1つのZ方向プロセスグループの保持データの例を示す図である。図10では、Z次元方向の1プロセスグループに属する5プロセスが処理する50×30×80の形状のローカル配列の保持状況を色分けによって示している。図10の例では、Zランク番号が大きいプロセスほど、Z軸上の大きい値の位置に相当するデータを保持している。
図11は、各プロセスの担当データ(第1区分)の例を示す図である。図11では、ローカル配列を区分化した場合の初段処理でデータ移動した後の各プロセスの担当範囲を示している。該当部分のZ方向FFT計算を各プロセスが行うのと同時に、次の区分(第2区分)についての通信を開始することで、通信演算のオーバーラップが可能となる。
図12は、各プロセスの担当データ(第2区分)の例を示す図である。図11,図12で例示した区分化を行うとして、FFT計算に必要なバッファ領域は(データ配置を元に戻す通信を略さずにin-place化した条件の想定下で)少なくとも区分サイズの約4つ分(送信バッファと受信バッファがオーバーラップ処理のために2つずつ)である。
また、区分化しないで一度の集団通信でデータの持ち直しをする場合には前述の3つの制約条件が必要となっていた。一方、処理区分化を行う場合は割り切れない余り部分についてはバッファサイズより小さなデータに対する処理となるので、制約条件を課さないように実装することも容易になる。そこで、後述するように、並列計算機50では、区分サイズに任意性をもたせ、必要なバッファ領域が区分サイズの約3つ分で済むよう演算通信のオーバーラップを効率化する機能を提供する。
なお、並列計算機50において、上述の区分サイズ設定に任意性をもたせる理由は、データ通信機能や演算機能における処理効率の一般的な性能特性による。そこで、当該性能特性について、以下に説明する。
図13は、通信処理単位サイズと通信性能の関係の例を示す図である。図13では、プロセス間の通信処理単位となるメッセージ長とハードウェアピーク性能に対する通信効率比のグラフを例示している。all‐to‐all通信においては、1プロセスあたりが持つ配列の区分サイズを、通信を行うプロセスグループに属するプロセス数で割った大きさがメッセージ長に相当する。
all‐to‐all通信における通信時間は以下の式(1)により見積もれる。
ここで、Tは通信時間である。L
collectiveは集団通信レイテンシである。Mはメッセージ長である。通信を行うプロセスグループに属するPはプロセス数である。Bはバイセクションバンド幅(Bi-section Bandwidth)である。バイセクションバンド幅は、システム内の全計算ノードが最大限の通信を行った場合に、システム全体として達成可能な通信性能の下限を表す。αは実行通信性能を示す係数である。
集団通信レイテンシLcollectiveは、式(2)によって評価される。
ここで、L
prepareは、通信規模によらない固定時間である。L(1対1)(数式では“1対1”を下付きで表している)は、プロセス数に比例した処理時間の係数である。all‐to‐all通信では、自プロセス以外の各プロセスにメッセージを送るのでL(1対1)に(P−1)を乗じる。
式(1)にLprepare=50マイクロ秒、L(1対1)=0.5マイクロ秒、α=0.6程度とすることで図13の実測値と合う。ここで、区分化サイズを小さくするとメッセージ長は短くなり通信効率が落ちる。また、メッセージ長がおよそ100KB程度あれば、それ以上に大きくしても通信効率の向上への寄与は小さい。
次に、ローカル配列のサイズと演算性能との関係を例示する。
図14は、複素行列ベクトル積での問題サイズと演算性能の例を示す図である。ここで、問題サイズは、1つのプロセスに対して割り当てられるローカル配列のサイズに相当する(次に示す図15も同様)。
図15は、2次元FFTでの問題サイズと演算性能の例を示す図である。図14,図15の例の何れの場合も問題サイズがL2キャッシュの容量に収まらなくなる程度で性能低下が発生する傾向にある。この傾向は浮動小数点演算あたりに必要となるデータロードおよびデータストア命令の比率が多い計算において一般に確認される性能挙動であり、分散並列FFT計算において各プロセスが行う処理も同様の傾向となる。このような理由から、データアクセス範囲をL2キャッシュ容量に収まる程度とするように抑えつつ、前述のメッセージ長が通信性能を低下させるほど短くならないように区分サイズを調整できることがFFT演算の高速化によっては好ましい。
以上をまとめると、FFT演算では、演算に必要なデータを移動させるための通信と通信するべきデータを用意するための演算で相互に依存関係があることを考慮する必要があり、独立に処理できる部分への区分化方法には制限が課せられる。区分化された処理サイズは小さ過ぎても大き過ぎても全体の処理効率を悪化させるため、区分化サイズの適切な調整を可能とすることが好ましい。
また、区分サイズが大きいことによる性能への悪影響は、アルゴリズム中で使用するバッファ領域を節約することで緩和し得る。このため、演算通信オーバーラップを行う省メモリなアルゴリズムが求められる。
そこで、並列計算機50では、区分化した演算および通信処理に対して、データの依存順序関係をそれぞれ満たした上で2つの処理流れを同時並列的に実行する。このとき、一方の処理流れで行う演算と、もう一方の処理流れで行う通信が相互に重なるように実行のタイミングを制御する。このとき、2つの処理流れが使用するバッファ領域について、競合を避けつつ共用化することで省メモリを図りながら、区分サイズを適切に調整して高速な処理を実現する。
図16は、計算ノードの機能例を示す図である。計算ノード100は、記憶部150、制御部160および処理流れ実行部170を有する。なお、図16の例では、CPU110の機能を説明するが、CPU120も同様の機能を発揮する。
ここで、記憶部150は、キャッシュ111やRAM130に確保された記憶領域として実現される。制御部160および処理流れ実行部170は、RAM130に記憶されたプログラムをCPU110が実行することで実現される。
制御部160は、ローカル配列の取得および区分サイズの決定を行う。制御部160は、ローカル配列や区分サイズの情報を記憶部150に格納する。
処理流れ実行部170は、上述した2つの処理流れを実行する。処理流れ実行部170は、入出力処理部171,171a、通信処理部172,172aおよびFFT処理部173,173aを有する。2つの処理流れを並行して処理するため、処理流れ実行部170は、入出力処理部、通信処理部およびFFT処理部をそれぞれ2つずつ有する。入出力処理部171,171aおよび通信処理部172,172aは、制御コア112によって実現される。FFT処理部173,173aは、計算コア113,114,115,116,117によって実現される。
入出力処理部171は、FFT演算の対象とする区分データをローカル配列から取り出して送信バッファに格納する(転置in)。また、入出力処理部171は、FFT計算後の区分データを受信バッファから取り出して、ローカル配列に格納する(転置out)。入出力処理部171aも入出力処理部171が扱う区分データとは異なる区分データに対して、同様の処理を行う。
通信処理部172は、区分データおよびFFT演算後の区分データに対してall‐to‐all通信を行う。通信処理部172aも、通信処理部172が扱う区分データとは異なる区分データに対してall‐to‐all通信を行う。
FFT処理部173は、all‐to‐all通信後の区分データに対するFFT演算を実行する。FFT処理部173aも、FFT処理部173が扱う区分データとは異なる区分データに対してFFT演算を実行する。
図17は、区分化の例を示す図である。図17では、ローカル配列のZ方向に対する区分化の例を示している。例えば、入出力処理部171,171aは、1つのプロセスに割り当てられたローカル配列を6つの区分データに分割して送信バッファに読み込む。分割数は、区分サイズ(1つの区分データのサイズ)に応じて決定される。以下では、6つの区分データそれぞれを、区分K1,K2,K3,K4,K5,K6と表記する。
図18は、第2の実施の形態の処理流れの例を示す図である。計算ノード100は、連続する2つの区分データ(例えば、区分K1,K2の2つの区分データや区分K2,K3の2つの区分データなど)を2つの処理流れR1,R2によりオーバーラップして処理する。処理流れR1,R2それぞれは、転置in、送信、受信、FFT、送信、受信、転置outの手順を順番に実行する。
転置inは、ローカル配列からの区分データを取り出して、送信用に転置して(FFT処理対象の軸に沿って連続するように並べて)バッファに格納する処理である。次の送信および受信は、転置inの結果を自プロセスが属するプロセスグループに属する他プロセスに対するall‐to‐all通信である。FFTは、前段のall‐to‐all通信の結果に対するFFT演算である。次の送信および受信は、FFT演算結果の各部を元の保持プロセスに戻すためのall‐to‐all通信である。転置outは、前段のall‐to‐all通信の結果を、ローカル配列に格納する処理である。
図19は、第2の実施の形態の演算通信オーバーラップの例を示す図である。処理流れ実行部170は、2つの処理流れR1,R2に対して、3つの記憶領域である作業域A1,A2,A3を記憶部150に設ける。そして、2つの処理流れR1,R2それぞれの処理を、作業域A1,A2,A3を用いて次のように実行する。ここで、図19では、図17で例示した区分化されたデータに対してZ方向のFFTを実行する例を示す。図19の上側から下側へ向かう方向が時系列の正方向である。また、図19では、処理流れR1に相当する処理を白抜きで、処理流れR2に相当する処理を網掛けで図示している。更に、図19では、各作業域を用いた処理が行われない区間についてはハイフン記号“−”を付している。
第1のタイミングで、入出力処理部171は、区分K1をローカル配列から取り出して転置inの処理を実行し、作業域A1に格納する。
第2のタイミングで、通信処理部172は、作業域A1(送信バッファ)および作業域A2(受信バッファ)を用いて、all‐to‐all通信を実行する。
第3のタイミングで、FFT処理部173は、作業域A2に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。
第4のタイミングで、通信処理部172は、作業域A2(送信バッファ)および作業域A3(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。また、第4のタイミングで、入出力処理部171aは、区分K2をローカル配列から取り出して転置inの処理を実行し、作業域A1に格納する。ここまでが以降に示すループに入るまでの前段の処理である。
第5のタイミングで、入出力処理部171は、作業域A3に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部171は、区分K3をローカル配列から取り出して転置inの処理を実行し、作業域A3に格納する。また、第5のタイミングで、通信処理部172aは、作業域A1(送信バッファ)および作業域A2(受信バッファ)を用いて、all‐to‐all通信を実行する。
第6のタイミングで、通信処理部172は、作業域A3(送信バッファ)および作業域A1(受信バッファ)を用いて、all‐to‐all通信を実行する。また、第6のタイミングで、FFT処理部173aは、作業域A2に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。
第7のタイミングで、FFT処理部173は、作業域A1に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。また、第7のタイミングで、通信処理部172aは、作業域A2(送信バッファ)および作業域A3(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。
第8のタイミングで、通信処理部172は、作業域A1(送信バッファ)および作業域A2(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。また、第8のタイミングで、入出力処理部171aは、作業域A3に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部171aは、区分K4をローカル配列から取り出して転置inの処理を実行し、作業域A3に格納する。第5のタイミング〜第8のタイミングまでに示した手順でループ処理の1回目が完了する。
第9のタイミングで、入出力処理部171は、作業域A2に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部171は、区分K5をローカル配列から取り出して転置inの処理を実行し、作業域A2に格納する。また、第9のタイミングで、通信処理部172aは、作業域A3(送信バッファ)および作業域A1(受信バッファ)を用いて、all‐to‐all通信を実行する。
第10のタイミングで、通信処理部172は、作業域A2(送信バッファ)および作業域A3(受信バッファ)を用いて、all‐to‐all通信を実行する。また、第10のタイミングで、FFT処理部173aは、作業域A1に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。
第11のタイミングで、FFT処理部173は、作業域A3に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。また、第11のタイミングで、通信処理部172aは、作業域A1(送信バッファ)および作業域A2(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。
第12のタイミングで、通信処理部172は、作業域A3(送信バッファ)および作業域A1(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。また、第12のタイミングで、入出力処理部171aは、作業域A2に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部171aは、区分K6をローカル配列から取り出して転置inの処理を実行し、作業域A2に格納する。第6のタイミング〜第12のタイミングまでに示した手順でループ処理の2回目(ループ2)が完了する。以降の説明はループの終端の手順となる。
第13のタイミングで、入出力処理部171は、作業域A2に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する(処理流れR1が完了する)。また、第13のタイミングで、通信処理部172aは、作業域A2(送信バッファ)および作業域A3(受信バッファ)を用いて、all‐to‐all通信を実行する。
第14のタイミングで、FFT処理部173aは、作業域A3に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。
第15のタイミングで、通信処理部172aは、作業域A3(送信バッファ)および作業域A1(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。
第16のタイミングで、入出力処理部171aは、作業域A1に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する(処理流れR2が完了する)。
次に上記3つの作業域を用いて行われるFFT処理の具体的な手順を説明する。まず、FFTの全体処理の手順を説明する。
図20は、第2の実施の形態のFFTの全体処理の例を示すフローチャートである。以下、図20に示す処理をステップ番号に沿って説明する。
(S11)制御部160は、3次元FFT計算対象の入力データをローカル配列Aに準備する。
(S12)制御部160は、X方向処理での区分サイズを決定する。区分サイズの決定方法の詳細は、後述される。
(S13)処理流れ実行部170は、ローカル配列Aの区分サイズのデータを送信バッファにコピーする。
(S14)処理流れ実行部170は、X方向プロセスグループでall‐to‐all通信を行う。ここで、all‐to‐all通信を、図中では“A2A通信”と略記することがある。
(S15)処理流れ実行部170は、受信バッファのデータに対してFFT計算を行う。
(S16)処理流れ実行部170は、X方向プロセスグループでデータ配置を戻すall‐to‐all通信を行う。
(S17)処理流れ実行部170は、受信データをローカル配列Aの元区分の位置にコピーする。処理流れ実行部170は、図19で例示したように2つの処理流れにより、ステップS13〜S17の手順を繰り返し実行する。そして、処理流れ実行部170は、X方向のFFT処理が完了すると、処理をステップS18に進める。
(S18)制御部160は、Y方向処理での区分サイズを決定する。
(S19)処理流れ実行部170は、ローカル配列Aの区分サイズのデータを送信バッファに転置コピーする(転置in)。
(S20)処理流れ実行部170は、Y方向プロセスグループでall‐to‐all通信を行う。
(S21)処理流れ実行部170は、受信バッファのデータに対してFFT計算を行う。
(S22)処理流れ実行部170は、Y方向プロセスグループでデータ配置を戻すall‐to‐all通信を行う。
(S23)処理流れ実行部170は、受信データをローカル配列Aの元区分の位置に転置コピーする(転置out)。処理流れ実行部170は、図19で例示したように2つの処理流れにより、ステップS19〜S23の手順を繰り返し実行する。そして、処理流れ実行部170は、Y方向のFFT処理が完了すると、処理をステップS24に進める。
(S24)制御部160は、Z方向処理での区分サイズを決定する。
(S25)処理流れ実行部170は、ローカル配列Aの区分サイズのデータを送信バッファに転置コピーする(転置in)。
(S26)処理流れ実行部170は、Z方向プロセスグループでall‐to‐all通信を行う。
(S27)処理流れ実行部170は、受信バッファのデータに対してFFT計算を行う。
(S28)処理流れ実行部170は、Z方向プロセスグループでデータ配置を戻すall‐to‐all通信を行う。
(S29)処理流れ実行部170は、受信データをローカル配列Aの元区分の位置に転置コピーする(転置out)。処理流れ実行部170は、図19で例示したように2つの処理流れにより、ステップS25〜S29の手順を繰り返し実行する。そして、処理流れ実行部170は、Z方向のFFT処理が完了すると、処理を終了する。
図21は、プロセスに合わせて分割された入力データの例を示す図である。図21では、グローバル配列を、3×4×3のプロセス形状でローカル配列に分割した場合を例示している。当該プロセス形状では、各プロセスは、X軸方向に“0”、“1”、“2”、Y軸方向に“0”、“3”、“6”、“9”、Z軸方向に“0”、“12”、“24”というように付されたプロセス番号によって識別される。グローバル配列のサイズをN1,N2,N3とし、X,Y,Z軸方向の分割数をそれぞれP1,P2,P3とすれば、ローカル配列のサイズは、N1P=N1/P1、N2P=N2/P2、N3P=N3/P3である。
図22は、区分的な転置コピーとプロセス間通信の例を示す図である。図22では、Z方向の1つのプロセスグループ(プロセス番号“0”、“12”、“24”のプロセスが属するプロセスグループ)における区分データの転置コピー(転置in)と、プロセス間のall‐to‐all通信とを例示している。
図23は、区分的な転置コピーとプロセス間通信の例(続き)を示す図である。図22で例示したall‐to‐all通信により受信バッファに配置された区分データに対して、各プロセスにより多重FFT計算を行った後は、逆方向の流れによりローカル配列(入出力配列)Aの元の区分に転置コピーする(転置out)。ここでは、Z方向に対するFFT計算の例を示したが、X,Y方向についても同様に処理できる。
次に、図20で例示したFFTの全体処理における各軸方向のFFT計算の手順を説明する。3次元においてX方向、Y方向、Z方向の3種類の方向があるが、以下ではZ方向に着目して説明する。ただし、X方向、Y方向についても、Z方向と同様の手順により処理できる。
図24は、第2の実施の形態のZ方向FFT計算の例を示すフローチャートである。以下、図24に示す処理をステップ番号に沿って説明する。以下に示す手順は、図20のステップS24〜S29に相当する。処理流れR1の処理を入出力処理部171、通信処理部172およびFFT処理部173により実行し、処理流れR2の処理を入出力処理部171a、通信処理部172aおよびFFT処理部173aにより実行するものとする。
(S31)制御部160は、Z方向処理での区分サイズを決定する。
(S32)入出力処理部171は、ローカル配列Aの区分サイズのデータを送信バッファaに転置コピーする(転置in)。ここで、作業域A1,A2,A3は、バッファa,b,cの何れかに割り当てられる。初期状態では、バッファaは作業域A1に相当し、バッファbは作業域A2に相当し、バッファcは作業域A3に相当する。以下の説明では、バッファa,b,cそれぞれの用途が、送信バッファ、受信バッファのように切り替えられる点に注意されたい。該当のタイミングでの用途を明確にするために、例えば、あるタイミングではバッファaを「送信バッファa」と表記したり、別のタイミングではバッファaを「受信バッファa」と表記したりすることがある。
(S33)通信処理部172は、all‐to‐all通信を行い、バッファbにデータを受信する。
(S34)FFT処理部173は、受信バッファbのデータに対してFFT計算を行う。
(S35)通信処理部172は、バッファbからバッファcへ、データ配置を戻すall‐to‐all通信を行う。
(S36)入出力処理部171aは、ローカル配列Aの区分サイズのデータを送信バッファaに転置コピーする(転置in)。通信処理部172および入出力処理部171aは、ステップS35,S36を同期して実行開始する。なお、ステップS31〜S36までがループ前処理となる。
(S37)入出力処理部171は、受信したバッファcのデータをローカル配列Aの元区分の位置に転置コピーする(転置out)。
(S38)通信処理部172aは、all‐to‐all通信を行い、バッファbにデータを受信する。入出力処理部171および通信処理部172aは、ステップS37,S38を同期して実行開始する。
(S39)入出力処理部171aは、ローカル配列Aの区分サイズのデータを送信バッファcに転置コピーする(転置in)。
(S40)通信処理部172は、all‐to‐all通信を行い、バッファcからデータを送信し、バッファaによりデータを受信する。
(S41)FFT処理部173aは、受信バッファbのデータに対してFFT計算を行う。通信処理部172およびFFT処理部173aは、ステップS40,S41を同期して実行開始する。
(S42)FFT処理部173は、受信バッファaのデータに対してFFT計算を実行する。
(S43)通信処理部172aは、バッファbからバッファcへデータ配置を戻すall‐to‐all通信を行う。FFT処理部173および通信処理部172aは、ステップS42,S43を同期して実行開始する。
(S44)通信処理部172は、バッファaからバッファbへデータ配置を戻すall‐to‐all通信を行う。
(S45)入出力処理部171aは、受信したバッファcのデータをローカル配列の元区分の位置に転置コピーする(転置out)。通信処理部172および入出力処理部171aは、ステップS44,S45を同期して実行開始する。
(S46)入出力処理部171aは、ローカル配列Aの区分サイズのデータを送信バッファcに転置コピーする(転置in)。
(S47)入出力処理部171,171aは、a,b,cに対するバッファ割当てをサイクリックに交換する。具体的には、バッファaに相当する作業域をバッファbに変える。バッファbに相当する作業域をバッファcに変える。バッファcに相当する作業域をバッファaに変える。そして、未処理の区分データがなくなるまで、処理流れR1の処理をステップS37へ進め、処理流れR2の処理をステップS38へ進める。ローカル配列Aにおいて未処理の区分データがなくなると、処理をステップS48へ進める。
図25は、第2の実施の形態のZ方向FFT計算の例(続き)を示すフローチャートである。以下、図25に示す処理をステップ番号に沿って説明する。
(S48)入出力処理部171は、受信したバッファcのデータをローカル配列Aの元区分の位置に転置コピーする(転置out)。これにより、処理流れR1が完了する。
(S49)FFT処理部173aは、受信バッファbのデータに対してFFT計算を実行する。入出力処理部171およびFFT処理部173aは、ステップS48,S49を同期して実行開始する。
(S50)通信処理部172aは、all‐to‐all通信を行い、バッファaからデータを送信し、バッファbによりデータを受信する。
(S51)FFT処理部173aは、受信バッファbのデータに対してFFT計算を実行する。
(S52)通信処理部172aは、バッファbからバッファcへデータ配置を戻すall‐to‐all通信を行う。
(S53)入出力処理部171aは、受信したバッファcのデータをローカル配列Aの元区分の位置に転置コピーする。これにより、処理流れR2が完了する。なお、ステップS48〜S53までがループ終端処理となる。そして、Z方向のFFT計算処理が完了する。
ここで、ある区分に対するFFTの手順と、別の区分に対するFFTの手順とでは、データ依存関係はないので、それぞれ独立に処理可能である。このため、処理流れを上記のように2つ用意して、上述の手順を実行する1つの処理流れに対し、もう1つの処理流れを重ね合わせることで、演算通信オーバーラップが可能となる。処理対象の2つの区分の間のデータ依存関係はないが、通信処理中に送信バッファへの別データ書き込みや受信バッファへの参照を避ける同期処理を行うことで、利用バッファの競合を避けることができる。このように、作業領域用のバッファについて、競合を避けつつ共用化することで、2つの処理流れに要するバッファサイズを、ローカル配列Aの区分化サイズの3倍に収めることができ、省メモリ化を図れる。
図24と図25に示す手順の実装に当たっては、例えば、MPI3.0規格のnon-blocking集団通信(MPI_alltoall)を利用することが考えられる。あるいは1スレッドのみでの通信処理とそれ以外のスレッドでの演算処理を明に制御するよう実装することも考えられる。後者の場合は、MPI側の実装においてスレッドサポートレベルとして“MPI_THREAD_FUNNELED”または“MPI_THREAD_SERIALIEZED”に対応していることを要する。また、集団通信機能について、利用システムに最適化されたMPIライブラリの実装が行われていることが望ましい。ただし、上記の方法は、特定のMPIライブラリの実装を必ずしも前提とするものではなく、演算とall‐to‐all通信をオーバーラップさせることができる環境であれば、適用可能である。
次に、区分サイズ決定の手順を説明する。
図26は、第2の実施の形態の区分サイズ決定の例を示すフローチャートである。以下、図26に示す処理をステップ番号に沿って説明する。なお、以下に示す手順は、図20のステップS12,S18,S24および図24のステップS31(ステップS31はステップS24と同じ処理を表している)に相当する処理である。
(S61)制御部160は、利用システム(例えば、並列計算機50のハードウェアや通信環境)に応じた値L,C,αを設定する。Lは、集団通信レイテンシ(単位は秒)である。Cは、プロセス当たりのキャッシュ容量(単位はバイト)である。αは、実効通信性能を示す係数である。また、制御部160は、対象とするFFT問題に応じて値V,Pを設定する。Vは、プロセス当たりの入出力配列サイズ(単位はバイト)である。Pは、処理中の次元方向のプロセスグループのプロセス数である。
(S62)制御部160は、利用システムおよび問題設定に応じて値Bを推定する。Bは、1つのプロセスグループに属するプロセスのみで構成されるシステムを想定した場合のバイセクションバンド幅(単位はバイト/秒)である。すなわち、Bは、集団通信を行う複数のプロセスが動作する複数の計算ノードの間の通信路におけるバイセクションバンド幅である。例えば、6次元メッシュ/トーラスのTofuの場合、計算ノード間のリンク当たりのバンド幅をBL、各次元方向のプロセス数をPiとして、次のようにBを近似的に求めることができる。1軸分散の場合、Bは式(3)で求められる。
(S63)制御部160は、メッセージ長Mを仮設定する。ここで、M=C/(4×P)である。
(S64)制御部160は、M<10×P2/(4×α×B×L)であるか(Mが10×P2/(4×α×B×L)よりも小さいか)否かを判定する。M<10×P2/(4×α×B×L)である場合、処理をステップS65に進める。M<10×P2/(4×α×B×L)でない場合、処理をステップS66に進める。
(S65)制御部160は、M=10×P2/(4×α×B×L)に設定する。そして、処理をステップS66に進める。
(S66)制御部160は、M×P>Vであるか(M×PがVよりも大きいか)否かを判定する。M×P>Vである場合、処理をステップS67に進める。M×P>Vでない場合、処理をステップS68に進める。
(S67)制御部160は、M=V/Pに設定する。そして、処理をステップS68に進める。
(S68)制御部160は、M×P(バイト)を各プロセスが用いる区分サイズとして決定する。そして、区分サイズの決定処理を終了する。処理流れ実行部170は、こうして決定された区分サイズを用いて、各次元方向のFFT処理を実行する。
こうして、制御部160は、区分サイズを決定する。ここで、適切な区分サイズは、通信の観点と演算の観点とでは性能挙動についてトレードオフの関係がある。区分サイズが大き過ぎることによる演算性能側の低下は半分程度であるのに対して、区分サイズが小さ過ぎることによる通信性能への影響は何倍も異なる場合がある。このため、制御部160は、通信性能への影響をより重視して、以下の優先順で区分サイズを決定している。
第1の条件は、M×P≦N1P×N2P×N3P×(1要素当たりのバイト数)である。第2の条件は、Lcollective<<M×P2/(4×α×B)である。第3の条件は、4×M×P≒(プロセス当たりのキャッシュ容量)である。
ここで、Mはメッセージ長(単位はバイト)であり、3×M×Pが作業域サイズ(作業域A1,A2,A3の合計サイズ)となるように区分化サイズを決定する。第1の条件は、入力配列よりも大きな送受信バッファを必要としないための上限サイズを示す。プロセス当たりのキャッシュ容量は、あるプロセスに対して作業域A1,A2,A3として割り当てることが可能なキャッシュメモリ(例えば、キャッシュ111)の容量である。通信レイテンシLcollective、通信効率係数α、プロセス当たりのキャッシュ容量はシステムに応じた値を与えることができるパラメタであり、各次元方向のプロセスP(P1,P2,P3の何れか)は、実行時に判断できる。制御部160は、第3の条件(ステップS63に相当)により、キャッシュメモリの容量に応じてプロセス間の通信のメッセージ長を決定し、決定したメッセージ長に基づいて複数のプロセスそれぞれの処理対象のデータのサイズ(区分サイズ)を決定する。このメッセージ長の決定の際、制御部160は、パラメタBも考慮する。
パラメタBは、集団通信を行うプロセスグループにおける通信性能を示す指標であり、当該プロセスグループに属するプロセスのみで構成されるシステムに対するバイセクションバンド幅である。多軸分散方式での分散並列FFTにおいては全体のプロセスを複数のプロセスグループに分け、それぞれのプロセスグループで集団通信を行う計算過程があるため、通常の意味でのシステム全体に対するバイセクションバンド幅とは異なる。パラメタBの値は、多次元直接網ネットワークのシステムにおいては、隣接プロセス間の通信リンク帯域とプロセス形状から決定されることになるが、パラメタBの値を直接的に得ることは容易でない。そこで、制御部160は、図26で説明したように、パラメタBの値を、1軸分散(式(3))、2軸分散(式(4))または3軸分散(式(5))の何れを用いるかに応じた計算式により簡易的に近似して求めている。すなわち、制御部160は、1軸分散、2軸分散または3軸分散の何れを用いるかに応じてバイセクションバンド幅を求めるための計算式を、3種類の計算式の中から選択する。こうして、演算方法に応じて適切なBの値を求めることができる。その結果、演算方法に応じて、適切に区分サイズを決定でき、FFT演算における省メモリ化、および、FFT演算の高速化を図れる。
図27は、第2の実施の形態のFFT演算の比較例を示す図である。図27では、第2の実施の形態の方法により、多重FFTをプロセス間で任意サイズに区分化して演算通信オーバーラップを行う場合を、太い黒枠で囲っている。それ以外の箇所は、比較例として、グローバル配列を単純に区分化した場合である。図27では、各場合について、分散軸、演算通信オーバーラップの有無、作業域サイズ、区分サイズ調整の制約の有無および区分サイズ調整の制約がある場合の制約の強弱、全プロセス数=NP時のメッセージ長の目安を例示している。なお、NSは区分回数(ローカル配列内の区分の数)である。
まず、図11,図12で示した区分化の方法によって、適切なサイズでの処理ブロック化を妨げていた区分サイズ調整の制限は緩和される(比較例の制限強に対し、第2の実施の形態では制限弱となる)。ただし、各次元方向の1本のFFT対象データサイズを単位とすることになるため、完全に任意ではない。これにより、区分サイズの調整が可能となり、演算効率および通信効率の両方を考慮して最適な区分サイズを設定できる。また、競合を避けたバッファ共用化により作業域サイズを小さくすることで、省メモリ化を図れる。更に、データアクセス範囲の局所性が高められる(例えば、L2キャッシュ内へのアクセスに収められる)ことで演算を高速化できる。
こうして、第2の実施の形態の並列計算機50によれば、分散並列型3次元FFT計算を行う際、ローカル配列を独立に処理可能な区分への分け方について制約が少ない方法を採用する。その上で、2つの処理流れが使用するバッファについて競合を避けつつ共用化することで、作業域配列として使用するメモリの削減を可能とし、かつ、キャッシュ利用効率が良くなることで高速にFFT計算を行えるようになる。また、演算と通信でトレードオフの関係がある性能挙動に対して性能見積もり式の利用を工夫することで、区分サイズを適切に設定可能となる。
特に、図11,図12の区分化方法を用いた上で、2つの処理流れを重ね合わせる(図19)。これにより、3次元FFT計算アルゴリズム上で課せられるデータ依存の順序関係を保つ条件や、利用バッファの競合回避の条件を満たした上で、省メモリでの演算通信オーバーラップを実現できる。
[第3の実施の形態]
以下、第3の実施の形態を説明する。前述の第2の実施の形態との相違する事項を主に説明し、共通する事項の説明を省略する。
第2の実施の形態では、入力データと同じ格納方式で出力データを格納する場合を例示した。一方、FFT正変換結果に要素毎の処理を加えた後で、FFT逆変換をした時にデータ並びが正しく配置されればよいケースもある。このため、出力データの配置を別途行って、通信量を削減することがある(すなわち、元のデータ並びに戻す通信を省略することがある)。そこで、第3の実施の形態では、元のデータ並びに戻す通信を省略する場合を例示する。
ここで、第3の実施の形態における並列計算機のハードウェアや機能などの各要素は、第2の実施の形態で例示した並列計算機50のハードウェアや機能などの各要素と同様である。そこで、第3の実施の形態における並列計算機の各要素を、第2の実施の形態と同じ名称および符号により指し示す。
図28は、第3の実施の形態のFFT正変換の処理流れの例を示す図である。計算ノード100は、連続する2つの区分データ(例えば、区分K1,K2の2つの区分データや区分K2,K3の2つの区分データなど)を2つの処理流れR1a,R2aによりオーバーラップして処理する。処理流れR1a,R2aそれぞれは、転置in、送信、受信、FFT、転置outの手順を順番に実行する。図18で例示した第2の実施の形態の処理流れR1,R2に対し、処理流れR1a,R2aでは、FFT計算後のall‐to‐all通信を略す点が異なっている。
図29は、第3の実施の形態の正変換の演算通信オーバーラップ例を示す図である。処理流れ実行部170は、2つの処理流れR1a,R2aに対して、3つの作業域A1,A2,A3を記憶部150に設ける。そして、2つの処理流れR1a,R2aそれぞれの処理を、作業域A1,A2,A3を用いて次のように実行する。ここで、図29では、図17で例示した区分化されたデータに対してZ方向のFFT(正変換)を実行する例を示す。図29の上側から下側へ向かう方向が時系列の正方向である。また、図29では、処理流れR1aに相当する処理を白抜きで、処理流れR2aに相当する処理を網掛けで図示している。更に、図29では、各作業域を用いた処理が行われない区間についてはハイフン記号“−”を付している。
第1のタイミングで、入出力処理部171は、区分K1をローカル配列から取り出して転置inの処理を実行し、作業域A1に格納する。
第2のタイミングで、通信処理部172は、作業域A1(送信バッファ)および作業域A2(受信バッファ)を用いて、all‐to‐all通信を実行する。また、第2のタイミングで、入出力処理部171aは、区分K2をローカル配列から取り出して転置inの処理を実行し、作業域A3に格納する。ここまでが以降に示すループに入るまでの前段の処理である。
第3のタイミングで、FFT処理部173は、作業域A2に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。また、入出力処理部171は、作業域A2に格納されたFFT演算結果を転置outの処理によりローカル配列の元の位置へ格納する。更に、入出力処理部171は、区分K3をローカル配列から取り出して転置inの処理を実行し、作業域A2に格納する。また、第3のタイミングで、通信処理部172aは、作業域A3(送信バッファ)および作業域A1(受信バッファ)を用いて、all‐to‐all通信を実行する。
第4のタイミングで、通信処理部172は、作業域A2(送信バッファ)および作業域A3(受信バッファ)を用いて、all‐to‐all通信を実行する。また、第4のタイミングで、FFT処理部173aは、作業域A1に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。また、入出力処理部171aは、作業域A1に格納されたFFT演算結果を転置outの処理によりローカル配列の元の位置へ格納する。更に、入出力処理部171aは、区分K4をローカル配列から取り出して転置inの処理を実行し、作業域A1に格納する。第3のタイミング〜第4のタイミングまでに示した手順でループ処理の1回目(ループ1)が完了する。
第5のタイミングで、FFT処理部173は、作業域A3に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。また、入出力処理部171は、作業域A3に格納されたFFT演算結果を転置outの処理によりローカル配列の元の位置へ格納する。更に、入出力処理部171は、区分K5をローカル配列から取り出して転置inの処理を実行し、作業域A3に格納する。また、第5のタイミングで、通信処理部172aは、作業域A1(送信バッファ)および作業域A2(受信バッファ)を用いて、all‐to‐all通信を実行する。
第6のタイミングで、通信処理部172は、作業域A3(送信バッファ)および作業域A1(受信バッファ)を用いて、all‐to‐all通信を実行する。また、第6のタイミングで、FFT処理部173aは、作業域A2に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。また、入出力処理部171aは、作業域A2に格納されたFFT演算結果を転置outの処理によりローカル配列の元の位置へ格納する。更に、入出力処理部171aは、区分K6をローカル配列から取り出して転置inの処理を実行し、作業域A2に格納する。第5のタイミング〜第6のタイミングまでに示した手順でループ処理の2回目(ループ2)が完了する。以降の説明はループの終端の手順となる。
第7のタイミングで、FFT処理部173は、作業域A1に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。また、入出力処理部171は、作業域A2に格納されたFFT演算結果を転置outの処理によりローカル配列の元の位置へ格納する(処理流れR1aが完了する)。また、第7のタイミングで、通信処理部172aは、作業域A2(送信バッファ)および作業域A3(受信バッファ)を用いて、all‐to‐all通信を実行する。
第8のタイミングで、FFT処理部173aは、作業域A3に格納されたall‐to‐all通信の結果に対してFFT演算を実行する。
第9のタイミングで、入出力処理部171aは、作業域A3に格納されたFFT演算結果を転置outの処理によりローカル配列の元の位置へ格納する(処理流れR2aが完了する)。
次に上記3つの作業域を用いて行われるFFT正変換処理の具体的な手順を説明する。まず、正変換の全体処理の手順を説明する。
図30は、第3の実施の形態の正変換の全体処理の例を示すフローチャートである。図30の手順は、図20で例示した第2の実施の形態のFFTの全体処理のフローチャートとほぼ同じである。ただし、前述のように、図30のフローチャートでは、元のデータ並びに戻す通信(図20のステップS22,S28)を省略する点が、図20のフローチャートと異なる。すなわち、第3の実施の形態では、処理流れ実行部170は、ステップS21の次にステップS23を実行する。また、処理流れ実行部170は、ステップS27の次にステップS29を実行する。なお、3次元FFTアルゴリズムのデータ依存関係の都合上、X次元方向のFFT計算については、戻し通信を省略していない(X方向については、第2の実施の形態と同様の手順で処理できる)。また、Y方向のFFT結果をローカル配列に格納する際には、Z方向のデータ並びを崩さないという条件が加わる。
次に、図30で例示したFFT正変換の全体処理における各軸方向のFFT計算の手順を説明する。以下では、Z方向に着目して説明するが、Y方向についても、Z方向と同様の手順により処理できる。
図31は、第3の実施の形態のZ方向正変換の例を示すフローチャートである。以下、図31に示す処理をステップ番号に沿って説明する。以下に示す手順は、図30のステップS24〜S29に相当する。処理流れR1aの処理を入出力処理部171、通信処理部172およびFFT処理部173により実行し、処理流れR2aの処理を入出力処理部171a、通信処理部172aおよびFFT処理部173aにより実行するものとする。
(S71)制御部160は、Z方向処理での区分サイズを決定する。
(S72)入出力処理部171は、ローカル配列Aの区分サイズのデータを送信バッファaに転置コピーする(転置in)。ここで、作業域A1,A2,A3は、バッファa,b,cの何れかに割り当てられる。初期状態では、バッファaは作業域A1に相当し、バッファbは作業域A2に相当し、バッファcは作業域A3に相当する。
(S73)通信処理部172は、all‐to‐all通信を行い、バッファbにデータを受信する。
(S74)入出力処理部171aは、ローカル配列Aの区分サイズのデータを送信バッファcに転置コピーする(転置in)。通信処理部172および入出力処理部171aは、ステップS73,S74を同期して実行開始する。なお、ステップS71〜S74までがループ前処理となる。
(S75)FFT処理部173は、受信バッファbのデータに対してFFT計算を行う。
(S76)通信処理部172aは、all‐to‐all通信を行い、バッファcからデータを送信し、バッファaによりデータを受信する。FFT処理部173および通信処理部172aは、ステップS75,S76を同期して実行開始する。
(S77)入出力処理部171は、バッファbのデータをローカル配列Aの元区分の位置に転置コピーする(転置out)。
(S78)入出力処理部171は、ローカル配列Aの区分サイズのデータを送信バッファbに転置コピーする(転置in)。
(S79)入出力処理部171,171aは、a,b,cに対するバッファ割当てをサイクリックに交換する。具体的には、バッファaに相当する作業域をバッファbに変える。バッファbに相当する作業域をバッファcに変える。バッファcに相当する作業域をバッファaに変える。
(S80)通信処理部172は、all‐to‐all通信を行い、バッファcからデータを送信し、バッファaによりデータを受信する。
(S81)FFT処理部173aは、受信バッファbのデータに対してFFT計算を行う。通信処理部172およびFFT処理部173aは、ステップS80,S81を同期して実行開始する。
(S82)入出力処理部171aは、バッファbのデータをローカル配列Aの元区分の位置に転置コピーする(転置out)。
(S83)入出力処理部171aは、ローカル配列Aの区分サイズのデータを送信バッファbに転置コピーする(転置in)。
(S84)入出力処理部171,171aは、a,b,cに対するバッファ割当てをサイクリックに交換する。具体的には、バッファaに相当する作業域をバッファbに変える。バッファbに相当する作業域をバッファcに変える。バッファcに相当する作業域をバッファaに変える。そして、未処理の区分データがなくなるまで、処理流れR1aの処理をステップS75へ進め、処理流れR2aの処理をステップS76へ進める。ローカル配列Aにおいて未処理の区分データがなくなると、処理をステップS85へ進める。
図32は、第3の実施の形態のZ方向正変換の例(続き)を示すフローチャートである。以下、図32に示す処理をステップ番号に沿って説明する。
(S85)FFT処理部173は、受信バッファbのデータに対してFFT計算を行う。
(S86)通信処理部172aは、all‐to‐all通信を行い、バッファcからデータを送信し、バッファaによりデータを受信する。FFT処理部173および通信処理部172aは、ステップS85,S86を同期して実行開始する。
(S87)入出力処理部171は、バッファbのデータをローカル配列Aの元区分の位置に転置コピーする(転置out)。これにより、処理流れR1aが完了する。
(S88)FFT処理部173aは、受信バッファaのデータに対してFFT計算を行う。
(S89)入出力処理部171aは、バッファaのデータをローカル配列Aの元区分の位置に転置コピーする(転置out)。これにより、処理流れR2aが完了する。なお、ステップS85〜S89までがループ終端処理となる。そして、Z方向のFFT計算処理が完了する。
次に、FFT逆変換時の処理を説明する。
図33は、第3の実施の形態のFFT逆変換の処理流れの例を示す図である。FFT逆変換時の2つの処理流れを、処理流れR1b,R2bとする。処理流れR1b,R2bそれぞれは、転置in、FFT、送信、受信、転置outの手順を順番に実行する。処理流れR1b,R2bにおけるFFT計算(逆変換)後のall‐to‐all通信により、ローカル配列AにおけるFFT正変換前の元のデータ並びに戻すことになる。
図34は、第3の実施の形態の逆変換の演算通信オーバーラップ例を示す図である。処理流れ実行部170は、2つの処理流れR1b,R2bに対して、3つの作業域A1,A2,A3を記憶部150に設ける。そして、2つの処理流れR1b,R2bそれぞれの処理を、作業域A1,A2,A3を用いて次のように実行する。ここで、図34では、図17で例示した区分化されたデータに対し図29のFFT正変換を行った結果を格納したローカル配列についてZ方向のFFT(逆変換)を実行する例を示す。図34の上側から下側へ向かう方向が時系列の正方向である。また、図34では、処理流れR1bに相当する処理を白抜きで、処理流れR2bに相当する処理を網掛けで図示している。更に、図34では、各作業域を用いた処理が行われない区間についてはハイフン記号“−”を付している。
第1のタイミングで、入出力処理部171は、区分K1をローカル配列から取り出して転置inの処理を実行し、作業域A1に格納する。また、FFT処理部173は、作業域A1に格納されたデータに対してFFT演算を実行する。
第2のタイミングで、通信処理部172は、作業域A1(送信バッファ)および作業域A2(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。また、第2のタイミングで、入出力処理部171aは、区分K2をローカル配列から取り出して転置inの処理を実行し、作業域A3に格納する。また、FFT処理部173aは、作業域A3に格納されたデータに対してFFT演算を実行する。ここまでが以降に示すループに入るまでの前段の処理である。
第3のタイミングで、入出力処理部171は、作業域A2に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部171は、区分K3をローカル配列から取り出して転置inの処理を実行し、作業域A2に格納する。更に、FFT処理部173は、作業域A2に格納されたデータに対してFFT演算を実行する。また、第3のタイミングで、通信処理部172aは、作業域A3(送信バッファ)および作業域A1(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。
第4のタイミングで、通信処理部172は、作業域A2(送信バッファ)および作業域A3(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。また、第4のタイミングで、入出力処理部171aは、作業域A1に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部171aは、区分K4をローカル配列から取り出して転置inの処理を実行し、作業域A1に格納する。更に、FFT処理部173aは、作業域A1に格納されたデータに対してFFT演算を実行する。第3のタイミング〜第4のタイミングまでに示した手順で1回目のループ処理が完了する。
第5のタイミングで、入出力処理部171は、作業域A3に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部171は、区分K5をローカル配列から取り出して転置inの処理を実行し、作業域A3に格納する。更に、FFT処理部173は、作業域A3に格納されたデータに対してFFT演算を実行する。また、第5のタイミングで、通信処理部172aは、作業域A1(送信バッファ)および作業域A2(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。
第6のタイミングで、通信処理部172は、作業域A3(送信バッファ)および作業域A1(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。また、第6のタイミングで、入出力処理部171aは、作業域A2に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部171aは、区分K6をローカル配列から取り出して転置inの処理を実行し、作業域A2に格納する。更に、FFT処理部173aは、作業域A2に格納されたデータに対してFFT演算を実行する。第5のタイミング〜第6のタイミングまでに示した手順で2回目のループ処理が完了する。以降の説明はループの終端の手順となる。
第7のタイミングで、入出力処理部171は、作業域A1に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する(処理流れR1bが完了する)。また、第7のタイミングで、通信処理部172aは、作業域A2(送信バッファ)および作業域A3(受信バッファ)を用いて、FFT演算結果のall‐to‐all通信を実行する。
第8のタイミングで、入出力処理部171aは、作業域A3に格納されたall‐to‐all通信の結果を転置outの処理によりローカル配列の元の位置へ格納する(処理流れR2bが完了する)。
次に上記3つの作業域を用いて行われるFFT逆変換処理の具体的な手順を説明する。まず、逆変換の全体処理の手順を説明する。
図35は、第3の実施の形態の逆変換の全体処理例を示すフローチャートである。以下、図35に示す処理をステップ番号に沿って説明する。
(S91)制御部160は、3次元FFT計算対象の入力データをローカル配列Aに準備する。
(S92)制御部160は、Z方向処理での区分サイズを決定する。区分サイズの決定方法は、図26で例示した第2の実施の形態の区分サイズの決定と同様の方法を用いることができる。
(S93)処理流れ実行部170は、ローカル配列Aの区分サイズのデータを送信バッファに転置コピーする(転置in)。
(S94)処理流れ実行部170は、受信バッファのデータに対してFFT計算(逆変換)を行う。
(S95)処理流れ実行部170は、Z方向プロセスグループでデータ配置を戻すall‐to‐all通信を行う。
(S96)処理流れ実行部170は、受信データをローカル配列Aの元区分の位置にコピーする(転置out)。処理流れ実行部170は、図34で例示したように2つの処理流れにより、ステップS93〜S96の手順を繰り返し実行する。そして、処理流れ実行部170は、Z方向のFFT処理が完了すると、処理をステップS97に進める。
(S97)制御部160は、Y方向処理での区分サイズを決定する。
(S98)処理流れ実行部170は、ローカル配列Aの区分サイズのデータを送信バッファに転置コピーする(転置in)。
(S99)処理流れ実行部170は、受信バッファのデータに対してFFT計算を行う。
(S100)処理流れ実行部170は、Y方向プロセスグループでデータ配置を戻すall‐to‐all通信を行う。
(S101)処理流れ実行部170は、受信データをローカル配列Aの元区分の位置に転置コピーする(転置out)。処理流れ実行部170は、図34で例示したように2つの処理流れにより、ステップS98〜S101の手順を繰り返し実行する。そして、処理流れ実行部170は、Y方向のFFT処理が完了すると、処理をステップS102に進める。
(S102)制御部160は、X方向処理での区分サイズを決定する。
(S103)処理流れ実行部170は、ローカル配列Aの区分サイズのデータを送信バッファにコピーする。
(S104)処理流れ実行部170は、X方向プロセスグループでall‐to‐all通信を行う。
(S105)処理流れ実行部170は、受信バッファのデータに対してFFT計算を行う。
(S106)処理流れ実行部170は、X方向プロセスグループでデータ配置を戻すall‐to‐all通信を行う。
(S107)処理流れ実行部170は、受信データをローカル配列Aの元区分の位置にコピーする。処理流れ実行部170は、図19で例示したように2つの処理流れにより、ステップS103〜S107の手順を繰り返し実行する。そして、処理流れ実行部170は、X方向のFFT処理が完了すると、処理を終了する。
次に、図35で例示したFFT逆変換の全体処理における各軸方向のFFT計算の手順を説明する。以下では、Z方向に着目して説明するが、Y方向についても、Z方向と同様の手順により処理できる。
図36は、第3の実施の形態のZ方向逆変換の例を示すフローチャートである。以下、図36に示す処理をステップ番号に沿って説明する。以下に示す手順は、図35のステップS92〜S96に相当する。処理流れR1bの処理を入出力処理部171、通信処理部172およびFFT処理部173により実行し、処理流れR2bの処理を入出力処理部171a、通信処理部172aおよびFFT処理部173aにより実行するものとする。
(S111)制御部160は、Z方向処理での区分サイズを決定する。
(S112)入出力処理部171は、ローカル配列Aの区分サイズのデータを送信バッファaに転置コピーする(転置in)。ここで、作業域A1,A2,A3は、バッファa,b,cの何れかに割り当てられる。初期状態では、バッファaは作業域A1に相当し、バッファbは作業域A2に相当し、バッファcは作業域A3に相当する。
(S113)FFT処理部173は、バッファaのデータに対してFFT計算を行う。
(S114)通信処理部172は、all‐to‐all通信を行い、バッファaからデータを送信し、バッファbによりデータを受信することでデータ配置を戻す。
(S115)入出力処理部171aは、ローカル配列Aの区分サイズのデータをバッファcに転置コピーする(転置in)。通信処理部172および入出力処理部171aは、ステップS114,S115を同期して実行開始する。
(S116)FFT処理部173aは、バッファcのデータに対してFFT計算を行う。
(S117)入出力処理部171は、受信したバッファbのデータをローカル配列Aの元区分の位置に転置コピーする(転置out)。
(S118)通信処理部172aは、all‐to‐all通信を行い、バッファcからデータを送信し、バッファaによりデータを受信することでデータ配置を戻す。入出力処理部171および通信処理部172aは、ステップS117,S118を同期して実行開始する。
(S119)入出力処理部171は、ローカル配列Aの区分サイズのデータをバッファbに転置コピーする(転置in)。
(S120)FFT処理部173は、バッファbのデータに対してFFT計算を行う。
(S121)入出力処理部171,171aは、a,b,cに対するバッファ割当てをサイクリックに交換する。具体的には、バッファaに相当する作業域をバッファbに変える。バッファbに相当する作業域をバッファcに変える。バッファcに相当する作業域をバッファaに変える。
(S122)通信処理部172は、all‐to‐all通信を行い、バッファcからデータを送信し、バッファaによりデータを受信することでデータ配置を戻す。
(S123)入出力処理部171aは、受信したバッファbのデータをローカル配列Aの元区分の位置に転置コピーする(転置out)。通信処理部172および入出力処理部171aは、ステップS122,S123を同期して実行開始する。
(S124)入出力処理部171aは、ローカル配列Aの区分サイズのデータをバッファbに転置コピーする(転置in)。
(S125)FFT処理部173aは、バッファbのデータに対してFFT計算を行う。
(S126)入出力処理部171,171aは、a,b,cに対するバッファ割当てをサイクリックに交換する。具体的には、バッファaに相当する作業域をバッファbに変える。バッファbに相当する作業域をバッファcに変える。バッファcに相当する作業域をバッファaに変える。そして、未処理の区分データがなくなるまで、処理流れR1bの処理をステップS117へ進め、処理流れR2bの処理をステップS118へ進める。ローカル配列Aにおいて未処理の区分データがなくなると、処理をステップS127へ進める。
図37は、第3の実施の形態のZ方向逆変換の例(続き)を示すフローチャートである。以下、図37に示す処理をステップ番号に沿って説明する。
(S127)入出力処理部171は、受信したバッファbのデータをローカル配列Aの元区分の位置に転置コピーする(転置out)。これにより、処理流れR1bが完了する。
(S128)通信処理部172aは、all‐to‐all通信を行い、バッファcからデータを送信し、バッファaによりデータを受信することでデータ配置を戻す。
(S129)入出力処理部171aは、受信したバッファaのデータをローカル配列Aの元区分の位置に転置コピーする(転置out)。これにより、処理流れR2bが完了する。なお、ステップS127〜S129までがループ終端処理となる。そして、Z方向のFFT計算処理(逆変換)が完了する。
このように、第3の実施の形態でも、第2の実施の形態と同様に、3つの作業域A1,A2,A3を用いて、2つの処理流れで利用バッファの競合が発生しないように制御しながら、通信と演算の並行処理を実現できる。
これにより、第3の実施の形態においても、第2の実施の形態と同様に、作業域配列として使用するメモリの削減を可能とし、かつ、キャッシュ利用効率を向上させて高速にFFT計算を行えるようになる。
なお、第1の実施の形態の情報処理は、演算部12にプログラムを実行させることで実現できる。また、第2,第3の実施の形態の情報処理は、CPU110,120にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体33に記録できる。計算ノード100,100a,100b,100c,・・・それぞれを、メモリとプロセッサとを有するコンピュータと考えることができる。
例えば、プログラムを記録した記録媒体33を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータ(例えば、データ格納サーバ300)に格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体33に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM130などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。