[ English | Japanese ]

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

概要

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

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

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

Fortran 2003プログラムの場合

include "fftw3.f03"  ⇒  include "aslfftw3.f03"

Fortran 77プログラムの場合

include "fftw3.f"  ⇒  include "aslfftw3.f"

コンパイルとリンクには、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
  • プラン生成に失敗した場合、プラン生成ルーチンは0を返します。
  • FFTW3インタフェースルーチン一覧に記載のないインタフェースルーチンはサポートしていません。
  • Fortran 77用のインタフェースルーチン名は、Fortran 2003用のインタフェースルーチン名と異なります。 Fortran 77用のFFTW3インタフェースを使用する場合は、接頭辞を以下のように変更してください。
    倍精度ルーチンの場合
    "fftw_"  ⇒  "dfftw_"
    単精度ルーチンの場合
    "fftwf_"  ⇒  "sfftw_"
  • Fortran 2003用のFFTW3インタフェースを使って多次元FFT用のプランを生成する場合、配列の次元の順序は、Fortran 77用の並びを逆順にしなければなりません。
    Fortran 2003用
     complex(C_DOUBLE_COMPLEX), dimension(NX, NY, NZ) :: in, out
     plan = fftw_plan_dft_3d(NZ, NY, NX, in, out, FFTW_FORWARD, FFTW_ESTIMATE)
    
    Fortran 77用
     complex(8), dimension(NX, NY, NZ) in, out
     call dfftw_plan_dft_3d(plan, NX, NY, NZ, in, out, FFTW_FORWARD, FFTW_ESTIMATE)
    

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()
  • fftwf_execute()
  • fftw_execute()
  • fftwf_execute()
  • 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_destroy_plan()
  • fftwf_destroy_plan()

ユーティリティルーチン (共通)

  • fftw_alignment_of()
  • fftwf_alignment_of()
  • fftw_init_threads()
  • fftwf_init_threads()
  • fftw_plan_with_nthreads()
  • fftwf_plan_with_nthreads()
  • fftw_cleanup_threads()
  • fftwf_cleanup_threads()
  • 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