はじめに
FFTライブラリとしては,一般的に高速だということでFFTWが使われています.
OTFFTはFFTライブラリの一つで,FFTWの1.3~1.4倍ほど高速だという触れ込みで公開されています.
http://www.moon.sannet.ne.jp/okahisa/stockham/haswell.html
(正直なところ,実験結果としては少しあやしい部分もありますががが)
一応,僕の環境では,fwd0の実行で,2332kサイクル(rdtscで計測)出ました.
60FPSでは3GHzのCPUで50Mサイクル実行可能なので,1FPSあたりのCPU使用率は2%ぐらいということになります(理論値).
1秒間に2^10オーダーで実行できるのは非常にありがたいです.
VC++での導入方法
OTFFTの導入方法は以下のリンクからたどれます.
http://www.moon.sannet.ne.jp/okahisa/stockham/node5.html
ただ,VC++でプロジェクト組んでたりすると,オプションの設定方法が謎なのでこの点を中心に説明します.
OTFFTの最適化
必ずしも必要ではないらしいのですが,もし自分のPCに最適化した状態でOTFFTを実行したい場合は必須です.
(ソフトウェアを公開する目的ならあまりいらないかもしれません)
まず,VC++の開発者コマンドプロンプトを開いてください.
たぶん,メニューバーの[Visual Studio XXXX]-[Visual Studio Tools]の中にあると思います.
次に,OTFFTのディレクトリに移動して,以下のコマンドを実行してください.
cd OTFFTのディレクトリ
nmake ffttune
これで最適化用の実行ファイル(ffttune.exe)が作成されます.
生成された実行ファイルを実行すると最適化が始まります.
最適化するとヘッダファイルの中身を書き換えるみたいなので,もし,最適化前に戻したい場合は再度ファイルをダウンロードして下さい.
プロジェクトの設定
まず,OTFFTをインクルードできるようにしなければなりません.
なので,プロジェクトのプロパティから,[構成プロパティ]-[C/C++]-[全般]の追加のインクルードディレクトリに,OTFFTのディレクトリを指定してください.
次に,各種最適化オプションを付けます.
探すのが大変なので,[構成プロパティ]-[C/C++]-[すべてのオプション]を選んでください.
テキストボックスがありますが,これはオプションのフィルタになっています.
まずは,/archで検索してください.[拡張命令セットを有効にする]というオプションがあるので,Advanced Vector Extensionsを選択してください.
次に,/openmpで検索してください.[OpenMPのサポート]というオプションがあるので,はいを選択してください.
これでプロジェクトの設定は完了です.
ただし,場合によってはAVXやOpenMPのオプションが原因で,他の環境で動かなくなる可能性もあります.
その点はまだ未検証ですが,ダメな場合はオプションを外してみるといいかもしれません.
サンプルの実行
適当にサンプルを作りました.
うまく実行できたら成功です.
# include <iostream>
# include "otfft.h"
void main()
{
using fftmisc::complex_t;
using fftmisc::simd_malloc;
using fftmisc::simd_free;
const unsigned N = 1024;
auto start = __rdtsc();
complex_t* x = (complex_t*)simd_malloc(N*sizeof(complex_t));
OTFFT::FFT fft(N);
fft.fwd0(x);
simd_free(x);
auto end = __rdtsc();
std::cout << (double)(end - start) / 1000 << std::endl;
}