(57)【特許請求の範囲】
【請求項１】
データを複数のプロセッサのメモリに分散配置し、プロセッサ間でデータ転送を行いながら高速フーリエ変換を実行することのできるメモリ分散型並列計算機システムにおいて、
実数データを、第１次元と第２次元からなる第１の２次元配列として入力する入力手段と、
前記第１の２次元配列の第１次元をプロセッサ数で分割して、第１次元が偶数であるような複数の部分配列を生成し、該複数の部分配列を前記複数のプロセッサに分散して記憶する配列記憶手段と、
前記複数の部分配列の各々を前記第１次元で２つに分割して得られる第１のデータと第２のデータのうち、該第１のデータを記憶する第１の記憶手段と、
前記第２のデータを記憶する第２の記憶手段と、
２次元配列を転置する転置手段と
前記配列記憶手段から前記第１のデータおよび第２のデータを前記第１の記憶手段および第２の記憶手段に移し、該第１のデータを実部、該第２のデータを虚部とみなして前記第２次元についての複素フーリエ変換を各プロセッサ内で行い、該複素フーリエ変換の第１の変換結果から前記第１の２次元配列の第２次元についての実フーリエ変換の変換結果の一部を求め、該変換結果の一部の実部および虚部からなる第２の２次元配列を前記配列記憶手段に格納する計算手段と、
出力手段を備え、
前記転置手段は、該配列記憶手段に格納された該第２の２次元配列を転置して前記第１の記憶手段および第２の記憶手段に格納することにより、前記変換結果の一部の実部および虚部をそれぞれ該第１の記憶手段および第２の記憶手段に格納し、
前記計算手段は該第１の記憶手段および第２の記憶手段のデータを用いて、該第２の２次元配列の第１次元についての複素フーリエ変換を各プロセッサ内で行って前記実数データのフーリエ変換の第２の変換結果を求め、
前記出力手段は該第２の変換結果を出力することを特徴とする並列計算機。
【請求項２】
前記転置手段は、前記第２の２次元配列をブロック単位に分割して、プロセッサ間で該ブロック単位の並列データ転送を行うことにより、該第２の２次元配列を転置することを特徴とする請求項１記載の並列計算機。
【請求項３】
前記転置手段は、前記第２の２次元配列の第１次元についての複素フーリエ変換の結果得られる第３の２次元配列を再び転置し、前記第２の変換結果として前記配列記憶手段に格納することを特徴とする請求項１記載の並列計算機。
【請求項４】
前記入力手段は、前記実数データが１次元データのとき、該１次元データを前記第１の２次元配列の形式に変換して入力することを特徴とする請求項１記載の並列計算機。
【請求項５】
前記実フーリエ変換変換結果の一部に回転因子を乗算し、乗算結果の実部および虚部からなる第２の２次元配列を前記配列記憶手段に格納し、前記転置手段は、該配列記憶手段に格納された該第２の２次元配列を転置して前記第１の記憶手段および第２の記憶手段に格納することにより、前記変換結果の一部の実部および虚部をそれぞれ該第１の記憶手段および第２の記憶手段に格納し、前記計算手段は、該第１の記憶手段および第２の記憶手段のデータを用いて、該第２の２次元配列の第１次元についての複素フーリエ変換を各プロセッサ内で行い、前記第２の変換結果を求めることを特徴とする請求項４記載の並列計算機。
【請求項６】
データを複数のプロセッサのメモリに分散配置し、プロセッサ間でデータ転送を行いながら高速フーリエ変換を実行することのできるメモリ分散型並列計算機システムにおいて、
実数データを、第１次元と第２次元を有する第１の多次元配列として入力する入力手段と、
前記第１の多次元配列の第１次元をプロセッサ数で分割して、第１次元が偶数であるような複数の部分配列を生成し、該複数の部分配列を前記複数のプロセッサに分散して記憶する配列記憶手段と、
前記複数の部分配列の各々を前記第１次元で２つに分割して得られる第１のデータと第２のデータのうち、該第１のデータを記憶する第１の記憶手段と、
前記第２のデータを記憶する第２の記憶手段と、
２次元配列を転置する転置手段と
前記配列記憶手段から前記第１のデータおよび第２のデータを前記第１の記憶手段および第２の記憶手段に移し、該第１のデータを実部、該第２のデータを虚部とみなして前記第２次元についての複素フーリエ変換を各プロセッサ内で行い、該複素フーリエ変換の第１の変換結果から前記第１の２次元配列の第２次元についての実フーリエ変換の変換結果の一部を求め、該変換結果の一部の実部および虚部からなる第２の２次元配列を前記配列記憶手段に格納する計算手段と、
出力手段を備え、
前記転置手段は、該配列記憶手段に格納された該第２の２次元配列を転置して前記第１の記憶手段および第２の記憶手段に格納することにより、前記変換結果の一部の実部および虚部をそれぞれ該第１の記憶手段および第２の記憶手段に格納し、
前記計算手段は該第１の記憶手段および第２の記憶手段のデータを用いて、該第２の２次元配列の第１次元についての複素フーリエ変換を各プロセッサ内で行って前記実数データのフーリエ変換の第２の変換結果を求め、
前記出力手段は該第２の変換結果を出力することを特徴とする並列計算機。
【請求項７】
データを複数のプロセッサのメモリに分散配置し、プロセッサ間でデータ転送を行いながら高速フーリエ変換を実行することのできるメモリ分散型並列計算機システムを構成するプロセッサであって、
第１次元と第２次元を有する多次元配列の形式で入力された実数データのうち、該第１次元をプロセッサ数で分割して割り当てられた部分データを記憶するための、第１次元が偶数であるような格納領域を有する配列記憶手段と、
前記格納領域に記憶された前記部分データを前記第１次元で２つに分割して得られる第１のデータと第２のデータのうち、該第１のデータを記憶する第１の記憶手段と、
前記第２のデータを記憶する第２の記憶手段と、
２次元配列を転置する転置手段と
前記配列記憶手段から前記第１のデータおよび第２のデータを前記第１の記憶手段および第２の記憶手段に移し、該第１のデータを実部、該第２のデータを虚部とみなして前記第２次元についての複素フーリエ変換を行い、該複素フーリエ変換の第１の変換結果から前記第１の２次元配列の第２次元についての実フーリエ変換の変換結果の一部を求め、該変換結果の一部の実部および虚部からなる第２の２次元配列を前記配列記憶手段に格納する計算手段を備え、
前記転置手段は、該配列記憶手段に格納された該第２の２次元配列を転置して前記第１の記憶手段および第２の記憶手段に格納することにより、前記変換結果の一部の実部および虚部をそれぞれ該第１の記憶手段および第２の記憶手段に格納し、
前記計算手段は該第１の記憶手段および第２の記憶手段のデータを用いて、該第２の２次元配列の第１次元についての複素フーリエ変換を行って前記実数データのフーリエ変換を求めることを特徴とするプロセッサ。
【請求項８】
データを複数のプロセッサのメモリに分散配置し、プロセッサ間でデータ転送を行いながら高速フーリエ変換を実行することのできるメモリ分散型並列計算機システムにおいて、
長さＮ＝ｐ×ｑの１次元データをｐ×ｑの第１の２次元配列とみなし、該第１の２次元配列を第１次元で分割して、各プロセッサ内の第１次元の大きさが偶数になるように分散配置する配列記憶手段と、
各プロセッサで前記２次元配列と見なされ分散配置されたデータの大きさが偶数の第１次元を２等分してできる第２次元のベクトルのペアを複素数とみなして、複素フーリエ変換を行い、変換結果から実フーリエ変換の（ｑ／２＋１）部分を計算した後、ローテーション演算を行う第１の計算手段と、
前記ローテーション演算の結果を、第１次元を分割配置した（ｑ／２＋１）×ｐの第２の２次元配列に転置する転置手段と、
該第２の２次元配列の長さｐの第２次元のベクトルに対する１次元複素フーリエ変換を各プロセッサで並列に行って、前記１次元データの実フーリエ変換の結果を求める第２の計算手段とを備えることを特徴とする並列計算機。
【請求項９】
データを複数のプロセッサのメモリに分散配置し、プロセッサ間でデータ転送を行いながら高速フーリエ変換を実行することのできるメモリ分散型並列計算機システムにおいて、
（ｐ，ｑ）の大きさの２次元データをｐ×ｑの第１の２次元配列に入力し、該第１の２次元配列を第１次元で分割して、各プロセッサ内の第１次元の大きさが偶数になるように分散配置する配列記憶手段と、
各プロセッサで前記分散配置された２次元データの大きさが偶数の第１次元を２等分してできる第２次元のベクトルのペアを複素数とみなして、複素フーリエ変換を行い、変換結果から実フーリエ変換の（ｑ／２＋１）部分を計算する第１の計算手段と、
前記第１の計算手段による計算結果を、第１次元を分割配置した（ｑ／２＋１）×ｐの第２の２次元配列に転置する第１の転置手段と、
該第２の２次元配列の長さｐの第２次元のベクトルに対する１次元複素フーリエ変換を各プロセッサで並列に行う第２の計算手段と、
該第２の２次元配列の変換結果を、第１次元を分割配置したｐ×（ｑ／２＋１）の配列に転置することにより、前記２次元データの実フーリエ変換の（ｐ，ｑ／２＋１）部分を求める第２の転置手段とを備えることを特徴とする並列計算機。
【請求項１０】
データを複数のプロセッサのメモリに分散配置し、プロセッサ間でデータ転送を行いながら高速フーリエ変換を実行することのできるメモリ分散型並列計算機システムにおいて、
（ｐ，ｑ，ｒ）の大きさの３次元データをｐ×ｑ×ｒの第１の３次元配列に入力し、該第１の３次元配列を第１次元で分割して、各プロセッサ内の第１次元の大きさが偶数になるように分散配置する配列記憶手段と、
各プロセッサで前記分散配置された３次元データの大きさが偶数の第１次元を２等分してできる第３次元のベクトルのペアを複素数とみなして、複素フーリエ変換を行い、変換結果から実フーリエ変換の（ｒ／２＋１）部分を計算した後、第２次元のベクトルに対するフーリエ変換を各プロセッサで並列に行う第１の計算手段と、
前記第１の計算手段による計算結果を、第１次元を分割配置した（ｒ／２＋１）×ｑ×ｐの第２の３次元配列に転置する第１の転置手段と、
該第２の３次元配列の長さｐの第３次元のベクトルに対する１次元複素フーリエ変換を各プロセッサで並列に行う第２の計算手段と、
該第２の３次元配列の変換結果を、第１次元を分割配置したｐ×ｑ×（ｒ／２＋１）の配列に転置することにより、前記３次元データの実フーリエ変換の（ｐ，ｑ，ｒ／２＋１）部分を求める第２の転置手段とを備えることを特徴とする並列計算機。
【請求項１１】
データを複数のプロセッサのメモリに分散配置し、プロセッサ間でデータ転送を行いながら高速フーリエ変換を、メモリ分散型並列計算機システムに実行させるプログラムを記憶したコンピュータ読み取り可能な記録媒体であって、
前記プログラムは、前記メモリ分散並列計算機システムを、
実数データを、第１次元と第２次元を有する第１の多次元配列として入力する入力手段と前記第１の多次元配列の第１次元をプロセッサ数で分割して、第１次元が偶数であるような複数の部分配列を生成し、該複数の部分配列を前記複数のプロセッサに分散して配置する分散配置手段と、
前記複数の部分配列の各々を前記第１次元で２つに分割して第１のデータと第２のデータを生成し、該第１のデータを記憶する第１の記憶域と該第２のデータを記憶する第２の記憶域とを割り当てる割り当て手段と、
２次元配列を転置する転置手段と
前記配列記憶手段から前記第１のデータおよび第２のデータを前記第１の記憶手段および第２の記憶手段に移し、該第１のデータを実部、該第２のデータを虚部とみなして前記第２次元についての複素フーリエ変換を各プロセッサ内で行い、該複素フーリエ変換の第１の変換結果から前記第１の２次元配列の第２次元についての実フーリエ変換の変換結果の一部を求め、該変換結果の一部の実部および虚部からなる第２の２次元配列を前記配列記憶手段に格納する計算手段と、
出力手段として動作させ、
前記転置手段は、該配列記憶手段に格納された該第２の２次元配列を転置して前記第１の記憶手段および第２の記憶手段に格納することにより、前記変換結果の一部の実部および虚部をそれぞれ該第１の記憶手段および第２の記憶手段に格納し、
前記計算手段は該第１の記憶手段および第２の記憶手段のデータを用いて、該第２の２次元配列の第１次元についての複素フーリエ変換を各プロセッサ内で行って前記実数データのフーリエ変換の第２の変換結果を求め、
前記出力手段は該第２の変換結果を出力することを特徴とするコンピュータ読み取り可能な記録媒体。
【請求項１２】
メモリ分散型並列計算機システムにおいて、データを複数のプロセッサのメモリに分散配置し、プロセッサ間でデータ転送を行いながら高速フーリエ変換を実行する方法であって、
実数データを、第１次元と第２次元を有する第１の多次元配列として入力し、
前記第１の多次元配列の第１次元をプロセッサ数で分割して、第１次元が偶数であるような複数の部分配列を生成し、該複数の部分配列を前記複数のプロセッサに分散して配置し、
前記複数の部分配列の各々を前記第１次元で２つに分割して第１のデータと第２のデータを生成し、
該第１のデータおよび第２のデータを第１の記憶域および第２の記憶域に移し、
該第１のデータを実部、該第２のデータを虚部とみなして前記第２次元についての複素フーリエ変換を各プロセッサ内で行い、
該複素フーリエ変換の第１の変換結果から前記第１の２次元配列の第２次元についての実フーリエ変換の変換結果の一部を求め、該変換結果の一部の実部および虚部からなる第２の２次元配列を前記配列記憶手段に格納し、
該配列記憶手段に格納された該第２の２次元配列を転置して前記第１の記憶手段および第２の記憶手段に格納することにより、前記変換結果の一部の実部および虚部をそれぞれ該第１の記憶手段および第２の記憶手段に格納し、
該第１の記憶手段および第２の記憶手段のデータを用いて、該第２の２次元配列の第１次元についての複素フーリエ変換を各プロセッサ内で行って、前記実数データのフーリエ変換の第２の変換結果を求めることを特徴とするフーリエ変換処理方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は高速フーリエ変換を行うメモリ分散型並列計算機システム、およびフーリエ変換処理方法に関する。
【０００２】
【従来の技術とその問題点】
今日、科学技術計算等において、大規模な高速フーリエ変換（ＦＦＴ：Fast Fourier Transformation ）を計算するために、並列計算機システムがよく用いられている。ＦＦＴは、離散型フーリエ変換における項数がいくつかの因数に分解できる時、その性質を利用して必要な演算回数を削減した計算アルゴリズムである。特に、大規模な実フーリエ変換をＶＰＰ５００等のベクトル分散並列計算機で行うとき、その性能を最大限に引き出すために、データ転送が少なく一括して計算できる方法が望まれている。
【０００３】
従来の並列計算機によるＦＦＴ処理においては、フーリエ変換の度に、複数のプロセッシング・エレメント（以後、ＰＥ、またはプロセッサと記す）に分散したデータをアクセスする必要がある。このため、多量のデータ転送が行われ、処理効率が低下するという問題が生じる。
【０００４】
実数のフーリエ変換を行うには、複素フーリエ変換の虚部を０として計算する方法と、２つの実数をそれぞれ複素数の実部、虚部とみなして、複素フーリエ変換を行う方法の２つがある。後者は、前者に比べて使用するメモリ量が約半分で済むという利点がある。これは、フーリエ変換した結果の複素数の中に共役関係を持つペアがあり、求めるべきデータを約半分に減らすことができることを利用したためである。
【０００５】
実際には、変換される実数を複数の列に並べて、偶数列と奇数列（または偶数行と奇数行）のデータをそれぞれ実部および虚部とみなして複素フーリエ変換を行っており、最後に、その結果から必要な約半分の実フーリエ変換の結果を作り出している。残りの半分の結果は、共役関係を利用して求めることができる。しかしながら、偶数列と奇数列（または偶数行と奇数行）のデータは必ずしも同じプロセッサに格納されるとは限らず、フーリエ変換のアクセスパターンが全プロセッサにまたがるため、多量のデータ転送が必要となる。
【０００６】
並列計算機においてはデータ転送に伴うオーバヘッドが大きいため、このような多量のデータ転送が生じると、ベクトル処理および並列処理の効率が悪くなる。
【０００７】
本発明は、少ないデータ転送で効率良く実ＦＦＴを実行することのできるメモリ分散型並列計算機システムと、その方法を提供することを目的とする。
【０００８】
【問題を解決するための手段】
図１は、本発明の並列計算機システムの原理図である。図１の並列計算機システムは、データを複数のプロセッサのメモリに分散配置し、プロセッサ間でデータ転送を行いながら高速フーリエ変換を実行することのできるメモリ分散型並列計算機システムであって、入力手段１、配列記憶手段２、第１の記憶手段３、第２の記憶手段４、計算手段５、転置手段６、および出力手段７を備える。
【０００９】
入力手段１は、実数データを、第１次元と第２次元からなる第１の２次元配列として入力する。
配列記憶手段２は、第１の２次元配列の第１次元をプロセッサ数で分割して、第１次元が偶数であるような複数の部分配列を生成し、それらの複数の部分配列を上記複数のプロセッサに分散して記憶する。
【００１０】
第１の記憶手段３は、上記複数の部分配列の各々を第１次元で２つに分割して得られる第１のデータと第２のデータのうち、第１のデータを記憶し、第２の記憶手段４は第２のデータを記憶する。
【００１１】
計算手段５は、配列記憶手段２から第１のデータおよび第２のデータを第１の記憶手段３および第２の記憶手段４に移し、第１のデータを実部、第２のデータを虚部とみなして第２次元についての複素フーリエ変換を各プロセッサ内で行い、その複素フーリエ変換の第１の変換結果を求める。そして、第１の変換結果を利用して、上記実数データのフーリエ変換の第２の変換結果を求める。
【００１２】
出力手段７は、上記第２の変換結果を出力する。
また、計算手段５は、上記第１の２次元配列の第２次元についての実フーリエ変換の第３の変換結果の一部を、上記第１の変換結果から求めて、その第３の変換結果の一部の実部および虚部からなる第２の２次元配列を配列記憶手段２に格納する。このとき、転置手段６は、配列記憶手段２に格納された第２の２次元配列を転置して第１の記憶手段３および第２の記憶手段４に格納することにより、上記第３の変換結果の一部の実部および虚部をそれぞれ第１の記憶手段３および第２の記憶手段４に格納する。そして、計算手段５は、第１の記憶手段３および第２の記憶手段４のデータを用いて、第２の２次元配列の第１次元についての複素フーリエ変換を各プロセッサ内で行い、その結果から上記第２の変換結果を求める。
【００１３】
例えば、図１の入力手段１と出力手段７は、実施例における図２の入出力装置１３に対応し、配列記憶手段２、第１の記憶手段３、第２の記憶手段４は、各プロセッサ１１−１、１１−２、・・・、１１−Ｍ内のメモリ１６に対応する。また、計算手段５と転置手段６は、各プロセッサ１１−１、１１−２、・・・、１１−Ｍ内の処理部１５に対応する。さらに、例えば、これらの各手段の機能をプログラム化して記憶したディスク装置等の記憶媒体もまた、これらの各手段に対応する。
【００１４】
【作用】
入力手段１が入力した２次元実数データが、第１の２次元配列として、配列記憶手段２により複数のプロセッサに分散配置される。２次元実フーリエ変換を行うには、この第１の２次元配列を第１次元および第２次元についてそれぞれフーリエ変換すればよい。このとき、第１の２次元配列の第１次元の大きさを、例えば（２×プロセッサ数）の倍数とし、それをプロセッサ数で分割したときに、各プロセッサ内の部分配列の第１次元が偶数になるようにしておく。これにより、各部分配列を第１次元で２つに分割して格納することが可能になる。第１の記憶手段３は、各プロセッサ毎に、各部分配列を分割した２つデータのうち第１のデータを記憶し、第２の記憶手段４は第２のデータを記憶する。
【００１５】
計算手段５は、第１の記憶手段３内の第１のデータを複素数の実部とみなし、第２の記憶手段４内の第２のデータを虚部とみなして、各プロセッサ内で複素数のフーリエ変換を行うことができる。これにより、分割されていない第２次元についての複素フーリエ変換が各プロセッサ内で行われ、第１の変換結果が得られる。第１のデータおよび第２のデータのそれぞれの第２次元についての実フーリエ変換の結果は、第１の変換結果から容易に得ることができ、次に第１次元についての複素フーリエ変換を行えば、上記実数データの２次元フーリエ変換の結果である第２の変換結果が得られる。
【００１６】
このように、入力された２次元データを各プロセッサ内で２つの部分に分け、一方を実部、他方を虚部とみなすことにより、２組の実数データをまとめてフーリエ変換することができる。このとき、計算は各プロセッサ内で閉じて行われるため、データ転送に要する時間が節約され、処理が効率化される。
【００１７】
尚、入力データが１次元実数データの場合は、これを２次元データに変換して配列記憶手段２に記憶させることにより、２次元データと同様に処理することが可能である。この場合は、第１次元についての複素フーリエ変換を行う前に、各プロセッサ内でローテーションの計算を行えばよい。また、３次元以上の次元の実数データのフーリエ変換についても、基本的には２次元データと同様の手法により処理することができる。
【００１８】
また、第１の変換結果から第２の変換結果を得る時、計算手段５は、まず第１の２次元配列の第２次元についての実フーリエ変換の結果である第３の変換結果を、第１の変換結果から求める。このとき、第３の変換結果には一般に特定の共役関係があり、これを利用すれば、第３の変換結果の約半分は他の部分から計算できることが知られている。したがって、第３の変換結果については、その一部分（約半分）のみを求めればよい。求めた第３の変換結果の一部の実部および虚部は、第２の２次元配列として配列記憶手段２に格納される。
【００１９】
しかし、このままでは、第２の２次元配列の第１次元が複数のプロセッサにまたがって配置されているため、残された第１次元についてのフーリエ変換を各プロセッサ内で閉じて行うことができない。そこで、転置手段６が第２の２次元配列を転置して、第１の記憶手段３および第２の記憶手段４に格納する。これにより、第３の変換結果の一部の実部および虚部が、それぞれ第１の記憶手段３および第２の記憶手段４に格納される。計算手段は、これらを１組の複素数として、第２の２次元配列の第１次元についての複素フーリエ変換を各プロセッサ内で行い、最終的に第２の変換結果を求める。得られた第２の変換結果は、入力された２次元実数データのフーリエ変換の結果を与えている。
【００２０】
このように、第２次元についてのフーリエ変換の後に２次元配列を転置すれば、第１次元についてのフーリエ変換も複数のプロセッサで並列に処理することができる。１次元実数データの場合は、配列記憶手段２に格納された第２の２次元配列に対してローテーションの計算が行われ、その結果が転置されて、第１次元についてのフーリエ変換が行われる。
【００２１】
【実施例】
以下、図面を参照しながら本発明の実施例を詳細に説明する。
図２は、実施例における並列計算機システムの構成図である。図２の並列計算機システムは、ネットワーク１２により結合された複数のプロセッサ１１−１、１１−２、・・・、１１−Ｍからなり、ネットワーク１２に接続された入出力装置１３を備える。ネットワーク１２は、任意の２つのプロセッサ間でデータ転送を行えるように設計されており、例えばクロスバー・ネットワークである。入出力装置１３は、例えばディスプレイやキーボードを備えた端末装置であり、フーリエ変換されるデータを入力し、変換結果を出力する。
【００２２】
また、各プロセッサ１１−１、１１−２、・・・、１１−Ｍは、それぞれ通信部１４、処理部１５、メモリ１６、およびそれらを接続する内部バス１７を備える。通信部１４は、ネットワーク１２を介して、他のプロセッサや入出力装置１３との間でデータ転送を行う。メモリ１６は、各プロセッサに割り当てられたデータや他のプロセッサから転送されたデータを記憶する。処理部１５は、メモリ１６に記憶されたデータを用いて、演算等の処理を行う。
【００２３】
本実施例においては、図２の並列計算機システムにより行われる１次元、２次元、および３次元のフーリエ変換処理について順に説明する。最初に、フーリエ変換に必要となる数学的な前提について述べる。
【００２４】
１次元の離散フーリエ変換は次式で与えられる。
【００２５】
【数１】
0003675537.tif 000002
【００２６】
ただし、
ωN ≡ｅｘｐ（−２πｉ／Ｎ）                                …（２）
とする。今、Ｎ＝ｐ・ｑと因数分解できるとすると、
ｎ＝ｎ１＋ｎ２・ｐ，                                        …（３）
（ｎ１＝０，１，．．．，ｐ−１，ｎ２＝０，１，．．．，ｑ−１）
ｊ＝ｊ１＋ｊ２・ｑ，                                        …（４）
（ｊ１＝０，１，．．．，ｑ−１，ｊ２＝０，１，．．．，ｐ−１）
ｘ（ｎ１，ｎ２）＝ｘn ，                                    …（５）
ｆ（ｊ１，ｊ２）＝ｆj                                       …（６）
とおくことができる。（３）、（４）、（５）、（６）式を（１）式に代入して、ｎについての和をｎ１とｎ２についての和に書き換えると、
【００２７】
【数２】
0003675537.tif 000003
【００２８】
となる。このように、離散フーリエ変換の項数Ｎが適当な因数に分解できるときには、１次元のデータを２次元データとみなして処理することができる。並列計算機による処理においては、例えばｘ（ｎ１，ｎ２）の第１次元を複数のプロセッサに分割して配置する。このとき、（７）式は次の４段の処理に分けられる。
【００２９】
【数３】
0003675537.tif 000004
【００３０】
（８）式は２次元配列ｘ（ｎ１，ｎ２）の添字ｎ２についてのフーリエ変換を表し、（９）式はＹ１（ｎ１，ｊ１）に回転因子ωN n1j1を乗算する計算（ローテーション）を表し、（１０）式は２次元配列Ｙ２（ｎ１，ｊ１）の転置を表し、（１１）式はＹ３（ｊ１，ｎ１）の添字ｎ１についてのフーリエ変換を表す。第３段で転置を行うのは、常に２次元配列の第２次元についてのフーリエ変換を行うようにするためである。ここでは、２次元配列の第２次元は分割されていないので、第２次元についてのフーリエ変換は各プロセッサ内で独立に行うことができる。
【００３１】
次に、実１次元フーリエ変換を複素フーリエ変換と組み合わせて行う方法について説明する。変換すべき実データを｛ｘ１n ｝と｛ｘ２n ｝（ｎ＝０，．．．，Ｑ−１）とに分け、それぞれを複素数の実部と虚部とみなして、
ｚn ＝ｘ１n ＋ｉｘ２n                                     …（１２）
とおく。また、ｚn 、ｘ１n 、ｘ２n のフーリエ変換の結果を、それぞれ｛αz j ｝、｛αx1j ｝、｛αx2j ｝とおくと、
【００３２】
【数４】
0003675537.tif 000005
【００３３】
となる。（１４）、（１５）式のαx1j 、αx2j は、（１３）式のαz j を用いて、次のように表される。
【００３４】
【数５】
0003675537.tif 000006
【００３５】
ここで、α* はαの複素共役を表し、Ｒｅ（α）、Ｉｍ（α）はそれぞれαの実部、虚部を表す。したがって、｛αz j ｝が求まれば、（１６）、（１７）式に従って｛αx1j ｝、｛αx2j ｝を計算することができるが、実フーリエ変換の結果には、
αx1Q-j ＝（αx1j ）* ，  ｊ＝１，．．．，Ｑ−１          …（２０）
αx2Q-j ＝（αx2j ）* ，  ｊ＝１，．．．，Ｑ−１          …（２１）
なる共役関係があるため、すべてのｊについてαx1j 、αx2j を求める必要はない。実際には、最初の（Ｑ／２＋１）個のαx1j とαx2j について、実フーリエ変換の結果を求めれば充分である。ただし、Ｑ／２はＱを２で割った時の整数商（剰余は切り捨て）を表す。以下、特に断らない限り、数式に現れる除算は整数商を表すものとする。
【００３６】
以上の知識を前提として、１次元実ＦＦＴの方法を説明する。図３は、Ｎ＝ｐ・ｑと分解できるＮ個の実数を（１）式に従って変換する１次元実ＦＦＴのフローチャートである。図３において処理が開始されると、まず入出力装置１３は与えられた１次元データを取り込み、それをＮ＝ｐ×ｑの２次元配列とみなして、各プロセッサ（ＰＥ）に所定数の行ベクトルを均等に割り当てる（ステップＳ１）。割当てられた行ベクトルは、各プロセッサのメモリ１６に格納される。
【００３７】
図４は、このときの２次元データを格納する２次元格納配列Ａの分割方法を示している。図４では、簡単のためプロセッサ数を４（ＰＥ１、ＰＥ２、ＰＥ３、ＰＥ４）としているが、より一般的にはそれをｐｒｏｃと書くことにする。このとき、Ａの第１次元（行の次元）の大きさｓ１を、
ｓ１＝２×ｐｒｏｃ×ｋ１，                                …（２２）
ｋ１＝（ｐ＋２×ｐｒｏｃ−１）／（２×ｐｒｏｃ）          …（２３）
と定め、第１次元をｐｒｏｃ台のプロセッサにより均等に分割したとき、各プロセッサに格納される部分の行数が偶数になるようにする。また、Ａの第２次元の大きさは、
ｋ２＝（ｑ／２＋１）×２                                  …（２４）
以上とする。図４では、Ａの第２次元の大きさはｋ２となっており、配列ＡはＡ（ｓ１，ｋ２）と表される。次に、
ｋ３＝（（ｑ／２＋ｐｒｏｃ）／ｐｒｏｃ）×ｐｒｏｃ        …（２５）
として、Ａの転置用の格納配列Ｂ（２×ｋ３，ｓ１）を用意する。Ｂは同じ大きさの２つの配列ＢＲ（ｋ３，ｓ１）とＢＩ（ｋ３，ｓ１）からなる。ＢＲ、ＢＩの第１次元の大きさｋ３は、Ａの第２次元の大きさｋ２の半分をｐｒｏｃ台のプロセッサで分割できるように、ｋ２／２＝（ｑ／２＋１）を修正したものである。したがって、
２×ｋ３≧ｋ２＝（ｑ／２＋１）×２                        …（２６）
なる関係がある。
【００３８】
そして、Ａ（ｓ１，ｋ２）、ＢＲ（ｋ３，ｓ１）、ＢＩ（ｋ３，ｓ１）の第１次元を各プロセッサで均等に分割し、分割された各プロセッサの部分をａ（２×ｋ１，ｋ２）、ｂｒ（ｋ３／ｐｒｏｃ，ｓ１）、ｂｉ（ｋ３／ｐｒｏｃ，ｓ１）とする。
【００３９】
次に、各プロセッサ内で、（８）式に対応する１段目の処理を並列に行う。ただし、このときメモリの使用領域を節約するために、各プロセッサに割り当てられた行ベクトルを前半と後半の２組に分け、一方を実部、他方を虚部として、複素数のフーリエ変換を行う。
【００４０】
まず、各プロセッサは行ベクトルのペアを作り、一方を実部、他方を虚部として別々の領域に格納する（ステップＳ２）。具体的には、格納領域ｂｒ、ｂｉをそれぞれ格納配列ｂｒ（ｋ１，２×ｋ３）、ｂｉ（ｋ１，２×ｋ３）として利用し、ａ（１：ｋ１，ｋ２）をｂｒ（ｋ１，１：ｋ２）にコピーし、ａ（ｋ１＋１：２×ｋ１，ｋ２）をｂｉ（ｋ１，１：ｋ２）にコピーする。
【００４１】
図４では、４台のプロセッサＰＥ１、ＰＥ２、ＰＥ３、ＰＥ４の各々に割り当てられたａ（２×ｋ１，ｋ２）が、前半部分と後半部分に分割されている。ＰＥ１のデータはＲ１とＩ１に分けられ、ＰＥ２のデータはＲ２とＩ２に分けられ、ＰＥ３のデータはＲ３とＩ３に分けられ、ＰＥ４のデータはＲ４とＩ４に分けられる。そして、これらのデータが、図５に示すように、配列ＢＲ、ＢＩにコピーされる。図５において、Ｒ１、Ｒ２、Ｒ３、Ｒ４は実部としてＢＲに格納され、Ｉ１、Ｉ２、Ｉ３、Ｉ４は虚部としてＢＩに格納されている。このとき、ＢＲ、ＢＩは、それぞれＢＲ（ｓ１／２，２×ｋ３）、ＢＩ（ｓ１／２，２×ｋ３）なる配列として利用される。
【００４２】
次に、ｂｒ（ｋ１，１：ｋ２）の行ベクトルと、対応するｂｉ（ｋ１，１：ｋ２）の行ベクトルとを束ねて、各プロセッサで複素数のフーリエ変換を行う（ステップＳ３）。つまり、ｂｒ（ｋ１，１：ｋ２）の１つの行ベクトルの各要素を（１２）式のｘ１n とみなし、対応するｂｉ（ｋ１，１：ｋ２）の行ベクトルの要素を（１２）式のｘ２n とみなして、複素数ｚn に対するフーリエ変換を（１３）式により計算する。ただし、このときＱ＝ｑとする。
【００４３】
そして、（１６）〜（１９）式により、最初の（ｑ／２＋１）個の実フーリエ変換の結果を求め、その実部および虚部をそれぞれａ（２×ｋ１，１：ｑ／２＋１）およびａ（２×ｋ１，ｑ／２＋２：ｋ２）に格納する（ステップＳ４）。図６は、このときの格納方法を示している。図６において、Ａの第２次元の前半が実部に割り当てられ、後半が虚部に割り当てられていることが分かる。例えばプロセッサＰＥ１内では、図４のＲ１部分の行ベクトルの実フーリエ変換結果のうち、最初の（ｑ／２＋１）個が実際に求められ、それらの実部がＣＲ１に格納され、虚部がＤＲ１に格納される。また、図４のＩ１部分の行ベクトルの実フーリエ変換結果のうち、最初の（ｑ／２＋１）個が実際に求められ、それらの実部がＣＩ１に格納され、虚部がＤＩ１に格納される。他のプロセッサの領域ＣＲ２、ＤＲ２、ＣＩ２、ＤＩ２、ＣＲ３、ＤＲ３、ＣＩ３、ＤＩ３、ＣＲ４、ＤＲ４、ＣＩ４、ＤＩ４についても同様である。
【００４４】
図４、図５のような格納方法によれば、変換される複素数の実部と虚部が同じプロセッサ内にあるので、複素フーリエ変換を各プロセッサ内で独立に行うことができ、余分なデータ転送を行う必要がない。また、長さｑの実データのペアに対して、一方を実部、他方を虚部とみなして複素フーリエ変換を行った結果から、（ｑ／２＋１）個の実フーリエ変換の結果を計算する方法をベースにして、１次元のフーリエ変換を束ねて行うことで、プロセッサのベクトル性能を引き出すことができる。
【００４５】
次に、各プロセッサ内で（９）式に対応する２段目の処理を並列に行って、ローテーションを計算する（ステップＳ５）。この計算結果は再び配列Ａに格納される。
【００４６】
この後、（１０）式に対応する３段目の処理を行って、配列Ａのｐ×（ｑ／２＋１）×２のデータをブロック（小領域）に分割し、ブロックレベルで転置して配列Ｂに格納する（ステップＳ６）。このとき、格納領域ＢＲ、ＢＩはそれぞれ配列ＢＲ（ｋ３，ｓ１）、ＢＩ（ｋ３，ｓ１）として利用され、その第１次元に関して分割されている。そして、プロセッサ間のデータ転送により、Ａ（ｐ，１：ｑ／２＋１）のデータがＢＲ（１：ｑ／２＋１，ｐ）に転置され、Ａ（ｐ，ｑ／２＋２：（ｑ／２＋１）×２）のデータがＢＩ（１：ｑ／２＋１，ｐ）に転置される。
【００４７】
図７は、ステップＳ６で行われる行列の転置処理のフローチャートである。図７を参照しながら、配列Ａの実部を配列ＢＲに転置する処理について説明する。図７において処理が開始されると、まず配列Ａの実部、配列ＢＲをメッシュで区切る（ステップＳ１１）。これにより、各プロセッサ内にあるＡの実部とＢＲの部分が、それぞれプロセッサ数ｐｒｏｃに相当する数のブロックに分割される。図８は、転置前の配列Ａの実部（または虚部）の分割例を示しており、図９は、転置後のデータを格納する配列ＢＲ（またはＢＩ）の分割例を示している。
【００４８】
図８において、Ａの実部のうちプロセッサＰＥ１内にあるデータは、Ａ11、Ａ12、Ａ13、Ａ14の４つのブロックに分割されている。同様に、プロセッサＰＥ２内のデータはブロックＡ21、Ａ22、Ａ23、Ａ24に分割され、プロセッサＰＥ３内のデータはブロックＡ31、Ａ32、Ａ33、Ａ34に分割され、プロセッサＰＥ４内のデータはブロックＡ41、Ａ42、Ａ43、Ａ44に分割される。また、図９において、ＢＲのうちプロセッサＰＥ１内にあるデータは、Ｂ11、Ｂ12、Ｂ13、Ｂ14の４つのブロックに分割されている。同様に、プロセッサＰＥ２内のデータはブロックＢ21、Ｂ22、Ｂ23、Ｂ24に分割され、プロセッサＰＥ３内のデータはブロックＢ31、Ｂ32、Ｂ33、Ｂ34に分割され、プロセッサＰＥ４内のデータはブロックＢ41、Ｂ42、Ｂ43、Ｂ44に分割される。
【００４９】
次に、各プロセッサで、Ｋ＝（そのプロセッサの番号）、Ｊ＝Ｋ、＃ｃｔ＝１とおき（ステップＳ１２）、ブロックＡJKの転置行列ＡJKT を求めて、ブロックＢKJに格納する（ステップＳ１３）。ここで、ＢKJが同じプロセッサ内にあればＡJKT をそこに格納し、ＢKJが他のプロセッサ内にあるときはデータ転送を行う。そして、Ｋ＝ｍｏｄ（Ｋ，ｐｒｏｃ）＋１、＃ｃｔ＝＃ｃｔ＋１とおき（ステップＳ１４）、＃ｃｔとｐｒｏｃを比較する（ステップＳ１５）。ここで、ｍｏｄ（Ｋ，ｐｒｏｃ）は、Ｋをｐｒｏｃで割った時の剰余を意味する。＃ｃｔがｐｒｏｃを超えていなければステップＳ１３以降の処理を繰り返し、＃ｃｔがｐｒｏｃを超えると処理を終了する。
【００５０】
例えば、プロセッサＰＥ１の場合は、まず最初にＡ11T を求めて同じプロセッサ内のＢ11に格納する（ステップＳ１３）。次に、Ｋ＝ｍｏｄ（１，４）＋１＝２となるので（ステップＳ１４）、Ａ12T を求める（ステップＳ１３）。ところが、対応する格納先のＢ21はプロセッサＰＥ２内にあるため、Ａ12T をプロセッサＰＥ２に転送する。同様にして、Ａ13T 、Ａ14T を順次求めて、プロセッサＰＥ３のＢ31、ＰＥ４のＢ41にそれぞれ転送する。すべてのプロセッサが同様の処理を行った結果、ＢＲの内容は図１０に示すようになる。図１０において、プロセッサＰＥ１内にはＡ11T 、Ａ21T 、Ａ31T 、Ａ41T が格納され、プロセッサＰＥ２内にはＡ12T 、Ａ22T 、Ａ32T 、Ａ42T が格納され、プロセッサＰＥ３内にはＡ13T 、Ａ23T 、Ａ33T 、Ａ43T が格納され、プロセッサＰＥ４内にはＡ14T 、Ａ24T 、Ａ34T 、Ａ44T が格納されている。
【００５１】
ステップＳ１３においては、ｐｒｏｃ台のプロセッサの間でデータ転送が発生するが、ＶＰＰ５００のように各プロセッサに対して同時に読込みと書込みができる並列計算機では、配列の対角方向に並ぶブロック要素について並列にデータ転送を行うことができる。例えば、図８の斜線部分のブロックＡ12、Ａ23、Ａ34、Ａ41の転置データＡ12T 、Ａ23T 、Ａ34T 、Ａ41T は、図９の斜線部分の各ブロックに並列に転送される。このような並列転置処理を行うことにより、データ転送のコストが軽減される。
【００５２】
配列Ａの虚部を配列ＢＩに転置する場合も、同様の処理を行う。このとき、Ａの虚部は図８のように分割され、ＢＩは図９のように分割される。ここで、配列Ａを転置しておくことにより、配列Ａの列ベクトルに対するフーリエ変換を配列Ｂの行ベクトルに対するフーリエ変換に置き換えることができ、次の４段目の処理を各プロセッサで並列に行うことができる。
【００５３】
そして、各プロセッサで（１１）式に対応する４段目の処理を並列に行って（ステップＳ７）、処理を終了する。ステップＳ７では、各プロセッサは行列の転置結果を用いて、メモリ１６内の長さｐの各行ベクトルに対する複素ＦＦＴを行う。これにより、与えられたＮ＝ｐ×ｑ個の実数のフーリエ変換の結果のうち、ｐ×（ｑ／２＋１）個が得られる。残りのｐ×（ｑ−（ｑ／２＋１））個の実フーリエ変換の値は得られた結果と共役関係にあるため、これですべての結果を求めたことになる。
【００５４】
次に、図１１から図１６までを参照しながら、１次元実ＦＦＴの具体例について説明する。
図１１は、入力データを２次元の格納配列に収容して４台のプロセッサに分散配置した例を示している。図１１では、Ｎ＝３００個の実数が１次元データとして入力され、ｐ＝２０、ｑ＝１５として、２０×１５個の２次元データｘ（ｎ１，ｎ２）（ｎ１＝１，２，．．．，２０，  ｎ２＝１，２，．．．，１５）として分散配置される（ステップＳ１）。このとき、（２２）、（２３）、（２４）、（２５）式よりｓ１＝２４、ｋ１＝３、ｋ２＝１６、ｋ３＝８となり、２０×１５個のデータを格納する配列Ａの大きさはｓ１×ｋ２＝２４×１６となる。また、Ａの第１次元を４台のプロセッサで分割するので、１つのプロセッサに割り当てられる格納配列の大きさは６×１６となり、その行ベクトルの数（６）は偶数になる。ここでは、プロセッサＰＥ１、ＰＥ２、ＰＥ３のすべての行ベクトルとプロセッサＰＥ４の２本の行ベクトルにデータが格納されている。そして、配列Ａのデータを格納しない部分の要素（図１１の＊印）の値は、必要のないオーバフローやアンダーフローを避けるために０にしておく。
【００５５】
こうして配列Ａに格納されたデータは、各プロセッサ内で別の格納配列Ｂにコピーされる（ステップＳ２）。図１２は、図１１のデータがコピーされた配列Ｂを示している。ここでは、配列Ｂはｓ１×（２×ｋ３）＝２４×１６の配列として利用され、それぞれ１２×１６の大きさを持つ配列ＢＲとＢＩに分けられる。そして、それらのうちのそれぞれ３×１６の部分が各プロセッサに配置される。各プロセッサに割り当てられたＡの６本の行ベクトルのうち、上半分の３本はＢＲの対応する領域にコピーされ、下半分の３本はＢＩの対応する領域にコピーされる。
【００５６】
次に、各プロセッサ内で、ＢＲに格納されたデータを実部とみなし、ＢＩ内でそれと同じ位置に格納されたデータを虚部とみなして複素数をつくり、そのフーリエ変換を計算する（ステップＳ３）。例えば、プロセッサＰＥ１内の１行目の行ベクトルについては、ｘ１0 ＝ｘ（１，１），ｘ１1 ＝ｘ（１，２），．．．，ｘ１14＝ｘ（１，１５）、かつ、ｘ２0 ＝ｘ（４，１），ｘ２1 ＝ｘ（４，２），．．．，ｘ２14＝ｘ（４，１５）として、（１２）式に代入し、１５個の複素数ｚn を作る。そして、Ｑ＝１５として（１３）式によりそのフーリエ変換を求め、その結果得られる複素数αz j （ｊ＝０，１，２，．．．，１４）の実部をＢＲに格納し、虚部をＢＩに格納する。他の行ベクトルについても同様である。
【００５７】
図１３は、フーリエ変換の結果を格納した配列ＢＲ、ＢＩを示している。図１３において、ＢＲ内のＸ（ｎ１，ｎ２）（ｎ１＝１，２，３，７，８，９，１３，１４，１５，１９，２０，  ｎ２＝１，．．．，１５）は、各フーリエ変換結果の実部を表し、ＢＩ内のＸ（ｎ１，ｎ２）（ｎ１＝４，５，６，１０，１１，１２，１６，１７，１８，  ｎ２＝１，．．．，１５）は、各フーリエ変換結果の虚部を表している。例えば、図１２のｘ（１，ｎ２）を実部、ｘ（４，ｎ２）を虚部として変換した結果得られた複素数の実部がＸ（１，ｎ２）、虚部がＸ（４，ｎ２）である。
【００５８】
次に、ＢＲ、ＢＩに格納された複素フーリエ変換の結果を利用して、（１６）〜（１９）式により実フーリエ変換の結果αx1j 、αx2j を求め、配列Ａに格納する（ステップＳ４）。ただし、この場合は（２０）、（２１）式の共役関係があるので、ｊの最初の１５／２＋１＝８個の値についてαx1j 、αx2j を求めればよい。こうして求められたｘ（ｎ１，ｎ２）のｎ２に関するフーリエ変換の結果をα（ｎ１，ｊ２）（ｎ１＝１，．．．，２０，  ｊ２＝１，．．．，８）と書くことにする。例えば、ｘ（１，１），ｘ（１，２），．．．，ｘ（１，１５）のフーリエ変換の結果のうち、約半分に当たるα（１，１），α（１，２），．．．，α（１，８）が求められ、同様に、ｘ（４，１），ｘ（４，２），．．．，ｘ（４，１５）のフーリエ変換の結果のうち、約半分に当たるα（４，１），α（４，２），．．．，α（４，８）が求められる。これらの実フーリエ変換の結果は、図１４に示すように配列Ａに格納される。図１４において、α（ｎ１，ｊ２）の実部Ｒｅ（α（ｎ１，ｊ２））はＡの左半分に格納され、虚部Ｉｍ（α（ｎ１，ｊ２））はＡの右半分に格納されている。
【００５９】
そして、各プロセッサ内で、（９）式に準じてα（ｎ１，ｊ２）に回転因子を乗算し、その結果をα′（ｎ１，ｊ２）として再び配列Ａに格納する（ステップＳ５）。図１５は、α′（ｎ１，ｊ２）を格納した配列Ａを示している。図１５においては、図１４の場合と同様に、α′（ｎ１，ｊ２）の実部Ｒｅ（α′（ｎ１，ｊ２））はＡの左半分に格納され、虚部Ｉｍ（α′（ｎ１，ｊ２））はＡの右半分に格納されている。
【００６０】
次に、プロセッサＰＥ１〜ＰＥ４は、行列Ａを図７の処理によりブロックレベルで転置して、配列ＢＲ、ＢＩに格納する（ステップＳ６）。このとき、Ａの左半分と右半分はそれぞれ図８に示すように分割され、対角方向に並ぶ４つのブロックが転置されて並列転送される。このような並列転送を繰り返すことにより、行列全体が転置される。図１６は、転置後のデータを格納した配列ＢＲ、ＢＩを示している。ここでは、ＢＲ、ＢＩはそれぞれ８×２４の配列として利用され、各プロセッサはＢＲ、ＢＩのそれぞれの２×２４の部分を格納している。例えば、図１５のプロセッサＰＥ１の１行目の行ベクトルＲｅ（α′（１，１）），．．．，Ｒｅ（α′（１，８）），Ｉｍ（α′（１，１）），．．．，Ｉｍ（α′（１，８））のうち、Ｒｅ（α′（１，１）），．．．，Ｒｅ（α′（１，８））はＢＲの１列目に格納され、Ｉｍ（α′（１，１）），．．．，Ｉｍ（α′（１，８））はＢＩの１列目に格納される。
【００６１】
次に、各プロセッサ内で転置後の行ベクトルを使用して、α′（ｎ１，ｊ２）（ｎ１＝１，．．．，２０）のｎ１に関するフーリエ変換を計算する（ステップＳ７）。このときの計算方法は、ステップＳ３の場合と同様である。計算に必要なα′（ｎ１，ｊ２）の実部と虚部は、それぞれＢＲとＢＩ内の対応する位置に格納されている。そして、各行ベクトルについて得られた２０個のフーリエ変換の結果は、実部と虚部に分けてそれぞれＢＲとＢＩに格納される。こうして、最終的に、図１１の２０×１５個の実数に対する１次元実ＦＦＴの結果のうち、最初の約半分が求められる。残りの部分は、得られた結果の複素共役を取ることにより求めることができる。
【００６２】
次に、２次元実ＦＦＴの方法について説明する。ｐ×ｑの２次元データの離散フーリエ変換は次式で与えられる。
【００６３】
【数６】
0003675537.tif 000007
【００６４】
（２７）式を（７）式と比べると、回転因子の乗算を除いて右辺の計算手順が同じであることが分かる。ただし、ｘn1n2は（７）式のｘ（ｎ１，ｎ２）に対応し、ｆj1j2はｆ（ｊ２，ｊ１）に対応している。したがって、並列計算機により（２７）式を計算するには、図３から３段目の処理を除いた処理を行い、得られた２次元配列を転置すればよい。
【００６５】
図１７は、ｐ×ｑ個の２次元データを（２７）式に従って変換する２次元実ＦＦＴのフローチャートである。図１７において処理が開始されると、まず入出力装置１３は与えられたｐ×ｑの２次元データを取り込み、これをｐ×ｑの２次元配列として、各プロセッサに所定数の行ベクトルを均等に割り当てる（ステップＳ２１）。割当てられた行ベクトルは、図４と同様にして、各プロセッサのメモリ１６に格納される。
【００６６】
次に、各プロセッサ内で、１次元実ＦＦＴの場合と同様にして、（８）式に対応する１段目の処理を並列に行う。まず、各プロセッサは行ベクトルのペアを作り、一方を実部、他方を虚部として、図５と同様の格納領域ＢＲ、ＢＩにそれぞれコピーする（ステップＳ２２）。次に、各プロセッサで、ＢＲの行ベクトルと、対応するＢＩの行ベクトルとを束ねて、（１３）式により複素数のフーリエ変換を行う（ステップＳ２３）。そして、その結果から（１６）〜（１９）式により、最初の（ｑ／２＋１）個の実フーリエ変換の結果を求め、その実部および虚部を、図６と同様にして配列Ａに格納する（ステップＳ２４）。
【００６７】
次に、２段目の処理を行って、配列Ａのｐ×（ｑ／２＋１）×２のデータをブロック（小領域）に分割し、ブロックレベルで転置して配列Ｂに格納する（ステップＳ２５）。このときの転置処理の方法は、図７〜１０に示す方法と同様である。
【００６８】
そして、各プロセッサで３段目の処理を並列に行って、行列の転置結果における長さｐの各行ベクトルに対する複素ＦＦＴを計算する（ステップＳ２６）。この結果得られた複素数の実部と虚部は、それぞれＢＲ（１：ｑ／２＋１，ｐ）とＢＩ（１：ｑ／２＋１，ｐ）に格納される。
【００６９】
次に、ＢＲとＢＩに格納された配列をブロックレベルで再び転置して、配列Ａに格納し（ステップＳ２７）、処理を終了する。このとき、ステップＳ２５と同様のデータ転送により、ＢＲ（１：ｑ／２＋１，ｐ）のデータがＡ（ｐ，１：ｑ／２＋１）に転置され、ＢＩ（１：ｑ／２＋１，ｐ）のデータがＡ（ｐ，ｑ／２＋２：（ｑ／２＋１）×２）に転置される。
【００７０】
こうして、与えられたｐ×ｑ個の実数のフーリエ変換の結果のうち、ｐ×（ｑ／２＋１）個が得られる。２次元実フーリエ変換の結果にも１次元実フーリエ変換の場合と同様の共役関係があるため、残りのｐ×（ｑ−（ｑ／２＋１））個の結果は得られた結果から求められる。
【００７１】
次に、２次元実ＦＦＴの拡張として、３次元実ＦＦＴの方法について説明する。ｐ×ｑ×ｒの３次元データの離散フーリエ変換は次式で与えられる。
【００７２】
【数７】
0003675537.tif 000008
【００７３】
（２８）式は、（２７）式の３次元への拡張となっているため、３次元実ＦＦＴは基本的に２次元実ＦＦＴと同様にして行う。ただし、増えた次元に相当するフーリエ変換処理が追加される。
【００７４】
図１８は、ｐ×ｑ×ｒ個の３次元データを（２８）式に従って変換する３次元実ＦＦＴのフローチャートである。図１８において処理が開始されると、まず入出力装置１３は与えられた３次元データを取り込み、それをｐ×ｑ×ｒの３次元配列とする。そして、この３次元配列を第１次元で分割して、各プロセッサに所定数の第３次元のベクトルを均等に割り当てる（ステップＳ３１）。割当てられた第３次元のベクトルは、各プロセッサのメモリ１６に格納される。
【００７５】
図１９は、このときの３次元データを格納する３次元格納配列Ａの分割方法を示している。図１９では、簡単のためプロセッサ数を４（ＰＥ１、ＰＥ２、ＰＥ３、ＰＥ４）としているが、より一般的にはそれをｐｒｏｃと書くことにする。このとき、Ａの第１次元（行の次元）の大きさｓ１を、（２２）、（２３）式と同様に、
ｓ１＝２×ｐｒｏｃ×ｋ１，                                …（２９）
ｋ１＝（ｐ＋２×ｐｒｏｃ−１）／（２×ｐｒｏｃ）          …（３０）
と定め、第１次元をｐｒｏｃ台のプロセッサにより均等に分割したとき、各プロセッサに格納される部分の行数が偶数になるようにする。また、Ａの第２次元の大きさはｑとし、第３次元の大きさは、
ｋ４＝（ｒ／２＋１）×２                                  …（３１）
以上とする。図１９では、Ａの第３次元の大きさはｋ４となっており、配列ＡはＡ（ｓ１，ｑ，ｋ４）と表される。次に、
ｋ５＝（（ｒ／２＋ｐｒｏｃ）／ｐｒｏｃ）×ｐｒｏｃ        …（３２）
として、Ａの第１次元と第３次元の転置用の格納配列Ｂ（２×ｋ５，ｑ，ｓ１）を用意する。Ｂは同じ大きさの２つの配列ＢＲ（ｋ５，ｑ，ｓ１）とＢＩ（ｋ５，ｑ，ｓ１）からなる。ＢＲ、ＢＩの第１次元の大きさｋ５は、Ａの第３次元の大きさｋ４の半分をｐｒｏｃ台のプロセッサで分割できるように、ｋ４／２＝（ｒ／２＋１）を修正したものである。したがって、
２×ｋ５≧ｋ４＝（ｑ／２＋１）×２                        …（３３）
なる関係がある。
【００７６】
そして、Ａ（ｓ１，ｑ，ｋ４）、ＢＲ（ｋ５，ｑ，ｓ１）、ＢＩ（ｋ５，ｑ，ｓ１）の第１次元を各プロセッサで均等に分割し、分割された各プロセッサの部分をａ（２×ｋ１，ｑ，ｋ４）、ｂｒ（ｋ５／ｐｒｏｃ，ｑ，ｓ１）、ｂｉ（ｋ５／ｐｒｏｃ，ｑ，ｓ１）とする。
【００７７】
次に、各プロセッサ内で、１段目の処理を並列に行う。ただし、このときメモリの使用領域を節約するために、各プロセッサに割り当てられた第３次元のベクトルを前半と後半の２組に分け、一方を実部、他方を虚部として、複素数のフーリエ変換を行う。
【００７８】
まず、各プロセッサは第３次元のベクトルのペアを作り、一方を実部、他方を虚部として別々の領域に格納する（ステップＳ３２）。具体的には、格納領域ｂｒ、ｂｉをそれぞれ格納配列ｂｒ（ｋ１，ｑ，２×ｋ５）、ｂｉ（ｋ１，ｑ，２×ｋ５）として利用し、ａ（１：ｋ１，ｑ，ｋ４）をｂｒ（ｋ１，ｑ，１：ｋ４）にコピーし、ａ（ｋ１＋１：２×ｋ１，ｑ，ｋ４）をｂｉ（ｋ１，ｑ，１：ｋ４）にコピーする。
【００７９】
図１９では、４台のプロセッサＰＥ１、ＰＥ２、ＰＥ３、ＰＥ４の各々に割り当てられたａ（２×ｋ１，ｑ，ｋ４）が、前半部分と後半部分に分割されている。ＰＥ１のデータはＲ１とＩ１に分けられ、ＰＥ２のデータはＲ２とＩ２に分けられ、ＰＥ３のデータはＲ３とＩ３に分けられ、ＰＥ４のデータはＲ４とＩ４に分けられる。そして、これらのデータが、図２０に示すように、配列ＢＲ、ＢＩにコピーされる。図２０において、Ｒ１、Ｒ２、Ｒ３、Ｒ４は実部としてＢＲに格納され、Ｉ１、Ｉ２、Ｉ３、Ｉ４は虚部としてＢＩに格納されている。このとき、ＢＲ、ＢＩは、それぞれＢＲ（ｓ１／２，ｑ，２×ｋ５）、ＢＩ（ｓ１／２，ｑ，２×ｋ５）なる配列として利用される。
【００８０】
次に、ｂｒ（ｋ１，ｑ，１：ｋ４）の第３次元のベクトルと、対応するｂｉ（ｋ１，ｑ，１：ｋ４）の第３次元のベクトルとを束ねて、各プロセッサで複素数のフーリエ変換を行う（ステップＳ３３）。つまり、ｂｒ（ｋ１，ｑ，１：ｋ４）の１つの第３次元方向のベクトルの各要素を（１２）式のｘ１n とみなし、対応するｂｉ（ｋ１，ｑ，１：ｋ４）の第３次元方向のベクトルの要素を（１２）式のｘ２n とみなして、複素数ｚn に対するフーリエ変換を（１３）式により計算する。ただし、このときＱ＝ｒとする。
【００８１】
そして、（１６）〜（１９）式により、最初の（ｒ／２＋１）個の実フーリエ変換の結果を求め、その実部および虚部をそれぞれａ（２×ｋ１，ｑ，１：ｒ／２＋１）およびａ（２×ｋ１，ｑ，ｒ／２＋２：ｋ４）に格納する（ステップＳ３４）。図２１は、このときの格納方法を示している。図２１において、Ａの第３次元の前半が実部に割り当てられ、後半が虚部に割り当てられていることが分かる。例えばプロセッサＰＥ１内では、図２０のＲ１部分のベクトルの実フーリエ変換結果のうち、最初の（ｒ／２＋１）個が実際に求められ、それらの実部がＣＲ１に格納され、虚部がＤＲ１に格納される。また、図２０のＩ１部分のベクトルの実フーリエ変換結果のうち、最初の（ｒ／２＋１）個が実際に求められ、それらの実部がＣＩ１に格納され、虚部がＤＩ１に格納される。他のプロセッサの領域ＣＲ２、ＤＲ２、ＣＩ２、ＤＩ２、ＣＲ３、ＤＲ３、ＣＩ３、ＤＩ３、ＣＲ４、ＤＲ４、ＣＩ４、ＤＩ４についても同様である。
【００８２】
次に、各プロセッサ内で、ａ（２×ｋ１，ｑ，１：ｒ／２＋１）の第２次元方向のベクトルと、ａ（２×ｋ１，ｑ，ｒ／２＋２：ｋ４）の第２次元方向のベクトルとを束ねて、長さｑの複素数のフーリエ変換を行う（ステップＳ３５）。そして、その結果の実部および虚部を、それぞれａ（２×ｋ１，ｑ，１：ｒ／２＋１）およびａ（２×ｋ１，ｑ，ｒ／２＋２：ｋ４）に格納する。
【００８３】
次に、２段目の処理を行って、配列Ａのｐ×ｑ×（ｒ／２＋１）×２のデータをブロックに分割し、ブロックレベルで第１次元と第３次元の間の転置を行い、配列Ｂに格納する（ステップＳ３６）。このとき、格納領域ＢＲ、ＢＩはそれぞれ配列ＢＲ（ｋ５，ｑ，ｓ１）、ＢＩ（ｋ５，ｑ，ｓ１）として利用され、その第１次元に関して分割されている。そして、プロセッサ間のデータ転送により、Ａ（ｐ，ｑ，１：ｒ／２＋１）のデータがＢＲ（１：ｒ／２＋１，ｑ，ｐ）に転置され、Ａ（ｐ，ｑ，ｒ／２＋２：（ｒ／２＋１）×２）のデータがＢＩ（１：ｒ／２＋１，ｑ，ｐ）に転置される。この時行われる転置処理は、図７と同様である。ただし、ここでは図７におけるＢKJ、ＡJKT は、３次元配列を第１次元および第３次元に関して分割したブロックを意味する。図２２は、転置前の配列Ａの実部または虚部の分割例を示しており、図２３は、転置後のデータを格納する配列ＢＲまたはＢＩの分割例を示している。
【００８４】
図２２において、Ａの実部（または虚部）のうちプロセッサＰＥ１内にあるデータは、Ａ11、Ａ12、Ａ13、Ａ14の４つのブロックに分割されている。同様に、プロセッサＰＥ２内のデータはブロックＡ21、Ａ22、Ａ23、Ａ24に分割され、プロセッサＰＥ３内のデータはブロックＡ31、Ａ32、Ａ33、Ａ34に分割され、プロセッサＰＥ４内のデータはブロックＡ41、Ａ42、Ａ43、Ａ44に分割される。また、図２３において、ＢＲ（またはＢＩ）のうちプロセッサＰＥ１内にあるデータは、Ｂ11、Ｂ12、Ｂ13、Ｂ14の４つのブロックに分割されている。同様に、プロセッサＰＥ２内のデータはブロックＢ21、Ｂ22、Ｂ23、Ｂ24に分割され、プロセッサＰＥ３内のデータはブロックＢ31、Ｂ32、Ｂ33、Ｂ34に分割され、プロセッサＰＥ４内のデータはブロックＢ41、Ｂ42、Ｂ43、Ｂ44に分割される。
【００８５】
図２４は、転置処理を行った後のＢＲ（またはＢＩ）の内容を示している。図２４において、プロセッサＰＥ１内にはＡ11T 、Ａ21T 、Ａ31T 、Ａ41T が格納され、プロセッサＰＥ２内にはＡ12T 、Ａ22T 、Ａ32T 、Ａ42T が格納され、プロセッサＰＥ３内にはＡ13T 、Ａ23T 、Ａ33T 、Ａ43T が格納され、プロセッサＰＥ４内にはＡ14T 、Ａ24T 、Ａ34T 、Ａ44T が格納されている。
【００８６】
３次元の場合も、図８に示す２次元配列のデータ転送と同様に、図２２の配列の対角方向に並ぶブロック要素について並列にデータ転送を行う。例えば、図２２の斜線部分のブロックＡ12、Ａ23、Ａ34、Ａ41の転置データＡ12T 、Ａ23T 、Ａ34T 、Ａ41T は、図２４の斜線部分の各ブロックに並列に転送される。
【００８７】
そして、各プロセッサで３段目の処理を並列に行って、配列の転置結果における長さｐの各第３次元のベクトルに対する複素ＦＦＴを計算する（ステップＳ３７）。この結果得られた複素数の実部と虚部は、それぞれＢＲ（１：ｒ／２＋１，ｑ，ｐ）とＢＩ（１：ｒ／２＋１，ｑ，ｐ）に格納される。
【００８８】
次に、ＢＲとＢＩに格納された配列の第１次元と第３次元の間の転置を、再びブロックレベルで行って配列Ａに格納し（ステップＳ３８）、処理を終了する。このとき、ステップＳ３６と同様のデータ転送により、ＢＲ（１：ｒ／２＋１，ｑ，ｐ）のデータがＡ（ｐ，ｑ，１：ｒ／２＋１）に転置され、ＢＩ（１：ｒ／２＋１，ｑ，ｐ）のデータがＡ（ｐ，ｑ，ｒ／２＋２：（ｒ／２＋１）×２）に転置される。
【００８９】
こうして、与えられたｐ×ｑ×ｒ個の実数のフーリエ変換の結果のうち、ｐ×ｑ×（ｒ／２＋１）個が得られる。３次元実フーリエ変換の結果にも１次元実フーリエ変換の場合と同様の共役関係があるため、残りのｐ×ｑ×（ｒ−（ｒ／２＋１））個の結果は得られた結果から求められる。
【００９０】
以上説明したように、本実施例では、ベクトル計算機向けの１〜３次元実フーリエ変換を、２つの実数列をそれぞれ実部および虚部とみなした複素フーリエ変換に置き換え、並列計算機の各プロセッサでその結果の約半分を取り出して、最終的にすべての結果を求めている。尚、本発明は、１〜３次元実フーリエ変換に限らず、より高い次元の離散フーリエ変換にも容易に拡張することができる。例えば、Ｄ次元の実フーリエ変換を計算するには、図１８の３次元実フーリエ変換の処理のステップＳ３５において、（Ｄ−２）次元部分の複素フーリエ変換を続けて行えばよい。
【００９１】
【発明の効果】
本発明によれば、メモリ分散型並列計算機システムによる実フーリエ変換処理において、変換される実数配列の１つの次元の大きさが各プロセッサ内で偶数になるように、データが分割配置される。これにより、各プロセッサ内で実数ベクトルのペアを作ることが可能になり、一方を実部、他方を虚部とみなして、他の次元についてのフーリエ変換をそのプロセッサ内で閉じて行うことができる。したがって、並列計算機の並列性およびベクトル性能を効率良く利用できる。
【００９２】
また、並列転置と組み合わせることでデータ転送のコストがさらに削減され、処理が効率化される。
【図面の簡単な説明】
【図１】本発明の原理図である。
【図２】実施例の並列計算機システムの構成図である。
【図３】１次元実ＦＦＴのフローチャートである。
【図４】２次元配列の分割を示す図である。
【図５】２次元配列のコピー領域を示す図である。
【図６】実フーリエ変換の結果を２次元配列に格納する方法を示す図である。
【図７】行列の転置処理のフローチャートである。
【図８】転置前の２次元配列を示す図である。
【図９】転置後の２次元配列を示す図である。
【図１０】転置後の２次元配列の内容を示す図である。
【図１１】２次元配列の例を示す図である。
【図１２】コピーされた２次元配列の例を示す図である。
【図１３】複素フーリエ変換後の２次元配列の例を示す図である。
【図１４】実フーリエ変換の結果の格納例を示す図である。
【図１５】ローテーション計算後の２次元配列の例を示す図である。
【図１６】転置後の２次元配列の例を示す図である。
【図１７】２次元実ＦＦＴのフローチャートである。
【図１８】３次元実ＦＦＴのフローチャートである。
【図１９】３次元配列の分割を示す図である。
【図２０】３次元配列のコピー領域を示す図である。
【図２１】実フーリエ変換の結果を３次元配列に格納する方法を示す図である。
【図２２】転置前の３次元配列を示す図である。
【図２３】転置後の３次元配列を示す図である。
【図２４】転置後の３次元配列の内容を示す図である。
【符号の説明】
１  入力手段
２  配列記憶手段
３  第１の記憶手段
４  第２の記憶手段
５  計算手段
６  転置手段
７  出力手段
１１−１，１１−２，１１−Ｍ  プロセッサ
１２  ネットワーク
１３  入出力装置
１４  通信部
１５  処理部
１６  メモリ
１７  内部バス
【図１】
0003675537.tif 000009
【図２】
0003675537.tif 000010
【図３】
0003675537.tif 000011
【図４】
0003675537.tif 000012
【図５】
0003675537.tif 000013
【図６】
0003675537.tif 000014
【図７】
0003675537.tif 000015
【図８】
0003675537.tif 000016
【図９】
0003675537.tif 000017
【図１０】
0003675537.tif 000018
【図１１】
0003675537.tif 000019
【図１２】
0003675537.tif 000020
【図１３】
0003675537.tif 000021
【図１４】
0003675537.tif 000022
【図１５】
0003675537.tif 000023
【図１６】
0003675537.tif 000024
【図１７】
0003675537.tif 000025
【図１８】
0003675537.tif 000026
【図１９】
0003675537.tif 000027
【図２０】
0003675537.tif 000028
【図２１】
0003675537.tif 000029
【図２２】
0003675537.tif 000030
【図２３】
0003675537.tif 000031
【図２４】
0003675537.tif 000032