回答編集履歴

2

追記

2016/11/12 15:30

投稿

ikedas
ikedas

スコア4352

test CHANGED
@@ -12,7 +12,11 @@
12
12
 
13
13
  「2次元化FFT」というのは正式な呼び名ではないかもしれません。「six-step FFT」のほうがウェブ検索でよくヒットします。詳しい解説としては、たとえば計算物質科学イニシアティブでの2014年の講義「[大規模系での高速フーリエ変換1](http://www.cms-initiative.jp/ja/research-support/develop-support/how-to-publish/develop-apps/apps-implement/2014-haishinB-06)」などはどうでしょう。「n=n1n2に対するFFTアルゴリズム」のところからです。
14
14
 
15
- 簡単に言うと、N = n1・n2個のサンプルをn1 × n2の2次元に配列し直し、n1個の行とn2個の列のそれぞれでFFTを実行し、それらn1 + n2回のFFTの結果からN個の場合のFFTの結果を計算する、という手法です。計算の各ステップでは、n1個またはn2個のデータだけがメモリ上にあればいいことになります。
15
+ 簡単に言うと、N = n1・n2個のサンプルをn1 × n2の2次元に配列し直し、n1個の行とn2個の列のそれぞれで1次元FFTを実行し、それら2・n1n2回のFFTの結果からN個の場合のFFTの結果を計算する、という手法です。計算の各ステップでは、n1個またはn2個のデータだけがメモリ上にあればいいことになります。必要ないデータは外部記憶に書き出し、必要になったら読み込みます。
16
16
 
17
17
  上記の講義でも述べているように、もともとこの手法は、FFTのサンプル数がCPUの[キャッシュメモリ](https://ja.wikipedia.org/wiki/L2%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5)のサイズと比較して大きいと、キャッシュミスが多発して処理速度が著しく低下する、ということへの対策として考えられたようです。しかし今回の場合は、メインメモリをディスクに、キャッシュメモリをメインメモリに置きかえて考えてみて下さい。
18
18
 
19
+ (11/12さらに追記。また前回追記分で式がおかしいところを直しました)
20
+
21
+ ともかく、この手法は1次元FFTについて計算の各ステップで必要なメモリを節約しているだけで、4次元分の計算が必要なことは変わりません。でも、1次元分だけに適用して他の次元は全範囲をメモリに置くとしても、回答冒頭の例では必要メモリ量が`2**5 * 2**10**3 * 2 = 2**36`バイトに減らせます。かなり現実的な数字になってきますね。
22
+

1

six-step FFTの情報を追記

2016/11/12 15:30

投稿

ikedas
ikedas

スコア4352

test CHANGED
@@ -6,3 +6,13 @@
6
6
 
7
7
  こういったマイナス要因があってもなお、許容できる時間内で結果が出せそうであれば、試す価値はあると思います。
8
8
 
9
+ ---
10
+
11
+ (追記)
12
+
13
+ 「2次元化FFT」というのは正式な呼び名ではないかもしれません。「six-step FFT」のほうがウェブ検索でよくヒットします。詳しい解説としては、たとえば計算物質科学イニシアティブでの2014年の講義「[大規模系での高速フーリエ変換1](http://www.cms-initiative.jp/ja/research-support/develop-support/how-to-publish/develop-apps/apps-implement/2014-haishinB-06)」などはどうでしょう。「n=n1n2に対するFFTアルゴリズム」のところからです。
14
+
15
+ 簡単に言うと、N = n1・n2個のサンプルをn1 × n2の2次元に配列し直し、n1個の行とn2個の列のそれぞれでFFTを実行し、それらn1 + n2回のFFTの結果からN個の場合のFFTの結果を計算する、という手法です。計算の各ステップでは、n1個またはn2個のデータだけがメモリ上にあればいいことになります。
16
+
17
+ 上記の講義でも述べているように、もともとこの手法は、FFTのサンプル数がCPUの[キャッシュメモリ](https://ja.wikipedia.org/wiki/L2%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5)のサイズと比較して大きいと、キャッシュミスが多発して処理速度が著しく低下する、ということへの対策として考えられたようです。しかし今回の場合は、メインメモリをディスクに、キャッシュメモリをメインメモリに置きかえて考えてみて下さい。
18
+