[ English | Japanese ]

FFTW3インタフェース (C用)

概要

FFTW3インタフェースは、FFTW version 3.xとほぼ互換のインタフェースをもつライブラリです (一部の関数および定数は未対応)。 FFTWのヘッダファイルを差し替えるだけで、FFTWを使用しているユーザプログラムから、 Vector Engine向けに高度にチューニングされたASLのフーリエ変換関数を使用することができます。 オリジナルのFFTWは、FFTW公式サイト[1]で公開されているオープンソースのフーリエ変換ライブラリです。 詳細は、FFTWのドキュメント[2]を参照してください。

FFTW3インタフェースの使用方法

ヘッダファイル名の変更

FFTW3インタフェースのヘッダファイルは、オリジナルのFFTWで提供されているものとファイル名が異なります。 FFTW3インタフェースを使用する場合は、以下のようにヘッダファイル名を変更してください。

#include <fftw3.h>  ⇒  #include <aslfftw3.h>

複素数型の選択

FFTW3インタフェースでは、複素数型が次のように定義されます。

倍精度複素数 単精度複素数
C++ complex<double> complex<float>
C99 double _Complex float _Complex
オリジナルFFTW double[2] float[2]

オリジナルのFFTWと同じ配列型で利用したい場合、 コンパイルオプションとして -DASLFFTW_COMPLEX_LEGACY を追加してください。

コンパイルとリンク

コンパイルとリンクには、FFTW3のコンパイル方法およびリンク方法を記載しています。

スレッドセーフ性

ASL FFTW3インタフェースは内部でASL統合インタフェースを使用しており、スレッドセーフ性はASL統合インタフェースのそれに準じます。(ASL統合インタフェースのスレッドセーフ性についてはこちらを参照下さい。)

  • 逐次版および分散メモリ並列版 (つまり MPI 版)のASLライブラリをリンクした場合、ASL FFW3インタフェースの関数はスレッドセーフでありません。特定のスレッドがプランを生成、破棄している間に、他のスレッドがライブラリ呼び出しを行わないようにしなければなりません。この要件を満たせば、各スレッドで異なるプランが用いられている場合に限り、複数スレッドから同時にライブラリ呼び出しを行えます。
    並列リージョン内の各スレッドでその関数を呼び出したい場合は、1.と2.の両方を実施してください。
    1. 各スレッドが使用するプランを並列リージョン外で生成および破棄するようにしてください。並列リージョン内ではomp_get_thread_num()が返すスレッド番号に応じて別々のプランを使い分けてください。
    2. 逐次版または分散メモリ並列版のASLライブラリをリンクしてください。(リンク方法についてはこちらを参照下さい。)
    なお、自動並列ループについては、この方法をとれず、不可能であること、ご了承ください。
  • 共有メモリ並列版およびハイブリッド並列版(共有メモリ並列+MPI版)のASLライブラリをリンクした場合、ASL FFW3インタフェースの関数は部分的にスレッドセーフであり、内部でスレッド並列化されています。プランを生成、破棄することが複数スレッドで同時にできます。
    • NEC Numeric Library Collection バージョン 2.3.0以降
      プランは複数のスレッド間で共用できます。ただし、FFT実行関数は内部で既にスレッド並列化されていますので、プランはプログラムのマルチスレッド化された部分(例えば並列リージョン)の外で使用することを強く推奨します。
    • NEC Numeric Library Collection バージョン 2.2.0以前
      プランは複数のスレッドで共用しないでください。FFT実行関数は内部で既にスレッド並列化されていますので、プランはプログラムのマルチスレッド化された部分(例えば並列リージョン)の外で使用することを強く推奨します。

FFTW3インタフェースのソースコード

FFTW3インタフェースのソースコードは、以下の圧縮ファイルに格納しています。

/opt/nec/ve/nlc/X.X.X/src/aslfftw3-Y.Y.tar.gz
(X.X.XはNEC Numeric Library Collectionのバージョン番号)
(Y.YはFFTW3インタフェースのバージョン番号)

BSDライセンスのもとに自由に使用することができます。

利用可能な関数

FFTW3インタフェースで利用可能な関数はFFTW3インタフェース関数一覧に記載しています。

注意事項
  • プラン生成関数の引数"flags"に、以下のフラグが設定された場合でも、FFTW_ESTIMATEとして処理を行います。
    • FFTW_MEASURE
    • FFTW_PATIENT
    • FFTW_EXHAUSTIVE
    • FFTW_WISDOM_ONLY
  • プラン生成に失敗した場合、プラン生成関数はNULLを返します。
  • FFTW3インタフェース関数一覧に記載のないインタフェース関数はサポートしていません。

