プランの利用 Using Plans


 FFTWにおけるすべての変換のプランは、fftw_plan型として(不透明なポインタ型)格納され、これからの節で述べる様々なルーチンによって生成されます。fftw_planは、変換を計算するのに必要なすべての情報を持っていて、たとえば入出力配列のポインタなどもそれに含まれます。

void fftw_execute( const fftw_plan plan );

 上記によってプランが実行され、あらかじめ計画された配列に対する変換が計算されます(その配列はこの時、存在する必要があります)。プランに変更がなければ、fftw_executeは所望の回数だけ実行することができます。

 既にあるプランを、違う配列に使いたいときは、グルインターフェースを使うことができます。これについては、4.5節のグルインターフェースを参照のこと。

 fftw_execute(と同等の関数)は、FFTWがスレッドセーフであることを保証した唯一の関数です。これについては、5.2節のスレッドの安全性を参照のこと。
次の

void fftw_destroy_plan( fftw_plan plan );

は、プランと関連するデータを解放します。

 FFTWのプランナーは、いくつかの持続性のあるデータをセーブしています。たとえば、蓄積されたwisdom(知)や、現在の設定で利用できるアルゴリズムの一覧などです。もしこれら全てを解放し、FFTWをプログラムを立ち上げたときの最初の状態に戻したい場合、

void fftw_cleanup( void );

を呼び出してください。
 fftw_cleanupを呼び出したあとには、すべての現存するプランが未定義となり、プランを実行(execute)することも、破棄(destroy)することもすべきでありません。しかし、新しいプランに関しては、生成、実行/破棄することができて、FFTWは知(wisdom)の情報の蓄積が再び始まります。

 fftw_cleanupは、プランを解放しません。したがって、解放の目的でfftw_destroy_planを呼ぶ必要があります。
※この近辺は主張が矛盾しているようでよくわからない

 次の二つのルーチンは、純粋な学問上の目的で作られています。

void fftw_flops( const fftw_plan plan, double *add, double *mul, double *fma );

 plangが与えられた時、addとmulとfmaを、プランの実行に必要な、浮動小数点の加算、乗算、加算と乗算の組み合わせの正確な演算回数にセットします。
この浮動小数点の演算総演算回数(flops)は、add+mul+2*fmaかadd+mul+fmaになります(後者は、ハードウェアが加算乗算の組み合わせ演算命令をサポートしている場合です。また、FMA演算の回数はvoodooコンパイラによってのみ最適。演算回数は整数でなければならないが、大きな変換を行った時のintのオーバーフローを避けるためにdoubleを使用していて、単精度、4倍精度FFTWでも引数はdouble型です。)

void fftw_fprint_plan( cost fftw_plan plan, FILE *output_file );
void fftw_print_plan( const fftw_plan plan );

上記関数は、"マニアなら読める"書式で、プランを入力のファイルあるいはstdout(標準出力)にそれぞれ出力します。
最終更新:2009年01月22日 23:46