JP4607796B2 - 共用メモリ型スカラ並列計算機向け、高速3次元フーリエ変換処理方法 - Google Patents

共用メモリ型スカラ並列計算機向け、高速3次元フーリエ変換処理方法 Download PDF

Info

Publication number
JP4607796B2
JP4607796B2 JP2006058875A JP2006058875A JP4607796B2 JP 4607796 B2 JP4607796 B2 JP 4607796B2 JP 2006058875 A JP2006058875 A JP 2006058875A JP 2006058875 A JP2006058875 A JP 2006058875A JP 4607796 B2 JP4607796 B2 JP 4607796B2
Authority
JP
Japan
Prior art keywords
fourier transform
bit
dimension
dimensional
data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2006058875A
Other languages
English (en)
Other versions
JP2007241349A (ja
Inventor
誠 中西
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2006058875A priority Critical patent/JP4607796B2/ja
Priority to US11/452,360 priority patent/US7467053B2/en
Publication of JP2007241349A publication Critical patent/JP2007241349A/ja
Application granted granted Critical
Publication of JP4607796B2 publication Critical patent/JP4607796B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F17/00Digital computing or data processing equipment or methods, specially adapted for specific functions
    • G06F17/10Complex mathematical operations
    • G06F17/14Fourier, Walsh or analogous domain transformations, e.g. Laplace, Hilbert, Karhunen-Loeve, transforms
    • G06F17/141Discrete Fourier transforms
    • G06F17/142Fast Fourier transforms, e.g. using a Cooley-Tukey type algorithm

Landscapes

  • Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Mathematical Optimization (AREA)
  • Pure & Applied Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Theoretical Computer Science (AREA)
  • Discrete Mathematics (AREA)
  • Algebra (AREA)
  • Databases & Information Systems (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Complex Calculations (AREA)

Description

本発明は、共用メモリ型スカラ並列計算機において、3次元フーリエ変換を高速に処理するための方法に関する。
昨今、共用メモリ型スカラ並列計算機は、科学技術計算の分野、特に、流体解析、宇宙物理、気象、衝突解析、画像解析などの広汎な分野で利用されている。共用メモリ型スカラ並列計算機をこれらに利用する場合、大規模な問題を高速に処理するために、多次元フーリエ変換の高速な性能が要求される。
また、コンピュータ技術の発達と共に、共用メモリ型スカラ並列計算機のスカラCPUのアーキテクチャも変化している。
PRIMEQUESで採用されたItanium2プロセッサでは、浮動小数点レジスタが128個設けられている。また、キャッシュおよびメモリのアクセス時間も比較的高速になっている。Sparc 向けなどに開発したフーリエ変換方法は高速な1次元変換をベースに多次元フーリエ変換を構成する方法であった。Sparc システムは、キャッシュがL1,L2 と2段となっており、L1キャッシュのアクセスに比べ、L2キャッシュのアクセス速度は遅い。このため、比較的小さなL1キャッシュにデータを保持して計算する方法が優位となる。
一般的な高速フーリエ変換についての説明は、非特許文献1を参照されたい。
Charles Van Loan, "Computational Frameworks for the Fast Fourier Transform", Society for Industrial and Applied Mathematics, 1992
レジスタが豊富でキャッシュの容量が大きくかつメモリアクセス・キャッシュのアクセスが、特に、連続なアクセスで比較的高速なマシンの高性能なCPUの性能を限界まで引き出す上では、Sparc向けに開発されたフーリエ変換方法は十分ではない。また、Sparcでは、レジスタ数が比較的少なかったため、大きな基数を利用して演算密度を上げたり、メモリアクセスを、各計算で必要なタイミングより幾分前のタイミングでロードする方法を利用するには、レジスタが不足して、かえって遅くなる問題があった。
Itanium2プロセッサのようにレジスタが比較的多くあり、多くのデータをレジスタに保持して高速に計算ができ、メモリ・キャッシュのデータの連続アクセスが高速で、キャッシュの容量が大きなCPUからなる計算機システムで高速なフーリエ変換の方法を見出すことは重要である。
本発明の課題は、レジスタ数が多く、メモリ・キャッシュのデータへの連続アクセスが高速なプロセッサに適した3次元フーリエ変換の処理方法を提供することである。
本発明の3次元フーリエ変換処理方法は、連続したデータ領域へのアクセスが高速化された、1次元目のインデックスをi、2次元目をj、3次元目をkとしたとき、入力データx(i、j、k)のiの連続する方向に並んだデータを連続領域に格納する共有メモリ型スカラ並列計算機における3次元フーリエ変換処理方法において、インデックスiとjからなる2次元配列データx(i、j、*)(*は、kの取りうる任意の値)を単位として、キャッシュにロードし、インデックスiが変化する方向への1次元目のフーリエ変換を、iを連続に変化させながら、j方向の多重度分行い、インデックスjが変換する方向への2次元目のフーリエ変換を、iが連続して変化する方向への演算を優先して、i方向の多重度分行ない、インデックスkが変化する方向への3次元目のフーリエ変換を行なうことを特徴とする。
本発明によれば、レジスタ数が多く、メモリ・キャッシュのデータへの連続アクセスが高速なプロセッサに適した3次元フーリエ変換の処理方法を提供することができる。
本発明の実施形態では、スカラ計算機向けのフーリエ変換を1次元変換ベースで構築するよりも、より多くのフーリエ変換を多重に行うことを考える。つまり、1次元と2次元を組み合わせた平面ごとの変換を行い、そのあと3次元目の変換を行うようにする。特に、3次元目の変換を行うときに、1次元目と3次元目からなる平面を考える。こうすると、1次元目の多重度方向へのデータのアクセスが連続になるため、多重フーリエ変換をデータのアクセスが連続となる方向に行うことを考える。3次元目の変換は、2次元目を固定して、1次元目と3次元目で構成される平面に関するフーリエ変換を行うことで処理する。
特に、3次元目のフーリエ変換では。フーリエ変換をいくつかの基数のフーリエ変換に分解して行なう。このとき、基数毎の変換を1次元目の多重度を利用した多重変換で行なう。
(1)3次元目と1次元目とがなす平面に対する多重変換は、キャッシュのWAY数を考慮して、比較的小さな基数で計算することで、連続アクセスの高速性能を引き出すことができる。大きな基数を使うとキャッシュのWAY数による衝突から、メモリからのアクセス性能が劣化してしまう。すなわち、フーリエ変換は、変換を行う各次元のデータ長を適当な因子に分解したときの各因子に関するフーリエ変換を行うことで計算することができるので、データ長を因数である基数に分解して、基数の大きさのフーリエ変換を繰り返し行なうことで、データ長分の計算をする。たとえば、データ長を2の階乗で表したときは、2×2の複素数からなるフーリエ変換を繰り返し行なうことで、データ長分のフーリエ変換を行なうことができる。したがって、この場合、基数×基数個の複素数は、キャッシュを用いて読み書きしながら、まとめて演算する必要がある。ところが、キャッシュにまとめて読み書きできるデータ数は、WAY数によって限定されることから、基数がWAY数に比較して所定以上大きくなると演算しなければならないデータの量がキャッシュの読み書き可能量を超えてしまい、データのロードが発生する。データのロードは演算速度に比べて遅いため、フーリエ変換の演算速度が落ちてしまう。したがって、高速にフーリエ変換を行なうために、基数は、キャッシュのWAY数に比べて比較的小さい必要がある。
(2)特に、データ長が2の冪で表されるときが重要である。Cooley-Tukeyの方法では、各基数の変換を行った後にビットリバースのデータの並べ替えがある。
2次元目の変換では、ビットリバースの並べ替えに関して、2次元目の並び替えで、データを1次元目方向にデータが並んだベクトルと考えて並び替えを行う。このベクトルの並び替えを行うときに、1次元目のベクトル内のビットリバースの並び替えも行う。こうすることで、1次元目と2次元目のビットリバースを同時に行なうことにより、キャッシュ・レジスタ上での並び替えとして行うことができ、ビットリバースする際にデータをロードする回数を少なくできる。
(3)同じく、ビットリバースのデータの並び替えを必要とするCooley-Tukeyの方法を使う、3次元目のフーリエ変換に関しては、2次元目を固定した平面で1次元目を多重度と考えた、基数の変換を行う。すべての基数に関する変換が終わった段階で、ビットリバースを行うが、1次元目の方向のデータの並びからなるベクトルごとの入れ替えでビットリバースを行う。すべての2次元目に値に対する多重変換が終われば3次元フーリエ変換の全演算の終了である。
特に、最後の基数は、比較的大きな基数により計算を高速化するため、基数として16、32などを利用する。ただし、キャッシュのWAY数による衝突は起こらないようにする。各基数の計算においては、基数の変換と回転因子の演算をまとめて行う。フーリエ変換演算の最後の部分は連続領域に対する基数の変換だけとなり、回転因子の演算を行なうためのテーブルの参照は不要であり高速な計算が可能である。
(4)1次元目および2次元目の計算に関しては、この方法以外にも、かなり大きな基数を使い(ただし、キャッシュのWAY数による衝突は起こらないようにする)、ビットリバースの並び替えの不要な方法を利用する方法も有効である。この方法は、1次元目方向と2次元目方向からなる平面は、データのアクセス領域としては連続領域となっており、本実施形態で前提とするプロセッサでは連続領域へのアクセスが速い事と、十分大きなキャッシュに、演算に必要なデータ全体が格納され得ることと、レジスタが豊富にあることを利用して行う。
(a)1次元変換では、以下の方法を利用する。
データ長を因数分解する。各因数が基数である。基数として、8または16を使う。基数をnradix,m=n/nradixとし(nはデータ長)、m×nradixの配列をnradix×mの配列に転置する要領で、フーリエ変換すべきデータの、長さnradixの行ベクトルを1本ずつ読み出し、回転因子を掛けてフーリエ変換計算したものを、これを転置した配列に格納する。計算処理されるべき残りのデータについても、同様にして、基数の値m回だけ繰り返す。最後の行に対応する演算データの格納に関しては、1次元目の値mが、((nの約数であるところの基数の総個数m)−1)次元の配列を表すとみなして、これらの順番を入れ替える。
この、アクセスパターンは、参照に関しては基数の数だけある連続な1次元ベクトルを連続に順次ロードするため高速である。
更に、基数個のフーリエ変換をm回行うループで、演算すべき行ベクトルデータを、一回前のループでロードしておいて、レジスタに保持しておく。このことで、データのロードと計算を同時に行うことができる。これは、レジスタが豊富にあるからできることである。基数を大きくすると、1回の参照で読み出されるデータの数が増えるので、1回の参照でロードされたデータに行なうべき演算量が増えるため、データのロードを一回前のループの演算中に完了することが可能である。1回のロードで行なうべき演算量が増えるが、演算に使うレジスタと事前にロードするために使うレジスタの数がCPUのレジスタ総数を超えないようにする。
2次元目の変換に関しては、1次元目の多重度を先に行うようにする。この多重部分で基数回のフーリエ変換の繰り返しが発生する。この繰り返しでも同じように先読みすることができる。
以上の意味するところは、3次元フーリエ変換すべきデータを配列w(i、j、k)に格納した場合、1次元目のインデックスiが連続しているデータは、格納領域に連続して格納されているため、1次元目のインデックスiについて連続してアクセスするようにすれば、本発明の実施形態で前提とするプロセッサは連続アクセスが速いので、高速に処理ができるというものである。1次元目のフーリエ変換をする場合には、通常、iを連続に変化させて順次計算するが、2次元目の計算をする場合には、通常だと、jを連続に変化させて順次計算する。しかし、本発明の実施形態では、iを連続に変化させるループをjを連続に変化させるループの中に入れて、2次元目のフーリエ変換においても、1次元目のiを連続に変化させ、データアクセスを連続アクセスとすることにより、高速化を図る。
(5)混合基底の場合
混合基底(複数の異なる基底を用いる)の場合は、各基数に関する変換と、回転因子の乗算、および、転置を組み合わせたもので、各基数に対する変換を行う。このとき、入力領域と出力領域が必要になる。そのため、1次元目と2次元目に関しては、1次元目方向と2次元目方向とで構成されるひとつの平面とみなして、変換を行う。2次元目の変換は、1次元目の変換と同じ大きさの作業域を確保して、各基数の1次元目を多重度と見なして行なう。フーリエ変換の入出力はデータの格納された領域と作業域を切り替えて行う。
以下のようなフーリエ変換を利用する。
データ長n がp ×q と因数分解できたとき次の4ステップで計算できる。
step 1: 格納域x をx(p,q)の2次元配列と考える。1次元目(pのインデックス)に関する長さq のフーリエ変換を多重度p だけ行なう。
step 2: x(p,q)の要素x(i,j)にω**(i*j) を掛ける。ここで、ω=exp(-2π/n) である。
step 3: x(p,q)を転置してw(q,p)に格納する。
step 4: w の2次元目(qのインデックス)に関して、長さp のフーリエ変換を多重度q だけ行なう。
qが小さく、pが大きな数である場合には、2つの因子への分解をstep 4の長さp の変換に繰り返し再帰的に提供することで、長さの短いフーリエ変換の組み合わせで長さn のフーリエ変換を計算することができる。
混合基底の場合には、以下のようなフーリエ変換を利用する。
データ長n をp 個の基数の積に分解する。n=n1×n2×...×np
s1: m ←n/npとする。
s2: データの格納されている1次元領域をx(m,np) なる2 次元配列と見なす。
s3: 2 次元目の基数npのフーリエ変換を多重度m だけ行なう。
s4: x(m,np) に回転因子を掛ける。
s5: x を転置してw(np,m) に格納する。
s6: m を(m/np-1,np-1) と 2次元に分解する。そのためm ←m/np-1と更新する。
s7: w(np,m,np-1)と一つ次元をあげて、下記のSTEP1の計算を適用する。
STEP1:まず、3次元目のnp-1のフーリエ変換を多重度np×m 行なう。
s8: 回転因子をw(*,m,np-1) に掛ける。*は、0以上n以下の任意の値。
s9: 2次元目と3次元目を入れ替え(転置)する。
x(np,np-1,m) ←w(np,m,np-1)。
s10:以下配列x およびw を入出力として入れ替えながら, m を次の基数との積に分解してフーリエ変換を繰り返す。
s11:最後の基数に関してフーリエ変換を行なうとき、すべての基数の個数が偶数ならw に奇数ならx に変換すべきデータがある。最後の多重転換は、変換すべきデータがwにあるときは、出力はx に、変換すべきデータがx にあるときはx に出力する。
2次元目の変換は、各基数に関するフーリエ変換と回転因子の積を、1次元目の多重度分さらに行なう。このため、作業域w は1次元分の多重度を加えたn1×n2の大きさが必要になる。
3次元目のフーリエ変換も同様に、2次元目を固定して 1次元目を多重度とした多重変換として計算を行う。すべての2次元目に値に対する多重変換が終われば、3次元フーリエ変換処理の終了である。
また、各基数の計算で多重度分の繰り返しがある。このため、一つ前の繰り返し処理で次に必要なデータの先読みを行うようにすることで高速性能が引き出せる。
以上のような方法で、Sparc向けのコードをItanium2に単純に移植したときの性能に比べて2 倍強の性能を引き出す効果があった。
以下に、本発明の実施形態について、より詳しく説明する。
(1)基数が2の冪となる場合。
1次元目に関して、ビットリバースの並べ替えを除いて、上記で説明したように、基数次元の行ベクトルと見て、1本ずつ、フーリエ変換と回転因子の乗算を行う。次に、2次元目に関して、1次元目を多重度として2次元目のフーリエ変換と回転因子の乗算を行う。これらは2,4,8などの基数を用いて行う。基数をnradixとして、m=n/nradixとして、m×nradixの2次元配列とみなして、各行に対して基数nradixのフーリエ変換と回転因子を掛ける。この結果は、ビットリバース順に並び替えておく。
次にnradixを更新して、m←m/ nradixのようにmを更新して、一つ前のnradix本ある、長さmのベクトルに関して、同様に2次元配列とみなして、フーリエ変換と回転因子を掛ける。2次元目に関して、1次元目を多重度として連続アクセスで演算を行う。
ビットリバースに関しては、入れ替えを行う要素のペアを作りリストを作る。リストは以下のように作成できる。フーリエ変換の次数をnとしたときm=log2(n)とする。
A)フーリエ変換及び回転因子の乗算がされた後のデータw(i、j、k)のインデックスi、j、kのそれぞれについてビットリバースを行なうが、今、iの総ビット数が奇数とすると、このとき、iを5つの部分に分ける。左が高位ビットとする。
インデックスをビットで表して、高位ビットからB1 |C|B2|A|B3 と5つに分ける、B1,B2,B3は 1ビットずつ振り分けて、AとCは同じビット数とする。
a)AとCRが異なる場合
Aがmビットとして、0から2**m−1まで変化させることを考える。
AをビットリバースしたものをARとあらわす。CをビットリバースしたものをCRとする。
A>CRを成り立たせるすべてのCを生成する。すると、ビット列C|Aとビット列AR|CRは異なる値となる。
また、ビット列C|Aとビット列AR|CRの右半分はA>CRを満たしたものを生成することになり、この2つのビット列ですべてのインデックス値を生成することになる。
このように生成したペア(C|AとAR|CR)はすべての組み合わせをつくしている。
もし、重複しているペアがある場合には、2つのペア(C|AとAR|CR)と(C2|A2とA2R|C2R)が一致するペアとして、以下のように考える。
Aは順次生成しているので、A2>Aとする。
両者が一致するので、CRとA2は一致しなければならない。すると、CR>Aとなるが、もともと、A>CRとなるようにビット列C|AとAR|CRを生成しているはずなので矛盾する。したがって、重複するペアは発生しないことになる。
つまり、3ビットのビット列B=B1|B2|B3はなんでもよいので0から7まで生成して、B1 |C|B2|A|B3 を生成する。ビットリバースしたものは次のようになる。
B3|AR|B2|CR|B1
b)AとCRが一致する場合
したがって、ARとCも一致する。よって、C|AとAR|CRは同じビット列となる。したがって、B1 |C|B2|A|B3とB3|AR|B2|CR|B1が異なるビット列となるためには、B=B1|B2|B3は非対称でないといけない。つまり、BRをBのビットリバースしたものとすると、B≠BR。これは3ビットのBの具体的なパターンを見れば決めることができる。
このa)とb)のペアを生成してテーブルの保管しておき、ビットの入れ替えを行う。
B)インデックスの総ビット数が偶数のとき
中央のB2を総ビット数が奇数のときに対して1ビット増やして2ビットにする。
a)AとCRが異なる場合
Aがmビットとして、0から2**m−1まで変化させることを考える。
AをビットリバースしたものをARとあらわす。CのビットリバースしたものをCRと表す。
A>CRを保つすべてのCを生成する。するとC|AとAR|CRは一致しない。
また、ペアの右半分はA>CRを満たしたものを生成することになりすべて生成することになる。
このように生成したペア(C|AとAR|CR)はすべての組み合わせをつくしている。
もし、生成しているペアが重複しているなら、2つのペア(C|AとAR|CR)と(C2|A2とA2R|C2R)がペアとして一致することになると仮定して以下のように考える。
Aは順次生成しているので、A2>Aとする。
ペアが一致しているので、CRとA2は一致しなければならない。すると、CR>Aとなり矛盾する。したがって、仮定が間違っていたということになるので、生成したペアには重複したペアは発生しない。
つまり、4ビットのビット列B=B1|B2|B3はなんでもよいので、0から15まで生成して、B1 |C|B2|A|B3 を生成すると、ビットリバースしたものは次のようになる。
B3|AR|B2R|CR|B1
b)AとCRが一致する場合
B1 |C|B2|A|B3とB3|AR|B2R|CR|B1が異なるビット列となるためには、B=B1|B2|B3は非対称でないといけない。つまり、B≠BR。これは4ビットのBの具体的なパターンを見れば決めることができる。
このa)とb)のペアを生成してテーブルの保管しておくことにより、インデックスの入れ替えを行うことができる。
2次元目のインデックスの入れ替えに関しては、次のようにする。2次元目の入れ替えを行うとき、1次元方向のベクトルで入れかえる。そのためベクトルV、ベクトルWに入れ替える列ベクトルをコピーする。コピーしたら、このベクトル上で1次元目の入れ替えを行なう。1次元目の入れ替えを行なった結果のベクトルVとWを入れ替えて、もとの列ベクトルに格納する。
2次元目に関して、入れ替えが不要な場合は以下の場合である。
・AとCRが一致してBとBRが一致する場合。
この場合のベクトルに関しては、1次元目の入れ替えを行なう。
3次元目に関しては、2次元目と同じように1次元目を多重度と見なしたフーリエ変換を行なった後、3次元目の入れ替えとして、2次元目と同様の1次元目方向の列ベクトルの入れ替えを行なう。
(2)ビットリバースを必要としない方法で、必要なデータを先読みする方法
次数nとして、基数nradixに対してm=n/nradixとして(nはデータ長)、m×nradixの2次元配列と見なして、各行ベクトルに対してフーリエ変換と回転因子を掛ける。フーリエ変換後のデータの格納は、この基数のフーリエ変換の格納順とする。
そして、nradix×mの配列に転置して格納する。この繰り返し処理で、フーリエ変換するデータの参照は、1つ前の計算中にロードしておく。基数は演算量が中くらいの8および16がItanium2では妥当である。
そして、繰り返し演算の最後のフーリエ変換に関しては、値mを、((基数の数)−1)次元の配列の次元を表すと見なして、次元の入れ替えを行なう。つまり、演算後のデータをA(I1、I2、I3)⇒A(I3、I2、I1)のように、次元を逆の順に入れ替える。これで、フーリエ変換が計算できる。
2次元変換において、1次元目の変換は、上記方法を適用して、2次元目の大きさだけの多重度分、1次元目の変換を繰り返し計算する。そして、2次元目の変換を1次元目の大きさの多重度だけ計算するときには、基数がかなり大きいため、フーリエ変換を行なうよりも大きな1次元配列に格納して、1次元変換を行なう。
または、基数を小さくした方法を2次元目の変換に対応させて、フーリエ変換を行なうことができる。ビットリバースの並び替えを使わない方法を利用すると、同じ大きさの作業域を割り当てる必要がある。
3次元目のフーリエ変換に関しても、1次元目を多重度として行なう。このときは基数を比較的小さな数とする方法を選ぶ。このように選ぶことで高速なメモリアクセスとデータのキャッシュ保持を効率よく利用できる。
図1は、本発明の実施形態の2次元面でのフーリエ変換の仕方を説明する図である。
nをデータ長として、nradixを基数とした場合、m×nradixの配列Xから行ベクトルを順次取り出して、基数に関するフーリエ変換および回転因子の乗算を行い、それを転置した配列(nradix×mの配列)に格納する。この繰り返し処理で、参照するデータは、一つまえの繰り返しでロードしておくことで、データのロードの待ち時間中に計算を実行することができる。これは、レジスタが豊富であることにより実現できるものである。
次に、WとXを交換して、同じ形状の配列として同じアクセスパターン(配列Wにおいては、列ベクトルを順次取り出して)で、次の基数長の列ベクトルに対する変換を行なう。繰り返し演算の最後では回転因子の乗算がない。
繰り返し演算の最後に関しては、Xを基数の個数の多次元配列x(p2, p3, ..., pn, p1)と見なし、Wをw(pn, pn-1, ..., p2, p1)と見なして、このようにデータが格納されるように最高次元以外、逆順に並び替える。
繰り返し演算の最後以外は、同じアクセスパターンで、かつ連続アクセスで計算できるので、高速化が図れる。
図2は、本発明の実施形態の3次元フーリエ変換の処理を説明するフローチャートである。
図2において、ステップS10で、3次元目をスレッド数で均等に分割して、各スレッドに割り当てる。ステップS11で、各スレッドに割り当てられた、1次元目と2次元目からなる平面単位に2次元フーリエ変換を行なう。ステップS12において、2次元目をスレッド数で均等に分割して、各スレッドに1次元目と3次元目からなる2次元平面を各スレッドに割り当てる。ステップS13において、3次元目を比較的小さな基数に分解して、各基数のフーリエ変換と回転因子の積を1次元目の多重度で行なう。ビットリバースが必要な方法ならば、最後にビットリバースを1次元目の大きさのベクトルとして行なう。
図3は、図2における3次元目のフーリエ変換の処理を示すフローチャートである。
3次元FFTの3次元目のフーリエ変換に関して、各スレッドに割り当てて行なう部分は以下のようにする。
スレッド毎に2次元目の大きさを均等に分割した部分を割り当てる。この最初と最後をそれぞれn2ds,n2de とする。各基底に対するフーリエ変換を1次元の多重度を持った1次元と3次元からなる平面に関して、2次元目をn2dsからn2deまで動かしながら計算する。x(k1,n2,n3) なる配列にデータが格納されているとする。2次元目をj2∈[n2ds,n2de] に固定して計算する。ビットリバースの並び替えの不要な方法だとw(k1,n3)なる2次元の作業域が必要になる。
図3において、ステップS15において、3次元目のフーリエ変換のデータ長をnとして、これを基数に分解する。分解した基数の数をmとする。すなわち、以下のように分解する。
=r×r×・・・×r
ステップS16において、i=1とする。ステップS17において、iがmか否かを判断する。ステップS17の判断がYesの場合には、ステップS22に進む。ステップS17の判断がNoの場合には、ステップS18において、iが偶数か、すなわち、iと2の剰余(mod)が0か否かを判断する。ステップS18の判断がYesの場合には、ステップS20に進む。ステップS18の判断がNoの場合には、ステップS19において、作業域Wを入力、x(k1, j2, n3)を出力にして、基数rのフーリエ変換と回転因子の積演算を1次元の大きさn1だけの多重度分行ない、ステップS21に進む。ステップS20では、x(k1, j2, n3)を入力に、wを出力にして、基数rのフーリエ変換と回転因子の積演算を1次元の大きさn1だけの多重度分行ない、ステップS21に進む。ステップS21では、iを1増加し、ステップS17に戻る。
ステップS22においては、iが偶数か否かを判断する。ステップS22の判断がYesの場合には、ステップS24に進む。ステップS22の判断がNoの場合には、ステップS23に進む。ステップS23では、作業域wを入力、x(k1, j2, n3)を出力にして、基数rのフーリエ変換の計算を1次元の大きさnだけの多重度分行ない、処理を終了する。ステップS24では、x(k1, j2, n3)を入力及び出力として、基数rのフーリエ変換と回転因子の積の計算を1次元の大きさnだけの多重度分行なって、処理を終了する。
図4は、本発明の実施形態に従った、アクセスパターンが連続で、かつ同じパターンで最後のループ並び替えを同時に行ない、かつ、データの先読みを行なう1次元フーリエ変換のフローチャートである。
基本的に基数は8以上を使はないとデータの先読み効果は引き出せないことが分かっている。
まず、ステップS30において、フーリエ変換のデータ長を以下のように基数に分解する。
n=r×r×・・・×r
ここで、基数の数をmとする。
ステップS31において、必要なテーブルをm−1個作成する。次に、ステップS32において、i=1と設定する。ステップS33において、最初のテーブルで基数rのフーリエ変換を呼び出し、xを入力、w1を出力として実行する。この処理は、サブルーチンfft1を呼び出すことにより行なう。ステップS34において、iを1増加する。ステップS35において、iと2の剰余が1か否かを判断する(iが奇数か否かを判断する)。ステップS35の判断がYesの場合には、ステップS36に進む。ステップS35の判断がNoの場合には、ステップS37に進む。ステップS36では、i番目のテーブルで基数rのフーリエ変換を呼び出す。w1を入力、w2を出力とする。これは、サブルーチンfft1を呼び出すことによって行なう。ステップS37では、i番目のテーブルで基数rのフーリエ変換を呼び出す。w2を入力、w1を出力とする。ここでは、サブルーチンfft1を呼び出す。そして、ステップS38において、iを1増加し、ステップS39において、i<mか否かを判断する。ステップS39の判断がYesの場合には、ステップS35に戻る。ステップS39の判断がNoの場合には、ステップS40において、最後の基数rについてのフーリエ変換を呼び出して、結果のデータを格納する。mが基数ならw2を偶数ならw1を入力として、xを出力とする。ここでは、サブルーチンfft2を呼び出す。
図5は、サブルーチンfft1の処理を示すフローチャートである。
Itanium2など浮動小数点レジスタが128 個以上あるプロセッサではスカラ変数を使って、Fortranなどの高級言語でプログラムを記述するとレジスタが十分豊富である間はレジスタを使ったコードとなる。また、これらの変数は、レジスタが割り当てられているものと考える。基数をr、変換データ長をnとしたとき、m=n/rxとする。入力の配列はx(m,rx),出力はw(rx,m) とする。回転因子を格納したテーブルtbl(1:rx-1,m)もサブルーチンの入力とする。
ステップS45において、x(1, 1:rx)を変数tmp1, …, tmprxにロードする。ここで、1:rというのは、1からrまでのそれぞれの値を意味する。そして、iを1に設定する。ステップS46において、tmp1, …, tmprxを使って、基数rのフーリエ変換で、これらを参照する計算を行い、結果をスカラ変数に格納する。ステップS47において、tmp1, …, tmprxの参照が終わった直後で、x(i+1, 1:rx)をtmp1, …, tmprxにロードする命令を発行する。このロードは、プログラムでは、単なる代入文で記述することができる。ステップS48において、残りの基数rのフーリエ変換の計算の続きを行なう。途中、tbl(1:rx-1, i)をtbl1, …, tblrx-1にロードする命令を適当にある間隔でプログラムに埋め込む。ステップS49において、基数rのフーリエ変換の出力で、最初の出力を除くrx−1個の出力に、順にtbl1, …, tblrx-1の内容をかける。ステップS50において、結果をw(1:rx, i)に格納する。ステップS51において、iを1だけ増加する。ステップS52において、i<mか否かを判断する。ステップS52の判断がYesの場合には、ステップS46に戻る。ステップS52の判断がNoの場合には、ステップS53において、tmp1, …, tmprxを使って、基数rのフーリエ変換で、これらを参照する計算を行い、結果をスカラ変数に格納する。ステップS54において、残りの基数rの計算を行なう。途中、tbl1(1:rx-1, i)をtbl1, …, tblrx-1にロードする命令を適当に、ある間隔でプログラムに埋め込んでおく。ステップS55において、基数rのフーリエ変換の出力で最初の出力を除く、rx−1個の出力に、順に、tbl1, …, tblrx-1の内容をかける。ステップS56において、結果をw(1:rx, i)に格納して、サブルーチンから抜け出る。
図6は、本発明の実施形態に従った、サブルーチンfft2の処理を説明するフローチャートである。
Itanium2など浮動小数点レジスタが128 個以上あるプロセッサでは、スカラ変数を使ってFortran などの高級言語でプログラムを記述するとレジスタが十分豊富である間はレジスタを使ったコードとなる。また、これらの変数はレジスタが割り当てられているものと考える。基数をrx、変換データ長をn としたとき、m=n/rxとする。入力の配列はx(m,rx),出力はw(rx,m) とする。x=1のときは、m=r2×r3×... ×rpと分解され、各基数に関して変換が終わっている。因子の数はp である。基数の個数の多次元配列x(r2, r3, ..., rp, rx)と見なして、Wをw(rp, rp-1, ..., r2,rx)と見なして、そのように格納されるように最高次元以外のインデックスを逆順に並び替える。
図6において、ステップS60においては、x(1, 1:rx)をtmp1, …, tmprxにロードし、iを1に設定する。ステップS61において、tmp1, …, tmprxを使って、基数rのフーリエ変換で、これらを参照する計算を行い、結果をスカラ変数に格納する。ステップS62において、tmp1, …, tmprxの参照が終わった直後で、x(i+1, 1:rx)をtmp1, …, tmprxにロードする命令を発行する。実際のプログラムでは、単なる代入文で十分である。ステップS63において、残りの基数rのフーリエ変換の計算を行なう。ステップS64において、
dis1=r2, dis2=dis1*r3, …, disp-1=disp-2*rp
dit1=rp, dit2=dit1*rp-1, ..., ditp-1=ditp-2*r2
j←i−1
とおき、
j=i0+i1*dis1+i2*dis2+...+ip-1*disp-1
となるi0、・・・、ip−1を決める。すなわち、
i0=mod(j, dis1), i←j/dis1
,………
ix=mod(j, disx+1), j←j/disx+1を繰り返す。
そして、
k=ip-1+ip-2*dit1+...+i0*ditp-1+1と計算する。
ステップS65において、結果をw(1:rx, k)に格納する。ステップS66において、iを1増加し、ステップS67において、i<mか否かを判断する。ステップS67の判断がYesの場合には、ステップS61に戻る。ステップS67の判断がNoの場合には、ステップS68において、tmp1, …, tmprxを使って、基数rのフーリエ変換で、これらを参照する計算を行い、結果をスカラ変数に格納する。ステップS69において、
dis1=r2, dis2=dis1*r3, …, disp-1=disp-2*rp
dit1=rp, dit2=dit1*rp-1, ..., ditp-1=ditp-2*r2
j←i−1
とおき、
j=i0+i1*dis1+i2*dis2+...+ip-1*disp-1
となるi0、・・・、ip−1を決める。すなわち、
i0=mod(j, dis1), i←j/dis1
,………
ix=mod(j, disx+1), j←j/disx+1を繰り返す。
そして、
k=ip-1+ip-2*dit1+...+i0*ditp-1+1と計算する。
ステップS70において、結果をw(1:rx, k)に格納して、サブルーチンから抜け出る。
図7は、2次元変換でビットリバースの並び替えを同時に行なう方法を説明するフローチャートである。
この方法も同じように、データ長n がp ×q と因数分解できたとき次の4ステップで計算する方法から構成することができる。n は2のべき乗であらわせる数とする。
ビットリバースを別個に行なう場合は以下の通りである。
step 1: 格納域x をx(p,q)の2次元配列と考える。2 次元目に関する長さq のフーリエ変換を多重度p だけ行なう。
step 2: x(p,q)の要素x(i,j)にω**(i*j) を掛ける。ω=exp(-2π/n) 。
step 3: x(p,q)を転置してw(q,p)に格納する。
step 4: w の2次元目に関して、長さp のフーリエ変換を多重度q だけ行なう。
2つの因子への分解をstep 4の長さp の変換でstep 1およびstep 3のフーリエ変換の結果をビットリバースの並べ替えを行なった順序で格納し、step3の転置を行なわない。この結果、最後に全体をビットリバースの並び替えを行なうことで同じ計算を行なうことになる。
ビットリバースを同時に行なう場合は以下の通りである。
step 1: 格納域x をx(p,q)の2次元配列と考える。2 次元目に関する長さq のフーリエ変換を多重度p だけ行なう。
step 2: x(p,q)の要素x(i,j)にω**(i*j) を掛ける。ω=exp(-2π/n) 。
step 3: x(p,q)に 2次元目に関してフーリエ変換の結果をビットリバースした並びで格納する。
step 4: x の1次元目に関して長さp のフーリエ変換を多重度q だけ行なう。結果は、ビットリバースの並び替えを行なった順序で格納する。
step 5: x(p×q)のデータに対して、ビットリバースの並び替えを行なう。
step 1〜step 3を繰り返し再帰的に提供することで、長さn のフーリエ変換を計算することができる。
図7においては、ステップS77において、1次元目に関して、下記のs1〜s11の計算を行なう。これを2次元目の多重度分行なう。ステップS76において、2次元目に関して、s1〜s11の計算を各基底に関してのフーリエ変換及び回転因子の積に関して、1次元目の多重度分行なう。そして、ステップS77で、1次元目と2次元目のビットリバースの並び替えを同時に行なう。このときは、サブルーチンbitrb2dを呼び出して行なう。
データ長n をp 個の基数の積に分解する。n=n1×n2×...×np
s1: m ←n/npとする。
s2: データの格納されている1次元領域をx(m,np) なる2 次元配列と見なす。
s3: 2 次元目の基数npのフーリエ変換を多重度m 分行なう。
s4: x(m,np) に回転因子を掛ける。
s5: 基数npのフーリエ変換結果をビットリバースの並び替えを行なった順に格納する。
これは、基数が固定されているので、結果の格納位置を変えるように基数npのフーリエ変換を変更することで実現できる。
s6: m を(m/np-1,np-1) と 2次元に分解する。そのためm ←m/np-1と更新する。
s7: w(m,np-1,np)と一つ次元をあげて、下記のSTEP1の計算を適用する。
STEP1:まず、2次元目のnp-1のフーリエ変換を多重度m ×np行なう。
s8: 回転因子をx(m,np-1,*) に掛ける。
s9: 2次元目の基数np-1のフーリエ変換の結果をビットリバースの並べ替えを行なった順序に格納する。
s10:m を次の基数との積に分解してフーリエ変換を繰り返す。
s11:最後の基数に関してフーリエ変換を行ない、これも結果をビットリバースの並び替えを行なった順で格納する。
s12:x(n)のデータに関してビットリバースの並び替えを行なう。
図8〜図11は、サブルーチンbitrb2dの処理を説明するフローチャートである。
ステップS80において、2次元目の大きさのビット数n(n=2**n)を求める。ステップS81において、nが偶数か否かを判断する。ステップS81の判断で、奇数と判断された場合には、ステップS97に進む。ステップS81で、偶数と判断された場合には、ステップS82に進む。ステップS82において、nbitx=(nb-3)/2, nx=2**nbitxを計算する。ステップS83において、iを1に設定する。ステップS84において、jを1に設定する。ステップS85において、j<iか否かを判断する。ステップS85の判断がNoのときは、ステップS89に進む。ステップS85の判断がYesの場合には、ステップS86において、(i−1)を1ビット左にシフトしたものに、(j−1)をビットリバースしたものを、更に(nbitx+2)ビット左にシフトしたものを加えたものをidxとする。iとjを入れ替えて同じ操作をしたものをisxとする。ステップS87において、0から7までのビットパターンを生成して、3ビットに左から分けて、B1、B2、B3とする。idxの2*nbit+3ビット目にB1を、nbit+2ビット目にB2を、1ビット目にB3を加えて、それに、1を加えてidとする。同様に、isxの2*nbit+3ビット目にB3を、nbit+2ビット目にB2を、1ビット目にB1を加えて、それに1を加えてisとする。0から7までのビットパターンを生成する毎に、このように、idおよびisをつくり、サブルーチンpermxyを呼び出す。permxyは、x(*、is)とx(*、id)を入れ替える。そのときに、x(*,is)及びx(*,is)のビットリバースの並び替えを行なう。ステップS88において、jを1だけ増加して、ステップS85に戻る。ステップS89では、iを1だけ増加する。
ステップS90では、i>nか否かを判断する。ステップS90の判断がNoのときは、ステップS84に戻る。ステップS90の判断がYesの場合には、ステップS91で、iを1に設定し、ステップS92において、(i-1) を1ビット左シフトしたものに(i-1) をビットリバースしたものを(nbitx+2) ビット左にシフトしたものを加えたものをidx とする。isx はidx と同じ値に設定する。ステップS93において、{001, 011 }の 2つのビットパターンに対して、B1,B2,B3 と 3ビットを取り出して、idx の2*nbit+3ビット目にB1を、nbit+2ビット目にB2を、1 ビット目にB3を加えそれに1を加えてidとする。同様に、isx の2*nbit+3ビット目にB3を、nbit+2ビット目にB2を、1 ビット目にB1を加えそれに1 を加えてisとする。{001,011 }の 2つのビットパターン毎に、idおよびisを作り、サブルーチンpermxyを呼び出す。permxyはx(*,is) とx(*,id) を入れ替える。そのときに、x(*,is) およびx(*,id) のビットリバースの並び替えを行なう。ステップS94において、2 次元目の並び替えはないが、1 次元の並び替えが必要なものである、ビットパターン[000,010,101,111]に対して、一つ前の処理と同じようにidを計算する。perm1dを呼び出して、x(*.id) のビットリバースの並び換えをビットパターン毎に行なう。ステップS95では、iを1だけ増加し、ステップS96において、i>nであるか否かを判断する。ステップS96の判断がNoの場合には、ステップS92に戻る。ステップS96の判断がYesの場合には、サブルーチンから抜け出る。
ステップS97では、nbitx=(nb-4)/2、nx=2**nbitxを計算する。ステップS98で、iを1に設定し、ステップS99において、jを1に設定する。ステップS100においては、j<iか否かを判断する。ステップS100の判断がNoの場合には、ステップs104に進む。ステップS100の判断がYesの場合には、ステップS101において、(i-1) を1ビット左シフトしたものに(j-1) をビットリバースしたものを(nbitx+3)ビット左にシフトしたものを加えたものをidx とする。i とjを入れ替えて同じ操作をしたものをisx とする。ステップS102において、0から16までのビットパターンを生成して、1ビット、2ビット、1ビットに左から分けてB1,B2,B3とする。idx の2*nbit+4ビット目にB1を、nbit+3,nbit+2 ビット目にB2を、1 ビット目にB3を加えそれに1を加えてidとする。同様に、isx の2*nbit+4ビット目にB3を、nbit+3,nbit+2ビット目にB2を反転いたものを、1 ビット目にB1を加えてそれに1 を加えてisとする。0 から16までのビットパターンを生成する毎に、このように、idおよびisを作り、サブルーチンpermxyを呼び出す。permxyはx(*,is) とx(*,1d) を入れ替える。そのときに、x(*,is) およびx(*,id) のビットリバースの並び替えを行なう。そして、ステップS103において、jを1だけ増加し、ステップS100に戻る。ステップS104では、iを1だけ増加し、ステップS105において、i>nか否かを判断する。ステップS105の判断がNoの場合には、ステップS99に戻る。ステップS105の判断がYesの場合には、ステップS106に進む。
ステップS106では、iに1を設定する。ステップS107において、(i-1) を1ビット左シフトしたものに(i-1) をビットリバースしたものを(nbitx+3) ビット左にシフトしたものを加えたものをidx とする。isx はidx と同じ値に設定する。ステップS108において、[0001,0010,0011,0101,0111,1011}の6 つのビットパターンに対して、B1,B2,B3として、 1ビット、2ビット、1ビットをおのおの取り出してidx の2*nbit+4ビット目にB1を、,nbit+3,nbit+2ビット目にB2を、1 ビット目にB3を加えそれに1 を加えてidとする。同様に、isx の2*nbit+4ビット目にB3を、nbit+3,nbit+2ビット目にB2を反転したものを、1 ビット目にB1を加えて、それに1 を加えてisとする。上記6つのビットパターン毎にidおよびisを作り、サブルーチンpermxyを呼び出す。permxyはx(*,is) とx(*,id) を入れ替える。そのときに、x(*,is) およびx(*,id) のビットリバースの並び替えを行なう。ステップS109において、2 次元目の並び替えはないが、1 次元の並び替えが必要なものである、ビットパターン[0000, 1001, 0110, 1111]に対して、一つ前の処理と同じようにidを計算する。perm1dを呼び出して、x(*. id) のビットリバースの並び換えをビットパターン毎に行なう。ステップS110において、iを1だけ増加し、ステップS111において、i>nか否かを判断する。ステップS111の判断がNoの場合には、ステップS107に戻る。ステップS111の判断がYesの場合には、サブルーチンから抜け出る。
図12〜図15は、サブルーチンpermxyの処理を表すフローチャートである。
サブルーチンpermxyは、x(1:n1,id2) およびx(1:n1,is2) を呼び出し元より受け渡されて、x(1:n1,id2) およびx(1:n1,is2) の長さn1のベクトルをビットリバースの並びに並び替えて、その結果の1 次元ベクトルを入れ替える。
ステップS120において、1次元目の大きさのビット数n(n=2**n)を求める。ステップS121において、nが偶数か否かを判断する。ステップS121において、奇数と判断された場合には、ステップS137に進む。ステップS121において、偶数と判断された場合には、ステップS122において、nbitx=(nb-3)/2、nx=2**nbitxを計算する。ステップS123において、iを1に設定し、ステップS124において、jを1に設定する。ステップS125において、j<iか否かを判断する。ステップS125の判断がNoのときは、ステップS129に進む。ステップS125の判断がYesの場合には、ステップS126において、(i-1) を1ビット左シフトしたものに(j-1) をビットリバースしたものを(nbitx+2)ビット左にシフトしたものを加えたものをidx とする。i とjを入れ替えて同じ操作をしたものをisx とする。ステップS127において、0から7までのビットパターンを生成して、 3ビットに左から分けてB1,B2,B3とする。idx の2*nbit+3ビット目にB1を、nbit+2ビット目にB2を、1 ビット目にB3を加えそれに1 を加えてidとする。同様に、isx の2*nbit+3ビット目にB3を、nbit+2ビット目にB2を、1 ビット目にB1を加えそれに1 を加えてisとする。0 から7 までのビットパターンを生成する毎に、このように、idおよびisを作り、x(1:n1, id2),x(1:n1, is2)のx(id,id2),x(is,id2) とx(id,is2),x(is,is2) をロードし、おのおの入れ替えたものを格納するときに、x(id, is2),x(is, is2) およびx(id, id2), x(is, id2)の2つのベクトル間の入れ替えとして行なう。ステップS128において、jを1だけ増加し、ステップS125に戻る。
ステップS129では、iを1だけ増加し、ステップS130において、i>nxであるか否かを判断する。ステップS131において、iを1に設定する。ステップS132において、(i-1) を1ビット左シフトしたものに(i-1) をビットリバースしたものを(nbitx+2) ビット左にシフトしたものを加えたものをidx とする。isx はidx と同じ値に設定する。ステップS133において、{001,011 }の 2つのビットパターンに対して、B1,B2,B3 と 3ビットを取り出してidx の2*nbit+3ビット目にB1を、nbit+2ビット目にB2を、1 ビット目にB3を加えそれに1を加えてidとする。同様に、isx の2*nbit+3ビット目にB3を、nbit+2ビット目にB2を、1 ビット目にB1を加えそれに1 を加えてisとする。{001,011 }の 2つのビットパターン毎にidおよびisを作り、x(1:n1,id2),x(1:n1,is2) のx(id,id2),x(is,id2) とx(id,is2),x(is,is2) をロードし、おのおの入れ替えたものを格納するときにx(id, is2),x(is, is2) およびx(id, id2),x(is, id2) の2つのベクトル間の入れ替えとして行なう。ステップS134において、1次元目の並び替えはないが、id2,is2 次元の並び替えが必要なものである、ビットパターン[000,010,101,111]に対して、一つ前の処理と同じようにidを計算する。(id. id2) とx(id, is2) の交換を各ビットパターン毎に行なう。そして、ステップS135において、iを1だけ増加し、ステップS136において、i>nか否かを判断する。ステップS136の判断がNoの場合には、ステップS132に戻る。ステップS136の判断がYesの場合には、サブルーチンから抜け出る。
ステップS137においては、nbitx=(nb-4)/2、nx=2**nbitxを計算する。ステップS138において、iを1に設定し、ステップS139において、jを1に設定する。ステップS140において、j<iか否かを判断する。ステップS140の判断がNoの場合には、ステップS144に進む。ステップS140の判断がYesの場合には、ステップS141において、(i-1) を1ビット左シフトしたものに(j-1) をビットリバースしたものを(nbitx+3)ビット左にシフトしたものを加えたものをidx とする。i とjを入れ替えて同じ操作をしたものをisx とする。ステップS142において、0から16までのビットパターンを生成して、1ビット、2ビット、1 ビットに左から分けてB1,B2,B3とする。idx の2*nbit+4ビット目にB1を、nbit+3,nbit+2 ビット目にB2を、1 ビット目にB3を加えそれに1を加えてidとする。同様に、isx の2*nbit+4ビット目にB3を、nbit+3, nbit+2ビット目にB2を反転いたものを、1 ビット目にB1を加えてそれに1 を加えてisとする。0 から16までのビットパターンを生成する毎に、このように、idおよびisを作り、x(1:n1, id2),x(1:n1, is2) のx(id, id2), x(is, id2) とx(id, is2), x(is, is2) をロードし、おのおの入れ替えたものを格納するときにx(id, is2), x(is, is2) およびx(id, id2), x(is, id2) の2つのベクトル間の入れ替えとして行なう。ステップS143において、jを1だけ増加させる。ステップS144において、iを1だけ増加させる。ステップS145において、i>nか否かを判断する。ステップS145の判断がNoの場合には、ステップS139に戻る。ステップS145の判断がYesの場合には、ステップS146において、iを1に設定する。ステップS147において、(i-1) を1ビット左シフトしたものに、(i-1) をビットリバースしたものを(nbitx+3) ビット左にシフトしたものを加えたものをidx とする。isx はidx と同じ値に設定する。ステップS148において、[0001,0010,0011,0101,0111,1011}の6 つのビットパターンに対して、B1,B2,B3と 1,2,1ビットをおのおの取り出して、idx の2*nbit+4ビット目にB1を、nbit+3,nbit+2 ビット目にB2を、1 ビット目にB3を加えそれに1を加えてidとする。同様に、isx の2*nbit+4ビット目にB3を、nbit+3, nbit+2ビット目にB2を反転したものを、1 ビット目にB1を加えて、それに1 を加えてisとする。上記6つのビットパターン毎にidおよびisを作り、x(1:n1, id2), x(1:n1, is2) のx(id, id2), x(is, id2) とx(id, is2), x(is, is2) をロードし、おのおの入れ替えたものを格納するときにx(id, is2), x(is, is2) およびx(id, id2), x(is, id2) の2つのベクトル間の入れ替えとして行なう。ステップS149において、2 次元目の並び替えはないが、1 次元の並び替えが必要なものである、ビットパターン[0000, 1001, 0110, 1111]に対して、一つ前の処理と同じようにidを計算する。x(id.id2) とx(id,is2) の交換をビットパターン毎に行なう。ステップS150において、iを1だけ増加し、ステップS151において、i>nか否かを判断する。ステップS151の判断がNoの場合には、ステップS147に戻り、ステップS151の判断がYesの場合には、サブルーチンから抜け出る。
図16〜図19は、サブルーチンperm1dの処理を説明するフローチャートである。
サブルーチンperm1dは、x(1:n1,id2) を呼び出し元より受け渡されて、x(1:n1, id2) の長さn1のベクトルをビットリバースの並びに並び替えを行なう。
ステップS155において、1次元目の大きさのビット数n(n=2**n)を求める。ステップS156において、nが偶数か否かを判断する。ステップS156における判断がYesの場合には、ステップS172に進む。ステップS156の判断がNoの場合には、ステップS157において、nbitx=(nb-3)/2、nx=2**nbitxを計算する。ステップS158において、iを1に設定する。ステップS159において、jを1に設定する。ステップS160において、j<iか否かを判断する。ステップS160の判断がNoの場合には、ステップS164に進む。ステップS160の判断がYesの場合には、ステップS161において、(i-1) を1ビット左シフトしたものに、(j-1) をビットリバースしたものを(nbitx+2)ビット左にシフトしたものを加えたものをidx とする。i とjを入れ替えて同じ操作をしたものをisx とする。ステップS162において、0から7までのビットパターンを生成して、 これを3ビットに左から分けてB1,B2,B3とする。idx の2*nbit+3ビット目にB1を、nbit+2ビット目にB2を、1 ビット目にB3を加えそれに1 を加えてidとする。同様に、isx の2*nbit+3ビット目にB3を、nbit+2ビット目にB2を、1 ビット目にB1を加えそれに1 を加えてisとする。0 から7 までのビットパターンを生成する毎に、このように、idおよびisを作り、x(id, id2)と, x(is, id2) とを入れ換える。ステップS163において、jを1だけ増加し、ステップS164において、iを1だけ増加する。ステップS165において、i>nか否かを判断する。ステップS165の判断がNoのときは、ステップS159に戻る。ステップS165の判断がYesのときは、ステップS166において、iを1と設定する。そして、ステップS167において、(i-1) を1ビット左シフトしたものに、(i-1) をビットリバースしたものを(nbitx+3) ビット左にシフトしたものを加えたものをidx とする。isx はidx と同じ値に設定する。ステップS168において、{001,011 }の 2つのビットパターンに対して、B1,B2,B3 と 3ビットを取り出して、idx の2*nbit+3ビット目にB1を、nbit+2ビット目にB2を、1 ビット目にB3を加えそれに1を加えてidとする。同様に、isx の2*nbit+3ビット目にB3を、nbit+2ビット目にB2を、1 ビット目にB1を加えそれに1 を加えてisとする。{001,011 }の 2つのビットパターン毎に、idおよびisを作り、x(id,id2),x(is,id2) を交換する。ステップS169において、1次元目の並び替えはないが、id2,is2 次元の並び替えが必要なものである、ビットパターン[000, 010, 101, 111]に対して、一つ前の処理と同じようにidを計算する。x(id.id2) とx(id,is2)の交換をビットパターン毎に行なう。ステップS170において、iを1だけ増加し、ステップS171において、i>nか否かを判断する。ステップS171の判断がNoの場合には、ステップS167に戻る。ステップS171の判断がYesの場合には、サブルーチンから抜け出る。
ステップS172においては、nbitx=(nb-4)/2、nx=2**nbitxを計算する。ステップS173において、iを1に設定する。ステップS174において、jを1に設定する。ステップS175において、j<iか否かを判断する。ステップS175の判断がNoの場合には、ステップS179に戻る。ステップS175の判断がYesの場合には、ステップS176において、(i-1) を1ビット左シフトしたものに、(j-1) をビットリバースしたものを(nbitx+3)ビット左にシフトしたものを加えたものをidx とする。i とjを入れ替えて同じ操作をしたものをisx とする。ステップS177において、0から16までのビットパターンを生成して、1,2,1 ビットに左から分けてB1,B2,B3とする。idx の2*nbit+4ビット目にB1を、nbit+3,nbit+2 ビット目にB2を、1 ビット目にB3を加えそれに1を加えてidとする。同様に、isx の2*nbit+4ビット目にB3を、nbit+3,nbit+2ビット目にB2を反転いたものを、1 ビット目にB1を加え、それに1 を加えてisとする。0 から16までのビットパターンを生成する毎に、このように、idおよびisを作り、x(1:n1,id2) のx(id,id2),x(is,id2) を入れ換える。ステップS178において、jを1だけ増加し、ステップS175に戻る。
ステップS179においては、iを1だけ増加し、ステップS180において、i>nか否かを判断する。ステップS180の判断がNoのときは、ステップS174に戻る。ステップS180の判断がYesの場合には、ステップS181において、iを1に設定する。ステップS182において、(i-1) を1ビット左シフトしたものに、(i-1) をビットリバースしたものを(nbitx+3) ビット左にシフトしたものを加えたものをidx とする。isx はidx と同じ値に設定する。ステップS183において、[0001, 0010, 0011, 0101, 0111, 1011}の6 つのビットパターンに対して、B1,B2,B3と 1,2,1ビットをおのおの取り出して、idx の2*nbit+4ビット目にB1を、nbit+3,nbit+2 ビット目にB2を、1 ビット目にB3を加えそれに1を加えてidとする。同様に、isx の2*nbit+4ビット目にB3を、nbit+3,nbit+2ビット目にB2を反転したものを、1 ビット目にB1を加えて、それに1 を加えてisとする。上記6つのビットパターン毎にidおよびisを作り、x(1:n1,id2) のx(id,id2),x(is,id2) を入れ換える。ステップS184において、iを1だけ増加し、ステップS185において、i>nか否かを判断する。ステップS185の判断がNoの場合には、ステップS182に戻る。ステップS185の判断がYesの場合には、サブルーチンから抜け出る。
図20は、3次元目のフーリエ変換処理のフローチャートである。
x(1:n1,j2,1:3n) に関して 1次元の多重度分、 3次元目のフーリエ変換を行なう。
ステップS190において、3次元目の処理においては、前述のs1〜s11の計算を各基数について、各基数のフーリエ変換及び回転因子の積の処理を、1次元目の多重分だけ行なう。ステップS191において、1次元目と2次元目のビットリバースの並び替えを同時に行なう。この場合、サブルーチンbitrb3dを呼び出して実行する。
図21〜図24は、サブルーチンbitrb3dの処理を説明するフローチャートである。
サブルーチンbitrb3d は、x(1:n1,j2,1:n3) 1次元目と 3次元目からなる平面で3次元目に関するビットリバースの並びに並び替えを1次元のベクトル単位で行なう。
ステップS195において、1次元目の大きさのビット数n(n=2**n)を求める。ステップS196において、nが偶数か否かを判断する。ステップS196の判断がYesの場合には、ステップS211に進む。ステップS196の判断がNoの場合には、ステップS197に進む。
ステップS197においては、nbitx=(nb-3)/2、nx=2**nbitxを計算する。ステップS198において、iを1に設定し、ステップS199において、jを1に設定する。ステップS200において、j<iか否かを判断する。ステップS200の判断がNoの場合には、ステップS204に進む。ステップS200の判断がYesの場合には、ステップS201において、(i-1) を1ビット左シフトしたものに、(j-1) をビットリバースしたものを(nbitx+2)ビット左にシフトしたものを加えたものをidx とする。i とjを入れ替えて同じ操作をしたものをisx とする。ステップS202において、0から7までのビットパターンを生成して、 3ビットに左から分けてB1,B2,B3とする。idx の2*nbit+3ビット目にB1を、nbit+2ビット目にB2を、1 ビット目にB3を加えそれに1 を加えてidとする。同様に、isx の2*nbit+3ビット目にB3を、nbit+2ビット目にB2を、1 ビット目にB1を加えそれに1 を加えてisとする。0 から7 までのビットパターンを生成する毎に、このように、idおよびisを作り、x(1:n1,j2,id),x(1:n1,j2,is) を入れ換える。ステップS203において、jを1だけ増加し、ステップS200に戻る。
ステップS204では、iを1だけ増加し、ステップS205において、i>nか否かを判断する。ステップS205の判断の結果がNoの場合には、ステップS199に戻る。ステップS205の判断の結果がYesの場合には、ステップS206において、iを1に設定する。ステップS207において、(i-1) を1ビット左シフトしたものに、(i-1) をビットリバースしたものを(nbitx+2) ビット左にシフトしたものを加えたものをidx とする。isx はidx と同じ値に設定する。ステップS208において、{001,011 }の 2つのビットパターンに対して、B1,B2,B3 と 3ビットを取り出して、idx の2*nbit+3ビット目にB1を、nbit+2ビット目にB2を、1 ビット目にB3を加えそれに1を加えてidとする。同様に、isx の2*nbit+3ビット目にB3を、nbit+2ビット目にB2を、1 ビット目にB1を加えそれに1 を加えてisとする。{001,011 }の 2つのビットパターン毎に id およびisを作り、x(1:n1,j2,id),x(1:n1,j2,is) を交換する。ステップS209においては、1次元目の並び替えはないが、id2,is2 次元の並び替えが必要なものである、ビットパターン[000,010,101,111]に対して、一つ前の処理と同じようにidを計算する。x(1:n1,j2,id),x(1:n1,j2,is) の交換をビットパターン毎に行なう。ステップS210において、i>nか否かを判断する。ステップS210における判断がNoの場合には、ステップS207に戻る。ステップS210における判断がYesの場合には、ステップS211に進む。
ステップS211では、nbitx=(nb-4)/2、nx=2**nbitxを計算する。ステップS212において、iを1だけ増加し、ステップS213において、jを1だけ増加する。ステップS214において、j<iか否かを判断する。ステップS214の判断がNoの場合には、ステップS218に進む。ステップS214の判断がYesの場合には、ステップS215において、(i-1) を1ビット左シフトしたものに、(j-1) をビットリバースしたものを(nbitx+3)ビット左にシフトしたものを加えたもをidx とする。i とjを入れ替えて同じ操作をしたものをisx とする。ステップS216において、0から16までのビットパターンを生成して、1,2,1 ビットに左から分けてB1,B2,B3とする。idx の2*nbit+4ビット目にB1を、nbit+3,nbit+2 ビット目にB2を、1 ビット目にB3を加えそれに1を加えてidとする。同様に、isx の2*nbit+3ビット目にB3を、nbit+3, nbit+2ビット目にB2を反転いたものを、1 ビット目にB1を加えて、それに1 を加えてisとする。0 から16までのビットパターンを生成する毎に、このように、idおよびisを作り、x(1:n1,j2,id),x(1:n1,j2,is) を入れ換える。ステップS217において、jを1だけ増加させ、ステップS214に戻る。
ステップS218では、iを1だけ増加し、ステップS219で、i>nか否かを判断する。ステップS219の判断がNoの場合には、ステップS213に戻る。ステップS219の判断がYesの場合には、ステップS220に進む。ステップS220においては、iを1と設定する。ステップS221においては、(i-1) を1ビット左シフトしたものに、(i-1) をビットリバースしたものを(nbitx+3) ビット左にシフトしたものを加えたものをidx とする。isx はidx と同じ値に設定する。ステップS222において、[0001, 0010, 0011, 0101, 0111, 1011}の6 つのビットパターンに対して、B1, B2, B3と 1,2,1ビットをおのおの取り出して、idx の2*nbit*3ビット目にB1を、nbit+2ビット目にB2を、1 ビット目にB3を加えそれに1 を加えてidとする。同様に、isx の2*nbit+4ビット目にB3を、nbit+3,nbit+2ビット目にB2を反転したものを、1 ビット目にB1を加えて、それに1 を加えてisとする。上記6つのビットパターン毎に、idおよびisを作り、x(1:n1,j2,id),x(1:n1,j2,is) を入れ換える。ステップS223において、iを1だけ増加し、ステップS224において、i>nか否かを判断する。ステップS224の判断がNoの場合には、ステップS221に戻り、ステップS224の判断がYesの場合には、サブルーチンから抜け出る。
(付記1)
連続したデータ領域へのアクセスが高速化された、1次元目のインデックスをi、2次元目をj、3次元目をkとしたとき、入力データx(i、j、k)のiの連続する方向に並んだデータを連続領域に格納する共有メモリ型スカラ並列計算機における3次元フーリエ変換処理方法において、
インデックスiとjからなる2次元配列データx(i、j、*)(*は、kの取りうる任意の値)を単位として、キャッシュにロードし、
インデックスiが変化する方向への1次元目のフーリエ変換を、iを連続に変化させながら、j方向の多重度分行い、
インデックスjが変換する方向への2次元目のフーリエ変換を、iが連続して変化する方向への演算を優先して、i方向の多重度分行ない、
インデックスkが変化する方向への3次元目のフーリエ変換を行なう
ことを特徴とする3次元フーリエ変換処理方法。
(付記2)
前記3次元目のフーリエ変換を行うステップは、
インデックスiとkからなる2次元配列データx(i、*、k)(*は、jの取りうる任意の値)を単位として、キャッシュにロードし、
インデックスkが変化する方向への3次元目のフーリエ変換を、iが連続して変化する方向への演算を優先して、i方向の多重度分行なう
ことを特徴とする付記1に記載の3次元フーリエ変換処理方法。
(付記3)
前記1次元目、2次元目、3次元目のそれぞれのフーリエ変換は、それぞれの次元を表すインデックスの取りうる値の数を基数に分解し、該基数を基礎とした小さなフーリエ変換と回転因子の積の繰り返し処理によって行なうことを特徴とする付記2に記載の3次元フーリエ変換処理方法。
(付記4)
前記小さなフーリエ変換は、キャッシュにロードされた2次元配列のうちから1行ずつ読み出し、データ長を基数に分解して、データを基数×整数の2次元配列とみなして処理して、作業域に転置した配列として結果を格納することを特徴とする付記3に記載の3次元フーリエ変換処理方法。
(付記5)
1次元目方向のビットリバースと2次元目方向のビットリバースを、ビットリバースを行なうべきデータがレジスタ上にある間に、同時に行なうことを特徴とする付記1に記載の3次元フーリエ変換処理方法。
(付記6)
前記同時に行われるビットリバースは、フーリエ変換されるべきデータの長さが、2の冪で表される場合に適用されることを特徴とする付記5に記載の3次元フーリエ変換処理方法。
(付記7)
前記フーリエ変換は、Cooley-Tukeyの方法で実行されることを特徴とする付記1または2に記載の3次元フーリエ変換処理方法。
(付記8)
連続したデータ領域へのアクセスが高速化された、1次元目のインデックスをi、2次元目をj、3次元目をkとしたとき、入力データx(i、j、k)のiの連続する方向に並んだデータを連続領域に格納する共有メモリ型スカラ並列計算機における3次元フーリエ変換処理方法を該共有メモリ型スカラ並列計算機に実現させるプログラムにおいて、
インデックスiとjからなる2次元配列データx(i、j、*)(*は、kの取りうる任意の値)を単位として、キャッシュにロードし、
インデックスiが変化する方向への1次元目のフーリエ変換を、iを連続に変化させながら、j方向の多重度分行い、
インデックスjが変換する方向への2次元目のフーリエ変換を、iが連続して変化する方向への演算を優先して、i方向の多重度分行ない、
インデックスkが変化する方向への3次元目のフーリエ変換を行なう
ことを特徴とする3次元フーリエ変換処理方法を該共有メモリ型スカラ並列計算機に実現させるプログラム。
(付記9)
前記3次元目のフーリエ変換を行うステップは、
インデックスiとkからなる2次元配列データx(i、*、k)(*は、jの取りうる任意の値)を単位として、キャッシュにロードし、
インデックスkが変化する方向への3次元目のフーリエ変換を、iが連続して変化する方向への演算を優先して、i方向の多重度分行なう
ことを特徴とする付記8に記載の3次元フーリエ変換処理方法を該共有メモリ型スカラ並列計算機に実現させるプログラム。
(付記10)
1次元目方向のビットリバースと2次元目方向のビットリバースを、ビットリバースを行なうべきデータがレジスタ上にある間に、同時に行なうことを特徴とする付記8に記載の3次元フーリエ変換処理方法を該共有メモリ型スカラ並列計算機に実現させるプログラム。
(付記11)
連続したデータ領域へのアクセスが高速化された、1次元目のインデックスをi、2次元目をj、3次元目をkとしたとき、入力データx(i、j、k)のiの連続する方向に並んだデータを連続領域に格納する共有メモリ型スカラ並列計算機における3次元フーリエ変換処理装置において、
インデックスiとjからなる2次元配列データx(i、j、*)(*は、kの取りうる任意の値)を単位として、キャッシュにロードするロード手段と、
インデックスiが変化する方向への1次元目のフーリエ変換を、iを連続に変化させながら、j方向の多重度分行う1次元目変換手段と、
インデックスjが変換する方向への2次元目のフーリエ変換を、iが連続して変化する方向への演算を優先して、i方向の多重度分行う2次元目変換手段と、
インデックスkが変化する方向への3次元目のフーリエ変換を行なう3次元目変換手段と、
を備えることを特徴とする3次元フーリエ変換処理装置。
(付記12)
前記3次元目変換手段は、
インデックスiとkからなる2次元配列データx(i、*、k)(*は、jの取りうる任意の値)を単位として、キャッシュにロードする手段と、
インデックスkが変化する方向への3次元目のフーリエ変換を、iが連続して変化する方向への演算を優先して、i方向の多重度分行なう手段と、
を備えることを特徴とする付記11に記載の3次元フーリエ変換処理装置。
(付記13)
1次元目方向のビットリバースと2次元目方向のビットリバースを、ビットリバースを行なうべきデータがレジスタ上にある間に、同時に行なうことを特徴とする付記11に記載の3次元フーリエ変換処理装置。
本発明の実施形態の2次元面でのフーリエ変換の仕方を説明する図である。 本発明の実施形態の3次元フーリエ変換の処理を説明するフローチャートである。 図2における3次元目のフーリエ変換の処理を示すフローチャートである。 本発明の実施形態に従った、アクセスパターンが連続で、かつ同じパターンで最後のループ並び替えを同時に行ない、かつ、データの先読みを行なう1次元フーリエ変換のフローチャートである。 サブルーチンfft1の処理を示すフローチャートである。 本発明の実施形態に従った、サブルーチンfft2の処理を説明するフローチャートである。 2次元変換でビットリバースの並び替えを同時に行なう方法を説明するフローチャートである。 サブルーチンbitrb2dの処理を説明するフローチャート(その1)である。 サブルーチンbitrb2dの処理を説明するフローチャート(その2)である。 サブルーチンbitrb2dの処理を説明するフローチャート(その3)である。 サブルーチンbitrb2dの処理を説明するフローチャート(その4)である。 サブルーチンpermxyの処理を表すフローチャート(その1)である。 サブルーチンpermxyの処理を表すフローチャート(その2)である。 サブルーチンpermxyの処理を表すフローチャート(その3)である。 サブルーチンpermxyの処理を表すフローチャート(その4)である。 サブルーチンperm1dの処理を説明するフローチャート(その1)である。 サブルーチンperm1dの処理を説明するフローチャート(その2)である。 サブルーチンperm1dの処理を説明するフローチャート(その3)である。 サブルーチンperm1dの処理を説明するフローチャート(その4)である。 3次元目のフーリエ変換処理のフローチャートである。 サブルーチンbitrb3dの処理を説明するフローチャート(その1)である。 サブルーチンbitrb3dの処理を説明するフローチャート(その2)である。 サブルーチンbitrb3dの処理を説明するフローチャート(その3)である。 サブルーチンbitrb3dの処理を説明するフローチャート(その4)である。
符号の説明
S10 3次元目スレッド割り当てステップ
S11 2次元フーリエ変換ステップ
S12 2次元目スレッド割り当てステップ
S13 3次元目フーリエ変換ステップ

