※記事の内容は古い内容となっています。こちらに再測定した結果があります。
コンパイラによってどれだけFFTの実行速度に違いがあるのか比較してみた。
Visual C++ 2013で、x86とx64それぞれの版とx86はオプションにSSE2を有効にした版、x64でPGOビルドを有効にした版、それから、GccとLLVM/clang、参考としてJavaでも測定した。
FFTのライブラリは、大浦版FFT(FFT Package 1-dim / 2-dim)のfftsg.cのrdftを使用した。
Javaのライブラリは、大浦版FFTをJavaに移植したもの(大浦版FFTのJava移植)を使用した。
Visual C++の最適化は実行速度の最大化(/O2)を使用し、
Gcc、LLVM/clangはcygwinの1.7.33を使用し、最適オプションはO3とした。
測定環境は、Core i7-3770 3.40GHz、Windows 7 64bit。
rdftを1万回実行する時間を計測し、それを5回行い平均をとった。
測定結果は以下のとおり。
コンパイラ | 5回実行の平均 |
Visal C++ x86 | 552.2ms |
Visal C++ x86 SSE2 | 555ms |
Visal C++ x64 | 492.6ms |
Visal C++ x64 PGOビルド | 602ms |
Gcc -O3 | 1691.2ms |
LLVM/clang -O3 | 842.2ms |
Java 8 | 824.6ms |
Visal C++で、x64でビルドしたものが最も速いという結果になった。
PGOビルドで遅くなったのは予想外の結果である。手順がおかしいのか原因は不明。
Gccが最適オプションをO3にしても最も遅かった。
LLVMは期待していたがVisual C++には及ばないようである。
そして、最も意外だったのは、Java 8が結構速いという結果である。
Gcc、LLVM/clangより速かったので、Javaだから遅いだろうという予想に反した結果となった。
JITでネイティブにコンパイルされた後は速いようである。