FFTW3インタフェース関数一覧

プラン生成

逐次版 / 共有メモリ並列版 分散メモリ並列版
  • fftw_plan_dft_1d()
  • fftwf_plan_dft_1d()
 
  • fftw_plan_dft_2d()
  • fftwf_plan_dft_2d()
  • fftw_mpi_plan_dft_2d()
  • fftwf_mpi_plan_dft_2d()
  • fftw_plan_dft_3d()
  • fftwf_plan_dft_3d()
  • fftw_mpi_plan_dft_3d()
  • fftwf_mpi_plan_dft_3d()
  • fftw_plan_dft()
  • fftwf_plan_dft()
  • fftw_mpi_plan_dft()
  • fftwf_mpi_plan_dft()
  • fftw_plan_dft_r2c_1d()
  • fftwf_plan_dft_r2c_1d()
 
  • fftw_plan_dft_r2c_2d()
  • fftwf_plan_dft_r2c_2d()
  • fftw_mpi_plan_dft_r2c_2d()
  • fftwf_mpi_plan_dft_r2c_2d()
  • fftw_plan_dft_r2c_3d()
  • fftwf_plan_dft_r2c_3d()
  • fftw_mpi_plan_dft_r2c_3d()
  • fftwf_mpi_plan_dft_r2c_3d()
  • fftw_plan_dft_r2c()
  • fftwf_plan_dft_r2c()
  • fftw_mpi_plan_dft_r2c()
  • fftwf_mpi_plan_dft_r2c()
  • fftw_plan_dft_c2r_1d()
  • fftwf_plan_dft_c2r_1d()
 
  • fftw_plan_dft_c2r_2d()
  • fftwf_plan_dft_c2r_2d()
  • fftw_mpi_plan_dft_c2r_2d()
  • fftwf_mpi_plan_dft_c2r_2d()
  • fftw_plan_dft_c2r_3d()
  • fftwf_plan_dft_c2r_3d()
  • fftw_mpi_plan_dft_c2r_3d()
  • fftwf_mpi_plan_dft_c2r_3d()
  • fftw_plan_dft_c2r()
  • fftwf_plan_dft_c2r()
  • fftw_mpi_plan_dft_c2r()
  • fftwf_mpi_plan_dft_c2r()
  • fftw_plan_many_dft()
  • fftwf_plan_many_dft()
  • fftw_mpi_plan_many_dft()
  • fftwf_mpi_plan_many_dft()
  • fftw_plan_many_dft_r2c()
  • fftwf_plan_many_dft_r2c()
  • fftw_mpi_plan_many_dft_r2c()
  • fftwf_mpi_plan_many_dft_r2c()
  • fftw_plan_many_dft_c2r()
  • fftwf_plan_many_dft_c2r()
  • fftw_mpi_plan_many_dft_c2r()
  • fftwf_mpi_plan_many_dft_c2r()
  • fftw_plan_r2r_1d()
  • fftwf_plan_r2r_1d()
 
  • fftw_plan_r2r_2d()
  • fftwf_plan_r2r_2d()
  • fftw_mpi_plan_r2r_2d()
  • fftwf_mpi_plan_r2r_2d()
  • fftw_plan_r2r_3d()
  • fftwf_plan_r2r_3d()
  • fftw_mpi_plan_r2r_3d()
  • fftwf_mpi_plan_r2r_3d()
  • fftw_plan_r2r()
  • fftwf_plan_r2r()
  • fftw_mpi_plan_r2r()
  • fftwf_mpi_plan_r2r()
  • fftw_plan_many_r2r()
  • fftwf_plan_many_r2r()
  • fftw_mpi_plan_many_r2r()
  • fftwf_mpi_plan_many_r2r()
  • fftw_plan_guru_dft()
  • fftwf_plan_guru_dft()
 
  • fftw_plan_guru_split_dft()
  • fftwf_plan_guru_split_dft()
 
  • fftw_plan_guru64_dft()
  • fftwf_plan_guru64_dft()
 
  • fftw_plan_guru64_split_dft()
  • fftwf_plan_guru64_split_dft()
 
  • fftw_plan_guru_dft_r2c()
  • fftwf_plan_guru_dft_r2c()
 
  • fftw_plan_guru_split_dft_r2c()
  • fftwf_plan_guru_split_dft_r2c()
 
  • fftw_plan_guru64_dft_r2c()
  • fftwf_plan_guru64_dft_r2c()
 
  • fftw_plan_guru64_split_dft_r2c()
  • fftwf_plan_guru64_split_dft_r2c()
 
  • fftw_plan_guru_dft_c2r()
  • fftwf_plan_guru_dft_c2r()
 
  • fftw_plan_guru_split_dft_c2r()
  • fftwf_plan_guru_split_dft_c2r()
 
  • fftw_plan_guru64_dft_c2r()
  • fftwf_plan_guru64_dft_c2r()
 
  • fftw_plan_guru64_split_dft_c2r()
  • fftwf_plan_guru64_split_dft_c2r()
 
  • fftw_plan_guru_r2r()
  • fftwf_plan_guru_r2r()
 
  • fftw_plan_guru64_r2r()
  • fftwf_plan_guru64_r2r()
 