Claims (6)

  1. 連続したデータ領域へのアクセスが高速化された、1次元目のインデックスをi、2次元目をj、3次元目をkとしたとき、入力データx(i、j、k)のiの連続する方向に並んだデータを連続領域に格納する共有メモリ型スカラ並列計算機における3次元フーリエ変換処理方法において、
    該共有メモリ型スカラ並列計算機は、
    インデックスiとjからなる2次元配列データx(i、j、*)(*は、kの取りうる任意の値)を単位として、キャッシュにロードし、
    インデックスiが変化する方向への1次元目のフーリエ変換を、iを連続に変化させながら、j方向の多重度分行い、
    インデックスjが変化する方向への2次元目のフーリエ変換を、iが連続して変化する方向への演算を優先して、i方向の多重度分行ない、
    インデックスkが変化する方向への3次元目のフーリエ変換を行い、
    前記3次元目のフーリエ変換を行うステップは、
    インデックスiとkからなる2次元配列データx(i、*、k)(*は、jの取りうる任意の値)を単位として、キャッシュにロードし、
    インデックスkが変化する方向への3次元目のフーリエ変換を、iが連続して変化する方向への演算を優先して、i方向の多重度分行ない、
    1次元目方向のビットリバースと2次元目方向のビットリバースを、ビットリバースを行なうべきデータがレジスタ上にある間に、同時に行なう
    ことを特徴とする3次元フーリエ変換処理方法。
  2. 前記1次元目、2次元目、3次元目のそれぞれのフーリエ変換は、それぞれの次元を表すインデックスの取りうる値の数を基数に分解し、該基数を基礎とした小 さなフーリエ変換と回転因子の積の繰り返し処理によって行なうことを特徴とする請求項1に記載の3次元フーリエ変換処理方法。
  3. 前記小さなフーリエ変換は、キャッシュにロードされた2次元配列のうちから1行ずつ読み出し、データ長を基数に分解して、データを基数×整数の2次元配列 とみなして処理して、作業域に転置した配列として結果を格納することを特徴とする請求項2に記載の3次元フーリエ変換処理方法。
  4. 前記同時に行われるビットリバースは、フーリエ変換されるべきデータの長さが、2の冪で表される場合に適用されることを特徴とする請求項に記載の3次元 フーリエ変換処理方法。
  5. 前記フーリエ変換は、Cooley-Tukeyの方法で実行されることを特徴とする請求項1に記載の3次元フーリエ変換処理方法。
  6. 連続したデータ領域へのアクセスが高速化された、1次元目のインデックスをi、2次元目をj、3次元目をkとしたとき、入力データx(i、j、k)のiの 連続する方向に並んだデータを連続領域に格納する共有メモリ型スカラ並列計算機における3次元フーリエ変換処理方法を該共有メモリ型スカラ並列計算機に実現させるプログラムにおいて、
    インデックスiとjからなる2次元配列データx(i、j、*)(*は、kの取りうる任意の値)を単位として、キャッシュにロードし、
    インデックスiが変化する方向への1次元目のフーリエ変換を、iを連続に変化させながら、j方向の多重度分行い、
    インデックスjが変化する方向への2次元目のフーリエ変換を、iが連続して変化する方向への演算を優先して、i方向の多重度分行ない、
    インデックスkが変化する方向への3次元目のフーリエ変換を行い、
    前記3次元目のフーリエ変換を行うステップは、
    インデックスiとkからなる2次元配列データx(i、*、k)(*は、jの取りうる任意の値)を単位として、キャッシュにロードし、
    インデックスkが変化する方向への3次元目のフーリエ変換を、iが連続して変化する方向への演算を優先して、i方向の多重度分行ない、
    1次元目方向のビットリバースと2次元目方向のビットリバースを、ビットリバースを行なうべきデータがレジスタ上にある間に、同時に行なう
    とを特徴とする3次元フーリエ変換処理方法を該共有メモリ型スカラ並列計算機に実現させるプログラム。
