2

社内の FFT アルゴリズムを使用するかなり複雑なプログラムがあります。私は最近、パフォーマンスを向上させるために FFTW を使用することにしました。FFTW がリンクして実行されることを確認するための簡単なテストとして、次のコードをアプリケーションの先頭に追加しましたが、実行すると、fftwf_plan.

const size_t size = 1024;
vector<complex<float> > data(size);
for(size_t i = 0; i < size; ++i) data[i] = complex<float>(i, -i);

fftwf_plan plan =
    fftwf_plan_dft_1d(size,
                      (fftwf_complex*)&data[0],
                      (fftwf_complex*)&data[0],
                      FFTW_FORWARD,
                      FFTW_ESTIMATE);
// ^ seg faults here ^

fftwf_execute(plan);
fftwf_destroy_plan(plan);

これを引き起こしているアイデアはありますか?

FFTW 3.3 を使用。g++ 4.1.1 と icc 11.1 の 2 つの異なるコンパイラを試しました。また、コア ファイル file は、重要なことを何も示していません。

Thread 1.1: Error at 0x00000000
Stack Trace: PC: 000000, FP=Hex Address

編集

次のコマンドを使用して、FFTW を再構成してデバッグを追加しました。

setenv CFLAGS "-fPIC -g -O0"
configure --enabled-shared --enable-float --enable-debug
make
make install

プログラムにセグメンテーション違反がある場合、それはメソッド内のランダムな場所にありfftwf_plan_dft_1d()ますが、スタック トレースは、searchによって呼び出される関数内またはその下にあることを常に示していmkplanます。

4

3 に答える 3

3

明らかに、この問題はマルチスレッドに起因しています。主要な関数は FFTW でスレッド セーフですが (例: fftwf_execute)、プランを作成する関数はそうではありません。これは、起動時にテストを実行するだけで失敗した理由を完全には説明していませんが、プランの作成をミューテックス ロックで説明すると、セグメンテーション フォールトは停止しました。

于 2011-10-03T14:39:36.020 に答える
2

プランの作成と破棄はシングル スレッドである必要があります

fftw_init_threads();
#pragma omp parallel for
for(i=0;i<n;i++) {
   #pragma omp critical {
     plan = fftw_create_plan....
   }
   fftw_execute(plan); // or the fftw_execute_dft for multiple in/out fft operations
   #pragma omp critical {
     fftw_destroy_plan(plan);
   }
}
fftw_cleanup_threads();
于 2018-08-01T19:12:59.723 に答える
0

私は3年遅れていますが、マルチスレッド(--enable-openmpおよびfftw_plan_with_nthreads(omp_get_max_threads()))を使用している場合にも、非常によく似た問題に遭遇しました。私のセグは で故障しましたfftw_destroy_plan(p)

コードを再構築するときに注意を払っていなかったことが判明し、呼び出すfftw_cleanup_threads()前に呼び出しfftw_destroy_plan(p)ていました...愚かなことは知っていますが、約1時間尻尾を追いかけました。

マルチスレッドを使用する場合、fftw* 関数の前に呼び出す必要があるのとfftw_cleanup_threads()同様に、すべての fftw* 関数の後に呼び出すfftw_init_threads()必要があります。

于 2014-10-20T04:32:19.167 に答える