FFTW3 ラッパーの使用

インテル® oneMKL特集
この記事は、インテル® MKL リファレンス・マニュアルの項目「インテル® マス・カーネル・ライブラリーの FFTW3 インターフェイス」の一部です。

FFTW3 ラッパーは、相互に依存する関数群とデータ構造群のセットです。ラッパーは、個々の FFTW3 関数ごとにインターフェイスを提供するように設計されていません。一部の FFTW3 ラッパー関数は、エントリーのみで本体は空で全く処理を行いませんが、リンクエラーを防ぎ、関数呼び出しを満たすために存在します。

ここでは、FFTW3 ラッパーの制限事項と使用上のヒントについて説明します。ラッパーで提供される関数宣言の詳細は、fftw3.h ヘッダーファイルを参照してください。

  • long double はサポートされていません。インテル® MKL の FFT 関数は、単精度および倍精度の浮動小数点データ型 (float および double) のみ処理するため、FFTW3 ラッパーは long double データ型をサポートしません。プリフィックスが fftwl_ のすべての FFTW3 ラッパー関数は、本体が空でリンク互換のためだけに提供されています。

  • ラッパーは、倍精度および単精度 (プリフィックスが fftw_fftwf_ のもの) 用に同等の実装を提供します。ここでは、プリフィックスが fftw_ の関数 (つまり、倍精度関数) に絞って説明しますが、ここで説明する内容は倍精度および単精度の両方の関数に適用されます。

  • ラッパーにより提供される FFTW3 インターフェイスは、ヘッダーファイル fftw3.hfftw3.f で定義されています。これらのファイルは FFTW3.2 パッケージのもので、ライセンスを得てインテル® MKL とともに配布されています。さらに、fftw3_mkl.hfftw3_mkl.ffftw3_mkl_f77.h は、必要な構造体、補助定数、マクロを定義し、C から Fortran インターフェイスを利用できるようにします。

  • プラン生成ラッパーの実際の機能は、guru64 関数群で実装されます。基本インターフェイス、高度なインターフェイス、guru インターフェイスのプラン生成関数は、guru64 インターフェイス関数を呼び出します。そのため、ラッパーのすべての FFTW3 プラン生成インターフェイスは動作します。

  • プラン生成関数は、機能がサポートされていない場合、NULL プランを返します。そのため、アプリケーションでプラン生成関数の戻り値を確認してください。特に、次の処理では NULL プランが返されます。

    – すべての long double 処理

    – 複素数データの分割格納を含む c2r および r2c 処理

    kind 値が FFTW_R2HCFFTW_HC2R、および FFTW_DHT の r2r 処理。r2r でサポートされる kind 値は奇数/偶数の DFT のみ (サイン/コサイン変換) です。

    – 多次元 r2r 変換

    – 多次元ベクトルの変換。guru および guru64 プラン生成関数の howmany_rank 引数でサポートされている値は 0 と 1 だけです。

    rank > MKL_MAXRANK の多次元変換

  • kind 引数の MKL_RODFT00 値は FFTW3 ラッパーで追加されました。パフォーマンス向上のため、FFTW_RODFT00 ではなく、この値を使用することを強く推奨します。この kind 値を使用するには、入出力ベクトルの最初の要素に 0.0 を追加します。次のサンプルコードについて考えてみましょう。

    plan1 = fftw_plan_r2r_1d(n, in1, out1, FFTW_RODFT00, FFTW_ESTIMATE);
    plan2 = fftw_plan_r2r_1d(n, in2, out2, MKL_RODFT00, FFTW_ESTIMATE);

    in2/out2 配列の位置 0 にゼロの要素が 1 つ余分にあることを除き、どちらのプランも同じ変換を行います。例えば、n=3、in1={x,y,z}、out1={u,v,w} の場合、in2={0,x,y,z}、out2={0,u,v,w} になります。

  • プラン生成関数の flags 引数は常に無視され、この引数の値に関係なく、同じアルゴリズムが使用されます。特に、flags の値 FFTW_ESTIMATEFFTW_MEASURE などは影響ありません。

  • マルチスレッド・プランでは、fftw_init_threads() および fftw_plan_with_nthreads() 関数に対して標準の呼び出しシーケンスを使用します (FFTW のドキュメントを参照)。

  • FFTW3 ラッパーは完全にスレッドセーフではありません。fftw_execute_dft() などの新しい配列実行関数が、並列実行するユーザースレッドと同じプランを共有する場合は、プランの生成前に共有スレッド数を設定してください。このため、FFTW3 ラッパーは、共有スレッド数を設定するフィールドを持つグローバル構造体 fftw3_mkl を定義したヘッダーファイル fftw3_mkl.h を提供します。以下に共有スレッド数の設定例を示します。

    #include “fftw3.h”
    #include “fftw3_mkl.h”
    fftw3_mkl.number_of_user_threads = 4;
    plan = fftw_plan_dft(…);

  • メモリー割り当て関数 fftw_malloc は、16 バイト境界でアライメントされているメモリーポインターを返します。このメモリーは、fftw_free を使用して解放する必要があります。

  • インテル® MKL の FFTW3 ラッパーは、インテル® MKL の LP64 と ILP64 の両インターフェイスで 32 ビットの int 型を使用します。64 ビットのサイズには、guru64 FFTW3 インターフェイスを使用します。

  • Fortran ラッパー (「Fortran からのラッパーの呼び出し」を参照) は、LP64 インターフェイスでは 32 ビットで、ILP64 インターフェイスでは 64 ビットである INTEGER 型を使用します。

  • 問題が発生した場合、ラッパーは NULL プランを返します。一部のケースでは、検出された問題を示すメッセージを出力します。ただし、デフォルトでは、メッセージの出力は無効になっているため、有効にするには、次のように fftw3_mkl.verbose 変数をゼロ以外の値に設定します。

    #include “fftw3.h”
    #include “fftw3_mkl.h”
    fftw3_mkl.verbose = 0;
    plan = fftw_plan_r2r(…);

  • 次の関数はエントリーのみで本体は空です。

    – 保存、ロード、出力プラン用の関数

    – wisdom の保存とロード用の関数

    – 変換の計算コストを予測する関数

  • マクロ FFTW_DLL はインテル® MKL の FFTW3 ラッパーとともに使用しないでください。

タイトルとURLをコピーしました