JP2006058875A 2006-03-06 2006-03-06 共用メモリ型スカラ並列計算機向け、高速3次元フーリエ変換処理方法 Expired - Fee Related JP4607796B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2006058875A JP4607796B2 (ja) 2006-03-06 2006-03-06 共用メモリ型スカラ並列計算機向け、高速3次元フーリエ変換処理方法
US11/452,360 US7467053B2 (en) 2006-03-06 2006-06-14 Three-dimensional fourier transform processing method for shared memory scalar parallel computer

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2006058875A JP4607796B2 (ja) 2006-03-06 2006-03-06 共用メモリ型スカラ並列計算機向け、高速3次元フーリエ変換処理方法

Publications (2)

Publication Number Publication Date
JP2007241349A JP2007241349A (ja) 2007-09-20
JP4607796B2 true JP4607796B2 (ja) 2011-01-05

Family

ID=38472632

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006058875A Expired - Fee Related JP4607796B2 (ja) 2006-03-06 2006-03-06 共用メモリ型スカラ並列計算機向け、高速3次元フーリエ変換処理方法

Country Status (2)

Country Link
US (1) US7467053B2 (ja)
JP (1) JP4607796B2 (ja)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE102005045519A1 (de) * 2005-09-23 2007-03-29 Newlogic Technologies Ag Verfahren und Vorrichtung zur FFT Berechnung
US7861060B1 (en) * 2005-12-15 2010-12-28 Nvidia Corporation Parallel data processing systems and methods using cooperative thread arrays and thread identifier values to determine processing behavior
US7836116B1 (en) * 2006-06-15 2010-11-16 Nvidia Corporation Fast fourier transforms and related transforms using cooperative thread arrays
US7640284B1 (en) 2006-06-15 2009-12-29 Nvidia Corporation Bit reversal methods for a parallel processor
JP5654373B2 (ja) * 2011-02-01 2015-01-14 株式会社富士通アドバンストエンジニアリング 演算装置、演算方法およびプログラム
CN104932842B (zh) * 2015-06-18 2018-03-02 武汉新芯集成电路制造有限公司 一种将三维存储器的三维比特数据转换成二维比特图的方法
WO2018213438A1 (en) * 2017-05-16 2018-11-22 Jaber Technology Holdings Us Inc. Apparatus and methods of providing efficient data parallelization for multi-dimensional ffts

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2002049612A (ja) * 2000-08-04 2002-02-15 Concurrent Nippon Corp 演算方法
JP2002163247A (ja) * 2000-11-24 2002-06-07 Fujitsu Ltd 共有メモリ型スカラ並列計算機における多次元フーリエ変換の並列処理方法
JP2005202911A (ja) * 2003-12-19 2005-07-28 Fujitsu Ltd 1次元フーリエ変換プログラム

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2002049612A (ja) * 2000-08-04 2002-02-15 Concurrent Nippon Corp 演算方法
JP2002163247A (ja) * 2000-11-24 2002-06-07 Fujitsu Ltd 共有メモリ型スカラ並列計算機における多次元フーリエ変換の並列処理方法
JP2005202911A (ja) * 2003-12-19 2005-07-28 Fujitsu Ltd 1次元フーリエ変換プログラム

