0

JTransfromsに{1850000,1}要素のベクトルがありますが、ログに記録します。

exception in thread "main" java.lang.OutOfMemoryError: Java heap space 1350 000

それは動作します...しかしそれでも約1分かかります!! それは私には多すぎます..スレッドで..matlabでは約2秒かかります。Jtransの公式ウェブで。

:limitations:2の累乗ではないサイズの1D変換はシーケンシャルです(混基数が使用されている場合)。2の累乗サイズの1D変換では、2つまたは4つのスレッドしか使用できません。

スレッドの数は2の累乗の数でなければなりません。

誰かがこの2の力のサイズが何であるかを説明できますか?

4

2 に答える 2

0

基数 2 の制限を説明するために、FFT の背景を少し投稿します。

最初に注意すべきことは、ほとんどの FFT 実装がCT FFT アルゴリズムを使用することです。これは、マージソートが最初にソートを基本ケースに制限するのと同じように、FFT をより小さな FFT に分割することによって機能します。

CT アルゴリズムがこれを行う最も一般的な方法は、問題を半分に分割することです( N = N0 / 2)。混合基数のケースが不可能であると言っているわけではありませんが、次の理由から、「2 の累乗」のケースが最も効率的であり、したがって最もよく使用されます。

現在、ほとんどの FFT 実装の主なボトルネックは、アルゴリズムの実装ではなく、ハードウェア (プロセッサ パイプラインなど) です。明らかに、これらはすべてバイナリ ロジックの基礎に基づいて構築されており、帯域幅はほぼ 2 Nになります。

このため、メモリ内で 2 Nバイトを使用する FFT は、レジスタに正確に適合し、元の問題が正確に細分されるため、より高速に計算されます。

TL;DR: 最も近い 2 の累乗に達するまで、無関係なデータ (0) で FFT ベクトルをパディングします。その後、有効な結果データのみを使用します。

ただし、例外は、メモリが不足しているように見えます。32 ビット OS を使用していますか? その場合、大規模な操作の結果として、割り当てられた 2 GB のプロセス メモリまたはその他の制約を超えて実行されている可能性があります。

于 2012-10-24T15:49:56.590 に答える
0

2 のべき乗は (コンピュータが存在する場合) 係数 2 のみを持つ数です。それは 2、4、8、16、...、1024 2048 などです。したがって、正確に 1024 の数を持つベクトルを入力として使用すると、より速く進むべきです。

「約 {1850 000,1} 要素」というのが何を意味するのかよくわかりませんが、あなたの数はもっと多いのではないでしょうか? ライブラリは明らかに 4 つ以上のスレッドを使用しないため (いずれにせよ、多くのシステムではあまり機能しません)、速度が大幅に向上することはありません。別の問題が関係している可能性があります。

于 2012-10-24T15:43:13.733 に答える