読者です 読者をやめる 読者になる 読者になる

nariba’s blog

コンピュータ関連のメモとか

FFTWをOpenMPで並列化しようと思ったらSegmentation違反を起こしまくって困ってた話

FFTWとはFFT(Fast Fourier Transform)の実装の一つであり,ライブラリとして提供されている.
これを簡単な並列処理のライブラリであるOpenMPを使って並列化しようと思ったらけっこう大変だったのでそのメモ.



参考:
stackoverflow.com


 

実はFFTWではOpenMPとか,MPIとかを使って並列化することが可能.
で,以下のようなソースコードを実行しようとするとSegmentation違反が止まらない….
 

#pragma omp parallel for private(ptr)
for(x=0; x<N; x++) {
  ptr = hogehoge;
  fftw_plan p;
  p = fftw_plan_dft_1d(N, (fftw_complex*)ptr, (fftw_complex*)ptr, FFTW_FORWARD, FFTW_ESTIMATE);
  fftw_execute(p);
  fftw_destroy_plan(p);
}

参考の方にもあるように,fftw_plan_dft_1d();,fftw_destroy_plan();はマルチスレッドで同時実行してはいけないらしい….
なので,
メモリ節約を重視するなら以下のように…

#pragma omp parallel for private(ptr)
for(x=0; x<N; x++) {
  ptr = hogehoge;
  fftw_plan p;
  #pragma omp critical(plan)
  {
    p = fftw_plan_dft_1d(N, (fftw_complex*)ptr, (fftw_complex*)ptr, FFTW_FORWARD, FFTW_ESTIMATE);
  }
  fftw_execute(p);
  #pragma omp critical(plan)
  {
    fftw_destroy_plan(p);
  }
}

パフォーマンス重視なら事前に必要なplanを1スレッドで作成,1スレッドでプランの破棄を行うってのもありな気がするけど,
それはそれで性能が出るのか試してないので試してみたい.