Also Published As

Publication number Publication date
JP2007241349A (ja) 2007-09-20
US7467053B2 (en) 2008-12-16
US20070208795A1 (en) 2007-09-06

Similar Documents

Publication Publication Date Title
JP4607796B2 (ja) 共用メモリ型スカラ並列計算機向け、高速3次元フーリエ変換処理方法
CN109964203B (zh) 数据并行计算设备的排序
Flanders A unified approach to a class of data movements on an array processor
Li et al. Quantum multi-level wavelet transforms
Jaffali et al. Quantum entanglement involved in Grover’s and Shor’s algorithms: the four-qubit case
Bárány et al. Self-similar and Self-affine Sets and Measures
JP3639207B2 (ja) 共有メモリ型スカラ並列計算機における多次元フーリエ変換の並列処理方法
Pike et al. Decycling Cartesian products of two cycles
Duff Parallel algorithms for sparse matrix solution
Ellert et al. Parallel external memory wavelet tree and wavelet matrix construction
Bourbakis et al. A fractal-based image processing language: formal modeling
Alsuwaiyel Parallel Algorithms
Imanaga et al. Simple iterative trial search for the maximum independent set problem optimized for the GPUs
Stojmenovic Listing combinatorial objects in parallel
Burkhardt Graph connectivity in log steps using label propagation
Fuentes-Sepúlveda et al. Succinct encoding of binary strings representing triangulations
Romero et al. Graphs with large girth and chromatic number are hard for Nullstellensatz
He et al. Using graphics processors for high performance SimRank computation
Bijoy et al. RBS: a new comparative and better solution of sorting algorithm for array
Grigori Introduction to communication avoiding algorithms for direct methods of factorization in linear algebra
Munthe-Kaas Superparallel FFTs
Izadkhah Basic Data Structure
Goswami Memory-efficient all-pair suffix-prefix overlaps on GPU
Patel Review on Various Sorting Algorithm
Johnsson Massively parallel computing: Data distribution and communication

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20081022

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20100223

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100302

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100430

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20100601

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100830

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20100908

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20101005

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20101007

R150 Certificate of patent or registration of utility model

Ref document number: 4607796

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20131015

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees