(57)【特許請求の範囲】
【請求項１】
第１記憶領域、第２記憶領域および第３記憶領域を有する記憶部と、
第１プロセスにより前記第１記憶領域を用いてＦＦＴ（Fast Fourier Transform）演算を実行している間に、第２プロセスにより前記第２記憶領域に格納された計算済みのＦＦＴ計算結果の他のプロセスへの送信、および、前記他のプロセスから受信したＦＦＴ演算結果の前記第３記憶領域への格納を実行し、前記第３記憶領域に格納された前記ＦＦＴ演算結果を前記第２プロセスにより所定の配列に出力する演算部と、を有し、
前記演算部は、
前記第１プロセスにより前記第１記憶領域を用いて前記ＦＦＴ演算を実行する前に、前記第１プロセスにより前記配列から取得したＦＦＴ演算対象の第１データを前記第３記憶領域に格納し、前記第２プロセスにより前記第２記憶領域を用いて前記ＦＦＴ演算を実行し、
前記第２プロセスによる当該ＦＦＴ演算の間に、前記第１プロセスにより、前記第３記憶領域に格納された前記第１データの前記他のプロセスへの送信、および、前記他のプロセスから受信したＦＦＴ演算対象の第２データの前記第１記憶領域への格納を実行する、
並列計算機。
【請求項２】
前記演算部は、前記第１プロセスにより、前記配列から前記第３記憶領域への前記第１データの入力を行うタイミングで、前記第２プロセスにより、前記第１記憶領域および前記第２記憶領域を用いて前記他のプロセスとの集団通信を実行し、前記第２プロセスにより、前記第３記憶領域から前記配列への前記ＦＦＴ演算結果の出力を行うタイミングで、前記第１プロセスにより、前記第１記憶領域および前記第２記憶領域を用いて前記他のプロセスとの集団通信を実行する、
請求項１記載の並列計算機。
【請求項３】
前記演算部は、前記記憶部として利用可能なキャッシュメモリの容量に応じてプロセス間の通信のメッセージ長を決定し、決定した前記メッセージ長に基づいて複数のプロセスそれぞれの処理対象のデータのサイズを決定する、
請求項１または２記載の並列計算機。
【請求項４】
前記演算部は、集団通信を行う複数のプロセスが動作する複数のノードの間の通信路におけるバイセクションバンド幅に基づいて、前記メッセージ長を決定する、
請求項３記載の並列計算機。
【請求項５】
前記演算部は、１軸分散、２軸分散または３軸分散の何れを用いるかに応じて前記バイセクションバンド幅を求めるための計算式を選択する、
請求項４記載の並列計算機。
【請求項６】
コンピュータに、
第１記憶領域、第２記憶領域および第３記憶領域を利用して、第１プロセスおよび第２プロセスそれぞれによりＦＦＴ演算を実行する際、前記第１プロセスにより前記第１記憶領域を用いて前記ＦＦＴ演算を実行している間に、前記第２プロセスにより前記第２記憶領域に格納された計算済みのＦＦＴ計算結果の他のプロセスへの送信、および、前記他のプロセスから受信したＦＦＴ演算結果の前記第３記憶領域への格納を実行し、前記第３記憶領域に格納された前記ＦＦＴ演算結果を前記第２プロセスにより所定の配列に出力し、
前記第１プロセスにより前記第１記憶領域を用いて前記ＦＦＴ演算を実行する前に、前記第１プロセスにより前記配列から取得したＦＦＴ演算対象の第１データを前記第３記憶領域に格納し、前記第２プロセスにより前記第２記憶領域を用いて前記ＦＦＴ演算を実行し、
前記第２プロセスによる当該ＦＦＴ演算の間に、前記第１プロセスにより、前記第３記憶領域に格納された前記第１データの前記他のプロセスへの送信、および、前記他のプロセスから受信したＦＦＴ演算対象の第２データの前記第１記憶領域への格納を実行する、
処理を実行させるＦＦＴ演算プログラム。
【請求項７】
コンピュータが、
第１記憶領域、第２記憶領域および第３記憶領域を利用して、第１プロセスおよび第２プロセスそれぞれによりＦＦＴ演算を実行する際、前記第１プロセスにより前記第１記憶領域を用いて前記ＦＦＴ演算を実行している間に、前記第２プロセスにより前記第２記憶領域に格納された計算済みのＦＦＴ計算結果の他のプロセスへの送信、および、前記他のプロセスから受信したＦＦＴ演算結果の前記第３記憶領域への格納を実行し、前記第３記憶領域に格納された前記ＦＦＴ演算結果を前記第２プロセスにより所定の配列に出力し、
前記第１プロセスにより前記第１記憶領域を用いて前記ＦＦＴ演算を実行する前に、前記第１プロセスにより前記配列から取得したＦＦＴ演算対象の第１データを前記第３記憶領域に格納し、前記第２プロセスにより前記第２記憶領域を用いて前記ＦＦＴ演算を実行し、
前記第２プロセスによる当該ＦＦＴ演算の間に、前記第１プロセスにより、前記第３記憶領域に格納された前記第１データの前記他のプロセスへの送信、および、前記他のプロセスから受信したＦＦＴ演算対象の第２データの前記第１記憶領域への格納を実行する、
ＦＦＴ演算方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は並列計算機、ＦＦＴ演算プログラムおよびＦＦＴ演算方法に関する。
【背景技術】
【０００２】
科学技術分野で扱われる問題などの比較的大規模な計算を行う並列計算機が利用されている。例えば、並列計算機は、多数のプロセッサを用いて並列に計算を行い得る。各プロセッサ上で動作する各プロセスが、プロセス間で数値データを通信しながら全体的な計算処理を実行することで、高い演算性能を実現し得る。
【０００３】
科学技術計算で対象とする物理的問題は様々であっても、計算機内で行われる数値計算処理としては、共通の問題形式に帰着され得る。例えば、物理的問題を扱うために、高速フーリエ変換（ＦＦＴ：Fast Fourier Transform）と呼ばれる演算が利用されることがある。ＦＦＴは、分子動力学法における遠隔静電場ポテンシャル計算や銀河生成シミュレーションを行ったり、気象予測、流体解析、構造解析などの基礎方程式を解いたりする際など、種々の分野に応用され得る。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平９−１５３０２９号公報
【特許文献２】特開２００５−１８９９７０号公報
【特許文献３】特開２００４−３４８４９３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ＦＦＴ演算を行う際、並列計算機では、入力データを複数のデータに分割し、複数のプロセッサを並列に用いてＦＦＴ演算を分散実行する。各プロセッサは互いに通信しながら、全体として入力データに対するＦＦＴ演算の結果を生成する。ここで、プロセッサは、分割された複数のデータそれぞれの入力に対してＦＦＴ演算とデータの通信とを交互に繰り返し実行する。しかし、ＦＦＴ演算と通信の繰り返し処理を効率的に実施する有効な方法が考えられていない。そのため、入力データに対するＦＦＴ演算が十分に高速化されているとは言えない。
【０００６】
１つの側面では、本発明は、ＦＦＴ演算を高速化することを目的とする。
【課題を解決するための手段】
【０００７】
１つの態様では、並列計算機が提供される。この並列計算機は、記憶部と演算部とを有する。記憶部は、第１記憶領域、第２記憶領域および第３記憶領域を有する。演算部は、第１プロセスにより第１記憶領域を用いてＦＦＴ演算を実行している間に、第２プロセスにより第２記憶領域に格納された計算済みのＦＦＴ計算結果の他のプロセスへの送信、および、他のプロセスから受信したＦＦＴ演算結果の第３記憶領域への格納を実行し、第３記憶領域に格納されたＦＦＴ演算結果を第２プロセスにより所定の配列に出力する。演算部は、第１プロセスにより第１記憶領域を用いてＦＦＴ演算を実行する前に、第１プロセスにより配列から取得したＦＦＴ演算対象の第１データを第３記憶領域に格納し、第２プロセスにより第２記憶領域を用いてＦＦＴ演算を実行し、第２プロセスによる当該ＦＦＴ演算の間に、第１プロセスにより、第３記憶領域に格納された第１データの他のプロセスへの送信、および、他のプロセスから受信したＦＦＴ演算対象の第２データの第１記憶領域への格納を実行する。
【発明の効果】
【０００８】
１つの側面では、ＦＦＴ演算を高速化できる。
【図面の簡単な説明】
【０００９】
【図１】第１の実施の形態の並列計算機を示す図である。
【図２】Ｚ方向のＦＦＴ演算と通信のオーバーラップの例を示す図である。
【図３】第２の実施の形態の並列計算機の例を示す図である。
【図４】計算ノードのハードウェア例を示す図である。
【図５】ネットワークの例を示す図である。
【図６】データ格納サーバのハードウェア例を示す図である。
【図７】１軸分散の例を示す図である。
【図８】２軸分散の例を示す図である。
【図９】３軸分散の例を示す図である。
【図１０】１つのＺ方向プロセスグループの保持データの例を示す図である。
【図１１】各プロセスの担当データ（第１区分）の例を示す図である。
【図１２】各プロセスの担当データ（第２区分）の例を示す図である。
【図１３】通信処理単位サイズと通信性能の関係の例を示す図である。
【図１４】複素行列ベクトル積での問題サイズと演算性能の例を示す図である。
【図１５】２次元ＦＦＴでの問題サイズと演算性能の例を示す図である。
【図１６】計算ノードの機能例を示す図である。
【図１７】区分化の例を示す図である。
【図１８】第２の実施の形態の処理流れの例を示す図である。
【図１９】第２の実施の形態の演算通信オーバーラップの例を示す図である。
【図２０】第２の実施の形態のＦＦＴの全体処理の例を示すフローチャートである。
【図２１】プロセスに合わせて分割された入力データの例を示す図である。
【図２２】区分的な転置コピーとプロセス間通信の例を示す図である。
【図２３】区分的な転置コピーとプロセス間通信の例（続き）を示す図である。
【図２４】第２の実施の形態のＺ方向ＦＦＴ計算の例を示すフローチャートである。
【図２５】第２の実施の形態のＺ方向ＦＦＴ計算の例（続き）を示すフローチャートである。
【図２６】第２の実施の形態の区分サイズ決定の例を示すフローチャートである。
【図２７】第２の実施の形態のＦＦＴ演算の比較例を示す図である。
【図２８】第３の実施の形態のＦＦＴ正変換の処理流れの例を示す図である。
【図２９】第３の実施の形態の正変換の演算通信オーバーラップ例を示す図である。
【図３０】第３の実施の形態の正変換の全体処理の例を示すフローチャートである。
【図３１】第３の実施の形態のＺ方向正変換の例を示すフローチャートである。
【図３２】第３の実施の形態のＺ方向正変換の例（続き）を示すフローチャートである。
【図３３】第３の実施の形態のＦＦＴ逆変換の処理流れの例を示す図である。
【図３４】第３の実施の形態の逆変換の演算通信オーバーラップ例を示す図である。
【図３５】第３の実施の形態の逆変換の全体処理例を示すフローチャートである。
【図３６】第３の実施の形態のＺ方向逆変換の例を示すフローチャートである。
【図３７】第３の実施の形態のＺ方向逆変換の例（続き）を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の並列計算機を示す図である。並列計算機１は、複数のノードを有し、各ノードを用いて演算処理を並列に実行する。並列計算機１は、３次元のＦＦＴ演算を高速に処理する機能を提供する。ここで、複数のノードは、ノード１０，１０ａ，１０ｂを含む（更に多数のノードを含み得る）。ノード１０は、記憶部１１および演算部１２を含む。
【００１１】
記憶部１１は、キャッシュメモリやＲＡＭ（Random Access Memory）などの記憶装置である。演算部１２は、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）などを含み得る。演算部１２はプログラムを実行するプロセッサであってもよい。「プロセッサ」は、複数のプロセッサの集合（マルチプロセッサ）も含み得る。他のノードもノード１０と同様に、記憶部および演算部を含む。演算部１２は、演算処理をプロセスと呼ばれる単位で管理し得る。演算部１２は、ノード１０において複数のプロセスを起動できる。
【００１２】
並列計算機１は、ＦＦＴ演算の対象とする入力データを複数に分割して、各ノードに入力する。入力データは、例えば３次元の配列で表される。３次元は、Ｘ軸、Ｙ軸、Ｚ軸の３つの軸で表される。例えば、ノード１０には、入力データを分割したうちの１つである配列Ａが入力される。ノード１０は、配列Ａの軸毎にＦＦＴ演算を実行する。例えば、Ｘ軸、Ｙ軸、Ｚ軸の順に実行する場合、Ｙ軸に関してＦＦＴ演算を実行する場合はＸ軸に関するＦＦＴ演算結果を用いることになり、Ｚ軸に関してＦＦＴ演算を実行する場合はＸ，Ｙ軸に関するＦＦＴ演算結果を用いることになる。ある軸に対して入力データが分割されている場合、該当の軸に関して各ノード上のプロセスで並行してＦＦＴ演算を行えるよう各プロセスは通信し、保持データを組み替える。並列計算機１が実行するＦＦＴ演算の処理の流れは次の通りである。
【００１３】
（１）演算部１２は、配列ＡのうちＦＦＴ処理対象である軸方向の一部の情報を転置して送信バッファに格納する（転置ｉｎ処理）。（２）演算部１２は、送信バッファに格納されたデータを他のプロセス（他のノード上のプロセスでもよい）に送信する（第１送信処理）。（３）演算部１２は、他のプロセスからデータを受信し、受信バッファに格納する（組み替え後のデータを受信バッファに格納する）（第１受信処理）。（２）、（３）の通信処理は、並列計算機１における各プロセス間（ある軸方向のＦＦＴ演算を行う１つのプロセスグループに属するプロセス間）で同期して実行される。第１送信処理および第１受信処理は、プロセス間のａｌｌ‐ｔｏ‐ａｌｌ通信あるいは集団通信と呼ばれることもある。
【００１４】
次いで、（４）演算部１２は、組み替え後のデータに対してＦＦＴ演算を実行する（ＦＦＴ演算処理）。（５）演算部１２は、ＦＦＴ演算後のデータを他のプロセスに送信する（第２送信処理）。（６）演算部１２は、ＦＦＴ演算後のデータを他のプロセスから受信し、受信バッファに格納する（元の順序に組み替え後のデータを受信バッファに格納する）（第２受信処理）。第２送信処理および第２受信処理は、プロセス間のａｌｌ‐ｔｏ‐ａｌｌ通信と呼ばれることがある。（７）演算部１２は、受信バッファのデータを転置して元の配列Ａに格納する（転置ｏｕｔ処理）。
【００１５】
演算部１２は、配列Ａを更に細かく区分化した複数の区分データに対して、上記（１）〜（７）の処理の流れ（ストリーム）を２つ並行して実行する。１つ目の処理の流れを「処理流れＲ１」とする。２つ目の処理の流れを「処理流れＲ２」とする。例えば、処理流れＲ１，Ｒ２それぞれは異なるプロセスによって実行され得る。処理流れＲ１，Ｒ２それぞれは、あるプロセスにおける異なるスレッドによって実行されると考えてもよい。
【００１６】
記憶部１１は、第１記憶領域１１ａ、第２記憶領域１１ｂおよび第３記憶領域１１ｃを有する。第１記憶領域１１ａ、第２記憶領域１１ｂおよび第３記憶領域１１ｃは、上記（１）〜（７）の一連の手順を実行するための作業領域である。第１記憶領域１１ａ，第２記憶領域１１ｂおよび第３記憶領域１１ｃのサイズとしては、区分データのサイズ分が確保されていればよい。すなわち、第１記憶領域１１ａ，第２記憶領域１１ｂおよび第３記憶領域１１ｃの合計サイズは、区分データの３倍程度のサイズとなる。
【００１７】
処理流れＲ１，Ｒ２それぞれは、配列Ａを区分化した複数の区分データそれぞれに対するＦＦＴ演算の一連の手順に相当する。例えば、配列Ａは、ＦＦＴ演算対象の軸における処理位置の小さい方（例えば、座標の小さい方）から順に所定サイズに区分化される。処理位置の小さい方から順に、第１区分データ、第２区分データ、第３区分データ、・・・と呼ぶことにする。すると、例えば、処理流れＲ１により第１区分データが処理され、処理流れＲ２により第２区分データが処理され、処理流れＲ１により第３区分データが処理され、・・・というように、順にＦＦＴ演算が実行される。この例の場合、奇数番目の区分データが処理流れＲ１に、偶数番目の区分データが処理流れＲ２により処理されることになる。
【００１８】
演算部１２は、第１記憶領域１１ａ、第２記憶領域１１ｂおよび第３記憶領域１１ｃを次のように使用することで、処理流れＲ１，Ｒ２におけるＦＦＴ演算とプロセス間通信とをオーバーラップして実行する。ここで、図１では、第１記憶領域１１ａ、第２記憶領域１１ｂおよび第３記憶領域１１ｃの用途を、図の上側から下側へ向かう時系列に沿って図示している（なお、記憶領域が何れの処理用途にも用いられない期間には、ハイフン記号“−”を付している）。
【００１９】
まず、演算部１２は、処理流れＲ１の転置ｉｎ処理では、第１区分データを転置して第１記憶領域１１ａに格納する。
次に、処理流れＲ１の第１送信処理では第１記憶領域１１ａを送信バッファとして、第１区分データを他のプロセスへ送信する。このとき、処理流れＲ１の第１受信処理では、他のプロセスによる第１送信処理で送られた区分データを受信して、第２記憶領域１１ｂ（受信バッファとして使用）に格納する。
【００２０】
そして、処理流れＲ１のＦＦＴ演算処理では、第２記憶領域１１ｂに格納されたデータに対してＦＦＴ演算を実行する。
処理流れＲ１の第２送信処理では、第２記憶領域１１ｂに格納されたＦＦＴ演算の結果を他のプロセスに送信する（第２記憶領域１１ｂを送信バッファとして使用）。このとき、処理流れＲ１の第２受信処理では他のプロセスによる第２送信処理で送られたＦＦＴ演算後の区分データを受信して、第３記憶領域（受信バッファとして使用）に格納する。更にこのとき、演算部１２は、第１記憶領域１１ａを用いて、第２区分データに対する処理流れＲ２の転置ｉｎ処理を実行する。すなわち、当該処理流れＲ２の転置ｉｎ処理では、第２区分データを転置して、第１記憶領域１１ａに格納する。
【００２１】
以後、演算部１２は、処理流れＲ１，Ｒ２それぞれに対して、以降の手順を繰り返し実行する。
処理流れＲ１では第３記憶領域１１ｃを用いて、第１区分データに対する転置ｏｕｔ処理を実行し、その後、第３区分データに対する転置ｉｎ処理を実行する。このとき、処理流れＲ２では、第１記憶領域１１ａ（送信バッファ）および第２記憶領域１１ｂ（受信バッファ）を用いて、第１送信処理および第１受信処理を実行する。
【００２２】
次に、処理流れＲ１では、第３記憶領域１１ｃ（送信バッファ）および第１記憶領域１１ａを用いて、第１送信処理および第１受信処理を実行する。このとき、処理流れＲ２では、第２記憶領域１１ｂを用いてＦＦＴ演算処理を実行する。
【００２３】
次に、処理流れＲ１では、第１記憶領域１１ａを用いてＦＦＴ演算処理を実行する。このとき、処理流れＲ２では、第２記憶領域１１ｂ（送信バッファ）および第３記憶領域１１ｃ（受信バッファ）を用いて、第２送信処理および第２受信処理を実行する。
【００２４】
次に、処理流れＲ１では、第１記憶領域１１ａ（送信バッファ）および第２記憶領域１１ｂ（受信バッファ）を用いて、第２送信処理および第２受信処理を実行する。このとき、処理流れＲ２では、第３記憶領域１１ｃを用いて、第２区分データに対する転置ｏｕｔ処理を実行し、その後、第４区分データに対する転置ｉｎ処理を実行する。このように、処理流れＲ１，Ｒ２は、第１記憶領域１１ａ，第２記憶領域１１ｂおよび第３記憶領域１１ｃの用途を切り替えながら、配列Ａの区分データに対するＦＦＴ演算を順番に実行していく。こうして、作業用の記憶領域を、第１記憶領域１１ａ，第２記憶領域１１ｂおよび第３記憶領域１１ｃに制限しながら、２つの処理流れのＦＦＴ演算と通信とをオーバーラップさせ、ＦＦＴ演算を高速化することができる。１つの具体例として、Ｚ方向のＦＦＴ演算と通信のオーバーラップを説明する（ただし、Ｘ方向、Ｙ方向も同様の説明となる）。
【００２５】
図２は、Ｚ方向のＦＦＴ演算と通信のオーバーラップの例を示す図である。例えば、３次元配列の入力データを分割したうちの一部である３次元の配列ａ１，ａ２，ａ３が、それぞれノード１０，１０ａ，１０ｂに入力される。例えば、ノード１０，１０ａ，１０ｂそれぞれで動作するプロセス同士が同期して、複数本の処理流れＲ１をそれぞれのノード上で実行し、他の一部のプロセス同士が同期して、複数本の処理流れＲ２をそれぞれのノード上で実行し得る。例えば、ノード１０の１つのプロセスが配列ａ１を担当する。図２では、あるタイミングにおける記憶部１１の３つの記憶領域（第１記憶領域１１ａ、第２記憶領域１１ｂおよび第３記憶領域１１ｃ）の用途も図示されている。具体的には、配列ａ１のある区分データに対して処理流れＲ１のＦＦＴ演算用バッファが設けられている。また、配列ａ１の当該区分データに後続する区分データに対して、処理流れＲ２の送信バッファと受信バッファとが設けられている。このように、処理流れＲ１でＦＦＴ演算を実行している最中に、処理流れＲ２におけるａｌｌ‐ｔｏ‐ａｌｌ通信をオーバーラップして（重複して）実行することができる。
【００２６】
次のタイミングでは、記憶部１１の送信バッファは、処理流れＲ１の第２受信処理の受信バッファに切り替わる。また、記憶部１１の受信バッファは、処理流れＲ２のＦＦＴ演算用バッファに切り替わる。更に、記憶部１１のＦＦＴ演算用バッファは、処理流れＲ１の第２送信処理の送信バッファに切り替わる。次のタイミングでも、処理流れＲ２でＦＦＴ演算を実行している最中に、処理流れＲ１におけるａｌｌ‐ｔｏ‐ａｌｌ通信をオーバーラップして実行することができる。
【００２７】
すなわち、演算部１２は、第１プロセスにより第１記憶領域を用いてＦＦＴ演算を実行している間に、第２プロセスにより第２記憶領域に格納された計算済みのＦＦＴ計算結果の他のプロセスへの送信、および、他のプロセスから受信したＦＦＴ演算結果の第３記憶領域への格納を実行する。こうして、ある処理流れに対してＦＦＴ演算を行いつつ、別の処理流れでプロセス間の集団通信を行い、ＦＦＴ演算結果の組み替えを行えるようになり、ＦＦＴ演算を高速化できる。
【００２８】
また、３つの記憶領域の用途（送信バッファ、受信バッファおよびＦＦＴ演算用など）を切り替えながら処理を行うことで、メモリ消費量を抑えられる。例えば、前述のように、各記憶領域のサイズは、区分データのサイズに応じて定めることができる。このため、３つの記憶領域が、例えばＬ２（Level 2）キャッシュに収まる程度に区分データのサイズを決定することで、省メモリ化を図りながら、演算を高速化できる。
【００２９】
次に、大規模な科学技術計算に用いられる並列計算機を例示して、上記のＦＦＴ演算の高速化の手法をより詳細に説明する。
［第２の実施の形態］
図３は、第２の実施の形態の並列計算機の例を示す図である。第２の実施の形態の並列計算機５０は、計算ノード１００，１００ａ，１００ｂ，１００ｃ，・・・および管理ノード２００を含む。計算ノード１００，１００ａ，１００ｂ，１００ｃ，・・・および管理ノード２００は、ネットワーク５１に接続されている。ネットワーク５１は、ＭｅｓｈやＴｏｒｕｓなどの直接網でもよい。あるいは、ネットワーク５１は、通信スイッチを介して接続されるＦａｔ−ｔｒｅｅやｃｒｏｓｓ−ｂａｒなどの間接網でもよい。並列計算機５０は、複数のノードを用いて、各種の演算を並列に実行する。並列計算機５０は、スーパーコンピュータシステムまたはＨＰＣ（High Performance Computing）システムなどと呼ばれてもよい。
【００３０】
計算ノード１００，１００ａ，１００ｂ，１００ｃ，・・・それぞれは、１つまたは複数のＣＰＵを有し、各ＣＰＵによりメモリを共有する処理機構の単位である。
管理ノード２００は、計算ノード１００，１００ａ，１００ｂ，１００ｃ，・・・に実行させるジョブを管理する。例えば、管理ノード２００は、ユーザによるジョブの実行を受け付け、計算ノード１００，１００ａ，１００ｂ，１００ｃ，・・・に対するジョブの投入を行う。また、管理ノード２００は、計算ノード１００，１００ａ，１００ｂ，１００ｃ，・・・に実行させるプログラムの計算ノード１００，１００ａ，１００ｂ，１００ｃ，・・・への配置も行う。
【００３１】
管理ノード２００は、ネットワーク３０にも接続されている。ネットワーク３０は、ＬＡＮ（Local Area Network）でもよいし、ＷＡＮ（Wide Area Network）やインターネットなどでもよい。管理ノード２００は、ネットワーク３０に接続されたデータ格納サーバ３００から、各計算ノードに実行させるプログラムや、各計算ノードの処理に用いられるデータを取得し、各計算ノードに提供することもできる。データ格納サーバ３００は、プログラムやデータを配布するサーバコンピュータである。
【００３２】
図４は、計算ノードのハードウェア例を示す図である。計算ノード１００は、ＣＰＵ１１０，１２０、ＲＡＭ１３０および通信インタフェース１４０を有する。各ユニットは計算ノード１００のバスに接続されている。計算ノード１００ａ，１００ｂ，１００ｃ，・・・および管理ノード２００も計算ノード１００と同様のユニットを用いて実現できる。
【００３３】
ＣＰＵ１１０は、計算ノード１００の情報処理を制御する。ＣＰＵ１１０は、キャッシュ１１１、制御コア１１２および計算コア１１３，１１４，１１５，１１６，１１７を有する。
【００３４】
キャッシュ１１１は、制御コア１１２および計算コア１１３，１１４，１１５，１１６，１１７の処理に使用されるキャッシュメモリである。キャッシュ１１１は、例えば、Ｌ１（Level 1）キャッシュやＬ２キャッシュなどのように階層化される。
【００３５】
制御コア１１２は、プロセス間通信を担当する制御用のコアである。計算コア１１３，１１４，１１５，１１６，１１７は、ＦＦＴ演算を実行する演算用のコアである。
ＣＰＵ１２０もＣＰＵ１１０と同様に、キャッシュ１２１、制御コア１２２および計算コア１２３，１２４，１２５，１２６，１２７を有する。
【００３６】
ＲＡＭ１３０は、計算ノード１００の主記憶装置である。ＲＡＭ１３０は、ＣＰＵ１１０，１２０によって共有される共有メモリである。ＲＡＭ１３０は、ＣＰＵ１１０，１２０に実行させるプログラムの少なくとも一部を一時的に記憶する。ＲＡＭ１３０は、ＣＰＵ１１０，１２０による処理に用いられる各種データを記憶する。
【００３７】
通信インタフェース１４０は、ネットワーク５１を介して他のノードと通信を行う。
図５は、ネットワークの例を示す図である。ネットワーク５１は、例えば、Ｔｏｆｕ（登録商標）と呼ばれる６次元メッシュ／トーラスの直接網として実現される。Ｔｏｆｕでは、１２個の計算ノードを１ユニット（３次元トーラスユニット）とし、各ユニットを３次元トーラス構造で接続する。Ｔｏｆｕでは、３次元プロセス形状を適切なノードに対応させることにより、各軸方向の通信データの輻輳が発生しにくいため、後述するＦＦＴ演算における多軸分散方式との適合性が高い。
【００３８】
図６は、データ格納サーバのハードウェア例を示す図である。データ格納サーバ３００は、プロセッサ３０１、ＲＡＭ３０２、ＨＤＤ（Hard Disk Drive）３０３、画像信号処理部３０４、入力信号処理部３０５、媒体リーダ３０６および通信インタフェース３０７を有する。各ユニットはデータ格納サーバ３００のバスに接続されている。
【００３９】
プロセッサ３０１は、データ格納サーバ３００の情報処理を制御する。プロセッサ３０１は、マルチプロセッサであってもよい。プロセッサ３０１は、例えばＣＰＵ、ＤＳＰ、ＡＳＩＣまたはＦＰＧＡなどである。プロセッサ３０１は、ＣＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡなどのうちの２以上の要素の組み合わせであってもよい。
【００４０】
ＲＡＭ３０２は、データ格納サーバ３００の主記憶装置である。ＲＡＭ３０２は、プロセッサ３０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ３０２は、プロセッサ３０１による処理に用いる各種データを記憶する。
【００４１】
ＨＤＤ３０３は、データ格納サーバ３００の補助記憶装置である。ＨＤＤ３０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ３０３は、ＯＳのプログラム、アプリケーションプログラム、および各種データを記憶する。データ格納サーバ３００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００４２】
画像信号処理部３０４は、プロセッサ３０１からの命令に従って、データ格納サーバ３００に接続されたディスプレイ３１に画像を出力する。ディスプレイ３１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００４３】
入力信号処理部３０５は、データ格納サーバ３００に接続された入力デバイス３２から入力信号を取得し、プロセッサ３０１に出力する。入力デバイス３２としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００４４】
媒体リーダ３０６は、記録媒体３３に記録されたプログラムやデータを読み取る装置である。記録媒体３３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体３３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ３０６は、例えば、プロセッサ３０１からの命令に従って、記録媒体３３から読み取ったプログラムやデータをＲＡＭ３０２またはＨＤＤ３０３に格納する。
【００４５】
通信インタフェース３０７は、ネットワーク３０を介して他の装置（例えば、管理ノード２００）と通信を行う。通信インタフェース３０７は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【００４６】
ここで、ＦＦＴ演算の一般的な処理方法について説明する。まず、ＦＦＴ演算の分類として、データの分散という観点での分類が考えられる。データの分散という観点での分類とは、３次元形状のＦＦＴ計算対象の入力データ全体を１つの仮想的グローバル配列（以下、単にグローバル配列という）とみなし、グローバル配列を、複数プロセスにあるローカル配列にどのように分配するかという観点での分類である。具体的には、１軸分散（板状分散）、２軸分散（柱状分散）、３軸分散という分類がある。１軸分散は、slab decompositionとも呼ばれる。２軸分散は、pencil-wiseまたはcolumn-wise decompositionとも呼ばれる。３軸分散は、volumetric decompositionとも呼ばれる。分割軸を増やすことで、プロセス数の増大に対応しやすくなる。このため、多次元直接網の通信ネットワークが採用される場合には、通信トポロジ形状とデータ分散形状を整合させやすいなどの理由から、近年は２軸または３軸分散方式が利用される傾向にある。
【００４７】
以降の説明では、３次元ＦＦＴ計算対象であるグローバル配列のサイズをＮ１，Ｎ２，Ｎ３とし、各軸方向の分割数をそれぞれＰ１，Ｐ２，Ｐ３とする。ここで、Ｎ１は、グローバル配列のＸ軸方向のデータ要素数である。Ｎ２は、グローバル配列のＹ軸方向のデータ要素数である。Ｎ３は、グローバル配列のＺ軸方向のデータ要素数である。また、Ｐ１は、Ｘ軸方向の分割数である。Ｐ２は、Ｙ軸方向の分割数である。Ｐ３は、Ｚ軸方向の分割数である。
【００４８】
グローバル配列を分割したローカル配列のサイズをＮ１Ｐ，Ｎ２Ｐ，Ｎ３Ｐとして示す。Ｎ１Ｐは、ローカル配列のＸ軸方向のデータ要素数である。Ｎ２Ｐは、ローカル配列のＹ軸方向のデータ要素数である。Ｎ３Ｐは、ローカル配列のＺ軸方向のデータ要素数である。そして、自然数ＮをＰで割った時の余りがゼロで割り切れることをｍｏｄ（Ｎ，Ｐ）＝０と表記する。
【００４９】
更に、Ｘ，Ｙ，Ｚ軸の順にメモリ上で連続にデータが格納されているものとする。３次元ＦＦＴ計算では、Ｘ，Ｙ，Ｚ方向それぞれのＦＦＴを行う。このとき、各方向のＦＦＴを行う際に、一旦、処理対象の方向のデータをプロセス間の通信により１つのプロセス内に集めて計算を行うことになる。Ｘ，Ｙ，Ｚ方向の計算は、任意の順序で行える。
【００５０】
図７は、１軸分散の例を示す図である。図７では、Ｎ１×Ｎ２×Ｎ３のサイズのグローバル配列を、４つのプロセスに割り当てる例を示している。例えば、まず、Ｙ，Ｚ方向のＦＦＴに関してプロセス内のデータを対象としている条件下では、通信を行わずに処理できる。分割格納されたＸ方向のＦＦＴに関してはプロセス間でＭＰＩ（Message Passing Interface）におけるａｌｌ‐ｔｏ‐ａｌｌ通信と呼ばれる集団通信を行い、Ｘ方向のＦＦＴ対象データをプロセス内に集める。こうして、各プロセスにおいて、Ｘ方向のＦＦＴ演算を並列に行える。入力データの分散方法と同じＸ方向に分割したデータ配置に戻すためには同じａｌｌ‐ｔｏ‐ａｌｌ通信を行う（ただし、後述するように戻す通信を省略する場合もある）。
【００５１】
ここで、ＦＦＴ演算に要するバッファ領域および通信演算オーバーラップ化について検討する。通信を行うには、送信バッファと受信バッファと呼ばれる作業領域をメモリ上に設けることになる。通常のアルゴリズムのままの場合、入力データが格納されたローカル配列をそのまま送信バッファとして利用するとして、送信バッファと同じサイズの受信バッファを用いることになる。Ｙ，Ｚ方向のＦＦＴ計算と１回の集団通信（ａｌｌ‐ｔｏ‐ａｌｌ通信）とＸ方向のＦＦＴ計算の順にデータ依存関係があるので、通信と計算とを同時に進めることはできない。通信および演算する範囲をＺ方向に小直方体形状に区分化することで、通信と演算とのオーバーラップ化が可能となる。Ｚ方向のＦＦＴ処理は全体に対して行っておき、Ｙ方向ＦＦＴについては部分的に先行して行い、部分的処理が済んだ範囲のデータに対して通信を行い、Ｘ方向のＦＦＴデータをプロセス内に集める。当該通信と同時に、次のＹ方向ＦＦＴの部分的処理を進めれば、通信演算オーバーラップを行える。あるいは、次の区分の通信時に先行部分のＸ方向ＦＦＴを進めることでの通信演算オーバーラップも可能である。Ｘ方向ＦＦＴまで完了したデータを保持しておくことになるため、入力データが格納されたローカル配列と同じサイズの別配列に出力するのが１つの方法として考えられる。
【００５２】
１軸分散の問題の一つは、問題規模がＮ＾３ならＮノード以上あってもデータを分配できないため並列台数効果が見込めない点である。Ｎの大きさとしては数千程度までが実際に利用される標準的なサイズであるのに対して、近年の大規模な並列計算機では数万ノードを擁する。また、直接網ネットワークとの適合性やメッセージ長による性能への影響もあり、複数軸での分割が望まれる傾向が強まっている。１軸分散では集団通信を行うプロセスグループが一つであるために１グループ内のプロセス数が多くなりメッセージ長が短くなる。このため、処理区分化による通信演算オーバーラップ方式の適用が、後述の２軸、３軸分散よりも不利である。また、上述の方法でＺ方向ＦＦＴ計算を通信と重ね合わせることはできない。
【００５３】
図８は、２軸分散の例を示す図である。図８では、４×３プロセス形状に対する２軸分散の例を示している。この方法ではグローバル配列を柱状にローカル配列に分割するデータ分散方式が用いられる。例えば、Ｘ方向に対して、まず各プロセスにより柱方向のＦＦＴ計算を行う（図８（Ａ））。次に、ＸＹ面に分けられたプロセスグループに属するプロセス間でａｌｌ‐ｔｏ‐ａｌｌ通信を行うことで、各プロセスでＹ方向に柱上に分割したデータ分散方式に持ち直して、Ｙ方向のＦＦＴ計算を行う（図８（Ｂ））。更に、ＹＺ面に分けられたプロセスグループに属するプロセス間でａｌｌ‐ｔｏ‐ａｌｌ通信を行うことで、各プロセスでＺ方向に柱上に分割したデータ分散方式に持ち直して、Ｚ方向のＦＦＴ計算を行う（図８（Ｃ））。この場合は、入力データがＸ方向の柱状分割であったのに対して出力データはＺ方向の柱状分割になる。出力データもＸ方向の柱状分割としたい場合には、並べ替えの通信を別途行うことになる。
【００５４】
２軸分散の場合のバッファ領域および通信演算オーバーラップ化について検討する。ａｌｌ‐ｔｏ‐ａｌｌ通信の効率的利用のためには、別プロセスに送信するデータ領域は連続した部分領域となっていることが求められる。このため、Ｙ，Ｚ方向ＦＦＴを行う前の通信においては、それぞれＹ，Ｚ方向が連続になるように並べ替えを行って送信バッファに格納してからａｌｌ‐ｔｏ‐ａｌｌ通信を行う関数に渡すことになる。また、一般には通信前後の配置でデータ数が割り切れる条件を満たしているとも限らないため、空き領域を加えて等分割化してａｌｌ‐ｔｏ‐ａｌｌ通信機能を用いることもある。この場合は入力データが格納されたローカル配列をそのまま送信バッファあるいは受信バッファとして利用できない。すなわち、通信演算オーバーラップのために各ローカル配列を小直方体形状に区分化したとして、バッファ領域は（データ配置を元に戻す通信を略さずにin-place化した条件の想定下で）少なくとも区分サイズの約４つ分（送信バッファと受信バッファがオーバーラップ処理のために２つずつ）必要となる。
【００５５】
図９は、３軸分散の例を示す図である。３軸分散では、グローバル配列を全ての方向に分割してローカル配列に格納するデータ分散方式が用いられる。３軸分散の場合、Ｘ，Ｙ，Ｚの何れの方向についてもＦＦＴ対象のデータが一つのプロセスに収まっていない。このため、各方向のＦＦＴ計算において通信を行うことになる。元のデータ配置に戻す通信を略さないならば、分散された各軸方向のＦＦＴ計算を行うことはどの方向でも同様の処理になるため、Ｚ次元方向のＦＦＴについて説明する。ここで、図９において、ランク番号は、トーラス空間上におけるプロセスの位置を示す番号である。
【００５６】
Ｚ次元方向の１つのプロセスグループのみを考えるならば、Ｚ次元方向に分散した１軸分散のＺ軸方向のＦＦＴ処理を行うことに相当する。ただし、ここでは１軸分散の例で示した板形状への単純分割よりも少し一般的な条件としておく。例えば、あるプロセスグループに属するＸＹ面で示されるＺ方向のＦＦＴ多重度を、Ｐ３個のプロセスで分配するという方式を採用する。その多重度はＮ１Ｐ×Ｎ２Ｐ＝（Ｎ１／Ｐ１）×（Ｎ２／Ｐ２）である。プロセス間での通信後にデータ要素数が不均一とならないように、以下の３つの制約条件が課せられている。１つ目の条件は、ｍｏｄ（Ｎ１Ｐ×Ｎ２Ｐ，Ｐ３）＝０である。２つ目の条件は、ｍｏｄ（Ｎ２Ｐ×Ｎ３Ｐ，Ｐ１）＝０である。３つ目の条件は、ｍｏｄ（Ｎ３Ｐ×Ｎ１Ｐ，Ｐ２）＝０である。
【００５７】
ここで、３軸分散の場合のバッファ領域および通信演算オーバーラップ化について検討する。まず、各次元方向のＦＦＴ処理が１軸分散の特定次元方向のＦＦＴ処理を行うことに相当しているといっても、前述の１軸分散での通信演算オーバーラップ化で説明した前段ＦＦＴ計算とのオーバーラップを適用することはできない。前段ＦＦＴ計算の手続き中においても通信が含まれるためである。更に、単純な直方体区分でない一般的条件下での通信および演算する範囲の区分化方法は、前述の１軸分散と比べて複雑になる。例えば、サイズが１００×６０×８０のグローバル配列に対して、２×２×５のプロセスグリッドで３軸分散ＦＦＴを行う模式的なケースを考える。Ｚ次元方向の１プロセスグループに注目すると、当該１プロセスグループに属する５つのプロセスを用いて、５０×３０×８０のローカル配列のデータに対し、Ｚ方向８０個の要素のＦＦＴを５０×３０＝１５００本の計算を行うことになる。通信演算オーバーラップ化のためには区分化が必要であり、例えば４区分とするならば、１区分あたりのＦＦＴ本数は１５００／４＝３７５本となり、１プロセスは３７５／５＝７５本を担当する。
【００５８】
図１０は、１つのＺ方向プロセスグループの保持データの例を示す図である。図１０では、Ｚ次元方向の１プロセスグループに属する５プロセスが処理する５０×３０×８０の形状のローカル配列の保持状況を色分けによって示している。図１０の例では、Ｚランク番号が大きいプロセスほど、Ｚ軸上の大きい値の位置に相当するデータを保持している。
【００５９】
図１１は、各プロセスの担当データ（第１区分）の例を示す図である。図１１では、ローカル配列を区分化した場合の初段処理でデータ移動した後の各プロセスの担当範囲を示している。該当部分のＺ方向ＦＦＴ計算を各プロセスが行うのと同時に、次の区分（第２区分）についての通信を開始することで、通信演算のオーバーラップが可能となる。
【００６０】
図１２は、各プロセスの担当データ（第２区分）の例を示す図である。図１１，図１２で例示した区分化を行うとして、ＦＦＴ計算に必要なバッファ領域は（データ配置を元に戻す通信を略さずにin-place化した条件の想定下で）少なくとも区分サイズの約４つ分（送信バッファと受信バッファがオーバーラップ処理のために２つずつ）である。
【００６１】
また、区分化しないで一度の集団通信でデータの持ち直しをする場合には前述の３つの制約条件が必要となっていた。一方、処理区分化を行う場合は割り切れない余り部分についてはバッファサイズより小さなデータに対する処理となるので、制約条件を課さないように実装することも容易になる。そこで、後述するように、並列計算機５０では、区分サイズに任意性をもたせ、必要なバッファ領域が区分サイズの約３つ分で済むよう演算通信のオーバーラップを効率化する機能を提供する。
【００６２】
なお、並列計算機５０において、上述の区分サイズ設定に任意性をもたせる理由は、データ通信機能や演算機能における処理効率の一般的な性能特性による。そこで、当該性能特性について、以下に説明する。
【００６３】
図１３は、通信処理単位サイズと通信性能の関係の例を示す図である。図１３では、プロセス間の通信処理単位となるメッセージ長とハードウェアピーク性能に対する通信効率比のグラフを例示している。ａｌｌ‐ｔｏ‐ａｌｌ通信においては、１プロセスあたりが持つ配列の区分サイズを、通信を行うプロセスグループに属するプロセス数で割った大きさがメッセージ長に相当する。
【００６４】
ａｌｌ‐ｔｏ‐ａｌｌ通信における通信時間は以下の式（１）により見積もれる。
【００６５】
【数１】
0006666548.tif 000002
ここで、Ｔは通信時間である。Ｌcollectiveは集団通信レイテンシである。Ｍはメッセージ長である。通信を行うプロセスグループに属するＰはプロセス数である。Ｂはバイセクションバンド幅（Bi-section Bandwidth）である。バイセクションバンド幅は、システム内の全計算ノードが最大限の通信を行った場合に、システム全体として達成可能な通信性能の下限を表す。αは実行通信性能を示す係数である。
【００６６】
集団通信レイテンシＬcollectiveは、式（２）によって評価される。
【００６７】
【数２】
0006666548.tif 000003
ここで、Ｌprepareは、通信規模によらない固定時間である。Ｌ（１対１）（数式では“１対１”を下付きで表している）は、プロセス数に比例した処理時間の係数である。ａｌｌ‐ｔｏ‐ａｌｌ通信では、自プロセス以外の各プロセスにメッセージを送るのでＬ（１対１）に（Ｐ−１）を乗じる。
【００６８】
式（１）にＬprepare＝５０マイクロ秒、Ｌ（１対１）＝０．５マイクロ秒、α＝０．６程度とすることで図１３の実測値と合う。ここで、区分化サイズを小さくするとメッセージ長は短くなり通信効率が落ちる。また、メッセージ長がおよそ１００ＫＢ程度あれば、それ以上に大きくしても通信効率の向上への寄与は小さい。
【００６９】
次に、ローカル配列のサイズと演算性能との関係を例示する。
図１４は、複素行列ベクトル積での問題サイズと演算性能の例を示す図である。ここで、問題サイズは、１つのプロセスに対して割り当てられるローカル配列のサイズに相当する（次に示す図１５も同様）。
【００７０】
図１５は、２次元ＦＦＴでの問題サイズと演算性能の例を示す図である。図１４，図１５の例の何れの場合も問題サイズがＬ２キャッシュの容量に収まらなくなる程度で性能低下が発生する傾向にある。この傾向は浮動小数点演算あたりに必要となるデータロードおよびデータストア命令の比率が多い計算において一般に確認される性能挙動であり、分散並列ＦＦＴ計算において各プロセスが行う処理も同様の傾向となる。このような理由から、データアクセス範囲をＬ２キャッシュ容量に収まる程度とするように抑えつつ、前述のメッセージ長が通信性能を低下させるほど短くならないように区分サイズを調整できることがＦＦＴ演算の高速化によっては好ましい。
【００７１】
以上をまとめると、ＦＦＴ演算では、演算に必要なデータを移動させるための通信と通信するべきデータを用意するための演算で相互に依存関係があることを考慮する必要があり、独立に処理できる部分への区分化方法には制限が課せられる。区分化された処理サイズは小さ過ぎても大き過ぎても全体の処理効率を悪化させるため、区分化サイズの適切な調整を可能とすることが好ましい。
【００７２】
また、区分サイズが大きいことによる性能への悪影響は、アルゴリズム中で使用するバッファ領域を節約することで緩和し得る。このため、演算通信オーバーラップを行う省メモリなアルゴリズムが求められる。
【００７３】
そこで、並列計算機５０では、区分化した演算および通信処理に対して、データの依存順序関係をそれぞれ満たした上で２つの処理流れを同時並列的に実行する。このとき、一方の処理流れで行う演算と、もう一方の処理流れで行う通信が相互に重なるように実行のタイミングを制御する。このとき、２つの処理流れが使用するバッファ領域について、競合を避けつつ共用化することで省メモリを図りながら、区分サイズを適切に調整して高速な処理を実現する。
【００７４】
図１６は、計算ノードの機能例を示す図である。計算ノード１００は、記憶部１５０、制御部１６０および処理流れ実行部１７０を有する。なお、図１６の例では、ＣＰＵ１１０の機能を説明するが、ＣＰＵ１２０も同様の機能を発揮する。
【００７５】
ここで、記憶部１５０は、キャッシュ１１１やＲＡＭ１３０に確保された記憶領域として実現される。制御部１６０および処理流れ実行部１７０は、ＲＡＭ１３０に記憶されたプログラムをＣＰＵ１１０が実行することで実現される。
【００７６】
制御部１６０は、ローカル配列の取得および区分サイズの決定を行う。制御部１６０は、ローカル配列や区分サイズの情報を記憶部１５０に格納する。
処理流れ実行部１７０は、上述した２つの処理流れを実行する。処理流れ実行部１７０は、入出力処理部１７１，１７１ａ、通信処理部１７２，１７２ａおよびＦＦＴ処理部１７３，１７３ａを有する。２つの処理流れを並行して処理するため、処理流れ実行部１７０は、入出力処理部、通信処理部およびＦＦＴ処理部をそれぞれ２つずつ有する。入出力処理部１７１，１７１ａおよび通信処理部１７２，１７２ａは、制御コア１１２によって実現される。ＦＦＴ処理部１７３，１７３ａは、計算コア１１３，１１４，１１５，１１６，１１７によって実現される。
【００７７】
入出力処理部１７１は、ＦＦＴ演算の対象とする区分データをローカル配列から取り出して送信バッファに格納する（転置ｉｎ）。また、入出力処理部１７１は、ＦＦＴ計算後の区分データを受信バッファから取り出して、ローカル配列に格納する（転置ｏｕｔ）。入出力処理部１７１ａも入出力処理部１７１が扱う区分データとは異なる区分データに対して、同様の処理を行う。
【００７８】
通信処理部１７２は、区分データおよびＦＦＴ演算後の区分データに対してａｌｌ‐ｔｏ‐ａｌｌ通信を行う。通信処理部１７２ａも、通信処理部１７２が扱う区分データとは異なる区分データに対してａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
【００７９】
ＦＦＴ処理部１７３は、ａｌｌ‐ｔｏ‐ａｌｌ通信後の区分データに対するＦＦＴ演算を実行する。ＦＦＴ処理部１７３ａも、ＦＦＴ処理部１７３が扱う区分データとは異なる区分データに対してＦＦＴ演算を実行する。
【００８０】
図１７は、区分化の例を示す図である。図１７では、ローカル配列のＺ方向に対する区分化の例を示している。例えば、入出力処理部１７１，１７１ａは、１つのプロセスに割り当てられたローカル配列を６つの区分データに分割して送信バッファに読み込む。分割数は、区分サイズ（１つの区分データのサイズ）に応じて決定される。以下では、６つの区分データそれぞれを、区分Ｋ１，Ｋ２，Ｋ３，Ｋ４，Ｋ５，Ｋ６と表記する。
【００８１】
図１８は、第２の実施の形態の処理流れの例を示す図である。計算ノード１００は、連続する２つの区分データ（例えば、区分Ｋ１，Ｋ２の２つの区分データや区分Ｋ２，Ｋ３の２つの区分データなど）を２つの処理流れＲ１，Ｒ２によりオーバーラップして処理する。処理流れＲ１，Ｒ２それぞれは、転置ｉｎ、送信、受信、ＦＦＴ、送信、受信、転置ｏｕｔの手順を順番に実行する。
【００８２】
転置ｉｎは、ローカル配列からの区分データを取り出して、送信用に転置して（ＦＦＴ処理対象の軸に沿って連続するように並べて）バッファに格納する処理である。次の送信および受信は、転置ｉｎの結果を自プロセスが属するプロセスグループに属する他プロセスに対するａｌｌ‐ｔｏ‐ａｌｌ通信である。ＦＦＴは、前段のａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対するＦＦＴ演算である。次の送信および受信は、ＦＦＴ演算結果の各部を元の保持プロセスに戻すためのａｌｌ‐ｔｏ‐ａｌｌ通信である。転置ｏｕｔは、前段のａｌｌ‐ｔｏ‐ａｌｌ通信の結果を、ローカル配列に格納する処理である。
【００８３】
図１９は、第２の実施の形態の演算通信オーバーラップの例を示す図である。処理流れ実行部１７０は、２つの処理流れＲ１，Ｒ２に対して、３つの記憶領域である作業域Ａ１，Ａ２，Ａ３を記憶部１５０に設ける。そして、２つの処理流れＲ１，Ｒ２それぞれの処理を、作業域Ａ１，Ａ２，Ａ３を用いて次のように実行する。ここで、図１９では、図１７で例示した区分化されたデータに対してＺ方向のＦＦＴを実行する例を示す。図１９の上側から下側へ向かう方向が時系列の正方向である。また、図１９では、処理流れＲ１に相当する処理を白抜きで、処理流れＲ２に相当する処理を網掛けで図示している。更に、図１９では、各作業域を用いた処理が行われない区間についてはハイフン記号“−”を付している。
【００８４】
第１のタイミングで、入出力処理部１７１は、区分Ｋ１をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ１に格納する。
第２のタイミングで、通信処理部１７２は、作業域Ａ１（送信バッファ）および作業域Ａ２（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【００８５】
第３のタイミングで、ＦＦＴ処理部１７３は、作業域Ａ２に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。
第４のタイミングで、通信処理部１７２は、作業域Ａ２（送信バッファ）および作業域Ａ３（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。また、第４のタイミングで、入出力処理部１７１ａは、区分Ｋ２をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ１に格納する。ここまでが以降に示すループに入るまでの前段の処理である。
【００８６】
第５のタイミングで、入出力処理部１７１は、作業域Ａ３に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部１７１は、区分Ｋ３をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ３に格納する。また、第５のタイミングで、通信処理部１７２ａは、作業域Ａ１（送信バッファ）および作業域Ａ２（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【００８７】
第６のタイミングで、通信処理部１７２は、作業域Ａ３（送信バッファ）および作業域Ａ１（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。また、第６のタイミングで、ＦＦＴ処理部１７３ａは、作業域Ａ２に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。
【００８８】
第７のタイミングで、ＦＦＴ処理部１７３は、作業域Ａ１に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。また、第７のタイミングで、通信処理部１７２ａは、作業域Ａ２（送信バッファ）および作業域Ａ３（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【００８９】
第８のタイミングで、通信処理部１７２は、作業域Ａ１（送信バッファ）および作業域Ａ２（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。また、第８のタイミングで、入出力処理部１７１ａは、作業域Ａ３に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部１７１ａは、区分Ｋ４をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ３に格納する。第５のタイミング〜第８のタイミングまでに示した手順でループ処理の１回目が完了する。
【００９０】
第９のタイミングで、入出力処理部１７１は、作業域Ａ２に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部１７１は、区分Ｋ５をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ２に格納する。また、第９のタイミングで、通信処理部１７２ａは、作業域Ａ３（送信バッファ）および作業域Ａ１（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【００９１】
第１０のタイミングで、通信処理部１７２は、作業域Ａ２（送信バッファ）および作業域Ａ３（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。また、第１０のタイミングで、ＦＦＴ処理部１７３ａは、作業域Ａ１に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。
【００９２】
第１１のタイミングで、ＦＦＴ処理部１７３は、作業域Ａ３に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。また、第１１のタイミングで、通信処理部１７２ａは、作業域Ａ１（送信バッファ）および作業域Ａ２（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【００９３】
第１２のタイミングで、通信処理部１７２は、作業域Ａ３（送信バッファ）および作業域Ａ１（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。また、第１２のタイミングで、入出力処理部１７１ａは、作業域Ａ２に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部１７１ａは、区分Ｋ６をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ２に格納する。第６のタイミング〜第１２のタイミングまでに示した手順でループ処理の２回目（ループ２）が完了する。以降の説明はループの終端の手順となる。
【００９４】
第１３のタイミングで、入出力処理部１７１は、作業域Ａ２に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する（処理流れＲ１が完了する）。また、第１３のタイミングで、通信処理部１７２ａは、作業域Ａ２（送信バッファ）および作業域Ａ３（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【００９５】
第１４のタイミングで、ＦＦＴ処理部１７３ａは、作業域Ａ３に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。
第１５のタイミングで、通信処理部１７２ａは、作業域Ａ３（送信バッファ）および作業域Ａ１（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【００９６】
第１６のタイミングで、入出力処理部１７１ａは、作業域Ａ１に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する（処理流れＲ２が完了する）。
【００９７】
次に上記３つの作業域を用いて行われるＦＦＴ処理の具体的な手順を説明する。まず、ＦＦＴの全体処理の手順を説明する。
図２０は、第２の実施の形態のＦＦＴの全体処理の例を示すフローチャートである。以下、図２０に示す処理をステップ番号に沿って説明する。
【００９８】
（Ｓ１１）制御部１６０は、３次元ＦＦＴ計算対象の入力データをローカル配列Ａに準備する。
（Ｓ１２）制御部１６０は、Ｘ方向処理での区分サイズを決定する。区分サイズの決定方法の詳細は、後述される。
【００９９】
（Ｓ１３）処理流れ実行部１７０は、ローカル配列Ａの区分サイズのデータを送信バッファにコピーする。
（Ｓ１４）処理流れ実行部１７０は、Ｘ方向プロセスグループでａｌｌ‐ｔｏ‐ａｌｌ通信を行う。ここで、ａｌｌ‐ｔｏ‐ａｌｌ通信を、図中では“Ａ２Ａ通信”と略記することがある。
【０１００】
（Ｓ１５）処理流れ実行部１７０は、受信バッファのデータに対してＦＦＴ計算を行う。
（Ｓ１６）処理流れ実行部１７０は、Ｘ方向プロセスグループでデータ配置を戻すａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
【０１０１】
（Ｓ１７）処理流れ実行部１７０は、受信データをローカル配列Ａの元区分の位置にコピーする。処理流れ実行部１７０は、図１９で例示したように２つの処理流れにより、ステップＳ１３〜Ｓ１７の手順を繰り返し実行する。そして、処理流れ実行部１７０は、Ｘ方向のＦＦＴ処理が完了すると、処理をステップＳ１８に進める。
【０１０２】
（Ｓ１８）制御部１６０は、Ｙ方向処理での区分サイズを決定する。
（Ｓ１９）処理流れ実行部１７０は、ローカル配列Ａの区分サイズのデータを送信バッファに転置コピーする（転置ｉｎ）。
【０１０３】
（Ｓ２０）処理流れ実行部１７０は、Ｙ方向プロセスグループでａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
（Ｓ２１）処理流れ実行部１７０は、受信バッファのデータに対してＦＦＴ計算を行う。
【０１０４】
（Ｓ２２）処理流れ実行部１７０は、Ｙ方向プロセスグループでデータ配置を戻すａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
（Ｓ２３）処理流れ実行部１７０は、受信データをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。処理流れ実行部１７０は、図１９で例示したように２つの処理流れにより、ステップＳ１９〜Ｓ２３の手順を繰り返し実行する。そして、処理流れ実行部１７０は、Ｙ方向のＦＦＴ処理が完了すると、処理をステップＳ２４に進める。
【０１０５】
（Ｓ２４）制御部１６０は、Ｚ方向処理での区分サイズを決定する。
（Ｓ２５）処理流れ実行部１７０は、ローカル配列Ａの区分サイズのデータを送信バッファに転置コピーする（転置ｉｎ）。
【０１０６】
（Ｓ２６）処理流れ実行部１７０は、Ｚ方向プロセスグループでａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
（Ｓ２７）処理流れ実行部１７０は、受信バッファのデータに対してＦＦＴ計算を行う。
【０１０７】
（Ｓ２８）処理流れ実行部１７０は、Ｚ方向プロセスグループでデータ配置を戻すａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
（Ｓ２９）処理流れ実行部１７０は、受信データをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。処理流れ実行部１７０は、図１９で例示したように２つの処理流れにより、ステップＳ２５〜Ｓ２９の手順を繰り返し実行する。そして、処理流れ実行部１７０は、Ｚ方向のＦＦＴ処理が完了すると、処理を終了する。
【０１０８】
図２１は、プロセスに合わせて分割された入力データの例を示す図である。図２１では、グローバル配列を、３×４×３のプロセス形状でローカル配列に分割した場合を例示している。当該プロセス形状では、各プロセスは、Ｘ軸方向に“０”、“１”、“２”、Ｙ軸方向に“０”、“３”、“６”、“９”、Ｚ軸方向に“０”、“１２”、“２４”というように付されたプロセス番号によって識別される。グローバル配列のサイズをＮ１，Ｎ２，Ｎ３とし、Ｘ，Ｙ，Ｚ軸方向の分割数をそれぞれＰ１，Ｐ２，Ｐ３とすれば、ローカル配列のサイズは、Ｎ１Ｐ＝Ｎ１／Ｐ１、Ｎ２Ｐ＝Ｎ２／Ｐ２、Ｎ３Ｐ＝Ｎ３／Ｐ３である。
【０１０９】
図２２は、区分的な転置コピーとプロセス間通信の例を示す図である。図２２では、Ｚ方向の１つのプロセスグループ（プロセス番号“０”、“１２”、“２４”のプロセスが属するプロセスグループ）における区分データの転置コピー（転置ｉｎ）と、プロセス間のａｌｌ‐ｔｏ‐ａｌｌ通信とを例示している。
【０１１０】
図２３は、区分的な転置コピーとプロセス間通信の例（続き）を示す図である。図２２で例示したａｌｌ‐ｔｏ‐ａｌｌ通信により受信バッファに配置された区分データに対して、各プロセスにより多重ＦＦＴ計算を行った後は、逆方向の流れによりローカル配列（入出力配列）Ａの元の区分に転置コピーする（転置ｏｕｔ）。ここでは、Ｚ方向に対するＦＦＴ計算の例を示したが、Ｘ，Ｙ方向についても同様に処理できる。
【０１１１】
次に、図２０で例示したＦＦＴの全体処理における各軸方向のＦＦＴ計算の手順を説明する。３次元においてＸ方向、Ｙ方向、Ｚ方向の３種類の方向があるが、以下ではＺ方向に着目して説明する。ただし、Ｘ方向、Ｙ方向についても、Ｚ方向と同様の手順により処理できる。
【０１１２】
図２４は、第２の実施の形態のＺ方向ＦＦＴ計算の例を示すフローチャートである。以下、図２４に示す処理をステップ番号に沿って説明する。以下に示す手順は、図２０のステップＳ２４〜Ｓ２９に相当する。処理流れＲ１の処理を入出力処理部１７１、通信処理部１７２およびＦＦＴ処理部１７３により実行し、処理流れＲ２の処理を入出力処理部１７１ａ、通信処理部１７２ａおよびＦＦＴ処理部１７３ａにより実行するものとする。
【０１１３】
（Ｓ３１）制御部１６０は、Ｚ方向処理での区分サイズを決定する。
（Ｓ３２）入出力処理部１７１は、ローカル配列Ａの区分サイズのデータを送信バッファａに転置コピーする（転置ｉｎ）。ここで、作業域Ａ１，Ａ２，Ａ３は、バッファａ，ｂ，ｃの何れかに割り当てられる。初期状態では、バッファａは作業域Ａ１に相当し、バッファｂは作業域Ａ２に相当し、バッファｃは作業域Ａ３に相当する。以下の説明では、バッファａ，ｂ，ｃそれぞれの用途が、送信バッファ、受信バッファのように切り替えられる点に注意されたい。該当のタイミングでの用途を明確にするために、例えば、あるタイミングではバッファａを「送信バッファａ」と表記したり、別のタイミングではバッファａを「受信バッファａ」と表記したりすることがある。
【０１１４】
（Ｓ３３）通信処理部１７２は、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファｂにデータを受信する。
（Ｓ３４）ＦＦＴ処理部１７３は、受信バッファｂのデータに対してＦＦＴ計算を行う。
【０１１５】
（Ｓ３５）通信処理部１７２は、バッファｂからバッファｃへ、データ配置を戻すａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
（Ｓ３６）入出力処理部１７１ａは、ローカル配列Ａの区分サイズのデータを送信バッファａに転置コピーする（転置ｉｎ）。通信処理部１７２および入出力処理部１７１ａは、ステップＳ３５，Ｓ３６を同期して実行開始する。なお、ステップＳ３１〜Ｓ３６までがループ前処理となる。
【０１１６】
（Ｓ３７）入出力処理部１７１は、受信したバッファｃのデータをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。
（Ｓ３８）通信処理部１７２ａは、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファｂにデータを受信する。入出力処理部１７１および通信処理部１７２ａは、ステップＳ３７，Ｓ３８を同期して実行開始する。
【０１１７】
（Ｓ３９）入出力処理部１７１ａは、ローカル配列Ａの区分サイズのデータを送信バッファｃに転置コピーする（転置ｉｎ）。
（Ｓ４０）通信処理部１７２は、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファｃからデータを送信し、バッファａによりデータを受信する。
【０１１８】
（Ｓ４１）ＦＦＴ処理部１７３ａは、受信バッファｂのデータに対してＦＦＴ計算を行う。通信処理部１７２およびＦＦＴ処理部１７３ａは、ステップＳ４０，Ｓ４１を同期して実行開始する。
【０１１９】
（Ｓ４２）ＦＦＴ処理部１７３は、受信バッファａのデータに対してＦＦＴ計算を実行する。
（Ｓ４３）通信処理部１７２ａは、バッファｂからバッファｃへデータ配置を戻すａｌｌ‐ｔｏ‐ａｌｌ通信を行う。ＦＦＴ処理部１７３および通信処理部１７２ａは、ステップＳ４２，Ｓ４３を同期して実行開始する。
【０１２０】
（Ｓ４４）通信処理部１７２は、バッファａからバッファｂへデータ配置を戻すａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
（Ｓ４５）入出力処理部１７１ａは、受信したバッファｃのデータをローカル配列の元区分の位置に転置コピーする（転置ｏｕｔ）。通信処理部１７２および入出力処理部１７１ａは、ステップＳ４４，Ｓ４５を同期して実行開始する。
【０１２１】
（Ｓ４６）入出力処理部１７１ａは、ローカル配列Ａの区分サイズのデータを送信バッファｃに転置コピーする（転置ｉｎ）。
（Ｓ４７）入出力処理部１７１，１７１ａは、ａ，ｂ，ｃに対するバッファ割当てをサイクリックに交換する。具体的には、バッファａに相当する作業域をバッファｂに変える。バッファｂに相当する作業域をバッファｃに変える。バッファｃに相当する作業域をバッファａに変える。そして、未処理の区分データがなくなるまで、処理流れＲ１の処理をステップＳ３７へ進め、処理流れＲ２の処理をステップＳ３８へ進める。ローカル配列Ａにおいて未処理の区分データがなくなると、処理をステップＳ４８へ進める。
【０１２２】
図２５は、第２の実施の形態のＺ方向ＦＦＴ計算の例（続き）を示すフローチャートである。以下、図２５に示す処理をステップ番号に沿って説明する。
（Ｓ４８）入出力処理部１７１は、受信したバッファｃのデータをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。これにより、処理流れＲ１が完了する。
【０１２３】
（Ｓ４９）ＦＦＴ処理部１７３ａは、受信バッファｂのデータに対してＦＦＴ計算を実行する。入出力処理部１７１およびＦＦＴ処理部１７３ａは、ステップＳ４８，Ｓ４９を同期して実行開始する。
【０１２４】
（Ｓ５０）通信処理部１７２ａは、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファａからデータを送信し、バッファｂによりデータを受信する。
（Ｓ５１）ＦＦＴ処理部１７３ａは、受信バッファｂのデータに対してＦＦＴ計算を実行する。
【０１２５】
（Ｓ５２）通信処理部１７２ａは、バッファｂからバッファｃへデータ配置を戻すａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
（Ｓ５３）入出力処理部１７１ａは、受信したバッファｃのデータをローカル配列Ａの元区分の位置に転置コピーする。これにより、処理流れＲ２が完了する。なお、ステップＳ４８〜Ｓ５３までがループ終端処理となる。そして、Ｚ方向のＦＦＴ計算処理が完了する。
【０１２６】
ここで、ある区分に対するＦＦＴの手順と、別の区分に対するＦＦＴの手順とでは、データ依存関係はないので、それぞれ独立に処理可能である。このため、処理流れを上記のように２つ用意して、上述の手順を実行する１つの処理流れに対し、もう１つの処理流れを重ね合わせることで、演算通信オーバーラップが可能となる。処理対象の２つの区分の間のデータ依存関係はないが、通信処理中に送信バッファへの別データ書き込みや受信バッファへの参照を避ける同期処理を行うことで、利用バッファの競合を避けることができる。このように、作業領域用のバッファについて、競合を避けつつ共用化することで、２つの処理流れに要するバッファサイズを、ローカル配列Ａの区分化サイズの３倍に収めることができ、省メモリ化を図れる。
【０１２７】
図２４と図２５に示す手順の実装に当たっては、例えば、ＭＰＩ３．０規格のnon-blocking集団通信（MPI＿alltoall）を利用することが考えられる。あるいは１スレッドのみでの通信処理とそれ以外のスレッドでの演算処理を明に制御するよう実装することも考えられる。後者の場合は、ＭＰＩ側の実装においてスレッドサポートレベルとして“MPI＿THREAD＿FUNNELED”または“MPI＿THREAD＿SERIALIEZED”に対応していることを要する。また、集団通信機能について、利用システムに最適化されたＭＰＩライブラリの実装が行われていることが望ましい。ただし、上記の方法は、特定のＭＰＩライブラリの実装を必ずしも前提とするものではなく、演算とａｌｌ‐ｔｏ‐ａｌｌ通信をオーバーラップさせることができる環境であれば、適用可能である。
【０１２８】
次に、区分サイズ決定の手順を説明する。
図２６は、第２の実施の形態の区分サイズ決定の例を示すフローチャートである。以下、図２６に示す処理をステップ番号に沿って説明する。なお、以下に示す手順は、図２０のステップＳ１２，Ｓ１８，Ｓ２４および図２４のステップＳ３１（ステップＳ３１はステップＳ２４と同じ処理を表している）に相当する処理である。
【０１２９】
（Ｓ６１）制御部１６０は、利用システム（例えば、並列計算機５０のハードウェアや通信環境）に応じた値Ｌ，Ｃ，αを設定する。Ｌは、集団通信レイテンシ（単位は秒）である。Ｃは、プロセス当たりのキャッシュ容量（単位はバイト）である。αは、実効通信性能を示す係数である。また、制御部１６０は、対象とするＦＦＴ問題に応じて値Ｖ，Ｐを設定する。Ｖは、プロセス当たりの入出力配列サイズ（単位はバイト）である。Ｐは、処理中の次元方向のプロセスグループのプロセス数である。
【０１３０】
（Ｓ６２）制御部１６０は、利用システムおよび問題設定に応じて値Ｂを推定する。Ｂは、１つのプロセスグループに属するプロセスのみで構成されるシステムを想定した場合のバイセクションバンド幅（単位はバイト／秒）である。すなわち、Ｂは、集団通信を行う複数のプロセスが動作する複数の計算ノードの間の通信路におけるバイセクションバンド幅である。例えば、６次元メッシュ／トーラスのＴｏｆｕの場合、計算ノード間のリンク当たりのバンド幅をＢL、各次元方向のプロセス数をＰｉとして、次のようにＢを近似的に求めることができる。１軸分散の場合、Ｂは式（３）で求められる。
【０１３１】
【数３】
0006666548.tif 000004
２軸分散の場合、Ｂは式（４）で求められる。
【０１３２】
【数４】
0006666548.tif 000005
３軸分散の場合、Ｂは式（５）で求められる。
【０１３３】
【数５】
0006666548.tif 000006
（Ｓ６３）制御部１６０は、メッセージ長Ｍを仮設定する。ここで、Ｍ＝Ｃ／（４×Ｐ）である。
【０１３４】
（Ｓ６４）制御部１６０は、Ｍ＜１０×Ｐ2／（４×α×Ｂ×Ｌ）であるか（Ｍが１０×Ｐ2／（４×α×Ｂ×Ｌ）よりも小さいか）否かを判定する。Ｍ＜１０×Ｐ2／（４×α×Ｂ×Ｌ）である場合、処理をステップＳ６５に進める。Ｍ＜１０×Ｐ2／（４×α×Ｂ×Ｌ）でない場合、処理をステップＳ６６に進める。
【０１３５】
（Ｓ６５）制御部１６０は、Ｍ＝１０×Ｐ2／（４×α×Ｂ×Ｌ）に設定する。そして、処理をステップＳ６６に進める。
（Ｓ６６）制御部１６０は、Ｍ×Ｐ＞Ｖであるか（Ｍ×ＰがＶよりも大きいか）否かを判定する。Ｍ×Ｐ＞Ｖである場合、処理をステップＳ６７に進める。Ｍ×Ｐ＞Ｖでない場合、処理をステップＳ６８に進める。
【０１３６】
（Ｓ６７）制御部１６０は、Ｍ＝Ｖ／Ｐに設定する。そして、処理をステップＳ６８に進める。
（Ｓ６８）制御部１６０は、Ｍ×Ｐ（バイト）を各プロセスが用いる区分サイズとして決定する。そして、区分サイズの決定処理を終了する。処理流れ実行部１７０は、こうして決定された区分サイズを用いて、各次元方向のＦＦＴ処理を実行する。
【０１３７】
こうして、制御部１６０は、区分サイズを決定する。ここで、適切な区分サイズは、通信の観点と演算の観点とでは性能挙動についてトレードオフの関係がある。区分サイズが大き過ぎることによる演算性能側の低下は半分程度であるのに対して、区分サイズが小さ過ぎることによる通信性能への影響は何倍も異なる場合がある。このため、制御部１６０は、通信性能への影響をより重視して、以下の優先順で区分サイズを決定している。
【０１３８】
第１の条件は、Ｍ×Ｐ≦Ｎ１Ｐ×Ｎ２Ｐ×Ｎ３Ｐ×（１要素当たりのバイト数）である。第２の条件は、Ｌcollective＜＜Ｍ×Ｐ2／（４×α×Ｂ）である。第３の条件は、４×Ｍ×Ｐ≒（プロセス当たりのキャッシュ容量）である。
【０１３９】
ここで、Ｍはメッセージ長（単位はバイト）であり、３×Ｍ×Ｐが作業域サイズ（作業域Ａ１，Ａ２，Ａ３の合計サイズ）となるように区分化サイズを決定する。第１の条件は、入力配列よりも大きな送受信バッファを必要としないための上限サイズを示す。プロセス当たりのキャッシュ容量は、あるプロセスに対して作業域Ａ１，Ａ２，Ａ３として割り当てることが可能なキャッシュメモリ（例えば、キャッシュ１１１）の容量である。通信レイテンシＬcollective、通信効率係数α、プロセス当たりのキャッシュ容量はシステムに応じた値を与えることができるパラメタであり、各次元方向のプロセスＰ（Ｐ１，Ｐ２，Ｐ３の何れか）は、実行時に判断できる。制御部１６０は、第３の条件（ステップＳ６３に相当）により、キャッシュメモリの容量に応じてプロセス間の通信のメッセージ長を決定し、決定したメッセージ長に基づいて複数のプロセスそれぞれの処理対象のデータのサイズ（区分サイズ）を決定する。このメッセージ長の決定の際、制御部１６０は、パラメタＢも考慮する。
【０１４０】
パラメタＢは、集団通信を行うプロセスグループにおける通信性能を示す指標であり、当該プロセスグループに属するプロセスのみで構成されるシステムに対するバイセクションバンド幅である。多軸分散方式での分散並列ＦＦＴにおいては全体のプロセスを複数のプロセスグループに分け、それぞれのプロセスグループで集団通信を行う計算過程があるため、通常の意味でのシステム全体に対するバイセクションバンド幅とは異なる。パラメタＢの値は、多次元直接網ネットワークのシステムにおいては、隣接プロセス間の通信リンク帯域とプロセス形状から決定されることになるが、パラメタＢの値を直接的に得ることは容易でない。そこで、制御部１６０は、図２６で説明したように、パラメタＢの値を、１軸分散（式（３））、２軸分散（式（４））または３軸分散（式（５））の何れを用いるかに応じた計算式により簡易的に近似して求めている。すなわち、制御部１６０は、１軸分散、２軸分散または３軸分散の何れを用いるかに応じてバイセクションバンド幅を求めるための計算式を、３種類の計算式の中から選択する。こうして、演算方法に応じて適切なＢの値を求めることができる。その結果、演算方法に応じて、適切に区分サイズを決定でき、ＦＦＴ演算における省メモリ化、および、ＦＦＴ演算の高速化を図れる。
【０１４１】
図２７は、第２の実施の形態のＦＦＴ演算の比較例を示す図である。図２７では、第２の実施の形態の方法により、多重ＦＦＴをプロセス間で任意サイズに区分化して演算通信オーバーラップを行う場合を、太い黒枠で囲っている。それ以外の箇所は、比較例として、グローバル配列を単純に区分化した場合である。図２７では、各場合について、分散軸、演算通信オーバーラップの有無、作業域サイズ、区分サイズ調整の制約の有無および区分サイズ調整の制約がある場合の制約の強弱、全プロセス数＝ＮＰ時のメッセージ長の目安を例示している。なお、ＮＳは区分回数（ローカル配列内の区分の数）である。
【０１４２】
まず、図１１，図１２で示した区分化の方法によって、適切なサイズでの処理ブロック化を妨げていた区分サイズ調整の制限は緩和される（比較例の制限強に対し、第２の実施の形態では制限弱となる）。ただし、各次元方向の１本のＦＦＴ対象データサイズを単位とすることになるため、完全に任意ではない。これにより、区分サイズの調整が可能となり、演算効率および通信効率の両方を考慮して最適な区分サイズを設定できる。また、競合を避けたバッファ共用化により作業域サイズを小さくすることで、省メモリ化を図れる。更に、データアクセス範囲の局所性が高められる（例えば、Ｌ２キャッシュ内へのアクセスに収められる）ことで演算を高速化できる。
【０１４３】
こうして、第２の実施の形態の並列計算機５０によれば、分散並列型３次元ＦＦＴ計算を行う際、ローカル配列を独立に処理可能な区分への分け方について制約が少ない方法を採用する。その上で、２つの処理流れが使用するバッファについて競合を避けつつ共用化することで、作業域配列として使用するメモリの削減を可能とし、かつ、キャッシュ利用効率が良くなることで高速にＦＦＴ計算を行えるようになる。また、演算と通信でトレードオフの関係がある性能挙動に対して性能見積もり式の利用を工夫することで、区分サイズを適切に設定可能となる。
【０１４４】
特に、図１１，図１２の区分化方法を用いた上で、２つの処理流れを重ね合わせる（図１９）。これにより、３次元ＦＦＴ計算アルゴリズム上で課せられるデータ依存の順序関係を保つ条件や、利用バッファの競合回避の条件を満たした上で、省メモリでの演算通信オーバーラップを実現できる。
【０１４５】
［第３の実施の形態］
以下、第３の実施の形態を説明する。前述の第２の実施の形態との相違する事項を主に説明し、共通する事項の説明を省略する。
【０１４６】
第２の実施の形態では、入力データと同じ格納方式で出力データを格納する場合を例示した。一方、ＦＦＴ正変換結果に要素毎の処理を加えた後で、ＦＦＴ逆変換をした時にデータ並びが正しく配置されればよいケースもある。このため、出力データの配置を別途行って、通信量を削減することがある（すなわち、元のデータ並びに戻す通信を省略することがある）。そこで、第３の実施の形態では、元のデータ並びに戻す通信を省略する場合を例示する。
【０１４７】
ここで、第３の実施の形態における並列計算機のハードウェアや機能などの各要素は、第２の実施の形態で例示した並列計算機５０のハードウェアや機能などの各要素と同様である。そこで、第３の実施の形態における並列計算機の各要素を、第２の実施の形態と同じ名称および符号により指し示す。
【０１４８】
図２８は、第３の実施の形態のＦＦＴ正変換の処理流れの例を示す図である。計算ノード１００は、連続する２つの区分データ（例えば、区分Ｋ１，Ｋ２の２つの区分データや区分Ｋ２，Ｋ３の２つの区分データなど）を２つの処理流れＲ１ａ，Ｒ２ａによりオーバーラップして処理する。処理流れＲ１ａ，Ｒ２ａそれぞれは、転置ｉｎ、送信、受信、ＦＦＴ、転置ｏｕｔの手順を順番に実行する。図１８で例示した第２の実施の形態の処理流れＲ１，Ｒ２に対し、処理流れＲ１ａ，Ｒ２ａでは、ＦＦＴ計算後のａｌｌ‐ｔｏ‐ａｌｌ通信を略す点が異なっている。
【０１４９】
図２９は、第３の実施の形態の正変換の演算通信オーバーラップ例を示す図である。処理流れ実行部１７０は、２つの処理流れＲ１ａ，Ｒ２ａに対して、３つの作業域Ａ１，Ａ２，Ａ３を記憶部１５０に設ける。そして、２つの処理流れＲ１ａ，Ｒ２ａそれぞれの処理を、作業域Ａ１，Ａ２，Ａ３を用いて次のように実行する。ここで、図２９では、図１７で例示した区分化されたデータに対してＺ方向のＦＦＴ（正変換）を実行する例を示す。図２９の上側から下側へ向かう方向が時系列の正方向である。また、図２９では、処理流れＲ１ａに相当する処理を白抜きで、処理流れＲ２ａに相当する処理を網掛けで図示している。更に、図２９では、各作業域を用いた処理が行われない区間についてはハイフン記号“−”を付している。
【０１５０】
第１のタイミングで、入出力処理部１７１は、区分Ｋ１をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ１に格納する。
第２のタイミングで、通信処理部１７２は、作業域Ａ１（送信バッファ）および作業域Ａ２（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。また、第２のタイミングで、入出力処理部１７１ａは、区分Ｋ２をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ３に格納する。ここまでが以降に示すループに入るまでの前段の処理である。
【０１５１】
第３のタイミングで、ＦＦＴ処理部１７３は、作業域Ａ２に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。また、入出力処理部１７１は、作業域Ａ２に格納されたＦＦＴ演算結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。更に、入出力処理部１７１は、区分Ｋ３をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ２に格納する。また、第３のタイミングで、通信処理部１７２ａは、作業域Ａ３（送信バッファ）および作業域Ａ１（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【０１５２】
第４のタイミングで、通信処理部１７２は、作業域Ａ２（送信バッファ）および作業域Ａ３（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。また、第４のタイミングで、ＦＦＴ処理部１７３ａは、作業域Ａ１に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。また、入出力処理部１７１ａは、作業域Ａ１に格納されたＦＦＴ演算結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。更に、入出力処理部１７１ａは、区分Ｋ４をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ１に格納する。第３のタイミング〜第４のタイミングまでに示した手順でループ処理の１回目（ループ１）が完了する。
【０１５３】
第５のタイミングで、ＦＦＴ処理部１７３は、作業域Ａ３に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。また、入出力処理部１７１は、作業域Ａ３に格納されたＦＦＴ演算結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。更に、入出力処理部１７１は、区分Ｋ５をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ３に格納する。また、第５のタイミングで、通信処理部１７２ａは、作業域Ａ１（送信バッファ）および作業域Ａ２（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【０１５４】
第６のタイミングで、通信処理部１７２は、作業域Ａ３（送信バッファ）および作業域Ａ１（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。また、第６のタイミングで、ＦＦＴ処理部１７３ａは、作業域Ａ２に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。また、入出力処理部１７１ａは、作業域Ａ２に格納されたＦＦＴ演算結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。更に、入出力処理部１７１ａは、区分Ｋ６をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ２に格納する。第５のタイミング〜第６のタイミングまでに示した手順でループ処理の２回目（ループ２）が完了する。以降の説明はループの終端の手順となる。
【０１５５】
第７のタイミングで、ＦＦＴ処理部１７３は、作業域Ａ１に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。また、入出力処理部１７１は、作業域Ａ２に格納されたＦＦＴ演算結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する（処理流れＲ１ａが完了する）。また、第７のタイミングで、通信処理部１７２ａは、作業域Ａ２（送信バッファ）および作業域Ａ３（受信バッファ）を用いて、ａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【０１５６】
第８のタイミングで、ＦＦＴ処理部１７３ａは、作業域Ａ３に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果に対してＦＦＴ演算を実行する。
第９のタイミングで、入出力処理部１７１ａは、作業域Ａ３に格納されたＦＦＴ演算結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する（処理流れＲ２ａが完了する）。
【０１５７】
次に上記３つの作業域を用いて行われるＦＦＴ正変換処理の具体的な手順を説明する。まず、正変換の全体処理の手順を説明する。
図３０は、第３の実施の形態の正変換の全体処理の例を示すフローチャートである。図３０の手順は、図２０で例示した第２の実施の形態のＦＦＴの全体処理のフローチャートとほぼ同じである。ただし、前述のように、図３０のフローチャートでは、元のデータ並びに戻す通信（図２０のステップＳ２２，Ｓ２８）を省略する点が、図２０のフローチャートと異なる。すなわち、第３の実施の形態では、処理流れ実行部１７０は、ステップＳ２１の次にステップＳ２３を実行する。また、処理流れ実行部１７０は、ステップＳ２７の次にステップＳ２９を実行する。なお、３次元ＦＦＴアルゴリズムのデータ依存関係の都合上、Ｘ次元方向のＦＦＴ計算については、戻し通信を省略していない（Ｘ方向については、第２の実施の形態と同様の手順で処理できる）。また、Ｙ方向のＦＦＴ結果をローカル配列に格納する際には、Ｚ方向のデータ並びを崩さないという条件が加わる。
【０１５８】
次に、図３０で例示したＦＦＴ正変換の全体処理における各軸方向のＦＦＴ計算の手順を説明する。以下では、Ｚ方向に着目して説明するが、Ｙ方向についても、Ｚ方向と同様の手順により処理できる。
【０１５９】
図３１は、第３の実施の形態のＺ方向正変換の例を示すフローチャートである。以下、図３１に示す処理をステップ番号に沿って説明する。以下に示す手順は、図３０のステップＳ２４〜Ｓ２９に相当する。処理流れＲ１ａの処理を入出力処理部１７１、通信処理部１７２およびＦＦＴ処理部１７３により実行し、処理流れＲ２ａの処理を入出力処理部１７１ａ、通信処理部１７２ａおよびＦＦＴ処理部１７３ａにより実行するものとする。
【０１６０】
（Ｓ７１）制御部１６０は、Ｚ方向処理での区分サイズを決定する。
（Ｓ７２）入出力処理部１７１は、ローカル配列Ａの区分サイズのデータを送信バッファａに転置コピーする（転置ｉｎ）。ここで、作業域Ａ１，Ａ２，Ａ３は、バッファａ，ｂ，ｃの何れかに割り当てられる。初期状態では、バッファａは作業域Ａ１に相当し、バッファｂは作業域Ａ２に相当し、バッファｃは作業域Ａ３に相当する。
【０１６１】
（Ｓ７３）通信処理部１７２は、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファｂにデータを受信する。
（Ｓ７４）入出力処理部１７１ａは、ローカル配列Ａの区分サイズのデータを送信バッファｃに転置コピーする（転置ｉｎ）。通信処理部１７２および入出力処理部１７１ａは、ステップＳ７３，Ｓ７４を同期して実行開始する。なお、ステップＳ７１〜Ｓ７４までがループ前処理となる。
【０１６２】
（Ｓ７５）ＦＦＴ処理部１７３は、受信バッファｂのデータに対してＦＦＴ計算を行う。
（Ｓ７６）通信処理部１７２ａは、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファｃからデータを送信し、バッファａによりデータを受信する。ＦＦＴ処理部１７３および通信処理部１７２ａは、ステップＳ７５，Ｓ７６を同期して実行開始する。
【０１６３】
（Ｓ７７）入出力処理部１７１は、バッファｂのデータをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。
（Ｓ７８）入出力処理部１７１は、ローカル配列Ａの区分サイズのデータを送信バッファｂに転置コピーする（転置ｉｎ）。
【０１６４】
（Ｓ７９）入出力処理部１７１，１７１ａは、ａ，ｂ，ｃに対するバッファ割当てをサイクリックに交換する。具体的には、バッファａに相当する作業域をバッファｂに変える。バッファｂに相当する作業域をバッファｃに変える。バッファｃに相当する作業域をバッファａに変える。
【０１６５】
（Ｓ８０）通信処理部１７２は、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファｃからデータを送信し、バッファａによりデータを受信する。
（Ｓ８１）ＦＦＴ処理部１７３ａは、受信バッファｂのデータに対してＦＦＴ計算を行う。通信処理部１７２およびＦＦＴ処理部１７３ａは、ステップＳ８０，Ｓ８１を同期して実行開始する。
【０１６６】
（Ｓ８２）入出力処理部１７１ａは、バッファｂのデータをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。
（Ｓ８３）入出力処理部１７１ａは、ローカル配列Ａの区分サイズのデータを送信バッファｂに転置コピーする（転置ｉｎ）。
【０１６７】
（Ｓ８４）入出力処理部１７１，１７１ａは、ａ，ｂ，ｃに対するバッファ割当てをサイクリックに交換する。具体的には、バッファａに相当する作業域をバッファｂに変える。バッファｂに相当する作業域をバッファｃに変える。バッファｃに相当する作業域をバッファａに変える。そして、未処理の区分データがなくなるまで、処理流れＲ１ａの処理をステップＳ７５へ進め、処理流れＲ２ａの処理をステップＳ７６へ進める。ローカル配列Ａにおいて未処理の区分データがなくなると、処理をステップＳ８５へ進める。
【０１６８】
図３２は、第３の実施の形態のＺ方向正変換の例（続き）を示すフローチャートである。以下、図３２に示す処理をステップ番号に沿って説明する。
（Ｓ８５）ＦＦＴ処理部１７３は、受信バッファｂのデータに対してＦＦＴ計算を行う。
【０１６９】
（Ｓ８６）通信処理部１７２ａは、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファｃからデータを送信し、バッファａによりデータを受信する。ＦＦＴ処理部１７３および通信処理部１７２ａは、ステップＳ８５，Ｓ８６を同期して実行開始する。
【０１７０】
（Ｓ８７）入出力処理部１７１は、バッファｂのデータをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。これにより、処理流れＲ１ａが完了する。
（Ｓ８８）ＦＦＴ処理部１７３ａは、受信バッファａのデータに対してＦＦＴ計算を行う。
【０１７１】
（Ｓ８９）入出力処理部１７１ａは、バッファａのデータをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。これにより、処理流れＲ２ａが完了する。なお、ステップＳ８５〜Ｓ８９までがループ終端処理となる。そして、Ｚ方向のＦＦＴ計算処理が完了する。
【０１７２】
次に、ＦＦＴ逆変換時の処理を説明する。
図３３は、第３の実施の形態のＦＦＴ逆変換の処理流れの例を示す図である。ＦＦＴ逆変換時の２つの処理流れを、処理流れＲ１ｂ，Ｒ２ｂとする。処理流れＲ１ｂ，Ｒ２ｂそれぞれは、転置ｉｎ、ＦＦＴ、送信、受信、転置ｏｕｔの手順を順番に実行する。処理流れＲ１ｂ，Ｒ２ｂにおけるＦＦＴ計算（逆変換）後のａｌｌ‐ｔｏ‐ａｌｌ通信により、ローカル配列ＡにおけるＦＦＴ正変換前の元のデータ並びに戻すことになる。
【０１７３】
図３４は、第３の実施の形態の逆変換の演算通信オーバーラップ例を示す図である。処理流れ実行部１７０は、２つの処理流れＲ１ｂ，Ｒ２ｂに対して、３つの作業域Ａ１，Ａ２，Ａ３を記憶部１５０に設ける。そして、２つの処理流れＲ１ｂ，Ｒ２ｂそれぞれの処理を、作業域Ａ１，Ａ２，Ａ３を用いて次のように実行する。ここで、図３４では、図１７で例示した区分化されたデータに対し図２９のＦＦＴ正変換を行った結果を格納したローカル配列についてＺ方向のＦＦＴ（逆変換）を実行する例を示す。図３４の上側から下側へ向かう方向が時系列の正方向である。また、図３４では、処理流れＲ１ｂに相当する処理を白抜きで、処理流れＲ２ｂに相当する処理を網掛けで図示している。更に、図３４では、各作業域を用いた処理が行われない区間についてはハイフン記号“−”を付している。
【０１７４】
第１のタイミングで、入出力処理部１７１は、区分Ｋ１をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ１に格納する。また、ＦＦＴ処理部１７３は、作業域Ａ１に格納されたデータに対してＦＦＴ演算を実行する。
【０１７５】
第２のタイミングで、通信処理部１７２は、作業域Ａ１（送信バッファ）および作業域Ａ２（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。また、第２のタイミングで、入出力処理部１７１ａは、区分Ｋ２をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ３に格納する。また、ＦＦＴ処理部１７３ａは、作業域Ａ３に格納されたデータに対してＦＦＴ演算を実行する。ここまでが以降に示すループに入るまでの前段の処理である。
【０１７６】
第３のタイミングで、入出力処理部１７１は、作業域Ａ２に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部１７１は、区分Ｋ３をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ２に格納する。更に、ＦＦＴ処理部１７３は、作業域Ａ２に格納されたデータに対してＦＦＴ演算を実行する。また、第３のタイミングで、通信処理部１７２ａは、作業域Ａ３（送信バッファ）および作業域Ａ１（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【０１７７】
第４のタイミングで、通信処理部１７２は、作業域Ａ２（送信バッファ）および作業域Ａ３（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。また、第４のタイミングで、入出力処理部１７１ａは、作業域Ａ１に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部１７１ａは、区分Ｋ４をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ１に格納する。更に、ＦＦＴ処理部１７３ａは、作業域Ａ１に格納されたデータに対してＦＦＴ演算を実行する。第３のタイミング〜第４のタイミングまでに示した手順で１回目のループ処理が完了する。
【０１７８】
第５のタイミングで、入出力処理部１７１は、作業域Ａ３に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部１７１は、区分Ｋ５をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ３に格納する。更に、ＦＦＴ処理部１７３は、作業域Ａ３に格納されたデータに対してＦＦＴ演算を実行する。また、第５のタイミングで、通信処理部１７２ａは、作業域Ａ１（送信バッファ）および作業域Ａ２（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【０１７９】
第６のタイミングで、通信処理部１７２は、作業域Ａ３（送信バッファ）および作業域Ａ１（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。また、第６のタイミングで、入出力処理部１７１ａは、作業域Ａ２に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する。そして、入出力処理部１７１ａは、区分Ｋ６をローカル配列から取り出して転置ｉｎの処理を実行し、作業域Ａ２に格納する。更に、ＦＦＴ処理部１７３ａは、作業域Ａ２に格納されたデータに対してＦＦＴ演算を実行する。第５のタイミング〜第６のタイミングまでに示した手順で２回目のループ処理が完了する。以降の説明はループの終端の手順となる。
【０１８０】
第７のタイミングで、入出力処理部１７１は、作業域Ａ１に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する（処理流れＲ１ｂが完了する）。また、第７のタイミングで、通信処理部１７２ａは、作業域Ａ２（送信バッファ）および作業域Ａ３（受信バッファ）を用いて、ＦＦＴ演算結果のａｌｌ‐ｔｏ‐ａｌｌ通信を実行する。
【０１８１】
第８のタイミングで、入出力処理部１７１ａは、作業域Ａ３に格納されたａｌｌ‐ｔｏ‐ａｌｌ通信の結果を転置ｏｕｔの処理によりローカル配列の元の位置へ格納する（処理流れＲ２ｂが完了する）。
【０１８２】
次に上記３つの作業域を用いて行われるＦＦＴ逆変換処理の具体的な手順を説明する。まず、逆変換の全体処理の手順を説明する。
図３５は、第３の実施の形態の逆変換の全体処理例を示すフローチャートである。以下、図３５に示す処理をステップ番号に沿って説明する。
【０１８３】
（Ｓ９１）制御部１６０は、３次元ＦＦＴ計算対象の入力データをローカル配列Ａに準備する。
（Ｓ９２）制御部１６０は、Ｚ方向処理での区分サイズを決定する。区分サイズの決定方法は、図２６で例示した第２の実施の形態の区分サイズの決定と同様の方法を用いることができる。
【０１８４】
（Ｓ９３）処理流れ実行部１７０は、ローカル配列Ａの区分サイズのデータを送信バッファに転置コピーする（転置ｉｎ）。
（Ｓ９４）処理流れ実行部１７０は、受信バッファのデータに対してＦＦＴ計算（逆変換）を行う。
【０１８５】
（Ｓ９５）処理流れ実行部１７０は、Ｚ方向プロセスグループでデータ配置を戻すａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
（Ｓ９６）処理流れ実行部１７０は、受信データをローカル配列Ａの元区分の位置にコピーする（転置ｏｕｔ）。処理流れ実行部１７０は、図３４で例示したように２つの処理流れにより、ステップＳ９３〜Ｓ９６の手順を繰り返し実行する。そして、処理流れ実行部１７０は、Ｚ方向のＦＦＴ処理が完了すると、処理をステップＳ９７に進める。
【０１８６】
（Ｓ９７）制御部１６０は、Ｙ方向処理での区分サイズを決定する。
（Ｓ９８）処理流れ実行部１７０は、ローカル配列Ａの区分サイズのデータを送信バッファに転置コピーする（転置ｉｎ）。
【０１８７】
（Ｓ９９）処理流れ実行部１７０は、受信バッファのデータに対してＦＦＴ計算を行う。
（Ｓ１００）処理流れ実行部１７０は、Ｙ方向プロセスグループでデータ配置を戻すａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
【０１８８】
（Ｓ１０１）処理流れ実行部１７０は、受信データをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。処理流れ実行部１７０は、図３４で例示したように２つの処理流れにより、ステップＳ９８〜Ｓ１０１の手順を繰り返し実行する。そして、処理流れ実行部１７０は、Ｙ方向のＦＦＴ処理が完了すると、処理をステップＳ１０２に進める。
【０１８９】
（Ｓ１０２）制御部１６０は、Ｘ方向処理での区分サイズを決定する。
（Ｓ１０３）処理流れ実行部１７０は、ローカル配列Ａの区分サイズのデータを送信バッファにコピーする。
【０１９０】
（Ｓ１０４）処理流れ実行部１７０は、Ｘ方向プロセスグループでａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
（Ｓ１０５）処理流れ実行部１７０は、受信バッファのデータに対してＦＦＴ計算を行う。
【０１９１】
（Ｓ１０６）処理流れ実行部１７０は、Ｘ方向プロセスグループでデータ配置を戻すａｌｌ‐ｔｏ‐ａｌｌ通信を行う。
（Ｓ１０７）処理流れ実行部１７０は、受信データをローカル配列Ａの元区分の位置にコピーする。処理流れ実行部１７０は、図１９で例示したように２つの処理流れにより、ステップＳ１０３〜Ｓ１０７の手順を繰り返し実行する。そして、処理流れ実行部１７０は、Ｘ方向のＦＦＴ処理が完了すると、処理を終了する。
【０１９２】
次に、図３５で例示したＦＦＴ逆変換の全体処理における各軸方向のＦＦＴ計算の手順を説明する。以下では、Ｚ方向に着目して説明するが、Ｙ方向についても、Ｚ方向と同様の手順により処理できる。
【０１９３】
図３６は、第３の実施の形態のＺ方向逆変換の例を示すフローチャートである。以下、図３６に示す処理をステップ番号に沿って説明する。以下に示す手順は、図３５のステップＳ９２〜Ｓ９６に相当する。処理流れＲ１ｂの処理を入出力処理部１７１、通信処理部１７２およびＦＦＴ処理部１７３により実行し、処理流れＲ２ｂの処理を入出力処理部１７１ａ、通信処理部１７２ａおよびＦＦＴ処理部１７３ａにより実行するものとする。
【０１９４】
（Ｓ１１１）制御部１６０は、Ｚ方向処理での区分サイズを決定する。
（Ｓ１１２）入出力処理部１７１は、ローカル配列Ａの区分サイズのデータを送信バッファａに転置コピーする（転置ｉｎ）。ここで、作業域Ａ１，Ａ２，Ａ３は、バッファａ，ｂ，ｃの何れかに割り当てられる。初期状態では、バッファａは作業域Ａ１に相当し、バッファｂは作業域Ａ２に相当し、バッファｃは作業域Ａ３に相当する。
【０１９５】
（Ｓ１１３）ＦＦＴ処理部１７３は、バッファａのデータに対してＦＦＴ計算を行う。
（Ｓ１１４）通信処理部１７２は、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファａからデータを送信し、バッファｂによりデータを受信することでデータ配置を戻す。
【０１９６】
（Ｓ１１５）入出力処理部１７１ａは、ローカル配列Ａの区分サイズのデータをバッファｃに転置コピーする（転置ｉｎ）。通信処理部１７２および入出力処理部１７１ａは、ステップＳ１１４，Ｓ１１５を同期して実行開始する。
【０１９７】
（Ｓ１１６）ＦＦＴ処理部１７３ａは、バッファｃのデータに対してＦＦＴ計算を行う。
（Ｓ１１７）入出力処理部１７１は、受信したバッファｂのデータをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。
【０１９８】
（Ｓ１１８）通信処理部１７２ａは、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファｃからデータを送信し、バッファａによりデータを受信することでデータ配置を戻す。入出力処理部１７１および通信処理部１７２ａは、ステップＳ１１７，Ｓ１１８を同期して実行開始する。
【０１９９】
（Ｓ１１９）入出力処理部１７１は、ローカル配列Ａの区分サイズのデータをバッファｂに転置コピーする（転置ｉｎ）。
（Ｓ１２０）ＦＦＴ処理部１７３は、バッファｂのデータに対してＦＦＴ計算を行う。
【０２００】
（Ｓ１２１）入出力処理部１７１，１７１ａは、ａ，ｂ，ｃに対するバッファ割当てをサイクリックに交換する。具体的には、バッファａに相当する作業域をバッファｂに変える。バッファｂに相当する作業域をバッファｃに変える。バッファｃに相当する作業域をバッファａに変える。
【０２０１】
（Ｓ１２２）通信処理部１７２は、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファｃからデータを送信し、バッファａによりデータを受信することでデータ配置を戻す。
（Ｓ１２３）入出力処理部１７１ａは、受信したバッファｂのデータをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。通信処理部１７２および入出力処理部１７１ａは、ステップＳ１２２，Ｓ１２３を同期して実行開始する。
【０２０２】
（Ｓ１２４）入出力処理部１７１ａは、ローカル配列Ａの区分サイズのデータをバッファｂに転置コピーする（転置ｉｎ）。
（Ｓ１２５）ＦＦＴ処理部１７３ａは、バッファｂのデータに対してＦＦＴ計算を行う。
【０２０３】
（Ｓ１２６）入出力処理部１７１，１７１ａは、ａ，ｂ，ｃに対するバッファ割当てをサイクリックに交換する。具体的には、バッファａに相当する作業域をバッファｂに変える。バッファｂに相当する作業域をバッファｃに変える。バッファｃに相当する作業域をバッファａに変える。そして、未処理の区分データがなくなるまで、処理流れＲ１ｂの処理をステップＳ１１７へ進め、処理流れＲ２ｂの処理をステップＳ１１８へ進める。ローカル配列Ａにおいて未処理の区分データがなくなると、処理をステップＳ１２７へ進める。
【０２０４】
図３７は、第３の実施の形態のＺ方向逆変換の例（続き）を示すフローチャートである。以下、図３７に示す処理をステップ番号に沿って説明する。
（Ｓ１２７）入出力処理部１７１は、受信したバッファｂのデータをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。これにより、処理流れＲ１ｂが完了する。
【０２０５】
（Ｓ１２８）通信処理部１７２ａは、ａｌｌ‐ｔｏ‐ａｌｌ通信を行い、バッファｃからデータを送信し、バッファａによりデータを受信することでデータ配置を戻す。
（Ｓ１２９）入出力処理部１７１ａは、受信したバッファａのデータをローカル配列Ａの元区分の位置に転置コピーする（転置ｏｕｔ）。これにより、処理流れＲ２ｂが完了する。なお、ステップＳ１２７〜Ｓ１２９までがループ終端処理となる。そして、Ｚ方向のＦＦＴ計算処理（逆変換）が完了する。
【０２０６】
このように、第３の実施の形態でも、第２の実施の形態と同様に、３つの作業域Ａ１，Ａ２，Ａ３を用いて、２つの処理流れで利用バッファの競合が発生しないように制御しながら、通信と演算の並行処理を実現できる。
【０２０７】
これにより、第３の実施の形態においても、第２の実施の形態と同様に、作業域配列として使用するメモリの削減を可能とし、かつ、キャッシュ利用効率を向上させて高速にＦＦＴ計算を行えるようになる。
【０２０８】
なお、第１の実施の形態の情報処理は、演算部１２にプログラムを実行させることで実現できる。また、第２，第３の実施の形態の情報処理は、ＣＰＵ１１０，１２０にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体３３に記録できる。計算ノード１００，１００ａ，１００ｂ，１００ｃ，・・・それぞれを、メモリとプロセッサとを有するコンピュータと考えることができる。
【０２０９】
例えば、プログラムを記録した記録媒体３３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータ（例えば、データ格納サーバ３００）に格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体３３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１３０などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【０２１０】
１  並列計算機
１０，１０ａ，１０ｂ  ノード
１１  記憶部
１１ａ  第１記憶領域
１１ｂ  第２記憶領域
１１ｃ  第３記憶領域
１２  演算部
【図１】
0006666548.tif 000007
【図２】
0006666548.tif 000008
【図３】
0006666548.tif 000009
【図４】
0006666548.tif 000010
【図５】
0006666548.tif 000011
【図６】
0006666548.tif 000012
【図７】
0006666548.tif 000013
【図８】
0006666548.tif 000014
【図９】
0006666548.tif 000015
【図１０】
0006666548.tif 000016
【図１１】
0006666548.tif 000017
【図１２】
0006666548.tif 000018
【図１３】
0006666548.tif 000019
【図１４】
0006666548.tif 000020
【図１５】
0006666548.tif 000021
【図１６】
0006666548.tif 000022
【図１７】
0006666548.tif 000023
【図１８】
0006666548.tif 000024
【図１９】
0006666548.tif 000025
【図２０】
0006666548.tif 000026
【図２１】
0006666548.tif 000027
【図２２】
0006666548.tif 000028
【図２３】
0006666548.tif 000029
【図２４】
0006666548.tif 000030
【図２５】
0006666548.tif 000031
【図２６】
0006666548.tif 000032
【図２７】
0006666548.tif 000033
【図２８】
0006666548.tif 000034
【図２９】
0006666548.tif 000035
【図３０】
0006666548.tif 000036
【図３１】
0006666548.tif 000037
【図３２】
0006666548.tif 000038
【図３３】
0006666548.tif 000039
【図３４】
0006666548.tif 000040
【図３５】
0006666548.tif 000041
【図３６】
0006666548.tif 000042
【図３７】
0006666548.tif 000043