プラン実行

逐次版 / 共有メモリ並列版 分散メモリ並列版
  • fftw_execute_dft()
  • fftwf_execute_dft()
  • fftw_mpi_execute_dft()
  • fftwf_mpi_execute_dft()
  • fftw_execute_dft_r2c()
  • fftwf_execute_dft_r2c()
  • fftw_mpi_execute_dft_r2c()
  • fftwf_mpi_execute_dft_r2c()
  • fftw_execute_dft_c2r()
  • fftwf_execute_dft_c2r()
  • fftw_mpi_execute_dft_c2r()
  • fftwf_mpi_execute_dft_c2r()
  • fftw_execute_r2r()
  • fftwf_execute_r2r()
  • fftw_mpi_execute_r2r()
  • fftwf_mpi_execute_r2r()
  • fftw_execute_split_dft()
  • fftwf_execute_split_dft()
 
  • fftw_execute_split_dft_r2c()
  • fftwf_execute_split_dft_r2c()
 
  • fftw_execute_split_dft_c2r()
  • fftwf_execute_split_dft_c2r()
 
  • fftw_execute()
  • fftwf_execute()

プラン破棄

  • fftw_destroy_plan()
  • fftwf_destroy_plan()

ユーティリティ関数 (共通)

  • fftw_malloc()
  • fftwf_malloc()
  • fftw_alloc_complex()
  • fftwf_alloc_complex()
  • fftw_alloc_real()
  • fftwf_alloc_real()
  • fftw_free()
  • fftwf_free()
  • fftw_init_threads()
  • fftwf_init_threads()
  • fftw_plan_with_nthreads()
  • fftwf_plan_with_nthreads()
  • fftw_cleanup_threads()
  • fftwf_cleanup_threads()
  • fftw_alignment_of()
  • fftwf_alignment_of()
  • fftw_export_wisdom_to_filename()
  • fftwf_export_wisdom_to_filename()
  • fftw_export_wisdom_to_file()
  • fftwf_export_wisdom_to_file()
  • fftw_export_wisdom_to_string()
  • fftwf_export_wisdom_to_string()
  • fftw_export_wisdom()
  • fftwf_export_wisdom()
  • fftw_import_system_wisdom()
  • fftwf_import_system_wisdom()
  • fftw_import_wisdom_from_filename()
  • fftwf_import_wisdom_from_filename()
  • fftw_import_wisdom_from_file()
  • fftwf_import_wisdom_from_file()
  • fftw_import_wisdom_from_string()
  • fftwf_import_wisdom_from_string()
  • fftw_import_wisdom()
  • fftwf_import_wisdom()
  • fftw_forget_wisdom()
  • fftwf_forget_wisdom()

ユーティリティ関数 (逐次版 / 共有メモリ並列版)

  • fftw_cleanup()
  • fftwf_cleanup()

ユーティリティ関数 (分散メモリ並列版)

  • fftw_mpi_init()
  • fftwf_mpi_init()
  • fftw_mpi_local_size_2d()
  • fftwf_mpi_local_size_2d()
  • fftw_mpi_local_size_2d_transposed()
  • fftwf_mpi_local_size_2d_transposed()
  • fftw_mpi_local_size_3d()
  • fftwf_mpi_local_size_3d()
  • fftw_mpi_local_size_3d_transposed()
  • fftwf_mpi_local_size_3d_transposed()
  • fftw_mpi_local_size()
  • fftwf_mpi_local_size()
  • fftw_mpi_local_size_transposed()
  • fftwf_mpi_local_size_transposed()
  • fftw_mpi_local_size_many()
  • fftwf_mpi_local_size_many()
  • fftw_mpi_local_size_many_transposed()
  • fftwf_mpi_local_size_many_transposed()
  • fftw_mpi_cleanup()
  • fftwf_mpi_cleanup()

サンプルプログラム

プログラム:
浮動小数点精度:
共有メモリ並列:
分散メモリ並列:
download

外部リンク

  1. FFTW公式サイト
  2. FFTWドキュメント(pdf形式ダウンロード)

バージョン情報

  • 説明の対象とするAPIバージョン: 1.3
  • このマニュアルページのバージョン: 2.2.0-201225